
Script NSE de Nmap que consulta la API de Vulners para identificar vulnerabilidades conocidas (CVE) en los servicios de red detectados, mejorando el escaneo de puertos estándar con búsqueda automatizada de CVE y puntuación CVSS.
Convierte un escaneo de servicios de nmap en una lista de CVEs, puntuaciones CVSS y exploits conocidos.
Tres scripts NSE que toman el software que nmap ya identificó, preguntan a la base de datos de Vulners qué se sabe sobre él e imprimen la respuesta dentro del informe del escaneo.

Son independientes. Ejecuta uno, o los tres: el script de regex entrega sus hallazgos a los otros dos automáticamente.
macOS, Linux, Kali, WSL - una línea, sin argumentos:
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh
Windows - PowerShell como Administrador:
irm https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.ps1 | iex
El instalador pregunta a nmap dónde guarda sus datos, copia allí los scripts y sus archivos de datos, reconstruye la base de datos de scripts y luego comprueba que --script vulners realmente resuelve a lo que acaba de instalar: nmap incluye un vulners.nse propio, y este lo reemplaza.
# into ~/.nmap, no sudo; the installer prints the NMAPDIR line to add to your profile
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh -s -- --user
# a specific directory
./install.sh --prefix /usr/local/share/nmap
# a specific release
./install.sh --ref v1.5
# remove everything it installed
./install.sh --uninstall
PowerShell acepta las mismas opciones: -User, -Prefix, -Ref, -Uninstall.
git clone https://github.com/vulnersCom/nmap-vulners
cd nmap-vulners
./install.sh
El instalador usa los archivos que tiene a su lado, así que instala exactamente lo que clonaste. Ejecutar los scripts directamente desde el checkout también funciona:
nmap -sV --script "$PWD/vulners.nse" <target>
Usa una ruta absoluta al ejecutar desde un checkout. nmap resuelve un
--script ./vulners.nserelativo contra su propioscript.dbprimero, y ejecuta silenciosamente la copia que trae nmap en lugar de la tuya.
Cinco archivos, dos directorios:
| Archivo | Va a |
|---|---|
vulners.nse, vulners_enterprise.nse, http-vulners-regex.nse | <nmap data dir>/scripts/ |
nmap -sV --script vulners [--script-args mincvss=<score>] <target>
Se consulta cada CPE que nmap informa; cada vulnerabilidad se imprime con su puntuación, la escala en la que está esa puntuación y un enlace. Las entradas con un exploit conocido se marcan *EXPLOIT* y se muestran sea cual sea el umbral, porque un fallo de baja severidad explotado igualmente te compromete.
export VULNERS_API_KEY=<token>
nmap -sV --script vulners_enterprise [--script-args mincvss=<score>] <target>

El endpoint empresarial responde con métricas CVSS v3 y con las referencias de exploits que Vulners ha recopilado, de modo que un CVE explotado se marca *HAS EXPLOIT* y el exploit en sí aparece listado junto a él. Todos los CPE de un puerto viajan en una sola petición.
-sV no puede nombrarnmap -sV --script http-vulners-regex [--script-args paths={"/"}] <target>

178 patrones asignan cabeceras HTTP y marcado de página - Server, X-Powered-By, etiquetas de generador, URLs de recursos - a CPEs: servidores web, CMS, frameworks, plugins de WordPress, librerías JavaScript. Todo lo que encuentra queda registrado en el puerto, de modo que vulners y vulners_enterprise lo consultan en el mismo escaneo.
| Argumento | Valor por defecto | Significado |
|---|---|---|
http-vulners-regex.paths | http-vulners-paths.txt (125 rutas) | Una lista Lua de rutas, o una cadena que nombra un archivo con una ruta por línea |
Toda la lista de rutas viaja en una sola canalización HTTP. Un archivo que no se puede leer detiene el script en lugar de recurrir a la lista incluida, de modo que un error tipográfico en el nombre del archivo no puede convertir un escaneo de tres rutas en uno de 125.
En orden de preferencia:
VULNERS_API_KEY en el entorno--script-args vulners_enterprise.api_key_file=/absolute/path--script-args vulners_enterprise.api_key=<token>La tercera es cómoda y peligrosa: nmap copia su propia línea de comandos en cada informe, así que el token termina en el atributo args de la salida -oX y en el historial de tu shell. El script en sí nunca escribe el token en ningún sitio, incluida su salida de depuración; hay una prueba de regresión que lo confirma.
Los tokens viven en tu cuenta de vulners.com. Sin uno, vulners_enterprise permanece en silencio y no envía nada.
nmap -sV
|
+-- service fingerprint --> port.version.cpe ------------+
| |
+-- http-vulners-regex.nse |
requests the path list in one pipeline |
matches headers and bodies against 178 patterns |
publishes the CPEs it found for that port ---------+
|
v
vulners.nse / vulners_enterprise.nse
one batched request per port
answers cached for the whole scan
sorted by CVSS, exploits marked
Todo lo que imprimen los scripts también está estructurado, de modo que la salida -oX se puede analizar sin tocar el texto legible:
<script id="vulners_enterprise">
<table key="cpe:/a:apache:http_server:2.4.7">
<table>
<elem key="id">CVE-2021-44790</elem>
<elem key="type">cve</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
</table>
<table>
<elem key="id">EDB-ID:51193</elem>
<elem key="type">exploitdb</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
<elem key="is_exploit">true</elem>
</table>
</table>
</script>
Las claves son id, type, cvss, cvss_type e is_exploit, que solo está presente en las entradas que lo tienen. Las tablas de resultados se indexan por el CPE para el que se encontraron. Un boletín sin puntuar no lleva ni cvss ni cvss_type.
Un escaneo de una red pide a la API mucho menos de lo que parece:
Las pruebas, el control de higiene y CONTRIBUTING.md están solo en el repositorio git; el archivo de la versión publicada incluye los scripts y sus datos. Tres controles, todos sin conexión salvo donde se indique:
nmap -sn -Pn --script ./tests/run.nse --script-args testdir=tests,root=. 127.0.0.1
python3 tests/e2e/run_e2e.py
python3 tools/check.py
110 casos unitarios se ejecutan dentro de nmap contra las librerías NSE reales; 33 casos de extremo a extremo ejecutan el binario real de nmap contra un servidor web local y una API de Vulners simulada; el control de higiene mantiene fuera del repositorio secretos, salidas de escaneo y basura de editores. python3 tests/e2e/run_e2e.py --live añade seis comprobaciones contra el servicio real. Consulta CONTRIBUTING.md.
¿Explota algo? No. Los scripts leen banners y páginas y consultan una base de datos. Están en la categoría safe de nmap.
¿Funciona sin clave de API? Sí: vulners y http-vulners-regex no necesitan ninguna. vulners_enterprise sí.
¿Por qué una vulnerabilidad muestra cvss2.0 mientras otra muestra cvss3.1? La etiqueta indica la escala en la que está la puntuación. Vulners devuelve la que publicó la fuente; una puntuación v2 de 9.3 no es una puntuación v3 de 9.3.
¿Por qué se muestra una entrada con puntuación baja cuando establezco mincvss? Porque tiene un exploit conocido, o porque la fuente nunca la puntuó. Ambas cosas son deliberadas.
No encontró nada en un host que sé que es vulnerable. Ejecuta con -d2: los scripts registran cada CPE que consultaron. Normalmente nmap nombra el servicio pero no su versión, y no hay versión que consultar.
Los scripts tienen la misma licencia que el propio Nmap: consulta LICENSE para la Nmap Public Source License y nmap.org/npsl para saber qué significa.
Los datos de vulnerabilidades provienen de Vulners y están sujetos a sus términos.
Mantenido por el equipo de Vulners <[email protected]>
#nmap #nse #vulnerability-scanner #cve #cvss #cpe #vulners
#security-tools #pentest #infosec #network-scanner #exploit-database
#lua #vulnerability-detection #security-automation
| Script | ¿Necesita clave? | Qué hace |
|---|
vulners.nse | no | Envía cada CPE que nmap encontró al endpoint público de Vulners e imprime lo que se sabe sobre él, con el CVSS más alto primero |
vulners_enterprise.nse | sí | La misma consulta a través de la API v4 de Vulners: puntuaciones CVSS v3 y los exploits que referencian cada CVE |
http-vulners-regex.nse | no | Identifica el software web por su huella a partir de cabeceras HTTP y contenido de páginas, para que los otros dos tengan algo que consultar incluso cuando -sV no puede nombrarlo |
http-vulners-regex.json, http-vulners-paths.txt | <nmap data dir>/nselib/data/ |
Después sudo nmap --script-updatedb.
El directorio de datos de nmap suele ser /usr/share/nmap (Debian, Ubuntu, Kali), /usr/local/share/nmap (compilado desde el código fuente), /opt/homebrew/share/nmap (Homebrew) o C:\Program Files (x86)\Nmap (Windows). Para estar seguro, pregúntale a nmap:
nmap -d2 --script-help probe 2>&1 | grep nse_main.lua
El directorio que contiene nse_main.lua es el que usa este nmap.
| Argumento | Valor por defecto | Significado |
|---|
vulners.mincvss | 0 | Oculta vulnerabilidades con puntuación inferior a esta. Los boletines y exploits sin puntuar siempre se muestran |
vulners.api_host | vulners.com | Nombre de host de la API |
vulners.api_port | 443 | Puerto en api_host |
| Argumento | Valor por defecto | Significado |
|---|
vulners_enterprise.mincvss | 0 | Igual que arriba |
vulners_enterprise.api_key | - | Token de API. Prefiere la variable de entorno, ver más abajo |
vulners_enterprise.api_key_file | - | Ruta absoluta a un archivo cuya primera línea es el token |
vulners_enterprise.api_host | vulners.com | Nombre de host de la API |
vulners_enterprise.api_port | 443 | Puerto en api_host |