lalahop

Protéger le cache ARP de vos machines

Table des matières

Pour comprendre cet article, il est nécessaire de connaitre les bases du protocole réseau ARP.

Quel est l'intérêt de protéger la table ARP ?

La modification, par un acteur malveillant, de la table ARP peut conduire à des attaques réseau très efficaces telle que l'attaque de l'homme du milieu (in english : man of the middle attack 😀 ) qui permet de voir les flux échangés. Vu le nombre de flux qui circulent en clair sur un réseau informatique, on comprend mieux le problème. Si vous voulez tester, chez vous évidemment, la mise en place et les effets d'une attaque de l'homme du milieu, je vous recommande le logiciel ettercap.

Cette attaque est efficace car elle est difficile à contrecarrer. En effet, ils faut faire en sorte que chaque équipement relié au réseau connaisse, de manière statique l'adresse MAC de tous les autres équipements du réseau. Pour un petit réseau, c'est encore gérable. Mais pour un grand réseau, cela devient vite la galère a gérer (nombre d'associations, hétérogénéité des systèmes d'exploitations, etc.). C'est encore plus ingérable avec des périphériques mobiles car la même IP sur deux réseaux distincts n'aura pas la même MAC. Exemple pour comprendre : sur le réseau A, l'IP 192.168.1.1 est associée à la MAC aa:bb:cc:dd:ee:ff. Sur le réseau B, la même IP est aussi utilisée et a pour adresse MAC gg:hh:ii:jj:kk:ll. Il faudra changer l'association IP <=>MAC selon le réseau sur lequel vous êtes. Cela peut se révéler pénible selon la fréquence à laquelle vous changez de réseau.

Il existe des solutions que nous n'aborderons pas telle que le logiciel arpwatch, qui permet d'être prévenu dans le cas où une nouvelle machine se connecterait au réseau ou changerait d'adresse. Dans la même veine, les système de détection d'intrusion (qui a parlé d'élever un cochon ? 😉 ) permettent de s'apercevoir qu'une attaque de type corruption du cache ARP est en cours d'exécution.

L'intérêt de protéger le cache ARP est faible pour le réseau local d'un particulier. En effet, à moins que le wifi soit activé et insuffisamment protégé, le seul moyen de vous nuire est de rentrer chez vous et de placer un équipement minimaliste sur votre réseau. Mais si un acteur malveillant parvenait à s'introduire chez vous, il aurait surement plus intéressant à faire car le monde des attaques physiques s'ouvrirait alors à lui.

Nous allons quand même voir comment protéger le cache ARP dans un but de connaissance.

Quelle est la problématique ?

Il faut, pour chaque système d'exploitation, pour chaque interface réseau, pour chaque machine reliée au réseau, enregistrer, de manière statique, toutes les correspondances entre toutes les adresses IP et les adresses MAC qui circulent sur le réseau. Deux problèmes se posent alors :

  • le cache ARP est vidé à chaque arrêt d'une machine. Il nous faut donc trouver un procédé pour le remplir à chaque démarrage
  • les systèmes d'exploitation, que ce soit Windows ou GNU/Linux, refusent que l'on modifie l'adresse de la passerelle (sur le réseau local d'un particulier, il s'agit en général du routeur) en cours de route. C'est justement là que se trouve le plus gros vecteur d'attaque : pour avoir une vue intégrale des flux échangés entre une machine et les autres machines (y compris celles sur internet), l'attaquant se placera entre la machine et sa passerelle. Il va donc falloir ruser.

Comment faire sous Windows

D'abord, renommez votre interface (dans le panneau de configuration) afin d'enlever le "é" dans "Connexion au réseau local". Le nouveau nom n'a pas d'importance : il doit juste ne pas contenir d'accent. Nous aurons besoin de deux scripts batch.

Il n'y a pas de retour à la ligne. Le premier script configurera la connexion sur une plage d'adresse que nous n'avons pas. Ce qui donne :

netsh interface ip set address "Connexion au reseau local" static 10.0.0.20 255.0.0.0 10.0.0.50 1

Ici on configure la connexion pour être sur le réseau 10.0.0.0/8 avec la passerelle 10.0.0.50. Bien sûr, si vous utilisez cette plage au quotidien, prenez-en une autre car il ne faut pas que la plage que vous utilisez au quotidien soit la même que celle que vous déclarez dans ce script.

Le deuxième script devra vider puis remplir la table ARP et basculer la configuration de l'interface réseau sur la bonne plage d'adresse. Ce qui nous donne :

timeout 15
arp -d *
arp -s 192.168.1.1 95-49-e5-79-4e-09
netsh interface ip set address "Connexion au reseau local" dhcp

N'oubliez pas d'adapter la dernière ligne si vous n'utilisez pas DHCP. Le timeout 15 n'est pas nécessaire : un timeout 5 peut suffire. Mais je joue la prudence dans cet exemple. D'autant plus que cela ne nous gêne pas : le temps d'ouvrir votre session, le réseau sera quand même configuré.

Maintenant, il s'agit de lancer le premier script à l'arrêt de Windows et le deuxième au démarrage de Windows. Attention, je dis bien au démarrage de Windows, pas à l'ouverture d'une session. Tout cela se fait dans gpedit.msc. Ouvrez-le. Sous "configuration de l'ordinateur", allez dans "Paramètres Windows" puis dans "Scripts (démarrage/arrêt)". Il ne vous reste plus qu'à ajouter les scripts dans la bonne catégorie.

Comment faire sous GNU/Linux

J'utiliserai Ubuntu. Tout ce qui suit devra être réaliser avec le compte root. Il faut créer un script dans le dossier /etc/init.d dont voici le contenu :

#!/bin/sh
arp -s 192.168.1.1 95:49:e5:79:4e:09

Le squelette de ce script est inspiré de celui de ce site.

Notes :

  • Vous pouvez utiliser la commande ip à la place de la commande arp. Sa syntaxe : ip neigh add IP lladdr MAC nud permanent dev INTERFACE.
  • Vous pouvez aussi utiliser un fichier pour remplir le cache ARP. Cela allégera votre script. Généralement, on utilise le fichier /etc/ethers. Il faut remplir le fichier avec une association par ligne, en respectant cette mise en forme :
    95:49:e5:79:4e:09 192.168.1.1

    Ensuite, il faut remplir le cache ARP en se servant de ce fichier avec la commande :

    arp -f /etc/ethers

    C'est donc cette commande que vous mettrez dans le script que vous avez créé dans /etc/init.d si vous choisissez cette méthode.

Ensuite vous devez rendre le script créé exécutable avec un bon vieux :

chmod +x /chemin/vers/le/script

Il ne reste qu'à demander à exécuter le script au boot avec la commande :

update-rc.d SCRIPT defaults 20

SCRIPT est le nom que vous avez donné au script. 20 désigne l'ordre de démarrage.

Cas d'OpenWRT

Sous OpenWRT, la commande arp ne sert qu'à visionner la table ARP. Vous devez donc utiliser la commande ip.

La première étape consiste à installer cette commande :

opkg install ip

La deuxième étape consiste à créer un script dans /etc/init.d dont voici le contenu :

#!/bin/sh /etc/rc.common
START=40
boot() 
{
	ip neigh add 192.168.1.1 dev br-lan lladdr 95:49:e5:79:4e:09 nud permanent

}
 
start() 
{
	ip neigh add 192.168.1.1 dev br-lan lladdr 95:49:e5:79:4e:09 nud permanent
}

Il n'y a toujours pas de retour à la ligne. Ce code est inspiré du code des autres scripts de démarrage fournis par défaut avec OpenWRT.

La troisième étape, tout comme sous Ubuntu est de rendre le script exécutable :

chmod +x /chemin/vers/le/script

La dernière étape est de faire un lien symbolique de /etc/init.d/Script vers /etc/rc.d/SxxScript (où Script est le nom du script et xx l'ordre de démarrage du script dans le boot) :

ln -s /etc/init.d/eviterARPCachePoisoning /etc/rc.d/S40eviterARPCachePoisoning

Toujours pas de retour à la ligne 😉

Il ne vous reste plus qu'à redémarrer toutes vos machines et à contrôler le résultat avec la commande suivante :

arp -a

Toutes les adresses que vous avez configuré doivent apparaitre, complétées par le terme "PERMANENT" sous les systèmes *nix.

Si tout est en place, vous pouvez retenter une attaque de l'homme du milieu. Vous ne parviendrez pas à capturer le moindre flux, cette fois-ci.

Pour illustrer le fait que toutes les machines du réseau doivent connaitre, de manière statique, toutes les autres associations IP/MAC du réseau, faites l'expérience suivante : sur une machine, ne fixez pas l'association IP/MAC de la passerelle. Sur la passerelle, fixez l'association IP/MAC de la machine. Tentez maintenant une attaque de l'homme du milieu et surprise : vous aurez la moitié des flux : la machine vous enverra bien les paquets mais la passerelle ne se laissera pas berner puisqu'elle connais la véritable MAC de votre machine et répondra à cette adresse MAC. Même si les réponses de la passerelle lui parviennent, la machine ne sait pas les interpréter car ce n'est pas la passerelle qu'elle a interrogé mais ce qu'elle croit être la passerelle mais qui est en fait la machine de l'attaquant. Dans ce cas de figure, l'attaque n'est pas invisible pour la victime car le traffic réseau est paralysé.

Enjoy 😀

Les commentaires sont fermés