Ir al contenido

NSE, argumentos y tracing

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

Nmap Scripting Engine (NSE) ejecuta scripts Lua después o durante fases concretas del escaneo. Un script puede descubrir información, autenticar, probar credenciales, consultar un servicio externo, enviar un exploit o modificar estado. La unidad de selección es el script revisado, no una categoría recordada.

Esta página se revisó contra el catálogo distribuido con Nmap 7.99. Los mapas por servicio, como automatización y NSE para SMTP, registran qué scripts concretos aportan valor después de conocer el protocolo.

Un script declara una regla que determina cuándo puede ejecutarse:

  • prerule: antes del descubrimiento y sin un host concreto
  • hostrule: una vez conocido el host
  • portrule: cuando un puerto cumple número, protocolo, servicio o estado
  • postrule: después de terminar el escaneo

La función action implementa la interacción. Las librerías de nselib aportan sockets, TLS, credenciales, protocolos y formato de output. Dos scripts de la misma categoría pueden tener reglas, argumentos y efectos completamente distintos.

La detección de versiones influye en portrule. Un script que acepta el servicio smtp puede ejecutarse sobre un puerto no estándar después de -sV, aunque el número no sea 25, 465 o 587. Sin detección, puede depender solo de esos puertos.

nmap --version identifica el motor. El directorio de datos depende del paquete y puede cambiar mediante NMAPDIR o --datadir DIR. Localiza scripts/script.db, el archivo .nse y las librerías en la instalación real. No copies un argumento de la documentación web sin comprobar el script distribuido.

La base script.db indexa nombre y categorías. --script-updatedb la reconstruye después de instalar o modificar scripts:

Actualizar el índice tras un cambio local
sudo nmap --script-updatedb

El comando modifica el índice del directorio de datos. No es necesario para usar los scripts incluidos por el paquete.

--script-help evalúa la misma expresión que aceptaría --script, pero muestra nombre, categorías, descripción y enlace:

Revisar un script concreto
nmap --script-help smtp-commands
Ver qué seleccionaría una expresión
nmap --script-help 'default and safe'

Lee también el código cuando la decisión dependa de:

  • comandos de protocolo enviados
  • valores predeterminados de dominio, usuario o destinatario
  • servicios externos consultados
  • número de intentos
  • archivos leídos
  • condiciones que activan explotación o escritura
  • diferencias entre puertos con TLS implícito y STARTTLS

La descripción no siempre enumera todas las ramas de la implementación.

-sC equivale a --script default. La categoría default es una selección mantenida por el proyecto, no una garantía de interacción pasiva. Ejecuta scripts concretos cuando ya sabes qué pregunta quieres responder:

Identificar comandos SMTP
sudo nmap -sV -n -Pn -p 25 \
--script smtp-commands TARGET_IP

--script acepta:

  • nombre exacto: smtp-commands
  • glob: smtp-*
  • categoría: discovery
  • archivo o directorio
  • expresión booleana: 'default and safe and not external'

Un glob como smtp-* incluye en Nmap 7.99 scripts brute, intrusive, external, vuln y exploit. No lo ejecutes como abreviatura de «enumerar SMTP».

Las categorías son metadatos de selección y un script puede pertenecer a varias:

Categoría Qué agrupa Pregunta previa
auth autenticación, credenciales o bypass ¿usa una identidad o enumera cuentas?
broadcast descubrimiento de capa local ¿qué terceros recibirán el broadcast?
brute intentos repetidos ¿cuál es la política de bloqueo y el límite?
default selección de uso general ¿qué scripts exactos selecciona en esta versión?
discovery información adicional ¿qué solicitud y datos produce?
dos prueba de denegación de servicio ¿puede interrumpir o degradar el servicio?
exploit explotación activa ¿qué estado, proceso o datos cambia?
external consulta a terceros ¿qué identificador del objetivo abandona el entorno?
fuzzer entradas inesperadas ¿cuántos casos y qué estabilidad se espera?
intrusive interacción apreciable ¿qué volumen, autenticación o cambio implica?
malware indicios de malware o backdoor ¿qué falso positivo conserva?
safe baja probabilidad de daño según el autor ¿qué conexiones y logs crea de todos modos?
version apoyo a detección de versiones ¿qué fingerprint intenta obtener?
vuln comprobación de vulnerabilidad ¿detecta versión, condición o explotabilidad?

safe no significa sin tráfico ni sin artefactos. vuln no significa prueba concluyente. Revisa el script.

--script-args NAME=VALUE pasa valores al registro compartido. Usa el nombre cualificado para evitar colisiones:

Pasar un dominio a smtp-commands
sudo nmap -sV -n -Pn -p 25 \
--script smtp-commands \
--script-args smtp-commands.domain=example.test \
TARGET_IP

Las listas y tablas usan sintaxis Lua:

Ordenar métodos de enumeración
sudo nmap -sV -n -Pn -p 25 \
--script smtp-enum-users \
--script-args 'smtp-enum-users.methods={RCPT,VRFY,EXPN},userdb=users.txt' \
TARGET_IP

Las comillas evitan que la shell interprete llaves y comas. Antes del comando debe existir una política de intentos y una lista saneada. --script-args-file FILE carga argumentos desde un archivo, pero los secretos siguen disponibles para el proceso y pueden aparecer en registros u outputs. Protege sus permisos y almacenamiento, y documenta su eliminación.

Muchas librerías usan el registro de credenciales de NSE. Argumentos como user, pass, userdb, passdb o los específicos del protocolo pueden alimentar varios scripts. No supongas que un script probará una sola combinación. Lee la ayuda y el código.

La opción --script-args creds.snmp=COMMUNITY es un ejemplo de argumento de librería:

Consultar SNMP con una community conocida
sudo nmap -sU -sV -n -Pn -p 161 \
--script snmp-sysdescr \
--script-args creds.snmp=COMMUNITY \
TARGET_IP

--script-trace muestra datos enviados y recibidos por las comunicaciones del script:

Trazar una interacción NSE acotada
sudo nmap -sV -n -Pn -p 25 \
--script smtp-commands --script-trace TARGET_IP

Puede exponer credenciales, tokens y contenido de aplicación en el transcript. --packet-trace muestra paquetes de Nmap de forma más general. -d aumenta debug del motor. Usa tracing sobre un host, puerto y script para que el resultado siga siendo interpretable.

--script-timeout TIME limita la ejecución de cada script. Un timeout evita que un script quede pendiente, pero también produce resultados incompletos:

Limitar un script a treinta segundos
sudo nmap -n -Pn -p PORT \
--script SCRIPT_NAME --script-timeout 30s TARGET_IP

Registra el timeout como limitación. No conviertas «sin output» en resultado negativo.

NSE puede devolver tablas, texto, estados LIKELY VULNERABLE o datos sin un marcador explícito. Conserva XML y examina:

  • script y versión de Nmap
  • puerto y servicio que activó la regla
  • argumentos efectivos
  • ramas omitidas por autenticación, timeout o error
  • petición y respuesta cuando sean necesarias
  • condición que el script realmente probó

Reproduce manualmente la interacción crítica. Si el script enumera un comando, ejecútalo mediante el cliente del protocolo. Si infiere una vulnerabilidad por versión, comprueba configuración y condición. Si prueba relay, valida destinatario, envelope y aceptación sin depender solo de un código intermedio.

Un script local necesita:

  • descripción y documentación de argumentos
  • regla acotada
  • timeouts
  • límites de concurrencia
  • output estructurado
  • casos positivos, negativos y fallos
  • revisión de las librerías que usa

No coloques automáticamente código de terceros en el directorio global. Revisa procedencia, licencia, commits, dependencias y cambios de estado. Ejecuta con una ruta explícita durante la evaluación inicial.