vendredi 18 mars 2016

Cartographie réseau avec nmap

NMAP

Pour commencer; voici un rappel des types de ports :

   well-known ports     1-1023
   registered ports           1024-49151
   dynamic private ports                49152-65535 

Des statistiques sur l'occurence de ports ouverts sont données ci-dessous. Elles sont particulièrement interessante pour le scan de port UDP. En scannant les 15094 ports les plus fréquents ont atteint un taux de 99%. Cela permet de reduire considérablement le scan UDP car en pratique, les stacks n'acceptent d'envoyer d'un message ICMP / seconde induisant une temporisation de 65535 secondes au minimum pour un unique hôte.  

   %    TCP ports   UDP ports  
          requis     requis
-------- ---------- ---------
  10%        1         5
  20%        2         12
  30%        4         27
  40%        6        135
  50%       1O       1075
  60%       18       2618
  70%       44       5157
  80%      122       7981
  85%      236       9623
  90%      576      11307
  95%     1558      13035
  99%     3328      15094

 100%    65536      65536


Pour visualiser le top des ports utiliser par nmap, il faut scanner une machine (localhost est rapide) avec l'option --top-ports et -v. La sortie grepable sur stdout permet de lister de manière compact.

$ sudo nmap -top-ports 1000 localhost -v -oG -
 

Les comportements selon les types de scan

TCP SYN scan ou scan TCP scan 
State       Probe response
----------- ------------------------------------------------------------
open        SYN,ACK
closed      RST
filtered    no response or 
            ICMP unreachable (type 3, code 1, 2, 3, 9, 10, or 13)
                         1 Host unreachable
                         2 Protocol unreachable
                         3 Port unreachable
                         9 Destination network administratively prohibited
                        13 Communication administratively prohibited by filtering
---------------------------------------------------------------------------------

statless FW with NULL, FIN, XMAS scan probe
State           Probe response
-------------- -----------------------------------------------------------------
open|filtered
closed
filtered       ICMP unreachable error (type 3, code I , 2, 3, 9, IO, or 1 3)
---------------------------------------------------------------------------------


ACK scan
State          Probe response
-------------- -----------------------------------------------------------------
unfiltered
filtered       No response received (even after retransmissions)
filtered       ICMP unreachable error (type 3, code I , 2 , 3, 9, I O , or 13)
---------------------------------------------------------------------------------

Maimon scan
State          Probe response
-------------- -----------------------------------------------------------------
open|filtered  No response received (even after retransmissions)
closed         TCP RST packet
filtered       ICMP unreachable error (type 3, code 1, 2, 3, 9, 10, or 13)
---------------------------------------------------------------------------------

Window scan
State          Probe response
-------------- -----------------------------------------------------------------
open           TCP RST response with non-zero window field
closed         TCP RST response with zero window field
filtered       No response received (even after retransmissions)
filtered       ICMP unreachable error (type 3, code 1, 2, 3, 9, 10, or 13)
---------------------------------------------------------------------------------

UDP scan 
State           Probe response
-------------- -----------------------------------------------------------------
open           Any UDP response from target port (unusual)
open|filtered  No response received (even after retransmissions), use -sV or -A
               limitation dst unreach msg to 1/sec (65536 sec = +18h)
               use host group and parallelisation and version intensity
closed         ICMP port unreachable error (type 3, code 3) 
filtered       Other ICMP unreachable errors (type 3, code I , 2, 9, 10, or 1 3)
---------------------------------------------------------------------------------

Proto scan
State           Probe response
-------------- -----------------------------------------------------------------
open            Any response in any protocol from target host
closed ICMP protocol unreachable error (type 3, code 2)
filtered Other ICMP unreachable errors (type 3, code 1, 3, 9, 1O, or 13)
open|filtered No response received (even after retransmissions)

---------------------------------------------------------------------------------

IP

IPv4 header


IPv6 header


TCP Header




UDP header

SCTP header



ICMP

ICMP Header


Ping


Destination unreachable



La découverte réseau

Lors d'un pentest, la première étape est la découverte réseau. Cette découverte se passe au niveau 2, 3 ou 4 du modèle OSI.


Couche 2 - ARP request
Pour la couche 2, des requêtes ARP (-PR) sur le subnet local est suffisant, l'argument -sn désactive le scan de port. Le scan est rapide :

$ sudo nmap -PR -sn 192.168.1.0/24


Couche 3 - ICMP echo
Pour découvrir des systèmes hors du segment local, il faut oeuvrer au niveau de la couche 3 (IP). Des requêtes ping ou ICMP echo Request (-PE) sans scan de port (-sn) permet de voir les systèmes qui répondent au ping. 

$ sudo nmap -PE -sn 8.8.8.8/24

Avec ICMP, il y a aussi les requêtes de timestamp type 13 (-PP) et du masque de réseau type 17 (-PM)

$ sudo nmap -PP -PM -sn 8.8.8.8

Au niveau 3, il est possible de scanner une stack IP pour découvrir les protocoles actifs comme IPSec (AH, ESP), ICMP, IGMP, GRE, SCTP, etc.

$ sudo nmap -sO 192.168.1.50

Starting Nmap 6.49BETA5 ( https://nmap.org ) at 2016-03-18 14:39 CET
Nmap scan report for Kali (192.168.1.50)
Host is up (0.0000040s latency).
Not shown: 248 closed protocols
PROTOCOL STATE         SERVICE
1        open          icmp
2        open|filtered igmp
6        open          tcp
17       open          udp
103      open|filtered pim
132      open          sctp
136      open|filtered udplite
255      open|filtered unknown

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

Un script NSE permet d'obtenir de l'information 
$ sudo map -sU -sV -p 500 <target>
$ sudo nmap -sU -p 500 --script ike-version <target>


Lorsque IPsec est encapsulé sur UDP pour passer la NAT il faut rechercher les port udp/500 (isakmp) et udp/4500 (nat-t-ike). L'utilitiaire ikescan permettra de scanner la passerelle IPsec.

$ ike-scan -v <target>       # IKE v1 main mode
$ ike-scan -v -2 <target>    # IKE v2 main mode
$ ike-scan -v -nat-t         # NAT-Traversal
$ ike-scan -v -A <target>    # IKE v1 aggressive mode

Couche 4 - port scan
Attention, tout équipement de sécurité sur le chemin peut bloquer les requêtes ICMP. Dans ce cas, la solution est d'effectuer une découverte au niveau 4 du modèle OSI avec un scan de ports udp, tcp ou sctp.

$ sudo nmap -PU53 -sn 8.8.8.8

Un scan TCP avec le flag ACK positionné (-PA) permet de traverser du filtrage sans état (stateless) :

$ sudo nmap -PA80 -sn 8.8.8.8

Attention ,un scan SCTP ne passe pas la NAT

$ sudo nmap -sY -p 1234 -n -Pn 192.168.1.50

-n :    ne fait pas de résolution DNS
-Pn : supprime le Ping (s'il est bloqué, la cible n'est pas testée)


Couche 7 - scan applicatif
nmpa permet de scanner les services en écoute pour essayer de détecter le protocole et la version applicative grâce au bannière retournée et à l'envoi de différents sondes (probe).

$ sudo nmap 192.168.1.95 -sV

nmap est également capable d'exécuter des scripts LUA pour effectuer un scan de découverte. Plusieurs catégories existe depuis la découverte jusqu'au scan de vulnérabilité (vuln). L'argument est --script, et peut être accompagné de --script-args pour les arguments, --script-help et --script-trace. Les fichiers LUA de NSE (Nmap Script Engine) portent l'extension .nse. Pour consulter les scripts exisatnts :

$ locate *.nse

Pour utiliser toutes les catégories, il faut préciser all et patienter plusieurs jours... La commande suivante charge les scripts de catégorie default et discovery : 

$ sudo nmap --script default,discovery 192.168.1.95

Dans le même esprit, la version de l'OS peut être déterminé.

$ sudo nmap 192.168.1.95 -sO

Parmis les options intéressantes, il y a --packet-trace qui permet de voir les paquets émis et --traceroute qui effectue un traceroute ICMP.

$ sudo nmap --traceroute --packet-trace -sn  8.8.8.8

Starting Nmap 6.49BETA5 ( https://nmap.org ) at 2016-03-18 14:50 CET
Nmap scan report for 192.168.1.95
Host is up (0.00015s latency).
Not shown: 977 closed ports
PORT     STATE SERVICE     VERSION
21/tcp   open  ftp         vsftpd 2.3.4
22/tcp   open  ssh         OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)
23/tcp   open  telnet      Linux telnetd
25/tcp   open  smtp        Postfix smtpd
53/tcp   open  domain      ISC BIND 9.4.2
80/tcp   open  http        Apache httpd 2.2.8 ((Ubuntu) DAV/2)
111/tcp  open  rpcbind     2 (RPC #100000)
139/tcp  open  netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
445/tcp  open  netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
512/tcp  open  exec?
513/tcp  open  login?
514/tcp  open  shell?
1099/tcp open  rmiregistry GNU Classpath grmiregistry
1524/tcp open  shell       Metasploitable root shell
2049/tcp open  nfs         2-4 (RPC #100003)
2121/tcp open  ftp         ProFTPD 1.3.1
3306/tcp open  mysql       MySQL 5.0.51a-3ubuntu5
5432/tcp open  postgresql  PostgreSQL DB 8.3.0 - 8.3.7
5900/tcp open  vnc         VNC (protocol 3.3)
6000/tcp open  X11         (access denied)
6667/tcp open  irc         Unreal ircd
8009/tcp open  ajp13?
8180/tcp open  unknown
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-Port514-TCP:V=6.49BETA5%I=7%D=3/18%Time=56EC07B2%P=x86_64-pc-linux-gnu%
SF:r(NULL,2B,"\x01Couldn't\x20get\x20address\x20for\x20your\x20host\x20\(K
SF:ali\)\n");
MAC Address: 08:00:27:5D:2A:61 (Cadmus Computer Systems)
Service Info: Hosts:  metasploitable.localdomain, localhost, irc.Metasploitable.LAN; OSs: Unix, 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 145.80 seconds

Techniques avancées de scan
Nmap offre plusieurs options permettant d'opérer avec les IDS et FW et de cartographier le réseau.

Lorsqu'un équipement de filtrage est sans état, des paquets TCP sans le flag SYN peuvent passer le filtre et atteindre la cible. nmap permet de gérer finement ce cas de figure.
Parmis les options il ya :

-sN Scan TCP Null
-sF Scan TCP IN 
-sX Scan Xmas
-sA  Scan TCP ACK
-sW  Scan TCP Window (detection ports ouverts lorsque la fenêtre > 0
-sM Scan TCP Maimon avec les flags FIN/ACK. BSD supprime le paquets d'un port ouvert

-sI [zombie]  Scan Idle zombie 

Evasion IDS et Firewall

Des arguments agissent sur le temps. Le timing possède 6 valeurs de -T0 à -T5T0 et T1 permettent de passer sous le seuil d'alerte des IDS et IPS alors que T4 et T5 sont trés bruyant mais rapide. Ces options permettent de rester discret lorsque la cible est dans un environnement surveillé. Dans cas cas, il est également possible de noyer le traffic en ajoutant des paquets possédant des adresses sources aléatoires.

$ sudo nmap -p 80 192.168.1.95 -D RND:5 --packet-trace 2> /dev/null |grep SENT | cut -f1-6 -d' '
SENT (0.0555s) ARP who-has 192.168.1.95 tell
SENT (0.1466s) TCP 192.168.1.50:52262 > 192.168.1.95:80
SENT (0.1466s) TCP 35.170.213.48:52262 > 192.168.1.95:80
SENT (0.1466s) TCP 193.253.102.13:52262 > 192.168.1.95:80
SENT (0.1466s) TCP 181.91.92.201:52262 > 192.168.1.95:80
SENT (0.1467s) TCP 74.238.12.84:52262 > 192.168.1.95:80
SENT (0.1467s) TCP 41.216.142.154:52262 > 192.168.1.95:80

Certains firewall et IDS possèdent des bases de signature pour supprimer les paquets. Certaines soignatures sont basées sur la taille des paquets. Par défaut, les paquets de scan sont à zéro. Le paramètre --data-length permet de spécifier une taille.

$ sudo nmap -Pn -n -p 80 192.168.1.95 --data-length 32 --packet-trace

Starting Nmap 6.49BETA5 ( https://nmap.org ) at 2016-03-18 15:32 CET
SENT (0.0501s) ARP who-has 192.168.1.95 tell 192.168.1.50
RCVD (0.0502s) ARP reply 192.168.1.95 is-at 08:00:27:5D:2A:61
SENT (0.1259s) TCP 192.168.1.50:43532 > 192.168.1.95:80 S ttl=40 id=5711 iplen=76  seq=678458882 win=1024 <mss 1460>
RCVD (0.1261s) TCP 192.168.1.95:80 > 192.168.1.50:43532 SA ttl=64 id=0 iplen=44  seq=4233505341 win=5840 <mss 1460>
Nmap scan report for 192.168.1.95
Host is up (0.00015s latency).
PORT   STATE SERVICE
80/tcp open  http
MAC Address: 08:00:27:5D:2A:61 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 0.20 seconds
  
La taille du paquet peut être modifié également en spécifiant un payload ASCII (--data-string) ou hexadécimal (--data) :

$ sudo nmap -Pn -n -p 80 192.168.1.95 --data-string "Hello World"
$ echo -n "Hello" | xxd -p
48656c6c6f
$ sudo nmap -Pn -n -p 80 192.168.1.95 --data 48656c6c6f

Un autre aspect consisyer à rendre aléatoire l'ordre des IP scannées avec l'argument (--randomize-hosts) :

$ sudo nmap -Pn -n -p 80 8.8.8.8/29 --packet-trace --randomize-hosts 2> /dev/null |grep SENT | cut -f1-6 -d' '
SENT (0.0668s) TCP 192.168.1.50:51695 > 8.8.8.14:80
SENT (0.0668s) TCP 192.168.1.50:51695 > 8.8.8.13:80
SENT (0.0668s) TCP 192.168.1.50:51695 > 8.8.8.10:80
SENT (0.0668s) TCP 192.168.1.50:51695 > 8.8.8.15:80
SENT (0.0668s) TCP 192.168.1.50:51695 > 8.8.8.8:80
SENT (0.0668s) TCP 192.168.1.50:51695 > 8.8.8.11:80
SENT (0.0668s) TCP 192.168.1.50:51695 > 8.8.8.12:80
SENT (0.0669s) TCP 192.168.1.50:51695 > 8.8.8.9:80
SENT (1.0679s) TCP 192.168.1.50:51696 > 8.8.8.9:80
SENT (1.0679s) TCP 192.168.1.50:51696 > 8.8.8.14:80
SENT (1.0679s) TCP 192.168.1.50:51696 > 8.8.8.13:80
SENT (1.0679s) TCP 192.168.1.50:51696 > 8.8.8.10:80
SENT (1.0679s) TCP 192.168.1.50:51696 > 8.8.8.15:80
SENT (1.0679s) TCP 192.168.1.50:51696 > 8.8.8.8:80
SENT (1.0680s) TCP 192.168.1.50:51696 > 8.8.8.11:80
SENT (1.0680s) TCP 192.168.1.50:51696 > 8.8.8.12:80

Source Routing
Une autre méthode ancienne, qui s'avère de moins en moins possible et de forcer les routage IP grâce à l'option source routing d'IP (strict ou loose). Normalement, tout routeur récent interdit le source routing par défaut dans la configuration de base. Sur un host dont l'IP forwarding est activé, cela peut être autorisé. Par exemple, pour un scan SYN sans ping ni résolution DNS en mode verbeusx sur la cible 192.168.1.1 en passant par le hop 10.0.0.01 en Loose Source Routing (L) :

$ sudo nmap -vv -n -sS -PN --ip-options "L 10.0.0.1" --reason 192.168.1.1

Pour le Strict Source Routing, il faut spécifier la lettre  'S' et tous les routeurs traversés.
L'utilitaire netcat et la version ncat de nmap.org supporte une option de Source Routing avec l'option -g et -G.

$ ncat -4 -g 192.168.1.1,109.0.118.10   8.8.8.8 53

Route Record
L'option Route Record, permet d'enregistrer les noeuds IP traversés (jusqu'à neuf sauts), malheureusement, aujourd'hui de nombreux équipements suppriment les paquets avec l'option record route activée. Cette option s'utilise avec un ICMP ping et l'option de traçage:


$ sudo nmap -sP -PE -sn --ip-options R -n --packet-trace 10.0.0.1

Les implémentations de ping supportent l'option de Route Record :

$ ping -R 10.0.0.1


TTL
Le TTL retourné dans les paquets IP permet de détecter la présence d'équipement de sécurité en coupure. Lorsqu'ils répondent par un paquet (RST ou ICMP) pour le compte d'un tiers, le TTL permet de constater que ce n'est pas la cible (ou sa passerelle locale) qui répond. Outre l'option traceroute, il est possible de spécifier la valeur du TTL avec l'option --ttl <val>.

$ sudo nmap -Pn -sn --traceroute -n --packet-trace 10.0.0.1
$ sudo nmap -PE --ttl 4 -n --packet-trace 10.0.0.1

Passer sous le seuil de détection des IDS/IPS
Le principe est d'utiliser des temporisations en deçà du seuil supporter par les équipements de sécurité, permettant un scan furtif, sans détection de l'adresse source par un IDS/IPS.
Pour cela, nmap propose l'option -T avec deux valeurs répondant au critète qui sont T0 et T1 ou paranoid (5 mn) et sneaky (15s). Mais les délais inter scan sont définissable avec les options : --max-parallelism, --min-rtt-timeout, --scan-delay.

Les IDS les plus avancés travaillent sur un seuil de scan fixe dans une fenêtre temporelle fixe, généralement exprimé en secondes. L'IDS Snort utilise une valeur par défaut de 15 secondes pour ces deux paramètres. Le comptage concerne une source unique vers plusieurs destinations. Dans ce cas, il faut choisir une valeur permettant de dépasser les 15 secondes, soit en scannant plus de 15 ports ou plus de 15 machines avec un délai entre scan > 1 secondes (il y a 14 délais pour 15 cibles, soit 15/14=1,0714) au minimum de --scan-delay 1075ms. Pour éviter tout parallélisme, il faut préciser l'option --max-hostgroup 1.

$ sudo nmap -sS -Pn  192.168.1.1 --scan-delay 1075ms --max-hostgroup 1 -p1-15

L'alternative est d'utiliser un schell script en vaillant au délai entre chaque itération de boucle d'appel de nmap :

$ for host in 192.168.1.1 192.168.1.75; do sudo nmap --scan-delay 1075ms -p21-23,25,53 $host; usleep 1075000; done

Ce n'est pas suffisant avec un IDS avancé comme Snort, qui possède  une option de fenêtre glissante qui a pour principe d'augmenter la fenêtre temporelle de 0,5 seconde à chaque sonde provenant d'une source. Le délai de départ est fixé à 20 secondes par défaut. Dans ce cas, il faut émettre une sonde chaque 20,1 seconde pour passer sous le radar.

Pour optimiser l'ensembla, avec le script shell, vous envoyer 14 sondes avec un délai de 1075ms puis vous patientez 20,1 secondes pour recommencer.

Les règles de l'IDS Snort détectent les scans selon certains critères.

ICMP type 8 "echo" sans payload:  --data-length <value>
TCP flags FIN,PUSH,URG (Xmas):  --scanflags FINPSH
TCP flags SYN,FIN,PUSH,URG  pour OS détection:  pas de solution sauf dans le source, par contre, l'usage de decoy (-D RND:<num>) avec un nombre important d'IPs inonde l'équipe de réponse à incident. Chaque vérification auprès d'un ISP est chronophage et identifier la bonne adresse est difficile. Attention cependant car de nombreux équipements d'accès Internet (DSLAM, SWITCH, ...) suppriment les paquets uruspant une adresse source.
Si les adresses usurpées ne sont pas accessibles, alors il est facile d'identifier l'IP source. S'il y a trop d'IP source, l'IDS peut conclure à la présence d'un Déni de Service et l'IP peut être bannie.


Pas de résolution DNS
Activer l'option (-n) pour interdire la résolution DNS de chaque cible, cela améliore le temps de scan mais aussi évite de faire fuir trop d'infirmation sur l'adresse source. 

Si le système du pentester n'est pas dans l'infrastructure auditée, alors il est possible d'utiliser des serveurs DNS alternatifs ouverts aux requêtes récursives depuis n'importe où. Dans ce cas, l'option --dns-servers  <serv1[,serv2],...> est intéressante, par example avec les DNS resolver de Google 8.8.4.4 et 8.8.8.8, Level3 4.2.2.1 et 4.2.2.2.

$ host www.free.fr 4.2.2.1
Using domain server:
Name: 4.2.2.1
Address: 4.2.2.1#53
Aliases: 

www.free.fr has address 212.27.48.10

www.free.fr has IPv6 address 2a01:e0c:1::1

$ sudo nmap --dns-servers 8.8.4.4,8.8.8.8 -sL www.free.fr 

Starting Nmap 7.01 ( https://nmap.org ) at 2016-03-22 18:59 CET
Nmap scan report for www.free.fr (212.27.48.10)
Other addresses for www.free.fr (not scanned): 2a01:e0c:1::1
Nmap done: 1 IP address (0 hosts up) scanned in 0.01 seconds

La capture tshark associée donne:
192.168.1.50 -> 192.168.1.1  DNS 71 Standard query 0x2385  A www.free.fr
192.168.1.50 -> 192.168.1.1  DNS 71 Standard query 0x88c7  AAAA www.free.fr
192.168.1.1 -> 192.168.1.50 DNS 99 Standard query response 0x88c7  AAAA 2a01:e0c:1::1
192.168.1.1 -> 192.168.1.50 DNS 87 Standard query response 0x2385  A 212.27.48.10
192.168.1.50 -> 8.8.8.8      DNS 85 Standard query 0x9ada  PTR 10.48.27.212.in-addr.arpa
8.8.8.8 -> 192.168.1.50 DNS 110 Standard query response 0x9ada  PTR www.free.fr

IDS/IPS réactifs
Les équiepements de sécurité qui réagissent aux scans ou aux attaques soit envoir un paquet TCP RST usurpé pour terminer la connexion, soit ils sont en coupure et peuvent agire à leur guise (supprimer les paquets, terminer la connexion, etc.).

Ces types de dispositifs se détectent facilement lorsqu'un scan répond positivement puis par la négative alors qu'une autre adresse source peut accéder au port. Le problème est que l'attaquant peut ainsi faire bloquer des adresses légitimes en usurpant leur adresse source avec l'option -S, pouvant couper d'Internet la cible (par exemple, en usurpant les adresses des 13 serveurs racines DNS). En théorie, ces équipements possèdent une liste blanche, mais en choisissant bien les adresses sources, il est possible de causer de forts dysfonctionnements.

Enfin, l'envoi de paquets provoquant un crash de l'IDS n'est pas impossible. Tout système effectuant un parsing d'une pléthore de protocoles est succeptible d'être vulnérables à des paquets volontairement mals forgés. Un fuzzing de paquets en environnement contrôlé permet de trouver des paquets exploitables. La cerise sur le gâteau survient lorsque la culnérabilité permet l'exécution de code abirtraire et de compormettre l'équipement de sécurité. 

De toute façon, lorsqu'un IDS est présent, il n'est pas toujours correctement configué, il lève de nombreuses alertes consécutives aux nombreux scans et il a toute les chances que les alertes levées par le pentester passent inaperçus au milieu du bruit résiduel, d'autant plus lorsque ce dernier est expérimenté.

Retours inconsistents
Certains équipements rendent difificiles l'interprétaion des résultats et apportent une certaine confusion. Parmis ces équipements il y a les Load balancers, les équipements anycast BGP, les reverse proxy SSL/TLS, les firewalls, les équipements de NAT ou bien les pots de miel.  

Dans ces cas de figure, il faut utiliser l'option --packet-trace ou des outils comme hping ou nping associés à wiresahrk ou tshark/tcpdump

Consistence du TTL
Certains équipements de protection sont en amont des cibles. Un paquet RST avec un TTL inconsistent, indique qu'un équipement en amont a répondu à la place de la cible.
L'option --traceroute est utile pour analyser les TTL.
L'IP ID ou la fenêtre TCP en réponse permet de déterminer lorsque différents équipements répondent (Load Balancers). Leur IP ID se trouvent dans des plages distinctes ou leurs tailles de fenêtre divergent. Dans le me esprit, l'option timestamp de TCP permet d'identifier des systèmes distincts.
nmap possède l'option intéressante de calculer un checksum erroné avec l'option --badsum. Un système quelconque supprime tout paquet ayant un mauvais checksum car il est considéré corrompu. Les équiepements de sécurité, par soucis de performance, ne vérifient pas le checksum (ceci est de moins en moins vrai). Attention, la carte réseau calcule de plus en plus souvent le checksum en matériel. Il faut donc capturer le paquet en sortie de la carte réseau pour vérifier le comportement. Autre option, tester un système connu avec ou sans l'option.  


$ sudo nmap -sS -p 113 -PN --badsum --packet-trace 10.0.0.1

Le RTT est aussi une indication, car le dispositif de sécurité est en amont et effectue que les traitements essentiels alors que la cible exécute tous les contrôles et les données traversent toutes les couches. hping2 avec les options -c 1000 et -i u50000 envoie un milliers de sondes en moins d'une minute. Calculez la médiane plutôt que la moyenne. Effectuez ces scans sur une cible bien identifiée et sur celle qui vous pose un problème et comparer les résultats.


Usurpation d'adresse MAC Lorsque le pentester est sur le même segment de réseau, il peut spoofer son adresse MAC avec --spoof-mac. Il doit être utilisé avec l'option --send-eth pour que Nmap envoie les paquets au niveau Ethernet. La valeur 0 laisse nmap choisir une adresse aléatoire, sinon on peut spécifier la valeur de la MAC ou une string pour le prefixe (ex: 01:02:03:04:05:06deadbeefdead, Apple ou Cisco)

$ sudo nmap -Pn -n -p 80 192.168.1.95 --spoof-mac 0
$ sudo nmap -Pn -n -p 80 192.168.1.95 --spoof-mac 01:02:03:04:05:06
$ sudo nmap -Pn -n -p 80 192.168.1.95 --spoof-mac deadbeefdead
$ sudo nmap -Pn -n -p 80 192.168.1.95 --spoof-mac cisco

La fragmentation complique la taĉhe de nombreux IDS et FW. Cela permet de scanner des systèmes accessibles derrières un FW. L'option -f ou --mtu permettent de fragmenter les paquets. -f fragmente par lot de 8 octets, -ff par  16 octets, etc. --mtu requiert un nombre multiple de 8.

$ sudo nmap -Pn -n -p 80 192.168.1.95  -f
$ sudo nmap -Pn -n -p 80 192.168.1.95  -ff
$ sudo nmap -Pn -n -p 80 192.168.1.95  --mtu 8 
$ sudo nmap -Pn -n -p 80 192.168.1.95  --mtu 16 

L'utilisation d'un proxy chain.
Si un premier système est compromis dans la DMZ ou bien que le penteser ait accès à un service de proxy dans la DMZ, ile peut le brute forcer avec hydra ou installer un proxy. Une fois le système de relais installé, vous pouvez faires des scans full connexion avec -sT.

$ sudo nmap -sT 10.0.0.1 

FTP bounce
Une autre méthode est possible avec le FTP bounce. Un serveur FTP agissant en relais et supportant une authentification anonyme (ou bien vous posséder un compte valide) vous permet de tester le support de FTP bounce avec un script NSE.

$ sudo nmap --script ftp-bounce --script-args ftp-bounce.username=anonymous,ftp-bounce.password=me@hack.org 192.168.1.95 -p 21
...
PORT   STATE SERVICE
21/tcp open  ftp
|_ftp-bounce: bounce working!
...

Si le serveur permet le FTP bounce c'est à dire qu'il est proxy FTP il est possible de l'utiliser comme rebond pour scanner les systèmes derrière le relais FTP. L'argument est de la forme suivante username:password@server:port.

$ sudo nmap -b anonymous:me@hack.org@192.168.1.95:21 10.0.0.1-255

Scripts NSE
Pour utiliser lesscripts NSE, le plus simple est d'utiliser NMAP pour lire la description et fixer les paramètres. Pour lire le code source, rechercher les scripts NSE écrit en LUA avec :

$ locate *.nse

Categories de script NSE
all :       Tous
auth :  Authentification utilisateur.
broadcast : Collecte info en broadcast
brute :     Attaque brute-force sur les mots de passe 
default :   Scripts executés avec l'argument -sC
discovery : Découverte de services et d'hôtes
dos :       Déni de service 
exploit :   Exploitation de vulnérabilités.
external :  Scripts s'appuyant sur des tierce partie
fuzzer :    Fuzzing.
intrusive : Script intrusif 
malware :   Détection de malware
safe :      Scripts considérés comme sûrs 
version :   Versioning avancé
vuln :      Vulnérabilités 

Screendhot de serveur Web

Le binaire wkhtmltoimage permet de faire un screenshot d'une URL et de stocker le résultat dans un fichier PNG ou JPEG. Il s'appuie sur WebKit (wk). La version disponible sur les repositories ne contient pas toujours les deux binaires (wkhtmltopdf et wkhtmltoimage), ce dernier est parfois basent (ex: Ubuntu vs Debian).

$ sudo apt-get install wkhtmltopdf

Lorsque le binaire produisant des images est absent, il faut le télécharger, le décompresser, puis extraire l'archive et copier le binaire dans /usr/local/bin pour qu'il soit dans le PATH :

$ wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
$ 7z e wkhtmltox-0.12.3_linux-generic-amd64.tar.xz 
$ tar xvf wkhtmltox-0.12.3_linux-generic-amd64.tar
$ cd wkhtmltox/bin/
$ ./wkhtmltoimage http://192.168.1.1  box.png
$ sudo cp wkhtmltoimage /usr/local/bin/


Le scrip NSE qui utilise se binaire est sur github. Le script LUA attend un binaire nommé wkhtmltoimage-386. Il est donc nécessaire de le renommer, de le copier dans le répertoire des scripts NSE. Enfin, il faut mettre à jour la base de script NSE.

$ git clone git://github.com/SpiderLabs/Nmap-Tools.git
$ cd Nmap-Tools/NSE/
$ sudo cp http-screenshot.nse /usr/share/nmap/script
$ sudo nmap --script-update


Voilà, maintenant, la commande pour obtneir une image de la page d'accueil :

$ sudo nmap -A --script http-screenshot -p80 192.168.1.1 

Starting Nmap 7.01 ( https://nmap.org ) at 2016-03-20 18:05 CET
Nmap scan report for 192.168.1.1
Host is up (0.0026s latency).
PORT   STATE SERVICE VERSION
80/tcp open  http    lighttpd
| http-screenshot: 
|_  Saved to screenshot-nmap-192.168.1.1:80.png
|_http-server-header: Server
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: WAP
Running: Linux 2.6.X, Cisco embedded
OS CPE: cpe:/o:linux:linux_kernel:2.6.15 cpe:/h:cisco:wap4410n
OS details: Cisco WAP4410N WAP (Linux 2.6.15), Linux 2.6.15 (likely TP-LINK WAP), Tomato 1.28 (Linux 2.6.22)
Network Distance: 2 hops

TRACEROUTE (using port 80/tcp)
HOP RTT     ADDRESS
1   1.88 ms router (192.168.2.1)
2   3.36 ms 192.168.1.1

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 10.66 seconds


Un module Python équivalent existe (Peepintom)
Un script shell permet de générer une page de toutes les images de serveurs Web capturée

$ cat previewWeb.sh 
#!/bin/bash

OUT=previewWeb.html

printf  "<HTML><BODY><BR>" >  $OUT
ls -1 *.png | awk -F: '{ print $1":"$2"\n<BR><IMG SRC=\""$1"%3A"$2"\"width=400><BR><BR>" }' >> $OUT
printf  "</BODY></HTML>\n"   >> $OUT


La commande :

$ ./previewWeb.sh

génère un dichier previewWeb.html avec toutes les images et les noms de serveurs Web.

Cheat sheet nmap

Basic Scanning Techniques
nmap [target]       Scan a single target
nmap [target1,target2,etc] Scan multiple targets
nmap -iL [list.txt] Scan a list of targets
nmap [range of IP addresses] Scan a range of hosts
nmap [IP address/cdir] Scan an entire subnet 
nmap -iR [number]   Scan random hosts
nmap --exclude [targets] Excluding targets from a scan
nmap --excludefile [list.txt] Excluding targets using a list
nmap -A [target] Aggressive/advanced scan OS/service 
                              detection (-sV -sC -O --traceroute)
nmap -6 [target] Scan an IPv6 target 

Discovery Options
nmap -sL [targets] List IP address with reverse-DNS (no 
                            scan performed)
nmap --traceroute [target] Traceroute
nmap -R [target] Force reverse DNS resolution (to DNS 
                            server configured on host)
nmap -n [target] No reverse DNS resolution (fast)
nmap --system-dns [target] Force to use local resolver not DNS
                            server lookup
nmap --dns-servers [servers] [target] Alternate DNS servers

                   -=-=- Outside of LAN =-=-
nmap -sP [target]      ping scan + tcp/80 ack (except NSE/ 
                       traceroute) fast (-sP -PE)
nmap -PN [target]  No ping (low, scan all)
nmap -sP -PS [target] TCP SYN port 80 -sP -PS 22-25, 80,113) 
nmap -sP -PA [target] TCP ACK scan
nmap -sP -PU [target] UDP scan
nmap -sP -PY [target] SCTP Init scan
nmap -sP -PE [target] ICMP echo requ. ping (type: req=8, reply=0)
nmap -sP -PP [target] ICMP Timestamp ping (type 13)
nmap -sP -PM [target] ICMP address mask ping (type 17)
nmap -sP -PO [target]  IP protocol scan (default! icmp=1, igmp=2, PinIP=4) 
                        /etc/protocols
nmap -sP -PO [num] [target] IP protocol tcp=6 udp=17 ipv6=41 gre=47 esp=50 ah=51
                             sctp=132
nmap -sP -PO [num] [target]--data [hex] 

                    -=-=- LAN only =-=-
nmap -sP [target]        ARP request
nmap -sP -PR [target] ARP request

Advanced Scanning Options
nmap -sS [target] TCP SYN Scan
nmap -sT [target] TCP connect scan 
nmap -sU [target] UDP scan
nmap -sN [target] TCP Null scan
nmap -sF [target] TCP Fin scan
nmap -sX [target] Xmas scan
nmap -sA [target] TCP ACK scan
nmap -sW [target] TCP Window scan (detect open vs closed ports against certain hosts)
nmap -sM [target] TCP Maimon scan (firewall-evading scan)
nmap --scanflags [flags] [target] Custom TCP scan (-p80 --scanflags            SYN,ACK)
nmap --send-eth [target] Send Raw Ethernet packets
nmap --send-ip [target] Send IP packets
nmap --source-port <num>  Set the source port (same as -g) 
nmap --ttl [value]        TTL value 
nmap --data <hex string> Append a custom payload to sent packets
nmap --data-string <string> Append a custom ASCII string to sent 
                             packets
nmap --data-length <num> Append random data to sent packets
nmap --datadir <dirname> Specify custom Nmap data file location
nmap --reason Display reason for a port
nmap -sO [target] IP protocol scan (fail: ICMP proto unreachable)

Port Scanning Options
nmap -F [target] Perform a fast scan (UDP: 100= ports)
nmap -p [ports] [target] Scan specific ports
nmap -p [port name] [target] Scan ports by name
nmap -p “*” [target] Scan all ports 1-65535 
nmap -p- [target] Scan all ports 1-65535 
nmap -p0- [target] Scan all ports 0-65535
nmap -sU -sT -p U:[ports],T:[ports] [target] Scan ports by protocol
nmap --top-ports [number] [target] Scan top ports 


Version Detection   -  Submit Fingerprints http://www.nmap.org/submit/ 
nmap -O [target] Operating system detection
nmap -O --osscan-guess [target] Attempt to guess an unknown
nmap -sV [target] Service version detection
nmap -sV --version-trace [target]  Troubleshooting version scans
nmap -sR [target] Perform a RPC scan

Timing Options
nmap -T [0-5] [target]  Timing Templates 
nmap --ttl [time] [target] Set the packet TTL
nmap --min-parallelism [number] [target] Minimum of probe parallelization!!!
nmap --max-parallelism [number] [target] Maximum of probe parallelization!!!
nmap --min-hostgroup [number] [targets] Minimum parallel host scan group sizes
nmap --max-hostgroup [number] [targets] Maximum parallel host scan group sizes
nmap --initial-rtt-timeout [time] [target] Maximum RTT timeout
nmap --max-rtt-timeout [TTL] [target] Initial RTT timeout
nmap --max-retries [number] [target] Maximum retries
nmap --host-timeout [time] [target] Host timeout
nmap --scan-delay [time] [target] Minimum Scan delay
nmap --max-scan-delay [time] [target] Maximum scan delay
nmap --min-rate [number] [target] Minimum packet rate
nmap --max-rate [number] [target] Maximum packet rate
nmap --defeat-rst-ratelimit [target] Defeat reset rate limits

Firewall Evasion Techniques
nmap -f [target] Fragment packets
nmap --mtu [MTU] [target] Specify a specific MTU
nmap -D RND: [number] [target] Use a decoy 
nmap -D <decoyl,decoy2,...>    USe a decoy (your IP address is part of scan)
nmap -S <IP source>            Spoofing IP source
nmap -sN [target] TCP Null scan
nmap -sF [target] TCP Fin scan
nmap -sX [target] Xmas scan
nmap -sA [target] TCP ACK scan
nmap -sI [zombie] [target] Idle zombie scan
nmap -sW [target] TCP Window scan (detect open vs closed ports                                      against certain hosts) open ports use a positive 
                               window size while closed ones have a zero window
nmap -sM [target] TCP Maimon scan (firewall-evading scan) probe                                    FIN/ACK. BSD-derived systems simply drop the 
                               packet if the port is open
nmap --source-port [port] [target] Manually specify a source port
nmap --data-length [size] [target] Append random data
nmap --randomize-hosts [target]   Randomize target scan order
nmap --spoof-mac [MAC|0|vendor] [target] Spoof MAC Address
nmap --badsum [target] Send bad checksums

Output Options
nmap -oN [scan.txt] [target] Output in text file
nmap -oX [scan.xml] [target] Output in xml file
nmap -oG [scan.txt] [target] Grepable output
nmap -oA [path/filename] [target] Output all file types
nmap --stats-every [time] [target] Periodically display statistics
nmap -oS [scan.txt] [target] 133t output
nmap --resume <filename> Resume aborted scan by output file normal 
                                   (-oN) or grepable (-oG)
nmap --append-output Append scan results to file (oN or -ox)

$ xsltproc <file.xml> -o <file.html>
$ java -jar saxon9.jar -s:out.xml -o:out.html
$ java -jar xalan.jar -IN out.xml -OUT out.html
$ java XMLNMAPReader out.xml > out.[html/xls]
$ Xalan -a <nmap-output.xml> -o <nmap-output.html>


Troubleshooting and debugging
nmap -h Help
nmap -V Display Nmap version
nmap -v [target] Verbose output (--verbose)
nmap -d [target] Debugging
nmap --reason [target] Display port state reason
nmap --open [target] Only display open ports
nmap --paket-trace[target] Trace packets
nmap --iflist Display host networking
nmap -e [interface] [target] Specify a network interface
nmap --script-trace Show all data sent and received

Service version options
nmap -sV Scan open ports for service/version info
nmap --version-intensity <level> Set from 0 (light) to 9 (try all probes) Probe 
                                  the proto on the port (UDP)
nmap --version-light Limit to most likely probes (intensity 2)
nmap --version-all Try every single probe (intensity 9)
nmap --version-trace Show detailed scan activity (for debugging)

$ sudo nmap -p 1234 -sV --version-intensity 9 192.168.1.50


Nmap Scripting Engine
nmap --script [script.nse] [target] Execute individual scripts
nmap --script [expression] [target] Execute multiple scripts

Script categories : all, auth, default, discovery, external, intrusive, malware, safe, vuln
nmap --script [category] [target] Execute scripts by category
nmap --script [category1,category2, etc]  Execute multiple scripts categories
nmap --script [script] --script-trace [target] Troubleshoot scripts
nmap --script-updatedb Update the script database
nmap -sC [target] Equal --script=safe,intrusive
nmap --script-trace Show all data sent and received

Ndiff
ndiff [scan1.xml] [scan2.xml] Comparison using Ndiff
ndiff -v [scan1.xml] [scan2.xml] Ndiff verbose mode
ndiff --xml [scan1.xm] [scan2.xml] XML output mode


Example

La cheat sheet nmap.

TCP
$ nmap -p 21 -v -oN results.txt --open --script ftp-anon 192.168.1.95 Testing anonymous access
$ nmap -T4 -p 80 -PN --max-rtt-timeout 200ms --initial-rtt-timeout 150ms --min-hostgroup 512 --max-parallelism 512  -n 192.168.1.0/24
  perf:  T4
  reduire les timeout
  parallelisation des hosts par 512
$ nmap -p1-65535 -T4 -A -v -n -Pn --script default,discovery --min-parallelism 10 --max-parallelism 512 192.168.1.95 

UDP
$ nmap -sUV -T4 -F --version-intensity 0 scanme.nmap.org
  --host-timeout  to skip slow hosts
  --min-hostgroup group host to speed up the scan

$ nmap -sU -A -v -T4 --top-ports 1000 --version-intensity 0 -Pn -n scanme.nmap.org
$ nmap -sU -n -T4 -sV -p53,1000 --version-intensity 9 -Pn scanme.nmap.org

SCTP
$ nmap -sY -A -p- -T4 -v -n -Pn 

Proto
$ sudo nmap -sO 192.168.1.95  --packet-trace

IPV6
$ nmap -6 -p-
$ nmap -6 -sU --top-ports 1000
$ nmap -6 -sY -p-
$ nmap -6 ::1                     # scan IPv6 localhost
$ nmap -6 -sT --traceroute ::1

UPnP
$ sudo nmap --script broadcast-upnp-info 

OS
$ nmap -O <target>
$ nmap -O -v  <target>
$ nmap -O -v 192.168.1.81
$ nmap -O -T5 -PE --top-port 3328 --osscan-limit --max-rtt-timeout 100ms 192.168.1.95
$ nmap -O -T5 -PE --top-port 236  --osscan-limit --max-rtt-timeout 100ms --max-parallelism 100 --min-hostgroup 100 -ox output.xml -iL ip_networks.txt


$ sudo nmap –-scanflags SYNRST target    # scan flag custom
$ sudo nmap -pT:21-25,80,U:50-60 target  # tcp: 21-25,80 UDP: 50-60
$ sudo nmap -n -sV 10.150.9.46           # service detection
$ sudo nmap -n -A 10.150.9.46            # Aggressive (-O -sV -sC --traceroute)
                                         # enables detection for OS, version + 
                                           script scanning and traceroute
$ sudo nmap -sP 192.168.1.1/24           # Finding live hosts (TCP ACK & ICMP 
                                           echo request + ARP on LAN)
$ sudo nmap -sP --send-ip 192.168.1.1/24 # idem mais désactive ARP
$ sudo nmap --traceroute traget          # traceroute

Reprise de scan
$ sudo nmap -oG grepable_output -n 10.150.9.15,143
$ sudo nmap --resume grepable_output

HTTP
$ sudo nmap -p80 --script http-google-email,http-email-harvest <target>
$ sudo nmap -p80 --script http-email-harvest --script-args httpspider.maxpagecount=50 <target>
$ sudo nmap -p80 --script http-email-harvest --script-args httpspider.url=/welcome.php <target>
$ sudo nmap -p80 --script http-google-email --script-args domain=insecure.org scanme.nmap.org
$ sudo nmap -p80 --script http-google-email --script-args pages=10 scanme.nmap.org