Hidden Networks, detalles técnicos de la PoC

sábado, 24 de febrero de 2018

Panel principal de Hidden Networks PoC imagen
Panel principal de Hidden Networks PoC

Hace un mes presentamos nuestra nueva PoC para detectar redes ocultas (Hidden Networks). En este artículo vamos a repasar algunos detalles del funcionamiento interno de la aplicación y sus principales características.

Empezaremos por la sección Project donde podemos preparar y organizar los proyectos que vayamos realizando y la información recopilada. Tendremos que definir el nombre del proyecto y las carpetas donde se almacenarán los ficheros HN (formato propio para los proyectos Hidden Network), CSV y JSON. Es necesario tener un proyecto creado o abierto para realizar algunas operaciones como por ejemplo la captura de datos en la red (como veremos más adelante). El fichero JSON se crea siempre a partir del fichero CSV utilizando la librería Python json con la función:

json.dump(filas, ficheroCSV).

Estos son los campos que componen tanto los ficheros CSV como los JSON: computer_name, computer_ip, usbdevice_name y usbdevice_id.

Ejemplo del contenido de un fichero CSV imagen
Ejemplo del contenido de un fichero CSV
  • computer_name contiene el nombre del ordenador analizado utilizando la librería socket de Python utilizando la función socket.gethostname().
  • computer_ip es la dirección IP del ordenador auditado. Se obtiene también con la librería socket utilizando la función socket.gethostbyname(computername) obteniendo el valor “computername” con la función socket.gethostname().
  • usbdevice_name contiene la key “Friendlyname” o nombre “amigable” del dispositivo USB. Se obtiene accediendo, en función de si conectamos en local o en red con el equipo, analizando la rama del registro siguiente:  HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR. 
  • usbdevice_id key “ContainerID”, es el id único del dispositivo. Se obtiene de la misma manera que usbdevice_name.

La recopilación de la información del equipo local con el botón Get local registry info en la sección Local computer options se realiza accediendo a la siguiente rama del registro utilizando las funciones readSubKeys y readValues:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR

readSubKeys devuelve una lista con las sub-ramas de una rama específica y readValues devuelve una lista tipo diccionario con el par nombre de la key y su valor correspondiente. Estos valores se utilizan en el código Python para ir construyendo la rama completa a consultar.

Los valores que necesitamos para completar una rama con la información completa del dispositivo USB serían:

  • Vendor,ID+ProductID+Revisión: texto que incluye los datos del fabricante, el ID del producto y la versión. Por ejemplo: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\Disk&Ven_&Prod_USB_DISK_2.0&Rev_PMAP\
  • Serial No: número de serie del dispositivo. Ejemplo: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\Disk&Ven_&Prod_USB_DISK_2.0&Rev_PMAP\560057DFAE277552&0
Una vez completa ya tendremos acceso a valores como Friendlyname (usbdevice_name) o ContainerID:

Ejemplo de la rama del Registro de Windows que almacena la inforamción sobre los USB imagen
Ejemplo de la rama del Registro de Windows que almacena la inforamción sobre los USB

En la sección Networking options podemos auditar equipos dentro de nuestra red o dominio siempre y cuando tengamos acceso administrador a los mismos. El primer paso será crear un fichero de texto con las IP o los FQDN de los equipos Windows a auditar. En el siguiente ejemplo podemos observar las diferentes formas de introducir los datos del equipo remoto:

Ejemplo de fichero con el listado de ordenadores a auditar HN utiliza la librería Python de WMI imagen
Ejemplo de fichero con el listado de ordenadores a auditar HN utiliza la librería Python de WMI 


(Windows Management Instrumentation), para acceder a los equipos de la red. El siguiente paso será introducir el nombre de usuario administrador del dominio, así como su contraseña en la sección Domain credentials. Pulsando el botón Retrieve remote info veremos el proceso de recolección de datos en la pantalla Output además de ir añadiendo dicha información en el fichero .CSV. En el siguiente ejemplo de código se observa la sección que se encarga de conectar en remoto utilizando WMI en Python:

Llamada WMI desde Python para conectar con un equipo remoto imagen
Llamada WMI desde Python para conectar con un equipo remoto

La siguiente función se utiliza para recuperar la rama del registro donde se encuentra la información:

Acceso a las sub-ramas de la rama principal que contiene los datos del USB imEN
Acceso a las sub-ramas de la rama principal que contiene los datos del USB

Utilizando un bucle basado en el número de dispositivos identificados, se van construyendo las diferentes ramas que corresponderán a cada uno de los dispositivos USB detectados:

Acceso a la rama final que corresponde con los datos específicos de un USB en concreto IMAGEN
Acceso a la rama final que corresponde con los datos específicos de un USB en concreto

Para obtener finalmente valores como los antes comentados “Friendlyname” y “ContainerID” utilizamos el siguiente código:

Parte del código encargada de recuperar los valores “Frienlyname” y “ContainerID” IMgen
Parte del código encargada de recuperar los valores “Frienlyname” y “ContainerID”

Una vez tengamos recopilada la información en un proyecto (o almacenada en formato HN de otro proyecto anterior importando el fichero utilizando el botón Plot single CSV) podemos pasar la sección de visualización llamada Plot options. Para dibujar los grafos se ha utilizado la librería de Python llamada pyplot.

Ejemplo de grafos generados por HN imagen
Ejemplo de grafos generados por HN

El grafo se dibuja utilizando la información almacenada en el fichero JSON. nuevonodo es el nodo origen donde se detectó por primera vez el USB que se está analizando y nuevonodo2 es el nodo donde ha aparecido una coincidencia de ID, indicando que también ha pasado por ese equipo/nodo.

Porción de código que dibuja los arcos de los grafos imagen
Porción de código que dibuja los arcos de los grafos

Seguimos trabajando en mejorar la herramienta añadiendo nuevas funcionalidades y optimizando el código fuente. Seguiremos hablando de las HN, permaneced atentos ;)

Paper Hidden Network
Puedes poner cualquier comentario o realizar cualquier pregunta (sobre este o cualquier otro proyecto) en la comunidad de ElevenPaths

Fran Ramírez
Investigador en ElevenPaths

No hay comentarios:

Publicar un comentario