ARP poisoning : sniffer une communication

Cet article présente comment on peut écouter le trafic entrant et sortant d'un ordinateur de son sous-réseau.

On ne peut pas vraiment s'en protéger, il faut juste savoir que ça existe. Rassurez vous, même si un pirate peut voir tout votre flux internet même le crypté, il ne pourra pas décoder les flux sécurisés. Cela englobe tout ce que est HTTPS (site où un petit cadenas s'affiche dans le navigateur), SSH, etc... Rassurez vous, votre mot de passe bancaire est bien protégé !

Il faut être dans le même sous-réseau que l'une au moins des deux extrémités de la communication, qui sera alors notre cible. Pour l'exemple, les adresses se terminant par 1 sont celles de la passerelle, par 2 sont celles de la cible et par 3 sont les notres. Les commandes présentées ici peuvent être tapées sous Linux ou Mac. Nemesis est un utilitaire qui permet de construire et d'injecter dans le réseau des paquets de différents protocoles (dans notre cas ARP). Pour obtenir l'utilitaire nemesis sous Mac, vous pouvez par exemple utiliser MacPorts.

Principe

Les communications dans un même sous-réseau se font avec les adresses MAC (niveau 2), les adresses IP (niveau 3) étant en quelques sorte utilisées pour acheminer les paquets vers le bon sous-réseau. Or lorsqu'un ordinateur (192.168.0.3 par exemple) veut envoyer un paquet à un destinataire (192.168.0.2 par exemple) de son sous-réseau pour la première fois, il ne connait en général que son adresse IP. Il va donc envoyer à tout le monde sur le sous-réseau un message du type (requête ARP) :

Quelle a l'adresse MAC de 192.168.0.2 ? Répondre à 192.168.0.3.

et 192.168.0.2 va se reconnaitre et répondre un message du type :

192.168.0.2 a l'adresse MAC 00:00:00:00:00:03

L'expéditeur obtient ainsi l'adresse MAC du destinataire et peux lui envoyer le paquet. Pour éviter d'envoyer des requêtes ARP à chaque fois qu'on doit envoyer un paquet, les systèmes gardent les correspondances IP-MAC en cache dans la table ARP. Le principe de l'ARP poisoning est d'envoyer de faux paquets qui vont modifier la table ARP de la cible et fausser les correspondances IP-MAC. Dans notre cas, on :

  • chez la passerelle, associer l'adresse IP de la cible avec notre adresse MAC
  • chez la cible, associer l'adresse IP de la passerelle avec notre adresse MAC

Tous les paquets vont donc nous arriver dessus, il suffira ensuite de les faire suivre au bon destinataire.

1. Prendre l'identité de la cible auprès de la passerelle

C'est fait en envoyant à la passerelle des paquets qui signifient :

Je suis la cible (192.168.0.2) et mon adresse MAC est 00:00:00:00:00:03

c'est notre adresse MAC ! Ceci se fait avec la commande nemesis entrée avec les options suivantes :

  • -S 192.168.0.2 IP source, celle de la cible
  • -D 192.168.0.1 IP de destination, celle de la passerelle
  • -H 00:00:00:00:00:03 MAC source, la notre !
  • -M 00:00:00:00:00:01 MAC de destination, celle de la passerelle
  • -r ARP reply
  • -v mode verbose
  • -d eth0 interface réseau

Comme la passerelle redonne régulièrement à tout le sous-réseau son adresse MAC (encore par un message ARP), ce paquet doit être réinjecté régulièrement à l'aide par exemple d'une boucle qui répète toutes les 2 secondes la commande commande :

while true; do commande; sleep 2; done;

2. Prendre l'identité de la passerelle auprès de la cible

C'est fait en envoyant à la passerelle des paquets qui signifient :

Je suis la passerelle (192.168.0.1) et mon adresse MAC est 00:00:00:00:00:03

c'est encore notre adresse MAC ! Ceci se fait avec la commande nemesis entrée avec les options suivantes :

  • -S 192.168.0.1 IP source, celle de la passerelle
  • -D 192.168.0.2 IP de destination, celle de la cible
  • -H 00:00:00:00:00:03 MAC source, la notre !
  • -M 00:00:00:00:00:02 MAC de destination, celle de la cible
  • -r ARP reply
  • -v mode verbose
  • -d eth0 interface réseau

De la même façon, il faut que ce paquet soit régulièrement injecté dans le réseau en utilisant par exemple une boucle comme à l'étape 1.

3. Routage

A ce stade là, tous les paquets envoyés par la cible (resp. la passerelle) à la passerelle (resp. la cible) sont adressés à notre adresse MAC et donc nous parviennent. Nous sommes donc en mesure de les lire. Cependant, notre système ouvre ces paquets qui lui sont adressés au niveau 2 (adresses MAC) et constate qu'ils ne lui sont pas adressés au niveau 3 (adresses IP) et donc les ignore. Le destinataire final n'obtiendra donc jamais le paquet et ne pourra pas continuer à naviguer. Il suffit simplement de demander au système de faire suivre vers leur distinataire final les paquets qui ne nous sommes pas addressés. Il faut pour cela activer la redirection de paquet :

  • Sous Linux : echo 1 > /proc/sys/net/ipv4/ip_forward
  • Sous Mac : sysctl -w net.inet.ip.forwarding=1
Quentin Pleplé
July 2010