Bastionado, seguridad en sistemas: Reconocimiento de activos mediante herramientas pasivas (II) pre { background:#eeeeee; border:1px solid #A6B0BF; font-size:120%; line-height:100%; overflow:auto; padding:10px; color:#000000 } pre:hover { border:1px solid #efefef; } code { font-size:120%; text-align:left; margin:0;padding:0; color: #000000;} .clear { clear:both; overflow:hidden; }

Bienvenido al blog

Bienvenidos al blog de seguridad en sistemas

miércoles, 25 de mayo de 2011

Reconocimiento de activos mediante herramientas pasivas (II)

Tal como vimos en la anterior entada necesitamos de alguna forma poder saber el sistema operativo, los puertos de los servicios y de que servicios se tratan, de aquellos activos que queramos proteger en nuestro IDS. Para ello necesitamos poder reconocerlos mediante herramientas pasivas que sean capaces de obtener dicha información únicamente escuchando el tráfico de red.

Después de buscar un poco sobre que herramientas podían servirme decidí empezar con “P0f”, ya que era una de las herramientas más conocida para esta tarea. P0f lee las cabeceras TCP de los paquetes, analiza su comportamiento y reconoce ciertos sistemas operativos en función de una serie de valores como el valor de inicialización del ack, el comportamiento del host ante ciertos flags tcp, tamaño de ventana, etc. Veamos como funciona.

Para instalarla sobre un entorno Debian solo es necesario usar apt-get:
# apt-get install p0f

Para ejecutarla se puede hacer con la siguiente sentencia:
# p0f -f /etc/p0f/p0f.fp -i eth0 -t -p -i eth0

Al ejecutarla veremos los paquetes TCP que está leyendo p0f mostrando valores de las cabeceras TCP que normalmente usa para el reconocimiento del sistema operativo. Veamos ejemplos que me encontré haciendo las pruebas:

Navegación a SAW:
<Sun May 15 15:34:45 2011> 192.168.XXX.XXXX:58793 - UNKNOWN [S10:64:1:60:M1460,S,T,N,W6:.:?:?] (up: 7 hrs)
-> 62.97.78.24:80 (link: ethernet/modem)
<Sun May 15 15:34:46 2011> 192.168.XXX.XXX:58794 - UNKNOWN [S10:64:1:60:M1460,S,T,N,W6:.:?:?] (up: 7 hrs)
-> 62.97.78.24:80 (link: ethernet/modem)

Conexión a servidor SSH:
<Sun May 15 15:36:05 2011> 192.168.XXX.XXX:42113 - UNKNOWN [S10:64:1:60:M1460,S,T,N,W6:.:?:?] (up: 7 hrs)
-> 147.XXX.XXX.XXX:22 (link: ethernet/modem)

Nmap -O -sS:
<Sun May 15 15:37:24 2011> 192.168.2.101:53536 - UNKNOWN [1024:40:0:44:M1460:.:?:?]
-> 62.97.78.24:1723 (link: ethernet/modem)
<Sun May 15 15:37:24 2011> 192.168.2.101:53536 - SunOS 4.1.x
-> 62.97.78.24:8888 (distance 9, link: ethernet/modem)

Como vemos, solo cuando realizo un reconocimiento activo con nmap despierto a P0f, en los anteriores casos no es capaz de reconocer el sistema operativo. Al probarlo sobre un entorno de 100 mbits/s de ancho de banda durante una hora, observe que no se detectaron apenas sistemas operativos, así como, que se detectaron falsos positivos. 

Personalmente p0f no cumplió con lo que esperaba, entiendo que su comportamiento es complejo pero no cumple los requisitos necesarios para lo que buscamos. Por ello seguí buscando nuevas herramientas y encontré SANCP: Security Analyst Network Connection Profiler.

SANCP permite crear estadísticas de los datos leídos, en función de puertos y IPs, justo lo que necesitamos para tener un buen inventario de la red que estamos leyendo. La aplicación genera tres ficheros, uno es el tráfico pcap leído, el segundo es una estadística de la red (el que principalmente nos interesa) y el último es un resumen en tiempo real del tráfico leído.

Por desgracia SANCP no se encontraba en los repositorios por lo que decidí instalarlo a partir de las fuentes desde el CVS (es una herramienta que se ha dejado de desarrollar):

# apt-get install libpcap0.8-dev cvs
# cvs -d:pserver:anonymous@sancp.cvs.sourceforge.net:/cvsroot/sancp login
# cvs -d:pserver:anonymous@sancp.cvs.sourceforge.net:/cvsroot/sancp co sancp
# make linux
# ./install

 
El siguiente paso consistirá en editar el fichero de configuración del SANCP con unas líneas básicas. Primeramente indicamos el valor, siempre en hexadecimal, del tipo de protocolo soportado en la capa de enlace, y para este caso IPv4 (var ip 8 del valor 0x0800 del Protocol Address Type), seguidamente indicamos que protocolos debe soportar IPv4 (icmp, tcp o udp en sus valores hexadecimales del campo Protocol de la cabecera IPv4), a continuación los servicios, y por tanto los puertos que queremos que escuche, las zonas de red y para finalizar los filtros que nos interese con formato “proto_red ip_src dst_ip proto_transporte puerto_src puerto_dst, acción” (hay filtros realmente complejos):

# vim /etc/sancp/mio.conf
var ip 8
var icmp 1
var tcp 6
var udp 17
var http 80
var https 443
var smtp 25
var dns 53
var HOME_NET 192.168.0.0/16
ip HOME_NET any udp any dns, stats pass


Cuidado con la configuración que creamos porque por ejemplo, indicar dos puertos como “var icmp X, Y” o indicar dos subredes como “var HOME_NET [192.168.0.0/16 10.0.0.0/8]” da lugar a que la aplicación falle mostrando una traza del fallo como el siguiente sin indicar porque falla, hay que ir línea a línea:

sancp: Retrieved last connection ID: 5606918228258572233 8 0
*** glibc detected *** sancp: free(): invalid pointer: 0x082b5294 ***


Para finalizar ejecutaremos la aplicación indicándole el usuario y grupo, la interfaz, donde se encuentra el fichero de configuración, que no guarde ni el volcado pcap del tráfico de red ni las estadísticas en tiempo real y que muestre el valor de la IP en un formato humano (no network):
# sancp -i eth0 -P -R -H -u sancp -g sancp -c /etc/sancp/mio.conf

Si eliminamos la opción “-R” obtendremos las estadísticas en tiempo real con formato “realtime.interfaz.timestamp”, si eliminamos la variable “-P” capturaremos el tráfico de red en el fichero “pcap.interfaz.timestamp”. El fichero que nos interesa es el de estadísticas llamado “stats.interfaz.timestamp”:

# head -1 stats.eth0.1305468039
|192.168.XXX.XXX|48708|62.97.78.24|80|2|300|10|8|1522|5939|1F|1A|05|60|64|89|14600|||||60|53|89|5792|||||8665|1|0|0|0|N|N|Y|3|1067|0|0|0|0|0|N|65:37:XX:XX:0:0|0:1:0:XX:XX:6f

Con un simple script podemos parsear las entradas del fichero y obtener mucha información a nivel de red útil que puede permitirnos detectar nuevos puertos en ciertas IP's, así como, comportamientos anómalos de la red.

Sería una herramienta muy muy útil de no ser por la limitación en las opciones del fichero de configuración, por lo menos, hasta lo que he podido investigar. Creo que estaría muy bien poder añadir al código las funcionalidades para que permita poder indicarle a una misma variable más de una IP o un puerto, así como, la capacidad de depurar los errores del fichero de configuración de una forma más adecuada.

Buscando un poquito más encontré la herramienta PADS o Passive Asset Detection System, la cual lee el payload de los paquetes y comprueba si coincide con una serie de firmas escritas mediante expresiones regulares, que identifican baners de respuesta de una serie de servicios y sistemas operativos.

Para instalar la herramienta es necesario usar “apt-get”:
# apt-get install pads

El fichero de firmas se encuentra en “/etc/pads/pads-signature-list”. Un ejemplo de expresión regular sería el siguiente:

smtp,v/Microsoft Exchange SMTP/$2/$1/,220 ([-.\w]+) Microsoft ESMTP MAIL Service, Version: ([\S]+)

El siguiente paso consistirá en configurar el fichero de configuración “/etc/pads/mio.conf” de la siguiente forma:

# vim /etc/pads/mio.conf
daemon 0
pid_file /var/run/pads.pid
interface eth0
network 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
output screen
output csv: /var/lib/pads/assets.csv


Para finalizar lo ejecutaremos con la siguiente orden:
# pads -c /etc/pads/mio.conf -i eth0

Ésta escribirá el resultado de los activos descubiertos en el fichero “/var/lib/pads/assets.csv”. Un ejemplo del fichero sería el siguiente:

84.246.212.91,80,6,www,Apache,1306270559
84.246.212.92,80,6,www,lighttpd/1.4.28,1306270561
178.33.42.161,80,6,www,nginx,1306270561
195.158.241.126,80,6,www,Apache,1306270565
149.20.54.15,80,6,www,Debian),1306270567
85.152.32.141,49182,6,unknown,unknown,1306270568
213.27.222.7,80,6,www,lighttpd/1.4.26-devel-109890:109892M,1306270570
208.67.238.238,80,6,www,bit_asic/3.8/r4c1-bitcast-b,1306270572
94.102.156.82,80,6,www,Ubuntu),1306270572


Los resultados han sido bastante mejores que en las anteriores herramientas basadas en protocolos de red y no en firma como PADS. Pero la capacidad de reconocimiento de puertos y equipos que tenia herramientas como SANCP no las tiene PADS.

Creo que la combinación de SANCP y PADS sería una herramienta auxiliar perfecta para los IDS, pero para ello sería necesario juntar los dos códigos y aplicar las mejoras comentadas durante la entrada. ¿Alguien se anima?

No hay comentarios:

Publicar un comentario