Cuando hablamos de NMAP lo primero que se nos viene a la cabeza es análisis de puertos. Si bien es cierto que NMAP es la herramienta más potente y efectiva para esta tarea, NMAP nos brinda un conjunto de oportunidades ilimitadas que hace de esta herramienta el que posiblemente sea, junto con MetaSploit, el mejor framework de aplicaciones para los “hackers” y “pentesters”.
Adicionalmente a su principal funcionabilidad para análisis de puertos y servicios, contamos con un conjunto de cientos de scripts creados por una gran comunidad programados en LUA. En este artículo vamos a ver cómo sacar un alto rendimiento de estos scripts de NMAP (NSE), para adaptarlo a nuestras necesidades y no limitarnos a la visión de cada programador de los scripts.
Para este artículo usaremos un script básico pero muy interesante, en este caso dns-brute, quien nos va a permitir realizar una función fundamental en nuestros pentesting, obtener los subdominios de un dominio. Esto es un básico de cualquier caja negra, ya que en muchas ocasiones lograremos acceder mediante fallos o vulnerabilidades de uno de estos subdominios que suelen estar menos atendidos.
El comando que usaremos es el siguiente:
nmap –script dns-brute microsoft.com
El resultado obtenido lo pasamos a un archivo de texto para ver los registros detectados:
Para ver el número de registros DNS, eliminamos las cabeceras y dejamos un registro por línea para ver con el comando wc el total de registros detectados.
Un total de 58 registros, lo que no está mal pero muy limitado para una empresa de la envergadura de Microsoft, por lo que sabemos que el diccionario usado por este script por defecto estaría muy limitado. Es por esto que es preciso mejorarlo o en este caso hacer uso de sus propiedades.
Ahora vamos a lanzar un diccionario propio creado para la ocasión, esto es lo que marcará la diferencia en los resultados. He creado un diccionario de subdominios habituales llamado subdominios que coloco en la ruta de diccionarios por defecto de la Kali Linux. Para ello me valgo de los argumentos de NMAP y lanzo el siguiente comando:
nmap –script dns-brute –script-args dns-brute.hostlist=/usr/share/wordlists/subdominios microsoft.com
El resultado por lo general es rápido. Todo dependerá del número de palabras en el diccionario y la conexión, pero con una conexión 3G y un diccionario de cerca de 2500 palabras, el tiempo ha sido de 1 minuto aproximadamente.
Afinar con mejores resultados dependerá de que vayamos mejorando y ampliando nuestro diccionario en base a la experiencia. En este caso los nombres de posibles subdominios están realizado en inglés y castellano, pero se pueden añadir en diferentes idiomas según las necesidades y en caso de empresas internacionales como la usada para este artículo ampliaremos enormemente los resultados.
El resultado parece mucho más amplio que el obtenido por el script por defecto, pero desconozco el número de registros encontrados y el orden del resultado me complica el análisis del resultado para continuar trabajando con el resultado. La forma de solucionarlo es crear mi propio script de bash que me depure el resultado, me lo ordene en base a mis necesidades y me informe del número de registros detectados.
La programación no es ni mucho menos mi especialidad, por lo que el script será fácilmente mejorable, pero para el ejemplo lo importante es que de resultado. Este sería mi script propuesto:
Se que no es la mejor forma de trabajar, pero haré uso de archivos de texto de forma que se me almacene un archivo con el nombre del dominio para posibles usos futuros y mantener un registro de mi actividad.
Damos permisos de ejecución al script de bash y pasamos a lanzarlo para comparar resultados con el mismo dominio y así poder realizar una comparativa apropiada.
Tras poco más de un minuto de espera, nos encontramos con un resultado muy superior a la inicial, concretamente un total de 415 registros encontrados. Este resultado, en caso de ser para un cliente, es fundamental para evitar dejarnos subdominios fuera de la auditoría.
El resultado comparativamente es muy superior al usado con el script por defecto de NMAP. Se observa que muestra Ips en versión 4, y escasas en Ipv6. Otra de las grandes ventajas es que, al crear un archivo en local con los resultados, podremos tratarlo a nuestro gusto tras realizar la prueba. Por ejemplo, vamos a mostrar tan sólo las direcciones IP ordenadas y sin repetirse, para ello ejecutamos el siguiente comando:
cat microsoft.com.txt | sed ‘s/s+/_/g’ | cut -d ‘_’ -f 2 | sort | uniq
En la imagen anterior se ve un extracto del resultado con un resultado muy esperanzador, no sólo obtenemos mayor número de registros DNS, sino que además vamos a encontrar pulls de Ips sobre los que poder trabajar posteriormente. En este caso existen varios pulls y es lógico, Microsoft cuenta con multitud de direcciones IP públicas y no todas están expuestas en registros DNS. Es obvio que el pull 20,190,137.X pertenece a Microsoft al completo.
Para verificarlo usamos una IP del rango mencionado, del que no hemos obtenido su correspondiente registro DNS y hacemos un whois, verificando que pertenece al mismo cliente:
Con estas nuevas direcciones IP, podremos seguir usando NMAP con los puertos habituales para descubrir nuevos registros DNS que podremos ir agregando a nuestro diccionario para ir perfeccionándolo.
Para esta tarea podemos por ejemplo usar los puertos web 80 y 443 con NMAP con el siguiente comando:
nmap -p80,443 20.190.137.0/24
Obtendremos resultados como este:
Si accedemos a la web por el puerto SSL mediante la URL https://20.190.137.99 veremos que logramos obtener multitud de nuevos dominios del cliente para continuar con nuestro trabajo. Este es un fallo habitual de las empresas, donde por ahorrar poco dinero usan un certificado digital para multitud de dominios:
Ahora tenemos multitud de nuevos dominios del cliente con los que seguir trabajando para disponer de una fase de footprinting lo más amplia y completa posible, si os fijáis esta tarea sería interminable con la empresa seleccionada. Por continuar un poco más, ahora agregaría los subdominios que se muestra en el pantallazo anterior a mi diccionario, ya que es muy habitual en un mismo cliente que estos se repitan.
Lanzo de nuevo el script y veo que ahora son 424 registros, 9 más que antes gracias a la propia información proporcionada por el cliente.
Si en vez de lanzar un diccionario genérico, usamos uno mejorado a lo largo del tiempo y en base a la experiencia de clientes, podremos aumentar enormemente el resultado. Al usar uno que uso habitualmente el resultado asciende a casi 900 registros.
Lo correcto ahora sería ir agregando los resultados positivos al diccionario de uso frecuente e ir ampliándolo y adaptándolo a nuestro cliente.
Rara vez trabajaremos con clientes con el número de Ips públicas que posee un gigante como Microsoft y cuando es así, suelen solicitar auditar una parte muy concreta de su infraestructura. Un footprinting de Microsoft podría durar perfectamente 1 mes de trabajo para realizarlo correctamente, por lo que aquí paro el asedio a Bill.
El objetivo de este artículo no es llegar hasta el final de las posibilidades de este script, ni hacer un footprinting completo de ninguna empresa, es dar una visión de las capacidades de adaptación que cada script de NMAP o NSE proporciona al auditor para facilitar su trabajo, y creo que como introducción es suficiente. Ahora es función de cada uno ver que scripts suele usar y ver las posibilidades de mejora que cada uno de ellos le puede ofrecer.
Este mismo ejemplo, siendo muy simple, se puede replicar en decenas de scripts de NMAP que se valen de diccionarios, como puedan ser los de enumeración de usuarios, fuzzers, etc.