Introduction

Dans un réseau local, les paquets sont envoyés via un hub ou un commutateur. A la différence du commutateur, lorsque le hub recevra des paquets pour un hôte, il les enverra sur tous ses ports. Ce sont les cartes réseaux qui, en analysant l'adresse MAC de destination, vont jeter ou faire remonter à la couche du dessus les paquets.

Comment la carte trie les paquets ?

Un ordinateur est composé de deux sortes de filtres :

  1. filtre hardware
  2. filtre logiciel

filtre hardware

Un paquet arrivant à destination de l'hôte sera confronté en premier lieu à ce filtre. Ce dernier, en consultant l'adresse MAC de destination, va savoir s'il faut garder ou non le paquet. Si l'adresse MAC correspond à celle de la carte réseau (UNICAST) ou s'il s'agit de l'adresse FF:FF:FF:FF:FF:FF (BROADCAST) ou encore d'une adresse (UNICAST) dont la machine appartient le paquet sera gardé. Mais le filtre logiciel va lui faire subir une dernière épreuve

filtre logiciel

A ce niveau, tous les paquets sont visibles. Mais avant que la machine réponde à telle ou telle sollicitation, le paquet sera envoyé au filtre logiciel. Ce filtre est identique au filtre hardware. Néanmoins, il existe une petite différence, qui est de taille. Puisqu'aucune carte n'a comme octet de poids fort FF dans l'adresse MAC d'origine, les éditeurs d'OS, pour des questions de performances, n'identifient pas les adresses broadcast sur tous les octets. Par exemple, tous les filtres logiciels considèrent actuellement l'adresse MAC FF:FF:00:00:00:00 comme une adresse broadcast.

Mode promiscuous

Aux trois modes (unicast, multicast, broadcast) du filtre hardware viennent s'ajouter un dernier : promiscuous. Ce mode est très simple, il consiste à laisser passer le paquet sans avoir inspecté l'adresse MAC de destination.

Vous l'avez compris, un sniffer va basculer le filtre hardware dans le mode promiscuous, pour pouvoir lire tous les paquets, y compris ceux n'étant pas destinés à la machine.

Remarque

Nous pouvons constater qu'un paquet qui passe le filtre hardware (s'il n'est pas en promiscuous) passera également le filtre logiciel sur le principe du "qui peut le plus peut le moins". En effet le filtre hardware est beaucoup moins souple que le filtre logiciel sur l'adresse MAC.

Mais comment détecter le sniffing ?

Tout logiciel de sniffing basculera votre interface réseau dans le mode promiscuous, désactivant donc le premier filtrage. Et comme dit précédemment, il y a une différence entre les deux filtrages. L'astuce permettant de détecter le mode promiscuous d'une carte consiste à envoyer un paquet qui est refusé par l'un des filtrages et accepté par l'autre. Ainsi, nous serons en mesure de déterminer quel filtre a agi, et par conséquent en déduire si la carte est en promiscuous ou non. Prenons l'exemple d'un paquet ARP who-has en broadcast falsifié (FF:FF:00:00:00:00) destiné à un hôte dans le réseau et analysons-le avec les deux filtres.

Détails du paquet ARP :

ARP
  • IP src: votre adresse IP
  • MAC src: votre adresse MAC
  • IP dst: l'adresse IP du suspect (celui dont on souhaite savoir s'il sniffe le réseau ou non)
  • MAC src: 0.0.0.0 (puisque nous ne connaissons pas son adresse MAC)
Ethernet
  • MAC src: votre adresse MAC
  • MAC dst FF:FF:00:00:00:00 (le broadcast falsifié)

filtre hardware

Le filtre hardware va consulter l'adresse MAC de la couche Ethernet pour voir si le paquet est destiné à la machine. L'adresse MAC ne correspond pas à votre adresse MAC, n'est pas du vrai broadcast (FF:FF:FF:FF:FF:FF) et n'est pas du multicast. Le paquet sera donc rejeté. Vous n'aurez donc pas l'adresse MAC du suspect.

filtre logiciel

Le filtre logiciel va également consulter l'adresse MAC de la couche Ethernet pour voir s'il est autorisé à être lu par le noyau. Rappelez-vous, l'adresse FF:FF:00:00:00:00 est considérée comme du broadcast par ce filtre. Ainsi si le filtre reçoit ce paquet, il sera transmis au noyau. Le protocole ARP va donc s'activer. Le noyau, en remarquant que l'adresse IP du suspect est celle de son interface réseau, va émettre un paquet ARP is-at lui donnant son adresse MAC. Vous aurez donc l'adresse MAC du suspect.

Bilan

Admettons que le suspect est effectivement en train de sniffer le réseau. Sa carte est donc en mode promiscuous. Ainsi le filtre hardware est désactivé, laissant le filtre logiciel agir seul. En envoyant le paquet ARP au suspect, nous recevrons une réponse, consultable dans le cache ARP. Nous en déduisons dans ce cas que le suspect est coupable de sniffer le réseau.

Si nous ne recevons pas de réponses, c'est que le paquet s'est fait filtré par le filtre hardware. Et si le filtre hardware est en place, c'est que le suspect ne sniffe pas le réseau.

Conclusion

Le logiciel que je propose, écrit en Python pour pouvoir utiliser facilement Scapy, permet d'automatiser tout le concept expliqué dans la présente page.

  • ./detect.py -i interface AdresseIPduSuspect permettra de savoir s'il a sa carte en promiscuous ou non.

Comme dit précédemment dans l'article, le filtre logiciel dépend de l'OS. Tandis que certains OS considéreront FF:00:00:00:00:00 comme broadcast, d'autres ne le considéreront pas comme broadcast. Il est donc possible d'en déduire le type d'OS lorsque la carte est en promiscuous, en faisant des combinaisons de paquets ARP avec des adresses MAC Ethernet malicieusement choisies.

  • ./detect.py -O -i interface AdresseIPduSuspect permettra de savoir s'il a sa carte en promiscuous ou non, et le cas échéant d'en déduire son type d'OS.

Ce script n'est pas compliqué et est parfaitement lisible du fait qu'il se base sur Scapy. Il a juste pour but d'automatiser la détection de Sniffeur. Cette version n'est qu'un prototype, d'autres fonctionnalités verront le jour (ou pas).

Pour pouvoir exécuter le script, il faudra au préalable installer un interpréteur python, et installer scapy. Vous êtes prêts ? téléchargement