Rédacteur : Heurs
Date de création : 15/08/2008
Imprimer cet article : en noir et blanc ou en couleurs
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.
Commencons par le commencement :
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 :
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 :
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 "-" :
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).
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.
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 :
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] ;-)
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" :
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.
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).
On peut voir que 1276 ports sont scannés au lieu de 1715 en scan normal, soit 439 ports économisés.
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.
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.
Effectue une série de ping (envoie de requetes ICMP) pour déterminer les postes en ligne.
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.
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 :-)
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.
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 !
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.
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.
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.
Vous voyez. L'avantage est qu'on a une analyse comportementale de plus tout de même !
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).
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é.
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.
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 :
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 :-)
Nous aurons utilisé 192.168.0.254 en idle avec son port 80 pour scanner 192.168.0.1. Et ça marche, la preuve !
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 :
Ca y est je suis grillé, maintenant tout le monde sait que je passe de temps en temps à côté d'Orléans !
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.
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.
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 : 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.
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.
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.
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]...
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.
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.
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.
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é.
Ci-dessus nous avons ajouté 4 octets de padding à nos packets émis.
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).
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.
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 :-)
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...
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.
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.
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.
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.
Pour savoir sur quelle version de nmap vous rootez le monde.
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).
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.