Evitando la identificación de Dionaea

En entradas anteriores ya se ha hablado sobre Dionaea, un honeypot de baja interacción que ofrece una gran variedad de servicios de red. El principal problema al que nos enfrentamos a la hora de desplegar un honeypot es como personalizar los servicios emulados para hacerlos indetectables ante herramientas de escaneado. Cuanto más le cueste a un atacante detectar que se encuentra ante un honeypot, más posibilidades tendremos de analizar su metodología, capturar exploits, binarios, etc.

Vamos a instalar Dionaea y modificar algunos de sus servicios para que no sean identificados por el escáner de red más utilizado, Nmap.

Podemos obtener Dionaea desde la página del proyecto. En la propia página se encuentran los pasos necesarios para su instalación. En nuestro caso hemos utilizado Ubuntu 12.04 como sistema operativo base. Los servicios activos por defecto en la instalación del honeypot son:

Una vez instalado Dionaea, lanzamos un escáner con Nmap para ver qué servicios son identificados y asociados con Dionaea gracias a su capacidad de fingerprinting:

# nmap -v -O -sV -sT -sU 192.168.100.10

En el resumen de la salida del escaneado mostrado a continuación se puede observar como algunos de los servicios los ha identificado y asociado a Dionaea. Uno de los primeros pasos en un test de intrusión es el descubrimiento de los activos de una red y sus servicios, por lo que si un atacante analiza la red con Nmap, detectará la existencia de este honeypot y probablemente cese el ataque y no conseguiremos capturar toda la información que quisiéramos.

Nota: La versión de Nmap utilizada es la 6.00. Otras versiones pueden modificar la capacidad de detección en función de las firmas o huellas que incorpore.

PORT     	STATE         	SERVICE      	VERSION 
21/tcp		open         	 ftp		Dionaea honeypot ftpd 
80/tcp   	open          	http		? 
135/tcp  	open          	msrpc		? 
443/tcp  	open          	ssl/https	? 
445/tcp  	open          	microsoft-ds 	Dionaea honeypot smbd 
1433/tcp	 open          	ms-sql-s     	Dionaea honeypot MS-SQL server 
3306/tcp 	open          	mysql        	MySQL 5.0.54 
5060/tcp 	open          	sip          	(SIP end point; Status: 200 OK)
5061/tcp 	open          	ssl/sip      	(SIP end point; Status: 200 OK) 
69/udp   	open|filtered 	tftp 
5060/udp 	open          	sip          	(SIP end point; Status: 200 OK)

Para personalizar los servicios y que no sean detectados por Nmap, primero hay que saber en qué se basa Nmap para identificarlos. Cuando Nmap intenta descubrir el producto que se encuentra tras un servicio, compara las cadenas de respuesta del servicio con los patrones incluidos en el fichero “nmap-service-probes” (localizado en /usr/share/nmap/). En la URL http://nmap.org/book/vscan-technique.html podemos ver el proceso seguido por Nmap para la detección de servicios. Por tanto, si conseguimos identificar y modificar los servicios de Dionaea en función de estos patrones, podemos conseguir que el servicio no sea identificado como Dionaea, o bien simular cualquier otro producto. Por ejemplo, podemos pasar de un servidor Apache a un IIS o un Tomcat.

Vamos a buscar en el fichero nmap-service-probes el servicio FTP de Dionaea y nos encontraremos con la siguiente línea:

match ftp m|^220 Welcome to the ftp service\r\n| p/Dionaea honeypot ftpd/

Esta línea contiene un mensaje de bienvenida característico de Dionaea, el cual es mostrado a un cliente FTP cuando se conecta al servicio y, además, el producto al que está asociado (Dionaea). Por tanto, tendremos que modificar este mensaje para que Nmap no pueda asociarlo a Dionaea. Hay que editar el fichero /usr/lib/dionaea/python/dionaea/ftp.py para cambiar este mensaje.

Este fichero escrito en Python es la implementación que realiza Dionaea de un servidor FTP. Cada servicio implementado por el honeypot se estructura en módulos, algo que va a facilitar bastante la personalización de estos servicios.

Podemos aprovecharnos de las huellas contenidas en el fichero nmap-service-probes y modificar el mensaje para que represente a un servidor ProFTPD, así que vamos a cambiar el mensaje inicial de Dionaea en ftp.py por uno de ProFTPD:

self.reply(WELCOME_MSG, "Welcome to the ftp service")
self.reply(WELCOME_MSG, "ProFTPD 1.2.8 Server")

El siguiente servicio que vamos a modificar es microsoft-ds (SMB/CIFS). En este caso, si buscamos el patrón correspondiente en nmap-service-probes, se puede ver como busca una coincidencia en la respuesta del servidor durante el establecimiento de la conexión. Esta coincidencia o patrón es:

\x00\x34\0W\0O\0R\0K\0G\0R\0O\0U\0P\0\0\0H\0O\0M\0E\0U\0S\0E\0R\0-\0.\0.\0.\0.\0.\0.

Este se corresponde con los campos que representan el nombre del dominio y del equipo, es decir, si el nombre del dominio es WORKGROUP y el nombre del equipo es HOMEUSER-XXXXXX, donde X es cualquier carácter alfanumérico, entonces el servicio es identificado como un servicio de Dionaea.

Para camuflar el servicio de compartición de ficheros e impresoras de Windows, tan solo hay que modificar los valores de los campos OemDomainName y ServerName en el fichero /usr/lib/dionaea/python/dionaea/smb/include/smbfields.py. Vamos a cambiar los siguientes valores y conseguiremos evitar que sea identificado:

OemDomainName: WORKGROUP → MIDOMINIO
ServerName: HOMEUSER-3AF6FE → EQUIPO-TEST	 

El tercer servicio identificado es el sistema de base de datos Microsoft SQL Server en el puerto 1433. Si buscamos este servicio en el fichero de patrones de Nmap, se puede ver una cadena en hexadecimal:

match ms-sql-s m|^\x04\x01\x00\x2b\x00\x00\x00\x00\x00\x00\x1a\x00\x06\x01\x00\x20\x00
   \x01\x02\x00\x21\x00\x01\x03\x00\x22\x00\x00\x04\x00\x22\x00\x01\xff\x08\x00\x02\x10
   \x00\x00\x02\x00\x00| p/Dionaea honeypot MS-SQL server/ 

Esta cadena se corresponde con la respuesta del honeypot a un paquete TDS (Tabular Data Streams) de pre-login en el proceso de conexión al servicio de base de datos. Si se realiza una captura de paquetes con un sniffer y analizamos las conexiones, podemos ver como esta cadena es la correspondiente al campo Token Type (en codificación hexadecimal) que tiene el valor 0x00.

Si cambiamos el valor 0x00 del campo Token Type, conseguiremos evitar la detección ante un escaneo de Nmap. Este campo se modifica en el fichero /usr/lib/dionaea/python/dionaea/mssql/mssql.py. Vamos a cambiar el valor establecido por 0xAA, que se corresponde con un mensaje de error, aunque podemos poner cualquier otro. Una lista de los valores aceptados para este campo los podemos encontrar en FreeTDS.

r.VersionToken.TokenType = 0x00 → 0xAA

Por ultimo, el servicio HTTPS no es identificado en el escaneo, pero basta con acceder a la URL del servidor web y echar un vistazo al certificado que presenta:

El certificado es emitido por Nephentes Development Team, los creadores del honeypot precursor de Dionaea (Nephentes), además de mostrar la URL del proyecto Dionaea. Así que debemos generar un certificado con algo más de “credibilidad” y sustituir al generado por defecto. Debido a que el certificado es generado en tiempo de compilación, hay que modificar los datos del certificado en el fichero dionaea/src/connection.c antes de compilar el honeypot.

Tras modificar los datos anteriores en los servicios, volvemos a realizar un escaneo de puertos al honeypot:

PORT     	STATE         	SERVICE       VERSION 
21/tcp		open          	ftp		ProFTPD 1.2.8 
80/tcp   	open          	http		? 
135/tcp  	open          	msrpc		? 
443/tcp  	open          	ssl/https	? 
445/tcp  	open          	microsoft-ds	? 
1433/tcp	open          	ms-sql-s	? 
3306/tcp 	open          	mysql         	MySQL 5.0.54 
5060/tcp 	open          	sip           	(SIP end point; Status: 200 OK) 
5061/tcp 	open          	sip-tls		? 
69/udp   	open|filtered	tftp 
5060/udp 	open          	sip           	(SIP end point; Status: 200 OK) 

Como se puede ver, los servicios descritos ya no son identificados como servicios de Dionaea, por lo que hemos conseguido evitar que un escaneo simple de Nmap detecte nuestro honeypot. Si realmente se quiere utilizar el honeypot para detectar ataques no automatizados y engañar a un atacante, entonces habrá que realizar una personalización más detallada de los servicios del honeypot para que generen un entorno mucho más realista y con mayores similitudes al servicio real que se intenta emular.