NaGaZ
sur le rézo de la Defcon9...
Formidable le Defcon ! (et vi, je m'enflamme ;) J'y ai récupéré grâce à
tcpdump le fonctionnement d'une attaque de type Man In the Middle qui se base
sur des techniques dites d'arp poisonning et de icmp redirect. Dans cet article
je ne parlerai que de ce dernier point, j'étudierai l'arp dans le Manuel 3. - Cool ! mais comment t'as fait champion ? Pour récupérer ces logs, j'ai tout simplement sniffé les paquets passant
sur le réseau avec tcpdump, qui est livré en standard avec la plupart des
distributions de Linux (il existe également un portage sous Windows). Voici comment j'ai exécuté ma capture de log : root@tty1# tcpdump 'icmp[0] = 5' -n -w Explication des options :
capture_icmp_redirect
-n : ne pas
effectuer de résolution de nom, écrire les adresses IP telles qu'elles (sinon,
ça génère un paquet de requêtes sur le serveur DNS par défaut et ça
ralentit le traitement des données lues)
-'icmp[0] = 5'
: on récupère que les messages de type ICMP qui sont de type redirect (d'où
5, comme vous pouvez vérifier dans /usr/include/linux/icmp.h si vous avez
installé le nécessaire pour coder).
Peut-être, avant de rentrer dans les détails techniques des fichiers de dump, un rappel sur le rôle du protocole ICMP (Internet Control Management Protocol). (bin vi, ca fera de mal à personne =)
-- Ca tombe bien, c'est l'heure de la sieste.
Une machine (qui a par exemple l'adresse ip 1.1.1.1) ne peut envoyer des paquets réseau qu'à des machines situées sur le même réseau local (ces machines sont reliées physiquement par des câbles et par un hub ou un switch par exemple). Pour accéder à un autre ordinateur situé ailleurs que sur le réseau local (sur internet par exemple), les paquets doivent passer par un ou plusieurs routeurs, qui sont des machines spéciales capables de transférer des paquets d'un réseau local à un autre (un routeur possède deux cartes réseaux, connectées chacune sur un réseau local différent, et il fait le relais entre les deux). En gros c'est ça l'idée générale.
Imaginons que le routeur A ayant l'adresse IP 1.1.1.254 soit le routeur par défaut de notre machine. Nous lui demandons d'accéder à la machine 1.2.3.4, située sur internet. Le routeur transmet notre paquet au routeur suivant grâce à une table de routage (qui dit par quels routeurs passer pour atteindre telles adresses IP). Ce deuxième routeur transmet à son tour le paquet au routeur suivant, et ainsi de suite jusqu'à atteindre l'ordinateur voulu. Mais imaginons que le routeur A se rende compte qu'il doit passer par un routeur qui est sur le meme réseau que nous pour pouvoir atteindre ce site. Ce routeur B a pour adresse 1.1.1.253 par ex. S'apercevant de cela, notre routeur par défaut (routeur A) va effectivement envoyer notre paquet vers le routeur B, mais il va également dans le même temps avertir notre machine qu'il existe sur son réseau un routeur B qui est capable de répondre plus efficacement à ses requêtes destinées à 1.2.3.4. En effet, notre machine étant située sur le même réseau que les deux routeurs A et B, on peut utiliser l'un ou l'autre. Mais il est plus efficace d'envoyer directement nos paquets à B plutôt que de passer par A qui devra ensuite les transmettre à B.
Ceci se traduit par un message "ICMP redirect" venant du routeur A et destiné à notre machine, qui dit en gros : "pour atteindre l'adresse IP 1.2.3.4, tu ferais mieux de t'addresser au routeur B d'adresse IP 1.1.1.253".
Avec tcpdump, ce type de message est formaté de la façon suivante :
1.1.1.254 > 1.1.1.1: icmp: redirect
1.2.3.4 to host 1.1.1.253 [tos 0xc0]
-- C'est bien joli tout ca, mais ca marche tout le temps ?
Presque. Ce message est géré de manière différente par les différents OS : par défaut, Windows ajoute une entrée dans sa table de routage (!), linux ajoute (ou n'ajoute pas, suivant les distributions) une entrée SILENCIEUSE (elle n'apparaîtra pas si on affiche la table de routage !!). Cette entrée dit: "pour atteindre la machine 1.2.3.4, je dois passer par le routeur 1.1.1.253".
Je n'ai pas (encore) cherché à vérifier ces comportements, c'est FX/Phenoelit qui nous l'a dit à la Def-con...
-- Ah ! c'est quand meme sympa tout ca ! :)
Bon, voilà pour les bases. En aucun cas, après avoir lu ce papier, vous pourrez dire "je sais à quoi sert ICMP". Il existe plein d'autres types de messages que ce protocole permet qui ont un sens totalement différent. Je n'ai parlé que des messages ICMP de _redirection_.
-- Bon, on y va ou on continue de ruminer... Voyons comment tout ceci est exploité par notre camarade sur le réseau de la Defcon... :) Action !
Le méchant pirate (appelons-le evil_box) s'est mis à sniffer le réseau et à attendre qu'un paquet passe. A partir de ce moment là, dès qu'il voyait passer un paquet qui ne lui était pas destiné, il envoyait un message ICMP Redirect à la machine source : (notre evil_box a l'adresse IP 10.255.0.192)
70: 10.255.0.192 > 10.255.0.108: icmp: redirect 10.255.0.5 to host 10.255.0.192 [tos 0xc0]
Après avoir reçu ce message, la machine 10.255.0.108 pense que pour atteindre 10.255.0.5, il lui faut passer par le routeur 10.255.0.192... qui est en fait evil_box ! La prochaine émission de 10.255.0.108 à destination de 10.255.0.5 sera donc envoyée à evil_box qui sera chargé de faire le routage au lieu du routeur normal. Sous linux il est facile de configurer le forwarding des paquets pour assurer ce routage, de cette maniere evil_box renvoit les paquets vers le vrai routeur qui se charge de les acheminer normalement. L'opération est donc (presque) invisible, tout semble fonctionner normalement, mais la conséquence est que tout le trafic entre les deux ordinateurs (10.255.0.108 et 10.255.0.5) passe par evil_box... Le pirate peut donc tout enregistrer dans un fichier et surtout modifier les paquets avant de les renvoyer vers le routeur normal, pour (liste non exhaustive!) :
- insérer des commandes dans des sessions telnet (c'est plus dur pour ssh vu qu'on n'a pas la clé de session... mais il doit bien y avoir une feinte là encore ! :) et donc de ce fait prendre le contrôle d'une des deux machines.
- dans une session ftp, faire télécharger un cheval de Troie ou une bombe au lieu d'un utilitaire sain.
- ...
C'est ce qu'on appelle du
"Man in The Middle" (l'homme au milieu) car la communication entre les deux ordinateurs passe par evil_box qui peut modi-fier, ajouter ou supprimer des données. Cette attaque fonctionne à travers les routeurs ! Néanmoins il faut avoir un sniffer sur le réseau local d'une des deux machines pour pouvoir intercepter un paquet, car le message ICMP redirect doit reprendre le header IP + 64 bits de données d'un paquet pour être valable (en théorie du moins).Les outils les plus utilisés sont IRPAS icmp_redirect et icmp_redir de Yuri Volobuev.
-- Est-il possible de se protéger contre ces attaques ?
Sous linux, 'echo "0" > /proc/sys/net/ipv4/conf/nom_interface/accept_redirects'
devrait faire l'affaire (à vérifier). Pour ceux qui sont (encore !) sous win,
je pense qu'il ne vous reste plus qu'à demander à Mr Facture Porte =)
D'autre part, au point de vue réseau, cette action rajoute une étape avant d'accéder à la machine demandée (un passage par un routeur, appelé "hop"). L'usage de ICMP redirect peut donc être repéré par la commande trace-route, à moins que l'attaquant soit assez fort pour ne pas décrémenter le TTL (durée de vie) des paquets lors de son routage.
Voilà, la présentation de cette attaque observée sur le réseau "capture the flag" du Defcon. Ce fut court mais fort bon :)
NaGaz et FozZy