
nmap-vulners v1.5
Script NSE pour Nmap qui interroge l'API Vulners pour identifier les vulnérabilités connues (CVE) des services réseau détectés, améliorant le scan de ports standard avec une recherche automatisée de CVE et un score CVSS.
nmap-vulners
Transformez un scan de services nmap en une liste de CVE, de scores CVSS et d'exploits connus.
Trois scripts NSE qui prennent les logiciels déjà identifiés par nmap, interrogent la base Vulners pour savoir ce qui est connu à leur sujet, puis impriment la réponse dans le rapport de scan.

Les trois scripts
| Script | Clé requise | Ce qu'il fait |
|---|---|---|
vulners.nse | non | Envoie chaque CPE trouvé par nmap à l'endpoint public de Vulners et affiche ce qui est connu à son sujet, en commençant par le CVSS le plus élevé |
vulners_enterprise.nse | oui | La même recherche via l'API v4 de Vulners : scores CVSS v3 et exploits référençant chaque CVE |
http-vulners-regex.nse | non | Identifie les logiciels web à partir des en-têtes HTTP et du contenu des pages, afin que les deux autres aient quelque chose à rechercher même quand -sV ne peut pas les nommer |
Ils sont indépendants. Lancez-en un, ou les trois : le script regex transmet automatiquement ses résultats aux deux autres.
Installation
macOS, Linux, Kali, WSL - une seule ligne, sans argument :
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh
Windows - PowerShell en tant qu'administrateur :
irm https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.ps1 | iex
L'installateur demande à nmap où se trouvent ses données, y copie les scripts
et leurs fichiers de données, reconstruit la base de scripts, puis vérifie que
--script vulners résout bien ce qu'il vient d'installer - nmap fournit son
propre vulners.nse, et celui-ci le remplace.
Sans root, et autres options
# 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 accepte les mêmes options : -User, -Prefix, -Ref, -Uninstall.
Depuis un checkout
git clone https://github.com/vulnersCom/nmap-vulners
cd nmap-vulners
./install.sh
L'installateur utilise les fichiers situés à côté de lui, il installe donc exactement ce que vous avez cloné. Lancer les scripts directement depuis le checkout fonctionne aussi :
nmap -sV --script "$PWD/vulners.nse" <target>
Utilisez un chemin absolu lorsque vous lancez depuis un checkout. nmap résout d'abord un
--script ./vulners.nserelatif par rapport à son proprescript.db, puis exécute silencieusement la copie fournie avec nmap au lieu de la vôtre.
À la main
Cinq fichiers, deux répertoires :
| Fichier | Destination |
|---|---|
vulners.nse, vulners_enterprise.nse, http-vulners-regex.nse | <nmap data dir>/scripts/ |
http-vulners-regex.json, http-vulners-paths.txt | <nmap data dir>/nselib/data/ |
Ensuite sudo nmap --script-updatedb.
Le répertoire de données de nmap est généralement /usr/share/nmap (Debian,
Ubuntu, Kali), /usr/local/share/nmap (compilé depuis les sources),
/opt/homebrew/share/nmap (Homebrew) ou C:\Program Files (x86)\Nmap
(Windows). Pour en être sûr, demandez à nmap :
nmap -d2 --script-help probe 2>&1 | grep nse_main.lua
Le répertoire contenant nse_main.lua est celui qu'utilise ce nmap.
Utilisation
vulners - aucune clé requise
nmap -sV --script vulners [--script-args mincvss=<score>] <target>
Chaque CPE signalé par nmap est recherché ; chaque vulnérabilité est affichée
avec son score, l'échelle sur laquelle ce score est exprimé et un lien. Les
entrées avec un exploit connu sont marquées *EXPLOIT* et sont affichées quel
que soit le seuil, car une faille de faible sévérité exploitée vous compromet
quand même.
vulners_enterprise - clé API Vulners
export VULNERS_API_KEY=<token>
nmap -sV --script vulners_enterprise [--script-args mincvss=<score>] <target>

L'endpoint enterprise répond avec les métriques CVSS v3 et les références
d'exploits collectées par Vulners, de sorte qu'une CVE exploitée est marquée
*HAS EXPLOIT* et que l'exploit lui-même est listé à côté. Tous les CPE d'un
port partent en une seule requête.
http-vulners-regex - identifier ce que -sV ne peut pas nommer
nmap -sV --script http-vulners-regex [--script-args paths={"/"}] <target>

178 motifs associent les en-têtes HTTP et le balisage des pages - Server,
X-Powered-By, balises de générateur, URL d'assets - à des CPE : serveurs web,
CMS, frameworks, plugins WordPress, bibliothèques JavaScript. Tout ce qu'il
trouve est publié sur le port, afin que vulners et vulners_enterprise
puissent le rechercher dans le même scan.
Arguments des scripts
vulners
| Argument | Défaut | Signification |
|---|---|---|
vulners.mincvss | 0 | Masque les vulnérabilités dont le score est inférieur à cette valeur. Les bulletins non notés et les exploits sont toujours affichés |
vulners.api_host | vulners.com | Nom d'hôte de l'API |
vulners.api_port | 443 | Port de api_host |
vulners_enterprise
| Argument | Défaut | Signification |
|---|---|---|
vulners_enterprise.mincvss | 0 | Comme ci-dessus |
vulners_enterprise.api_key | - | Jeton API. Préférez la variable d'environnement, voir ci-dessous |
vulners_enterprise.api_key_file | - | Chemin absolu vers un fichier dont la première ligne est le jeton |
vulners_enterprise.api_host | vulners.com | Nom d'hôte de l'API |
vulners_enterprise.api_port | 443 | Port de api_host |
http-vulners-regex
| Argument | Défaut | Signification |
|---|---|---|
http-vulners-regex.paths | http-vulners-paths.txt (125 chemins) | Une liste Lua de chemins, ou une chaîne nommant un fichier avec un chemin par ligne |
Toute la liste de chemins voyage dans un seul pipeline HTTP. Un fichier illisible arrête le script plutôt que de revenir à la liste fournie, de sorte qu'une faute de frappe dans le nom du fichier ne peut pas transformer un scan de trois chemins en un scan de 125 chemins.
Où conserver la clé API
Par ordre de préférence :
VULNERS_API_KEYdans l'environnement--script-args vulners_enterprise.api_key_file=/absolute/path--script-args vulners_enterprise.api_key=<token>
La troisième est pratique et fuyante : nmap copie sa propre ligne de commande
dans chaque rapport, si bien que le jeton se retrouve dans l'attribut args de
la sortie -oX et dans l'historique de votre shell. Le script lui-même n'écrit
jamais le jeton nulle part, y compris dans sa sortie de débogage - un test de
régression le vérifie.
Les jetons se trouvent dans votre compte vulners.com.
Sans jeton, vulners_enterprise reste silencieux et n'envoie rien.
Comment les trois s'articulent
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
Sortie lisible par machine
Tout ce que les scripts affichent est également structuré, de sorte que la
sortie -oX peut être analysée sans toucher au texte humain :
<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>
Les clés sont id, type, cvss, cvss_type et is_exploit, cette dernière
n'étant présente que sur les entrées qui en ont une. Les tables de résultats
sont indexées par le CPE pour lequel elles ont été trouvées. Un bulletin non
noté ne comporte ni cvss ni cvss_type.
Scanner poliment
Un scan de réseau sollicite l'API bien moins qu'il n'y paraît :
- tous les CPE d'un port partent en une seule requête groupée
- les réponses sont mises en cache pour tout le scan : cent serveurs identiques ne coûtent qu'une seule recherche, pas cent
- une recherche déjà en cours est attendue plutôt que répétée
- le balayage des 125 chemins s'effectue sur 5 connexions TCP plutôt que 126, et demande des pages compressées lorsque le serveur le propose
- un dépassement de limite de débit ou une panne arrête les requêtes du scan au lieu de réessayer hôte par hôte
Développement
Les tests, le contrôle d'hygiène et CONTRIBUTING.md ne se trouvent que dans le
dépôt git ; l'archive de version contient les scripts et leurs données. Trois
contrôles, tous hors ligne sauf indication contraire :
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 cas unitaires s'exécutent dans nmap contre les vraies bibliothèques NSE ;
33 cas de bout en bout pilotent le vrai binaire nmap contre un serveur web local
et une API Vulners factice ; le contrôle d'hygiène élimine secrets, sorties de
scan et fichiers parasites d'éditeur de l'arborescence.
python3 tests/e2e/run_e2e.py --live ajoute six vérifications contre le service
réel. Voir CONTRIBUTING.md.
FAQ
Est-ce qu'il exploite quelque chose ? Non. Les scripts lisent des bannières
et des pages et interrogent une base de données. Ils appartiennent à la
catégorie safe de nmap.
Fonctionne-t-il sans clé API ? Oui - vulners et http-vulners-regex
n'en ont pas besoin. vulners_enterprise en a besoin.
Pourquoi une vulnérabilité affiche cvss2.0 alors qu'une autre affiche
cvss3.1 ? Le libellé indique l'échelle sur laquelle le score est exprimé.
Vulners renvoie celui que la source a publié ; un score v2 de 9.3 n'est pas un
score v3 de 9.3.
Pourquoi une entrée à faible score est-elle affichée quand je règle
mincvss ? Parce qu'elle a un exploit connu, ou parce que la source ne l'a
jamais notée. Les deux sont voulus.
Il n'a rien trouvé sur un hôte que je sais vulnérable. Lancez avec -d2 :
les scripts journalisent chaque CPE interrogé. En général, nmap a identifié le
service mais pas sa version, et il n'y a pas de version à rechercher.
Licence
Les scripts sont sous licence identique à celle de Nmap lui-même - voir LICENSE pour la Nmap Public Source License, et nmap.org/npsl pour ce qu'elle implique.
Les données de vulnérabilités proviennent de Vulners et sont soumises à leurs conditions.
Liens connexes
- vulners.com - la base de données derrière ces scripts
- vulnersCom/api - le client Python
- vulnersCom/burp-vulners-scanner - les mêmes données dans Burp Suite
- nmap.org/book/nse.html - comment fonctionnent les scripts NSE
Maintenu par l'équipe Vulners <[email protected]>
#nmap #nse #vulnerability-scanner #cve #cvss #cpe #vulners
#security-tools #pentest #infosec #network-scanner #exploit-database
#lua #vulnerability-detection #security-automation