Técnicas de sondeo de puertos

Cuando intento realizar un arreglo de mi coche, siendo novato, puedo pasarme horas intentando utilizar mis herramientas rudimentarias (martillo, cinta aislante, llave inglesa, etc.). Cuando fallo miserablemente y llevo mi coche antiguo en grúa al taller a un mecánico de verdad siempre pasa lo mismo: busca en su gran cajón de herramientas hasta que saca una herramienta que hace que la tarea se haga sin esfuerzo. El arte de sondear puertos es parecido. Los expertos conocen docenas de técnicas de sondeo y eligen la más apropiada (o una combinación de éstas) para la tarea que están realizando. Los usuarios sin experiencia y los "script kiddies", sin embargo, intentan resolver cada problema con el sondeo SYN por omisión. Dado que Nmap es libre, la única barrera que existe para ser un experto en el sondeo de puertos es el conocimiento. Esto es mucho mejor que el mundo del automóvil, donde puedes llegar a saber que necesitas un compresor de tuerca, pero tendrás que pagar mil dolares por él.

La mayoría de los distintos tipos de sondeo disponibles sólo los puede llevar a cabo un usuario privilegiado. Esto es debido a que envían y reciben paquetes en crudo, lo que hace necesario tener acceso como administrador (root) en la mayoría de los sistemas UNIX. En los entornos Windows es recomendable utilizar una cuenta de administrador, aunque Nmap algunas veces funciona para usuarios no privilegiados en aquellas plataformas donde ya se haya instalado WinPcap. La necesidad de privilegios como usuario administrador era una limitación importante cuando se empezó a distribuir Nmap en 1997, ya que muchos usuarios sólo tenían acceso a cuentas compartidas en sistemas como usuarios normales. Ahora, las cosas son muy distintas. Los ordenadores son más baratos, hay más personas que tienen acceso permanente a Internet, y los sistemas UNIX (incluyendo Linux y MAC OS X) son más comunes. También se dispone de una versión para Windows de Nmap, lo que permite que se ejecute en más escritorios. Por todas estas razones, cada vez es menos necesario ejecutar Nmap utilizando cuentas de sistema compartidas. Esto es bueno, porque las opciones que requieren de más privilegios hacen que Nmap sea más potente y flexible.

Aunque Nmap intenta generar resultados precisos, hay que tener en cuenta que estos resultados se basan en los paquetes que devuelve el sistema objetivo (o los cortafuegos que están delante de éstos). Estos sistemas pueden no ser fiables y envíar respuestas cuyo objetivo sea confundir a Nmap. Son aún más comunes los sistemas que no cumplen con los estándares RFC, que no responden como deberían a las sondas de Nmap. Son especialmente susceptibles a este problema los sondeos FIN, Null y Xmas. Hay algunos problemas específicos a algunos tipos de sondeos que se discuten en las entradas dedicadas a sondeos concretos.

Esta sección documenta las aproximadamente doce técnicas de sondeos de puertos que soporta Nmap. Sólo puede utilizarse un método en un momento concreto, salvo por el sondeo UDP (-sU) que puede combinarse con cualquiera de los sondeos TCP. Para que sea fácil de recordar, las opciones de los sondeos de puertos son del estilo -s<C>, donde <C> es una letra característica del nombre del sondeo, habitualmente la primera. La única excepción a esta regla es la opción obsoleta de sondeo FTP rebotado (-b). Nmap hace un sondeo SYN por omisión, aunque lo cambia a un sondeo Connect() si el usuario no tiene los suficientes privilegios para enviar paquetes en crudo (requiere acceso de administrador en UNIX) o si se especificaron objetivos IPv6. De los sondeos que se listan en esta sección los usuarios sin privilegios sólo pueden ejecutar los sondeos Connect() o de rebote FTP.

-sS (sondeo TCP SYN)

El sondeo SYN es el utilizado por omisión y el más popular por buenas razones. Puede realizarse rápidamente, sondeando miles de puertos por segundo en una red rápida en la que no existan cortafuegos. El sondeo SYN es relativamente sigiloso y poco molesto, ya que no llega a completar las conexiones TCP. También funciona contra cualquier pila TCP en lugar de depender de la idiosincrasia específica de una plataforma concreta, al contrario de lo que pasa con los sondeos de Nmap Fin/Null/Xmas, Maimon o pasivo. También muestra una clara y fiable diferenciación entre los estados abierto, cerrado, y filtrado.

A esta técnica se la conoce habitualmente como sondeo medio abierto, porque no se llega a abrir una conexión TCP completa. Se envía un paquete SYN, como si se fuera a abrir una conexión real y después se espera una respuesta. Si se recibe un paquete SYN/ACK esto indica que el puerto está en escucha (abierto), mientras que si se recibe un RST (reset) indica que no hay nada escuchando en el puerto. Si no se recibe ninguna respuesta después de realizar algunas retransmisiones entonces el puerto se marca como filtrado. También se marca el puerto como filtrado si se recibe un error de tipo ICMP no alcanzable (tipo 3, códigos 1,2, 3, 9, 10, ó 13).

-sT (sondeo TCP connect())

El sondeo TCP Connect() es el sondeo TCP por omisión cuando no se puede utilizar el sondeo SYN. Esto sucede, por ejemplo, cuando el usuario no tiene privilegios para enviar paquetes en crudo o cuando se están sondeando redes IPv6. Nmap le pide al sistema operativo subyacente que establezcan una conexión con el sistema objetivo en el puerto indicado utilizando la llamada del sistema connect(), a diferencia de otros tipos de sondeo, que escriben los paquetes a bajo nivel. Ésta es la misma llamada del sistema de alto nivel que la mayoría de las aplicaciones de red, como los navegadores web o los clientes P2P, utilizan para establecer una conexión. Esta llamada es parte del interfaz de programación conocido como la API de conectores de Berkeley. También, en lugar de leer las respuestas directamente de la línea, Nmap utiliza esta API para obtener la información de estado de cada intento de conexión.

Generalmente es mejor utilizar un sondeo SYN, si éste está disponible. Nmap tiene menos control sobre la llamada de alto nivel Connect() que cuando utiliza paquetes en crudo, lo que hace que sea menos eficiente. La llamada al sistema completa las conexiones para abrir los puertos objetivo, en lugar de realizar el reseteo de la conexión medio abierta como hace el sondeo SYN. Esto significa que se tarda más tiempo y son necesarios más paquetes para obtener la información, pero también significa que los sistemas objetivos van a registrar probablemente la conexión. Un IDS decente detectará cualquiera de los dos, pero la mayoría de los equipos no tienen este tipo de sistemas de alarma. Sin embargo, muchos servicios de los sistemas UNIX habituales añadirán una nota en el syslog, y algunas veces con un mensaje de error extraño, dado que Nmap realiza la conexión y luego la cierra sin enviar ningún dato. Los servicios realmente patéticos morirán cuando ésto pasa, aunque esto no es habitual. Un administrador que vea muchos intentos de conexión en sus registros que provengan de un único sistema debería saber que ha sido sondeado con este método.

-sU (sondeos UDP)

Aunque la mayoría de los servicios más habituales en Internet utilizan el protocolo TCP, los servicios UDP también son muy comunes. Tres de los más comunes son los servicios DNS, SNMP, y DHCP (puertos registrados 53, 161/162, y 67/68 respectivamente). Dado que el sondeo UDP es generalmente más lento y más difícil que TCP, algunos auditores de seguridad ignoran estos puertos. Esto es un error, porque es muy frecuente encontrarse servicios UDP vulnerables y los atacantes no ignoran estos protocolos. Afortunadamente, Nmap puede utilizarse para hacer un inventario de puertos UDP.

El sondeo UDP se activa con la opción -sU. Puede combinarse con un tipo de sondeo TCP como el sondeo SYN (-sS) para comprobar ambos protocolos al mismo tiempo.

Los sondeos UDP funcionan mediante el envío (sin datos) de una cabecera UDP para cada puerto objetivo. Si se obtiene un error ICMP que indica que el puerto no es alcanzable (tipo 3, código 3) entonces se marca el puerto como cerrado. Si se recibe cualquier error ICMP no alcanzable (tipo 3, códigos 1, 2, 9, 10, o 13) se marca el puerto como filtrado. En algunas ocasiones se recibirá una respuesta al paquete UDP, lo que prueba que el puerto está abierto. Si no se ha recibido ninguna respuesta después de algunas retransmisiones entonces se clasifica el puerto como abierto|filtrado. Esto significa que el puerto podría estar abierto o que hay un filtro de paquetes bloqueando la comunicación. Puede utilizarse el sondeo de versión (-sV) para diferenciar de verdad los puertos abiertos de los filtrados.

Uno de las grandes problemas con el sondeo UDP es hacerlo rápidamente. Pocas veces llega una respuesta de un puerto abierto o filtrado, lo que obliga a expirar a Nmap y luego a retransmitir los paquetes en caso de que la sonda o la respuesta se perdieron. Los puertos cerrados son aún más comunes y son un problema mayor. Generalmente envían un error ICMP de puerto no alcanzable. Pero, a diferencia de los paquetes RST que envían los puertos TCP cerrados cuando responden a un sondeo SYN o Connect, muchos sistemas imponen una tasa máxima de mensajes ICMP de puerto inalcanzable por omisión. Linux y Solaris son muy estrictos con esto. Por ejemplo, el núcleo de Linux versión 2.4.20 limita la tasa de envío de mensajes de destino no alcanzable a uno por segundo (en net/ipv4/icmp.c).

Nmap detecta las limitaciones de tasa y se ralentiza para no inundar la red con paquetes inútiles que el equipo destino acabará descartando. Desafortunadamente, un límite como el que hace el núcleo de Linux de un paquete por segundo hace que un sondeo de 65536 puertos tarde más de 18 horas. Puede acelerar sus sondeos UDP incluyendo más de un sistema para sondearlos en paralelo, haciendo un sondeo rápido inicial de los puertos más comunes, sondeando detrás de un cortafuegos, o utilizando la opción --host-timeout para omitir los sistemas que respondan con lentitud.

-sN; -sF; -sX (sondeos TCP Null, FIN, y Xmas)

Estos tres tipos de sondeos (aunque puede hacer muchos más a través de la opción --scanflags que se describe en la próxima sección) aprovechan una indefinición en la RFC de TCP que diferencia los puertos abiertos y cerrados. La página 65 dice que si el estado del puerto [destino] es CERRADO .... un segmento entrante que contiene un RST hace que se envíe un RST en la respuesta. Después la página siguiente discute los paquetes que se envían a puertos abiertos sin fijar los bits SYN, RST, o ACK, diciendo: es improbable que llegue aquí, pero si lo hace, debe descartar el segmento y volver.

Cuando se sondean sistemas que cumplen con el texto de esta RFC, cualquier paquete que no contenga los bits SYN, RST, o ACK resultará en el envío de un RST si el puerto está cerrado. Mientras que no se enviará una respuesta si el puerto está cerrado. Siempre y cuando se incluyan esos tres bits es válida la combinación de cualquiera de los otros tres (FIN, PSH, y URG). Nmap aprovecha esto con tres tipos de sondeo:

Sondeo Null(-sN)

No fija ningún bit (la cabecera de banderas TCP es 0)

sondeo FIN (-sF)

Solo fija el bit TCP FIN.

sondeo Xmas (-sX)

Fija los bits de FIN, PSH, y URG flags, iluminando el paquete como si fuera un árbol de Navidad.

Estos tres tipos de sondeos son exactamente los mismos en comportamiento salvo por las banderas TCP que se fijen en los paquetes sonda. Si se recibe un paquete RST entonces se considera que el puerto está cerrado. Si no se recibe ninguna respuesta el puerto se marca como abierto|filtrado. El puerto se marca filtrado si se recibe un error ICMP no alcanzable (tipo 3, código 1, 2, 3, 9, 10, o 13).

La ventaja fundamental de este tipo de sondeos es que pueden atravesar algunos cortafuegos que no hagan inspección de estados o encaminadores que hagan filtrado de paquetes. Otra ventaja es que este tipo de sondeos son algo más sigilosos que, incluso, un sondeo SYN. Sin embargo, no cuente con que pase siempre esto ya que la mayoría de los productos IDS pueden configurarse para detectarlos. El problema es que no todos los sistemas siguen el estándar RFC 793 al pie de la letra. Algunos sistemas envían respuestas RST a las sondas independientemente de si el puerto está o no cerrado. Esto hace que la mayoría de los puertos se marquen como cerrados. Algunos sistemas operativos muy utilizados que hacen ésto son Microsoft Windows, muchos dispositivos Cisco, BSDI, e IBM OS/400. Este sondeo no funciona contra sistemas basados en UNIX. Otro problema de estos sondeos es que no se puede distinguir los puertos abiertos de algunos puertos filtrados, lo que resulta en la respuesta abierto|filtrado.

-sA (sondeo TCP ACK)

Este sondeo es distinto de otros que se han discutido hasta ahora en que no puede determinar puertos abiertos (o incluso abiertos|filtrados). Se utiliza para mapear reglas de cortafuegos, y para determinar si son cortafuegos con inspección de estados y qué puertos están filtrados.

La sonda de un sondeo ACK sólo tiene fijada la bandera ACK (a menos que utilice --scanflags). Cuando se sondean sistemas no filtrados los puertos abiertos y cerrados devolverán un paquete RST. Nmap marca el puerto como no filtrado, lo que significa que son alcanzables por el paquete ACK, pero no se puede determinar si están abiertos o cerrados. Los puertos que no responden o que envían mensajes de error ICMP en respuesta (tipo 3, código 1, 2, 3, 9, 10, o 13), se marcan como filtrados.

-sW (sondeo de ventana TCP)

El sondeo de ventana («window», N. del T.) es exactamente igual al sondeo ACK que se aprovecha de un detalle de implementación de algunos sistemas que permite diferenciar puertos abiertos de los cerrados, en lugar de imprimir no filtrado cuando se devuelve un RST. Hace esto examinando el campo de ventana TCP del paquete RST devuelto. Algunos sistemas fijan un tamaño de ventana positivo para puertos abiertos (incluso para paquetes RST) mientras que se utiliza una ventana de tamaño cero para los cerrados. Así, en lugar de listar el puerto como no filtrado cuando se recibe un RST, el sondeo de ventana permite listar el puerto como abierto o cerrado en función de si el valor de la ventana TCP en ese paquete RST es positivo o cero, respectivamente.

Este sondeo depende de un detalle de implementación de una minoría de sistemas q que existen en Internet, así que no es siempre fiable. Los sistemas que no hacen ésto habitualmente harán que se muestren los puertos como cerrados. Por supuesto, es posible que el sistema no tenga ningún puerto abierto. Si la mayoría de los puertos están cerrados pero alguno de los números de puertos comunes (como pueda ser el 22, 25 ó 53) están filtrados, entonces el sistema es posible que sea susceptible a ésto. Algunas veces hay sistemas que mostrarán el comportamiento justo contrario. Si su sondeo muestra 1000 puertos abiertos y 3 puertos cerrados o filtrados entonces es posible que sean estos últimos los que están abiertos en realidad.

-sM (sondeo TCP Maimon)

El sondeo Maimon debe su nombre a la persona que lo descubrió: Uriel Maimon. Describió la técnica en la revista Phrack número 49 (noviembre de 1996). Nmap, que incluye esta técnica, se publicó dos números más tarde. Esta técnica es exactamente la misma a los sondeos Null, FIN, y Xmas, pero en los que se envía una sonda FIN/ACK. Según el RFC 793 (TCP), se debería generar un paquete RST cuando se responde a dicha sonda independientemente de si el puerto está cerrado o abierto. Uriel se dio cuenta, sin embargo, de que muchos sistemas derivados de BSD simplemente descartan el paquete si el puerto está abierto.

--scanflags (Sondeo TCP a medida)

Los usuarios realmente avanzados de Nmap no tienen por qué limitarse a los tipos de sondeos preparados que se ofrecen. La opción --scanflags le permite diseñar su propio sondeo mediante la especificación de banderas TCP arbitrarias. Deje volar a su imaginación al tiempo que evita las reglas de los sistemas de detección de intrusos cuyos fabricantes sólo echaron un vistazo a la página de manual de Nmap y añadieron reglas específicas para detectarlo.

La opción --scanflags puede ser un valor numérico como el 9 (PSH y FIN), aunque es más sencillo utilizar nombres simbólicos. Sólo tienes que juntar una combinación de URG, ACK, PSH, RST, SYN, y FIN. Por ejemplo, la configuración --scanflags URGACKPSHRSTSYNFIN fija todas las banderas, aunque no es muy útil para sondear. No importa el orden en que se especifiquen los nombres.

Además de poder especificar las banderas que desee se puede especificar el tipo de sondeo TCP (como -sA o -sF). Ésto le dice a Nmap cómo debe interpretar las respuestas. Por ejemplo, un sondeo SYN considera que si no se recibe respuesta el puerto está filtrado mientras que si no se recibe una respuesta en un sondeo FIN se trata como abierto|filtrado. Nmap se comportará igual que para el sondeo tipo base, con la diferencia de que utilizará las banderas TCP que usted especifique. Se utiliza el sondeo SYN si no se especifica ningún tipo base.

-sI <sistema zombi [:puerto_sonda]> (Sondeo ocioso)

Este es un método de sondeo avanzado que le permite hacer un sondeo de puertos TCP a ciegas de verdad (lo que significa que no se envía ningún paquete al sistema objetivo desde su dirección IP real). En lugar de ésto se utiliza un ataque con un canal alternativo que se aprovecha de la generación de la secuencia de los identificadores de fragmentación IP del sistema zombi para obtener información de los puertos abiertos en el objetivo. Los sistemas IDS mostrarán que el sondeo lo está realizando el sistema zombi que especifique (que debe estar vivo y cumplir algunos requisitos). Este tipo de sondeo tan fascinante es demasiado complejo como para describirlo por completo en esta guía de referencia por lo que escribí y publiqué un documento informal que contiene todos los detalles, el documento está disponible en https://nmap.org/book/idlescan.html.

Además de ser extraordinariamente sigiloso (debido a su funcionamiento a ciegas), este tipo de sondeo permite determinar las relaciones basadas en IP entre distintos sistemas. El listado de puertos muestra los puertos abiertos desde la perspectiva del sistema zombi. Así que puede analizar el mismo objetivo con zombis distintos que cree que podrían ser de confianza para éste (a través de las reglas de filtrados de los paquetes o reglas de filtrados de encaminadores).

Puede añadir un número de puerto separado por dos puntos del sistema zombi si desea analizar un puerto específico del zombi para consultar los cambios IPID. Si no lo hace Nmap utilizará el puerto que utiliza para pings TCP por omisión (el puerto 80).

-sO (sondeo de protocolo IP)

El sondeo de protocolo IP le permite determinar qué protocolos (TCP, ICMP, IGMP, etc.) soportan los sistemas objetivo. Esto no es, técnicamente, un sondeo de puertos, dado que cambia los números de protocolo IP en lugar de los números de puerto TCP ó UDP. Pero también se puede utilizar la opción -p para seleccionar los números de protocolo a analizar, los resultados se muestran en el formato de tabla utilizado para los puertos e incluso utiliza el mismo motor de sondeo que los métodos de sondeo de puertos reales. Es tan parecido a un sondeo de puertos que debe tratarse aquí.

El sondeo de protocolos, además de ser útil en sí mismo, demuestra el poder del software de fuentes abiertas («opensource», N. del T.). Aunque la idea fundamental era bastante sencilla, no había pensado añadirla ni tampoco había habido personas que solicitaran esta funcionalidad. Entonces, en el verano de 2000, se le ocurrió la idea a Gerhard Rieger y la implementó escribiendo un parche excelente, enviándolo posteriormente a la lista de correo de nmap-hackers. Incorporé ese parche en el árbol de código de Nmap y publiqué una nueva versión ese mismo día. ¡Pocas piezas de programas comerciales tienen usuarios tan entusiastas que diseñan y contribuyen sus propias mejoras!

El sondeo de protocolos utiliza mecanismos parecidos al sondeo UDP. Envía cabeceras de paquetes IP iterando por el campo de 8 bits que indica el protocolo IP, en lugar de iterar por el campo de número de puerto de un paquete UDP. Las cabeceras generalmente están vacías y no contienen datos. De hecho, ni siquiera tienen una cabecera apropiada para el protocolo que se indica. Las tres excepciones son TCP, UDP e ICMP. Se incluye una cabecera de protocolo válida para éstos porque algunos sistemas no los enviarán sin ellas y porque Nmap ya tiene funciones para crearlas. El sondeo de protocolos espera la recepción de mensajes de ICMP protocolo no alcanzable en lugar de mensajes ICMP puerto no alcanzable. Nmap marca el protocolo como abierto si recibe una respuesta en cualquier protocolo del sistema objetivo. Se marca como cerrado si se recibe un error ICMP de protocolo no alcanzable (tipo 3, código 2). Si se reciben otros errores ICMP no alcanzable (tipo 3, códigos 1, 3, 9, 10, o 13) se marca el protocolo como filtrado (aunque al mismo tiempo indican que el protocolo ICMP está abierto). El protocolo se marca como abierto|filtrado si no se recibe ninguna respuesta después de las retransmisiones.

-b <sistema de rebote ftp> (sondeo de rebote FTP)

Una funcionalidad interesante en el protocolo FTP (RFC 959) es la posibilidad de utilizar conexiones FTP de pasarela. Esta opción puede abusarse a muchos niveles así que muchos servidores han dejado de soportarla. Una de las formas de abusar de ésta es utilizar el servidor de FTP para hacer un sondeo de puertos a otro sistema. Simplemente hace falta decirle al servidor de FTP que envíe un fichero a cada puerto interesante del servidor objetivo cada vez. El mensaje de error devuelto indicará si el puerto está abierto o no. Esta es una buena manera de atravesar cortafuegos porque, habitualmente, los servidores de FTP de una organización están ubicados en un lugar en el que tienen más acceso a otros sistemas internos que el acceso que tiene un equipo en Internet. Nmap puede hacer sondeos con rebotes de FTP con la opción -b. Esta opción toma un argumento como: <usuario>:<contraseña>@<servidor>:<puerto>. <Servidor> es el nombre de la dirección IP del servidor FTP vulnerable. Al igual que con una URL normal, se puede omitir <usuario>:<contraseña>, en caso de que se deseen utilizar credenciales de acceso anónimo (usuario: anonymous contraseña:wwwuser@) También se puede omitir el número de puerto (y los dos puntos que lo preceden). Si se omiten se utilizará el puerto FTP estándar (21) en <servidor>.

Esta vulnerabilidad era muy habitual en 1997, el año que se publicó Nmap, pero ya ha sido arreglada en muchos sitios. Aún siguen existiendo servidores vulnerables así que merece la pena probar este sondeo si lo demás falla. Si su objetivo es atravesar un cortafuegos, analice la red objetivo en busca del puerto 21 (o incluso cualquier servicio FTP, si sondea todos los puertos y activa la detección de versiones). Después intente un sondeo de rebote utilizando cada uno. Nmap le indicará si el sistema es o no vulnerable. Si está intentado ocultar sus huellas no tiene que (y de hecho no debería) limitarse a servidores en la red objetivo. En cualquier caso, antes de empezar a sondear Internet al azar para buscar servidores de FTP vulnerables, tenga en cuenta que pocos administradores de sistemas apreciarán el que abuse de sus servidores de esta forma.