Post

HackTheBox - Nmap Host Enumeration avec Nmap

Mes notes sur la découverte d'hôtes avec Nmap - HTB Academy Module

HackTheBox - Nmap Host Enumeration avec Nmap

Informations sur le module

Suite du module HTB Academy sur Nmap, focus sur la découverte d’hôtes (Host Discovery) - une étape cruciale avant toute énumération de ports ou exploitation.

Lien : Network Enumeration with Nmap

Objectifs d’apprentissage

Ce module couvre les compétences suivantes :

  • Comprendre la différence entre ARP et ICMP pour la découverte d’hôtes
  • Scanner efficacement des réseaux complets
  • Identifier les hôtes actifs malgré les firewalls
  • Débugger les scans avec les options avancées de Nmap

Attention ceci est un cours TIER 1 donc je n’ai pas le droit de simplement copier coller les ressources pour vous les donner donc j’en ferai un résumé de ce que je comprend à chaque fois ainsi que mon cheminement de pensée à chaque fois qu’une question s’imposera

Host Discovery

En pentest interne, la première étape est de savoir quelles machines sont en ligne sur le réseau cible. On ne peut pas scanner des ports ou exploiter des services si on ne sait pas quelles IPs sont actives.

La découverte d’hôtes = la reconnaissance du terrain avant l’attaque

La méthode la plus efficace est d’utiliser des ICMP echo requests (ping), mais comme on va le voir, Nmap est plus intelligent que ça et utilise ARP par défaut sur un réseau local.

Important : Toujours sauvegarder chaque scan pour :

  • Comparaison entre différents outils
  • Documentation du pentest
  • Reporting final

Scanner un réseau complet

Scan basique d’un range réseau

La première chose que j’ai testée : scanner tout un réseau /24 :

1
sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5

Résultat :

1
2
3
4
5
6
7
10.129.2.4
10.129.2.10
10.129.2.11
10.129.2.18
10.129.2.19
10.129.2.20
10.129.2.28

Options utilisées :

OptionDescription
10.129.2.0/24Range réseau cible (256 IPs)
-snDésactive le scan de ports (juste la découverte)
-oA tnetSauvegarde en 3 formats : .nmap, .xml, .gnmap

Cette méthode fonctionne seulement si les firewalls le permettent !

Si certains hosts ne répondent pas, ça ne veut pas forcément dire qu’ils sont éteints - ils peuvent juste bloquer ICMP.


Scanner depuis une liste d’IPs

En pentest, on reçoit souvent une liste d’IPs à tester fournie par le client. Nmap peut lire directement depuis un fichier :

Création de la liste :

1
cat hosts.lst

Contenu :

1
2
3
4
5
6
7
10.129.2.4
10.129.2.10
10.129.2.11
10.129.2.18
10.129.2.19
10.129.2.20
10.129.2.28

Scan de la liste :

1
sudo nmap -sn -oA tnet -iL hosts.lst | grep for | cut -d" " -f5

Résultat :

1
2
3
10.129.2.18
10.129.2.19
10.129.2.20

Ce que j’ai appris ici : Sur 7 IPs dans la liste, seulement 3 répondent. Les 4 autres ignorent probablement les ICMP requests à cause de leur firewall.

Nmap ne reçoit pas de réponse → Il marque l’host comme inactif (mais il peut être en ligne !)


Scanner des IPs spécifiques

Parfois on veut juste scanner quelques IPs précises. Plusieurs méthodes :

Méthode 1 : IPs séparées par des espaces

1
sudo nmap -sn -oA tnet 10.129.2.18 10.129.2.19 10.129.2.20

Méthode 2 : Range dans l’octet

1
sudo nmap -sn -oA tnet 10.129.2.18-20

Les deux donnent le même résultat :

1
2
3
10.129.2.18
10.129.2.19
10.129.2.20

Pratique pour scanner rapidement un petit segment du réseau !


La découverte ARP vs ICMP - Le truc important

Ce qui m’a surpris : Nmap utilise ARP par défaut !

Quand j’ai scanné une IP unique :

1
sudo nmap 10.129.2.18 -sn -oA host

Résultat :

1
2
3
4
5
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-14 23:59 CEST
Nmap scan report for 10.129.2.18
Host is up (0.087s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds

Je pensais que Nmap envoyait un ICMP ping, mais non ! Pour le confirmer :

1
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace

Résultat :

1
2
3
4
5
6
7
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:08 CEST
SENT (0.0074s) ARP who-has 10.129.2.18 tell 10.10.14.2
RCVD (0.0309s) ARP reply 10.129.2.18 is-at DE:AD:00:00:BE:EF
Nmap scan report for 10.129.2.18
Host is up (0.023s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

Observation : Nmap envoie une ARP request au lieu d’un ping ICMP !

Pourquoi ?

  • ARP fonctionne au Layer 2 (liaison de données)
  • Plus fiable sur un réseau local
  • Ne peut pas être bloqué par les firewalls comme ICMP

Comprendre pourquoi un host est “up”

Pour voir exactement pourquoi Nmap marque un host comme actif :

1
sudo nmap 10.129.2.18 -sn -oA host -PE --reason

Résultat :

1
2
3
4
5
6
7
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:10 CEST
SENT (0.0074s) ARP who-has 10.129.2.18 tell 10.10.14.2
RCVD (0.0309s) ARP reply 10.129.2.18 is-at DE:AD:00:00:BE:EF
Nmap scan report for 10.129.2.18
Host is up, received arp-response (0.028s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

L’option --reason montre clairement : received arp-response

Très utile pour débugger quand des hosts sont marqués “down” alors qu’ils sont en ligne !


Forcer l’utilisation d’ICMP

Pour désactiver ARP et utiliser uniquement ICMP (utile pour l’OS fingerprinting) :

1
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace --disable-arp-ping

Résultat :

1
2
3
4
5
6
7
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:12 CEST
SENT (0.0107s) ICMP [10.10.14.2 > 10.129.2.18 Echo request (type=8/code=0) id=13607 seq=0] IP [ttl=255 id=23541 iplen=28 ]
RCVD (0.0152s) ICMP [10.129.2.18 > 10.10.14.2 Echo reply (type=0/code=0) id=13607 seq=0] IP [ttl=128 id=40622 iplen=28 ]
Nmap scan report for 10.129.2.18
Host is up (0.086s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds

Maintenant on voit :

  • SENT : ICMP Echo request (type=8)
  • RCVD : ICMP Echo reply (type=0)
  • TTL = 128 → Très probablement un système Windows !

Le TTL dans la réponse ICMP peut révéler l’OS : 64 (Linux), 128 (Windows), 255 (Cisco/Network)


Options importantes

OptionDescriptionUsage personnel
-snPas de scan de portsToujours pour découverte initiale
-PEICMP Echo requestsIdentification OS via TTL
-oASave all formatsPar défaut sur tous mes scans
--packet-traceVoir tous les paquetsDebug quand ça marche pas
--reasonPourquoi up/downComprendre les résultats
--disable-arp-pingForce TCP/ICMPTester la vraie réponse réseau
-iLScan depuis fichierQuand le client donne une liste

Based on the last result, find out which operating system it belongs to. Submit the name of the operating system as result.

Le dernier résultat était le suivant :

1
2
3
4
5
6
7
8
9
Arcony@htb[/htb]$ sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace --disable-arp-ping 

Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 00:12 CEST
SENT (0.0107s) ICMP [10.10.14.2 > 10.129.2.18 Echo request (type=8/code=0) id=13607 seq=0] IP [ttl=255 id=23541 iplen=28 ]
RCVD (0.0152s) ICMP [10.129.2.18 > 10.10.14.2 Echo reply (type=0/code=0) id=13607 seq=0] IP [ttl=128 id=40622 iplen=28 ]
Nmap scan report for 10.129.2.18
Host is up (0.086s latency).
MAC Address: DE:AD:00:00:BE:EF
Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds

J’ai analysé la ligne RCVD (paquet reçu de la cible), le paramètre qui est important ici est : ttl=128

J’ai comparé avec les TTL par défaut des OS courants :

  • Linux/Unix : TTL = 64
  • Windows : TTL = 128
  • Cisco/Network devices : TTL = 255

Conclusion : TTL = 128 → C’est un système Windows

Réponse : Windows

Astuce : Le TTL (Time To Live) dans la réponse ICMP est un excellent indicateur pour identifier l’OS sans scan actif !


Host and Port Scanning

Après avoir découvert quels hôtes sont en ligne, il est temps d’obtenir une image plus précise du système. Les informations dont on a besoin :

  • Les ports ouverts et leurs services
  • Les versions des services
  • Les informations que les services fournissent
  • Le système d’exploitation

La phase de scan de ports est cruciale pour identifier les vecteurs d’attaque potentiels


Les 6 états possibles d’un port

Nmap peut déterminer 6 états différents pour un port scanné :

ÉtatDescription
openLa connexion au port a été établie (TCP, UDP ou SCTP)
closedLe port répond avec un flag RST - le port est fermé mais l’hôte est actif
filteredNmap ne peut pas déterminer si le port est ouvert ou fermé (firewall probable)
unfilteredLe port est accessible mais on ne peut pas dire s’il est ouvert/fermé (TCP-ACK scan uniquement)
open\|filteredAucune réponse reçue - probablement un firewall qui protège le port
closed\|filteredÉtat visible uniquement avec IP ID idle scans

L’état filtered ne signifie pas forcément que le port est inaccessible - juste que le firewall bloque notre scan !


Découvrir les ports TCP ouverts

Par défaut, Nmap scanne les top 1000 ports TCP avec le scan SYN (-sS). Ce scan SYN est défini par défaut uniquement si on est root (permissions nécessaires pour créer des raw TCP packets).

Sinon, c’est le TCP Connect scan (-sT) qui est utilisé.

Différentes façons de définir les ports :

  • Ports individuels : -p 22,25,80,139,445
  • Range de ports : -p 22-445
  • Top ports : --top-ports=10
  • Tous les ports : -p-
  • Fast scan (top 100) : -F

Scanner les top 10 ports TCP

Premier test : scanner les 10 ports les plus fréquents :

1
sudo nmap 10.129.2.28 --top-ports=10

Résultat :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:36 CEST
Nmap scan report for 10.129.2.28
Host is up (0.021s latency).

PORT     STATE    SERVICE
21/tcp   closed   ftp
22/tcp   open     ssh
23/tcp   closed   telnet
25/tcp   open     smtp
80/tcp   open     http
110/tcp  open     pop3
139/tcp  filtered netbios-ssn
443/tcp  closed   https
445/tcp  filtered microsoft-ds
3389/tcp closed   ms-wbt-server
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 1.44 seconds

Observations :

  • 4 ports ouverts : SSH (22), SMTP (25), HTTP (80), POP3 (110)
  • 2 ports filtrés : NetBIOS (139), Microsoft-DS (445)
  • 4 ports fermés : FTP (21), Telnet (23), HTTPS (443), RDP (3389)

Les ports filtered sont intéressants - ils indiquent la présence d’un firewall !


Tracer les paquets - Comprendre le SYN scan

Pour comprendre ce qui se passe réellement, on peut tracer les paquets avec --packet-trace :

1
sudo nmap 10.129.2.28 -p 21 --packet-trace -Pn -n --disable-arp-ping

Résultat :

1
2
3
4
5
6
7
8
9
10
11
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:39 CEST
SENT (0.0429s) TCP 10.10.14.2:63090 > 10.129.2.28:21 S ttl=56 id=57322 iplen=44  seq=1699105818 win=1024 <mss 1460>
RCVD (0.0573s) TCP 10.129.2.28:21 > 10.10.14.2:63090 RA ttl=64 id=0 iplen=40  seq=0 win=0
Nmap scan report for 10.129.2.28
Host is up (0.014s latency).

PORT   STATE  SERVICE
21/tcp closed ftp
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds

Décryptage de la requête (SENT) :

MessageDescription
SENT (0.0429s)Nmap envoie un paquet à la cible
TCPProtocole utilisé
10.10.14.2:63090 >Notre IP et port source
10.129.2.28:21IP cible et port cible
SFlag SYN du paquet TCP
ttl=56 id=57322 ...Paramètres supplémentaires du header TCP

Décryptage de la réponse (RCVD) :

MessageDescription
RCVD (0.0573s)Paquet reçu de la cible
TCPProtocole utilisé
10.129.2.28:21 >IP cible et port source de la réponse
10.10.14.2:63090Notre IP et port de destination
RAFlags RST et ACK → Port fermé !
ttl=64 id=0 ...Paramètres supplémentaires du header TCP

Flag RST + ACK (RA) = Le port est fermé mais l’hôte est actif


TCP Connect Scan (-sT)

Le Connect Scan utilise le three-way handshake TCP complet pour déterminer l’état d’un port.

Avantages :

  • Très précis (complète le handshake)
  • Fonctionne sans privilèges root
  • Interagit proprement avec les services

Inconvénients :

  • Pas du tout furtif - crée des logs sur la plupart des systèmes
  • Facilement détectable par les IDS/IPS modernes
  • Plus lent que le SYN scan

Quand l’utiliser ?

  • Quand on n’a pas les droits root
  • Quand la précision est prioritaire sur la discrétion
  • Quand le firewall de l’hôte drop les paquets entrants mais autorise les sortants
    1
    
    sudo nmap 10.129.2.28 -p 443 --packet-trace --disable-arp-ping -Pn -n --reason -sT
    

Résultat :

1
2
3
4
5
6
7
8
9
10
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:26 CET
CONN (0.0385s) TCP localhost > 10.129.2.28:443 => Operation now in progress
CONN (0.0396s) TCP localhost > 10.129.2.28:443 => Connected
Nmap scan report for 10.129.2.28
Host is up, received user-set (0.013s latency).

PORT    STATE SERVICE REASON
443/tcp open  https   syn-ack

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds

Le Connect scan est plus “poli” car il se comporte comme une connexion client normale


Ports filtrés - Comprendre le comportement du firewall

Un port marqué comme filtered peut avoir plusieurs raisons. Généralement, c’est dû à des règles de firewall.

Les paquets peuvent être :

  • Dropped (abandonnés) - Aucune réponse
  • Rejected (rejetés) - Réponse ICMP “unreachable”

Cas 1 : Firewall qui DROP les paquets

Nmap envoie le paquet et… aucune réponse. Par défaut, Nmap va réessayer 10 fois (--max-retries=10).

1
sudo nmap 10.129.2.28 -p 139 --packet-trace -n --disable-arp-ping -Pn

Résultat :

1
2
3
4
5
6
7
8
9
10
11
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:45 CEST
SENT (0.0381s) TCP 10.10.14.2:60277 > 10.129.2.28:139 S ttl=47 id=14523 iplen=44  seq=4175236769 win=1024 <mss 1460>
SENT (1.0411s) TCP 10.10.14.2:60278 > 10.129.2.28:139 S ttl=45 id=7372 iplen=44  seq=4175171232 win=1024 <mss 1460>
Nmap scan report for 10.129.2.28
Host is up.

PORT    STATE    SERVICE
139/tcp filtered netbios-ssn
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 2.06 seconds

Observation : Le scan a pris 2.06 secondes au lieu de 0.05s - Nmap a attendu une réponse qui n’est jamais venue !

Cas 2 : Firewall qui REJECT les paquets

Cette fois, le firewall répond activement avec un message ICMP “Port Unreachable” :

1
sudo nmap 10.129.2.28 -p 445 --packet-trace -n --disable-arp-ping -Pn

Résultat :

1
2
3
4
5
6
7
8
9
10
11
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 15:55 CEST
SENT (0.0388s) TCP 10.129.2.28:52472 > 10.129.2.28:445 S ttl=49 id=21763 iplen=44  seq=1418633433 win=1024 <mss 1460>
RCVD (0.0487s) ICMP [10.129.2.28 > 10.129.2.28 Port 445 unreachable (type=3/code=3) ] IP [ttl=64 id=20998 iplen=72 ]
Nmap scan report for 10.129.2.28
Host is up (0.0099s latency).

PORT    STATE    SERVICE
445/tcp filtered microsoft-ds
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

Observation : On reçoit ICMP type=3/code=3 (Port unreachable) - Le firewall nous dit explicitement que le port est inaccessible.

Si on sait que l’hôte est vivant, un port filtered indique très probablement un firewall actif - À investiguer plus tard !


Découvrir les ports UDP ouverts

Les administrateurs système oublient souvent de filtrer les ports UDP en plus des TCP !

Problème avec UDP :

  • UDP est un protocole stateless (sans état)
  • Pas de three-way handshake
  • Pas d’acknowledgement
  • Les timeouts sont beaucoup plus longs
  • Le scan UDP (-sU) est beaucoup plus lent que TCP

Scan UDP basique

1
sudo nmap 10.129.2.28 -F -sU

Résultat :

1
2
3
4
5
6
7
8
9
10
11
12
13
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:01 CEST
Nmap scan report for 10.129.2.28
Host is up (0.059s latency).
Not shown: 95 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
137/udp  open          netbios-ns
138/udp  open|filtered netbios-dgm
631/udp  open|filtered ipp
5353/udp open          zeroconf
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 98.07 seconds

Observation : Scan de seulement 100 ports a pris 98 secondes ! C’est beaucoup plus long qu’avec TCP.

Nmap envoie des datagrams UDP vides - On ne reçoit une réponse que si l’application est configurée pour répondre


Comprendre les réponses UDP

Port UDP ouvert

1
sudo nmap 10.129.2.28 -sU -Pn -n --disable-arp-ping --packet-trace -p 137 --reason

Résultat :

1
2
3
4
5
6
7
8
9
10
11
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:15 CEST
SENT (0.0367s) UDP 10.10.14.2:55478 > 10.129.2.28:137 ttl=57 id=9122 iplen=78
RCVD (0.0398s) UDP 10.129.2.28:137 > 10.10.14.2:55478 ttl=64 id=13222 iplen=257
Nmap scan report for 10.129.2.28
Host is up, received user-set (0.0031s latency).

PORT    STATE SERVICE    REASON
137/udp open  netbios-ns udp-response ttl 64
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds

Conclusion : On a reçu une réponse UDP → Le port est ouvert !

Port UDP fermé

1
sudo nmap 10.129.2.28 -sU -Pn -n --disable-arp-ping --packet-trace -p 100 --reason

Résultat :

1
2
3
4
5
6
7
8
9
10
11
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:25 CEST
SENT (0.0445s) UDP 10.10.14.2:63825 > 10.129.2.28:100 ttl=57 id=29925 iplen=28
RCVD (0.1498s) ICMP [10.129.2.28 > 10.10.14.2 Port unreachable (type=3/code=3) ] IP [ttl=64 id=11903 iplen=56 ]
Nmap scan report for 10.129.2.28
Host is up, received user-set (0.11s latency).

PORT    STATE  SERVICE REASON
100/udp closed unknown port-unreach ttl 64
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in  0.15 seconds

Conclusion : On a reçu ICMP type=3/code=3 (Port unreachable) → Le port est fermé !

Port UDP filtré ou ouvert ?

1
sudo nmap 10.129.2.28 -sU -Pn -n --disable-arp-ping --packet-trace -p 138 --reason

Résultat :

1
2
3
4
5
6
7
8
9
10
11
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 16:32 CEST
SENT (0.0380s) UDP 10.10.14.2:52341 > 10.129.2.28:138 ttl=50 id=65159 iplen=28
SENT (1.0392s) UDP 10.10.14.2:52342 > 10.129.2.28:138 ttl=40 id=24444 iplen=28
Nmap scan report for 10.129.2.28
Host is up, received user-set.

PORT    STATE         SERVICE     REASON
138/udp open|filtered netbios-dgm no-response
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 2.06 seconds

Conclusion : Aucune réponse reçue → État open|filtered - Impossible de savoir !


Version Scan - Obtenir les détails des services

L’option -sV permet d’obtenir des informations supplémentaires sur les ports ouverts :

  • Versions des services
  • Noms des services
  • Détails sur la cible
    1
    
    sudo nmap 10.129.2.28 -Pn -n --disable-arp-ping --packet-trace -p 445 --reason -sV
    

Résultat :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Starting Nmap 7.80 ( https://nmap.org ) at 2022-11-04 11:10 GMT
SENT (0.3426s) TCP 10.10.14.2:44641 > 10.129.2.28:445 S ttl=55 id=43401 iplen=44  seq=3589068008 win=1024 <mss 1460>
RCVD (0.3556s) TCP 10.129.2.28:445 > 10.10.14.2:44641 SA ttl=63 id=0 iplen=44  seq=2881527699 win=29200 <mss 1337>
NSOCK INFO [0.4980s] nsock_iod_new2(): nsock_iod_new (IOD #1)
NSOCK INFO [0.4980s] nsock_connect_tcp(): TCP connection requested to 10.129.2.28:445 (IOD #1) EID 8
NSOCK INFO [0.5130s] nsock_trace_handler_callback(): Callback: CONNECT SUCCESS for EID 8 [10.129.2.28:445]
Service scan sending probe NULL to 10.129.2.28:445 (tcp)
NSOCK INFO [0.5130s] nsock_read(): Read request from IOD #1 [10.129.2.28:445] (timeout: 6000ms) EID 18
NSOCK INFO [6.5190s] nsock_trace_handler_callback(): Callback: READ TIMEOUT for EID 18 [10.129.2.28:445]
Service scan sending probe SMBProgNeg to 10.129.2.28:445 (tcp)
NSOCK INFO [6.5190s] nsock_write(): Write request for 168 bytes to IOD #1 EID 27 [10.129.2.28:445]
NSOCK INFO [6.5190s] nsock_read(): Read request from IOD #1 [10.129.2.28:445] (timeout: 5000ms) EID 34
NSOCK INFO [6.5190s] nsock_trace_handler_callback(): Callback: WRITE SUCCESS for EID 27 [10.129.2.28:445]
NSOCK INFO [6.5320s] nsock_trace_handler_callback(): Callback: READ SUCCESS for EID 34 [10.129.2.28:445] (135 bytes)
Service scan match (Probe SMBProgNeg matched with SMBProgNeg line 13836): 10.129.2.28:445 is netbios-ssn.  Version: |Samba smbd|3.X - 4.X|workgroup: WORKGROUP|
NSOCK INFO [6.5320s] nsock_iod_delete(): nsock_iod_delete (IOD #1)
Nmap scan report for 10.129.2.28
Host is up, received user-set (0.013s latency).

PORT    STATE SERVICE     REASON         VERSION
445/tcp open  netbios-ssn syn-ack ttl 63 Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
Service Info: Host: Ubuntu

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.55 seconds

Informations récupérées :

  • Service : Samba smbd 3.X - 4.X
  • Workgroup : WORKGROUP
  • Host : Ubuntu

Le scan de version (-sV) envoie des probes spécifiques à chaque service pour identifier précisément la version !


Options importantes

OptionDescriptionUsage personnel
-sSTCP SYN scan (half-open)Scan par défaut avec root - furtif
-sTTCP Connect scanQuand pas root ou besoin de précision
-sUUDP scanScanner les services UDP oubliés
-sVVersion detectionIdentifier versions des services
-p-Scan tous les ports (65535)Scan complet (lent)
-FFast scan (top 100 ports)Scan rapide initial
--top-ports=XScanner les X ports les plus fréquentsCompromis vitesse/couverture
--packet-traceVoir tous les paquetsDebug et apprentissage
--reasonAfficher pourquoi un port est dans cet étatComprendre les résultats
--max-retries=XNombre de retryAjuster selon le réseau

Find all TCP ports on your target. Submit the total number of found TCP ports as the answer.

Nous allons utiliser simplement le -sS qui nous permet de voir tout les ports TCP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─[eu-academy-3]─[10.10.15.151]─[htb-ac-1999270@htb-disygjack0]─[~]
└──╼ [★]$ nmap -sS 10.129.2.49
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-11-16 19:40 CST
Nmap scan report for 10.129.2.49
Host is up (0.044s latency).
Not shown: 993 closed tcp ports (reset)
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
110/tcp   open  pop3
139/tcp   open  netbios-ssn
143/tcp   open  imap
445/tcp   open  microsoft-ds
31337/tcp open  Elite

Nmap done: 1 IP address (1 host up) scanned in 0.84 seconds

Réponse : 7

Enumerate the hostname of your target and submit it as the answer. (case-sensitive)

Et pour cette question nous allons utiliser le flag -sV pour avoir tout les détails de notre scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌─[eu-academy-3]─[10.10.15.151]─[htb-ac-1999270@htb-disygjack0]─[~]
└──╼ [★]$ nmap 10.129.2.49 -sV
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-11-16 19:48 CST
Nmap scan report for 10.129.2.49
Host is up (0.044s latency).
Not shown: 993 closed tcp ports (reset)
PORT      STATE SERVICE     VERSION
22/tcp    open  ssh         OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
80/tcp    open  http        Apache httpd 2.4.29 ((Ubuntu))
110/tcp   open  pop3        Dovecot pop3d
139/tcp   open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
143/tcp   open  imap        Dovecot imapd (Ubuntu)
445/tcp   open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
31337/tcp open  Elite?
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port31337-TCP:V=7.94SVN%I=7%D=11/16%Time=691A7F04%P=x86_64-pc-linux-gnu
SF:%r(NULL,1F,"220\x20HTB{pr0F7pDv3r510nb4nn3r}\r\n")%r(GetRequest,1F,"220
SF:\x20HTB{pr0F7pDv3r510nb4nn3r}\r\n");
Service Info: Host: NIX-NMAP-DEFAULT; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 156.71 seconds

Et comme nous pouvons le voir dans cette ligne : Service Info: Host: NIX-NMAP-DEFAULT; OS: Linux; CPE: cpe:/o:linux:linux_kernel on y retrouve notre hostname que nous cherchons

Réponse : NIX-NMAP-DEFAULT


Saving the Results

Pendant nos scans, il est essentiel de toujours sauvegarder les résultats. Cela permet de :

  • Comparer les différentes méthodes de scan utilisées
  • Garder une trace pour la documentation
  • Analyser les résultats plus tard

Toujours sauvegarder ses scans = Bonne pratique en pentest !


Les 3 formats de sortie Nmap

Nmap peut sauvegarder les résultats dans 3 formats différents :

FormatOptionExtensionUsage
Normal output-oN.nmapLecture humaine, comme dans le terminal
Grepable output-oG.gnmapParsing facile avec grep/awk/sed
XML output-oX.xmlImport dans d’autres outils, génération de rapports

L’option magique : -oA sauvegarde dans les 3 formats en même temps !


Sauvegarder tous les formats en une commande

J’ai testé un scan complet avec sauvegarde :

1
sudo nmap 10.129.2.28 -p- -oA target

Résultat :

1
2
3
4
5
6
7
8
9
10
11
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-16 12:14 CEST
Nmap scan report for 10.129.2.28
Host is up (0.0091s latency).
Not shown: 65525 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
25/tcp    open  smtp
80/tcp    open  http
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Nmap done: 1 IP address (1 host up) scanned in 10.22 seconds

Options utilisées :

OptionDescription
10.129.2.28Cible à scanner
-p-Scan de TOUS les ports (1-65535)
-oA targetSauvegarde dans les 3 formats avec le nom de base “target”

Si aucun chemin complet n’est spécifié, les fichiers sont créés dans le répertoire courant


Vérification des fichiers créés

1
ls

Résultat :

1
target.gnmap  target.xml  target.nmap

Parfait ! Les 3 fichiers ont été créés automatiquement.


Format Normal (.nmap)

C’est le format lisible par un humain, identique à ce qu’on voit dans le terminal :

1
cat target.nmap

Contenu :

1
2
3
4
5
6
7
8
9
10
11
# Nmap 7.80 scan initiated Tue Jun 16 12:14:53 2020 as: nmap -p- -oA target 10.129.2.28
Nmap scan report for 10.129.2.28
Host is up (0.053s latency).
Not shown: 4 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
25/tcp open  smtp
80/tcp open  http
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

# Nmap done at Tue Jun 16 12:15:03 2020 -- 1 IP address (1 host up) scanned in 10.22 seconds

Utilité : Documentation, lecture facile, copier-coller dans les rapports.


Format Grepable (.gnmap)

Format optimisé pour le parsing avec des outils comme grep, awk, ou cut :

1
cat target.gnmap

Contenu :

1
2
3
4
# Nmap 7.80 scan initiated Tue Jun 16 12:14:53 2020 as: nmap -p- -oA target 10.129.2.28
Host: 10.129.2.28 ()    Status: Up
Host: 10.129.2.28 ()    Ports: 22/open/tcp//ssh///, 25/open/tcp//smtp///, 80/open/tcp//http///  Ignored State: closed (4)
# Nmap done at Tue Jun 16 12:14:53 2020 -- 1 IP address (1 host up) scanned in 10.22 seconds

Utilité : Scripts d’automatisation, extraction rapide d’informations.

Exemple d’utilisation :

1
2
# Extraire uniquement les ports ouverts
cat target.gnmap | grep "Ports:" | cut -d" " -f4-

Format XML (.xml)

Format structuré pour l’import dans d’autres outils ou la génération de rapports :

1
cat target.xml

Contenu :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/local/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 7.80 scan initiated Tue Jun 16 12:14:53 2020 as: nmap -p- -oA target 10.129.2.28 -->
<nmaprun scanner="nmap" args="nmap -p- -oA target 10.129.2.28" start="12145301719" startstr="Tue Jun 16 12:15:03 2020" version="7.80" xmloutputversion="1.04">
<scaninfo type="syn" protocol="tcp" numservices="65535" services="1-65535"/>
<verbose level="0"/>
<debugging level="0"/>
<host starttime="12145301719" endtime="12150323493"><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="10.129.2.28" addrtype="ipv4"/>
<address addr="DE:AD:00:00:BE:EF" addrtype="mac" vendor="Intel Corporate"/>
<hostnames>
</hostnames>
<ports><extraports state="closed" count="4">
<extrareasons reason="resets" count="4"/>
</extraports>
<port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="ssh" method="table" conf="3"/></port>
<port protocol="tcp" portid="25"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="smtp" method="table" conf="3"/></port>
<port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="64"/><service name="http" method="table" conf="3"/></port>
</ports>
<times srtt="52614" rttvar="75640" to="355174"/>
</host>
<runstats><finished time="12150323493" timestr="Tue Jun 16 12:14:53 2020" elapsed="10.22" summary="Nmap done at Tue Jun 16 12:15:03 2020; 1 IP address (1 host up) scanned in 10.22 seconds" exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>

Utilité : Import dans des outils comme Metasploit, génération de rapports HTML professionnels.


Convertir XML en rapport HTML

Le format XML peut être transformé en rapport HTML avec l’outil xsltproc :

1
xsltproc target.xml -o target.html

Résultat : Un fichier target.html est créé !

En ouvrant ce fichier dans un navigateur, on obtient un rapport visuel clair et professionnel :

Nmap Report

Ce que j’aime dans le rapport HTML :

  • Présentation claire et structurée
  • Facile à partager avec des non-techniciens
  • Parfait pour la documentation client
  • Inclut toutes les informations du scan

Les rapports HTML sont essentiels pour la documentation professionnelle en pentest !


Options de sauvegarde

OptionDescriptionUsage
-oN fichier.nmapSauvegarde format normalDocumentation lisible
-oG fichier.gnmapSauvegarde format grepableScripts et parsing
-oX fichier.xmlSauvegarde format XMLRapports et import outils
-oA nom_baseSauvegarde les 3 formatsÀ utiliser systématiquement

J’utilise toujours -oA pour avoir tous les formats d’un coup !


Perform a full TCP port scan on your target and create an HTML report. Submit the number of the highest port as the answer.

Nous allons utiliser de nouveau le flag -sS pour tout les port TCP ainsi que -oA pour avoir le résultat du scan en XML et pouvoir le traduire en html par la suite avec la commande xsltproc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─[eu-academy-3]─[10.10.15.151]─[htb-ac-1999270@htb-omo0uwa7td]─[~]
└──╼ [★]$ nmap 10.129.101.37 -sS -oA target
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-11-16 20:16 CST
Nmap scan report for 10.129.101.37
Host is up (0.051s latency).
Not shown: 993 closed tcp ports (reset)
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
110/tcp   open  pop3
139/tcp   open  netbios-ssn
143/tcp   open  imap
445/tcp   open  microsoft-ds
31337/tcp open  Elite

Nmap done: 1 IP address (1 host up) scanned in 0.98 seconds

Maintenant si nous faisons un ls nous pouvons voir les fichiers qui ont été créer

1
2
3
4
┌─[eu-academy-3]─[10.10.15.151]─[htb-ac-1999270@htb-omo0uwa7td]─[~]
└──╼ [★]$ ls
cacert.der  Documents  Music     Public        target.nmap  Templates
Desktop     Downloads  Pictures  target.gnmap  target.xml   Videos
  • target.gnmap
  • target.nmap
  • target.xml

Plus qu’a transformer le tout en HTML

1
2
┌─[eu-academy-3]─[10.10.15.151]─[htb-ac-1999270@htb-omo0uwa7td]─[~]
└──╼ [★]$ xsltproc target.xml -o target.html

Et d’ouvrir le fichier html et constater que le port le plus gros que nous avons trouvé même précédemment est:

Réponse : 31337


Service Enumeration

Après avoir découvert les ports ouverts, l’étape suivante est d’identifier précisément les services qui tournent sur ces ports et surtout leurs versions.

Pourquoi c’est crucial ?

  • Rechercher des vulnérabilités connues pour cette version spécifique
  • Analyser le code source si disponible
  • Trouver des exploits précis qui correspondent au service ET à l’OS

Un numéro de version exact = La clé pour trouver l’exploit parfait !


Ma stratégie de scan en deux phases

Phase 1 : Scan rapide initial

J’ai appris qu’il vaut mieux commencer par un scan rapide des ports les plus courants. Pourquoi ?

  • Génère moins de trafic
  • Réduit les chances d’être détecté et bloqué par les mécanismes de sécurité
  • Donne un premier aperçu rapidement

Pendant ce temps, je lance un scan complet (-p-) en arrière-plan.

Phase 2 : Version scan sur les ports identifiés

Une fois les ports ouverts connus, j’utilise le version scan (-sV) pour identifier précisément les services :

1
sudo nmap 10.129.2.28 -p- -sV

Mon observation : Un scan complet de tous les ports prend beaucoup de temps. Heureusement, Nmap a une astuce !


Suivre la progression du scan

Astuce 1 : Appuyer sur la barre Espace

Pendant qu’un scan tourne, j’ai découvert qu’on peut appuyer sur [Espace] pour voir le statut :

1
sudo nmap 10.129.2.28 -p- -sV

Résultat après avoir appuyé sur Espace :

1
2
3
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 19:44 CEST
Stats: 0:00:03 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 3.64% done; ETC: 19:45 (0:00:53 remaining)

Ce que ça m’apprend :

  • Temps écoulé : 3 secondes
  • Progression : 3.64%
  • Temps restant estimé : 53 secondes

Pratique pour savoir si le scan va prendre 5 minutes ou 2 heures !

Astuce 2 : Affichage automatique toutes les X secondes

Pour ne pas avoir à appuyer manuellement sur Espace, j’utilise --stats-every=5s :

1
sudo nmap 10.129.2.28 -p- -sV --stats-every=5s

Résultat :

1
2
3
4
5
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 19:46 CEST
Stats: 0:00:05 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 13.91% done; ETC: 19:49 (0:00:31 remaining)
Stats: 0:00:10 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 39.57% done; ETC: 19:48 (0:00:15 remaining)

Mon observation : Toutes les 5 secondes, j’ai une mise à jour automatique ! Je peux spécifier des secondes (5s) ou des minutes (2m).


Mode verbeux : Voir les ports en temps réel

L’option -v (ou -vv pour encore plus de détails) affiche les ports ouverts immédiatement quand Nmap les découvre :

1
sudo nmap 10.129.2.28 -p- -sV -v

Résultat :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 20:03 CEST
NSE: Loaded 45 scripts for scanning.
Initiating ARP Ping Scan at 20:03
Scanning 10.129.2.28 [1 port]
Completed ARP Ping Scan at 20:03, 0.03s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 20:03
Completed Parallel DNS resolution of 1 host. at 20:03, 0.02s elapsed
Initiating SYN Stealth Scan at 20:03
Scanning 10.129.2.28 [65535 ports]
Discovered open port 995/tcp on 10.129.2.28
Discovered open port 80/tcp on 10.129.2.28
Discovered open port 993/tcp on 10.129.2.28
Discovered open port 143/tcp on 10.129.2.28
Discovered open port 25/tcp on 10.129.2.28
Discovered open port 110/tcp on 10.129.2.28
Discovered open port 22/tcp on 10.129.2.28

Pourquoi j’aime ça :

  • Je vois les ports ouverts au fur et à mesure
  • Je peux commencer à analyser certains ports pendant que le scan continue
  • Plus interactif et moins ennuyeux à attendre

Le mode verbeux est mon meilleur ami pour les longs scans !


Résultats du Banner Grabbing

Une fois le scan terminé, j’obtiens toutes les informations sur les services :

1
sudo nmap 10.129.2.28 -p- -sV

Résultat complet :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-15 20:00 CEST
Nmap scan report for 10.129.2.28
Host is up (0.013s latency).
Not shown: 65525 closed ports
PORT      STATE    SERVICE      VERSION
22/tcp    open     ssh          OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
25/tcp    open     smtp         Postfix smtpd
80/tcp    open     http         Apache httpd 2.4.29 ((Ubuntu))
110/tcp   open     pop3         Dovecot pop3d
139/tcp   filtered netbios-ssn
143/tcp   open     imap         Dovecot imapd (Ubuntu)
445/tcp   filtered microsoft-ds
993/tcp   open     ssl/imap     Dovecot imapd (Ubuntu)
995/tcp   open     ssl/pop3     Dovecot pop3d
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
Service Info: Host:  inlane; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 91.73 seconds

Ce que j’ai appris de ce scan :

  • SSH : OpenSSH 7.6p1 sur Ubuntu
  • SMTP : Postfix smtpd
  • HTTP : Apache 2.4.29 sur Ubuntu
  • Hostname : inlane
  • OS : Linux

Ces informations précises me permettent de chercher des CVE spécifiques à ces versions !


Comment fonctionne la détection de version ?

Nmap utilise deux méthodes pour identifier les services :

Méthode 1 : Lecture des banners

Nmap regarde les banners que les services envoient et les affiche. C’est rapide et efficace.

Méthode 2 : Système de signatures

Si le banner n’est pas clair, Nmap utilise un système de matching basé sur des signatures.

Inconvénient : Ça prend beaucoup plus de temps.


Le problème : Nmap peut rater des informations

Nmap n’affiche pas toujours toutes les informations disponibles. Exemple concret :

1
sudo nmap 10.129.2.28 -p- -sV -Pn -n --disable-arp-ping --packet-trace

Résultat avec –packet-trace :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-16 20:10 CEST
<SNIP>
NSOCK INFO [0.4200s] nsock_trace_handler_callback(): Callback: READ SUCCESS for EID 18 [10.129.2.28:25] (35 bytes): 220 inlane ESMTP Postfix (Ubuntu)..
Service scan match (Probe NULL matched with NULL line 3104): 10.129.2.28:25 is smtp.  Version: |Postfix smtpd|||
NSOCK INFO [0.4200s] nsock_iod_delete(): nsock_iod_delete (IOD #1)
Nmap scan report for 10.129.2.28
Host is up (0.076s latency).

PORT   STATE SERVICE VERSION
25/tcp open  smtp    Postfix smtpd
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
Service Info: Host:  inlane

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.47 seconds

Regardez cette ligne :

1
NSOCK INFO [0.4200s] nsock_trace_handler_callback(): Callback: READ SUCCESS for EID 18 [10.129.2.28:25] (35 bytes): 220 inlane ESMTP Postfix (Ubuntu)..

Le serveur SMTP nous dit qu’il tourne sur Ubuntu, mais Nmap ne l’affiche pas dans le résultat final !

Parfois, il faut aller chercher les informations plus profondément avec –packet-trace


Vérification manuelle avec Netcat et Tcpdump

Pour comprendre ce qui se passe vraiment au niveau réseau, j’ai fait une vérification manuelle.

Configuration de Tcpdump

Terminal 1 - J’écoute le trafic réseau :

1
sudo tcpdump -i eth0 host 10.10.14.2 and 10.129.2.28

Résultat :

1
2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

Connexion avec Netcat

Terminal 2 - Je me connecte manuellement au port SMTP :

1
nc -nv 10.129.2.28 25

Résultat :

1
2
Connection to 10.129.2.28 port 25 [tcp/*] succeeded!
220 inlane ESMTP Postfix (Ubuntu)

Parfait ! Le serveur m’envoie son banner avec l’info Ubuntu.

Analyse du trafic intercepté

Retour au Terminal 1 - Tcpdump montre ce qui s’est passé :

1
2
3
4
5
18:28:07.128564 IP 10.10.14.2.59618 > 10.129.2.28.smtp: Flags [S], seq 1798872233, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 331260178 ecr 0,sackOK,eol], length 0
18:28:07.255151 IP 10.129.2.28.smtp > 10.10.14.2.59618: Flags [S.], seq 1130574379, ack 1798872234, win 65160, options [mss 1460,sackOK,TS val 1800383922 ecr 331260178,nop,wscale 7], length 0
18:28:07.255281 IP 10.10.14.2.59618 > 10.129.2.28.smtp: Flags [.], ack 1, win 2058, options [nop,nop,TS val 331260304 ecr 1800383922], length 0
18:28:07.319306 IP 10.129.2.28.smtp > 10.10.14.2.59618: Flags [P.], seq 1:36, ack 1, win 510, options [nop,nop,TS val 1800383985 ecr 331260304], length 35: SMTP: 220 inlane ESMTP Postfix (Ubuntu)
18:28:07.319426 IP 10.10.14.2.59618 > 10.129.2.28.smtp: Flags [.], ack 36, win 2058, options [nop,nop,TS val 331260368 ecr 1800383985], length 0

Décortiquons ce qui s’est passé :

Le Three-Way Handshake

Les 3 premières lignes montrent l’établissement de la connexion TCP :

ÉtapeFlagDescription
1[S]J’envoie un SYN pour initier la connexion
2[S.]Le serveur répond avec SYN-ACK
3[.]J’envoie ACK pour confirmer

L’envoi du Banner

Ligne 4 - Le serveur envoie les données :

1
18:28:07.319306 IP 10.129.2.28.smtp > 10.10.14.2.59618: Flags [P.], <SNIP> length 35: SMTP: 220 inlane ESMTP Postfix (Ubuntu)

Flags utilisés :

  • PSH (Push) : Le serveur envoie des données
  • ACK : Il confirme aussi que tout a bien été reçu

Mon observation : C’est ici que le banner 220 inlane ESMTP Postfix (Ubuntu) est transmis !

Confirmation de réception

Ligne 5 - Je confirme avoir reçu les données :

1
18:28:07.319426 IP 10.10.14.2.59618 > 10.129.2.28.smtp: Flags [.], <SNIP>

Flag ACK : J’accuse réception du banner.

Le flag PSH dans les paquets TCP indique l’envoi de données - C’est souvent là que se trouvent les banners !


Options importantes pour Service Enumeration

OptionDescriptionUsage
-sVDétection de version des servicesToujours utiliser après découverte des ports
-p-Scanner tous les 65535 portsScan complet mais lent
--stats-every=5sAffiche la progression toutes les 5sPratique pour les longs scans
-v / -vvMode verbeuxVoir les ports ouverts en temps réel
--packet-traceTrace tous les paquetsDebug et analyse approfondie
-PnDésactive ICMP EchoUtile si le ping est bloqué
-nDésactive résolution DNSAccélère le scan
--disable-arp-pingDésactive ARP pingForce l’utilisation d’autres méthodes

Enumerate all ports and their services. One of the services contains the flag you have to submit as the answer.

Ok donc pour énumérer tout les ports déjà c’est le -p- et les services qui en font parti c’est le -sV nous allons voir ce que ça va nous donner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌─[eu-academy-3]─[10.10.14.131]─[htb-ac-1999270@htb-yz1xtgvsk9]─[~]
└──╼ [★]$ nmap -sV -v -Pn --disable-arp-ping 10.129.42.164
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-11-17 18:01 CST
NSE: Loaded 46 scripts for scanning.
Initiating Parallel DNS resolution of 1 host. at 18:01
Completed Parallel DNS resolution of 1 host. at 18:01, 0.00s elapsed
Initiating SYN Stealth Scan at 18:01
Scanning 10.129.42.164 [1000 ports]
Discovered open port 445/tcp on 10.129.42.164
Discovered open port 22/tcp on 10.129.42.164
Discovered open port 143/tcp on 10.129.42.164
Discovered open port 139/tcp on 10.129.42.164
Discovered open port 80/tcp on 10.129.42.164
Discovered open port 110/tcp on 10.129.42.164
Discovered open port 31337/tcp on 10.129.42.164
Completed SYN Stealth Scan at 18:01, 0.82s elapsed (1000 total ports)
Initiating Service scan at 18:01
Scanning 7 services on 10.129.42.164

Alors j’ai tenté des scan mais ça ne servait a rien, ils étaient infini et donnaient les mêmes infos peut importe ce que je faisais.

Alors que la réponse se trouvait dans un des ports directement comme nous l’avons vu avec un nc -nc [IP_MACHINE] [PORT]

1
2
3
4
┌─[eu-academy-3]─[10.10.14.131]─[htb-ac-1999270@htb-yz1xtgvsk9]─[~]
└──╼ [★]$ nc -nv 10.129.42.164 31337
(UNKNOWN) [10.129.42.164] 31337 (?) open
220 HTB{pr0F7pDv3r510nb4nn3r}

Réponse : HTB{pr0F7pDv3r510nb4nn3r}


Nmap Scripting Engine

Le Nmap Scripting Engine (NSE) est une fonctionnalité que j’ai découverte et qui permet de créer des scripts en Lua pour interagir avec des services spécifiques. C’est comme donner des super-pouvoirs à Nmap !

NSE transforme Nmap d’un simple scanner de ports en un véritable outil d’énumération avancée


Les 14 catégories de scripts NSE

Nmap organise ses scripts en 14 catégories selon leur fonction :

CatégorieDescription
authDétermination des identifiants d’authentification
broadcastDécouverte d’hôtes par broadcasting
bruteTentatives de connexion par brute-force
defaultScripts par défaut exécutés avec -sC
discoveryÉvaluation des services accessibles
dosTest de vulnérabilités de déni de service
exploitTentative d’exploitation de vulnérabilités connues
externalScripts utilisant des services externes
fuzzerIdentification de vulnérabilités par fuzzing
intrusiveScripts intrusifs pouvant affecter négativement la cible
malwareVérification d’infection par malware
safeScripts défensifs non destructifs
versionExtension pour la détection de services
vulnIdentification de vulnérabilités spécifiques

Mon observation : Certaines catégories comme dos et exploit sont à utiliser avec précaution car elles peuvent endommager le système cible !


Les différentes façons d’utiliser les scripts

Méthode 1 : Scripts par défaut

La façon la plus simple - utiliser l’option -sC :

1
sudo nmap <target> -sC

Ce que ça fait : Exécute tous les scripts de la catégorie default - ceux considérés comme utiles et sûrs.

Méthode 2 : Par catégorie

Pour utiliser tous les scripts d’une catégorie spécifique :

1
sudo nmap <target> --script <category>

Exemple :

1
sudo nmap 10.129.2.28 --script vuln

Méthode 3 : Scripts spécifiques

Pour utiliser des scripts précis :

1
sudo nmap <target> --script <script-name>,<script-name>,...

Exemple :

1
sudo nmap 10.129.2.28 --script banner,smtp-commands

Exemple pratique : Énumération SMTP

J’ai testé deux scripts spécifiques sur le port SMTP (25) :

1
sudo nmap 10.129.2.28 -p 25 --script banner,smtp-commands

Résultat :

1
2
3
4
5
6
7
8
9
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-16 23:21 CEST
Nmap scan report for 10.129.2.28
Host is up (0.050s latency).

PORT   STATE SERVICE
25/tcp open  smtp
|_banner: 220 inlane ESMTP Postfix (Ubuntu)
|_smtp-commands: inlane, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8,
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)

Ce que j’ai appris :

Script banner :

  • Révèle que c’est Ubuntu qui tourne sur la cible
  • Montre le banner : 220 inlane ESMTP Postfix (Ubuntu)

Script smtp-commands :

  • Liste toutes les commandes SMTP disponibles
  • Je peux voir VRFY qui permet de vérifier si un utilisateur existe !

Ces commandes SMTP peuvent m’aider à énumérer les utilisateurs existants sur le système


Le scan agressif (-A)

Nmap propose une option tout-en-un qui combine plusieurs techniques :

1
sudo nmap 10.129.2.28 -p 80 -A

Qu’est-ce que -A fait exactement ?

  • -sV : Détection de version des services
  • -O : Détection de l’OS
  • --traceroute : Traçage de route
  • -sC : Scripts NSE par défaut

Résultat sur le port 80 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-17 01:38 CEST
Nmap scan report for 10.129.2.28
Host is up (0.012s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-generator: WordPress 5.3.4
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: blog.inlanefreight.com
MAC Address: DE:AD:00:00:BE:EF (Intel Corporate)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 2.6.32 (96%), Linux 3.2 - 4.9 (96%), Linux 2.6.32 - 3.10 (96%), Linux 3.4 - 3.10 (95%), Linux 3.1 (95%), Linux 3.2 (95%), 
AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), Synology DiskStation Manager 5.2-5644 (94%), Netgear RAIDiator 4.2.28 (94%), 
Linux 2.6.32 - 2.6.35 (94%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

TRACEROUTE
HOP RTT      ADDRESS
1   11.91 ms 10.129.2.28

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.36 seconds

Analyse des informations récupérées :

Web server : Apache 2.4.29 sur Ubuntu Application web : WordPress 5.3.4 Hostname : blog.inlanefreight.com OS probable : Linux (96% de confiance) Distance réseau : 1 hop (même réseau local)

Le scan agressif -A est un gain de temps énorme pour la reconnaissance initiale !


Vulnerability Assessment avec NSE

J’ai voulu aller plus loin en testant la catégorie vuln sur le port HTTP :

1
sudo nmap 10.129.2.28 -p 80 -sV --script vuln

Résultat :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Nmap scan report for 10.129.2.28
Host is up (0.036s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
| http-enum:
|   /wp-login.php: Possible admin folder
|   /readme.html: Wordpress version: 2
|   /: WordPress version: 5.3.4
|   /wp-includes/images/rss.png: Wordpress version 2.2 found.
|   /wp-includes/js/jquery/suggest.js: Wordpress version 2.5 found.
|   /wp-includes/images/blank.gif: Wordpress version 2.6 found.
|   /wp-includes/js/comment-reply.js: Wordpress version 2.7 found.
|   /wp-login.php: Wordpress login page.
|   /wp-admin/upgrade.php: Wordpress login page.
|_  /readme.html: Interesting, a readme.
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
| http-wordpress-users:
| Username found: admin
|_Search stopped at ID #25. Increase the upper limit if necessary with 'http-wordpress-users.limit'
| vulners:
|   cpe:/a:apache:http_server:2.4.29:
|       CVE-2019-0211   7.2 https://vulners.com/cve/CVE-2019-0211
|       CVE-2018-1312   6.8 https://vulners.com/cve/CVE-2018-1312
|       CVE-2017-15715  6.8 https://vulners.com/cve/CVE-2017-15715
<SNIP>

Ce que j’ai découvert avec le script vuln :

Énumération WordPress :

  • Page de login : /wp-login.php
  • Fichier readme : /readme.html
  • Utilisateur trouvé : admin

Vulnérabilités identifiées :

  • CVE-2019-0211 (score 7.2) - Élévation de privilèges Apache
  • CVE-2018-1312 (score 6.8) - Vulnérabilité d’authentification
  • CVE-2017-15715 (score 6.8) - Vulnérabilité d’upload

Les scripts vuln interrogent des bases de données de vulnérabilités connues - c’est un excellent point de départ pour l’exploitation !

Mon observation : Le script a même trouvé le nom d’utilisateur admin sur WordPress - ça pourrait être utile pour une attaque par brute-force !


Options importantes pour NSE

OptionDescriptionUsage
-sCExécute les scripts par défautReconnaissance initiale sûre
--script <category>Exécute tous les scripts d’une catégorieEx: --script vuln
--script <name>Exécute un script spécifiqueEx: --script banner
-AScan agressif (combinaison de tout)Reconnaissance complète rapide
--script vulnRecherche de vulnérabilitésAssessment de sécurité

Ma stratégie d’utilisation de NSE

Phase 1 - Reconnaissance initiale :

1
nmap -sC -sV <target>

Scripts par défaut + détection de version

Phase 2 - Énumération ciblée :

1
nmap --script <specific-script> -p <port> <target>

Scripts spécifiques sur les ports intéressants

Phase 3 - Vulnerability Assessment :

1
nmap --script vuln -sV <target>

Recherche de CVE et vulnérabilités connues

Ne jamais utiliser les catégories dos ou exploit sans autorisation explicite - elles peuvent endommager le système !


Use NSE and its scripts to find the flag that one of the services contain and submit it as the answer.

Voici ce que j’ai fait pour commencer :

1
nmap -sC -sV 10.129.98.200

Résultat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Nmap scan report for 10.129.98.200
Host is up (0.051s latency).
Not shown: 993 closed tcp ports (reset)
PORT      STATE SERVICE     VERSION
22/tcp    open  ssh         OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 71:c1:89:90:7f:fd:4f:60:e0:54:f3:85:e6:35:6c:2b (RSA)
|   256 e1:8e:53:18:42:af:2a:de:c0:12:1e:2e:54:06:4f:70 (ECDSA)
|_  256 1a:cc:ac:d4:94:5c:d6:1d:71:e7:39:de:14:27:3c:3c (ED25519)
80/tcp    open  http        Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.29 (Ubuntu)
110/tcp   open  pop3        Dovecot pop3d
|_pop3-capabilities: CAPA SASL RESP-CODES PIPELINING TOP AUTH-RESP-CODE UIDL
139/tcp   open  netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
143/tcp   open  imap        Dovecot imapd (Ubuntu)
|_imap-capabilities: LOGINDISABLEDA0001 IMAP4rev1 ENABLE post-login more have LITERAL+ listed capabilities IDLE Pre-login OK LOGIN-REFERRALS ID SASL-IR
445/tcp   open  netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
31337/tcp open  ftp         ProFTPD
Service Info: Host: NIX-NMAP-DEFAULT; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
| smb2-time: 
|   date: 2025-11-18T00:40:05
|_  start_date: N/A
|_nbstat: NetBIOS name: NIX-NMAP-DEFAUL, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery: 
|   OS: Windows 6.1 (Samba 4.7.6-Ubuntu)
|   Computer name: nix-nmap-default
|   NetBIOS computer name: NIX-NMAP-DEFAULT\x00
|   Domain name: \x00
|   FQDN: nix-nmap-default
|_  System time: 2025-11-18T01:40:05+01:00
|_clock-skew: mean: -20m00s, deviation: 34m38s, median: 0s
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 88.70 seconds

Donc là j’ai testé avec les scripts basiques NSE avec le -sC maintenant nous allons faire avec le script vuln pour voir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌─[eu-academy-3]─[10.10.14.131]─[htb-ac-1999270@htb-yz1xtgvsk9]─[~]
└──╼ [★]$ nmap --script vuln -p 80 10.129.98.200
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-11-17 18:45 CST
Nmap scan report for 10.129.98.200
Host is up (0.049s latency).

PORT   STATE SERVICE
80/tcp open  http
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-csrf: Couldn't find any CSRF vulnerabilities.
| http-enum: 
|_  /robots.txt: Robots file

Nmap done: 1 IP address (1 host up) scanned in 32.20 seconds

Et nous trouvons un fichier dans le port 80 nommé robots.txt alors je vais le curl pour vérifier si il contiendrait pas le flag que nous cherchons.

1
2
3
4
5
6
7
┌─[eu-academy-3]─[10.10.14.131]─[htb-ac-1999270@htb-yz1xtgvsk9]─[~]
└──╼ [★]$ curl http://10.129.98.200/robots.txt
User-agent: *

Allow: /

HTB{873nniuc71bu6usbs1i96as6dsv26}

Parfait nous avons ce que nous avions besoin

Réponse : HTB{873nniuc71bu6usbs1i96as6dsv26}


Performance

La performance de scan joue un rôle crucial quand on doit scanner un grand réseau ou qu’on travaille avec une bande passante limitée. Nmap offre plusieurs options pour contrôler la vitesse et l’agressivité des scans.

Un scan trop lent = perte de temps. Un scan trop rapide = risque de rater des informations !


Les options de performance disponibles

Nmap permet de contrôler plusieurs paramètres :

ParamètreOptionDescription
Vitesse-T <0-5>Templates de timing prédéfinis
Fréquence--min-parallelism <number>Nombre de sondes simultanées
Timeouts--max-rtt-timeout <time>Temps d’attente maximal pour une réponse
Taux d’envoi--min-rate <number>Nombre minimum de paquets par seconde
Retries--max-retries <number>Nombre de tentatives par port

Optimisation des Timeouts

Quand Nmap envoie un paquet, il attend un certain temps (Round-Trip-Time - RTT) pour recevoir une réponse. Par défaut, Nmap commence avec un timeout élevé de 100ms.

Test : Scanner un réseau /24 avec les top 100 ports

Scan par défaut :

1
sudo nmap 10.129.2.0/24 -F

Résultat :

1
Nmap done: 256 IP addresses (10 hosts up) scanned in 39.44 seconds

Scan avec RTT optimisé :

1
sudo nmap 10.129.2.0/24 -F --initial-rtt-timeout 50ms --max-rtt-timeout 100ms

Résultat :

1
Nmap done: 256 IP addresses (8 hosts up) scanned in 12.29 seconds

Mon analyse :

  • Temps de scan divisé par 3 : de 39.44s à 12.29s
  • Mais 2 hôtes en moins détectés : 10 → 8

Réduire trop le timeout initial peut faire rater des hôtes qui répondent lentement !

Conclusion : Un RTT timeout trop court = gain de temps mais perte de précision.


Réduction du nombre de Retries

Par défaut, Nmap réessaie 10 fois (--max-retries 10) si un port ne répond pas. On peut réduire ce nombre pour accélérer le scan.

Comparaison avec –max-retries

Scan par défaut :

1
sudo nmap 10.129.2.0/24 -F | grep "/tcp" | wc -l

Résultat : 23 ports trouvés

Scan sans retry :

1
sudo nmap 10.129.2.0/24 -F --max-retries 0 | grep "/tcp" | wc -l

Résultat : 21 ports trouvés

Mon observation :

  • 2 ports en moins détectés avec --max-retries 0
  • Ces ports ont probablement mis plus de temps à répondre

--max-retries 0 = Nmap abandonne immédiatement si pas de réponse. Risqué !

Cas d’usage : Utile quand on veut un scan ultra-rapide sur un réseau stable et qu’on accepte de possiblement rater quelques ports.


Contrôle du taux d’envoi (Rate)

En pentest white-box, on peut être whitelisté par les systèmes de sécurité. Dans ce cas, on peut augmenter le taux d’envoi de paquets pour accélérer drastiquement le scan.

L’option --min-rate <number> indique à Nmap d’envoyer au minimum X paquets par seconde.

Test avec –min-rate

Scan par défaut :

1
sudo nmap 10.129.2.0/24 -F -oN tnet.default

Résultat :

1
Nmap done: 256 IP addresses (10 hosts up) scanned in 29.83 seconds

Scan optimisé avec rate :

1
sudo nmap 10.129.2.0/24 -F -oN tnet.minrate300 --min-rate 300

Résultat :

1
Nmap done: 256 IP addresses (10 hosts up) scanned in 8.67 seconds

Vérification des ports trouvés :

Scan par défaut :

1
cat tnet.default | grep "/tcp" | wc -l

Résultat : 23 ports

Scan optimisé :

1
cat tnet.minrate300 | grep "/tcp" | wc -l

Résultat : 23 ports

Mon analyse :

  • Temps divisé par 3.5 : de 29.83s à 8.67s
  • Aucune perte d’information : 23 ports dans les deux cas !

Quand la bande passante le permet, --min-rate est un excellent moyen d’accélérer sans perdre de précision


Les Templates de Timing (-T)

Parce qu’on ne peut pas toujours optimiser manuellement (surtout en black-box), Nmap propose 6 templates de timing prédéfinis :

TemplateValeurNomUsage
-T 00ParanoidScan ultra-lent, furtif (IDS evasion)
-T 11SneakyScan très lent et discret
-T 22PoliteScan lent, réduit la charge réseau
-T 33NormalValeur par défaut, équilibré
-T 44AggressiveScan rapide (réseaux rapides et fiables)
-T 55InsaneScan ultra-rapide (réseaux très rapides)

Par défaut : Si on ne spécifie rien, Nmap utilise -T 3 (Normal).

Les templates -T 0 et -T 1 sont tellement lents qu’ils peuvent prendre des heures. À utiliser seulement pour l’évasion IDS !


Comparaison : Normal vs Insane

Scan Normal (par défaut)

1
sudo nmap 10.129.2.0/24 -F -oN tnet.default

Résultat :

1
Nmap done: 256 IP addresses (10 hosts up) scanned in 32.44 seconds

Scan Insane

1
sudo nmap 10.129.2.0/24 -F -oN tnet.T5 -T 5

Résultat :

1
Nmap done: 256 IP addresses (10 hosts up) scanned in 18.07 seconds

Vérification des ports trouvés :

Normal :

1
cat tnet.default | grep "/tcp" | wc -l

Résultat : 23 ports

Insane :

1
cat tnet.T5 | grep "/tcp" | wc -l

Résultat : 23 ports

Mon observation :

  • Temps réduit de 44% : de 32.44s à 18.07s
  • Aucune perte d’information dans ce cas

-T 5 peut être détecté par les IDS/IPS et peut provoquer des pertes de paquets sur des réseaux lents !


Ma stratégie selon le contexte

En Black-Box (pentest externe)

1
nmap -T 2 <target>  # Polite - Discret et lent

Pourquoi ? Pour éviter la détection par les IDS/IPS.

En White-Box (pentest interne avec autorisation)

1
nmap -T 4 --min-rate 300 <target>  # Aggressive + Rate

Pourquoi ? On peut être plus agressif, les systèmes de sécurité nous ignorent.

Sur un réseau rapide et stable

1
nmap -T 5 <target>  # Insane

Pourquoi ? Pour gagner un maximum de temps.

Quand on veut de la PRÉCISION avant tout

1
nmap -T 3 <target>  # Normal (par défaut)

Pourquoi ? Le meilleur compromis vitesse/fiabilité.


Options de performance importantes

OptionDescriptionImpact
-T 0 à -T 5Templates de timingContrôle global de la vitesse
--min-rate 300Minimum 300 paquets/secAccélération importante
--max-retries 0Pas de retryTrès rapide mais peut rater des ports
--initial-rtt-timeout 50msRTT initial réduitGain de temps mais risque de faux négatifs
--max-rtt-timeout 100msRTT max réduitPlus rapide mais moins fiable

Un scan trop rapide qui rate des informations critiques est pire qu’un scan lent mais complet !

Cours complété

This post is licensed under CC BY 4.0 by the author.