Hogar Mapa Indice Busqueda Noticias Arca Enlaces Sobre LF
[Top bar]
[Bottom bar]
Este documento está disponible en los siguientes idiomas: English  Castellano  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Foto del Autor]
por Danilo Lujambio

Sobre el autor:


Contenidos:

Aprendiendo con el nmap

[nmap]

Resumen:



¿ Porqué poseen importancia los barredores o scanners en seguridad dentro de redes ?. Fundamentalmente porque son herramientas esenciales para aquellos que desean atacar un sistema. Las metodologías para la preparación de un ataque pueden ser :

Por ello para un administrador preocupado por la seguridad de su sistema le es importante realizar un barrido de su red, y buscar vulnerabilidades antes que lo hagan otros con no muy buenas intenciones

Existen varios barredores para esta finalidad , en el artículo se trabajará sobre el nmap que es seguramente uno de los más completos

El nmap permite a los administradores de sistemas y a los curiosos poder "scannear" ( o barrer ) las redes y poder determinar que servidores están activos y que servicios están ofreciendo.

El nmap ofrece varias técnicas de barrido. En este artículo se pretende trabajar sobre un número limitado de ellas , aprovechándolas para repasar ( ¿ quizás aprender ? ) aspectos del protocolo TCP

La idea es que se pueda observar algunas de las formas de uso del nmap para obtener información sobre los sistemas y a la vez observar como se puede encontrar huellas del barrido realizado por el nmap desde el lado del objetivo

El nmap se obtiene de www.insecure.org , una vez bajado :

tar zxvf nmap-2.30BETA17.tgz
cd ...../nmap-2.30BETA17/
./configure
make
make install
con lo cual queda instalado

El resultado que arroja el nmap es comunmente una lista de los puertos "interesantes" ( puertos activos) en la máquina que está siendo barrida . Para dichos puertos da el nombre del servicio conocido , el estado y el protocolo  

Barrido utilizando el three way handshake del TCP (opción -sT)

La forma de barrido mas común que posee es utilizando la opción -sT . Este modo se basa en la metodología de inicio de conexión que posee el TCP , conocida como three way handshake. Describiéndolo resumidamente sucede la siguiente secuencia [1]
a) El servidor tiene que estar preparado para recibir una conexión ( en general utilizando las funciones socket , bind y listen)
b) El cliente lanza una conexión activa - llama a connect() - Con esto envía un segmento SYN para informarle al server el numero inicial de secuencia para los datos que el cliente va a enviar en la conexión. El SYN normalmente contiene un IP Header - un TCP Header y puede ser algún opción TCP
c) El servidor debe dar por conocido el SYN enviando un ACK y a su vez envía un SYN con su número de secuencia ( todo en un sólo paquete TCP)
d) El cliente debe dar por conocido el SYN enviado con un ACK

Este modo de barrido posee dos ventajas :

y posee la gran desventaja que es muy sencillo de detectar y es fácil de filtrar

Se analiza a continuación  el proceso que general el nmap con la opción -sT , corriendo el tcpdump en la máquina objetivo. Para ello se ejecuta el nmap en la máquina 192.168.255.20 y se dirige hacia la máquina casa2.xxx.xxx.xxx, en una red ethernet
1) 08:24:18.393108 192.168.255.20.1024 > casa2.xxx.xxx.xxx.653: S 2632227152:2632227152(0) win 16060 <mss 1460,sackOK,timestamp 232602[|tcp]> (DF)
2) 08:24:18.393167 casa2.xxx.xxx.xxx.653 > 192.168.255.20.1024: R 0:0(0) ack 2632227153 win 0
3) 08:24:18.393227 192.168.255.20.1025 > casa2.xxx.xxx.xxx.6141: S 2644226118:2644226118(0) win 16060 <mss 1460,sackOK,timestamp 232602[|tcp]> (DF)
4) 08:24:18.393258 casa2.xxx.xxx.xxx.6141 > 192.168.255.20.1025: R 0:0(0) ack 2644226119 win 0
5) 08:24:18.453343 192.168.255.20.1298 > casa2.xxx.xxx.xxx.pop3: S 2640612362:2640612362(0) win 16060 <mss 1460,sackOK,timestamp 232608[|tcp]> (DF)
6) 08:24:18.453542 casa2.xxx.xxx.xxx.pop3 > 192.168.255.20.1298: S 1658259980:1658259980(0) ack 2640612363 win 16060 <mss 1460,sackOK,timestamp 243353[|tcp]> (DF)
7) 08:24:18.458667 192.168.255.20.1298 > casa2.xxx.xxx.xxx.pop3: . ack 1 win 16060 <nop,nop,timestamp 232609 243353> (DF)
8) 08:24:18.461280 192.168.255.20.1298 > casa2.xxx.xxx.xxx.pop3: F 1:1(0) ack 1 win 16060 <nop,nop,timestamp 232609 243353> (DF)

La numeración de líneas se ha agregado para una mejor explicación:
en la línea 1) la máquina "atacante" 192.168.255.20 lanza desde el puerto 1024 un segmento SYN hacia el puerto 653 de la máquina objetivo casa2.xxx.xxx.xxx . Se reconoce que se trata de un segmento SYN por la S que se observa después del 653. Se estaría hasta allí en el punto b) del three way handshake explicado.
en la línea 2) la máquina objetivo responde con un paquete RESET ( nótese la R luego del 1024) indicando esto que no posee un proceso "escuchando" sobre el puerto 653
las líneas 3 y 4 son similares a las dos primeras , lo fundamental que varia es que se chequea si hay un proceso en el puerto 6141 de la máquina objetivo, como nuevamente no lo hay , se vuelve a responder con un RESET
la línea 5) muestra como la máquina 192.168.255.20 lanza un segmento SYN al puerto pop 3 de la máquina objetivo ( puerto 110) , esta vez la máquina objetivo responde con un ACK dando por reconocido el SYN y el número de secuencia enviado ( se envía el numero de secuencia propio de la máquina objetivo , en este caso 1658259980 y el nro de secuencia enviado por la máquina 192.168.255.20 , + 1 es decir 2640612363) . Fíjese que el paquete que responde casa2 posee los bits de control SYN y ACK activos . Esto se observa en la línea 6) y se estaría en el paso c) del three way handshake.
La línea 7) muestra el reconocimiento del último paquete recibido en la máquina 192.168.255.20 con un segmento ACK , llegando así al punto d) del handshake . La línea 8) es la finalización de la conexión por parte de 192.168.255.20 , cuestión que se realiza enviando un segmento FIN ( notese la F luego de pop3)

Este proceso permitió al nmap ejecutado detectar que el puerto 110 ( pop3) de casa2 es un puerto activo en dicha máquina

Se mencionó que esta forma de barrido es facilmente detectable , notese las huellas que dejaron en el archivo /var/log/messages ( esto depende de como esté configurado el syslog.conf) la conexión vista en la línea 5 , 6 , 7 y 8 :

May 6 08:24:01 casa2 in.pop3d[205]: connect from root@192.168.255.20
 

Barrido utilizando los segmentos SYN ( medio abierto o half open , opción -sS )

Este tipo de barrido se obtiene ejecutando al nmap con la opción -sS . La técnica que utiliza es abrir una "media conexión" , es decir envía un segmento SYN y si recibe un ACK es porque ha detectado un puerto activo en la máquina objetivo , después de lo cual envía un RESET para cortar en forma abrupta la comunicación. Si en vez de un ACK recibe un RST es porque el puerto de la máquina objetivo no se encuentra activo. Este modo de barrido posee la desventaja que se deben tener privilegios de root para ejecutarlo . Pero posee la ventaja que es de difícil detección en la máquina que es barrida

Veamos ahora un análisis similar de la tarea desarrollada por el nmap con esta opción, analizandola con el tcpdump ( nuevamente las líneas se numeran por comodidad)
1) 22:25:45.856936 192.168.255.20.40175 > casa2.tau.org.ar.946: S 1292785825:1292785825(0) win 3072
2) 22:25:45.857078 casa2.tau.org.ar.946 > 192.168.255.20.40175: R 0:0(0) ack 1292785826 win 0

las líneas 1) y 2) son muy similares a las líneas 1) y 2) del apartado anterior , simplemente se ve el segmento SYN enviado por la máquina 192.168.255.20 al puerto 946 de la máquina casa2 y la respuesta de esta enviando un RESET por no ser ese un puerto activo de ella

3) 22:25:45.970365 192.168.255.20.40175 > casa2.tau.org.ar.pop3: S 1292785825:1292785825(0) win 3072
4) 22:25:45.976022 casa2.tau.org.ar.pop3 > 192.168.255.20.40175: S 185944428:185944428(0) ack 1292785826 win 16080 <mss 536> (DF)
5) 22:25:45.979578 192.168.255.20.40175 > casa2.tau.org.ar.pop3: R 1292785826:1292785826(0) win 0

las líneas 3) 4) y 5) son obtenidas por el hallazgo exitoso del puerto 110 ( pop3) en la máquina casa2 . Como se mencionó , no se desarrolla completo el three way handshake sino que al recibir el nmap el reconocimiento de su segmento SYN ( mediante el segmento ACK enviado por casa2 , línea 4 ), envía un segmento RESET que fuerza la interrupción de la comunicación.

Este barrido sobre casa2 no dejó huella en el archivo /var/log/messages , tal como se había anticipado  

Barrido utilizando los segmentos FIN

La idea sobre la que se basa este tipo de barrido es que los puertos no activos de la máquina objetivo responden a un paquete FIN con un paquete RST. Los puertos activos, por otra parte ignoran dichos paquetes. Por lo tanto se obtiene la lista interesante de puertos observando cuales son los que no han "contestado". Las máquinas corriendo sistemas operativos microsoft no son vulnerables a este tipo de barrido, ya que realizan una implementación no standard de lo que debería ser la forma correcta de operación del TCP.

Hay tres formas de operación del nmap utilizando técnicas parecidas , ellas se obtienen con las opciones -sF , -sX y -sN.

Analizamos en este articulo el comportamiento bajo la opción -sF. Realizamos para ello un trabajo similar al hecho para las otras opciones
1) 06:50:45.643718 192.168.255.20.35600 > casa2.tau.org.ar.864: F 0:0(0) win 2048
2) 06:50:45.643865 casa2.tau.org.ar.864 > 192.168.255.20.35600: R 0:0(0) ack 0 win 0

en las líneas 1) y 2) se observa el envío del segmento FIN ( notese la F luego del 864 en la línea 1) a la máquina objetivo y la respuesta de ella con un paquete RST ( notese la R en la línea 2 luego del 35600). nmap concluye entonces que el puerto 864 de casa2 no se encuentra activo.

3) 06:50:47.933227 192.168.255.20.35600 > casa2.tau.org.ar.pop3: F 0:0(0) win 2048
4) 06:50:48.251147 192.168.255.20.35601 > casa2.tau.org.ar.pop3: F 0:0(0) win 2048

las líneas 3) y 4) vuelven a tomar como ejemplo al puerto pop3 de casa2 .En la línea 3 se ve el envío del segmento FIN , segmento que no obtiene respuesta por parte de casa2 . La línea 4) constituyó una sorpresa y debe ser una seguridad que toma el nmap para puertos que "no contestan" , vuelve a enviarle un segmento FIN al cabo de un lapso para ver si realmente ese puerto no esta contestando. En ambos casos, casa2 ignoró los paquetes , mostrándole así al nmap que su puerto pop3 se encuentra activo.  

Expresiones del tcpdump que pueden ayudar

En el apartado "barrido utilizando el three way handshake del tcp" se mencionó y se mostró las huellas que puede dejar el barrido del nmap con la opcion -sT . En los dos siguientes apartados se vió que las opciones -sS y -sF no dejan huellas. Podemos utilizar el programa tcpdump para detectar este tipo de barridos en una máquina que esta conectada a la red y que puede recibir ataques. El inconveniente es que el programa tcpdump genera una cantidad de información enorme que trae dificultades de espacio de almacenamiento y luego también de análisis. Se ofrecen aquí algunas expresiones que actúan sobre el tcpdump como filtros de manera que la información obtenida por él sea menor y más sencilla de analizar.

Para entender las expresiones utilizadas , se muestra en la siguiente figura como es el formato del paquete TCP [2]

TCP (RFC 793)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |        Destination Port       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Sequence Number                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Acknowledgement Number                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Offset |  Reserver |U|A|P|R|S|F|             Window            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Options                      |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              Data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Como puede observarse es en el byte 13 es donde se encuentran las banderas que identifican al paquete como un segmento SYN , FIN , etc. Conociendo esto y utilizando la expresión and (&) con máscaras para detectar cuales son los bits activos podemos realizar las siguientes expresiones

tcpdump 'tcp[13] & 7 !=0 and dst 192.168.255.20' > /tmp/salida7
así se filtraran y se obtendrán los paquetes que poseen los bits R , S o F ( la máscara es 00000111) activos y que tiene por destino la máquina 192.168.255.20 ( obviamente este número IP será el de la máquina a proteger)

Utilizando

tcpdump 'tcp[13] & 1 !=0 and dst 192.168.255.20' > /tmp/salida1
obtendremos los paquetes que poseen el bit FIN activo ( la máscara es 00000001). Nos puede servir para detectar los barridos del nmap que utilizan la opción -sF . Y realizando
tcpdump 'tcp[13] & 2 !=0 and dst 192.168.255.20' > /tmp/salida2
obtendremos solo los paquetes que poseen el bit SYN activo , sirviéndonos para detectar los barridos con opción -sS

Para este último tipo ( el barrido nmap -sS ) existen programas de detección disponibles [3]  

Conclusión

Programas como el nmap son muy útiles para mejorar la seguridad de un sistema verificando que partes débiles posee. Aquí solo se ha mostrado el funcionamiento de una parte muy reducida de él, pero creo que sirve para entender un poco más, desde adentro como funcionan los scanner

 

Bibliografía

[1] W. Richard Stevens Unix Network Programming Volume 1
[2] RFC 793
[3] ver la documentación del nmap

 

Formulario de "talkback" para este artículo

Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
 Ir a la página de "talkback" 

Contactar con el equipo de LinuFocus
© Danilo Lujambio, FDL
LinuxFocus.org

Pinchar aquí para informar de algún problema o enviar comentarios a LinuxFocus

2001-05-16, generated by lfparser version 2.9