Ghosts In The Stack

Nmap

Rédacteur : Heurs

Date de création : 15/08/2008

Section : Sécurité > Réseaux

Imprimer cet article : en noir et blanc ou en couleurs

Voir les commentaires (4)

Outil de prédilection pour les prises d'empreinte réseau, ce "petit" programme est très complet et ses capacités réelles sont rarement exploitées. Souvent présenté avec deux, trois options et par conséquent discrédité nous allons tenter de remettre les pendules à l'heure concernant cet outil remarquable !

1. Installation

Pour la présentation j'ai pris la dernière version de nmap (au moment où j'écris ces lignes bien sur). C'est la 4.68, vous m'excuserez j'ai pris celle en ligne de commande parce que ça rox et que la GUI sux. Bref, on se download un .zip de 3.5 mega, en décompressant celui-ci on trouve une install de winpcap (à installer si vous ne l'avez pas déjà), un petit bout d'install de MS VisualC++ (à installer aussi), un .reg (à lancer aussi, il change 3 clés de votre registre) et toute la panoplie de fichiers nmap, dll, bases, scripts etc. Perso je copie cette panoplie dans system32 (parce que je suis un porc) mais quelqu'un de normal créerait un dossier et le référencerait dans le PATH.
Sous linux : apt-get install nmap

PS : Dans cette présentation je n'attaquerais pas les scripts.

2. Utilisation de base

Commencons par le commencement :

C:\nmap_present>[c=vert]nmap -h
Nmap 4.68 ( http://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
  Can pass hostnames, IP addresses, networks, etc.
  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
  -iL <inputfilename>: Input from list of hosts/networks
  -iR <num hosts>: Choose random targets
  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks
  --excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
  -sL: List Scan - simply list targets to scan
  -sP: Ping Scan - go no further than determining if host is online
  -PN: Treat all hosts as online -- skip host discovery
  -PS/PA/PU [portlist]: TCP SYN/ACK or UDP discovery to given ports
  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  -PO [protocol list]: IP Protocol Ping
  -n/-R: Never do DNS resolution/Always resolve [default: sometimes]
  --dns-servers <serv1[,serv2],...>: Specify custom DNS servers
  --system-dns: Use OS's DNS resolver
SCAN TECHNIQUES:
  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  -sU: UDP Scan
  -sN/sF/sX: TCP Null, FIN, and Xmas scans
  --scanflags <flags>: Customize TCP scan flags
  -sI <zombie host[:probeport]>: Idle scan
  -sO: IP protocol scan
  -b <FTP relay host>: FTP bounce scan
  --traceroute: Trace hop path to each host
  --reason: Display the reason a port is in a particular state
PORT SPECIFICATION AND SCAN ORDER:
  -p <port ranges>: Only scan specified ports
    Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080
  -F: Fast mode - Scan fewer ports than the default scan
  -r: Scan ports consecutively - don't randomize
  --top-ports <number>: Scan <number> most common ports
  --port-ratio <ratio>: Scan ports more common than <ratio>
SERVICE/VERSION DETECTION:
  -sV: Probe open ports to determine service/version info
  --version-intensity <level>: Set from 0 (light) to 9 (try all probes)
  --version-light: Limit to most likely probes (intensity 2)
  --version-all: Try every single probe (intensity 9)
  --version-trace: Show detailed version scan activity (for debugging)
SCRIPT SCAN:
  -sC: equivalent to --script=default
  --script=<Lua scripts>: <Lua scripts> is a comma separated list of
           directories, script-files or script-categories
  --script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts
  --script-trace: Show all data sent and received
  --script-updatedb: Update the script database.
OS DETECTION:
  -O: Enable OS detection
  --osscan-limit: Limit OS detection to promising targets
  --osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
  Options which take <time> are in milliseconds, unless you append 's'
  (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m).
  -T[0-5]: Set timing template (higher is faster)
  --min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes
  --min-parallelism/max-parallelism <time>: Probe parallelization
  --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies
      probe round trip time.
  --max-retries <tries>: Caps number of port scan probe retransmissions.
  --host-timeout <time>: Give up on target after this long
  --scan-delay/--max-scan-delay <time>: Adjust delay between probes
  --min-rate <number>: Send packets no slower than <number> per second
FIREWALL/IDS EVASION AND SPOOFING:
  -f; --mtu <val>: fragment packets (optionally w/given MTU)
  -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
  -S <IP_Address>: Spoof source address
  -e <iface>: Use specified interface
  -g/--source-port <portnum>: Use given port number
  --data-length <num>: Append random data to sent packets
  --ip-options <options>: Send packets with specified ip options
  --ttl <val>: Set IP time-to-live field
  --spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
  --badsum: Send packets with a bogus TCP/UDP checksum
OUTPUT:
  -oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
     and Grepable format, respectively, to the given filename.
  -oA <basename>: Output in the three major formats at once
  -v: Increase verbosity level (use twice or more for greater effect)
  -d[level]: Set or increase debugging level (Up to 9 is meaningful)
  --open: Only show open (or possibly open) ports
  --packet-trace: Show all packets sent and received
  --iflist: Print host interfaces and routes (for debugging)
  --log-errors: Log errors/warnings to the normal-format output file
  --append-output: Append to rather than clobber specified output files
  --resume <filename>: Resume an aborted scan
  --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
  --webxml: Reference stylesheet from Nmap.Org for more portable XML
  --no-stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
  -6: Enable IPv6 scanning
  -A: Enables OS detection and Version detection, Script scanning and Traceroute

  --datadir <dirname>: Specify custom Nmap data file location
  --send-eth/--send-ip: Send using raw ethernet frames or IP packets
  --privileged: Assume that the user is fully privileged
  --unprivileged: Assume the user lacks raw socket privileges
  -V: Print version number
  -h: Print this help summary page.
EXAMPLES:
  nmap -v -A scanme.nmap.org
  nmap -v -sP 192.168.0.0/16 10.0.0.0/8
  nmap -v -iR 10000 -PN -p 80
SEE THE MAN PAGE FOR MANY MORE OPTIONS, DESCRIPTIONS, AND EXAMPLES

Comme on le voit, nmap est très garni, il va nous falloir du temps pour tout assimiler.
Nous allons commencer en scannant une seule adresse IP, pour cela il suffit de la placer en premier argument :

C:\nmap_present>nmap 192.168.0.1

Interesting ports on 192.168.0.1:
Not shown: 1710 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
1025/tcp open  NFS-or-IIS
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

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

Ci-dessus on voit ce que répond un scan de base, ce type de scan montre les ports ouverts évidents et c'est tout. On peut aussi appliquer les masques réseau à l'adresse IP, par exemple un /24 équivaut à un 255.255.255.0 et un /8 à 255.0.0.0. Si l'on veut scanner tous les ports des machines présentes sur le réseau on tappe donc :

C:\nmap_present>nmap 192.168.0.0/24

Interesting ports on 192.168.0.1:
Not shown: 1710 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
1025/tcp open  NFS-or-IIS
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

Skipping SYN Stealth Scan against 192.168.0.2 because Windows does not support s
canning your own machine (localhost) this way.
0 ports scanned on 192.168.0.2

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

Nmap done: 256 IP addresses (3 hosts up) scanned in 16.250 seconds

Je suis 192.168.0.2, donc il ne scan aucun de mes ports.
On peut aussi scanner uniquement les adresses IP de 192.168.0.1 à 192.168.0.10 si on le souhaite, pour cela il faudra utiliser le "-" :

C:\nmap_present>nmap 192.168.0.1-10

Interesting ports on 192.168.0.1:
Not shown: 1710 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
1025/tcp open  NFS-or-IIS
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

Skipping SYN Stealth Scan against 192.168.0.2 because Windows does not support s
canning your own machine (localhost) this way.
0 ports scanned on 192.168.0.2

Nmap done: 10 IP addresses (2 hosts up) scanned in 2.844 seconds

Maintenant scannons de 192.168.0.1 à 192.168.0.20 et de 192.168.0.200 à 192.168.254 (ce sont les adresses généralement prises par des routeurs ou serveurs) et ce dans les réseaux 192.168.0.0 et 192.168.1.0. la séparation des zones se fait avec la virgule "," (on est pas obligé de mettre une zone, on peut aussi bien indiquer une seule et même adresse ip).

C:\nmap_present>nmap 192.168.0,1.1-10,200-254

Interesting ports on 192.168.0.1:
Not shown: 1710 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
1025/tcp open  NFS-or-IIS
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

Skipping SYN Stealth Scan against 192.168.0.2 because Windows does not support s
canning your own machine (localhost) this way.
0 ports scanned on 192.168.0.2

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

Nmap done: 130 IP addresses (3 hosts up) scanned in 40.875 seconds

Si on regarde, 65 * 2 = 130 adresses à scanner, le compte est bon !
Nous savons maintenant scanner des séries de réseaux et sélectionner les postes à scanner dans ces réseaux.

3. Quelques Options

3.1/ -p : Only scan specified ports

Option très importante de nmap, elle permet de sélectionner les ports à scanner. Tout comme sur les réseaux on peut établir des plages de ports à scanner et les séparer par des ",". Si l'on veut trouver tous les PC avec un HTTP ou un FTP on peut tapper par exemple :

C:\nmap_present>nmap 192.168.0.0/24 -p 21,80

Interesting ports on 192.168.0.1:
PORT   STATE  SERVICE
21/tcp open   ftp
80/tcp closed http
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

Skipping SYN Stealth Scan against 192.168.0.2 because Windows does not support s
canning your own machine (localhost) this way.
0 ports scanned on 192.168.0.2

Interesting ports on 192.168.0.254:
PORT   STATE    SERVICE
21/tcp filtered ftp
80/tcp open     http
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

Nmap done: 256 IP addresses (3 hosts up) scanned in 6.594 seconds

Revenons un instant sur les systèmes de connexion TCP :
- Dans le cas d'un port ouvert (open sous nmap) :
Envoie d'un SYN de nmap,
Réception d'un SYN/ACK en provenance de la cible,
Envoie d'un RST

- Dans le cas d'un port fermé (Closed sous nmap) :
Envoie d'un SYN de nmap
Reception d'un RST/ACK en provenance de la cible

- Dans le cas d'un port filtré (filtered sous nmap) :
Envoie d'un SYN de nmap
Aucune réponse... La plus part du temps ça indique qu'il y a un parfeu quelque part.

Si vous n'avez rien compris aux flags TCP (SYN ACK et RST) allez jeter un oeil à la RFC 793 [1] ;-)

3.2/ -v: Increase verbosity level

Ca c'est le niveau d'informations renvoyées, un "v" pour plus d'infos et deux "vv" pour en avoir un max ! Reprenons le scan d'avant et ajoutons y le "vv" :

C:\nmap_present>nmap 192.168.0.0/24 -p 21,80 -vv

Initiating ARP Ping Scan at 15:02
Scanning 2 hosts [1 port/host]
Completed ARP Ping Scan at 15:02, 0.61s elapsed (2 total hosts)
Initiating Parallel DNS resolution of 2 hosts. at 15:02
Completed Parallel DNS resolution of 2 hosts. at 15:02, 0.20s elapsed
Initiating Parallel DNS resolution of 1 host. at 15:02
Completed Parallel DNS resolution of 1 host. at 15:02, 0.36s elapsed
Initiating SYN Stealth Scan at 15:02
Scanning 192.168.0.1 [2 ports]
Discovered open port 21/tcp on 192.168.0.1
Completed SYN Stealth Scan at 15:02, 0.03s elapsed (2 total ports)
Host 192.168.0.1 appears to be up ... good.
Scanned at 2008-07-13 15:02:04 Paris, Madrid (heure d'ÚtÚ) for 2s
Interesting ports on 192.168.0.1:
PORT   STATE  SERVICE
21/tcp open   ftp
80/tcp closed http
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

Initiating ARP Ping Scan at 15:02
Scanning 253 hosts [1 port/host]
Completed ARP Ping Scan at 15:02, 5.30s elapsed (253 total hosts)
Initiating Parallel DNS resolution of 253 hosts. at 15:02
Completed Parallel DNS resolution of 253 hosts. at 15:02, 0.22s elapsed
Skipping SYN Stealth Scan against 192.168.0.2 because Windows does not support s
canning your own machine (localhost) this way.
Host 192.168.0.2 appears to be up ... good.
0 ports scanned on 192.168.0.2

Initiating SYN Stealth Scan at 15:02
Scanning 192.168.0.254 [2 ports]
Discovered open port 80/tcp on 192.168.0.254
Completed SYN Stealth Scan at 15:02, 1.26s elapsed (2 total ports)
Host 192.168.0.254 appears to be up ... good.
Scanned at 2008-07-13 15:02:06 Paris, Madrid (heure d'ÚtÚ) for 6s
Interesting ports on 192.168.0.254:
PORT   STATE    SERVICE
21/tcp filtered ftp
80/tcp open     http
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

Read data files from: C:\WINDOWS\system32
Nmap done: 256 IP addresses (3 hosts up) scanned in 8.328 seconds
           Raw packets sent: 513 (21.556KB) | Rcvd: 5 (222B)

Pour l'instant les infos récupérées ne sont pas des plus interessantes, mais nous voyons tout de même une résolution DNS des adresses IP... Nous reviendrons dessus tout à l'heure.

3.3/ -F: Fast mode

Réstreint le nombre de ports à scanner, sur un seul poste la différence n'est pas exeptionnelle mais sur 100 ça commence à se faire sentir, surtout si l'on ralenti les envois de packets (nous le ferons tout à l'heure).

C:\nmap_present>nmap 192.168.0.254 -F

Interesting ports on 192.168.0.254:
Not shown: 1274 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

On peut voir que 1276 ports sont scannés au lieu de 1715 en scan normal, soit 439 ports économisés.

3.4/ -r: Scan ports consecutively

Par défaut nmap scan les ports en aléatoire, le -r le force à les scanner dans l'ordre, ca peut être utile pour tester un parfeu ou encore pour débugger un scan.

3.5/ --exclude

Ici on exlu une/des adresse(s) IP à scanner, très utile si l'on veut éviter de réveiller un honeypot ou un IDS détecté précédement.

C:\nmap_present>nmap 192.168.0.0/24 --exclude 192.168.0.1

Skipping SYN Stealth Scan against 192.168.0.2 because Windows does not support s
canning your own machine (localhost) this way.
0 ports scanned on 192.168.0.2

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

Nmap done: 255 IP addresses (2 hosts up) scanned in 15.875 seconds

3.6/ -sP: Ping Scan

Effectue une série de ping (envoie de requetes ICMP) pour déterminer les postes en ligne.

C:\nmap_present>nmap -sL 72.14.221.104

Host fg-in-f104.google.com (72.14.221.104) not scanned
Nmap done: 1 IP address (0 hosts up) scanned in 0.219 seconds

C:\nmap_present>nmap -sP 192.168.0.0/24

Host 192.168.0.1 appears to be up.
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)
Host 192.168.0.2 appears to be up.
Host 192.168.0.254 appears to be up.
MAC Address: 00:0A:78:8C:96:C6 (Olitec)
Nmap done: 256 IP addresses (3 hosts up) scanned in 6.187 seconds

C'est un scan rapide et peu bruyant, donc une discrétion assurée... ou presque. Oui il faut bien savoir (pour un scan en réseau local) que nmap va bombarder de requêtes ARP pour touver les adresses MAC des différents équipements, et ça c'est moins discret ! Petit rappel les requêtes ARP sont faites en broadcast donc tout le monde se les tappe.

3.7/ -PN: Treat all hosts as online

C'est notre nouveau -P0. Avant de scanner nmap fait un ping sur les hosts (si ils ne sont pas dans le même réseau), si l'host répond nmap le scan. Le problème c'est que beaucoup de parfeu bloquent les réponses ICMP (celui de XP en fait parti) et donc on peut très bien passer à côté de postes connectés juste parcequ'ils n'auront pas répondu. Avec cette option, même si le poste ne répond pas il sera quand même scanné :-p
En réseau local nmap utilise automatiquement l'option -PR qui fait un scan par requêtes ARP. Il y a un double avantage, déjà il sait quel poste est connecté au réseau et ensuite il récupère son adresse MAC :-)

3.8/ -PE/PP/PM

Ces options ne sont pas utilisées en réseau local (et oui encore une fois c'est le -PR qui trone) mais sur internet si. Le -PE fait un simple ping avant de scanner un poste, sans cette option nmap fait deux tests (le ping et il essaie aussi de se connecter au port 80).
Le -PP envoie aussi un packet ICMP mais pour récupérer le timestamp cette fois. Parfois cette option n'est pas filtrée donc voilà, nmap l'a pris en compte.
Le -PM envoie encore et toujours un ICMP et cette fois c'est pour récupérer le masque réseau. Comme pour le PP parfois ces packets ne sont pas filtrés.

C:\nmap_present>nmap -PE 172.16.0.0/24

Nmap done: 256 IP addresses (0 hosts up) scanned in 53.421 seconds

C:\nmap_present>nmap -PP 172.16.0.0/24

Interesting ports on 172.16.0.7:
Not shown: 1714 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 256 IP addresses (1 host up) scanned in 24.265 seconds

C:\nmap_present>nmap -PM 172.16.0.0/24

Starting Nmap 4.68 ( http://nmap.org ) at 2008-07-13 23:19 Paris, Madrid (heure
d'ÚtÚ)
Nmap done: 256 IP addresses (0 hosts up) scanned in 53.422 seconds

3.9/ --dns-servers : Specify custom DNS servers

Sert à désigner un DNS particulier à aller tapper pour les résolutions. Ca peut être utile si on audite une boite possédant un Active Directory par exemple. Tous les postes connéctés à celui-ci sont référencés dans le DNS. Et parfois on trouve des choses bizzares... enfin je vous en dis pas plus !

3.10/ -sS/sT/sA/sW/sM

Youhou ! On rentre dans les scans de port :-)
Bon le -sS, un grand classique ! On envoie un SYN, mais c'est tout, on fermera juste la connection avec un RST derrière. La communication pour un port ouvert est alors :
Envoie d'un SYN par nmap
Reception d'un SYN/ACK provenant de la cible
Envoie d'un RST par nmap

Et là le serveur attend toujours son ACK, mais il peut attendre longtemps parce que nmap n'est pas décidé à lui donner.

Le -sT se connecte caremment au port distant en renvoyant un ACK avant le RST habituel. Le traffic ressemble plus à quelque chose de normal du point de vue d'un firewall ou d'un IDS (si peu de ports sont scannés bien sûr).
Le traffic sera donc pour un port ouvert :
Envoie d'un SYN par nmap
Réception de SYN/ACK en provenance de la cible
Envoie d'un ACK de nmap
Envoie d'un RST de nmap

-sA lui envoie uniquement le flag ACK. Si un port n'est pas filtré il doit normalement répondre par un RST. Parfois on voit des choses bizzares, des ports répondant en SYN/ACK et qui avec ce test sont filtrés... Dans ce cas attention aux backdoors (si vous êtes admin du réseau) ! Si vous l'attaquez c'est au contraire une bonne nouvelle pour vous.

C:\nmap_present>nmap 192.168.0.1 -sA

Interesting ports on 192.168.0.1:
Not shown: 1714 unfiltered ports
PORT   STATE    SERVICE
21/tcp filtered ftp
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

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

C:\nmap_present>nmap 192.168.0.254 -sA

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE      SERVICE
80/tcp   unfiltered http
1900/tcp unfiltered upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

Comme on le voit le port 21 de chez moi est ouvert mais après le scan il me dit qu'il est filtré... Et je vous confirme, il n'y a pas de serveur FTP chez moi, donc...

-sW c'est le côté un peu obscure, nmap envoie un ACK et si réponse il y a, regardez sa taille de fenêtre (Window) avec cette information on détermine si le port est ouvert ou non. Par exemple sous linux, souvent si le Window est à 0 c'est que le port est fermé et si il est à une valeur autre c'est qu'il est ouvert.

C:\nmap_present>nmap 192.168.0.254 -sW

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

Arrive enfin le -SM, pour lui il sera envoyé des FIN/ACK, si une réponse est perçue (RST), le port est fermé, si rien n'est perçu c'est qu'il est ouvert. Bon, prendre les résultats avec des pinces car suivant les systèmes les réponses sont complètement différentes.

C:\nmap_present>nmap 192.168.0.254 -sM

Interesting ports on 192.168.0.254:
Not shown: 1713 open|filtered ports
PORT     STATE  SERVICE
80/tcp   closed http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

C:\nmap_present>nmap 192.168.0.1 -sM

Interesting ports on 192.168.0.1:
Not shown: 1714 closed ports
PORT   STATE         SERVICE
21/tcp open|filtered ftp
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

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

Vous voyez. L'avantage est qu'on a une analyse comportementale de plus tout de même !

3.11/ -sU

Pour scanner en UDP, les scans UDP sont particuliers car comme c'est un protocole non connecté on a pas les échanges de flags pour déterminer un port ouvert ou non. Si un port est fermé on recoit normalement un packet ICMP avec l'erreur "Port unreachable". Donc si un parfeu bloque ce message d'erreur ICMP on a pas vraiment de moyen pour reconnaître un port ouvert d'un fermé (capture de bannières applicatives exclu bien sûr).

3.12/ -sN/sF/sX: TCP Null, FIN, and Xmas scans

On joue encore et toujours avec les flags TCP pour essayer de faire passer un petit packet un peu plus loin que les autres... Il faut savoir que si 1 packet a donné un résultat différent des autres c'est qu'il y a quelque chose à aller chercher dans ce coin. C'est qu'une routine à été appliquée à ce port / type de packet et donc peut faire l'objet d'informations complémentaires.

-sN met tous les flags TCP à 0, autrement dit notre packet est une coquille. Si on ne recoit pas un RST/ACK c'est que le port est probablement fermé. La plupart du temps ca peut nous permettre de voir quels ports filtrent un parfeu. Si on reçoit un retour (RST ou RST/ACK) c'est que le port est fermé.

C:\nmap_present>nmap -sN 192.168.0.254

Interesting ports on 192.168.0.254:
Not shown: 1714 open|filtered ports
PORT     STATE  SERVICE
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

La réponse est clair, seul le port 1900 est vraiment filtré.

Pour le -sF on active le flag FIN, normalement utilisé pour mettre fin à une connexion proprement (en réalité quasi jamais utilisé). Si le port est fermé la réponse normale doit etre la même que le -sN.

-sX utilise un savant mélange de FIN/PSH/URG, bref les flags les moins courants (bon ok, le PSH on le trouve tout de même dans les transferts de données, à la fois il est là pour ça...). Encore une fois le but est le même que le -sN.

3.13/ --scanflags

Pour les énervés comme moi qui aiment bien moduler des scans à leur volonté pour tester si tel ou telle chose rentre dans tel ou telle routine nmap nous propose de customiser nos flags TCP :-p
Un petit exemple, on va forger nos packets SYN / PSH / URG. Pour cela on va coller les flags bout à bout et les passer à nmap :

C:\nmap_present>nmap --scanflags SYNPSHURG 192.168.0.254 -p 80,1900,55

Interesting ports on 192.168.0.254:
PORT     STATE    SERVICE
55/tcp   filtered isi-gl
80/tcp   open     http
1900/tcp closed   upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

3.14/ -sI

L'idle host scan, technique super sympa, exploitant en finesse les incrémentations IPID. Un article a déjà été rédigé sur cette technique, je vous invite à aller le lire pour plus d'informations sur cette méthode de scan [2] ;-)
Dans ce scan on spoof son adresse IP par celle du zombie, donc le scanné pense que c'est zombie qui le scan et non nous :-)

C:\nmap_present>nmap -sI 192.168.0.254:80 192.168.0.1
WARNING: Many people use -PN w/Idlescan to prevent pings from their true IP.  On
 the other hand, timing info Nmap gains from pings can allow for faster, more re
liable scans.

Idle scan using zombie 192.168.0.254 (192.168.0.254:80); Class: Incremental
Interesting ports on 192.168.0.1:
Not shown: 1710 closed|filtered ports
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
1025/tcp open  NFS-or-IIS
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

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

Nous aurons utilisé 192.168.0.254 en idle avec son port 80 pour scanner 192.168.0.1. Et ça marche, la preuve !

3.15/ --traceroute: Trace hop path to each host

Cette option utilise le système d'incrémentation TTL pour découvrir par quels équipements est passé notre packet. Le TTL part de 1 et est incrémenté jusqu'à ce que l'on arrive à destination. Pour être sûr d'arriver à destination on utilise un port ouvert. La commande traceroute de windows et Tracert de linux font la même chose mais avec les packets ICMP, en utilisant le TCP on recoit beaucoup plus de réponses :

C:\nmap_present>nmap --traceroute google.fr -p 80

Warning: Hostname google.fr resolves to 3 IPs. Using 216.239.59.104.
Interesting ports on 216.239.59.104:
PORT   STATE SERVICE
80/tcp open  http

TRACEROUTE (using port 80/tcp)
HOP RTT   ADDRESS
1   0.00  192.168.0.1
2   62.00 AOrleans-257-1-122-1.w90-19.abo.wanadoo.fr (90.19.175.1)
3   62.00 10.125.146.78
4   62.00 193.253.83.110
5   47.00 81.253.129.141
6   63.00 tengige0-12-0-6.auvtr1.Aubervilliers.opentransit.net (193.251.242.142)
7   47.00 tengige0-3-0-3.pastr1.Paris.opentransit.net (193.251.250.181)
8   63.00 telia.GW.opentransit.net (193.251.250.182)
9   62.00 prs-bb1-link.telia.net (80.91.251.113)
10  78.00 prs-b1-link.telia.net (80.91.250.253)
11  62.00 google-ic-122460-prs-b1.c.telia.net (213.248.98.210)
12  78.00 64.233.175.234
13  78.00 216.239.49.46
14  94.00 209.85.250.216
15  94.00 66.249.95.164
16  94.00 216.239.49.114
17  94.00 216.239.59.104

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

Ca y est je suis grillé, maintenant tout le monde sait que je passe de temps en temps à côté d'Orléans !

3.16/ -sV

Le -sV de base à pour but d'analyser les banières applicatives des programmes. Beaucoup de programmes envoient un prologue pour souhaiter la bienvenue à leurs visiteurs, par ce biais on indique quel logiciel est en écoute et même sa version ! Ces informations sont cruciales lors d'une prise d'empreinte, elle peuvent nous indiquer la présence d'un application non patchée par exemple.
Si le port ne nous renvoie rien on émet des entêtes pour le faire réagir.

C:\nmap_present>nmap -sV google.fr -p 80

Warning: Hostname google.fr resolves to 3 IPs. Using 72.14.221.104.
Interesting ports on fg-in-f104.google.com (72.14.221.104):
PORT   STATE SERVICE VERSION
80/tcp open  http    Google httpd 1.3 (GFE)
Service Info: OS: Linux

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

La sous option --version-intensity prend en argument un chiffre entre 0 et 9, 0 étant un minimum de tests pour détecter l'appli et 9 un max. 9 fait environ 6 fois plus de tests l'air de rien...

Enfin la sous option --version-trace permet d'avoir masse d'infos sur comment s'est déroulé la prise d'empreinte. De toute façon nmap nous affiche un dump si il n'a pas trouvé l'appli. Ce dump contient une synthèse de nos infos ici présentes.

C:\nmap_present>nmap -sV google.fr -p 80 --version-trace

Winpcap present, dynamic linked to: WinPcap version 4.0.2 (packet.dll version 4.
0.0.1040), based on libpcap version 0.9.5

--------------- Timing report ---------------
  hostgroups: min 1, max 100000
  rtt-timeouts: init 1000, min 100, max 10000
  max-scan-delay: TCP 1000, UDP 1000
  parallelism: min 0, max 0
  max-retries: 10, host-timeout: 0
  min-rate: 0
---------------------------------------------
Warning: Hostname google.fr resolves to 3 IPs. Using 66.249.93.104.
Packet capture filter (device eth0): dst host 192.168.0.2 and (icmp or ((tcp or
udp) and (src host 66.249.93.104)))
We got a TCP ping packet back from 66.249.93.104 port 80 (trynum = 0)
Overall sending rates: 7.12 packets / s, 241.99 bytes / s.
mass_rdns: Using DNS server 192.168.0.1
mass_rdns: 0.06s 0/1 [#: 1, OK: 0, NX: 0, DR: 0, SF: 0, TR: 1]
DNS resolution of 1 IPs took 0.08s. Mode: Async [#: 1, OK: 1, NX: 0, DR: 0, SF:
0, TR: 1, CN: 0]
Packet capture filter (device eth0): dst host 192.168.0.2 and (icmp or (tcp and
(src host 66.249.93.104)))
Overall sending rates: 10.64 packets / s, 468.09 bytes / s.
NSOCK (0.7190s) msevent_new (IOD #1) (EID #8)
NSOCK (0.7190s) TCP connection requested to 66.249.93.104:80 (IOD #1) EID 8
NSOCK (0.7190s) nsock_loop() started (no timeout). 1 events pending
NSOCK (0.7190s) wait_for_events
NSOCK (0.7970s) Callback: CONNECT SUCCESS for EID 8 [66.249.93.104:80]
NSOCK (0.7970s) msevent_new (IOD #1) (EID #18)
NSOCK (0.7970s) Read request from IOD #1 [66.249.93.104:80] (timeout: 6000ms) EID 18
NSOCK (0.7970s) msevent_delete (IOD #1) (EID #8)
NSOCK (0.8910s) wait_for_events
NSOCK (6.7970s) Callback: READ TIMEOUT for EID 18 [66.249.93.104:80]
NSOCK (6.7970s) msevent_new (IOD #1) (EID #27)
NSOCK (6.7970s) Write request for 18 bytes to IOD #1 EID 27 [66.249.93.104:80]:
GET / HTTP/1.0....
NSOCK (6.7970s) msevent_new (IOD #1) (EID #34)
NSOCK (6.7970s) Read request from IOD #1 [66.249.93.104:80] (timeout: 5000ms) EID 34
NSOCK (6.7970s) msevent_delete (IOD #1) (EID #18)
NSOCK (6.7970s) wait_for_events
NSOCK (6.7970s) Callback: WRITE SUCCESS for EID 27 [66.249.93.104:80]
NSOCK (6.7970s) msevent_delete (IOD #1) (EID #27)
NSOCK (6.7970s) wait_for_events
NSOCK (6.8910s) Callback: READ SUCCESS for EID 34 [66.249.93.104:80] (579 bytes)
NSOCK (6.8910s) msevent_new (IOD #1) (EID #42)
NSOCK (6.8910s) Read request from IOD #1 [66.249.93.104:80] (timeout: 4891ms) EID 42
NSOCK (6.8910s) msevent_delete (IOD #1) (EID #34)
NSOCK (6.9060s) wait_for_events
NSOCK (6.9060s) Callback: READ EOF for EID 42 [66.249.93.104:80]
NSOCK (6.9060s) msevent_new (IOD #2) (EID #48)
NSOCK (6.9060s) TCP connection requested to 66.249.93.104:80 (IOD #2) EID 48
NSOCK (6.9060s) msevent_delete (IOD #2) (EID #42)
NSOCK (6.9060s) wait_for_events
NSOCK (7.0000s) Callback: CONNECT SUCCESS for EID 48 [66.249.93.104:80]
NSOCK (7.0000s) msevent_new (IOD #2) (EID #59)
NSOCK (7.0000s) Write request for 22 bytes to IOD #2 EID 59 [66.249.93.104:80]:
OPTIONS / HTTP/1.0....
NSOCK (7.0000s) msevent_new (IOD #2) (EID #66)
NSOCK (7.0000s) Read request from IOD #2 [66.249.93.104:80] (timeout: 5000ms) EID 66
NSOCK (7.0000s) msevent_delete (IOD #2) (EID #48)
NSOCK (7.0470s) wait_for_events
NSOCK (7.0470s) Callback: WRITE SUCCESS for EID 59 [66.249.93.104:80]
NSOCK (7.0470s) msevent_delete (IOD #2) (EID #59)
NSOCK (7.0470s) wait_for_events
NSOCK (7.2030s) Callback: READ SUCCESS for EID 66 [66.249.93.104:80] (3380 bytes)
NSOCK (7.2030s) msevent_delete (IOD #2) (EID #66)
Starting RPC scan against ug-in-f104.google.com (66.249.93.104)
SCRIPT ENGINE: Initiating script scanning.
SCRIPT ENGINE: Script scanning ug-in-f104.google.com (66.249.93.104).
SCRIPT ENGINE: Initialized 4 rules
SCRIPT ENGINE: Matching rules.
SCRIPT ENGINE: Running scripts.
SCRIPT ENGINE: Script scanning completed.
Scanned at 2008-07-24 21:31:45 Paris, Madrid (heure d'ÚtÚ) for 7s
Interesting ports on ug-in-f104.google.com (66.249.93.104):
PORT   STATE SERVICE VERSION
80/tcp open  http    Google httpd 1.3 (GFE)
Service Info: OS: Linux
Final times for host: srtt: 94000 rttvar: 70500  to: 376000

Read from C:\WINDOWS\system32: nmap-rpc nmap-service-probes nmap-services.
Service detection performed. Please report any incorrect results at http://nmap.
org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.250 seconds

3.17/ -O

Ce qu'il faut déjà savoir c'est que nmap se base sur le fichier nmap-os-db (23 000 lignes de code :p) pour la détection. Avant de se lancer dans la conception d'une nouvelle signature faisons une analyse rapide des différentes méthodes de détection qu'il emploie. Dans notre exemple nous prendrons un signature windows 2000 (SP4) :

SEQ(SP=FD-107%GCD=<7%ISR=102-10C%TI=I%II=I%SS=S%TS=U)
OPS(O1=M5B4NW0NNS%O2=M5B4NW0NNS%O3=M5B4NW0%O4=M5B4NW0NNS%O5=M5B4NW0NNS%O6=M5B4NNS)
WIN(W1=FAF0%W2=FAF0%W3=FAF0%W4=FAF0%W5=FAF0%W6=FAF0)
ECN(R=Y%DF=Y%T=40%TG=40%W=FAF0%O=M5B4NW0NNS%CC=N%Q=)
T1(R=Y%DF=Y%T=40%TG=40%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=Y%DF=N%T=40%TG=40%W=0%S=Z%A=S%F=AR%O=%RD=0%Q=)
T3(R=Y%DF=Y%T=40%TG=40%W=FAF0%S=O%A=S+%F=AS%O=M5B4NW0NNS%RD=0%Q=)
T4(R=Y%DF=N%T=40%TG=40%W=0%S=A%A=O%F=R%O=%RD=0%Q=)
T5(R=Y%DF=N%T=40%TG=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=N%T=40%TG=40%W=0%S=A%A=O%F=R%O=%RD=0%Q=)
T7(R=Y%DF=N%T=40%TG=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
U1(DF=N%T=40%TG=40%TOS=0%IPL=38%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUL=G%RUD=G)
IE(DFI=S%T=40%TG=40%TOSI=Z%CD=Z%SI=S%DLI=S)



SEQ : Plusieurs packets de flag SYN sont envoyés afin de voir l'évolution du numéro de séquence.
OPS : Teste les 6 options TCP
WIN : Les différents Window TCP récupérés
ECN : Un packet avec les flags ECE / SYN / CWR, un champs URG placé à 0xF7F5, un champs ACK à 0, une winsize à 3, un Widow Scale à 0x10, un NOP, un MSS à 1460, un SACK permitted et 2 NOP. Rien que ca !
T1 : Un packet de flag SYN est envoyé sur un port TCP ouvert.
T2 : Un packet NUL est envoyé sur un port TCP ouvert.
T3 : Un packet de flag SYN,PSH,URG,FIN est envoyé sur un port TCP ouvert
T4 : Un packet ACK est envoyé sur un port TCP ouvert.
T5 : Un packet SYN est envoyé sur un port TCP fermé.
T6 : Un packet ACK est envoyé sur un port TCP fermé.
T7 : Un packet PSH,URG,FIN est envoyé sur un port TCP fermé
U1 : Un packet est envoyé sur un port UDP fermé.
IE : ICMP ECHO

Quelques champs en vrac :
R=[Y/N] Si il y a une réponse ou non.
DF=[Y/N] Si c'est le dernier fragment
T=[Number] Valeur TTL en hexadécimal
TG= [Number] Deuxième valeur TTL possible en hexadécimal (généralement c'est les meme qu'en TTL)
W=[Number] Valeur en hexa désignant le window TCP
S=[Z/A(+)/O] Numéro de séquence à zéro ou aléatoire
A=[Z/S(+)/O] Numéro d'aquitement (ACK) par rapport au numéro de séquence émetteur
F=[S/A/R/F/U/P/E] Les flags TCP utilisés
RD=[0/Number] Lors d'un retour en RST il y a parfois (rarement) une signature dans les data, si il y a 0 c'est qu'aucune signature n'est présente, si il y a un nombre c'est le hash de cette signature.
0=[L/N/M/W/T/S] Si un champs d'otpion TCP est fixé
Q=[] J'ai jamais vu quelque chose dans ce champs

Je m'arrête là pour la lecture d'une signature, pour plus d'infos nmap.org est bien plus clair que moi [3].

Deux sous options peuvent être utilisées avec la détection d'OS, --osscan-limit et --osscan-guess. Le premier fait un scan normal et le deuxième est utilisé lorsqu'un pafeu nous empèche une bonne détection, il effectue plus de tests et est plus souple sur les résultats en retour.

C:\nmap_present>nmap 192.168.0.1 -O -vv

Scanning 192.168.0.1 [1 port]
Completed ARP Ping Scan at 19:10, 0.33s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 19:10
Completed Parallel DNS resolution of 1 host. at 19:10, 0.08s elapsed
Initiating SYN Stealth Scan at 19:10
Scanning 192.168.0.1 [1715 ports]
Discovered open port 21/tcp on 192.168.0.1
Discovered open port 1025/tcp on 192.168.0.1
Discovered open port 135/tcp on 192.168.0.1
Discovered open port 445/tcp on 192.168.0.1
Discovered open port 139/tcp on 192.168.0.1
Completed SYN Stealth Scan at 19:10, 1.51s elapsed (1715 total ports)
Initiating OS detection (try #1) against 192.168.0.1
Retrying OS detection (try #2) against 192.168.0.1
Host 192.168.0.1 appears to be up ... good.
Scanned at 2008-08-10 19:10:15 Paris, Madrid (heure d'ÚtÚ) for 6s
Interesting ports on 192.168.0.1:
Not shown: 1710 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
1025/tcp open  NFS-or-IIS
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)
Device type: general purpose
Running (JUST GUESSING) : Microsoft Windows XP (92%)
OS fingerprint not ideal because: Didn't receive UDP response. Please try again with -sSU
Aggressive OS guesses: Microsoft Windows XP SP2 (92%), Microsoft Windows XP Professional SP2 (firewall enabled) (88%), Version 5.1 (build 2600.xpsp.080125-2028:Service Pack 3, v3300) (86%)
No exact OS matches for host (test conditions non-ideal).
TCP/IP fingerprint:
SCAN(V=4.68%D=8/10%OT=21%CT=1%CU=%PV=Y%DS=1%G=N%M=00138F%TM=489F20FE%P=i686-pc-windows-windows)
SEQ(SP=106%GCD=1%ISR=10C%TI=I%II=I%SS=S%TS=U)
SEQ(SP=106%GCD=2%ISR=10C%TI=I%II=I%SS=S%TS=U)
OPS(O1=M5B4NW0NNS%O2=M5B4NW0NNS%O3=M5B4NW0%O4=M5B4NW0NNS%O5=M5B4NW0NNS%O6=M5B4NNS)
WIN(W1=FFFF%W2=FFFF%W3=FFFF%W4=FFFF%W5=FFFF%W6=FFFF)
ECN(R=Y%DF=N%TG=40%W=FFFF%O=M5B4NW0NNS%CC=N%Q=)
T1(R=Y%DF=N%TG=40%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=N)
T3(R=N)
T4(R=N)
T5(R=Y%DF=N%TG=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=N%TG=40%W=0%S=A%A=O%F=R%O=%RD=0%Q=)
T7(R=N)
U1(R=N)
IE(R=Y%DFI=S%TG=40%TOSI=Z%CD=Z%SI=S%DLI=S)

Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=262 (Good luck!)
IP ID Sequence Generation: Incremental

Read data files from: C:\WINDOWS\system32
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.266 seconds
           Raw packets sent: 1891 (86.718KB) | Rcvd: 1738 (80.480KB)

3.18/ -T[0-5]

Cette option détermine la rapidité du scan, si on met -T5 c'est un scan barbare qui aura lieu, tous les IDS vont se mettre à hurler ! Avec un -T0 vous mettez toutes les chances de votre côté pour passer innapercu, en revanche au lieu d'avoir un scan qui dure 10sc il durera une semaine... (ou plus !)
C'est le temps entre les packets qui est modulé, pour info même le -T1 peut être détecté, les parfeux checkpoint le font :-( A la fois ce ne sont pas les parfeux les plus courants.

Nous avons aussi les options --max-retries qui déterminent le nombre maximum d'essay que peut faire nmap sur un port. --host-timeout indique en milisecondes le temps qu'a l'équipement distant pour répondre. On ne peut pas mettre de valeur en dessous de 1500 millisecondes par contre.

C:\nmap_present>nmap 192.168.0.254 -p 70-100,1890-1910 -T5

Interesting ports on 192.168.0.254:
Not shown: 49 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
1910/tcp closed unknown
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

C:\nmap_present>nmap 192.168.0.254 -p 70-100,1890-1910 -T2

Interesting ports on 192.168.0.254:
Not shown: 49 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
1910/tcp closed unknown
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

3.19/ -f; --mtu

Attaque ayant pour but de bypasser certains firewall. Sur les réseaux Ethernet le MTU est fixé à 1500, du fait qu'une trame fait au maximum 1518 octets. Ici on modifie sa valeur avec comme objectif d'exploiter des bugs dans le système de stockage de l'encapsulation IP/TCP en mémoire. Je m'explique.

La fragmentation des packets est gérée par IP, lors de l'envoie d'un packet fragmenté le premier packet enverra donc l'entête TCP, les suivants ne la possèderont pas. Chaque nouveau fragment recu contient dans le champs "Fragment Offset" l'offset à partir duquel il faut écrire les nouvelles données. Si l'on spécifie à ce champs un offset pointant sur l'entête TCP nous pourons donc la réécrire. Ainsi un packet vers un port valide envoyé peut devenir un packet vers un port invalide !

Désolé je n'ai pas de parfeu sur lequel tester cette fonctionnalité, mais je complèterais l'article dés que ce sera le cas.

3.20/ -D

On émule des requêtes provenant de plein d'ip sources différentes, le but est ici de se fondre dans la masse. Un admin réseau voyant que tous ses postes le scanne sera assez désorienté pour déterminer l'attaquant réel.

La structure se fait avec -D [IP],[IP],[IP],[IP],ME,[IP],[IP]...

C:\nmap_present>nmap 192.168.0.254 -p 1900,123 -D 1.2.3.4,11.22.33.44,ME,55.66.77.88

Interesting ports on 192.168.0.254:
PORT     STATE    SERVICE
123/tcp  filtered ntp
1900/tcp closed   upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

3.21/ -e

Spécifie l'interface à utiliser. Si l'on arrive à mettre plusieurs interfaces de notre équipement sur différents réseaux il peut être intéressant d'émettre des packets dans des réseaux où ils n'ont rien à faire, cela nous permet de visualiser les probables tables de routage affectées aux postes.

C:\nmap_present>nmap 192.168.0.254 -e eth0

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

3.22/ -S : Spoof source address

Spoofing basic d'adresse IP, mais bien utile quand on voit le nombre de firewall ne regardant que le champs IP. En se faisant passer pour des serveurs en DMZ on arrive souvent à scanner des réseaux cachés.

C:\nmap_present>nmap 192.168.0.254 -S 192.168.0.54 -p 123,1900 -e eth0 -P0

Interesting ports on 192.168.0.254:
PORT     STATE    SERVICE
123/tcp  filtered ntp
1900/tcp closed   upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

3.23/ -g

Cette méthode sert à bypasser tous les admins peu soigneux. Souvent un admin alloue les ports authorisés en sources et en destinations sur une même interface, grave erreur ! Si nous forçons notre port source en un port authorisé et que nous scannons un équipement, le firewall voyant notre port source en port valide laissera l'intégralité de nos packets passer :-)

Cette erreur de configuration est assez fréquente avec les firewall configurés avec iptables.

C:\nmap_present>nmap 192.168.0.184

Interesting ports on 192.168.0.184:
Not shown: 1707 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
111/tcp open  rpcbind
113/tcp open  auth
873/tcp open  rsync
MAC Address: 00:0E:2E:00:97:0C (Edimax Technology Co.)

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

C:\nmap_present>nmap 192.168.0.184 -g 22

Interesting ports on 192.168.0.184:
Not shown: 1706 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
111/tcp open  rpcbind
113/tcp open  auth
873/tcp open  rsync
MAC Address: 00:0E:2E:00:97:0C (Edimax Technology Co.)

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

3.24/ --data-length

Rajoute un nombre d'octet en aléatoire dans la section DATA. Encore une fois ça peut être utile pour trouver des faiblesses sur un parfeu mal configuré.

C:\nmap_present>nmap 192.168.0.254 --data-length 4

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

Ci-dessus nous avons ajouté 4 octets de padding à nos packets émis.

3.25/ --ip-options

Commencons par les options dont nous disposons pour IP :
L[ip],[ip]... : Loose source route
R[ip],[ip]... : Record route
S[ip],[ip]... : Strict source route
T : Time Stamp
U : Time Stamp (Relation Adresses / Time Stamp)

Nous pouvons spécifier ces options IP soit pour dérouter un firewall (ou un poste) soit pour analyser les réponses de la victime ou encore mesurer les différences de comportement (avant packets / après packets).

C:\nmap_present>nmap 192.168.0.1 --ip-options T

Interesting ports on 192.168.0.1:
Not shown: 1710 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
1025/tcp open  NFS-or-IIS
MAC Address: 00:13:8F:C5:6D:D5 (Asiarock Incorporation)

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

3.26/ --ttl : Set IP time-to-live field

On fixe tout simplement le TTL, ça peut être utile dans le cadre de gros réseaux (internet par exemple) afin de mesurer le nombre d'erreurs retournées face aux sauts de routeurs. On peut aussi voir quel port est redirigé et quel port est bloqué par un firewall si l'on pousse assez finement notre analyse.

C:\nmap_present>nmap 192.168.0.254 --ttl 64

Interesting ports on 192.168.0.254:
Not shown: 1713 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
1900/tcp closed upnp
MAC Address: 00:0A:78:8C:96:C6 (Olitec)

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

3.27/ --spoof-mac

Tout simplement nmap change notre adresse MAC par une autre, celle-ci peut même être celle d'un autre PC sur le réseau... Si on y ajoute un IP spoofing on pourrait complètement faire croire à un équipement qu'il est attaqué par un lambda. Si ce poste est celui du directeur et que le firewall l'aurait bani il y a des chances que les admins réseau assouplissent le système de bloquage, ce qui est tout bon pour nous :-)

3.28/ --badsum

Les checksum TCP et UDP ne seront plus valides, on peut ainsi détecter des différences de comportement suivant les OS / appli. Il est assez impressionnant le nombre d'appli qui acceptent un packet avec le checksum incorrect...

3.29/ -oN/-oX/-oS/-oG

Le 'o' signifie Output, -oN pour une sortie normale, jusqu'à là rien de bien compliqué, -oS pour une écriture en script kiddie, c'est fun, mais c'est tout lol.

-oX est déjà plus intéressant, il nous sort les résultats au format XML, ça peut être utile pour un traitement ultérieur.
-oG est très intéressant, cette fois on sort tout en format grepable, c'est à dire qu'on pourra faire des analyses / filtres très rapidement, cette option est essentielle quand on audite de gros réseaux.

C:\nmap_present>nmap 192.168.0.184 -oG test.txt

Interesting ports on 192.168.0.184:
Not shown: 1707 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
111/tcp open  rpcbind
113/tcp open  auth
861/tcp open  unknown
MAC Address: 00:0E:2E:00:97:0C (Edimax Technology Co.)

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

C:\nmap_present>cat test.txt
# Nmap 4.50 scan initiated Tue Aug 12 23:12:06 2008 as: nmap -oG test.txt 192.168.0.184
Host: 192.168.0.184 ()  Ports: 22/open/tcp//ssh///, 111/open/tcp//rpcbind///, 113/open/tcp//auth///, 861/open/tcp/////
# Nmap done at Tue Aug 12 23:12:23 2008 -- 1 IP address (1 host up) scanned in 17.312 seconds

3.30/ --packet-trace

Mon option préférée ! Elle nous permet de voir ce que l'on émet et ce que l'on reçoit, autrement dit on sniff nos communications. Avec cette méthode de trace nous pouvons réellement pousser les analyses, analyser les retours à nos packets afin de détecter un éventuel comportement anormal ou encore toper un équipement indétecté lors des scans précédents.

C:\nmap_present>nmap 10.2.120.1 -r -n -T2 --packet-trace -p 75-85

SENT (0.5150s) ARP who-has 10.2.120.1 tell 10.2.120.212
RCVD (0.5150s) ARP reply 10.2.120.1 is-at 00:01:29:0A:2D:A3
SENT (0.9220s) TCP 10.2.120.212:53081 > 10.2.120.1:75 S ttl=55 id=19355 iplen=44  seq=911227084 win=4096 <mss 1460>
RCVD (0.9220s) TCP 10.2.120.1:75 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (1.3280s) TCP 10.2.120.212:53081 > 10.2.120.1:76 S ttl=40 id=9493 iplen=44  seq=911227084 win=1024 <mss 1460>
RCVD (1.3280s) TCP 10.2.120.1:76 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (1.7340s) TCP 10.2.120.212:53081 > 10.2.120.1:77 S ttl=42 id=7661 iplen=44  seq=911227084 win=3072 <mss 1460>
RCVD (1.7340s) TCP 10.2.120.1:77 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (2.1400s) TCP 10.2.120.212:53081 > 10.2.120.1:78 S ttl=56 id=154 iplen=44  seq=911227084 win=1024 <mss 1460>
RCVD (2.1400s) TCP 10.2.120.1:78 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (2.5470s) TCP 10.2.120.212:53081 > 10.2.120.1:79 S ttl=51 id=12345 iplen=44  seq=911227084 win=4096 <mss 1460>
RCVD (2.5470s) TCP 10.2.120.1:79 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (2.9530s) TCP 10.2.120.212:53081 > 10.2.120.1:80 S ttl=44 id=27469 iplen=44  seq=911227084 win=1024 <mss 1460>
RCVD (2.9530s) TCP 10.2.120.1:80 > 10.2.120.212:53081 SA ttl=64 id=0 iplen=44  seq=3918103826 win=5840 ack=911227085 <mss 146
0>
SENT (3.3590s) TCP 10.2.120.212:53081 > 10.2.120.1:81 S ttl=54 id=32347 iplen=44  seq=911227084 win=3072 <mss 1460>
RCVD (3.3590s) TCP 10.2.120.1:81 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (3.7650s) TCP 10.2.120.212:53081 > 10.2.120.1:82 S ttl=57 id=27790 iplen=44  seq=911227084 win=2048 <mss 1460>
RCVD (3.7650s) TCP 10.2.120.1:82 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (4.1720s) TCP 10.2.120.212:53081 > 10.2.120.1:83 S ttl=59 id=15378 iplen=44  seq=911227084 win=4096 <mss 1460>
RCVD (4.1720s) TCP 10.2.120.1:83 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (4.5780s) TCP 10.2.120.212:53081 > 10.2.120.1:84 S ttl=41 id=29856 iplen=44  seq=911227084 win=2048 <mss 1460>
RCVD (4.5780s) TCP 10.2.120.1:84 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
SENT (4.9840s) TCP 10.2.120.212:53081 > 10.2.120.1:85 S ttl=46 id=5282 iplen=44  seq=911227084 win=3072 <mss 1460>
RCVD (4.9840s) TCP 10.2.120.1:85 > 10.2.120.212:53081 RA ttl=64 id=0 iplen=40  seq=0 win=0 ack=911227085
Interesting ports on 10.2.120.1:
PORT   STATE  SERVICE
75/tcp closed priv-dial
76/tcp closed deos
77/tcp closed priv-rje
78/tcp closed vettcp
79/tcp closed finger
80/tcp open   http
81/tcp closed hosts2-ns
82/tcp closed xfer
83/tcp closed mit-ml-dev
84/tcp closed ctf
85/tcp closed mit-ml-dev
MAC Address: 00:01:29:0A:2D:A3 (DFI)

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

3.31/ --iflist

Nous affiche la liste des interfaces avec les routes. Quand on utilise plusieurs interfaces en même temps il peut être utile de consulter cette option, ça peut nous éviter de nous prendre la tête pour rien.

C:\nmap_present>nmap --iflist

************************INTERFACES************************
DEV  (SHORT) IP/MASK         TYPE     UP   MAC
eth0 (eth0)  192.168.2.13/24 ethernet up   00:18:DE:AD:31:04
eth1 (eth1)  10.2.120.212/24 ethernet up   00:11:95:91:37:39
eth2 (eth2)  (null)/0        ethernet down 00:C0:9F:AC:CD:F7
lo0  (lo0)   127.0.0.1/8     loopback up

DEV  WINDEVICE
eth0 \Device\NPF_{596CCC72-9527-41E3-BF92-D666CF4781D5}
eth1 \Device\NPF_{343C77FA-ADC7-47AE-9EC1-98D8F3E1AA13}
eth2 \Device\NPF_{1C0A9206-5387-49C6-B2B8-8FA350585E2D}
lo0  \Device\NPF_GenericDialupAdapter

**************************ROUTES**************************
DST/MASK           DEV  GATEWAY
192.168.2.13/32    lo0  127.0.0.1
255.255.255.255/32 eth1 10.2.120.212
255.255.255.255/32 eth0 192.168.2.13
10.2.120.212/32    lo0  127.0.0.1
10.255.255.255/32  eth1 10.2.120.212
192.168.2.255/32   eth0 192.168.2.13
255.255.255.255/32 eth1 10.2.120.212
10.2.120.0/0       eth1 10.2.120.212
192.168.2.0/0      eth0 192.168.2.13
127.0.0.0/0        lo0  127.0.0.1
224.0.0.0/0        eth0 192.168.2.13
224.0.0.0/0        eth1 10.2.120.212
0.0.0.0/0          eth1 10.2.120.1
0.0.0.0/0          eth0 192.168.2.1

3.32/ --resume : Resume an aborted scan

Avec les options -oN et -oG (output normal ou grepable) nous pouvons quitter un scan un peu long (surtout si -T0 utilisé) simplement en effectuant un ctrl+c. Pour reprendre ce scan --resume est notre ami ! Ainsi découpez vos scans dans le temps et pourquoi pas les lieux d'émission.

3.33/ -V: Print version number

Pour savoir sur quelle version de nmap vous rootez le monde.

3.34/ -d[level]: Set or increase debugging level (Up to 9 is meaningful)

On scan en mode débug, c'est à dire qu'on aura masses d'informations sur le déroulement du scan. Le level est compris entre 1 et 9, pour le 9 je vous laisse l'analyser lol. Un point très interessent est qu'à la fin de son scan nmap ne nous dit pas qui est ouvert ou fermé mais nous affiche quelles réponses il a recut sur tel ou tel port. Ainsi nous avons des infos nous aidant grandement à savoir si c'est un firewall qui nous drop ou la machine elle même (c'est un exemple parmis tant d'autres).

C:\nmap_present>nmap 10.2.120.1 -sS -n -d1
Winpcap present, dynamic linked to: WinPcap version 4.0.2 (packet.dll version 4.0.0.1040), based on libpcap version 0.9.5

--------------- Timing report ---------------
  hostgroups: min 1, max 100000
  rtt-timeouts: init 1000, min 100, max 10000
  max-scan-delay: TCP 1000, UDP 1000
  parallelism: min 0, max 0
  max-retries: 10, host-timeout: 0
---------------------------------------------
Initiating ARP Ping Scan at 22:40
Scanning 10.2.120.1 [1 port]
Packet capture filter (device eth1): arp and ether dst host 00:11:95:91:37:39
Completed ARP Ping Scan at 22:40, 0.25s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 22:40
Scanning 10.2.120.1 [1711 ports]
Packet capture filter (device eth1): dst host 10.2.120.212 and (icmp or (tcp and (src host 10.2.120.1)))
Discovered open port 80/tcp on 10.2.120.1
Discovered open port 22/tcp on 10.2.120.1
Discovered open port 53/tcp on 10.2.120.1
Increased max_successful_tryno for 10.2.120.1 to 1 (packet drop)
Completed SYN Stealth Scan at 22:40, 3.39s elapsed (1711 total ports)
Host 10.2.120.1 appears to be up ... good.
Interesting ports on 10.2.120.1:
Not shown: 1707 closed ports
Reason: 1707 resets
PORT   STATE    SERVICE REASON
22/tcp open     ssh     syn-ack
25/tcp filtered smtp    no-response
53/tcp open     domain  syn-ack
80/tcp open     http    syn-ack
MAC Address: 00:01:29:0A:2D:A3 (DFI)
Final times for host: srtt: 4965 rttvar: 8606  to: 100000

Read from C:\WINDOWS: nmap-mac-prefixes nmap-services.
Nmap done: 1 IP address (1 host up) scanned in 5.329 seconds
           Raw packets sent: 1716 (75.502KB) | Rcvd: 1711 (78.702KB)

4. Conclusion

Nmap est un tool de mapping réseau très complet, il couvre bien tous les aspects que l'on demande à un scanner et même plus ! Cela dit, une option de scan par rebond en utilisant la méthode CONNECT (http) serait le bienvenu.

Références