Cartographie et découverte de réseau avec Nmap
Sommaire
I. Présentation
Dans ce chapitre, nous apprendrons à utiliser l’outil de scan réseau Nmap afin de dresser une cartographie du réseau. Nous verrons qu’il peut être très efficace dans cette tâche à travers ses différentes options. Enfin, nous verrons différentes méthodes pour spécifier les cibles de nos scans à Nmap.
Nous utiliserons notamment ce que nous avons appris dans le chapitre précédent concernant la manière dont Nmap détermine si un hôte est actif et joignable.
Comme évoqué dans notre module d’introduction à Nmap, celui-ci est un Network Mapper, littéralement un cartographe du réseau. Il s’agit donc de l’outil parfait pour dresser une liste des hôtes accessibles du réseau, qu’il s’agisse d’un réseau distant ou local.
Retour de l’auteur :
Dans les faits en tant qu’auditeur cybersécurité et pentester, j’utilise Nmap systématiquement lors de la réalisation de tests d’intrusion internes afin de savoir où je suis, quels sont mes voisins sur le réseau local et quels sont les autres réseaux accessibles ainsi que les systèmes qui s’y situent. Mon objectif est simple : faire une cartographie du réseau, déterminer la taille du système d’information et notamment esquisser sa surface d’attaque.
Pour en savoir plus sur ce qu’est une surface d’attaque, je vous oriente vers notre article sur le sujet
Cette cartographie du réseau peut aussi être utile dans des contextes de diagnostic du réseau, de supervision, de recensement des actifs (êtes-vous bien sûr que votre SI est bien composé uniquement de ce qui est dans l’Active Directory ou dans votre GLPI/OCS Inventory ?), etc. Cela peut donc également être intéressant afin de détecter la présence de Shadow IT dans votre système d’information :
II. Utiliser Nmap pour scanner une plage réseau
A. Découverte d’un réseau avec un scan Nmap
Nous souhaitons à présent passer à la vitesse supérieure et analyser tout notre réseau local. Rien de plus simple, il nous suffit pour cela de réutiliser les commandes vues dans le chapitre précédent, mais de spécifier un CIDR à la place d’une simple adresse IP.
Un CIDR (Classless Inter Domain Routing) est la notation “classique” pour spécifier une plage réseau et son étendue (à l’aide du masque). Par exemple “192.168.0.0/24”, il s’agit d’une “traduction” de la notation décimale du masque “255.255.255.0”.
Pour utiliser Nmap en spécifiant un CIDR, nous pouvons l’utiliser comme suivant :
# Scanner un CIDR
nmap 192.168.0.0/24
Il est également possible, comme pour les ports dans le chapitre précédent, de spécifier plusieurs hôtes, plusieurs réseaux, ou range :
# Scanner plusieurs réseaux en même temps via leur CIDR
nmap 192.168.0.0/24 192.168.1.0/24
# Scanner plusieurs hôtes via leur IP
nmap 192.168.1.2 192.168.1.3 192.168.1.10-20
# Mix des deux
nmap 192.168.0.0/24 192.168.1.3 192.168.1.10-20
Voici un exemple de résultat que nous pourrions avoir lors de l’exécution d’un scan sur un réseau :
Nous voyons notamment plusieurs hôtes actifs, chaque section relative à un hôte débute par une ligne telle que celle-ci :
Nmap scan report for <nom> (<IP>)
Cela nous permet de clairement voir à quel hôte se rapportent les résultats qui suivent. La toute dernière ligne a également son importance :
Nmap done: 512 IP addresses (5 hosts up) scanned in 21.43 seconds
Nous savons que, sur les réseaux scannés, Nmap a découvert 5 hôtes actifs.
B. Regardons sous le capot : analyse réseau via Wireshark
Nous allons à présent regarder un peu plus en détail ce qu’il se passe au niveau réseau lors d’une découverte réseau réalisée via Nmap.
Comme nous l’avons vu dans le chapitre précédent, Nmap va par défaut utiliser le protocole ARP pour détecter la présence d’hôtes sur le réseau local :
Il est ainsi en capacité de détecter la quasi-totalité des hôtes du réseau local, puisque la réponse à une requête ARP est généralement fournie par tous les hôtes actifs sur le réseau et ne paraît nullement suspecte.
Pour les réseaux distants, Nmap va utiliser une combinaison de techniques :
Pour être plus précis, Nmap utilise un paquet “Echo ICMP” (cas classique du “ping”) ainsi qu’un paquet “ICMP Timestamp”, d’ordinaire utilisé pour calculer le temps de transite d’un paquet. Il espère ainsi avoir une réponse des hôtes situés sur des réseaux distants.
Néanmoins il ne se limite pas à cela. Vous pouvez voir dans la capture Wireshark ci-dessus que des paquets TCP SYN sont systématiquement envoyés sur les ports TCP/443 de chaque hôte potentiel des réseaux à scanner, ainsi que des paquets TCP ACK sur le port TCP/80.
Pourquoi envoyer des paquets TCP sur des ports dans le cadre d’une découverte réseau ?
L'envoi d'un paquet SYN à un port donné permet à Nmap de déterminer si un service est en cours d'écoute sur ce port. Si un hôte répond à un paquet SYN avec un paquet SYN/ACK, cela indique qu'il est actif et qu'un service est en cours d'écoute sur ce port. Nmap tente donc sa chance sur ce service, même si aucune réponse au ping n’a été obtenue.
L'envoi d'un paquet ACK à un port donné permet à Nmap de déterminer si un pare-feu est présent sur cet hôte. Si un hôte répond à un paquet ACK avec un paquet RST (Reset), cela indique qu'un pare-feu est probablement présent sur cet hôte et qu'il bloque le trafic non sollicité. Ainsi l’hôte trahit sa présence sur le réseau, même s’il n’a pas répondu aux autres sollicitations.
Il est cependant important de noter que la détection de pare-feu à l'aide de cette technique peut ne pas être parfaitement fiable dans tous les cas. Certains hôtes peuvent générer des réponses RST pour d'autres raisons que la présence d'un pare-feu, comme la configuration spécifique du service ou du système d'exploitation. De plus, les pare-feu modernes peuvent être configurés pour ne pas répondre aux tentatives de découverte de ce type.
Nous avons bien avancé à présent et savons réaliser une découverte réseau basique. Nous allons à présent voir quelques options supplémentaires nous permettant de mieux maîtriser le comportement de Nmap.
III. Découverte réseau sans scan de port avec Nmap
Vous l’aurez sûrement remarqué, par défaut Nmap effectue un scan de port à la suite de sa découverte d’hôte actif, ce qui rajoute à notre scan une énorme quantité de paquets et d’attente de réponses. Si vous avez 5 hôtes sur votre réseau, Nmap va chercher à vérifier l’état d’environ 5 000 ports, ce qui prendra plus de temps.
Il est cependant possible d’utiliser les options de Nmap afin d’effectuer uniquement une découverte des hôtes actifs sur un réseau, sans découverte de leurs services.
Si l’on souhaite uniquement savoir quels sont les hôtes joignables, sans informations sur les services et ports qu’ils exposent, nous pouvons alors utiliser l’option “-sn” pour réaliser uniquement un scan utilisant des Echo ICMP (ping) et requêtes ARP. Autrement dit, désactiver totalement le scan de port :
# Scanner un CIDR en Echo ICMP
nmap 192.168.1.0/24 -sn
Voici le résultat d’une découverte réseau Nmap réalisée sans scan de port :
Nous avons évoqué précédemment les éventuelles limitations de l’utilisation unique de l’ICMP pour la découverte d’hôte (pour les réseaux distants). C’est pourquoi Nmap utilise aussi quelques astuces pouvant trahir la présence d’un pare-feu ou d’un service spécifique sur les hôtes. Nous pouvons, à l’aide des options, réutiliser ces astuces et même les étendre, sans pour autant repartir sur un scan complet des ports de chaque hôte découvert.
Nous allons pour cela utiliser l’option “-PS” (TCP SYN), “-PA” (TCP ACK), qui vont nous permettre d’indiquer les ports que l’on souhaite joindre dans le cadre de notre découverte d’hôte, ainsi que l’option “-PP” :
# Scanner des ports spécifiques sur un CIDR
nmap -sn -PP -PS22,3389,445,139 -PA80 192.168.1.0/24
Ce scan nous assure déjà d’avoir une découverte des hôtes un peu plus complète que via les options par défaut.
Nous commençons à avoir des commandes assez complètes, utilisant de multiples options. Cela parce que nous savons comment Nmap fonctionne et quelles sont les limites de ses options “par défaut” qui peuvent parfois nous faire perdre du temps ou passer à côté d’éléments importants. C’est tout l’intérêt de prendre le temps d’apprendre à le maîtriser !
Pour détailler un peu les options de notre dernière commande :
- “-sn” : désactive le scan de ports pour chaque hôte actif découvert par Nmap.
- “-PP” : active l’ICMP echo (ping scan) pour la découverte d’hôte.
- “-PS <PORT>” : envoi d’un paquet TCP SYN sur le ou les ports indiqués afin de détecter un éventuel service actif trahissant la présence d’un hôte n’ayant pas répondu au ping.
- “-PA <PORT>” : envoi d’un paquet TCP ACK sur le ou les ports indiqués afin de détecter un éventuel pare-feu actif trahissant la présence d’un hôte n’ayant pas répondu au ping.
Dans l’exemple ci-dessus, je spécifie les ports que je considère être les plus souvent exposés dans mes contextes d’utilisation de Nmap pour l’option “-PS”. Ces différents ports seront donc testés sur chaque hôte, non pas dans le but de voir si le service qu’ils hébergent est vraiment actif, mais pour voir si cela permet de découvrir un hôte qui n’aurait pas répondu à nos Echo ICMP en étant quand même actif (par l’intermédiaire d’une réponse du service ou du pare-feu de l’hôte).
Voici ce que l’on peut observer dans une capture réseau réalisée au moment d’un tel scan, il s’agit ici d’un extrait sur un seul hôte cible :
Nous retrouvons bien nos paquets TCP SYN, notre TCP ACK sur le port TCP/80 et notre Echo ICMP. Nmap réalisera tous ces tests pour chaque hôte ciblé par notre scan de découverte réseau.
IV. Utiliser un fichier des actifs à cibler avec Nmap
La spécification des cibles peut vite s’avérer complexe dans des systèmes d’information réels qui peuvent parfois être composés de dizaines ou de centaines de réseau, sous-réseau et VLAN. Dès lors, il devient plus simple d’utiliser un fichier comme source pour Nmap que de les spécifier un à un dans la ligne de commande.
Pour commencer, il faut créer un simple fichier contenant une entrée par ligne :
Ensuite, nous pouvons utiliser toutes les options de Nmap vues jusqu’ici et spécifier l’option “-iL <chemin/fichier>” :
# Scanner une liste de cibles contenues dans un fichier
nmap -iL /tmp/mesCibles.txt
Nmap va alors inclure dans son scan toutes les cibles contenues dans notre fichier.
Si vous souhaitez être sûr que vos cibles seront toutes prises en compte, vous pouvez utiliser l’option “-sL -n”. Nmap va alors uniquement interpréter les CIDR et hôtes du fichier pour vous les afficher, sans faire partir aucun paquet sur le réseau :
# Afficher les cibles contenues dans un fichier
nmap -iL /tmp/mesCibles.txt -sL -n
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-01 14:52 CEST
Nmap scan report for 192.168.0.0
Nmap scan report for 192.168.0.1
Nmap scan report for 192.168.0.2
Nmap scan report for 192.168.0.3
Nmap scan report for 192.168.0.4
Nmap scan report for 192.168.0.5
Nmap scan report for 192.168.0.6
Nmap scan report for 192.168.0.7
Nmap scan report for 192.168.0.8
Nmap scan report for 192.168.0.9
Nmap scan report for 192.168.0.10
Nmap scan report for 192.168.0.11
Nmap scan report for 192.168.0.12
Cela permet d’être bien sûr de la liste des hôtes qui seront scannés.
Une dernière astuce importante que je souhaite vous partager concerne l’exclusion d’hôte ou de réseau dans le cadre d’un scan. Ce besoin d’exclure un hôte peut être nécessaire dans différents cas, notamment si l’on souhaite être sûr et certain qu’un composant sensible du système d’information ne soit pas dérangé ou perturbé par nos scans.
Des exemples fréquents de tels besoins sont les cas où une entreprise possède des équipements industriels (automates) ou de santé. Ces équipements sont parfois mal conçus et pas du tout prévus pour recevoir des paquets mal formatés ou en trop grande quantité. Pour des besoins évidents de disponibilité ou risque métier/humain, il est alors préférable de les exclure des tests.
Pour exclure des adresses IP ou réseaux de notre scan, nous pouvons utiliser l’option “--exclude” de Nmap, par exemple :
# Exclusion d’une adresse IP dans un scan CIDR
nmap 192.168.1.0/24 --exclude 192.168.1.140
Dans cet exemple, je scanne le réseau “192168.1.0/24” mais exclus l’hôte “192.168.1.140” qui s’y situe. Aucun paquet ne sera émis par Nmap à destination de cet hôte. Autre exemple avec l’exclusion d’un sous-réseau :
# Exclusion d’un sous-réseau dans un scan CIDR
nmap 10.0.0.0/16 --exclude 10.0.100.0/24
Même chose, je scanne le large réseau “10.0.0.0/16”, mais le réseau “10.0.100.0/24” ne sera pas scanné. À nouveau, je vous invite à utiliser l’option “-sL -n” afin d’avoir une vue très claire des hôtes qui seront scannés et exclus du scan, notamment si vous opérez dans un contexte sensible.
V. Découverte réseau et scan de port
Nous pouvons à présent combiner ce que nous avons appris dans ce chapitre avec nos apprentissages du chapitre précédent concernant les options de scan de port. Par défaut, nous avons vu que Nmap procédera au scan des 1000 ports les plus fréquents sur chaque hôte actif découvert. Nous avons vu comment empêcher ce comportement s’il n’est pas souhaité, mais nous pouvons tout à fait le maîtriser, voire l’étendre si cela répond à nos besoins.
Par exemple, la commande suivante va vérifier la présence d’un service en écoute sur le port TCP/22 sur chaque hôte scanné :
# Scan du port TCP/22 sur un CIDR
nmap 192.168.0.0/24 192.168.1.0/24 -p 22
Nmap va dans un premier temps faire une découverte réseau pour lister les hôtes actifs, et pour chacun d’entre eux, vérifier qu’un service est présent sur le port TCP/22.
De la même manière, nous pouvons réaliser un scan complet de tous les ports TCP sur chaque hôte découvert sur le réseau “192.168.0.0/24”, en excluant l’hôte “192.168.0.4” par exemple :
# Scan de port d’un CIDR avec exclusion
nmap 192.168.0.0/24 --exclude 192.168.0.4 -p-
Libre à vous de combiner toutes les options que nous avons apprises jusque-là en fonction de vos propres besoins.
VI. Conclusion
Nous avons vu dans ce chapitre comment utiliser Nmap afin de réaliser une cartographie du réseau à l’aide de différentes options. Nous pouvons à présent maîtriser finement les cibles de nos scans ainsi que le comportement de Nmap concernant le scan de port et la méthode de découverte des hôtes. Et le plus important, nous savons quel est le comportement par défaut de Nmap ainsi que ses limitations, et comment utiliser ses principales options pour aller plus loin.
Le prochain chapitre sera dédié aux mécanismes et options de découverte des versions des services et systèmes d’exploitation scannés par Nmap.