network mapper http://www.insecure.org/nmap/
But: recenser les services sur une machine.
Il y a 5 méthodes principales pour repérer les ports ouverts.
nmap 192.168.2.51
Pareil que
nmap -sT 192.168.2.51
Il va essayer d'établir une connexion TCP complète (syn, syn-ack, ack) sur chaque port essayé.
Si la machine répond avec SYN-ACK, le port est ouvert. Sinon, elle répond SYN-RST (reset).
Il faut être root.
nmap -sS 192.168.2.51
Envoie SYN, reçoit SYN-ACK (ou SYN-RST si le port est fermé), renvoie RST (reset = abort) → la connexion n'est pas logguée. C'est une connexion semi-ouverte (half-open connection). Le principe est le même que dans le cas de figure précédent.
Le flag FIN annonce la fin normale (propre) de la connexion TCP. Si une machine envoie un paquet dans lequel seul le flag FIN est positionné à 1 et si la machine destination est compatible à la RFC 793 (définition de TCP/IP = pas les machine avec Windows), elle doit renvoyer un paquet RST si le port est ouvert.
nmap -sF 192.168.2.51
Pour s'en protéger:
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP
Envoie un paquet TCP avec aucun flag mis à un. En principe, si le port est ouvert, la machine doit renvoyer un RST.
nmap -sN 192.168.2.51
Pour s'en protéger:
iptables-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
2 types:
nmap -sX 192.168.2.51
Pour se protéger de la première:
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
De la seconde:
iptable -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK -j DROP
signifie si bits SYN et ACK = 1 et le reste = 0 → jette le paquet
ALL = ceux à aller regarder SYN,ACK = doivent être à un.
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN SYN,ACK -j DROP
Si FIN=0, SYN=1 et ACK=1 → jette le paquet.
Depuis machine A (IP 192.168.2.42), tester machine B (IP: 192.168.2.42). Puis A se protège avec une règle. Puis B réessaye
nmap 192.168.2.111
iptables -A INPUT -s 192.168.2.42 -m state --state NEW -j DROP
nmap -sF 192.168.2.51
iptables -A INPUT -s 192.168.2.42 -p tcp --tcp-flags ALL FIN -j DROP
nmap -sN 192.168.2.51
iptables -A INPUT -s 192.168.2.42 -p tcp --tcp-flags ALL NONE -j DROP
nmap -sX 192.168.2.51
iptables -A INPUT -s 192.168.2.42 -p tcp --tcp-flags ALL ALL -j DROP
nmap -sX 192.168.2.51
iptables -A INPUT -s 192.168.2.42 -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
Lorsqu'on a mis les 5 règles ci-dessus en place, les scans TCP nmap sont inopérants.
nmap -v -O 192.168.2.51
Où se trouve l'information? dans /usr/share/nmap/nmap-os-fingerprints
nmap -v -O 192.168.2.0/24
nmap -v -D 192.168.2.10 192.168.2.111
Le scan a l'air de venir de l'IP 192.168.2.10 en plus de l'IP de la machine (il faut bien qu'il y ait des paquets sources de la machine scannant, sinon, elle ne reçoit rien).
On peut en mettre plusieurs:
nmap -v -D 192.168.2.10,192.168.12.54,125.42.98.74 192.168.2.111
nmap peut sortir un fichier text, texte facile pour la commande grep, XML, …
En texte:
nmap 192.168.2.0/24 -oN fichier_log_nmap.txt
En fichier prêt pour grep:
nmap 192.168.2.0/24 -oG fichier_log_grep_nmap.txt
Ca permet par exemple de trouver les port 80 (serveurs web) ouverts sur le réseau.
En fichier XML:
nmap 192.168.2.0/24 -oX fichier_log_xml_nmap.txt
Que fait nmap pour localiser les machines? Réponse à chercher en lançant ethereal sur la machine scannée: un paquet ICMP (ping) suivi d'un paquet TCP avec un flag ACK. Il suffit donc de 2 règles pour apparaître invisible à nmap:
iptables -A INPUT -p tcp --tcp-flags ALL ACK -j DROP iptables -A INPUT -p ICMP -j DROP