Sergej Khackimullin - Fotolia

Réseau : comment scanner les ports ouverts en utilisant Nmap

L’une des principales fonctions de Nmap est de réaliser des scans de ports. Cet article montre comment lancer un scan par défaut, ainsi que d’autres options qui affectent le comportement du scan de port avec Nmap.

Nmap est un outil qui permet de faire une reconnaissance du réseau et des audits de sécurité. Sorti en 1997, il est l’un des outils de cybersécurité les plus basiques et les plus utilisés aujourd’hui. Depuis ses débuts en tant que scanner de port avancé, il a évolué en un outil multifonctionnel, avec une panoplie de cas d’usage pour découvrir des mots de passe faibles, scanner des adresses IPv6, effectuer la géolocalisation d’adresses IP, détecter des vulnérabilités et plus encore.

Cet outil open source aide les professionnels de la sécurité, les équipes de mise en réseau, les administrateurs système et autres personnels informatiques à analyser les hôtes, les réseaux, les applications, les ordinateurs centraux, les environnements Unix et Windows, les systèmes de contrôle et d’acquisition de données et les systèmes de contrôle industriel.

Paulino Calderon, co-fondateur de Websec et développeur de Nmap à temps partiel, a écrit le livre Nmap Network Exploration and Security Auditing Cookbook, Third Edition, publié par Packt, pour offrir un aperçu de l’utilisation de cet outil aux multiples facettes. Nous vous proposons ici un extrait du chapitre 1, « Les fondamentaux de Nmap », dans lequel l’auteur explique la manière d’utiliser Nmap pour trouver des ports ouverts. Vous pourrez télécharger un PDF du chapitre 1 pour en savoir plus.

Lister les ports ouverts sur une machine cible

Ce qui suit décrit comment utiliser Nmap pour déterminer l’état des ports sur une machine cible. C’est un processus utilisé pour identifier les services en cours d’exécution, communément appelé scan de ports. C’est l’une des tâches dans lesquelles Nmap excelle, il est donc important de connaître les options essentielles de Nmap liées au balayage des ports.

Pour lancer un scan de port, le strict minimum dont vous avez besoin est une machine cible. La cible peut être en l’occurrence une adresse IP, un nom d’hôte ou une plage de réseaux :

$ nmap scanme.nmap.org

Les résultats de l’analyse montrent toutes les informations obtenues sur le serveur distant, telles que l’adresse IPv4 (et IPv6 si disponible), le nom DNS inverse et les ports intéressants avec les noms de service. Tous les ports listés sont en état de marche ; on dit qu’ils « ont un état ». Les ports marqués comme ouverts ou filtrés sont particulièrement intéressants, car ils représentent des services exécutés sur l’hôte cible :

 Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.16s latency).
Other addresses for scanme.nmap.org (not scanned):
2600:3c01::f03c:91ff:fe18:bb2f
Not shown: 995 closed ports PORT STATE SERVICE
22/tcp open ssh 25/tcp filtered smtp 80/tcp open http
9929/tcp open nping-echo 31337/tcp open Elite
Nmap done: 1 IP address (1 host up) scanned in 333.35 seconds

Comment ça marche ?

Le scan par défaut de Nmap retourne une liste de ports. De plus, il renvoie le nom du service depuis une base de données distribuée avec Nmap et l’état du port pour chacun des ports listés.

Nmap classe les ports dans les états suivants :

- Ouvert : open indique qu’un service est à l’écoute de connexions sur ce port.

- Fermé : closed indique que ce port a correctement été sondé, mais qu’il a été conclu qu’aucun service ne fonctionnait dessus.

- Filtré : filtered indique que la machine cible n’a pas répondu au sondage sur ce port et que son état n’a pas pu être établi. Cela pourrait indiquer que le sondage est rejeté par une sorte de filtrage.

- Non filtré : unfiltered indique que ce port a correctement été sondé, mais qu’il n’a pas été possible de déterminer son état.

- Ouvert/filtré : open/filtered indique que le port a été filtré ou ouvert, mais que l’état n’a pas pu être établi.

- Fermé/filtré : closed/filtered indique que le port a été filtré ou fermé, mais que l’état n’a pas pu être établi.

Même pour ce simple scan de port, Nmap manipule beaucoup de choses en arrière-plan et celles-ci peuvent être configurées. Nmap commence par convertir le nom d’hôte en une adresse IPv4 en utilisant la résolution de nom DNS. Si vous souhaitez utiliser un serveur DNS différent, utilisez --dns-servers <serv1[,serv2],...>, ou utilisez -n si vous souhaitez sauter cette étape, comme suit :

$ nmap --dns-servers 8.8.8.8,8.8.4.4 scanme.nmap.org

Ensuite, nmap exécute le processus de découverte des hôtes pour vérifier si la cible est en ligne. Pour sauter cette étape, utilisez l’option sans ping, -Pn :

$ nmap -Pn scanme.nmap.org

Nmap reconvertit ensuite l’adresse IPv4 ou IPv6 en un nom d’hôte en utilisant une requête DNS inverse. Utilisez -n pour sauter aussi cette étape si vous n’avez pas besoin de cette information :

$ nmap -n scanme.nmap.org

La commande précédente lancera soit un scan furtif SYN, soit un scan TCP connect en fonction des privilèges de l’utilisateur qui exécute Nmap.

Le scan de port est l’une des fonctions les plus puissantes disponibles, et il est important de comprendre les différentes techniques et options qui affectent le comportement du scan de Nmap.

Privilégié contre non privilégié

L’exécution de la commande de scan de port la plus simple, nmap <target>, en tant qu’utilisateur privilégié lance par défaut un scan furtif SYN, alors que les utilisateurs non privilégiés qui ne peuvent pas créer de paquets bruts utilisent la technique de scan TCP connect. La différence entre ces deux techniques est qu’un scan TCP connect utilise l’appel système de haut niveau connect() pour obtenir les informations sur l’état du port, ce qui signifie que chaque connexion TCP est entièrement terminée et donc plus lente. Les scans furtifs SYN utilisent des paquets bruts pour envoyer des paquets TCP spécialement conçus afin de détecter les états des ports avec une technique connue sous le nom de half-open.

Comment analyser des plages de ports spécifiques ?

Définir correctement les plages de ports lors de vos scans est une tâche que vous devez souvent effectuer lors de l’exécution de scans Nmap. Vous pouvez également l’utiliser pour filtrer les machines qui exécutent un service sur un port spécifique, par exemple, trouver tous les serveurs SMB ouverts sur le port 445. Réduire la liste des ports permet également d’optimiser les performances, ce qui est très important lorsque l’on analyse plusieurs cibles.

Il existe plusieurs façons d’utiliser l’option -p de Nmap :

  • Liste de ports séparés par des virgules : $ nmap -p80,443 localhost
  • Plage de ports indiquée par un trait d’union : $ nmap -p1-100 localhost
  • Alias pour tous les ports de 1 à 65535 : $ nmap -p- localhost
  • Ports spécifiques par protocole : $ nmap -pT:25,U:53 <cible>
  • Nom du service : $ nmap -p smtp <target>
  • Nom du service avec des caractères génériques : $ nmap -p smtp* <target>
  • Uniquement les ports enregistrés dans la base de données des services de Nmap : $ nmap -p [1-65535] <target>

Comment choisir une autre interface réseau ?

Nmap tente de détecter automatiquement votre interface réseau active ; cependant, dans certaines situations, il échouera ou vous devrez peut-être sélectionner une interface différente afin de tester les problèmes de réseau. Pour forcer Nmap à scanner le réseau en utilisant une interface réseau différente, utilisez l’argument -e :

#nmap -e <interface> <target>
#nmap -e eth2 scanme.nmap.org

Cela n’est nécessaire que si vous avez des problèmes avec les scripts de diffusion ou si vous voyez le message « WARNING : Unable to find appropriate interface for system route to ».

Quelles autres techniques de balayage de ports ?

Nous avons parlé des deux méthodes de scan par défaut utilisées dans Nmap : le scan furtif SYN et le scan TCP connect. Cependant, Nmap supporte plusieurs techniques de scan de port plus avancées. Utilisez nmap -h ou visitez https://nmap.org/book/man-portscanning-techniques.html pour en savoir plus sur ces techniques.

Comment spécifier des machines cibles ?

Nmap supporte plusieurs formats de cibles qui permettent aux utilisateurs de travailler avec des plages d’adresses IP. Le cas le plus courant est celui où l’on spécifie l’IP ou le nom d’hôte de la cible. Mais nmap supporte également la lecture de cibles depuis des fichiers et des plages d’adresses. Nous pouvons même générer une liste de cibles aléatoires.

Tous les arguments qui ne sont pas des options valides sont lus comme des cibles par Nmap. Cela signifie que nous pouvons demander à Nmap de scanner plus d’une plage dans une seule commande, comme le montre la commande suivante :

# nmap -p25,80 -O -T4 192.168.1.1/24 scanme.nmap.org/24

Il y a plusieurs façons de gérer les plages d’adresses IP dans Nmap :

  • Spécification d’hôtes multiples
  • Adressage par plage d’octets (ils supportent aussi les jokers)
  • Notation CIDR

Pour scanner les adresses IP 192.168.1.1, 192.168.1.2 et 192.168.1.3, la commande suivante peut être utilisée :

$ nmap 192.168.1.1 192.168.1.2 192.168.1.3

Nous pouvons également spécifier des plages d’octets en utilisant le tiret -. Par exemple, pour analyser les hôtes 192.168.1.1, 192.168.1.2 et 192.168.1.3, nous pouvons utiliser l’expression 192.168.1.1-3, comme le montre la commande suivante :

$ nmap 192.168.1.1-3

La notation de l’intervalle d’octets prend également en charge les caractères génériques, de sorte que nous pouvons effectuer un balayage de 192.168.1.0 à 192.168.1.255 avec l’expression 192.168.1.* :

$ nmap 192.168.1.*

Comment exclure certaines machines lors du scan ?

En outre, vous pouvez exclure des machines des analyses en spécifiant l’option --exclude, comme indiqué ci-dessous :

$ nmap 192.168.1.1-255 --exclude 192.168.1.1
$ nmap 192.168.1.1-255 --exclude 192.168.1.1,192.168.1.2

Sinon, vous pouvez écrire votre liste d’exclusion dans un fichier en utilisant l’option --exclude-file :

$ cat dontscan.txt
192.168.1.1
192.168.1.254
$ nmap --exclude-file dontscan.txt 192.168.1.1-255

Qu’est-ce que la notation CIDR pour indiquer les cibles ?

La notation CIDR (prononcée cider) est une méthode compacte pour spécifier les adresses IP et leurs suffixes de routage. Cette notation a gagné en popularité en raison de sa granularité par rapport à l’adressage par classe, car elle autorise des masques de sous-réseau de longueur variable.

La notation CIDR est spécifiée par une adresse IP et un suffixe de réseau. Le suffixe réseau ou IP représente le nombre de bits du réseau. Les adresses IPv4 sont de 32 bits, le réseau peut donc être compris entre 0 et 32. Les suffixes les plus courants sont /8, /16, /24 et /32.

Pour le visualiser, examinez les conversions suivantes de CIDR en masque de réseau :

  • /8 : 255.0.0.0
  • /16 : 255.255.0.0
  • /24 : 255.255.255.0
  • /32 : 255.255.255.255

Par exemple, 192.168.1.0/24 représente les 256 adresses IP qui vont de 192.168.1.0 à 192.168.1.255. 50.116.1.121/8 représente toutes les adresses IP comprises entre 50.0-255.0-255.0-255. Le suffixe réseau /32 est également valable et représente une seule adresse IP.

La notation CIDR peut également être utilisée pour spécifier les machines cibles. Pour analyser les 256 hôtes de 192.168.1.0 à 192.168.1.255 en utilisant la notation CIDR, vous aurez besoin du suffixe /24 :

$ nmap 192.168.1.0/24

Comment travailler avec des listes de cibles ?

Souvent, nous aurons besoin de travailler avec plusieurs cibles, mais devoir taper une liste de cibles dans la ligne de commande n’est pas très pratique. Heureusement, Nmap supporte le chargement de cibles depuis un fichier externe. Entrez la liste des cibles dans un fichier, chacune étant séparée par une nouvelle ligne, une tabulation, ou encore un ou plusieurs espaces :

$cat targets.txt
192.168.1.23
192.168.1.12

Pour charger les cibles à partir du fichier targets.txt, utilisez l’option -iL <filename>  :

$ nmap -iL targets.txt

Remarque importante : cette fonction peut être combinée avec n’importe quelle option ou méthode d’analyse, à l’exception des règles d’exclusion définies par --exclude ou --exclude-file. Les options --exclude et --exclude-file seront ignorées lorsque -iL est utilisé.

Vous pouvez également utiliser différents formats de cible dans le même fichier. Dans le fichier suivant, nous spécifions à la fois une adresse IP et une plage d’adresses IP :

$ cat targets.txt
192.168.1.1
192.168.1.20-30

Vous pouvez saisir des commentaires dans votre liste de cibles en commençant la nouvelle ligne par le caractère # :

$ cat targets.txt
# FTP servers 192.168.10.3
192.168.10.7
192.168.10.11

À propos de l’auteur :
Paulino Calderon (@calderpwn sur Twitter) est un auteur publié et un conférencier international avec plus de 10 ans d’expérience professionnelle dans la sécurité des réseaux et des applications. Il a cofondé Websec, une société de conseil en sécurisation des applications, des réseaux et des actifs numériques opérant en Amérique du Nord, en 2011. Ses contributions ont atteint des millions d’utilisateurs grâce à Nmap, Metasploit, Open Web Application Security Project Mobile Security Testing Guide, OWASP Juice Shop et OWASP IoTGoat.

Pour approfondir sur Administration de réseaux