Skip to content
PhiloCyber logo

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.1

Scripts 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.1

Scripts de Detección de Vulnerabilidades (`vuln`)

Estos scripts buscan vulnerabilidades específicas. Esenciales para evaluaciones de seguridad.

nmap --script ssl-heartbleed 192.168.1.1

Scripts 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.1

Scripts 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.1

Scripts 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.1

Scripts 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.1

Comprender 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.xml

Scripts `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.1

Scripts `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 80

Scripts `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/24

Esta 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.1

Esto 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 80

Esto 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.1

Selecció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.1

Combinando 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.1

Argumentos 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.1

Esto 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.1

Esto 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.1

Encontrando Argumentos Disponibles

Para descubrir qué argumentos acepta un script:

nmap --script-help http-enum
Mostrar 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."
end

Guardá 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.1

Usando 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
end

Recursos 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:

  1. 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
  2. Ejecutá tu script:
    nmap --script mensaje-puerto.nse 192.168.1.1
  3. 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:

  1. Descubrimiento inicial: nmap -sV --script "http-..." 10.0.0.0/24 ...
  2. Escaneo de vulnerabilidades: nmap --script "http-vuln*" ... 10.0.0.5 ...
  3. 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:

  1. Identificar cifrado débil: nmap --script "ssl-enum-ciphers" ...
  2. Verificar servicios vulnerables: nmap --script "smb-vuln*,rdp-vuln*,..." ...
  3. 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

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)?