Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Explorando el módulo de scripts de Nmap

Fecha de publicación 20/02/2025
Autor
INCIBE (INCIBE)
Mirada fija entre código binario de 0 y 1.

Una de las innovaciones más significativas en Nmap es el Nmap Scripting Engine (NSE), un componente que permite a los usuarios ejecutar scripts para realizar tareas mucho más complejas y detalladas que un simple escaneo de red. NSE extiende sus funcionalidades para incluir auditorías de vulnerabilidades, detección de malware y pruebas de penetración personalizadas. Esta herramienta, escrita en el lenguaje de scripting Lua, permite que los usuarios agreguen funcionalidades adicionales a sus escaneos, automatizando gran parte del trabajo necesario para identificar y abordar amenazas de seguridad.

Categorías de scripts en Nmap

Los scripts NSE se agrupan en categorías fijas que reflejan su propósito. Cada categoría es asignada por los desarrolladores según el enfoque del script:

  • Auth: enfocados en manejar credenciales y autenticación, estos scripts evalúan la seguridad de servicios, como FTP, SSH o HTTP, probando combinaciones de usuario y contraseña. Resultan especialmente útiles en auditorías para verificar la robustez de las políticas de autenticación.

  • Broadcast: utilizan consultas de difusión para descubrir hosts y servicios en una red local sin requerir IPs específicas. Son efectivos en la detección masiva de dispositivos y servicios en entornos corporativos.

  • Brute o fuerza bruta: ejecutan ataques de fuerza bruta para probar credenciales mediante listas predefinidas. Su función principal es identificar cuentas con contraseñas débiles, siendo esenciales en pruebas de penetración, aunque requieren precaución y autorización.

  • Default: considerados seguros y útiles para la mayoría de los escaneos, ofrecen información adicional sobre los servicios detectados sin acciones intrusivas. Se ejecutan automáticamente con la opción -sC de Nmap.

  • Discovery o descubrimiento: se utilizan para recopilar información adicional sobre el objetivo, como enumerar servicios, usuarios o recursos compartidos, facilitando un reconocimiento más profundo de la red.

  • Dos: realizan pruebas para simular ataques de denegación de servicio, agotando recursos o explotando vulnerabilidades. Son útiles para probar la robustez del sistema frente a ataques, pero deben usarse con extrema precaución.

  • Exploit: aprovechan vulnerabilidades conocidas en sistemas o aplicaciones para verificar si estas pueden ser explotadas. Son utilizados en pruebas de penetración, siempre en entornos controlados y con permiso, ya que pueden comprometer la seguridad del sistema.

  • External: interactúan con bases de datos y servicios públicos externos al sistema objetivo, como consultas WHOIS o geolocalización, para obtener información adicional sin afectar directamente los servicios del objetivo.

  • Fuzzer: envían datos aleatorios o malformados a los servicios para detectar fallos o vulnerabilidades en su implementación. Aunque efectivos en la detección de errores, su uso puede causar inestabilidad, por lo que deben ejecutarse con precaución.

  • Intrusive: realizan acciones agresivas que podrían afectar la estabilidad del sistema o ser detectadas como maliciosas por sistemas de seguridad. Es crucial tener autorización antes de utilizarlos, ya que pueden interrumpir servicios.

  • Malware: diseñados para detectar la presencia de malware o comportamientos asociados con software malicioso. Estos scripts ayudan a identificar infecciones activas o compromisos en auditorías de seguridad.

  • Safe: considerados no intrusivos y seguros, recopilan información básica sin alterar el sistema ni generar alertas en los sistemas de seguridad, siendo ideales para los escaneos iniciales.

  • Version: mejoran la detección de versiones de servicios mediante consultas específicas, ayudando a identificar con precisión el software en ejecución, lo cual es clave para encontrar vulnerabilidades relacionadas con versiones específicas.

  • Vuln: verifican si los servicios del objetivo están expuestos a vulnerabilidades conocidas y documentadas, como Heartbleed o Shellshock, siendo fundamentales en auditorías de seguridad para detectar riesgos.

Las categorías de scripts NSE no son exclusivas: esto significa que un script puede pertenecer a varias categorías al mismo tiempo. Los desarrolladores de Nmap pueden asignar múltiples etiquetas a un script para indicar que tiene varios propósitos. Es posible obtener todos los scripts que pertenecen a una categoría utilizando el comando help. Por ejemplo, para visualizar todos los de la categoría Discovery:

nmap --script-help "category:discovery"

 

Creación de scripts personalizados

Para desarrollar scripts, es fundamental conocer la estructura básica y las librerías disponibles para aprovechar todo el potencial de NSE. Estos elementos organizan el script y permiten a Nmap ejecutarlo de manera eficiente.

El script comienza con una descripción (description) que explica su propósito y lo que pretende lograr. Este campo es importante para que los usuarios comprendan rápidamente la función del script. Inmediatamente después, el campo autor (author) indica quién creó el script, proporcionando una referencia clara de su origen. Además, se especifica la licencia (license) bajo la cual se distribuye, que generalmente es la misma licencia que Nmap, garantizando la consistencia legal.

Como hemos visto, cada script también se clasifica en una o más categorías (categories). Además, los scripts importan librerías esenciales para su funcionamiento usando el comando require, que permite usar dependencias específicas de Nmap y Lua, como http, nmap o shortport.

La regla de ejecución es clave para definir cuándo se ejecuta el script. Dependiendo del objetivo, puede ser una regla basada en puertos (portrule), que especifica si se debe ejecutar en un puerto específico, o en hosts (hostrule), para ejecutarse en base a las características del host.

La función principal del script se define en la sección action. Esta es la parte más importante del script, donde se desarrolla la lógica que realiza las acciones principales, como enviar una solicitud HTTP, realizar un escaneo o analizar la respuesta del sistema.

En algunos casos, los scripts pueden aceptar argumentos adicionales que permiten a los usuarios personalizar su comportamiento al momento de la ejecución. Estos argumentos se especifican en el script y se pasan a través de la opción --script-args cuando se ejecuta Nmap.

A continuación, se muestra un ejemplo de script personalizado para verificar si el método HTTP TRACE está habilitado en un servidor web, esto es importante desde una perspectiva de seguridad porque este método puede ser explotado para realizar ataques como el Cross-Site Tracing (XST), que puede comprometer la privacidad y seguridad de los usuarios.

-- Descripción: Explica qué hace el script.

description = [[

  Verifica si el método HTTP TRACE está habilitado en un servidor web. 

  El usuario puede especificar una ruta personalizada para probar.

]]

 

-- Autor: Nombre del creador del script.

author = "Tu Nombre <tu.email@example.com>"

 

-- Licencia: Define bajo qué licencia se distribuye el script.

license = "Same as Nmap--See https://nmap.org/book/man-legal.html"

 

-- Categorías: Clasificación del script en una o más categorías.

categories = {"default", "discovery", "safe"}

 

-- Librerías esenciales: Importa las funciones necesarias para el script.

local http = require "http"

local shortport = require "shortport"

 

-- Argumento adicional: Permite que el usuario especifique la URL.

local url = nmap.registry.args["http-trace.url"] or "/"

 

-- Regla de ejecución (portrule): Define cuándo se ejecuta el script, en este caso en puertos HTTP.

portrule = shortport.http

 

-- Función principal: Lógica del script. Verifica si el método TRACE está habilitado.

action = function(host, port)

  -- Enviar solicitud HTTP a la URL especificada o a la raíz si no se da una.

  local response = http.get(host, port, url)

 

  -- Verificar si la respuesta es válida.

  if response and response.status == 200 then

    -- Revisar si el encabezado "Allow" incluye TRACE.

    if response.header["Allow"] and response.header["Allow"]:find("TRACE") then

      return "HTTP TRACE está habilitado en " .. url

    else

      return "HTTP TRACE no está habilitado en " .. url

    end

  else

    return "No se pudo obtener una respuesta del servidor para la URL: " .. url

  end

end 

 

Para escanear un dominio www.ejemplo.com y verificar si el método HTTP TRACE está habilitado en la ruta /login, el comando sería:

nmap --script http-trace.nse --script-args http-trace.url="/login" -p 80,443 www.ejemplo.com

Para que Nmap reconozca tus scripts personalizados, es necesario colocarlos en el directorio de scripts de Nmap. Este directorio varía dependiendo del sistema operativo que utilices. Por ejemplo, en Linux por defecto es /usr/share/nmap/scripts/.

En la siguiente imagen se puede visualizar el flujo de trabajo de un script.

Flujo de ejecución de un script

-Flujo de ejecución de un script-

Mejores prácticas y consideraciones de seguridad

Es importante implementar medidas que aseguren la seguridad y eficiencia del script, especialmente cuando se trata de tareas intrusivas, control de parámetros y manejo de credenciales.

  • Scripts intrusivos y control de parámetros: los scripts que pueden afectar significativamente el sistema, como ataques de fuerza bruta o pruebas DoS, deben clasificarse como intrusive para advertir a los usuarios sobre su impacto. También es esencial limitar la cantidad de intentos de autenticación o ajustar el tiempo entre solicitudes para evitar la sobrecarga del sistema o el uso indebido del script. Permitir al usuario controlar estos parámetros añade flexibilidad y seguridad en su ejecución.

  • Uso de variables de entorno o ficheros para credenciales: en lugar de codificar credenciales directamente en el script, es mejor utilizar variables de entorno o leer las credenciales desde un fichero externo. Esto evita exponer información sensible en el código fuente y reduce el riesgo de fugas o accesos no autorizados. Lua permite acceder a variables de entorno con os.getenv() o leer ficheros de manera segura para recuperar la información necesaria, sin tener que almacenarla en el script.

  • Manejo adecuado de errores y excepciones: implementar un manejo adecuado de los errores y excepciones es fundamental para evitar fallos inesperados y garantizar que el script funcione correctamente. Proporcionar mensajes claros cuando algo falla también mejora la experiencia del usuario.

  • Limpieza y gestión de recursos: asegúrate de que todos los recursos utilizados por el script, como conexiones de red o archivos temporales, se liberen correctamente al finalizar la ejecución. Esto previene problemas de rendimiento y estabilidad en el sistema. Para asegurarte de que siempre se liberen los recursos, incluso si ocurre un error durante la ejecución del script, puedes usar un bloque de protección con pcall (protected call). Esto garantiza que las operaciones de limpieza, como cerrar ficheros o sockets, se ejecuten, aunque ocurra un error.

Conclusión

Gracias a NSE, es posible identificar vulnerabilidades de manera más eficiente y fortalecer la seguridad de redes y sistemas. Sin embargo, es importante interpretar los resultados de los scripts con precaución, ya que en ocasiones pueden generar falsos positivos. Por esta razón, es recomendable complementar el uso de Nmap con otras herramientas y realizar análisis manuales para obtener una visión completa de la situación.

Por otra parte, es crucial utilizar Nmap y NSE dentro de los límites legales y éticos. Escanear redes sin el consentimiento adecuado puede tener graves repercusiones legales. Por ello, siempre es necesario contar con la autorización para realizar auditorías o pruebas de penetración en redes y sistemas.