Scapy est un package de Python bien connu dans le monde du hacking. Il permet d'interagir à bas niveau avec une interface réseau, c'est-à-dire de déterminer les octets qu'elle émet et de récupérer ceux qu'elle reçoit.
Scapy peut donc notamment être utilisé pour forger des trames et/ou paquets sur un réseau. Cela peut permettre de se livrer à des activités que la morale réprouve, comme l'ARP cache poisoning et autres joyeusetés. A l'inverse, comme nous le recommanderons, cela peut permettre de s'adonner à des activités tout à fait respectables, comme le diagnostic.
Dans tous les cas, se mettre à Scapy permet de se former au fonctionnement de réseaux en commençant par là où il faut commencer chaque fois qu'on prétend réellement apprendre quelque chose dans quel que domaine, c'est-à-dire à la base. C'est cette finalité pédagogique que poursuit cet article, à l'attention de tous ceux qui n'ont jamais mis le nez dans le réseau. Il présente comment réaliser une version simplifiée d'un outil qui figure inévitablement dans la boite à outils de tout hacker, à savoir traceroute.
Se mettre à l'écoute avec WireShark
Avant de rentrer dans le code, il est nécessaire d'installer quelques outils pour constituer un environnement de travail. Au-delà d'un EDI tel que l'excellent PyCharm, il s'agit de se doter de Scapy, de WireShark et de Npcap si vous travaillez sur Windows – ce qui sera le cas ici.
Pour ce qui concerne Scapy, la chose est rendue d'une simplicité déconcertante par l'excellent pip. Depuis une ligne de commandes, exécutez la commande suivante, et c'est réglé :
pip install scapy
Les deux autres outils vont vous permette de visualiser parallèlement ce qui sort et rentre sur l'interface que vous aurez choisie pour envoyer des données sur le réseau avec Scapy.
WireShark est sniffer que sa qualité a rendu incontournable. Lors de son exécution, l'installateur vérifie la présence d'un pilote d'interface permettant l'accès aux données circulant via cette dernière. Sur Windows, un tel pilote n'est pas disponible par défaut. Pour cette raison, s'il n'en détecte pas une version déjà installée, WireShark propose d'installer Npcap, un pilote qui permet la chose.
Après avoir installé WireShark, il convient de vérifier que tout fonctionne bien en tentant de sniffer les messages ICMP échangés lors d'un ping.
Démarrez WireShark. Ce dernier affiche une liste des interfaces. Si vous cliquez une fois sur l'une d'entre elles, vous pouvez alors saisir un filtre dans le champ figurant au-dessus de la liste. En l'espèce, sélectionnez votre interface réseau par défaut, et saisissez icmp, filtre prédéfini pour les messages ICMP uniquement. Double-cliquez ensuite sur cette connexion pour accéder à la capture :
Notez qu'il est possible de capturer sur plusieurs interfaces simultanément en les sélectionnant de manière multiple (Maj + clique). Pour accéder au sniffing sans réinitialiser la sélection, cliquez alors sur l'icône Start capturing packets.
Ouvrez une ligne de commandes (cmd.exe), et exécutez un ping quelconque, comme par exemple :
ping -n 1 www.stashofcode.fr
Dans WireShark, vous devez voir s'afficher la liste des messages ICMP échangés :
C'est tout de suite l'occasion de formuler une mise en garde. Parce qu'elle affiche le détail des paquets, une fenêtre de WireShark contient énormément d'informations que vous pourriez juger sensibles – en premier lieu, l'adresse MAC de votre interface par défaut et votre adresse IP. En conséquence, ne faites pas circuler de capture de cette fenêtre sans avoir pris le temps de caviarder les informations en question.
En fait, évitez de faire circuler des telles captures tout court, car caviarder prend un certain temps – voyez la capture réalisée pour illustrer ce bête de ping –, et dans la précipitation, vous risquez d'oublier de masquer une de ces informations, tout particulièrement dans le dump où il n'est pas intuitif de les repérer – même si WireShark vous aide en affichant à quoi correspond un octet quand vous le pointez avec la souris.
Premiers pas avec Scapy
La documentation de Scapy présente l'intérêt d'être assez didactique. Toutefois, son propos n'est que d'introduire au sujet. Par ailleurs, il ne semble pas exister de guide de référence dressant la liste exhaustive de tout ce qui peut être nécessaire pour coder, notamment les classes et les fonctions.
Pour pallier le problème, la documentation explique qu'il est possible de générer des diagrammes UML. Cela prend du temps et ne présente aucun intérêt, comme UML assez généralement – on est entre codeurs, pas entre pisseurs de « docs ». Deux lignes de code constituent une solution plus efficace.
Après importation des packages requis... :
import inspect from scapy.all import *
...cette ligne permet de générer la liste des classes... :
print ('\n'.join(sorted ([m[1].__module__ + '.' + m[0] for m in inspect.getmembers(scapy.all, inspect.isclass)])))