.-----------[MinDKinD100\#100.04]------- ----------. [M]ind[K]ind #100 | ; | - 05/12/2003 | . "applied arp poisonning" | - rst_ack | aka '------------- ----. | "le `packet` a l'arsenic" | | _____ ; | '--------------------- ----- -[again, again n again.]---- ------------' Fonctionnement du protocole ARP Après avoir lu cet article, vous serez en mesure de comprendre et de rechercher des moyens pour prévenir une attaque de type «man-in-the-middle» sur un réseau local utilisant le protocole ARP (il y a plusieurs RFC qui expliquent son fonctionnement www.rfc-editor.org). D'autres types d'attaques peuvent être effectuées...du genre DoS mais je n'en traiterai pas dans cet article. Enfin, je suppose que vous avez un peu de bagage en terme de network (routage IP en particulier) et que vous connaissez bien tcpdump (sous Linux). ARP: c'est quoi? ARP est un protocole de communication de bas niveau du modèle OSI. Il effectue la traduction d'une adresse IP 32 bits en une adresse MAC 48 bits. Mais pourquoi faut-il faire cette traduction? Pourquoi on n'a pas seulement besoin du IP pour communiquer? Eh bien rappelez-vous que le IP sert pour le routage sur Internet ou sur un WAN, i.e. d'acheminer un packet d'un réseau local X à un réseau local Y. Un exemple est lorsque vous faites un traceroute sur un host. Le packet passe par différents routers(hops) avant d'arriver à destination. Mais dans notre exemple, lorque le packet part du résesau local X et arrive au routeur de réseau local Y, ce dernier, pour l'acheminer à la bonne machine, doit connaître son adresse MAC. Une fois connue, le packet peut être acheminé à destination. Pour les fins de l'attaque, on ne s'occupera que de ce qui se passe sur le réseau local. Au diable le routage, on n'en a pas vraiment besoin pour comprendre... Supposons un petit réseau local Ethernet composé de 2 ordinateurs (A et B) et un router (un minuscule réseau). Ces ordinateurs peuvent communiquer entre eux via un hub et peuvent accéder à Internet via un router. Linux Box Windows Box +---------+ +----------+ | A |IP: 192.168.1.101 | B | IP: 192.168.1.108 | |MAC: xx-xx-xx-xx-e0 | | MAC: xx-xx-xx-xx-c8 +---------+ +----------+ |_________________________________________| | | +----------+ | router |IP: 192.168.1.1 | |MAC: xx-xx-xx-xx-xx-9d +----------+ | | +*********************+ +*** ***+ +*** ***+ + internet + +***+ +***+ *** *** +*********************+ On se rappellera que les adresses IP peuvent être obtenues, sous la plateforme Windows, en exécutant la commande c:\ipconfig /all dans la fenêtre d’Invite MS-DOS ou, sous la plateforme Linux, par la commande $ifconfig. Chacune de ces commandes nous donnera l’adresse IP de la machine ainsi que sa MAC adresse. La MAC adresse (pour Media Access Control), est l’adresse physique de la carte réseau d’un ordinateur. Il s’agit d’un numéro unique de 48 bits au total, exprimé en 12 digits hexadécimaux. Les 6 premiers digits hexadécimaux sont administrés par l’IEEE et identifie le manufacturier de la carte. On appelle ces digits l’OUI (Organisationally Unique Identifier). Une recherche dans les bases de données de l’IEEE peut nous donner le nom du manufacturier d’une carte réseau. Les 6 derniers digits représentent le numéro de série géré spécifiquement par le manufacturier. L’adresse MAC est inscrite en mode lecture seule dans une puce mémoire de la carte et est amené en mémoire RAM de l’ordinateur au moment de l’initialisation de la carte réseau. Cette adresse est unique à travers le monde et doit l’être. La MAC adresse est permanente tandis que l’adresse IP ne l’est pas. Bon, assez de théorie comme ça. Il a été dit que l’adresse MAC était amenée en mémoire RAM. En fait, elle va se loger dans ce que l’on appelle le « ARP cache» (espace mémoire spécifique) de l’ordinateur. Il est possible d’afficher le contenu du ARP cache d’un ordinateur en exécutant la commande suivante: C:\arp -a sous Windows ou $arp sous Linux. Par exemple, voici le contenu du ARP cache de B: C:\Documents and Settings>arp -a Interface: 192.168.1.108 --- 0x10003 Adresse Internet Adresse physique Type 192.168.1.1 xx-xx-xx-xx-xx-9d dynamique et le contenu du ARP cache de A: [test@localhost]$ arp Address HWtype HWaddress Flags Mask Iface 192.168.1.1 ether xx:xx:xx:xx:xx:9d C eth0 Le ARP cache est donc un « mapping» entre une adresse IP et son adresse MAC. Maintenant, avant d’aller plus loin, il est important de comprendre comment les informations sont transmises d’un ordinateur à un autre sur un réseau. Supposons que A veuille envoyer un message à B. Pour se faire, A doit connaître l’adresse physique (adresse MAC) de l’ordinateur de B. Supposons qu'il n'y a pas de service DNS et que les adresses IP de B et du router sont connues par A. La première chose que fera A, c’est d’aller voir dans son ARP cache pour voir si une adresse MAC est associée au IP de B. Si le ARP cache ne contient aucune correspondance entre l’adresse IP de B et son adresse MAC, A émettra ce qu’on appelle un « ARP request» sur le réseau local. Cette requête sera captée par tous les ordinateurs (broadcast) sur le réseau mais seul B répondra au message car il s’adresse à lui en particulier. B émettra un « ARP reply» à A, disant que c’est lui qui a l’IP 192.168.1.108 et que son adresse MAC est xx:xx:xx:xx:xx:c8. Voici un extrait de ce type de requête ARP, obtenue avec tcpdump sous Linux: 09:22:10.400942 arp who-has 192.168.1.108 tell 192.168.1.101 09:22:10.401091 arp reply 192.168.1.108 is-at xx:xx:xx:xx:xx:c8 La première ligne constitue la requête ARP produite par A. La seconde est la réponse de B. La cache de l’ordinateur de A est par la suite mise à jour avec ces nouvelles informations: [root@localhost]$ arp Address HWtype HWaddress Flags Mask Iface 192.168.1.1 ether xx:xx:xx:xx:xx:9d C eth0 192.168.1.108 ether xx:xx:xx:xx:xx:c8 C eth0 Dorénavant, lorsque A voudra envoyer des packets à B, il consultera son ARP cache, constatera que le IP 192.168.1.108 correspond à la MAC xx:xx:xx:xx:xx:c8 et pourra envoyer directement l’information à B. Le même processus s’applique pour les échanges d’informations entre le réseau local et Internet, c’est-à -dire au-delà des frontières du router. Par exemple, supposons que A veuille visionner la page web de mindkind.org. Supposons qu'il n'y a pas de services DNS et que A connaît l’adresse IP du site mindkind.org. Dans un premier temps, A examinera sa table de routage et constatera qu’il 'y a pas d'entrée pour le IP de mindkind.org et qu'il ne se situe pas sur le réseau local. A doit donc envoyer son packet au router, qui lui s’occupera de l’acheminer à mindkind.org. Dans ce cas ci, A a donc besoin de connaître l’adresse physique du router car il doit lui envoyer le paquet. Supposons que le ARP cache de A ne contient pas d'entrée pour l'adresse IP du router. A émettera donc la requête ARP suivante: 09:25:10.400942 arp who-has 192.168.1.1 tell 192.168.1.101 09:25:10.401091 arp reply 192.168.1.1 is-at xx:xx:xx:xx:xx:9d Le router, ayant l’adresse IP 192.168.1.1, informe A que son adresse MAC est xx:xx:xx:xx:xx:9d. Maintenant, A est en mesure d’envoyer physiquement son packet au router. Ce dernier suivra la même procédure pour acheminer le packet soit directement à mindkind.org, soit à un autre router. Ouf, c’est un peu simplifié mais ça ressemble pas mal à ça. J'avais dis que je parlerais pas de routage mais bon... Le malicieux hacker Maintenant que nous connaissons un peu mieux le fonctionnement du protocole, nous allons voir quels types d’attaques pourraient être dirigées par un hacker sur le réseau. Rappelons que les principaux messages du protocole ARP sont les suivants: ARP request (Qui a ce IP) ARP reply (J’ai ce IP, mon adresse MAC est…) Reverse ARP (RARP) request (Qui a cette adresse MAC?) RARP reply (J’ai cette adresse MAC, mon IP est...) Le côté obscure du protocole ARP est sa totale aversion pour la sécurité. En effet, le protocole ARP est peu sécuritaire i.e. qu’il prend tout pour du cash. Mais il est tout de même nécessaire!!! En fait, n’importe qui sur le réseau peut envoyer un "ARP reply" à une machine, sans avoir reçu de "ARP request" au préalable de celle-ci. Ce ARP reply sera accepté, sans qu’aucune question ne soit posée. Un usager malicieux pourrait ainsi profiter de cette défaillance et modifier à sa guise le ARP cache d’un ordinateur. C'est ce que l'on appelle du ARP poisoning. Mais à quoi ça sert de faire ça me direz-vous? Eh bien, c’est une façon de se faire passer pour quelqu’un d’autre (spoofing). Et à quoi ça sert de se faire passer pour un autre ordinateur? Eh bien, il serait possible d’intercepter tout le trafic de packet entre deux ou plusieurs ordinateurs, entre un ordinateur ou Internet, etc. Mouin, pis! Eh bien poser la question c’est y répondre ! ;)P Ce que je vais présenter ici c’est l’attaque du « man-in-the-middle», qui consiste à tromper deux individus. Dans mon cas, il s’agit de B et du router. Disons que je suis A et je veux intercepter toutes les communications entre B et le router. Comment je vais m’y prendre? Eh bien je pourrais, dans un premier temps, me faire passer pour B aux yeux du router et, par la suite, me faire passer pour le router aux yeux de B. Simple non? Mais comment mettre tout ça en pratique? Eh bien, comme je l’ai dit tout à l’heure, un ordinateur accepte tout bêtement un ARP reply, sans se poser de question, et met automatiquement à jour son ARP cache en fonction du contenu de la requête. Or, je n’ai qu’à envoyer un ARP reply au router disant que je suis B et un ARP reply à B disant que je suis le router. Et ça va marcher ? Oui monsieur ou madame bien entendu;)! Mais il va falloir essayer de synchroniser nos ARP reply le plus possible car le "pot-aux-roses" pourrait être découvert!!! Ok, jusque là, ça va. Mais comment peut-on envoyer ces ARP reply? Eh bien soit vous concevez vous-même un programme utilisant les « raw sockets» ou l’interface proposée par la librairie « libnet» (en C bien entendu) ou bien vous optez pour un logiciel du « marché», genre « arpoison» disponible en code source sur le site www.packetstormsecurity.nl. Pour ma part, j’ai installé la librairie « libnet» et j’ai compilé « arpoison» avec gcc. C’est avec cet exécutable que j’ai conduit mon attaque du « man-in-the-middle» (sur mon lab personnel bien entendu;)). Bon, le logiciel est installé et prêt à être utilisé. Qu’est ce que j’ai besoin comme information? J’ai besoin de mon adresse IP (192.168.1.101), de mon adresse MAC (xx:xx:xx:xx:xx:e0), de l’adresse IP du router (192.168.1.1), de l’adresse MAC du routeur (xx:xx:xx:xx:xx:9d), de l’adresse IP de la victime (192.168.1.108) et de l’adresse MAC de la victime (xx:xx:xx:xx:xx:c8). Mais comment obtenir toutes ces informations me direz-vous? Simple. Un bon scanner fera l’affaire. Et si vous êtes patient, un ping sur une adresse IP victime fera en sorte de mettre à jour votre propre ARP cache avec son adresse MAC ! Les commandes Je veux d'abord dire au router que je suis B. Voici la ligne de commande pour arpoison: arpoison -i eth0 -d192.168.1.1 -s192.168.1.108 -txx:xx:xx:xx:xx:9d -rxx:xx:xx:xx:xx:e0 -n1 Analyse: -i eth0 J’envoie le ARP reply via mon interface eth0 (Linux) -d192.168.1.1 Le ARP reply est destiné au routeur -s192.168.1.108 C’est l’adresse IP de B -t C’est l’adresse MAC du routeur -r C’est mon adresse MAC Pourquoi tous ces IP et ces MAC? Parce qu'un ARP reply doit contenir toutes ces informations. Je vous fait grâce de la structure formelle du ARP reply car mes talents en dessins ASCII son plutôt médiocres. Allez voir sur le net à la place!! En fait, j’informe le router que l’adresse IP de B correspond à mon adresse MAC. Donc tout ce qui va aller à B passera par A i.e. moi. Voici l’extrait de tcpdump suite à la commande arpoison: 11:04:07.069402 arp reply 192.168.1.108 is-at xx:xx:xx:xx:xx:e0 Je veux maintenant dire à B que je suis le router. Voici la ligne de commande à entrer dans arpoison: arpoison -i eth0 -d192.168.1.108 -s192.168.1.1 -txx:xx:xx:xx:xx:c8 -rxx:xx:xx:xx:xx:e0 -n1 Analyse: -i eth0 J’envoie le ARP reply via son interface eth0 -d192.168.1.108 Le ARP reply est destiné à B -s192.168.1.1 C’est l’adresse IP du routeur -t Adresse MAC de B -r C’est mon adresse MAC En fait, j’informe B que le IP du router correspond à mon adresse MAC. Donc tout ce que B va transmettre sur Internet va transiter par mon ordinateur. Voici l’extrait de tcpdump suite à la commande arpoison: 11:04:07.069402 arp reply 192.168.1.1 is-at xx:xx:xx:xx:xx:e0 Le ARP cache de B devient donc le suivant: Interface: 192.168.1.108 --- 0x10003 Adresse Internet Adresse physique Type 192.168.1.1 xx-xx-xx-xx-xx-e0 dynamique Le arp cache du router devient le suivant : (…) 192.168.1.101 xx-xx-xx-xx-xx-e0 192.168.1.108 xx-xx-xx-xx-xx-e0 C’est bien beau tout cela, le trafic est redirigé comme on voulait. Toute communication entre B et le router passe par A. Mais si on laisse ça comme ça, l’effet sera que B n’aura plus accès à Internet donc il sera victime d’une attaque DoS. Il ne faut donc pas oublier d'activer le routage sur A, et de cette façon, B pourra toujours aller sur Internet et ne verra pas les changements que j’ai apporté à son ARP cache. Comment faire? Eh bien, je l’ai fait sous Linux seulement. Pour se faire, il faut modifier la valeur du fichier « ip_forward» que l’on trouve dans le répertoire suivant: /proc/sys/net/ipv4/ La valeur 1 doit être insérée dans le fichier ip_forward. On peut le faire comme suit: $echo 1 > ip_forward Une fois activé, mon ordinateur devient donc lui-même un router et intercepte toutes communications entre l’ordinateur B (victime) et Internet. Et voilà !!! .----- - -----------------------. | /MinDKinD100 .---'----------- ---------- ------- ------. '-------- - -------------- -| scryptoman@hotmail.com | '-------- - ----------- ------------ -----'