Distinguir los puertos UDP abiertos de los filtrados
En el caso del escaneo de Felix, todos los puertos menos los tresopen|filtered
eran closed
. Este no es siempre el caso. El ejemplo 5.5 muestra un escaneo UDP contra el sitio fuertemente filtrado Scanme.
Ejemplo 5.5. Ejemplo de escaneo UDP
krad# Starting Nmap ( http://nmap.org )All 1000 scanned ports on scanme.nmap.org (64.13.134.52) are open|filteredNmap done: 1 IP address (1 host up) scanned in 5.50 seconds
En este caso, el escaneo no redujo los puertos abiertos en absoluto.Todos los 1000 son open|filtered
. Se requiere una nueva estrategia.
La Tabla 5.3, «Cómo interpreta Nmap las respuestas a una sonda UDP» muestra que el estado open|filtered
ocurre cuando Nmap no recibe ninguna respuesta de sus sondas UDP a un puerto en particular. La razón por la que estos servicios no responden a menudo es que los paquetes vacíos que envía Nmap se consideran inválidos. Desafortunadamente, los servicios UDP generalmente definen su propia estructura de paquetes en lugar de adherirse a un formato general común que Nmap siempre podría enviar. Un paquete SNMP tiene un aspecto completamente diferente al de un paquete de petición SunRPC, DHCP o DNS.
Para enviar el paquete adecuado para cada servicio UDP popular, Nmap necesitaría una gran base de datos que definiera sus formatos de sonda.Afortunadamente, Nmap tiene eso en la forma denmap-service-probes
, que es parte del subsistema de detección de servicios y versiones descrito en el Capítulo 7, Detección de versiones de servicios y aplicaciones.
Cuando el escaneo de versiones está habilitado con -sV
(o-A
), enviará sondas UDP a cada puerto (así como a los conocidosopen
). Si alguna de las sondas obtiene una respuesta de un puerto open|filtered
, el estado se cambia a open
. Los resultados de añadir-sV
al escaneo de Felix se muestran en el Ejemplo 5.6.
Ejemplo 5.6. Mejorando los resultados del escaneo UDP de Felix con la detección de versiones
krad# Starting Nmap ( http://nmap.org )Nmap scan report for felix.nmap.org (192.168.0.42)Not shown: 997 closed portsPORT STATE SERVICE VERSION53/udp open domain ISC BIND 9.2.167/udp open|filtered dhcpserver111/udp open rpcbind 2 (rpc #100000)MAC Address: 00:02:E3:14:11:02 (Lite-on Communications)Nmap done: 1 IP address (1 host up) scanned in 1037.57 seconds
Este nuevo escaneo muestra que los puertos 111 y 53 están definitivamente abiertos. En este caso particular, el puerto está abierto pero Nmap no tiene una versión de sondeo para DHCP que funcione.Otro servicio difícil es SNMP, que normalmente sólo responde cuando se da la cadena de comunidad correcta. Muchos dispositivos están configurados con la cadena de comunidad public
, pero no todos lo están.Aunque estos resultados no son perfectos, aprender el verdadero estado de dos de los tres puertos probados sigue siendo útil.
Tras el éxito en la desambiguación de los resultados de Felix, Ereet vuelve a centrar su atención en Scanme, que listó todos los puertos como open|filtered
la última vez. Lo intenta de nuevo con la detección de versiones, como se muestra en el Ejemplo 5.7.
Ejemplo 5.7. Mejorando los resultados del escaneo UDP de Scanme con detección de versión
krad# Starting Nmap ( http://nmap.org )Nmap scan report for scanme.nmap.org (64.13.134.52)Not shown: 999 open|filtered portsPORT STATE SERVICE VERSION53/udp open domain ISC BIND 9.3.4Nmap done: 1 IP address (1 host up) scanned in 3691.89 seconds
Si bien Ereet finalmente encontró el puerto abierto, cometió un error al no actualizar primero su versión de Nmap. La versión 5.10BETA1 de Nmap y las más recientes tienen un sistema de carga útil que envía solicitudes de protocolo de servicio adecuadas a más de tres docenas de puertos UDP bien conocidos si se seleccionan para el escaneo de puertos o el descubrimiento de hosts. Aunque no es tan exhaustivo como la detección de versiones, habría identificado rápidamente el puerto 53 abierto en el ejemplo 5.5.
Este resultado tardó una hora, frente a los cinco segundos del escaneo anterior de Scanme, pero estos resultados son realmente útiles. La sonrisa de Ereet se ensancha y sus ojos brillan ante esta evidencia de un servidor de nombres ISC BIND abierto en una máquina que quiere comprometer. Ese software tiene una larga historia de agujeros de seguridad, así que tal vez pueda encontrar un fallo en esta versión reciente.
Ereet centrará sus ataques UDP en el puerto 53 ya que está confirmado que está abierto, pero no se olvida de los otros 999 puertos listados comoopen|filtered
. Como hemos visto con el puerto dhcpserver en Felix, ciertos servicios UDP abiertos pueden esconderse incluso de la detección de la versión de Nmap. También ha escaneado sólo los puertos por defecto hasta ahora, hay otros 64529 que podrían estar abiertos. Por ejemplo, el 53 es el único puerto UDP abierto en Scanme.
Aunque esta técnica de detección de versiones es la única forma de que Nmap desambigüe automáticamente los puertos open|filtered
, hay un par de trucos que se pueden probar manualmente. A veces un traceroute especializado puede ayudar. Puede hacer un traceroute contra un puerto TCP o UDP conocido con Nmap o una herramienta como Nping, y luego intentar lo mismo contra el puerto UDP dudoso. Las diferencias en el número de saltos pueden diferenciar los puertos abiertos de los filtrados. Ereet intenta esto contraScanme en el Ejemplo 5.8. El primer comando hace un traceroute UDP contra el puerto 53 conocido-abierto. El segundo comando hace lo mismo contra el puerto 54 supuestamente cerrado. Los primeros saltos se han omitido para ahorrar espacio.
Ejemplo 5.8. Intentando desambiguar puertos UDP con discrepancias de TTL
krad# Starting Nping ( http://nmap.org/nping )SENT (7.0370s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=8 id=4826 iplen=28RCVD (7.1010s) ICMP 4.69.134.222 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=248 id=38454 iplen=56SENT (8.0400s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=9 id=38166 iplen=28RCVD (8.1050s) ICMP 4.68.18.204 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=247 id=39583 iplen=56SENT (9.0420s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=10 id=6788 iplen=28RCVD (9.1080s) ICMP 4.59.4.78 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=246 id=59897 iplen=56SENT (10.0440s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=11 id=366 iplen=28RCVD (10.1100s) ICMP 69.36.239.221 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=243 id=42710 iplen=56SENT (11.0470s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=12 id=63478 iplen=28SENT (12.0490s) UDP 192.168.0.21:53 > 64.13.134.52:53 ttl=13 id=56653 iplen=28Max rtt: 73.003ms | Min rtt: 0.540ms | Avg rtt: 48.731msRaw packets sent: 13 (364B) | Rcvd: 10 (560B) | Lost: 3 (23.08%)Tx time: 12.02836s | Tx bytes/s: 30.26 | Tx pkts/s: 1.08Rx time: 13.02994s | Rx bytes/s: 42.98 | Rx pkts/s: 0.77Nping done: 1 IP address pinged in 13.05 secondskrad# Starting Nping ( http://nmap.org/nping )SENT (7.0370s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=8 id=56481 iplen=28RCVD (7.1130s) ICMP 4.69.134.214 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=248 id=22437 iplen=56SENT (8.0400s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=9 id=23264 iplen=28RCVD (8.1060s) ICMP 4.68.18.76 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=247 id=50214 iplen=56SENT (9.0430s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=10 id=9101 iplen=28RCVD (9.1070s) ICMP 4.59.4.78 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=246 id=880 iplen=56SENT (10.0450s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=11 id=35344 iplen=28RCVD (10.1110s) ICMP 69.36.239.221 > 192.168.0.21 TTL=0 during transit (type=11/code=0) ttl=243 id=44617 iplen=56SENT (11.0470s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=12 id=53857 iplen=28SENT (12.0490s) UDP 192.168.0.21:53 > 64.13.134.52:54 ttl=13 id=986 iplen=28Max rtt: 76.488ms | Min rtt: 0.546ms | Avg rtt: 48.480msRaw packets sent: 13 (364B) | Rcvd: 11 (616B) | Lost: 2 (15.38%)Tx time: 12.02908s | Tx bytes/s: 30.26 | Tx pkts/s: 1.08Rx time: 13.03165s | Rx bytes/s: 47.27 | Rx pkts/s: 0.84Nping done: 1 IP address pinged in 13.05 seconds
En este ejemplo, Ereetw sólo fue capaz de alcanzar el salto once de ambos puertos abiertos y cerrados. Así que estos resultados no se pueden utilizar para distinguir los estados de los puertos contra este host. Merece la pena intentarlo, y funciona en un número significativo de casos. Es más probable que funcione en situaciones en las que el cortafuegos de detección está al menos uno o dos saltos antes del host de destino. Scanme, por otra parte, ejecuta su propio cortafuegos basado en Linuxiptableshost. Así que no hay diferencia en el número de saltos entre los puertos filtrados y los abiertos.
Otra técnica es probar herramientas específicas de la aplicación contra puertos comunes. Por ejemplo, un cracker de cadenas de comunidad SNMP de fuerza bruta podría probarse contra el puerto 161. A medida que crece la base de datos de sondas de detección de versiones de Nmap, se reduce la necesidad de aumentar sus resultados con herramientas externas especializadas. Seguirán siendo útiles para casos especiales, como dispositivos SNMP con una cadena de comunidad personalizada.