Scripting en Nmap, con NSE (Nmap Script Engine)


"Toda la información proporcionada es con fines educativos. En ningún caso nos hacemos responsable del mal uso de la información. Toda la información es para el desarrollo de la Hacker Defensa entre los usuarios además de ayudar a prevenir los ataques malintencionados. GSICR insiste en que esta información NO debe ser utilizada para causar ningún tipo de daño, directa o indirectamente"

Nmap (Network Mapper) es una herramienta multiplataforma utilizada por administradores de sistemas y pentesters para  escanear redes y poder determinar que puertos o servicios están activos en nuestra red y cuales posibles vulnerabilidades se podrían explotar, su principal función es la de escaneo de puertos no la de escaneo de vulnerabilidades, a pesar de esto es una útil herramienta para determinar si un servicio se esta ejecutando o si la versión de un servicio ha cambiado, es muy bueno identificando versiones de aplicaciones y sistemas operativos mediante el análisis de huellas de protocolos y aplicaciones. Su diseño fue orientado a la linea de comandos, pero en la actualidad existen versiones gráficas tales como Zenmap o Umit Network Scanner. Si queremos aprovechar al máximo todas sus funcionalidades debemos entonces preferir la linea de comandos y utilizar su poderoso motor de "scripts" --NSE-- . Por este motivo se puede incluir fácilmente en lenguajes de scripting, como BASH (Bourne again shell), o en lenguajes de procesamientos de textos, como Perl, sed o awk. El NSE posee ciertas ventajas sobre BASH o los lenguajes mencionados anteriormente, entre ellas podemos citar:
  • Sensible a las fases. Nmap organiza los procesos de escaneo en fases. NSE sabe en que fase se encuenntra el escaneo, lo que permite al programador evitar recursividades complejas o algoritmos if-then para determinar el estado en que se encuentra el escaneo.
  • Lenguajes comunes para que sea portable. Mediante el uso de un lenguaje común (NSE) se posibilita la exportación de los scripts a sistemas Nmap de otras plataformas. Un script hecho en BASH se puede exportar a otro Linux, pero no se podría ejecutar en un sistema Windows o Mac.
  • Distribución basada en la comunidad. Se usa un lenguaje común para lograr un estándar común y un sistema de distribución de scripts, ya sea con Nmap o de manera independiente.
El lenguaje de scripting de Nmap utiliza el lenguaje de programación Lua. Se trata de un lenguaje interpretado "potente, rápido y ligero", conocido sobre todo por que se usa en el popular juego WoW (World of Warcraft); sin embargo, Lua también se usa en Adobe Lightroom y en otras muchas herramientas. Existe una extensa colección de scripts disponibles. Algunos de estos scripts se incluyen en la distribución de Nmap. Mediante el comando ls (en linux) se puede obtener un listado de los scripts NSE instalados localmente. 

Ejemplo 1. Listado de scripts.

Comprender los Scripts de NMAP
Nmap organiza el proceso de escaneo en cinco fases.

Fases de escaneo.
  • Pre-rules – Los scripts pre-rules se ejecutan antes de que nmap haga cualquier tipo de escaneo en la red. Estos scripts suelen llevar a cabo tareas de limpieza, como por ejemplo crear tablas, determinar el entorno, o incluso generar la lista de direcciones que se escaneará con Nmap.
  • Host scripts – Los scripts de host se ejecutan contra cada host especificado a Nmap una vez completado el escaneo correspondiente a dicho host. Un buen ejemplo de script de este fase es aquel que determina las direcciones MAC de los hosts de la red local. Los scripts de host sólo se ejecutan contra hosts existentes. A estos scripts se les conoce como hostrules.
  • Service scripts – Los scripts de servicio se ejecutan justo después de los scripts de host, pero sólo si el servicio concreto se está ejecutando. Nmap incluye muchos scripts de servicio, siendo probablemente la fase que recibirá una mayor atención en cuanto a scripts soportados por la comunidad. Los scripts de servicio sólo se ejecutan con los puertos de servicio que coincidan. Se suele usar el término portrule para designar esta fase.
  • Post rule scripts – Los scripts post rule se ejecutan después del resto de fases. Estos scripts se suelen usar para tareas de limpieza, notificaciones, informes o para cualquier otra cosa que haya que hacer una vez finalizados los escaneos. 
Los scripts de NSE se dividen en las siguientes secciones:
  • Description – proporciona una descripción del script, la cual se debe incluir entre corchetes dobles después de un signo igual.
Ejemplo 2. Descripción de script.
  • Categories – define las categorías en las que se ejecutará el script. Al asociar un script con una categoría hacemos que el script se ejecute como parte del escaneo de categoría. Un script puede estar asociado a varias categorías. El formato de la sección Categories es el siguiente:

Ejemplo 3. Categorías.
La entrada anterior hace que el script se ejecute cada vez que el administrador ejecute scripts de las categorías Default o Safe.

  • Phase – identifica la fase en la que se ejecutará el script: hostrule, portrule, postrule o prerule. Nótese que los valores hostrule y portrule requieren parámetros y reciben parámetros desde el motor de scripting de Nmap. La sección Phase finaliza con el comando end de Lua (las fases están implementadas como funciones Lua).
Ejemplo 4. Código portrule.
Lo que hace básicamente es crear las variables svc.std y svc.ssl como un array asociativo (líneas 2-3) para después comprobar si el protocolo de transporte no es TCP (línea 4) o si los puertos no están ejecutando HTTP o HTTP sobre SSL (línea 5). Si alguna de estas condiciones no fuese verdadera, el script devolvería un false (línea 6) y Nmap no mostraría ningún resultado. Por otro lado, si el puerto está ejecutando TCP, la lógica continúa y el script determina si Nmap tiene acceso a la librerías cliente para SSL. En caso de no tener acceso a ellas, devolvería un false (línea 11) y no mostraría nada durante la ejecución. Si por el contrario se superan todos los test, la función devuelve true y pasa a ejecutar la lógica definida en la sección "Action".

  • Action – es el algoritmo que contiene la lógica del script para cuando se supere la lógica de la fase. La lógica utiliza variables Lua estándar, sintaxis y funciones, combinadas con las librerías incluidas con Nmap. El hecho de que las librerías de NSE estén presentes en Nmap ahorra al desarrollador el tener que lidiar con funciones como la conexión al puerto o la lectura desde un servicio de red.
Ejemplo 5. Codigo fase "Action" de un script para NSE.
El código mostrado en el Ejemplo 5., que corresponde al script de Nmap para ftp anónimo ftp-anon.nse, muestra lo fácil que es conectar con un socket, enviarle datos y comprobar el código de estado devuelto.

Uso de NSE

Muchos de los scripts de NSE básicos son miembros de la categoría Default.Para ejecutar los scripts de Default usamos la opción -sC.

 root@root:~# nmap -sC www.ejemplo.net

El parámetro -A también ejecuta los scripts de la categoría Default, añadiendo además algunas opciones extra al escaneo. Para ejecutar un script específico utilizamos el parámetro --script seguido del nombre del script. Por ejemplo, para ejecutar el script Whois incluido con NSE.

 root@root:~# nmap --script whois.nse www.ejemplo.net

NSE permite además ejecutar varios scripts separándolos con comas, o incluso categorías enteras introduciendo el nombre de la categoría. Por ejemplo:

root@root:~# nmap --script malware www.ejemplo.net

De este modo se ejecutaran todos los scripts que pertenezcan a la categoria malware en nmap.

Categorías de Scripts

La comunidad de Nmap clasifica los scripts en categorías. A la hora de buscar un script, o a la de escribir uno, es importante comprender la metodología empleada para la clasificación de éstos:

  • Auth – La categoría Auth se compone de más de 30 scripts para la comprobación de protocolos de autenticación, configuración y controles en el host objetivo. La mayoría de estos scripts tienen que ver con fuerza bruta o con vulnerabilidades, por lo que no se deben emplear contra redes en las que se haya implementado un servicio de detección de intrusiones.
  • Broadcast – La categoría Broadcast es actualmente muy pequeña, con un total de seis scripts que utilizan métodos broadcast y multicast para obtener información de la red. Entre los scripts hay identificación de clientes de dropbox, detección de servicios de host mediante servicios de DNS y multicasting para servicios web.
  • Default – La categoría Default cuenta con más de 50 scripts. El equipo de Nmap utiliza 6 criterios a la hora de colocar un script en esta categoría predeterminada: velocidad, utilidad, volumen de salida, fiabilidad, nivel de intrusión (ha de ser muy bajo), privacidad (o falta de la misma).
  • Discovery – Los scripts de detección son aquellos que se prestan a usar la
    información de red y de sistema operativo para mapear los hosts de la red.
    Existen más de 70 scripts incluidos con el motor de escaneo de Nmap.
  • DoS – En la categoría de denegación de servicio se encuentran los scripts que pueden causar fallos de servicio u otros problemas importantes. Se ha de extremar la precaución en su uso, puesto que podrían tirar servicios indispensables. Actualmente sólo se distribuyen 2 scripts de este tipo con Nmap.
  • Exploit – Los scripts de Exploit tratan de ejecutar efectivamente un exploit en función de si Nmap ha descubierto un host con una vulnerabilidad explotable. Nmap sólo incluye un exploit en su paquete.
  • External – En External se encuentran los scripts que se comunican con otros hosts distintos del host local o el host objetivo. Por ejemplo, en esta categoría se incluiría un script que actualizase automáticamente una base de datos con información heurística.
  • Fuzzer – Los scripts de la categoría Fuzzer son scripts destinados al descubrimiento de nuevas vulnerabilidades o técnicas identificativas, cuyo funcionamiento habitual consiste en enviar datos aleatorios a los servicios.
  • Intrusive – Los scripts de esta categoría pueden o bien tirar servicios y sistemas, o emplear grandes cantidades de ancho de banda para su ejecución.
  • Malware – Los scripts que hay en Malware son aquellos que han sido diseñados para detectar malware en los hosts remotos.
  • Safe – Los de la categoría Safe son scripts considerados por lo general como poco intrusivos.
  • Version – La categoría Versión pertenece a los scripts diseñados para identificar explícitamente versiones concretas de servicios.
  • Vuln – La categoría Vuln (vulnerabilidad) está dedicada a la detección (pero no explotación) de vulnerabilidades.
Conclusión
Hemos presentado NSE, el motor de scripting de Nmap. Esperamos que el contenido mostrado les aporte una buena base a la hora de determinar cuándo conviene usar scripts y cómo desenvolverse con NSE. Con un conocimiento sólido de las categorías de Nmap y los scripts en sí, así como cierto conocimiento en cuanto al motor de scripting, se le puede sacar el máximo partido a Nmap.

¡Happy Hacking!

Comentarios

Entradas populares de este blog

Netcat & Wireshark

Día Internacional de la Seguridad Informática, 30 de noviembre 2013, Nicoya