Aller au contenu

Nmap pour cartographier un réseau, des hôtes aux services exposés

Nmap pour cartographier un réseau, des hôtes aux services exposés

Section intitulée « Nmap pour cartographier un réseau, des hôtes aux services exposés »

nmap envoie des paquets à des adresses IP (Internet Protocol) et déduit de ce qui revient, ou ne revient pas, quelles machines existent, quels ports répondent et quels logiciels écoutent derrière. C’est l’outil de cartographie réseau de référence, pour l’attaquant comme pour celui qui défend. Sa sortie se lit vite et se croit trop facilement : un résultat nmap décrit un chemin réseau à un instant donné, pas la vérité d’une machine.

→ Lire l’explication complète de la marmotte

À quoi sert nmap, qui l’édite et sous quelle licence

Section intitulée « À quoi sert nmap, qui l’édite et sous quelle licence »

nmap répond à trois questions, dans cet ordre : qu’est-ce qui est allumé, qu’est-ce qui écoute, qu’est-ce qui tourne. Tout le reste (détection du système d’exploitation, scripts, traceroute) vient se greffer sur ces trois étapes.

Le projet est édité par Gordon Lyon (alias Fyodor) et le Nmap Project. Le code est publié sous la NPSL (Nmap Public Source License), une licence fondée sur la GPL (GNU General Public License) version 2 et complétée de clauses propres au projet. Conséquence pratique : l’usage interne est libre, mais embarquer nmap dans un produit propriétaire redistribué demande une licence commerciale distincte, vendue par l’éditeur. Les éditeurs de scanners de vulnérabilités le savent ; les équipes qui bricolent une appliance maison, moins souvent.

La distribution inclut des compagnons qui servent : Ncat (connexions réseau à la main), Nping (forge de paquets), Ndiff (comparaison de deux scans) et Zenmap (interface graphique).

Prérequis de plateforme : les modes de scan qui forgent des paquets exigent les droits root (ou des capacités équivalentes sur les sockets brutes) sous Linux, et le pilote de capture Npcap sous Windows. Sans privilèges, nmap fonctionne, mais dans un mode dégradé décrit plus bas, et ne prévient pas spécialement qu’il voit moins bien.

On le sort dans quatre situations : vérifier ce qu’une règle de pare-feu laisse réellement passer, inventorier un sous-réseau dont la documentation relève de la tradition orale, préparer ou recouper un test d’intrusion, et contrôler qu’une sonde de détection voit bien ce qu’elle prétend voir.

Découverte d’hôtes : décider quelles adresses méritent un scan

Section intitulée « Découverte d’hôtes : décider quelles adresses méritent un scan »

Scanner 65 535 ports sur chaque adresse d’une plage où neuf adresses sur dix sont vides, c’est long. nmap commence donc par trier les adresses vivantes.

Sur le segment local, il utilise ARP (Address Resolution Protocol) : une machine qui veut communiquer en IPv4 est obligée d’y répondre, pare-feu local ou pas. C’est la découverte la plus fiable qui existe, et elle ne fonctionne que sur le même domaine de diffusion.

Au-delà d’un routeur, nmap lancé avec privilèges envoie par défaut quatre sondes : une requête d’écho ICMP (Internet Control Message Protocol), un SYN (synchronize) TCP (Transmission Control Protocol) vers le port 443, un ACK (acknowledge) TCP vers le port 80 et une requête d’horodatage ICMP. Une seule réponse suffit à déclarer l’hôte vivant. Sans privilèges, il se rabat sur des tentatives de connexion vers les ports 80 et 443.

Le piège est là : un hôte qui ne répond à aucune de ces sondes est déclaré éteint, et ses ports ne sont jamais scannés. Un serveur qui n’expose que le port 22 derrière un pare-feu muet disparaît de la carte. L’option -Pn supprime cette étape et traite chaque adresse comme vivante ; on paie en temps, puisque chaque adresse vide subit un scan complet jusqu’à expiration des délais.

Position à tenir : -Pn sur une liste d’hôtes connue et courte, découverte ajustée (sondes -PS ou -PA vers des ports choisis) sur les grandes plages. Et l’option -n, qui coupe la résolution DNS (Domain Name System) inverse, sauf besoin explicite des noms : elle accélère le scan et évite d’annoncer ses intentions au serveur de noms de la cible.

Scan de ports et états rendus : ouvert, fermé, filtré

Section intitulée « Scan de ports et états rendus : ouvert, fermé, filtré »

Le scan par défaut avec privilèges est le SYN scan (-sS) : nmap envoie le premier paquet d’une ouverture de connexion TCP, lit la réponse, et n’achève jamais la poignée de main. Le schéma suivant montre comment chaque type de réponse devient un état.

Schéma de séquence entre trois acteurs : le scanner, un pare-feu et la cible. Le scanner envoie un SYN vers le port testé de la cible. Quatre réponses possibles reviennent au scanner, chacune donnant un état. La cible répond SYN/ACK si un service écoute : état open. La cible répond RST si la machine est joignable et que rien n'écoute : état closed. Le pare-feu renvoie un message ICMP d'inaccessibilité en cas de rejet explicite : état filtered. Le pare-feu ne renvoie rien si le paquet est jeté, après retransmissions : état filtered également.

Trois états à ne pas confondre :

  • open : un service a accepté l’ouverture. C’est la surface d’attaque.
  • closed : la machine a répondu par un RST (reset). Rien n’écoute, mais le paquet est arrivé jusqu’à elle : le chemin est ouvert, et le jour où un service démarre sur ce port, il sera exposé sans qu’aucune règle ne change.
  • filtered : aucune réponse exploitable. Un équipement a jeté ou rejeté le paquet, et nmap ne sait rien de ce qu’il y a derrière.

Un port fermé est donc une information de filtrage plus inquiétante qu’un port filtré. Vingt ans de revues de pare-feu apprennent que la règle « tout autoriser vers ce serveur, de toute façon il n’écoute que sur le 443 » survit toujours au serveur pour lequel elle a été écrite.

Sans privilèges, nmap bascule sur le scan par connexion complète (-sT), qui passe par l’appel système ordinaire. Il est plus lent et, surtout, il termine la poignée de main : la connexion apparaît dans les journaux applicatifs de la cible, là où le SYN scan ne laisse de trace que sur le réseau.

UDP (User Datagram Protocol) se scanne avec -sU et se comporte autrement, faute de poignée de main : une réponse applicative donne open, un message ICMP « port inaccessible » donne closed, et le silence donne open|filtered, c’est-à-dire « aucune idée ». Comme beaucoup de systèmes limitent leurs messages ICMP d’erreur à environ un par seconde, un scan UDP complet d’une seule machine se compte en heures. On cible donc une courte liste de ports (53, 123, 161, 500 selon le contexte) et on y ajoute la détection de version, qui envoie des charges propres à chaque protocole et lève une partie de l’ambiguïté. Les mécanismes sous-jacents sont détaillés dans la page sur les comportements d’UDP et de TCP.

Dernier point de périmètre : sans option, nmap teste les 1 000 ports TCP les plus fréquents, pas les 65 535. Un service d’administration posé sur un port exotique passe au travers. Pour un inventaire d’exposition, c’est -p- ou rien.

Détection de services et de versions, scripts NSE

Section intitulée « Détection de services et de versions, scripts NSE »

Sans option de détection, le nom de service affiché à côté d’un port vient d’une table de correspondance : le port 443 s’appelle « https » parce que le fichier le dit, pas parce que quelqu’un a vérifié. Un serveur SSH (Secure Shell) déplacé sur le port 443 sera étiqueté https sans le moindre scrupule.

L’option -sV corrige cela : nmap ouvre une vraie connexion, écoute la bannière, envoie des sondes tirées de sa base et compare les réponses à des signatures. Le résultat nomme le produit et souvent sa version. Deux réserves s’imposent. La version annoncée est déclarative : les distributions rétroportent les correctifs de sécurité sans changer le numéro, donc une version « vulnérable » ne prouve pas la vulnérabilité, et une bannière se maquille en une ligne de configuration. Et la détection est bavarde : elle établit des connexions complètes et envoie des charges que certains services fragiles digèrent mal.

Le NSE (Nmap Scripting Engine) exécute des scripts écrits en Lua contre les ports trouvés. Les scripts sont rangés par catégories, dont default, safe, discovery, version, auth, vuln, brute, intrusive, exploit et dos. L’option -sC lance la catégorie default ; --script sélectionne un script ou une catégorie. Des scripts comme ssl-cert (certificat présenté) ou ssl-enum-ciphers (suites cryptographiques acceptées en TLS, Transport Layer Security) rendent des services réels à un architecte.

Les catégories ne sont pas décoratives : brute peut verrouiller des comptes, dos et exploit font ce que leur nom annonce, intrusive peut faire tomber un service. Lancer « tous les scripts pour voir » sur un environnement de production est une façon originale de transformer un inventaire en incident. Hors mandat explicite, on reste sur default et safe.

L’option -O tente d’identifier le système d’exploitation à partir du comportement de la pile réseau ; -A regroupe détection de système, versions, scripts par défaut et traceroute. Pratique en laboratoire, trop bruyant ailleurs.

Ce qu’un scan nmap révèle et ce qu’un pare-feu fausse

Section intitulée « Ce qu’un scan nmap révèle et ce qu’un pare-feu fausse »

Un scan mesure la conversation entre un point de départ et une cible, équipements intermédiaires compris. Changer le point de départ change la réponse. La topologie suivante montre les deux positions à comparer : le scanner externe ne voit que ce que le pare-feu traduit, le scanner interne voit tout ce que le serveur écoute.

Topologie à deux positions de scan. À gauche, dans la zone Internet (scan externe), le poste Scanner-ext 198.51.100.10 envoie des SYN vers 203.0.113.1, ports 1-65535, jusqu'au pare-feu FW 203.0.113.1. Le pare-feu ne traduit que les ports 80 et 443 vers le serveur Web 192.168.10.20, atteint par le commutateur de la zone exposée 192.168.10.0/24. Dans cette même zone, le poste Scanner-int 192.168.10.50 passe par le commutateur et envoie au serveur Web des SYN directs, sans filtrage intermédiaire.

Depuis l’extérieur, on obtient l’exposition réelle, filtrage et NAT (Network Address Translation, traduction d’adresses) compris. Depuis l’intérieur, on obtient ce que la machine offre, donc ce qu’un attaquant atteindra le jour où il aura pris pied sur le segment. Les deux scans sont nécessaires ; l’écart entre les deux mesure ce que le pare-feu fait vraiment, par opposition à ce que son jeu de règles raconte.

Quatre façons dont un équipement intermédiaire fausse le résultat :

  • Le silence. Un pare-feu qui jette les paquets rend tous les ports filtered et allonge le scan, chaque sonde attendant son délai avant retransmission.
  • Les réponses usurpées. Certains équipements répondent à la place de la cible : un RST forgé fait passer un port filtré pour fermé ; un mandataire de poignée de main (protection contre l’inondation de SYN) renvoie un SYN/ACK sur tous les ports, et la machine semble tout exposer. La détection de version tranche : derrière un faux port ouvert, aucune application ne répond, et nmap affiche typiquement tcpwrapped.
  • La limitation de débit. Au-delà d’un seuil, l’équipement cesse de répondre ou bloque la source. Les ports testés ensuite apparaissent filtrés alors qu’ils ne le sont pas, et rien dans la sortie ne signale le basculement.
  • Le filtrage par source. Une règle qui n’autorise que certaines adresses rend le scan dépendant de l’adresse du scanner : le résultat vaut pour cette source, et pour elle seule.

L’option --reason affiche le type de réponse qui a motivé chaque état ; elle devrait être systématique, puisqu’elle distingue un silence d’un rejet ICMP. Un résultat surprenant se recoupe avec un second scan plus lent, depuis une autre source, avant d’atterrir dans un rapport.

Les adresses ci-dessous sont des adresses privées ou de documentation ; pour s’exercer sans mandat, le projet met à disposition l’hôte scanme.nmap.org, dont le scan modéré est autorisé par l’éditeur.

Inventorier un segment local. Découverte seule, sans scan de ports, sans résolution de noms :

Fenêtre de terminal
# -sn : découverte d'hôtes uniquement ; -n : pas de résolution DNS inverse
sudo nmap -sn -n 192.168.10.0/24

Mesurer l’exposition externe d’une adresse. Tous les ports TCP, débit plafonné pour ne pas déclencher la limitation en face, motif de chaque état, sortie dans les trois formats :

Fenêtre de terminal
# -p- : ports 1 à 65535 ; --max-rate : plafond en paquets par seconde
# -Pn : pas de découverte, l'hôte est connu ; -oA : sorties normale, XML et grepable
sudo nmap -sS -Pn -n -p- --max-rate 500 --reason -oA externe-203.0.113.1 203.0.113.1

Qualifier ce qui répond. Détection de version et scripts par défaut, sur les seuls ports trouvés ouverts à l’étape précédente :

Fenêtre de terminal
# -sV : versions ; -sC : scripts de la catégorie default
sudo nmap -sV -sC -Pn -n -p 22,443 -oA services-203.0.113.1 203.0.113.1
# Suites TLS acceptées sur le port 443
nmap -Pn -n -p 443 --script ssl-enum-ciphers 203.0.113.1

Suivre la dérive dans le temps. C’est l’usage qui rapporte le plus au défenseur : comparer le scan du jour à un état de référence et ne lire que les différences.

Fenêtre de terminal
# Compare deux sorties XML (eXtensible Markup Language) et liste les écarts
ndiff reference.xml externe-203.0.113.1.xml

Un port qui apparaît entre deux scans sans demande de changement correspondante est soit une erreur, soit pire. Dans les deux cas, quelqu’un doit l’expliquer.

Détecter un scan nmap : journaux de pare-feu et IDS

Section intitulée « Détecter un scan nmap : journaux de pare-feu et IDS »

Un scan de ports est l’un des événements les plus faciles à voir sur un réseau, à condition de regarder. Le schéma décrit les deux chaînes de détection : les journaux du pare-feu d’un côté, la sonde IDS (Intrusion Detection System, système de détection d’intrusion) de l’autre.

Schéma de deux chaînes de détection partant d'une même source unique et aboutissant à une alerte. Première chaîne : la source envoie des SYN vers de nombreux ports distincts en peu de temps au pare-feu ; si la journalisation des refus est activée, il écrit une ligne de refus par port dans les journaux ; la corrélation compte les ports distincts par source et par fenêtre de temps, puis déclenche l'alerte quand le seuil est dépassé et que la source est hors liste des scanners autorisés. Seconde chaîne : la sonde IDS voit les mêmes paquets sur le lien en écoute et déclenche l'alerte sur signature de scan ou seuil de débit atteint.

Côté journaux, la signature est comportementale : une source, beaucoup de ports ou beaucoup d’hôtes, des refus en rafale. Elle suppose que les refus soient journalisés, ce qui n’est pas le cas partout, pour des raisons de volume. Côté IDS, un moteur comme Suricata dispose de jeux de règles publics comportant une catégorie consacrée aux scans, et peut compter les événements par source avec des seuils. Certains marqueurs sont offerts : les scripts NSE qui parlent HTTP (HyperText Transfer Protocol) s’annoncent par défaut avec un agent utilisateur mentionnant « Nmap Scripting Engine », et les sondes de détection de version sont reconnaissables. Le déploiement d’une sonde est décrit dans le guide Suricata, la lecture de ce qu’elle remonte dans la page sur les menaces réseau et leur détection.

Ce que cette détection ne garantit pas : un scan étalé (gabarits -T0 ou -T1, quelques ports par heure) passe sous tout seuil raisonnable, un scan réparti sur de nombreuses sources aussi, et l’agent utilisateur se modifie. Détecter nmap, c’est détecter l’attaquant pressé ou négligent. Cela reste rentable, les deux espèces étant abondantes.

Côté interne, le signal vaut de l’or : un poste bureautique qui balaie son propre sous-réseau n’a aucune raison légitime de le faire. Sur Internet, en revanche, le scan est un bruit de fond permanent ; alerter sur chaque balayage externe revient à sonner l’alarme chaque fois qu’il pleut.

Ce que nmap ne garantit pas :

  • L’exhaustivité. Ports hors liste par défaut, hôtes muets écartés à la découverte, UDP ambigu, IPv6 impossible à balayer par force brute : chaque angle mort est silencieux.
  • La vulnérabilité. Une version détectée et un script de la catégorie vuln donnent des indices, pas un diagnostic. Le scanner de vulnérabilités authentifié et la revue de configuration restent nécessaires ; le test d’intrusion aussi, cadré comme le décrit la page commander et exploiter un test d’intrusion.
  • La couche applicative. Un port 443 ouvert ne dit rien des vingt applications servies derrière le même mandataire inverse selon le nom demandé.
  • La durée de validité. Un scan vaut pour l’instant où il a tourné.

Le compromis central tient en une ligne : vitesse contre fiabilité. Un scan rapide perd des paquets, déclenche les limitations et rend des faux « filtrés » ; un scan lent est exact et occupe la nuit. Pour un inventaire défensif, la recommandation est tranchée : tous les ports TCP, débit plafonné, deux points de vue (interne et externe), sortie XML conservée et comparée. La discrétion n’a aucun intérêt quand on scanne son propre réseau ; l’exactitude, si.

Conditions d’exploitation à prévoir :

  • Le scanner est une cible. nmap tourne avec les droits root et analyse des réponses fournies par des machines potentiellement hostiles ; les scripts NSE sont du code exécuté avec ces mêmes droits. On le tient à jour, on ne charge pas de scripts tiers non relus, et la machine de scan est durcie et dédiée.
  • Les résultats sont sensibles. Un fichier de sortie est une carte de la surface d’attaque, versions comprises. Il se stocke avec des droits restreints et une durée de conservation définie, pas dans un partage commun.
  • L’exemption de détection est un risque. Placer l’adresse du scanner en liste blanche de l’IDS évite le bruit, et crée une adresse depuis laquelle tout scan est invisible. Mieux vaut étiqueter les alertes que les supprimer, et vérifier que les fenêtres de scan correspondent au calendrier prévu.
  • Les équipements fragiles existent. Imprimantes, automates et vieux boîtiers embarqués supportent mal la détection de version et les scripts. Sur ces périmètres, découverte et scan de ports seuls, à débit réduit.

D’autres fiches de la même famille sont regroupées dans la rubrique Outils.

On ne scanne que ce qu’on a le droit de tester : périmètre défini, accord écrit du responsable du système, dates et adresses sources consignées. Cette règle ne souffre aucune exception du type « c’était juste pour vérifier ».

En France, le texte de référence est le code pénal, articles 323-1 et suivants. L’article 323-1 réprime l’accès ou le maintien frauduleux dans un système de traitement automatisé de données ; l’article 323-2, le fait d’entraver ou de fausser son fonctionnement, ce qu’un scan agressif ou un script de la catégorie dos peut produire ; l’article 323-3-1, la détention ou la mise à disposition, sans motif légitime, d’outils conçus pour commettre ces infractions ; l’article 323-7 punit la tentative des mêmes peines. Les quanta de peine figurent dans le texte en vigueur sur Légifrance, seule source à citer. La qualification d’un scan donné relève du juge et du conseil d’un avocat, pas d’une fiche d’outil.

Deux angles morts reviennent souvent. L’accord du client ne vaut pas accord de son hébergeur : les fournisseurs d’infrastructure ont leurs propres conditions sur les tests, à lire avant le premier paquet. Et une adresse IP mal recopiée dans un périmètre désigne le système de quelqu’un d’autre, qui n’a rien signé.

Sans scan régulier de son propre périmètre, la seule description de l’exposition reste la configuration déclarée : règles de pare-feu, inventaire, schémas. Aucun de ces documents ne répond aux paquets. Un service démarré par l’installation d’un paquet logiciel, une règle temporaire jamais retirée ou une traduction d’adresse oubliée restent invisibles jusqu’à ce qu’un tiers les trouve, ce que les balayages permanents d’Internet font sans relâche. On perd aussi le point de comparaison : sans état de référence daté, impossible de dire depuis quand un port répond, donc de borner une investigation. Enfin, les règles de détection ne sont jamais éprouvées : une sonde qui n’a jamais vu passer un scan connu n’a jamais prouvé qu’elle le voyait.

nmap envoie de petits messages aux machines d’un réseau et classe ce qui revient. Première étape : repérer quelles adresses correspondent à une machine allumée, en leur envoyant plusieurs messages différents et en notant celles qui répondent. Deuxième étape : pour chaque machine trouvée, envoyer un message à chacun de ses points d’entrée numérotés, qu’on appelle des ports. Une réponse positive signifie qu’un programme écoute ; un refus net signifie que la machine est joignable mais que rien n’écoute ; un silence signifie qu’un équipement de filtrage, placé sur le chemin, a jeté le message. Troisième étape : sur les entrées ouvertes, nmap engage un début de conversation pour identifier le programme et sa version, puis peut lancer de petits programmes complémentaires qui posent des questions plus précises. Tout dépend de l’endroit d’où part le test : depuis l’extérieur, on voit ce que le filtrage laisse passer ; depuis l’intérieur, on voit ce que les machines offrent réellement. Quand le filtrage ralentit, se tait ou répond à la place des machines, le résultat devient faux sans prévenir, d’où la nécessité de recouper. Celui qui protège un réseau s’en sert pour comparer la liste de ce qui devrait répondre avec ce qui répond vraiment. Ces tests laissent des traces dans les journaux du filtrage et déclenchent les sondes de surveillance. Enfin, la loi interdit de tester un réseau sans l’accord écrit de son responsable.

À lire aussi

Pages voisines

: les deux pages se citent l’une l’autre.