Parte: 1 — Redes y seguridad de redes · Fuente: Nmap Network Scanning, G. Lyon ⏱️ Duración estimada: 110 min · Nivel: Intermedio
Aprovechar el Nmap Scripting Engine para automatizar tareas de descubrimiento, detección de vulnerabilidades, enumeración y hasta explotación ligera mediante scripts en Lua. El alumno aprenderá a elegir scripts por categoría, pasarles argumentos, leer su salida y escribir un script mínimo propio.
Al finalizar, el alumno podrá:
-sC) y conjuntos temáticos (vuln, discovery, safe).--script-args.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Categorías NSE (safe, default, vuln, exploit…) | Elegir según objetivo y riesgo |
| 2 | Selección de scripts (--script) |
Precisión en la automatización |
| 3 | Argumentos (--script-args) |
Adaptar scripts al contexto |
| 4 | -sC y -A |
Conjuntos convenientes |
| 5 | --script-help y --script-updatedb |
Documentación y mantenimiento |
| 6 | Scripts de vulnerabilidad y su fiabilidad | Evitar falsos positivos |
| 7 | Estructura de un script Lua | Extender Nmap |
El Nmap Scripting Engine es un intérprete de Lua embebido en Nmap con acceso a todo lo que el escaneo ya descubrió y a librerías propias para hablar HTTP, SMB, SSH, DNS o SNMP. Eso cambia la naturaleza de la herramienta: Nmap deja de responder solo "¿qué hay aquí?" y pasa a responder "¿y qué puedo averiguar o comprobar sobre lo que hay?". La consulta de una zona DNS, la enumeración de comparticiones SMB, la lista de cifradores TLS aceptados por un servidor o la comprobación de una vulnerabilidad concreta son, todas, scripts NSE.
Cada script declara en qué fase se ejecuta, y eso determina qué información tiene
disponible. Los de fase prerule corren antes de cualquier escaneo (por ejemplo, para
descubrir hosts por broadcast); los de hostrule se ejecutan una vez por host; los de
portrule —la mayoría— una vez por puerto que cumpla una condición, típicamente
"puerto 445 abierto"; y los de postrule al final, para agregar resultados de todo el
escaneo.
Los más de 600 scripts que trae Nmap están etiquetados en categorías, y leerlas como
etiquetas de riesgo es lo que separa un uso profesional de un accidente. safe
agrupa los que no van a tumbar nada ni disparar defensas de forma apreciable.
default (los que ejecuta -sC y -A) son rápidos, útiles y razonablemente
seguros. discovery y version amplían la información sin agresividad.
vuln comprueba vulnerabilidades conocidas. Y en el otro extremo, intrusive
puede afectar al objetivo, dos intenta explícitamente provocar una denegación de
servicio, y exploit intenta explotar de verdad.
De ahí sale una regla que conviene grabarse: --script vuln no es una categoría
inocente. Muchos de esos scripts son intrusivos, y algunos comprueban la
vulnerabilidad provocándola. Ejecutarlos contra un sistema de producción sin
autorización explícita para pruebas intrusivas es exactamente el tipo de acción que la
clase 025 delimita. La selección admite combinaciones lógicas —--script "default and
safe", --script "smb-* and not brute"— y ese control fino es la forma correcta de
acotar el riesgo.
--script-args pasa parámetros a los scripts (credenciales, dominios, límites de
tiempo, rutas de diccionario) y --script-args-file los lee de un fichero, que es lo
razonable cuando hay secretos de por medio: un argumento en la línea de comandos queda
en el historial de la shell y es visible en la tabla de procesos para cualquier usuario
del sistema.
Sobre la interpretación de resultados, hay dos advertencias que ahorran informes
embarazosos. La primera es que muchos scripts de vuln determinan la vulnerabilidad
por versión, no por comprobación real, y arrastran por tanto el problema de los
backports de la clase anterior; el estado VULNERABLE (DoS) o el sufijo LIKELY
VULNERABLE te está diciendo justamente eso. La segunda es que NSE también sirve para
defenderse: correr los scripts de descubrimiento contra tu propia red es una forma
barata y honesta de saber qué ve un atacante que llegue hasta ahí.
safe, default, discovery, version, auth, brute, vuln, exploit, intrusive, dos, malware.--script-args: mecanismo para pasar parámetros (credenciales, rutas, límites) a los scripts.ssl-heartbleed) y reporta estado, referencias y a veces CVE.--script-help: muestra la documentación de un script sin ejecutarlo.| Término | Definición concisa |
|---|---|
| NSE | Nmap Scripting Engine: intérprete Lua embebido en Nmap |
| Lua | Lenguaje de scripting ligero en el que se escriben los scripts NSE |
prerule |
Fase previa al escaneo; no depende de ningún host |
hostrule |
Se ejecuta una vez por host que cumpla la condición |
portrule |
Se ejecuta una vez por puerto que cumpla la condición |
postrule |
Se ejecuta al final para agregar resultados globales |
Categoría safe |
Scripts que no afectan al objetivo de forma apreciable |
Categoría default |
Conjunto que ejecutan -sC y -A |
Categoría vuln |
Comprobación de vulnerabilidades conocidas; a menudo intrusiva |
Categoría intrusive / dos / exploit |
Pueden degradar, tumbar o explotar el objetivo |
--script |
Selecciona scripts por nombre, categoría, patrón o expresión lógica |
--script-args |
Pasa parámetros a los scripts seleccionados |
--script-help |
Muestra la documentación de un script sin ejecutarlo |
--script-updatedb |
Reconstruye el índice tras añadir scripts propios |
LIKELY VULNERABLE |
Veredicto por versión, no por comprobación efectiva |
/usr/share/nmap/scripts/).bash
sudo nmap --script-updatedb
vuln.⚠️ Nota ética: las categorías
intrusive,brute,exploitydospueden dañar o bloquear servicios y realizan acciones ofensivas. Úsalas solo en sistemas propios o con autorización explícita y alcance definido. Nunca contra terceros.
default, seguros y útiles):bash
sudo nmap -sC 192.168.56.101
bash
sudo nmap -p80 --script http-title,http-headers,http-enum 192.168.56.101
bash
sudo nmap -p445 --script smb-os-discovery,smb-enum-shares 192.168.56.101
bash
sudo nmap -p443 --script ssl-cert,ssl-enum-ciphers 192.168.56.101
bash
sudo nmap -sV --script vuln 192.168.56.101
bash
sudo nmap -p80 --script http-enum --script-args http.useragent="Lab-Scanner" 192.168.56.101
bash
nmap --script-help ssl-enum-ciphers
http-* menos los intrusivos):bash
sudo nmap -p80 --script "http-* and not intrusive" 192.168.56.101
hello.nse:lua
description = "Devuelve un saludo por cada puerto abierto"
author = "alumno"
categories = {"safe"}
portrule = function(host, port) return port.state == "open" end
action = function(host, port)
return "Hola desde el puerto " .. port.number
end
Ejecútalo:
bash
sudo nmap -p80 --script ./hello.nse 192.168.56.101
vuln con ls /usr/share/nmap/scripts/ | grep vuln y elige tres para leer su --script-help.-sC y explica qué información añadió cada script a la salida.ssl-enum-ciphers y evalúa si el objetivo soporta cifradores débiles.hello.nse para que también imprima el nombre del servicio detectado.-sV con --script banner y compara con la detección de versión nativa.portrule y un hostrule en NSE.Escribe (o adapta) un escaneo NSE que enumere un servicio web de tu laboratorio y produzca: título de la página, cabeceras de seguridad presentes/ausentes y cifradores TLS soportados. Entrega el comando, la salida -oN y una breve interpretación de dos hallazgos de seguridad.
Criterio de aceptación: la salida incluye los tres bloques de información y la interpretación identifica correctamente al menos una debilidad real (p. ej. falta de HSTS o soporte de un cifrador obsoleto).
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| "'X' did not match a category, filename, or directory" | Nombre de script mal escrito o base sin actualizar; corre --script-updatedb |
| Script no devuelve nada | El portrule no se cumple (puerto cerrado o servicio distinto); verifica con -sV |
Escaneo vuln tumba el servicio |
Usaste scripts intrusivos; limita a safe/default fuera del laboratorio |
| Argumentos ignorados | Formato incorrecto de --script-args; usa clave=valor separados por coma |
Salida de brute sin resultados |
Diccionario inadecuado o cuenta bloqueada; ajusta userdb/passdb (solo en laboratorio) |
❓ ¿-sC es lo mismo que --script default?
Sí. -sC ejecuta todos los scripts de la categoría default, considerados seguros y útiles para un escaneo general.
❓ ¿Los scripts vuln explotan la vulnerabilidad?
Normalmente solo la detectan. Los que explotan están en la categoría exploit y son mucho más peligrosos; úsalos con extremo cuidado y solo con permiso.
❓ ¿En qué lenguaje se escriben los scripts? En Lua, usando las librerías NSE (nmap, shortport, http, etc.). Son fáciles de leer y modificar.
❓ ¿Cómo sé qué hace un script antes de ejecutarlo?
Con nmap --script-help <nombre>, que muestra descripción, categorías, argumentos y ejemplos sin lanzar nada.
Clase 031 — Nmap: detección de servicios y fingerprinting de OS