ARP spoofing avec Python via Scapy
mardi 6 mai 2014 à 09:09I. Présentation
Dans ce cours tutoriel, nous allons voir comment effectuer un ARP spoofing rapidement en Python via la librairie orientée réseau Scapy. J’ai déjà écris un tutoriel sur le principe de l’ARP spoofing, son fonctionnement et son utilisation sur ce site, j’avais d’ailleurs utilisé le logiciel “arpspoof” pour procéder à des démonstrations.
Notre but va ici être de nous approcher un peu plus du Python et de voir que le fonctionnement d’arpspoof est des plus basique. Les pré-requis pour comprendre ce tutoriel sont une base sur les réseau et l’ARP spoofing que vous obtiendrez dans mon précédent tutoriel ainsi que quelques bases de Python.
II. A l’attaque !
Pour faire simple, nous suivrons le schéma suivant :
Nous allons donc nous (Pirate) faire passer pour la passerelle auprès du client. Il faut bien sûr que Python et Scapy soient installés sur votre poste “pirate”. On lancera ensuite Scapy dans un terminal :
scapy
Étant donné que les paquets que nous allons envoyer vont usurper l’identité (l’IP) d’une autre machine, la première chose à faire est de désactiver la vérification des adresses par Scapy sinon il refusera de lancer les paquets car ils ne semblerons pas valides.
conf.checkIPaddr = False
Nous allons ensuite vouloir former une trame ARP (ou un “paquet ARP” puisque ARP est dit comme un protocole de couche “2 et demi”..). On va alors dans un premier temps voir les informations qui peuvent être saisies :
ls(ARP)
On voit (entre autre) que nous pouvons renseigner l’IP source du paquet , l’IP de destination ainsi que l’opcode. Ça tombe bien, nous n’avons besoin que de cela pour effectuer notre ARP spoofing ! On voit que l’opcode est par défaut à “1″ ce qui, pour l’ARP, signifie que c’est une requête (“request”). Le principe de l’ARP spoofing étant d’émettre une réponse contenant une information erronée que le client va enregistrer dans son cache, il faudra positionner l’opcode à “2″ pour signifier qu’il s’agit d’une réponse (“reply”). Nous allons maintenant forger notre paquet :
>>> mon_ARP= (ARP ( psrc = '192.168.1.254', pdst = '192.168.1.10',op=2))
On va donc envoyer des paquets ARP de type “reply” (op=2) semblant provenir de la passerelle (psrc = ’192.168.1.254′) à notre client (pdst =’192.168.1.10′). Si l’on vérifie les informations du paquet construit avec la commande suivante :
On verra que Scapy a directement enregistré dans le champ “hwsrc”, la MAC (hardware) source de notre Pirate. On voit donc que le pirate va envoyer des paquets ayant son adresse MAC mais l’adresse IP de la passerelle, c’est cela qui va fausser la cache ARP de notre cible. On peut donc lancer notre paquet ! Ou plutôt nos paquets car nous sommes obligés de les envoyer en continue si nous voulons que l’attaque soit efficace, sinon, dès que la passerelle et le client échangerons réellement ensemble, le cache ARP du client redeviendra correcte. On utilisera pour cela la fonction “send()” avec son option “loop” permettant d’envoyer plusieurs fois un même paquet :
>>>send(monARP, loop=1)
On verra alors une série de points sur notre termina, un “.” est un paquet envoyé quand nous travaillons avec Scapy. On peut effectuer une analyse de trame en sortie du Pirate (ou en entrée de Client si on le souhaite) pour voir nos paquets :
Ainsi que vérifier le cache ARP de notre client pour voir que l’association IP passerelle <–>MAC pirate est bien présente pour fausser la table ARP :
L’outil arpspoof n’est pas plus compliqué, il prend juste en compte quelques options supplémentaires ainsi que la possibilité de prendre des arguments pour simplifier son utilisation. On peut d’ailleurs envisager un script python nous permettant de faire de même.