Scapy est un outil de manipulation de paquets de réseaux informatiques écrit en Python. Il permet notamment de forger ou décoder des paquets, ou de prendre en charge des tâches comme le scanning, le tracerouting et les tests unitaires. Découvrez tout ce que vous devez savoir : avantages, fonctionnement, formations...
Dans le domaine de la sécurité informatique, le scan de réseau et les simulations d’attaque sont des activités essentielles. Il existe de nombreux outils tels que Wireshark ou Nmap, mais chacun d’entre eux est conçu pour un cas d’usage spécifique comme le sniffing de paquet ou le scanning.
Il est donc nécessaire d’utiliser un outil différent pour chaque tâche, et ceci peut vite devenir très contraignant. Afin de remédier à ce problème, Philippe Biondi a créé Scapy : un outil de manipulation de paquets de réseau basé sur Python et permettant de créer de nouvelles fonctionnalités en fonction des besoins.
Qu'est-ce que Scapy ?
Créé en 2003, Scapy est un programme Python permettant d’envoyer, « sniffer », disséquer et forger des paquets de réseau. Ceci permet de construire des outils pour sonder, scanner ou attaquer un réseau.
Il s’agit donc d’un puissant programme interactif de manipulation de paquet. On l’utilise notamment pour forger ou décoder des paquets d’une large variété de protocoles, les envoyer, les capturer, associer des requêtes et réponses et bien plus encore.
Les tâches les plus classiques comme le scanning, le tracerouting, le probing, le test unitaire, l’attaque ou la découverte de réseau peuvent être accomplies avec aisance. Cet outil peut remplacer hping, arpspoof, arp-sk, arping, pof, et certaines parties de Nmap, tcpdump et tshark.
En outre, Scapy peut être utilisé pour des tâches spécifiques que la plupart des outils ne prennent pas en charge. Ceci inclut l’envoi de trames invalides, l’injection des frames 802.11, la combinaison de techniques comme le hopping VLAN et l’empoisonnement de cache ARP.
Pour faire simple, les deux fonctionnalités principales de Scapy sont l’envoi de paquets et la réception de réponses. Après avoir défini jeu de paquets, l’outil les envoie, reçoit les réponses, associe les requêtes aux réponses et retourne une liste de couples de paquets requête/ réponse et une liste de paquets non associés.
L’avantage par rapport à Nmap ou hping est qu’une réponse n’est pas réduite à « ouvert », « fermé » ou « filtré ». Il s’agit du paquet complet.
Des fonctions de plus haut niveau peuvent être ajoutées, par exemple pour le tracerouting et l’obtention du TTL de départ de la requête et l’IP source de la réponse en guise de résultat. Un autre exemple est une fonction qui ping l’intégralité d’un réseau et donne une liste de machines en réponse, ou encore une fonction effectuant un portscan pour retourner un rapport LaTeX.
Il est possible d’utiliser Scapy interactivement via son interface de ligne de commande (CLI) ou en tant que bibliothèque en l’important dans les programmes Python. On peut l’exécuter sur Linux, macOS ou Windows.
Même s’il s’agit d’un outil sans interface graphique, il est possible de l’intégrer avec d’autres programmes de visualisation comme Wireshark, GnuPlot, graphviz ou VPython.
Quels sont les principaux défauts des outils de networking ?
Pour comprendre les avantages de ScaPy, le plus simple est d’énumérer les principaux problèmes de la plupart des outils de networking. Ces différents programmes ne permettent pas de construire quelque chose que l’auteur n’a pas imaginé. Ils sont conçus pour un but spécifique, et ne peuvent s’en détacher.
Par exemple, un outil d’empoisonnement de cache ARP ne permet pas d’utiliser de double encapsulation 802.1q. Il est donc habituellement nécessaire de créer un nouveau programme pour chaque nouveau besoin.
Par ailleurs, de nombreux outils se cantonnent à un paradigme de programme à exécuter depuis un shell d’interface système. Ceci résulte sur une syntaxe complexe pour décrire un paquet. La solution adoptée utilise une description plus haute et moins puissante, sous la forme de scénarios imaginés par le créateur de l’outil.
En outre, ces outils confondent souvent le décodage et l’interprétation. Si les machines excellent pour décoder, elles ne sont pas en mesure d’interpréter. Cette tâche est réservée aux êtres humains.
Certains programmes tentent d’imiter ce comportement, par exemple en indiquant « ce port est ouvert » au lieu de « j’ai reçu un SYN-ACK ». Ils commettent toutefois fréquemment des erreurs.
Une telle assistance peut être d’un précieux secours pour les débutants, mais les utilisateurs plus expérimentés savent qu’ils passeront beaucoup de temps à tenter de déduire ce qui est réellement arrivé à partir de l’interprétation du programme.
Or, une quantité importante d’informations se perd en chemin. Bien souvent, il est nécessaire d’utiliser tcpdump -xX pour décoder et interpréter tout ce qui a échappé au programme.
Même les programmes se contentant de décoder ne donnent pas toutes les informations qu’ils ont reçues. Ils offrent uniquement la vision du réseau que leur créateur estime suffisante. Elle est donc incomplète.
Ecrire des outils réseau en 2 lignes Python avec ScaPy
De son côté, ScaPy tente de surmonter ces différents points faibles. Il permet de construire tous les paquets que vous souhaitez, et adopte un modèle flexible permettant d’éviter les limites arbitraires. L’utilisateur peut placer n’importe quelle valeur dans un champ et les assembler à sa guise.
Concernant la description de paquet, ScaPy propose un langage dédié (Domain Specific Language ou DSL) permettant une description puissante et rapide pour n’importe quel type.
L’usage de la syntaxe Python et d’un interpréteur Python pour ce DSL apporte de multiples bienfaits. Il n’est pas nécessaire d’écrire un interpréteur séparé, les utilisateurs n’ont pas besoin d’apprendre un langage supplémentaire, et ils profitent d’un langage complet, concis et puissant.
Il est possible de décrire un paquet ou un jeu de paquets sous forme de couches empilées l’une sur l’autre. Les champs de chaque couche ont des valeurs par défaut utiles pouvant être surchargées. Et l’utilisateur n’est pas obligé d’utiliser des méthodes ou des templates prédéterminés.
Ceci supprime le besoin d’écrire un nouvel outil chaque fois qu’un scénario différent est requis. Plutôt que d’utiliser une soixantaine de lignes pour décrire un paquet en C, il suffit d’une seule ligne avec Scapy et d’une autre ligne pour imprimer le résultat. Ainsi, 90% des lignes des outils de sondage réseau peuvent être réécrits en deux lignes.
Un seul sondage pour de multiples interprétations
Lors du sondage d’un réseau, de nombreux stimulus sont envoyés et seuls quelques-uns d’entre eux reçoivent une réponse. Le choix du bon stimuli permet d’obtenir les informations par les réponses ou l’absence de réponses. Ainsi, la découverte de réseau est une pratique de test en boîte noire.
Contrairement à beaucoup d’outils, ScaPy donne toutes les informations telles que les stimulus envoyés et les réponses reçues. C’est en examinant les données que l’utilisateur reçoit les informations désirées.
Si le jeu de données est petit, l’utilisateur peut l’explorer. Dans d’autres cas, l’interprétation ds données dépend du point de vue emprunté.
La plupart des outils choisissent le point de vue et éliminent toutes les données qui n’y sont pas liées. Ce n’est pas le cas de ScaPy qui donne l’intégralité des données brutes.
Ceci permet d’utiliser les données de nombreuses fois, et le point de vue peut donc évoluer pendant l’analyse. Il est donc possible d’effectuer un seul sondage comme un scan ou un traceroute et de l’interpréter de nombreuses fois.
ScaPy décode sans tenter d'interpréter
À la différence de ces outils, ScaPy ne cherche pas à interpréter les réponses après un sondage de réseau. Il se contente de les décoder, et de conférer des faits.
Ceci permet d’éviter les erreurs d’interprétation commises par l’outil. Par exemple, après avoir reçu un paquet de destination inaccessible ICMP, certains scanners signalent un port TCP filtré par le firewall. Pourtant, cela peut aussi signifier qu’il n’y avait pas d’hôte à qui transférer le paquet. L’interprétation des résultats par les outils peut donc causer plus de mal que de bien en injectant des biais dans les résultats. ScaPy évite ce problème, et c’est un véritable point fort pour éviter aux utilisateurs avancés de devoir effectuer une rétro-ingénierie de l’interprétation pour en dériver des faits.
Conclusion: Scapy, l'un des meilleurs outils de manipulation de paquet en Python
Par rapport aux autres outils de networking, Scapy présente plusieurs avantages. Son paradigme de description de paquets est efficace et flexible, il est possible d’effectuer de multiples interprétations à partir d’un seul sondage, et les résultats des sondages sont décodés sans être interprétés.
En guise de tableau de commande, Scapy utilise l’interpréteur Python. Il est donc possible d’utiliser le langage Python directement pour assigner des variables, utiliser des boucles ou définir des fonctions.
Afin d’apprendre à utiliser Python et Scapy, vous pouvez choisir DataScientest. Nos différentes formations dédiées à la Data Science comportent un module entièrement dédié à ce langage de programmation.
À travers nos cursus, vous pourrez acquérir toutes les compétences requises pour exercer les métiers de Data Analyst, Data Scientist, Data Engineer, Machine Learning Engineer ou Data Product Manager.
En fonction de la vocation choisie, les différents modules abordent les bases de données, le Machine Learning, le Data Visualization, ou l’Intelligence décisionnelle.
Tous nos parcours se complètent intégralement à distance via le web, et notre organisme est éligible au Compte Personnel de Formation pour le financement. Découvrez dès maintenant DataScientest !
Vous savez tout sur Scapy. Pour plus d’informations sur le même sujet, découvrez notre dossier complet sur Python et notre dossier sur NumPy.