19 août 2007

Sniffers remote detection

Bien que les sniffers soient des outils d'administration et de dévelopement terriblement utiles, leur mise en place sur un réseau par des utilisateurs malveillants peut leur permettre de corrompre peu à peu toutes les machines du réseau.

Ils peuvent être plus ou moins furtifs, mais la quasi-totalité fonctionnent en plaçant la carte réseau en mode promiscuous. C'est à dire en mode d'acceptation de tous les paquets qui se présentent à elle, qu'ils lui soient déstinés ou non.
Ce peut être extrêmement difficile à détecter sur de gros réseaux si l'on n'y prend garde, mais de là à penser que c'est mission impossible il y a un pas que nous n'allons pas franchir!

Sur une machine, un simple ipconfig permettra de constater si la carte est ou non en mode promiscuous.
Mais le problème est différent lorsque la détection doit se faire à distance, et c'est pourtant une nécessité sur de gros réseaux.
Plusieurs approches sont possibles, mais l'une a retenu mon attention, elle est basée sur l'envoi de requêtes ARP.

D'ordinaire, ces requêtes sont envoyées en broadcast (adresse MAC FF:FF:FF:FF:FF:FF). Mais si on modifie le champs "destination" en y mettant FF:FF:FF:FF:FF:FE , une machine en mode "normal" refusera le paquet, mais pas une hébergeant un sniffer.
Passé la barrière matérielle, le paquet sera envoyé au noyau. Nous nous retrouvons alors face à une barrière logicielle. Mais il y a un bug sur les noyaux Linux 2.2->2.6 et Windows 95->Vista (vérifié pour linux 2.4 et 2.6, windows XP et Vista). Les adresses de destination ne sont pas complètement analysées, et pour le kernel, FF:FF:FF:FF:FF:FE sera identique à FF:FF:FF:FF:FF:FF. L'ordinateur nous enverra donc un paquet de type ARP reply.

Il suffit alors, après l'envoi du paquet d'attendre une réponse et d'analyser les champs de cette réponse pour connaitre l'émetteur et en déduire que sa carte réseau est en mode promiscuous.
Je suis actellement en train d'écrire un logiciel exemple. Je posterais le code ici lorsqu'il sera fini.

Update : Voici une première version fonctionnelle du code (archive zip, archive tar.gz), toute fraichement sortie de vim. Il doit y avoir pas mal de choses à revoir et optimiser. Je tacherais de trouver le temps nécessaire dans les semaines à venir.
En attendant le code constitue un bon (j'espère) exemple d'utilisation des raw sockets.

Aucun commentaire: