Nemesis : détection d'un sniffeur réseau
L’article précédent parlait de forger des paquets avec Nemesis . Celui-ci parle de la face opposée: détecter que quelqu’un sur votre réseau écoute ce qu’il ne devrait pas.
Le problème
Une carte réseau en mode promiscuous accepte TOUTES les trames, pas seulement celles adressées à sa MAC. C’est ce qui permet à tcpdump et à Wireshark de fonctionner et c’est aussi ce qui permet à un sniffeur de lire le trafic qui ne lui est pas destiné. Sur un switch, ça ne devrait pas passer (le switch route par MAC), mais si quelqu’un a bricolé le switch ou s’il y a un hub quelque part, ça passe.
La détection
Le point le plus subtil est une méthode de détection du mode promiscuous par paquet forgé via Nemesis. Le principe: envoyer un paquet avec une MAC destination partiellement broadcast (ff:ff:00:00:00:00) vers une IP cible. Une NIC en mode normal filtre par MAC et rejette cette trame: ce n’est pas sa MAC, ce n’est pas le broadcast complet (ff:ff:ff:ff:ff:ff), ce n’est pas un groupe multicast qu’elle a rejoint. Une NIC en promiscuous accepte TOUTES les trames, y compris celle-ci: le kernel la traite, l’IP destination correspond et le kernel répond.
# La MAC ff:ff:00:00:00:00 est le pivot du test:
# assez de ff pour ressembler au broadcast, assez de 00 pour être filtrée
# par une NIC normale
nemesis arp -S 192.168.1.100 -D 192.168.1.254 -H ff:ff:00:00:00:00
Si la station cible répond, elle est en promiscuous. Si elle ne répond pas, sa NIC a filtré la trame au niveau 2.
Le “poids” de la MAC broadcast partielle est le paramètre: ff:ff:ff:00:00:00 passe par plus de cartes que ff:ff:00:00:00:00 (certaines NICs traitent le multicast en fonction des bits de poids fort) et ff:ff:ff:ff:ff:fe est le cas limite: un bit de moins que le broadcast, exactement la frontière où certaines firmwares décident de filtrer ou non. En variant le nombre de ff, on sonde la profondeur exacte du filtre MAC de chaque carte.
La méthode est documentée dans le paper “Detection of Promiscuous Nodes Using ARP Packets” (securityfriday.com), qui est la référence du script Nmap sniffer-detect.
Les méthodes complémentaires de l’époque:
- ICMP broadcast MAC, IP unicast: un echo request vers une IP existante mais avec une MAC de broadcast. En mode normal, la NIC filtre. En promiscuous, le kernel répond.
- DNS callback: une requête reverse DNS vers une IP qui n’existe pas, envoyée avec une MAC incorrecte. La carte promiscuous traite le paquet, le kernel lance une résolution DNS et votre serveur DNS logge l’IP du sniffeur.
- ARP watch: surveiller les réponses ARP et signaler les MAC qui répondent à des IPs qui ne leur appartiennent pas.
- Les logs du switch: les switches gérés montrent quel port a reçu combien de trames qui n’étaient pas pour lui.
Ce que ça vaut
Honnêtement, sur un réseau à switches modernes, le mode promiscuous ne voit que le broadcast et le traffic destiné à la MAC du sniffeur, pas le traffic d’autrui. La détection n’a de valeur que dans trois cas: réseau avec des hubs (rare en 2008 mais toujours vivace), réseau wifi (où tout est broadcast par nature) ou un switch compromis.
Mais c’est un exercice instructif et le fait de savoir détecter un sniffeur fait partie du kit. Le réseau, c’est un jeu de chat et souris permanent: tcpdump écoute, Nemesis forge et détecte. Les deux outils ensemble forment le diagnostic complet.