Episodio 8: Extendiendo Nuestros Poderes - Nmap Scripting Engine
Duración: 2 horas (Estimada)
Introducción
¡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.
Arquitectura y Propósito del NSE
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.
Componentes Centrales
- Un entorno de scripting flexible (Lua)
- Integración con el motor de escaneo de Nmap
- Acceso a datos de red y resultados del escaneo
- Librerías para tareas comunes de networking
- Un framework para compartir scripts desarrollados por la comunidad
Capacidades
- Detectar vulnerabilidades
- Enumerar servicios
- Realizar fuerza bruta de credenciales
- Extraer datos de aplicaciones
- Realizar descubrimiento avanzado
- Automatizar flujos de trabajo complejos
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.
Categorías y Organización de Scripts
Los scripts NSE se organizan en categorías según su propósito y comportamiento:
Scripts Seguros (`safe`)
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.1Scripts Intrusivos (`intrusive`)
Estos scripts pueden afectar al objetivo mediante sondeos activos. Usalos con precaución, especialmente en entornos de producción.
nmap --script brute 192.168.1.1Scripts de Detección de Vulnerabilidades (`vuln`)
Estos scripts buscan vulnerabilidades específicas. Esenciales para evaluaciones de seguridad.
nmap --script ssl-heartbleed 192.168.1.1Scripts de Explotación (`exploit`)
Estos scripts intentan explotar vulnerabilidades. Usalos solo en pruebas de penetración autorizadas.
nmap --script smb-vuln-ms17-010 192.168.1.1Scripts de Autenticación (`auth`)
Estos scripts manejan credenciales de autenticación, identificando contraseñas débiles o por defecto.
nmap --script http-default-accounts 192.168.1.1Scripts de Descubrimiento (`discovery`)
Estos scripts descubren información de la red, ayudando a mapear redes e identificar relaciones entre hosts.
nmap --script hostmap-* 192.168.1.1Scripts de Versión (`version`)
Estos 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.
Momentos de Ejecución de Scripts
Los scripts NSE se ejecutan en fases específicas del proceso de escaneo de Nmap:
Scripts `prerule`
Se ejecutan antes de que comience cualquier escaneo. Pueden generar o modificar objetivos.
nmap --script targets-xml -iL targets.xmlScripts `hostrule`
Se ejecutan después del descubrimiento de hosts, para cada host activo. Realizan acciones específicas del host.
nmap --script os-detection 192.168.1.1Scripts `portrule`
Se 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 80Scripts `postrule`
Se 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.
Ejecutando Scripts Básicos
Empecemos con el uso básico de scripts:
Script Único
nmap --script banner 192.168.1.1Esto ejecuta el script `banner` para obtener los banners de servicio de todos los puertos abiertos.
Mostrar Salida de Ejemplo
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
Múltiples Scripts
nmap --script=http-title,http-headers 192.168.1.1 -p 80Esto ejecuta los scripts `http-title` y `http-headers` contra el puerto 80.
Mostrar Salida de Ejemplo
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
Categorías de Scripts
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.1Selección de Scripts con Comodines
Podemos 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.1Combinando con Otras Opciones de Nmap
Los 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.1Argumentos de Scripts
Muchos scripts aceptan argumentos para personalizar su comportamiento:
Sintaxis Básica de Argumentos
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`.
Múltiples Argumentos
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`.
Argumentos Globales vs. Específicos de Script
# 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.1Encontrando Argumentos Disponibles
Para descubrir qué argumentos acepta un script:
nmap --script-help http-enumMostrar Salida de Ejemplo
http-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) ...
Scripts NSE Comunes por Tarea
Exploremos algunos de los scripts NSE más útiles para diferentes tareas:
Enumeración de Servicios
# 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 de Vulnerabilidades
# 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
Pruebas de Autenticación
# 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
Recopilación de Información
# 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
Creando Scripts NSE Personalizados
Una de las características más poderosas de NSE es la capacidad de crear nuestros propios scripts:
Estructura Básica de un Script
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).
Ejecutando Tu Script Personalizado
# Ejecutar el script
nmap --script hola-mundo 192.168.1.1Usando Librerías NSE
NSE 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
endRecursos para Desarrollo de Scripts
Ejercicios Prácticos
Ejercicio 1: Exploración Básica de Scripts
Explorá 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
Ejercicio 2: Enumeración de Servicios
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.
Ejercicio 3: Escaneo de Vulnerabilidades
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:
- ¿Qué vulnerabilidades se detectaron?
- ¿Qué información se proporciona sobre cada vulnerabilidad?
- ¿Cómo verificarías estos hallazgos?
Ejercicio 4: Creación de Script Personalizado
Creá un script personalizado simple:
- Creá un archivo llamado `mensaje-puerto.nse` con el siguiente contenido:
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 end - Ejecutá tu script:
nmap --script mensaje-puerto.nse 192.168.1.1 - Modificá el script para agregar más mensajes de puerto y probá de nuevo.
Problemas Comunes y Soluciones
Fallos en la Ejecución de Scripts
Los 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
Problemas de Rendimiento
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
Falsos Positivos
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
Dependencias Faltantes
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)
Aplicaciones en el Mundo Real
Caso de Estudio: Evaluación de Aplicaciones Web
Un equipo de seguridad usó NSE para evaluar aplicaciones web:
- Descubrimiento inicial:
nmap -sV --script "http-..." 10.0.0.0/24 ... - Escaneo de vulnerabilidades:
nmap --script "http-vuln*" ... 10.0.0.5 ... - Prueba de autenticación:
nmap --script http-default-accounts 10.0.0.5 ...
Identificado: CMS desactualizado, credenciales por defecto, inyección SQL.
Caso de Estudio: Auditoría de Seguridad de Red
Durante una auditoría de seguridad, se usaron scripts NSE para:
- Identificar cifrado débil:
nmap --script "ssl-enum-ciphers" ... - Verificar servicios vulnerables:
nmap --script "smb-vuln*,rdp-vuln*,..." ... - Descubrir fuga de información:
nmap --script "ftp-anon,smtp-enum-users,..." ...
Revelado: SSL/TLS débiles, sistemas sin parches, fugas de información.
Puntos Clave
- El Nmap Scripting Engine (NSE) transforma Nmap en una plataforma integral de investigación de redes.
- Los scripts NSE se categorizan por propósito (`safe`, `intrusive`, `vuln`, etc.) y se ejecutan en fases específicas del escaneo.
- Los argumentos personalizan el comportamiento del script (`--script-args`).
- Los scripts personalizados (Lua) extienden las capacidades de Nmap.
- Las librerías NSE (`http`, `shortport`, etc.) simplifican el desarrollo de scripts.
- Combinar scripts con opciones de Nmap crea potentes flujos de trabajo.
- Entender los problemas comunes (fallos, rendimiento, falsos positivos) es clave para un uso efectivo.
Próximos Pasos
En el próximo episodio, exploraremos:
- Escenarios de seguridad del mundo real usando Nmap
- Casos de estudio de evaluaciones de redes y pruebas de penetración
- Flujos de trabajo prácticos para diferentes tareas de seguridad
- Integración de Nmap con otras herramientas de seguridad
- Construcción de metodologías integrales de evaluación de seguridad
Recursos Adicionales
Documentación Oficial de NSE
El recurso principal para entender NSE.
Biblioteca de Scripts NSE
Navegá por todos los scripts NSE oficiales disponibles.
Referencia de la API de NSE
Documentación detallada para las librerías NSE.
Manual de Referencia de Lua 5.3
Aprendé el lenguaje Lua usado en los scripts NSE.
Guía de Desarrollo NSE
Tutorial sobre cómo crear tus propios scripts NSE.
Demostración en Video
Nota: Usá este video como guía visual para complementar el material escrito.
Quiz
Knowledge Check
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)?

