Nmap Scripting Engine

Le Nmap Scripting Engine (NSE) est une puissante fonctionnalité qui permet d'automatiser des tâches complexes lors d'un scan, telles que :

  • L'énumération de services,

  • La détection de vulnérabilités,

  • L'exploitation de failles connues,

  • Ou même des attaques par force brute.

Les scripts sont écrits en Lua et sont classés par catégories selon leur usage.


📁 Catégories de Scripts NSE

Catégorie
Description

auth

Recherche d’identifiants valides (authentification).

broadcast

Découverte de services via broadcast.

brute

Attaque par force brute sur les services.

default

Scripts exécutés par défaut avec -sC.

discovery

Collecte d'informations sur les services disponibles.

dos

Tests de vulnérabilités DoS (rarement utilisés car destructifs).

exploit

Exploitation de vulnérabilités connues.

external

Utilisation de services externes.

fuzzer

Envoi de paquets aléatoires pour tester la robustesse des services.

intrusive

Scripts intrusifs pouvant impacter la cible.

malware

Vérifie si le système est infecté.

safe

Scripts sûrs, non destructifs.

version

Complément à la détection de version (-sV).

vuln

Recherche de vulnérabilités connues.


⚙️ Utilisation des scripts

▶ Scripts par défaut

sudo nmap <IP CIBLE> -sC

▶ Par catégorie

sudo nmap <IP CIBLE> --script vuln

▶ Scripts définis manuellement

sudo nmap <IP CIBLE> --script banner,smtp-commands

📬 Exemple sur le port SMTP (25)

sudo nmap 10.xx.xx.xx -p 25 --script banner,smtp-commands

📊 Résultat :

PORT   STATE SERVICE
25/tcp open  smtp
|_banner: 220 inlane ESMTP Postfix (Ubuntu)
|_smtp-commands: PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ...

✅ Ici, le script banner révèle que la cible utilise Postfix sur Ubuntu. ✅ Le script smtp-commands affiche les commandes SMTP activées — utile pour énumérer les utilisateurs par exemple.


🚀 Scan agressif -A

sudo nmap <IP CIBLE> -p 80 -A

🔍 Ce que fait l'option -A :

  • Détection de services (-sV)

  • Détection du système d’exploitation (-O)

  • Traceroute (--traceroute)

  • NSE par défaut (-sC)

📊 Résultat :

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-generator: WordPress 5.3.4
|_http-title: blog.inlanefreight.com

✅ On identifie ici :

  • Le serveur web : Apache 2.4.29

  • L'application utilisée : WordPress 5.3.4

  • L'OS supposé : Linux (96%)


🛡️ Évaluation de vulnérabilités (catégorie vuln)

sudo nmap <IP CIBLE> -p 80 -sV --script vuln

📊 Exemple de sortie :

| http-enum:
|   /wp-login.php: Possible admin folder
|   /: WordPress version: 5.3.4
| http-wordpress-users:
|   Username found: admin
| vulners:
|   cpe:/a:apache:http_server:2.4.29:
|     CVE-2019-0211  7.2  https://vulners.com/cve/CVE-2019-0211

✅ Le script vulners fournit les CVE connues pour les services détectés. ✅ http-enum et http-wordpress-users permettent d’énumérer les fichiers et utilisateurs WordPress.


💡 Astuces & Recommandations

  • Combine --script avec -sV pour améliorer la détection.

  • Utilise --script-help <nom> pour avoir la doc d’un script.

  • Tu peux créer tes propres scripts en Lua dans /usr/share/nmap/scripts/.


L’utilisation des scripts NSE transforme Nmap en véritable couteau suisse du pentester : détection, exploitation, analyse, tout est possible à condition de bien connaître les bons scripts à utiliser. 🛠️


Use NSE and its scripts to find the flag that one of the services contain and submit it as the answer.

Nous exécutons un scan via un script NSE dont voici le résultat :

$ nmap 10.xx.xx.xx --script http-enum -oA NSE

Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-18 11:25 CEST
Nmap scan report for 10.xx.xx.xx
Host is up (0.027s latency).
Not shown: 993 closed tcp ports (reset)
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
| http-enum: 
|_  /robots.txt: Robots file
110/tcp   open  pop3
139/tcp   open  netbios-ssn
143/tcp   open  imap
445/tcp   open  microsoft-ds
31337/tcp open  Elite

Nmap done: 1 IP address (1 host up) scanned in 499.40 seconds

Les résultats sont alors enregistrés dans les fichier NSE.*, cela est une bonne pratique vu plus tôt dans le module.

Nous récupérons donc le contenu du fichier /robots.txt :

$ curl 10.129.126.177/robots.txt
User-agent: *
Allow: /
HTB{873nniuc71bu6usbs1i96as6dsv26}

Nous obtenons alors le flag souhaité :

HTB{873nniuc71bu6usbs1i96as6dsv26}

Mis à jour