Nmap, l’outil pour cartographier et évaluer la sécurité d’un réseau

Introduction

Quand il s’agit de cartographier un réseau, un nom revient systématiquement : Nmap. Incontournable dans le monde de la cybersécurité, ce véritable couteau suisse de la reconnaissance réseau s’impose comme l’outil de prédilection pour identifier les services exposés, détecter les ports ouverts, et poser les bases d’un test d’intrusion de réseau interne efficace.

Dans un contexte où les infrastructures deviennent toujours plus hybrides et complexes, la capacité à visualiser avec précision les systèmes accessibles est plus cruciale que jamais. À ce titre, Nmap reste la référence.

Grâce à ses multiples fonctionnalités, il permet non seulement de scanner des hôtes, mais aussi de détecter les versions logicielles, d’identifier les systèmes d’exploitation, ou encore d’observer les réactions des pare-feu ou IDS en place.

Dans cet article, nous illustrerons le principe de la reconnaissance réseau (cartographie et découverte) à travers la présentation détaillée, cas concrets à l’appui, du fonctionnement et des fonctionnalités de Nmap.

Guide complet sur Nmap

Nmap : principes et fonctionnement

Nmap, abréviation de Network Mapper, est un outil open source incontournable dans le monde de la cybersécurité. Disponible en ligne de commande et via une interface graphique (Zenmap), il fonctionne sur la plupart des systèmes d’exploitation.

Nmap est généralement utilisé pour collecter des informations réseau sur tout type de périphérique disposant d’une adresse IP, qu’il s’agisse d’une machine isolée ou d’un ensemble d’hôtes sur un réseau entier. À l’origine, Nmap a été conçu pour deux usages fondamentaux :

  • Scanner un hôte spécifique afin d’identifier les services actifs et les ports ouverts ;
  • Scanner un réseau pour détecter les hôtes connectés.

Au fil des années, ses fonctionnalités se sont considérablement étoffées. Grâce à ses nombreux modules, Nmap est désormais un véritable couteau suisse de la reconnaissance réseau.

Par ailleurs, Nmap est un outil polyvalent, aussi bien adapté à un usage personnel que professionnel. Gratuit et accessible, il permet à quiconque de découvrir les services actifs sur un système. Mais c’est surtout dans un cadre professionnel qu’il prend toute sa dimension : que ce soit pour inventorier les hôtes et services d’un réseau ou pour détecter des configurations à risque.

En matière de cybersécurité, identifier les services exposés, parfois vulnérables ou mal configurés, est une étape clé dans l’évaluation du niveau de sécurité d’un réseau. Et c’est précisément ce que permet Nmap.

Avant de rentrer dans les détails, illustrons le fonctionnement de Nmap avec un exemple concret : le scan d’un hôte ayant pour adresse IP 172.20.0.2.

Exemple d’utilisation de Nmap

Nmap nous indique que le port 80 est ouvert et qu’un service HTTP y est probablement actif. Il précise également que 999 autres ports sont fermés.

À noter que, par défaut, Nmap analyse uniquement les 1 000 ports les plus couramment utilisés ; un comportement que l’on peut modifier à l’aide de l’option -p.

Dans les sections suivantes, nous allons approfondir le fonctionnement de Nmap et comprendre comment il parvient à ces résultats. Nous détaillerons les différentes étapes d’une exécution typique, les techniques de scan disponibles, ainsi que des fonctionnalités clés telles que la détection de version et l’identification du système d’exploitation.

Enfin, nous aborderons les usages plus avancés de Nmap, adaptés à des contextes spécifiques comme le contournement de pare-feu ou l’automatisation via scripts.

Chaque exécution de Nmap suit une séquence structurée d’étapes. Selon les options spécifiées, certaines peuvent être ignorées, tandis que d’autres ne s’exécutent que sur demande explicite.

Le tableau ci-dessous résume ces différentes phases, dans l’ordre où elles sont généralement exécutées :

PhaseDescription
1Scripts Pré-scanExécution des scripts de la catégorie prerule, avant tout scan. Ils peuvent, par exemple, envoyer des requêtes broadcast ou DNS.
Défaut : non
Option : --script ou -sC
2Énumération des ciblesGénération de la liste des IP à analyser. Les noms de domaine sont résolus à cette étape.
Défaut : oui
Option : non désactivable
3Découverte d’hôtes (Host Discovery)Détecte si chaque hôte est actif ou non.
Défaut : oui
Option : désactivable avec -Pn
4Résolution DNS inverseTente de récupérer les noms de domaine associés aux adresses IP.
Défaut : oui
Option : désactivable avec -n
5Scan de portsFonction principale de Nmap : identification des états des ports via différentes techniques.
Défaut : oui
Option : désactivable avec -sn
6Détection de versionIdentification des services et versions actifs sur les ports détectés.
Défaut : non
Option : -sV
7Détection du système d’exploitationTente de détecter le système d’exploitation en cours d’exécution sur l’hôte.
Défaut : non
Option : -O
8TracerouteExécute un traceroute vers la cible.
Défaut : non
Option : --traceroute
9Résultats en sortieFormatage et affichage des résultats (stdout, XML, JSON, fichiers, etc.).
Défaut : oui
Option : non désactivable
10Scripts Post-scanExécution des scripts postrule, ainsi que ceux explicitement demandés par l’utilisateur.
Défaut : non
Option : --script ou -sC
Phases d’une exécution Nmap

Dans les sections suivantes, nous nous concentrerons sur les phases 3 (découverte d’hôtes), 5 (scan de ports), 6 (détection de version) et 7 (détection de l’OS), particulièrement intéressantes pour comprendre la puissance de Nmap.

Scan de ports et techniques de scan

Cette phase correspond à la cinquième étape présentée dans le Tableau ci-dessus. L’objectif ici est d’identifier les ports ouverts sur un hôte.

Cependant, avec la généralisation des solutions de sécurité à différents niveaux — comme les pare-feu qui bloquent certaines connexions selon des règles prédéfinies — il devient difficile de savoir si un port est effectivement à l’écoute ou non.

C’est pourquoi Nmap classe l’état d’un port selon plusieurs catégories :

  • Open (ouvert)
  • Closed (fermé)
  • Filtered (filtré)
  • Unfiltered (non filtré) : dans certains cas, Nmap ne peut pas déterminer si le port est ouvert ou fermé, mais peut savoir s’il est filtré ou non en fonction des réponses reçues.

Nmap propose plusieurs techniques de scan permettant de déduire l’état d’un port en exploitant des différences subtiles dans les implémentations des protocoles selon les équipements et systèmes d’exploitation.

Ces méthodes ne sont pas toujours fiables puisqu’elles dépendent du comportement spécifique des cibles, mais elles restent utiles à connaître, en particulier lorsqu’on interagit avec des systèmes ou appareils atypiques. Certaines d’entre elles ont aussi été conçues pour rester discrètes.

Voyons maintenant quelques techniques de scan de ports proposées par Nmap.

Scan TCP SYN (-sS)

Cette technique nécessite des privilèges d’envoi de paquets bruts (raw packets) et elle est utilisée par défaut si l’utilisateur qui exécute Nmap dispose des droits nécessaires. Elle fonctionne avec n’importe quel service conforme au protocole TCP.

Le principe est le suivant : Nmap envoie un paquet au port cible avec uniquement le flag SYN activé.

  • Si une réponse SYN/ACK (ou parfois juste SYN) est reçue, cela signifie que le port est ouvert.
  • Si une réponse RST (reset) est reçue, le port est fermé.
  • En l’absence de réponse ou si un message ICMP « Destination inaccessible » est reçu, le port est alors considéré comme filtré.

Le scan TCP SYN est souvent qualifié de scan furtif (stealth scan), car Nmap n’établit pas de connexion complète : il envoie un paquet RST immédiatement après avoir reçu un SYN/ACK, interrompant ainsi la procédure de handshake avant qu’elle ne soit finalisée.

Scan TCP connect (-sT)

Cette technique est sélectionnée par défaut si l’utilisateur qui exécute Nmap ne dispose pas des privilèges nécessaires pour envoyer des paquets bruts.

Elle repose sur l’établissement classique d’une connexion TCP complète avec le port cible, en suivant le processus standard de handshake TCP. Elle permet de détecter les états des ports de la même manière que le scan SYN, à une différence près : le scan TCP connect n’est pas furtif.

En effet, cette méthode complète la connexion TCP en répondant avec un SYN/ACK, ce qui la rend facilement détectable. La majorité des systèmes modernes enregistrent toute tentative de connexion, ce qui peut attirer l’attention de solutions de sécurité ou d’administrateurs réseau.

Scan TCP ACK (-sA)

Contrairement aux techniques précédentes qui exploitent uniquement le flag SYN, cette méthode envoie un paquet avec uniquement le flag ACK activé.

Lorsqu’un port ouvert ou fermé reçoit un paquet contenant uniquement ce flag ACK, il devrait répondre avec un paquet contenant un flag RST. Ainsi, si Nmap reçoit un RST en réponse, le port est classé comme non filtré (unfiltered). En revanche, l’absence de réponse ou la réception d’un message ICMP de type « destination inaccessible » indique que le port est filtré.

Il est donc important de noter que cette technique ne permet pas de savoir si un port est ouvert ou fermé, mais uniquement s’il est accessible ou non à travers un pare-feu.

Cette approche peut néanmoins s’avérer utile pour analyser la configuration d’un pare-feu. Par exemple, elle permet parfois de distinguer si un pare-feu est statique (stateless) ou dynamique (stateful). Les pare-feux stateful gardent en mémoire les connexions établies et autorisent généralement seulement les paquets appartenant à une session active, ou ceux qui tentent d’en initier une nouvelle.

Malgré ses limitations, le scan TCP ACK peut être utilisé en complément d’autres techniques. En croisant les résultats, il devient alors possible d’inférer si un port est ouvert ou fermé.

Scan UDP (-sU)

Le scan UDP consiste à envoyer des paquets UDP vides vers les ports cibles, puis à attendre une éventuelle réponse. Si le port répond avec des données, il est alors considéré comme ouvert.

Cependant, il faut garder à l’esprit que les services UDP répondent rarement à des paquets vides ou à des données inattendues. Cela rend difficile pour Nmap de savoir si l’absence de réponse est due à un service qui ignore le paquet, ou un pare-feu qui bloque le trafic.

Pour augmenter les chances d’obtenir une réponse, Nmap envoie parfois des données spécifiques à certains protocoles vers les ports connus. Par exemple, il envoie une requête DNS au port 53.

Lorsque aucune réponse n’est reçue, Nmap classe l’état du port comme « open|filtered » (ouvert ou filtré), faute de pouvoir trancher.

Enfin, il faut noter que le scan UDP est relativement lent, car Nmap attend plusieurs secondes par défaut avant de retransmettre un paquet.

Scan TCP NULL (-sN)

Jusqu’à présent, nous avons vu des techniques qui exploitent les flags SYN et ACK. Cette méthode, en revanche, envoie un paquet TCP sans aucun flag activé — d’où son nom de NULL scan.

Elle s’appuie sur un détail précis de la RFC TCP, qui stipule que lorsqu’un port fermé reçoit un paquet sans le flag RST activé, il doit répondre avec un paquet RST.

Ainsi, en envoyant un paquet qui ne contient aucun des flags RST, SYN ou ACK, il devient possible d’identifier les ports fermés sur les systèmes qui appliquent ce comportement conforme à la RFC.

Cependant, cette technique présente une limitation : elle ne permet pas de distinguer un port ouvert d’un port filtré. En effet, la RFC indique qu’un port ouvert doit simplement ignorer les paquets qui ne contiennent pas les flags SYN, ACK ou RST.

Scan TCP FIN (-sF)

Cette technique fonctionne de la même manière que le scan TCP NULL, à la différence qu’elle envoie des paquets avec le flag FIN activé.

Scan TCP Xmas (-sX)

Cette technique est similaire à la précédente, sauf que les paquets envoyés ont les flags FIN, PSH et URG activés, ce qui leur donne un aspect « d’arbre de Noël » (d’où le nom Xmas).

Scan TCP Window (-sW)

Cette technique est similaire au scan TCP ACK puisqu’elle envoie des paquets avec uniquement le flag ACK activé, mais elle interprète les réponses différemment.

Elle tente d’exploiter un comportement présent sur certains systèmes : ceux-ci répondent avec un paquet RST dont le champ window varie selon l’état du port.

  • Si le port est ouvert, le champ window contient une valeur non nulle.
  • Si le port est fermé, cette valeur est généralement nulle.

Cette technique ne fonctionne que sur les systèmes qui implémentent ce comportement spécifique, ce qui la rend globalement peu fiable.

Scan SCTP INIT (-sY)

Le protocole SCTP est une alternative aux protocoles TCP/UDP. De manière similaire au scan SYN, cette technique détecte qu’un port est ouvert s’il reçoit un paquet INIT-ACK en réponse.

À l’inverse, si elle reçoit un paquet ABORT, elle considère le port comme fermé.

Enfin, si une erreur ICMP de type « destination inaccessible » est reçue, le port est classé comme filtré.

Scans personnalisés avec --scanflags

Nmap est un outil flexible qui permet aux utilisateurs de créer des scans personnalisés en spécifiant n’importe quelle combinaison de flags TCP.

Il est également possible d’ajouter une option de scan comme -sF ou -sA afin que les résultats soient interprétés selon le comportement de ce type de scan.

Si aucune option n’est précisée, les résultats sont interprétés par défaut comme un scan SYN (-sS).

Synthèse des techniques de scan
TCP

Le tableau ci-dessous résume comment les différentes techniques de scan TCP évoquées précédemment classifient les ports en fonction des réponses reçues.

Tableau récapitulatif de l’interprétation des résultats selon les techniques de scan TCP disponibles dans Nmap.
UDP

Le tableau ci-dessous résume les cas rencontrés lors de l’utilisation de la technique de scan UDP.

Tableau récapitulatif du comportement de la technique de scan UDP proposée par Nmap.

Détection des services et versions

Ceci correspond à la sixième phase mentionnée dans le tableau présentant les phases d’exécution de Nmap.

À ce stade, tous les exemples que nous avons vus incluent une colonne SERVICE dans la sortie, indiquant des valeurs comme http.

Cela s’explique par le fait que, par défaut, Nmap tente de deviner quel service s’exécute sur un port donné en se basant sur un fichier nommé nmap-services. Ce fichier associe les numéros de ports aux services qui y sont généralement liés.

Toutefois, cette méthode reste imprécise, car les utilisateurs sont libres de faire tourner n’importe quel programme sur n’importe quel port, sans nécessairement respecter les conventions.

Dans l’exemple ci-dessous, Nmap identifie correctement qu’un service http s’exécute sur le port 80. Cette information figure dans le fichier nmap-services (puisque le port 80 est un port enregistré, couramment utilisé pour les serveurs HTTP).

En revanche, il ne parvient pas à identifier précisément ce qui tourne sur le port 5000, et le qualifie simplement de upnp. Cela est logique puisque le port 5000 n’est pas un port officiellement enregistré, il ne figure donc pas dans le fichier nmap-services.

Pour contourner cette limite et récolter un maximum d’informations sur les cibles, Nmap propose un module complet dédié à la détection des services. Ce module repose sur une méthode d’empreintes (fingerprinting), bien plus efficace que l’approche basée uniquement sur le fichier statique nmap-services.

Ce module peut être activé en ajoutant l’option -sV. Si l’on relance le scan précédent avec cette option, on obtient les résultats suivants :

Les résultats affichent désormais une nouvelle colonne VERSION, qui indique que le service en écoute sur le port 5000 est très probablement un serveur HTTP nginx, version 1.27.4.

Si cette version de nginx est vulnérable, cette information peut s’avérer extrêmement précieuse pour un attaquant. C’est pourquoi le type de service et sa version constituent des informations cruciales d’un point de vue sécurité.

Comment fonctionne la détection de services avec Nmap ?

Lors d’un scan, Nmap ne se contente pas de lister les ports ouverts. Il peut aussi essayer d’identifier les services qui tournent sur ces ports. Pour cela, il utilise un fichier appelé nmap-service-probes qui contient une grande liste de « probes ».

Une probe est tout simplement un petit message spécifique que Nmap envoie à un port pour voir comment le service va répondre. En comparant la réponse obtenue à ce qu’il attend, Nmap peut deviner quel service est en face (par exemple Apache, nginx, SSH, etc.).

Ces probes peuvent être modifiées ou enrichies par les utilisateurs avancés pour détecter des services spécifiques.

Ci-dessous un exemple de probe :

Chaque probe contient plusieurs lignes de directives :

  • La ligne Probe décrit le protocole utilisé (TCP ou UDP), le nom de la probe, et le contenu du message envoyé au port (le « payload »).
  • Les lignes match contiennent des expressions régulières : elles servent à vérifier si la réponse du service correspond à un modèle connu. Si ça matche, on identifie le service !
  • La directive ports liste les ports sur lesquels cette probe est habituellement efficace.
Étapes du processus de détection

Pour chaque port trouvé comme ouvert ou ouvert|filtré, Nmap procède ainsi :

  1. Il sélectionne les probes compatibles (protocole + port mentionné).
  2. Il envoie chaque probe au port :
    • Si une réponse est reçue, il teste la réponse avec les règles match. Si aucune ne correspond, il essaie une « probe de secours » (fallback).
    • S’il ne reçoit aucune réponse, il passe à la suivante.
  3. Si aucune probe ne matche :
    • Nmap tente certaines autres probes, même si le port n’est pas spécifiquement mentionné.
    • Il tient alors compte de la rareté de la probe (rarity) et du niveau de verbosité demandé (--version-intensity).

Néanmoins, il est important de noter que les résultats de cette phase ne sont pas toujours fiables à 100 %, car ils dépendent d’une base de données et de tests de correspondance par expressions régulières. Il peut y avoir des erreurs de détection.

C’est pour cela que Nmap encourage les utilisateurs à remonter les erreurs ou à contribuer à enrichir la base de données de probes.

Cas des services UDP

Comme indiqué dans les sections précédentes, les ports ouverts UDP sont sujets à des dépassements de délai, car de nombreux services UDP ne répondent pas s’ils ne reconnaissent pas les données reçues.

En revanche, la phase de détection des services envoie des données spécifiques au protocole, ce qui augmente les chances d’envoyer les données attendues au service UDP et d’obtenir une réponse en retour.

Dans ce cas, tout port UDP précédemment marqué comme open|filtered peut être mis à jour en open.

Comment détecter le système d’exploitation dans cette phase ?

La phase de détection des services peut également permettre d’identifier des systèmes d’exploitation, car de nombreux services peuvent révéler des informations utiles simplement en interagissant avec eux.

Par exemple, SSH envoie souvent une bannière qui peut contenir des détails sur le système d’exploitation du serveur. Il est donc possible d’extraire des informations relatives au système d’exploitation au cours de cette phase.

De plus, certains services sont connus pour fonctionner exclusivement sur des systèmes ou des appareils spécifiques, ce qui permet à Nmap de déduire le système d’exploitation sous-jacent.

Cependant, Nmap fournit un autre mécanisme pour la détection du système d’exploitation qui est invoqué en utilisant l’option -O, qui sera détaillée dans une autre section.

Focus sur les ports exclus par défaut dans la phase de détection des services

Par précaution, Nmap ignore par défaut les ports 9100 à 9107, souvent associés à des imprimantes. Ces dernières, comme mentionné dans la documentation, ont la mauvaise habitude d’imprimer tout ce qu’on leur envoie.

Donc si un serveur HTTP tourne sur un de ces ports, il ne sera pas détecté par défaut. Exemple :

Nous voyons que le port n’a pas été identifié comme un serveur HTTP. Mais si nous ajoutons --allports pour forcer Nmap à scanner tous les ports :

Nmap arrive à identifier le service et la version.

Effectuer une découverte d’hôtes avec Nmap

Au-delà du scan de ports, Nmap permet également de détecter les machines accessibles sur un réseau donné. Cette fonctionnalité est particulièrement utile pour les administrateurs système ou réseau, car elle facilite la gestion de l’infrastructure et la constitution d’un inventaire réseau.

Plusieurs techniques sont proposées pour cela.

Utilisation du protocole ICMP
  • ICMP Echo Request (-PE) : Nmap envoie une requête ICMP Echo et attend une réponse (Echo Reply). Si aucune réponse n’est reçue, la machine est considérée comme hors ligne. Il s’agit du comportement par défaut du « ping ».
  • ICMP Address Mask Request (-PM) : Fonctionne comme -PE, mais envoie une requête ICMP Address Mask. Utile si les requêtes Echo sont bloquées.
  • ICMP Timestamp Request (-PP) : Envoie une requête ICMP Timestamp pour déterminer si l’hôte répond.
Utilisation du protocole ARP (-PR)

Cette méthode est particulièrement efficace en réseau local. Le protocole ARP étant massivement utilisé et rarement bloqué, il constitue une solution fiable pour détecter les machines actives sur un LAN.

Utilisation des protocoles TCP/UDP
  • -PS : Envoie un paquet TCP SYN sur le port 443 (configurable). Si une réponse SYN/ACK ou RST est reçue, l’hôte est considéré comme actif. Cela fonctionne bien lorsque ICMP est bloqué, mais que des services comme HTTP sont autorisés.
  • -PA : Même logique que -PS, mais envoie un paquet TCP ACK sur le port 80 par défaut.
  • -PU : Envoie un paquet UDP, par défaut sur le port 40125.
Utilisation d’autres protocoles IP (-PO)

Nmap peut également tenter de détecter la présence d’un hôte via d’autres protocoles comme IGMP.

Par défaut, Nmap combine les options suivantes :

  • Pour les utilisateurs privilégiés : -PE -PP -PS443 -PA80
  • Pour les utilisateurs non privilégiés : -PS80,443

Ci-dessous un exemple de scan dune machine sur un réseau :

Détection du système d’exploitation

Identifier le système d’exploitation utilisé par une cible constitue une information précieuse. Cela permet, par exemple, d’orienter l’identification du type d’appareil, comme les routeurs ou les imprimantes, qui exécutent souvent des systèmes spécifiques.

En audit de sécurité, cette donnée est cruciale pour adapter les charges utiles d’attaque en fonction de l’environnement ciblé.

Nmap intègre un module dédié à la détection du système d’exploitation, basé sur l’analyse d’empreintes réseau (fingerprinting). Cette méthode repose sur une série de métriques et de calculs permettant de comparer les caractéristiques d’un hôte inconnu à une base de données de références connues.

Toutefois, cette détection peut échouer ou aboutir à des résultats imprécis. Dans ce cas, Nmap fournit une liste de systèmes d’exploitation probables, accompagnés d’un pourcentage de confiance. Il arrive également que le système ne puisse pas être identifié du tout.

Principe de fonctionnement

Les explications qui suivent s’appliquent exclusivement à l’IPv4.

La détection du système d’exploitation repose sur l’envoi de plusieurs types de probes à la cible. Ces paquets peuvent être de nature TCP, UDP ou ICMP, et incluent souvent des données inhabituelles dans certains champs du paquet. Nmap envoie environ 16 paquets différents et classe les résultats dans une douzaine de catégories.

Après réception des réponses, Nmap construit une empreinte de la cible (subject fingerprint) en attribuant des attributs spécifiques à chaque catégorie, en se basant sur les valeurs retournées ou des métriques calculées. Cette empreinte est ensuite comparée à une empreinte de référence, extraite de sa base de données, laquelle regroupe les signatures connues de nombreux systèmes d’exploitation.

Voici un exemple de détection d’OS réalisée sur un routeur, en utilisant l’option -d qui permet d’afficher les détails de l’empreinte calculée :

# nmap -O -d -sV 192.168.1.254

Not shown: 992 closed tcp ports (reset)
PORT     STATE SERVICE  REASON         VERSION
53/tcp   open  domain   syn-ack ttl 64 dnsmasq 2.90
[... TRUNCATED RESULTS ...]

Device type: general purpose|router

Running: Linux 4.X|5.X, MikroTik RouterOS 7.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
OS details: Linux 4.15 - 5.19, OpenWrt 21.02 (Linux 5.4), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
TCP/IP fingerprint:
OS:SCAN(V=7.95%E=4%D=5/1%OT=53%CT=1%CU=42846%PV=Y%DS=1%DC=D%G=Y%M=8C97EA%TM
OS:=68133D2C%P=arm-apple-darwin24.1.0)SEQ(SP=104%GCD=1%ISR=10D%TI=Z%CI=Z%II
OS:=I%TS=A)OPS(O1=M5B4ST11NW7%O2=M5B4ST11NW7%O3=M5B4NNT11NW7%O4=M5B4ST11NW7

Le bloc d’empreinte TCP/IP (non affiché ici en entier) illustre la richesse des données collectées par Nmap. À partir de celles-ci, Nmap a identifié trois systèmes d’exploitation possibles pour la cible :

  • Linux 4.15 à 5.19
  • OpenWrt 21.02 (noyau Linux 5.4)
  • MikroTik RouterOS 7.2 à 7.5 (noyau Linux 5.6.3)

De plus, Nmap indique que l’équipement ciblé est probablement un routeur ou une machine standard.

Empreinte de la cible (Subject Fingerprint)

Dans cette section, ce qui nous intéresse, c’est l’empreinte de la cible générée par Nmap. Celle-ci est affichée dans un format condensé, conçu pour être facilement partageable lors de la remontée d’erreurs ou d’incohérences.

Heureusement, ce format est relativement simple à décoder : il suffit de retirer le préfixe OS: présent au début de chaque ligne, puis d’ajouter un retour à la ligne après chaque parenthèse fermante.

Voici une version décodée de l’empreinte :

Chaque ligne représente une catégorie qui synthétise les résultats des sondes envoyées, à l’exception de la première. Ces résultats sont exprimés sous forme de paires attribut-valeur, séparées par le caractère %. Le format général est : NOM_DE_CATEGORIE(ATTR_1=valeur%ATTR_2=valeur%...).

Par exemple, la catégorie SEQ fournit des résultats d’analyse basés sur des calculs statistiques portant sur certains champs comme l’IP ID et la prédictibilité du numéro de séquence initial (ISN).

Un autre exemple : l’attribut R, présent dans de nombreuses catégories, correspond à la réactivité (Responsiveness). Sa valeur est fixée à Y (yes) si la cible a répondu aux sondes associées à cette catégorie.

Quant à la ligne SCAN, elle se distingue des autres : elle récapitule les conditions générales du scan, incluant notamment la version de Nmap utilisée, la date, ou encore le nombre de ports ouverts identifiés.

Pour une compréhension complète des différentes catégories et de la signification des attributs, on se référera à la documentation officielle de Nmap.

Empreinte de référence (Reference Fingerprint)

Une fois l’empreinte du système cible générée, Nmap la compare à toutes les empreintes de référence disponibles, en calculant un score de similarité (ou de confiance).

Prenons l’exemple de l’empreinte de référence correspondant à « MikroTik RouterOS », identifiée dans l’analyse précédente. Toutes les empreintes de référence sont stockées dans le fichier nmap-os-db.

Une empreinte de référence a une structure très proche de celle d’une empreinte cible, à ceci près que les valeurs ne sont pas fixes : elles sont exprimées sous forme de tests logiques ou expressions de correspondance.

Par exemple, dans la catégorie OPS, l’attribut O1 est défini comme suit : O1=M[54E-5B4]ST11NW[2|3|5|7].

  • La notation [54E-5B4] désigne une plage de valeurs hexadécimales que l’on peut retrouver dans cette position.
  • Quant à [2|3|5|7], cela signifie que la dernière valeur doit obligatoirement être l’un de ces chiffres précis (2, 3, 5 ou 7).

Les premières lignes de l’empreinte servent à décrire le système d’exploitation et la version ciblée par l’ensemble des tests qui suivent.

Match Fingerprint

Comme mentionné précédemment, Nmap calcule un score de confiance pour déterminer si une empreinte collectée (subject fingerprint) correspond à une empreinte de référence (reference fingerprint). Ce score est basé sur un modèle défini au début du fichier nmap-os-db, reconnaissable grâce à la directive MatchPoints.

Cette directive spécifie, pour chaque attribut de chaque catégorie, le nombre de points pouvant être attribués si l’attribut de l’empreinte à analyser correspond à celui de l’empreinte de référence.

Deux accumulateurs sont utilisés : TotalPoints et GainedPoints.

  • TotalPoints correspond à la somme maximale des points que l’on peut obtenir si tous les attributs sont identiques.
  • GainedPoints est la somme réelle des points obtenus selon les correspondances effectives.

Nmap calcule ensuite un score de confiance sous la forme du ratio GainedPoints / TotalPoints, ce qui donne un nombre décimal entre 0 et 1.

  • Si le résultat est exactement 1, cela signifie que l’empreinte analysée correspond parfaitement à l’empreinte de référence.
  • Sinon, Nmap affiche ce score de confiance ainsi que les résultats supposés (guess results).

Voici l’exemple de modèle de correspondance par défaut extrait du fichier nmap-os-db :

NB : La détection du système d’exploitation pour les cibles IPv6 repose sur une approche différente, basée sur des techniques de machine learning.

Scripts Nmap

Nmap intègre un module de script connu sous le nom de Nmap Scripting Engine (NSE). Son objectif, comme son nom l’indique, est d’exécuter des scripts sur les cibles, ce qui peut s’avérer très utile pour automatiser des tâches fastidieuses ou répétitives. Ces scripts sont écrits dans le langage de programmation Lua.

Le module est livré avec une large collection de scripts, mais les utilisateurs peuvent également écrire et ajouter leurs propres scripts personnalisés.

Étapes d’exécution des scripts

Les scripts peuvent être exécutés à quatre étapes distinctes lors de l’exécution d’un scan Nmap. C’est l’auteur du script qui spécifie à quelle étape celui-ci doit s’exécuter. Voici les quatre étapes possibles :

  • Pre-rule scripts : exécutés durant la toute première phase, appelée Script pre-scanning. Ces scripts sont lancés avant tout scan Nmap. Ils peuvent, par exemple, envoyer des requêtes de broadcast sur le réseau.
  • Host scripts : exécutés après que Nmap ait réalisé la découverte d’hôtes, le scan de ports, la détection de version et l’identification du système d’exploitation. Ce type de script s’exécute une fois par hôte cible, pourvu que celui-ci corresponde à la condition hostrule définie dans le script.
  • Service scripts : ces scripts s’exécutent contre les ports à l’écoute qui correspondent à la règle portrule.
  • Post-rule scripts : exécutés à la toute fin, une fois que toutes les phases de Nmap sont terminées. Ils peuvent servir, par exemple, à traiter ou formater les résultats avant la fin de l’exécution.
Catégories des scripts

Les scripts sont aussi classés en catégories, selon leur finalité. Par exemple :

  • default : cette catégorie regroupe les scripts lancés par défaut si les options -sC ou --script sont utilisées sans arguments supplémentaires.
  • brute : ces scripts effectuent des attaques brute force. Quelques exemples : http-brute (attaque brute force sur l’authentification HTTP basic, digest ou NTLM), snmp-brute, oracle-brute, etc.
  • discovery : cette catégorie interroge davantage de services d’annuaire et registres pour collecter plus d’informations sur le réseau.

Voici un exemple d’exécution de Nmap utilisant l’option --script :

Comme on peut l’observer, le script a réussi à contourner l’authentification HTTP basic en réalisant une attaque brute force.

Techniques de contournement des pare-feux et systèmes de détection d’intrusion (IDS) avec Nmap

Nmap propose plusieurs techniques pour contourner des pare-feux ou des systèmes de détection/prévention d’intrusion (IDS/IPS) mal configurés.

Certaines de ces techniques ne sont efficaces que contre des machines anciennes avec des logiciels obsolètes.

Bien qu’elles puissent échouer face à des outils de sécurité modernes, elles méritent d’être essayées, en particulier lors d’un audit en réseau local.

Voici un aperçu de quelques techniques d’évasion disponibles dans Nmap.

Scan IP Idle (-sI)

Cette technique est utile lorsque l’on est bloqué pour scanner la cible, mais qu’on peut atteindre une autre machine qui :

  • Peut contacter la cible et est moins susceptible d’être filtrée.
  • Génère des identifiants IP (IP ID) prévisibles à l’échelle globale (ce qui est rare sur les systèmes modernes).

Cette machine est appelée zombie et permet d’inférer des informations sur la cible. Le principe est le suivant :

  1. On envoie un paquet au zombie pour lire sa valeur actuelle d’IP ID.
  2. On lance le scan vers la cible, mais en usurpant l’adresse IP source du zombie.
  3. Les réponses de la cible seront envoyées au zombie, et non à nous.
  4. En fonction de l’évolution de l’IP ID du zombie, on peut déduire l’état du port scanné.

Trois cas peuvent se produire :

  • Le port est ouvert : la cible répond avec un SYN/ACK → le zombie, n’ayant rien initié, envoie un RST → l’IP ID est incrémenté.
  • Si le port est fermé : la cible envoie un RST → le zombie ignore → IP ID inchangé.
  • Le port est filtré : aucune réponse ou réponse ICMP → pas d’incrémentation.

Enfin, on réinterroge le zombie :

  • Si l’IP ID a été incrémenté deux fois, le port est probablement ouvert.
  • Sinon, il est fermé ou filtré.

Cette méthode dépend du comportement de l’IP ID, donc elle est peu fiable si la machine zombie a d’autres connexions actives. Il est préférable de choisir une machine vraiment idle. Nmap propose un script nommé ipidseq pour détecter si les IP ID sont générés de manière incrémentale.

Scan ACK (-sA)

Cette technique est utile pour différencier les pare-feux stateful et stateless. Comme seuls les paquets avec le drapeau ACK sont envoyés, les pare-feux stateless peuvent les laisser passer, tandis que les stateful vérifieront s’il existe une connexion associée.

Fragmentation

Cette technique permet d’envoyer les paquets en fragments plus petits. Cela peut contourner des équipements de sécurité qui ne gèrent pas correctement les paquets fragmentés.

IPv6

Parfois ignoré dans la configuration des pare-feux, ce protocole peut permettre de contourner certaines protections via des scans IPv6.

Nmap implémente d’autres techniques intéressantes à tester lors d’un audit : routage source, usurpation d’adresse MAC, rebond FTP (FTP bounce), etc.

Scan des protocole IP

Il s’agit d’un type de scan particulier qui ne rentre pas dans les techniques de scan de ports classiques. Le scan des protocoles IP (-sO) a pour objectif d’identifier les protocoles IP supportés par la cible : ICMP, TCP, IGMP, etc.

Plutôt que de scanner des ports comme dans les scans traditionnels, cette méthode fait varier la valeur du champ Protocole (8 bits) de l’en-tête IP, permettant de déterminer quels protocoles sont acceptés ou filtrés par l’équipement visé.

Voici un exemple de scan réalisé avec Nmap sur un routeur :

Dans cet exemple, on peut observer que les protocoles ICMP (1), TCP (6), UDP (17) et SCTP (132) sont clairement ouverts. D’autres comme IPv6 (41), GRE (47) ou ESP (50) apparaissent comme open|filtered, ce qui signifie que Nmap ne peut pas déterminer avec certitude si le protocole est bien autorisé ou simplement filtré.

Ce type de scan est surtout utile lors d’audits de routeurs, pare-feux, ou autres équipements réseau qui pourraient laisser passer certains protocoles tout en bloquant d’autres.

Conclusion

Nmap est un outil puissant et polyvalent qui constitue un pilier essentiel dans l’arsenal des professionnels de la cybersécurité. Grâce à ses nombreuses fonctionnalités — de la découverte d’hôtes à la détection des systèmes d’exploitation, en passant par l’exécution de scripts automatisés et les techniques d’évasion avancées — Nmap permet d’obtenir une cartographie précise et approfondie des réseaux cibles.

Sa capacité à s’adapter à différents environnements et scénarios d’audit en fait un allié incontournable pour identifier les vulnérabilités, comprendre la configuration réseau, et préparer des stratégies de défense efficaces. Les fonctionnalités avancées telles que la comparaison des empreintes (fingerprints) ou le scan des protocoles IP illustrent la finesse d’analyse que l’on peut obtenir, même face à des systèmes complexes ou protégés.

Enfin, le fait que Nmap intègre un moteur de scripts extensible, avec une large bibliothèque et la possibilité d’ajouter ses propres scripts en Lua, lui confère une souplesse exceptionnelle pour automatiser et personnaliser les audits, allant bien au-delà d’un simple scanner de ports.

Maîtriser Nmap, c’est donc s’équiper pour mieux comprendre et protéger les réseaux, anticiper les attaques et renforcer la sécurité globale. Que ce soit pour un pentest, une analyse réseau ou un diagnostic rapide, Nmap reste un outil de référence indispensable pour tout expert en sécurité informatique.

Source :

Documentation Nmap : https://nmap.org/book/man.html

Auteure : Souad SEBAA – Pentester @Vaadata