Objectif et version de référence#
Nmap ne se limite pas à demander « quels ports sont ouverts ? ». Il construit une observation depuis un point du réseau : quels hôtes répondent, comment leurs ports réagissent, quels protocoles semblent présents, quels services parlent réellement, quelles signatures de pile réseau sont visibles et quels contrôles filtrent les sondes.
Ce guide suit Nmap 7.991, publié le 6 août 2026 dans le changelog officiel. La référence Nmap reste la source normative pour chaque option. Les exemples doivent être exécutés uniquement sur des systèmes que vous administrez, un lab ou un périmètre explicitement autorisé.
Pipeline d’une analyse complète#
Chaque étape est optionnelle. Comprendre ce pipeline évite d’utiliser -A partout sans savoir quelles sondes sont réellement envoyées.
Les commandes quotidiennes à retenir#
# Découverte d'hôtes sur un réseau local
sudo nmap -sn -PR 192.168.56.0/24
# Scan TCP initial des 1 000 ports les plus fréquents
sudo nmap -sS -Pn -n --reason 192.168.56.10
# Tous les ports TCP avec une sortie réutilisable
sudo nmap -sS -Pn -n -p- --min-rate 1000 -oA scans/full-tcp 192.168.56.10
# Services et scripts par défaut sur les ports trouvés
sudo nmap -sV -sC -Pn -n -p 22,80,443 -oA scans/services 192.168.56.10
# UDP ciblé
sudo nmap -sU -Pn -n --top-ports 50 --version-intensity 2 192.168.56.10
Ces commandes sont des profils, pas des recettes universelles. Le débit, les ports et les scripts doivent être adaptés au réseau et à l’autorisation.
1. Lire correctement les états de ports#
Un état Nmap décrit ce que le scanner observe depuis sa position, pas une propriété absolue du service.
| État | Interprétation |
|---|---|
open | Une application accepte une connexion TCP ou des datagrammes UDP |
closed | L’hôte répond, mais aucun service n’écoute sur ce port |
filtered | Un filtre empêche Nmap de conclure |
unfiltered | Le port répond à la sonde, mais le scan ne distingue pas ouvert et fermé |
| `open | filtered` |
| `closed | filtered` |
L’option --reason affiche le paquet ou l’événement ayant conduit à la décision : syn-ack, reset, no-response, admin-prohibited, etc.
sudo nmap -sS --reason -p 22,80,443 192.168.56.10
2. Spécifier les cibles sans erreur#
| Syntaxe | Exemple |
|---|---|
| Hôte | 192.168.56.10 |
| CIDR | 192.168.56.0/24 |
| Plage | 192.168.56.10-40 |
| Plusieurs cibles | 192.168.56.10 192.168.56.20 |
| Fichier | -iL targets.txt |
| Exclusion | --exclude 192.168.56.1 |
| Fichier d’exclusion | --excludefile exclusions.txt |
| Cibles aléatoires | -iR 10 |
| IPv6 | -6 2001:db8::10 |
Avant un scan important, validez le périmètre sans envoyer de sonde aux hôtes :
nmap -sL -n -iL targets.txt
-sL effectue une liste. Sans -n, des requêtes DNS peuvent néanmoins être produites.
3. Découverte d’hôtes#
Comportement par défaut#
Sur un réseau Ethernet local, Nmap privilégié utilise généralement ARP pour IPv4 ou Neighbor Discovery pour IPv6. Cette méthode est plus fiable que l’ICMP pour savoir si un voisin local est présent.
Hors réseau local, la découverte IPv4 privilégiée par défaut combine :
- ICMP Echo Request ;
- TCP SYN vers 443 ;
- TCP ACK vers 80 ;
- ICMP Timestamp Request.
L’ancien article inversait les ports SYN et ACK. La combinaison correcte est documentée dans la section Host Discovery.
Options principales#
| Option | Fonction |
|---|---|
-sn | Découverte uniquement, sans scan de ports |
-Pn | Considère tous les hôtes comme actifs |
-PR | Découverte ARP sur le réseau local |
-PE | ICMP Echo Request |
-PP | ICMP Timestamp Request |
-PM | ICMP Address Mask Request |
-PS80,443 | TCP SYN ping sur les ports indiqués |
-PA80,443 | TCP ACK ping |
-PU53,161 | UDP ping |
-PY80 | SCTP INIT ping |
-PO1,2,4 | IP Protocol ping |
--disable-arp-ping | Désactive la découverte ARP implicite |
-Pn ne rend pas le scan plus furtif. Il supprime la découverte préalable et force Nmap à analyser chaque adresse, ce qui peut augmenter fortement le trafic.
4. Résolution DNS#
| Option | Effet |
|---|---|
-n | Aucune résolution inverse |
-R | Résolution inverse de toutes les cibles |
--system-dns | Utilise le résolveur système |
--dns-servers <liste> | Utilise des serveurs DNS précis |
Pour un CTF ou une mesure de performance reproductible, -n évite qu’une panne DNS ralentisse le scan. Pour un inventaire d’entreprise, les noms inverses peuvent au contraire fournir un contexte utile.
5. Sélectionner les ports#
nmap -p 22,80,443 TARGET
nmap -p 1-1024 TARGET
nmap -p- TARGET
nmap -p T:22,80,U:53,161 -sS -sU TARGET
nmap --top-ports 100 TARGET
nmap --port-ratio 0.01 TARGET
Points peu connus :
- le scan par défaut couvre les 1 000 ports TCP les plus fréquents du fichier
nmap-services, pas les ports 1 à 1 000 ; -Fréduit cette sélection aux 100 ports les plus fréquents ;-p-signifie 1 à 65 535 ; pour inclure explicitement le port 0, utiliser-p0-65535;-rimpose un ordre séquentiel au lieu de l’ordre pseudo-aléatoire habituel.
6. Choisir la technique de scan#
Scans courants#
| Option | Principe | Usage réaliste |
|---|---|---|
-sS | SYN sans finaliser la connexion | TCP rapide avec privilèges |
-sT | Appel système connect() | Sans privilèges, proxy TCP, IPv6 selon plateforme |
-sU | Sondes UDP et analyse ICMP | DNS, SNMP, NTP, VPN et services UDP |
-sA | ACK | Cartographie de filtrage, pas détection d’ouverture |
-sW | Fenêtre TCP sur réponses RST | Cas particuliers de piles TCP |
-sN | Aucun flag TCP | Test historique hors Windows |
-sF | Flag FIN | Même famille que NULL/Xmas |
-sX | FIN, PSH et URG | Même famille que NULL/FIN |
Scans spécialisés#
| Option | Description | Limites modernes |
|---|---|---|
-sM | FIN/ACK, comportement historique BSD | Souvent peu discriminant aujourd’hui |
-sI ZOMBIE | Idle scan via l’IP ID d’un tiers | Nécessite un zombie prévisible et une autorisation claire |
-sO | Protocoles IP, pas ports TCP/UDP | Recherche ICMP, GRE, ESP, etc. |
-sY | SCTP INIT | Réseaux SCTP |
-sZ | SCTP COOKIE-ECHO | Ne distingue pas toujours ouvert et filtré |
-b FTP_RELAY | FTP bounce historique | Rarement supporté |
--scanflags | Flags TCP personnalisés | Interprétation manuelle nécessaire |
La documentation officielle des techniques insiste sur le choix de l’outil adapté. Les scans FIN, NULL et Xmas ne sont pas des méthodes magiques de contournement : les piles Windows répondent différemment et les contrôles modernes détectent facilement ces motifs.
SYN scan sur le fil#
7. UDP sans attendre des heures#
Un port UDP ouvert ne répond souvent pas à une sonde vide. L’absence de réponse devient open|filtered. La détection de version peut envoyer une sonde protocolaire et transformer ce résultat en open.
Approche progressive :
# Étape 1 : ports UDP fréquents, intensité faible
sudo nmap -sU -Pn -n --top-ports 50 \
--version-intensity 2 --max-retries 2 TARGET
# Étape 2 : validation ciblée
sudo nmap -sU -sV -Pn -n -p 53,67,68,69,123,137,161,500,4500 TARGET
N’augmentez pas aveuglément --min-rate sur un réseau fragile. Les réponses ICMP peuvent être limitées, ce qui crée des faux open|filtered.
8. Détection de services et de versions#
-sV consulte nmap-service-probes, envoie des sondes applicatives et compare les réponses à des expressions de signature.
sudo nmap -sV -p 22,80,443 TARGET
sudo nmap -sV --version-light TARGET
sudo nmap -sV --version-all TARGET
sudo nmap -sV --version-intensity 4 TARGET
| Option | Effet |
|---|---|
--version-intensity 0-9 | Nombre de sondes essayées |
--version-light | Alias pratique pour l’intensité 2 |
--version-all | Toutes les sondes, intensité 9 |
--version-trace | Détail des échanges de détection |
--allports | Inclut les ports normalement exclus de -sV |
Une bannière est une donnée déclarative. Elle peut être modifiée ou masquée. Confirmez un produit par plusieurs indices : protocole, réponses, certificats, en-têtes et comportement.
9. Détection d’OS et distance réseau#
sudo nmap -O --osscan-limit --reason TARGET
sudo nmap -O --osscan-guess TARGET
sudo nmap --traceroute TARGET
La détection d’OS est plus fiable lorsqu’au moins un port TCP ouvert et un port fermé sont disponibles. --osscan-limit évite de dépenser du temps sur les hôtes qui ne remplissent pas ces conditions. --osscan-guess affiche des correspondances moins certaines : ce n’est pas une preuve.
-A active simultanément la détection d’OS, de versions, les scripts par défaut et traceroute. Il ne signifie pas « tous les ports » et peut être beaucoup plus intrusif qu’un scan initial.
10. Nmap Scripting Engine#
NSE exécute des scripts Lua après ou pendant certaines phases. La documentation actuelle référence des centaines de scripts dans le portail NSEDoc.
Catégories officielles#
auth, broadcast, brute, default, discovery, dos, exploit, external, fuzzer, info, intrusive, malware, safe, version et vuln.
Certaines catégories peuvent modifier une cible, tester des mots de passe ou provoquer un déni de service. Le nom vuln ne signifie pas automatiquement « lecture seule ».
Sélection et expressions#
# Scripts par défaut
nmap -sC -sV -p 80,443 TARGET
# Scripts HTTP sûrs, hors scripts intrusifs
nmap --script 'http-* and safe and not intrusive' -p 80,443 TARGET
# Aide avant exécution
nmap --script-help http-title
nmap --script-help 'vuln and not intrusive'
Arguments et diagnostic#
nmap --script http-enum \
--script-args http-enum.basepath=/app/ \
-p 80 TARGET
nmap --script http-title --script-trace -p 80 TARGET
nmap --script-updatedb
Utilisez --script-args-file pour éviter d’exposer des paramètres sensibles dans l’historique du shell. Ne placez jamais de secrets dans les sorties destinées au dépôt Git.
11. Timing et performance#
Modèles -T0 à -T5#
| Modèle | Nom | Interprétation pratique |
|---|---|---|
-T0 | Paranoid | Extrêmement lent, une sonde à la fois |
-T1 | Sneaky | Très lent |
-T2 | Polite | Réduit l’utilisation de bande passante |
-T3 | Normal | Valeur par défaut |
-T4 | Aggressive | Réseau fiable et rapide |
-T5 | Insane | Risque élevé de pertes et faux négatifs |
La vitesse vient d’abord de la réduction du périmètre : moins d’hôtes, moins de ports, pas de DNS inutile et détection de version séparée.
Réglages fins#
| Option | Rôle |
|---|---|
--min-rate, --max-rate | Cadre le débit global de paquets |
--max-retries | Limite les retransmissions |
--host-timeout | Abandonne un hôte après un délai |
--scan-delay | Délai minimal entre sondes |
--max-scan-delay | Limite l’adaptation du délai |
--min-hostgroup, --max-hostgroup | Taille des groupes d’hôtes |
--min-parallelism, --max-parallelism | Parallélisme des sondes |
--initial-rtt-timeout | Estimation RTT initiale |
--min-rtt-timeout, --max-rtt-timeout | Bornes RTT adaptatives |
--defeat-rst-ratelimit | Ignore certains ports fermés limités par RST |
--defeat-icmp-ratelimit | Accélère certains scans UDP au prix de précision |
--min-rate impose un plancher. Si le réseau ne suit pas, Nmap peut sacrifier la précision ou accumuler des paquets. Commencez avec une valeur mesurée sur le lab.
12. Sorties professionnelles et reproductibles#
mkdir -p scans
sudo nmap -sS -sV -Pn -n -p- \
--reason --stats-every 15s \
-oA scans/target-20260827 TARGET
| Option | Format |
|---|---|
-oN fichier | Sortie normale |
-oX fichier | XML structuré |
-oG fichier | Grepable historique |
-oS fichier | Script kiddie, décoratif |
-oA base | Normal, XML et grepable |
--append-output | Ajoute au lieu d’écraser |
--resume fichier.nmap | Reprend certains scans interrompus |
--stylesheet | Feuille XSL pour XML |
--webxml | Référence XSL hébergée par Nmap |
--no-stylesheet | Retire la déclaration XSL |
Pour l’automatisation, parsez le XML. La sortie normale est destinée à l’humain et peut varier. ndiff compare deux XML :
ndiff baseline.xml current.xml
Conservez avec le résultat : version de Nmap, date, source du scan, commande, périmètre et éventuelles pertes réseau.
13. Verbosité, débogage et interaction pendant le scan#
| Option | Effet |
|---|---|
-v, -vv | Plus de résultats pendant le scan |
-d, -dd | Débogage interne |
--packet-trace | Paquets envoyés et reçus |
--version-trace | Détection de version |
--script-trace | Communications NSE |
--stats-every 10s | Statistiques périodiques |
--reason | Motif de chaque état |
Pendant un scan interactif, Nmap accepte notamment v/V pour la verbosité, d/D pour le débogage et p/P pour activer ou désactiver le packet trace. Appuyer sur une autre touche affiche une ligne de statut.
14. IPv6, interfaces et routes#
nmap -6 -sT -p 22,80,443 2001:db8::10
nmap --iflist
sudo nmap -e eth1 -S 192.0.2.10 TARGET
-6active IPv6 ;--iflistaffiche interfaces et routes vues par Nmap ;-eimpose une interface ;-Simpose une adresse source, mais les réponses doivent pouvoir revenir ;--send-ethet--send-ipcontrôlent le niveau d’émission sur certaines plateformes.
Un mauvais choix de route ou d’adresse source produit souvent des résultats filtered trompeurs.
15. Proxys et pivots#
Le scan via proxy est limité par la technique de connexion.
proxychains4 nmap -sT -Pn -n -p 22,80,443 172.16.20.15
-sS, UDP, détection d’OS et sondes ICMP utilisent des paquets bruts et ne traversent pas un simple SOCKS via ProxyChains. Nmap possède aussi --proxies, mais son support ne couvre pas toutes les phases. Testez la résolution DNS et vérifiez qu’aucune connexion directe ne quitte l’interface.
16. Options avancées de paquets et filtrage#
Ces options servent à comprendre un chemin réseau ou à tester des contrôles dans un environnement autorisé. Elles ne garantissent pas un contournement.
| Option | Fonction |
|---|---|
-f | Fragmente les paquets IP en petits fragments |
--mtu N | Taille de fragment multiple de 8 |
-D RND:5,ME | Ajoute des leurres à certaines sondes |
-S IP | Usurpe l’adresse source |
-e IFACE | Force l’interface |
-g PORT, --source-port | Port source choisi |
--spoof-mac | Adresse MAC imposée sur le LAN |
--data-length N | Ajoute des octets aléatoires |
--data HEX | Ajoute une charge hexadécimale |
--data-string TEXTE | Ajoute une chaîne |
--ttl N | TTL IPv4 |
--ip-options | Options d’en-tête IPv4 |
--badsum | Checksums invalides |
--scanflags | Flags TCP personnalisés |
Limites importantes :
- la fragmentation peut être réassemblée par un pare-feu ou ignorée par le chemin ;
- les leurres ne masquent pas tous les autres échanges comme DNS, version detection ou NSE ;
- l’usurpation d’IP empêche généralement de recevoir les réponses ;
--badsumsert surtout à distinguer une réponse générée par un intermédiaire d’une pile hôte conforme ;- les réseaux cloud et virtualisés peuvent filtrer ces paquets avant la cible.
17. Fichiers de données qui expliquent les résultats#
| Fichier | Contenu |
|---|---|
nmap-services | Fréquence et noms de ports |
nmap-service-probes | Sondes et signatures de versions |
nmap-os-db | Empreintes de systèmes d’exploitation |
nmap-mac-prefixes | Constructeurs par préfixe MAC |
nmap-protocols | Numéros de protocoles IP |
scripts/ | Scripts NSE |
nselib/ | Bibliothèques Lua NSE |
scripts/script.db | Index des scripts et catégories |
--datadir permet d’utiliser un répertoire de données personnalisé. Nmap recherche aussi certains fichiers dans le répertoire utilisateur et le répertoire système. Une base obsolète explique parfois une détection moins précise que sur une autre machine.
nmap --version
nmap --datadir ./nmap-data -sV TARGET
18. Workflow CTF progressif#
Étape A : surface TCP rapide#
sudo nmap -sS -Pn -n -p- --min-rate 1500 \
--max-retries 2 -oA scans/full TARGET
Étape B : analyse des ports confirmés#
sudo nmap -sV -sC -Pn -n --reason \
-p 22,80,443 -oA scans/detail TARGET
Étape C : scripts ciblés après lecture de l’aide#
nmap --script-help 'http-* and safe'
sudo nmap --script 'http-title,http-headers,http-methods' \
-Pn -n -p 80,443 TARGET
Étape D : UDP priorisé#
sudo nmap -sU -sV -Pn -n --top-ports 30 \
--version-intensity 2 -oA scans/udp TARGET
Étape E : lecture croisée#
Comparer Nmap avec une connexion manuelle, un navigateur, curl, openssl s_client, dig ou le client natif du protocole. Nmap oriente l’énumération ; il ne remplace pas la validation.
19. Cas d’usage défensif : inventaire différentiel#
Créer une référence puis la comparer périodiquement :
nmap -sT -sV -Pn -n -iL assets.txt -oX baseline.xml
nmap -sT -sV -Pn -n -iL assets.txt -oX current.xml
ndiff baseline.xml current.xml
À surveiller : nouveau port, service disparu, changement de certificat, version différente, filtrage modifié ou nouvel hôte. Un changement n’est pas automatiquement un incident, mais il doit être attribuable à une modification connue.
20. Erreurs fréquentes à éviter#
- lancer
-A -p- --script vulnsans phase de cadrage ; - interpréter
filteredcomme « aucun service » ; - oublier UDP ;
- croire qu’un SYN scan est invisible ;
- augmenter
--min-ratejusqu’à perdre les réponses ; - utiliser
-Pnsur un très grand CIDR sans nécessité ; - confondre bannière et preuve de version ;
- exécuter des catégories NSE intrusives sans lire leur documentation ;
- scanner via SOCKS avec
-sSou-sU; - ne sauvegarder que la sortie du terminal ;
- comparer des scans réalisés depuis des points réseau différents comme s’ils étaient équivalents.
Mémo final#
| Objectif | Commande de départ |
|---|---|
| Hôtes locaux | sudo nmap -sn -PR CIDR |
| TCP initial | sudo nmap -sS -Pn -n TARGET |
| Tous ports TCP | sudo nmap -sS -Pn -n -p- TARGET |
| Services | sudo nmap -sV -sC -p PORTS TARGET |
| UDP courant | sudo nmap -sU --top-ports 50 TARGET |
| OS | sudo nmap -O --osscan-limit TARGET |
| Raisons | --reason |
| Sorties | -oA scans/name |
| Proxy SOCKS | proxychains4 nmap -sT -Pn -n -p PORTS TARGET |
| Comparaison | ndiff old.xml new.xml |

