Cargando...
Cargando...
Duración: 2 horas (Estimada)
¡Bienvenidos al octavo episodio de nuestro curso completo de Nmap! En este módulo, exploraremos el Nmap Scripting Engine (NSE), el potente framework que transforma a Nmap de un simple escáner de puertos a una plataforma integral de investigación de redes.
Un detective es tan bueno como sus herramientas. Pero, ¿y si pudieras personalizar esas herramientas para cualquier situación, creando exactamente lo que necesitás para cada caso único? Ese es el poder del Nmap Scripting Engine. Nos permite extender las capacidades de Nmap mucho más allá del escaneo básico, habilitando la detección automatizada de vulnerabilidades, la enumeración de servicios y el reconocimiento personalizado.
Al finalizar este módulo, vamos a poder usar scripts preexistentes, seleccionar los scripts adecuados para diferentes escenarios e incluso escribir nuestros propios scripts personalizados para automatizar tareas complejas y extraer exactamente la información que necesitamos de los sistemas objetivo.
El Nmap Scripting Engine es un potente framework que permite extender Nmap con funcionalidades personalizadas escritas en el lenguaje de programación Lua. Fue introducido en 2007 y desde entonces se ha convertido en una de las características más valiosas de Nmap.
Esta extensibilidad hace que Nmap sea mucho más que un simple escáner de puertos: se convierte en una plataforma integral de investigación de redes que podemos personalizar para tareas y entornos específicos.
Los scripts NSE se organizan en categorías según su propósito y comportamiento:
Estos scripts no afectarán al objetivo y se centran únicamente en la recopilación de información. Ideales para reconocimientos de rutina.
nmap --script banner 192.168.1.1Estos scripts pueden afectar al objetivo mediante sondeos activos. Usalos con precaución, especialmente en entornos de producción.
nmap --script brute 192.168.1.1Estos scripts buscan vulnerabilidades específicas. Esenciales para evaluaciones de seguridad.
nmap --script ssl-heartbleed 192.168.1.1Estos scripts intentan explotar vulnerabilidades. Usalos solo en pruebas de penetración autorizadas.
nmap --script smb-vuln-ms17-010 192.168.1.1Estos scripts manejan credenciales de autenticación, identificando contraseñas débiles o por defecto.
nmap --script http-default-accounts 192.168.1.1Estos scripts descubren información de la red, ayudando a mapear redes e identificar relaciones entre hosts.
nmap --script hostmap-* 192.168.1.1Estos scripts extienden la detección de servicios y versiones, proporcionando información más detallada.
nmap -sV --script=version 192.168.1.1Comprender estas categorías nos ayuda a seleccionar los scripts apropiados para diferentes escenarios y requisitos de seguridad.
Los scripts NSE se ejecutan en fases específicas del proceso de escaneo de Nmap:
Se ejecutan antes de que comience cualquier escaneo. Pueden generar o modificar objetivos.
nmap --script targets-xml -iL targets.xmlSe ejecutan después del descubrimiento de hosts, para cada host activo. Realizan acciones específicas del host.
nmap --script os-detection 192.168.1.1Se ejecutan después del escaneo de puertos, para puertos abiertos específicos. Apuntan a servicios específicos.
nmap --script http-enum 192.168.1.1 -p 80Se ejecutan después de que todo el escaneo ha finalizado. Analizan e informan sobre los resultados agregados.
nmap --script summary 192.168.1.0/24Esta ejecución por fases permite que los scripts generen objetivos, realicen acciones específicas del host, se ejecuten contra servicios relevantes y analicen resultados. Entender estas fases nos ayuda a predecir el comportamiento de los scripts y optimizar los flujos de trabajo de escaneo.
Empecemos con el uso básico de scripts:
nmap --script banner 192.168.1.1Esto ejecuta el script `banner` para obtener los banners de servicio de todos los puertos abiertos.
Starting Nmap 7.94 ( https://nmap.org ) at 2025-04-14 20:00 EDT Nmap scan report for 192.168.1.1 Host is up (0.0023s latency). Not shown: 995 closed tcp ports (reset) PORT STATE SERVICE 22/tcp open ssh | banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5 53/tcp open domain 80/tcp open http | banner: HTTP/1.1 200 OK\x0D\x0ADate: Mon, 14 Apr 2025 20:00:15 GMT\x0D |_\x0AServer: Apache/2.4.41 (Ubuntu)\x0D\x0AContent-Type: text/html\x0D\x0A 443/tcp open https 8443/tcp open https-alt Nmap done: 1 IP address (1 host up) scanned in 1.31 seconds
nmap --script=http-title,http-headers 192.168.1.1 -p 80Esto ejecuta los scripts `http-title` y `http-headers` contra el puerto 80.
Starting Nmap 7.94 ( https://nmap.org ) at 2025-04-14 20:05 EDT Nmap scan report for 192.168.1.1 Host is up (0.0023s latency). PORT STATE SERVICE 80/tcp open http | http-headers: | Date: Mon, 14 Apr 2025 20:05:15 GMT | Server: Apache/2.4.41 (Ubuntu) | Content-Type: text/html; charset=UTF-8 | |_ (Request type: GET) |_http-title: Example Domain Nmap done: 1 IP address (1 host up) scanned in 0.45 seconds
Podemos ejecutar categorías enteras de scripts:
# Ejecutar todos los scripts seguros (safe)
nmap --script safe 192.168.1.1
# Ejecutar todos los scripts HTTP
nmap --script http-* 192.168.1.1 -p 80
# Ejecutar todos los scripts de detección de vulnerabilidades (vuln)
nmap --script vuln 192.168.1.1Podemos usar comodines para seleccionar scripts:
# Todos los scripts que empiezan con "ssl-"
nmap --script "ssl-*" 192.168.1.1 -p 443
# Todos los scripts con "enum" en el nombre
nmap --script "*enum*" 192.168.1.1Los scripts funcionan bien con otras opciones de Nmap:
# Escaneo completo con scripts
nmap -sV -O --script default 192.168.1.1
# Apuntar a puertos específicos con scripts
nmap -p 80,443 --script http-* 192.168.1.1Muchos scripts aceptan argumentos para personalizar su comportamiento:
nmap --script http-brute --script-args userdb=usuarios.txt,passdb=contraseñas.txt 192.168.1.1Esto pasa archivos personalizados de nombres de usuario y contraseñas al script `http-brute`.
nmap --script http-enum --script-args http-enum.category="default,safe" 192.168.1.1Esto especifica qué categorías de rutas verificar con `http-enum`.
# Argumento global (aplica a todos los scripts)
nmap --script "http-*" --script-args useragent="Mozilla/5.0" 192.168.1.1
# Argumento específico de script
nmap --script http-enum --script-args http-enum.maxpagecount=500 192.168.1.1Para descubrir qué argumentos acepta un script:
nmap --script-help http-enumhttp-enum Categories: discovery intrusive https://nmap.org/nsedoc/scripts/http-enum.html Enumera directorios usados por aplicaciones web y servidores populares. Esto parsea un archivo de huellas digitales (fingerprint) similar en formato al escáner de aplicaciones web Nikto. Este script, sin embargo, va un paso más allá incorporando coincidencias de patrones avanzadas y teniendo la habilidad de identificar versiones específicas de aplicaciones web. Argumentos del Script (Script Arguments) http-enum.basepath Ruta base para anteponer a todas las solicitudes. Por defecto: / http-enum.displayall Mostrar todos los códigos de estado, no solo 200 OK y 401 Authentication Required http-enum.fingerprintfile Especificar un archivo diferente conteniendo datos de huellas digitales http-enum.category Establecer la categoría de huellas digitales a usar (por defecto: safe,intrusive) ...
Exploremos algunos de los scripts NSE más útiles para diferentes tareas:
# Información del servidor HTTP nmap --script http-enum,http-headers,http-methods 192.168.1.1 -p 80 # Enumeración SMB nmap --script smb-enum-shares,smb-enum-users 192.168.1.1 -p 445 # Información SSH nmap --script ssh2-enum-algos 192.168.1.1 -p 22 # Enumeración de bases de datos nmap --script mysql-info,mysql-databases 192.168.1.1 -p 3306
# Escaneo general de vulnerabilidades nmap --script vuln 192.168.1.1 # Vulnerabilidades de aplicaciones web nmap --script http-vuln* 192.168.1.1 -p 80,443 # Vulnerabilidades SSL/TLS nmap --script ssl-* 192.168.1.1 -p 443 # Vulnerabilidades SMB nmap --script smb-vuln* 192.168.1.1 -p 445
# Chequeo de credenciales por defecto nmap --script http-default-accounts 192.168.1.1 -p 80 # Fuerza bruta SSH nmap --script ssh-brute --script-args userdb=usuarios.txt,passdb=contraseñas.txt 192.168.1.1 -p 22 # Fuerza bruta formularios HTTP nmap --script http-form-brute --script-args http-form-brute.path=/login.php 192.168.1.1 -p 80
# Información DNS nmap --script dns-* 192.168.1.1 -p 53 # Información WHOIS nmap --script whois-* philocyber.com # Información de certificado SSL nmap --script ssl-cert 192.168.1.1 -p 443
Una de las características más poderosas de NSE es la capacidad de crear nuestros propios scripts:
description = [[
Este es un script de ejemplo simple que imprime "¡Hola, Mundo!" para cada puerto abierto.
]]
-- La regla que determina cuándo debe ejecutarse este script
portrule = function(host, port)
return port.state == "open"
end
-- La acción que se realiza cuando la regla devuelve true
action = function(host, port)
return "¡Hola, Mundo! El puerto " .. port.number .. " está abierto."
endGuardá esto como `hola-mundo.nse` en el directorio de scripts de Nmap (usualmente `/usr/share/nmap/scripts/` o similar).
# Ejecutar el script
nmap --script hola-mundo 192.168.1.1NSE proporciona librerías para tareas comunes:
description = [[
Script de ejemplo que usa la librería HTTP para obtener el título de una página web.
]]
-- Cargamos la librería HTTP
local http = require "http"
local shortport = require "shortport"
-- Ejecutar contra puertos HTTP
portrule = shortport.http
-- La acción
action = function(host, port)
-- Hacemos una solicitud HTTP
local response = http.get(host, port, "/")
-- Extraemos el título
local title = response.body:match("<title>(.-)</title>")
if title then
return "Título de la página: " .. title
else
return "No se encontró título"
end
endExplorá diferentes categorías de scripts:
# Listar todos los scripts disponibles (la ruta puede variar) ls /usr/share/nmap/scripts/ # Encontrar scripts relacionados con HTTP ls /usr/share/nmap/scripts/http* # Obtener ayuda para un script específico nmap --script-help http-enum
Probá corriendo diferentes categorías de scripts contra un objetivo:
# Scripts seguros (safe) nmap --script safe 192.168.1.1 # Scripts de descubrimiento (discovery) nmap --script discovery 192.168.1.1 # Scripts por defecto (default) (igual que -sC) nmap --script default 192.168.1.1
Usá NSE para recopilar información detallada sobre servicios:
# Enumeración de servidor web nmap --script "http-enum,http-headers,http-methods,http-title" 192.168.1.1 -p 80,443 # Enumeración de bases de datos nmap --script "mysql-*" 192.168.1.1 -p 3306
Compará los resultados con un escaneo básico:
nmap -sV 192.168.1.1 -p 80,443,3306 -oN basico.txt nmap -sV --script "http-*,mysql-*" 192.168.1.1 -p 80,443,3306 -oN con_scripts.txt # Compará los archivos (por ejemplo, usando diff) diff basico.txt con_scripts.txt
Creá una tabla documentando qué información adicional proporcionaron los scripts.
Usá NSE para un escaneo básico de vulnerabilidades:
# Escaneo general de vulnerabilidades nmap --script vuln 192.168.1.1 -oN escaneo_vuln.txt # Escaneo de vulnerabilidades dirigido nmap --script "ssl-heartbleed,ssl-poodle,http-shellshock" 192.168.1.1 -p 80,443 -oN escaneo_vuln_dirigido.txt
Analizá los resultados:
Creá un script personalizado simple:
description = [[
Imprime un mensaje personalizado basado en el número de puerto.
]]
portrule = function(host, port)
return port.state == "open"
end
action = function(host, port)
local messages = {
[22] = "¡Servidor SSH encontrado!",
[80] = "¡Servidor Web encontrado!",
[443] = "¡Servidor web seguro encontrado!",
[3306] = "¡Base de datos MySQL encontrada!"
}
local message = messages[port.number]
if message then
return message
else
return "Puerto " .. port.number .. " está abierto."
end
endnmap --script mensaje-puerto.nse 192.168.1.1Los scripts no se ejecutan o producen errores.
Solución:
# Verificar si el script existe (ajustar ruta si es necesario) ls /usr/share/nmap/scripts/script-faltante.nse # Actualizar la base de datos de scripts sudo nmap --script-updatedb # Ejecutar con depuración (debugging) nmap -d --script http-enum 192.168.1.1
La ejecución de scripts es demasiado lenta.
Solución:
# Limitar a puertos específicos nmap --script http-enum -p 80,8080,8000 192.168.1.1 # Limitar el tiempo de espera del script nmap --script http-enum --script-timeout 30s 192.168.1.1 # Ejecutar scripts solo contra servicios relevantes nmap -sV --version-intensity 2 --script "http-*" 192.168.1.1
Los scripts reportan vulnerabilidades incorrectamente.
Solución:
# Aumentar la verbosidad del script nmap -v --script vuln 192.168.1.1 # Verificar manualmente los hallazgos (ej., Heartbleed) openssl s_client -connect 192.168.1.1:443 -tlsextdebug
Los scripts requieren dependencias externas.
Solución:
# Para Debian/Ubuntu (librerías Lua) sudo apt install lua-ldap lua-json lua-socket # Para scripts que requieren capacidades de fuerza bruta # (A menudo incluidas en el paquete nmap, verificar instalación)
Un equipo de seguridad usó NSE para evaluar aplicaciones web:
nmap -sV --script "http-..." 10.0.0.0/24 ...nmap --script "http-vuln*" ... 10.0.0.5 ...nmap --script http-default-accounts 10.0.0.5 ...Identificado: CMS desactualizado, credenciales por defecto, inyección SQL.
Durante una auditoría de seguridad, se usaron scripts NSE para:
nmap --script "ssl-enum-ciphers" ...nmap --script "smb-vuln*,rdp-vuln*,..." ...nmap --script "ftp-anon,smtp-enum-users,..." ...Revelado: SSL/TLS débiles, sistemas sin parches, fugas de información.
En el próximo episodio, exploraremos:
El recurso principal para entender NSE.
Navegá por todos los scripts NSE oficiales disponibles.
Documentación detallada para las librerías NSE.
Aprendé el lenguaje Lua usado en los scripts NSE.
Tutorial sobre cómo crear tus propios scripts NSE.
Nota: Usá este video como guía visual para complementar el material escrito.
Test your understanding with these questions
1. En el contexto del Nmap Scripting Engine (NSE), ¿qué lenguaje de programación se usa principalmente para escribir scripts?
2. Si queremos ejecutar scripts NSE diseñados para recopilar información sobre un objetivo sin intentar activamente explotar vulnerabilidades o causar daño, ¿en qué categoría de scripts deberíamos centrarnos principalmente?
3. ¿En qué fase del proceso de escaneo de Nmap se ejecutan típicamente los scripts NSE de tipo "portrule"?
4. ¿Cuál es el propósito de usar la opción `--script-args` al ejecutar scripts NSE con Nmap?
5. En la estructura básica de un script NSE personalizado, ¿qué función es responsable de definir la condición bajo la cual se ejecutará la acción del script (por ejemplo, verificar si un puerto está abierto)?