15 agosto 2008

Nmap, "La" herramienta.


Si Kevin Smith usaba la herramienta de detección de puertos y análisis de servicios "Nmap" en la película La jungla de cristal 4.0 no es puramente casualidad. Y es que, si le preguntamos a cualquier profesional cual es la utilidad por excelencia en seguridad, nos remitirá a esta misma. Es tan famosa que incluso tienen en la propia página web imágenes de las películas en las que ha salido... Matrix, El Caso Bourne y algunas otras más...

Hoy queríamos comentar una de las charlas que mas ha dado que hablar en la conferencia de seguridad Defcon en su 16 edición, en la que Fyodor, autor de Nmap ha expuesto los nuevos cambios de su software, centrándose en las mejoras de rendimiento. La presentación de la podéis consultar en la página web del autor.

Empezó señalando los problemas en la detección de direcciones IP que ofrecen servicio, comúnmente denominadas "levantadas". Nmap dispone de un parámetro (-sP), que determina que direcciones IP están en uso y cuáles no mediante la combinación de dos técnicas: espera un icmp echo reply cuando envía un icmp echo request, y un paquete TCP con el flag SYN activado al puerto 80, esperando la correspondiente respuesta de TCP. Como ya sabéis todos, existen múltiples métodos más para detectar direcciones IP, como otros paquetes ICMP distintos, envíos de SYNs a puertos distintos del 80, "pings" mediante paquetes TCP con el flag ACK activado, paquetes UDP.... etcétera.

La buena noticia es que Nmap incluye todos ellos y puede ser utilizado maximizando su potencia.
Hace cuatro años escribí en mi blog personal que para esto, el mejor comando que se me ocurría era el siguiente:

nmap -sP -PM -PE -PP -PS21,22,25,53,80,110,135,143,139

En la presentación de la Defcon, donde Fydor se ha presentado con estadísticas y mejorado el software, hemos evolucionado al siguiente comando:

nmap -sP -PE -PP -PS21,23,25,80,113,31339 -PA80,113,443,10042 --source-port 53 -T4

Esta entrada no pretende ser un manual de Nmap, pero básicamente lanza paquetes de icmp tipo echo request, timestamp, y TCP con flag syn activado al puerto 21, 23... Finalmente el último envío es de paquetes TCP con flag ACK a otros puertos determinados: 80,113,443... y añade una opción más para especificar el puerto de origen con el objetivo de saltarse cortafuegos con configuraciones mejorables. }:>

El resultado es claro, frente a un simple "-sP -T4", para 50.000 IPs tarda 21 minutos y detecta
3348 equipos levantados, en cambio, con el comando comentado anteriormente, se tardan 71 pero se detectan 4473 sistemas.

Yo me pregunté en su momento cuales serían los puertos más utilizados en Internet y utilizando un dedo humedo saque unos cuantos. Fyodor tiene datos, por lo que podremos actualizar nuestros scripts a conciencia.

Para la charla se liberó una versión concreta, la "bhdc08", disponible mediante svn de la página del producto. Esta versión es exactamente igual a la que podemos descargar en RPM o el propio tarball de la página, la modificación importante es un nuevo archivo de servicios . ¿y que es este archivo?.

Históricamente los escaneadores de puertos utilizaban el archivo de sistema /etc/services , que relaciona numero con nombre de servicio, para realizar peticiones únicamente sobre esos puertos y acelerar el proceso, Nmap se generó su propio "services" con el objetivo de mejorar los puertos estándares y obtener mejores resultados.

Este mismo fichero, en la nueva versión "bhdc08 (que imagino publicarán pronto en el propio Nmap estandar) ahora incluye un índice estadístico que indica cual es la frecuencia de su uso, de tal forma que podemos escanear por los N top puertos más utilizados y nuevamente, mejorar el rendimiento al máximo. En números:

Para el comando: nmap -sUV -F -T4 scanme.nmap.org

El nmap actual (4.68) sin el archivo comentado, tarda aproximadamente 1 hora y 2 minutos. Con el archivo de servicios (y ejecutando un --top-ports 100 de forma silenciosa) se reduce a 6 minutos y medio, y añadiendo un nuevo parámetro que permite especificar la "intensidad" de la identificación de servicios (--version-intensity 0) al mínimo, este número se reduce a únicamente 13 segundos. En todas las ejecuciones se identifica el mismo puerto.

Si queremos asegurarnos la identificación del 100% de puertos utilizando este "top", bastará con solicitar que escanee los top 3674, este número se reduce a tan solo 500 puertos si aceptamos una pérdida del 11% de servicios. Algo que bajo mi punto de vista y salvo tenga que escanear varias clases A, no creo que sea conveniente.

Dentro de las métricas mostradas, se presentan los siguientes servicios como los más utilizados: 80, 23, 22, 443, 3389, 445, 139, 21, 135 y 25 para TCP. Impresiona seguir viendo el 23 ¿verdad?. Para UDP los diez más importantes son: 137, 161, 1434, 123, 138, 445, 135, 67, 139 y 53. Que levante la mano el que cuando ve un 1434 perteneciente a ms-sql-m y no recuerda cierto gusano en Internet :)

Se hacen mención de otras funcionalidades muy interesantes, como la posibilidad de especificar el número máximo y mínimo de paquetes por segundo (--max-rate y --min-rate), el nuevo interfaz gráfico Zenmap (para win, lin, mac..), la posibilidad de añadir cabeceras TCP e IP al escaneo y otras herramientas de utilidad, como Ndiff que muestra diferencias entre dos archivos de salida de Nmap.

Una de estas nuevas funcionalidades me sorprendió bastante y es el nuevo "--reason", que permite conocer cuál es el motivo de identificar un servicio como abierto, cerrado o filtrado- Realmente útil para entender y explicar el funcionamiento de una herramienta de este tipo.


Por último, como novedad destacable, menciona NSE, lenguaje de script con el que se permite identificar servicios mediante el envió de paquetes con datos concretos. Pero sobre este tema ya hablaremos otro día.

Finalmente el comando mágico para escanear el puerto 80 de 4096 direcciones IP en menos de un minuto, es el siguiente:

nmap -T4 --max_rtt_timeout 200 --initial_rtt_timeout 150 --min_hostgroup 512 --max_retries 0 -n -P0 -p80 -oG salida.gnmap X.X.X.X/20

Así que ya sabéis amigos, no busquéis Tomcats vulnerables, que esta semana tienen premio :-))