lunes, 24 de julio de 2017

Buceando en la MBR.

Siempre que arrancamos un ordenador compatible con la estructura de la Tabla de Particiones (los conocidos como: PC clónicos o , simplemente, clónicos),  necesariamente terminamos buscando la  MBR (Máster Boot Record) para poder arrancar. La no existencia de la misma, parara el proceso de arranque.

Esta MBR indica al proceso de inicio del sistema, cual es el siguiente salto para poder arrancar el sistema operativo. Más concretamente, indica la partición activa que contiene el sistema operativo que será cargado.

El MBR debe residir en el primer sector del disco de arranque, el cual siempre está compuesto de "n" clúster, dependiendo del proceso de formateado dado.  Pero, no empezará en la posición 0 del sector, si no que comienza en la posición 446h del primer sector (offset 446h)

IMPORTANTE: La unidad básica de un disco duro es el clúster, que se agrupa en sectores en función del formateo que el disco duro ha tenido.

Del total del tamaño del sector, la MBR se compone de 512 bytes de información, divididos en:


Código ejecutable


Códigos de error


Tabla de particiones


El código ejecutable, más formalmente llamado: Máster Boot Code, es el programa usado en el arranque para determinar cuál de las particiones de la tabla de particiones es la activa.

Los códigos de error, son los mensajes en texto plano que pueden aparecer si el MBC (Máster Boot Code) determina que ha habido un problema al encontrar la partición activa. Dichos mensajes pueden ser:

1.- Invalid partition table
2.- Error loading operation system
3.- Missing operating system

En cuanto a la tabla de particiones a su vez se subdivide en 4 registros de 16 bytes cada uno, formando un total de 64 bytes. Cada registro se corresponde con una posible partición activa, por ello, un ordenador sólo puede tener 4 particiones primarias, y el resto, si se quieren tener más, deben ser particiones extendidas.

Cada byte de cada registro de la partición activa tiene su propio significado, que se pasa a comentar:

Bytes
Función
1
Determina si la partición es la partición activa o no.
Para determinar que estamos ante la partición activa debería existir el valor: 80h, en cualquier otro caso, debería existir el valor: 00h
2
Determina el sector inicial de la partición en formato CHS (Cilindros, Heads and Sectors - Cilindros, Cabezas y Sectores)

3
4
5
Tipo de partición
Más información (listado de tipos): https://en.wikipedia.org/wiki/Partition_type
6
Determina el sector final de la partición en formato CHS (Cilindros, Heads and Sectors - Cilindros, Cabezas y Sectores)

7
8
9
Offset de la ubicación de la partición respecto de la MBR
10
11
12
13
Tamaño de la partición en sectores
14
15
16

Al final de la tabla de particiones, siempre encontraremos los caracteres 55AAh, que indicarán el fin de la MBR.

Si el proceso de arranque puede determinar la partición activa, este saltará al sector correspondiente. El cuál tendrá una VBR (Volumen Boot Record) o una EPT (Extensión Partition Table)

Podemos verlo gráficamente mediante un editor hexadecimal. Un ejemplo sería:

Primeros bytes del sector 0 del Disco óptico 1

Analizada la MBR podemos ver:

Análisis de la MBR desde el offset 446

Más información:
https://es.wikipedia.org/wiki/Registro_de_arranque_principal
https://github.com/hamptus/pyMBR
https://raw.githubusercontent.com/gleeda/misc-scripts/master/misc_python/mbr_parser.py

Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.




miércoles, 12 de julio de 2017

¡Ese UPnP como mola, se merece una ola!

No hace mucho tiempo, en una auditoria de red interna (intranet), un protocolo del cual no se habla demasiado dio una clave fundamental para poder hacerme con la red.

Esta clave vino a ser: usuarios totalmente validos, que permitieron hacer otras muchas cosas.

El responsable de dicha revelación fue el protocolo de comunicaciones: UPNP (Universal plug and Play).

Se recoge la definición de dicho protocolo desde Wikipedia

Universal Plug and Play (UPnP) es un conjunto de protocolos de comunicación que permite a periféricos en red, como computadoras personales, impresoras, pasarelas de Internet, puntos de acceso Wi-Fi y dispositivos móviles, descubrir de manera transparente la presencia de otros dispositivos en la red y establecer servicios de red de comunicación, compartición de datos y entretenimiento. UPnP está diseñado principalmente para redes de hogar sin dispositivos del ámbito empresarial.

Más información:
https://es.wikipedia.org/wiki/Universal_Plug_and_Play
https://tools.ietf.org/html/rfc6970

Entre los datos que devuelve el protocolo,  encontraremos el tag: <friendlyName>. Dicho tag, trae consigo  datos relativos al: nombre de la máquina y a un nombre de usuario valido.

La estructura que presentaba se correspondía al siguiente patrón:

<friendlyName> NOMBRE MÁQUINA:USUARIO </friendlyName>

Este protocolo utiliza dos puertos:

1.- 1900/UDP, que devuelve la URL donde se puede visualizar los datos.
2.- 2869/TCP, sobre el que se monta un servicio web que devuelve la información estructurada en formato XML

Si queremos buscar activos que posean el puerto 1900/UDP, y así conseguir la URL donde se encuentra la información, se puede utilizar una herramienta terriblemente útil: NMAP. Más concretamente uno de sus script (.NSE: upnp-info.nse. Este script nos permite obtener la URL donde se podrán visualizar los datos del host.

Más información:
https://nmap.org/nsedoc/scripts/upnp-info.html

Un ejemplo de la información que se obtiene con dicho script es:

Uso del script: upnp-info.nse, de la herramienta nmap

Si se visita dicha URL, obtendremos la siguiente información:


Información del servicio UPnp en formato "xml"

Si nos fijamos en el tag: <friendlyName>, podemos ver:

1.- El nombre de la máquina: GRANHERMANO
2.- El usuario: 4null0

Personalmente, me cree un pequeño script en bash para que dado una red (en formato CIDR) me detectará aquellas que tenga el puerto 1900/UDP abierto y me diera los datos correspondientes al nombre de la máquina y a el usuario.

El código es:


Código del script en bash

Un ejemplo de lo que devuelve el script es:

Información devuelta por el script



Lo que hagas con la información es cosa tuya, no mía ... pero ten conciencia.