La manipulation de paquets réseau est souvent complexe pour de nombreux développeurs.
Cela peut entraîner des difficultés dans le débogage et l’analyse des réseaux, limitant l’efficacité des solutions réseau.
Scapy se présente comme un outil flexible et puissant en Python pour créer, manipuler et analyser les paquets réseau, simplifiant ainsi le processus.
Initiez-vous aux fondamentaux de Python pour devenir pentesteur.
Introduction
La programmation réseau est un domaine fondamental de l’informatique, essentiel pour la communication et l’échange d’informations entre les appareils connectés. Dans ce contexte, Scapy se distingue comme un outil puissant et polyvalent, offrant aux développeurs un large éventail de fonctionnalités pour manipuler des paquets réseau en Python. Cette série d’explorations a pour objectif de révéler le potentiel de Scapy en tant qu’outil de programmation réseau. Nous allons découvrir comment créer, manipuler et analyser des paquets, et comment développer des outils personnalisés pour des tâches spécifiques telles que la surveillance du trafic et la découverte d’hôtes actifs.
Dans cette première partie, nous poserons les bases de notre exploration en introduisant Scapy et en discutant de son importance dans le domaine de la programmation réseau. Nous examinerons également les prérequis nécessaires pour une compréhension approfondie de Scapy, ainsi que les concepts de base liés aux protocoles réseau, afin de préparer le terrain pour les applications pratiques ultérieures.
Création d'un Paquet avec Scapy
Lorsque nous utilisons Scapy pour la programmation réseau, la première étape consiste souvent à créer des paquets personnalisés pour envoyer ou recevoir des données sur le réseau. Dans cette section, nous allons explorer comment créer et manipuler des paquets avec Scapy.
Lancement de Scapy
Avant de commencer à créer des paquets, nous devons d’abord lancer Scapy. Pour ce faire, ouvrez un terminal et entrez la commande suivante : ‘scapy’
Cela va lancer l’interface de Scapy dans le terminal, prête à être utilisée pour la création de paquets et d’autres opérations liées au réseau.
Création d'un Paquet IP
Une fois Scapy lancé, nous pouvons créer notre premier paquet en spécifiant simplement l’adresse de destination. Par exemple, pour créer un paquet IP destiné à « alphorm.com » , nous utilisons la commande suivante : paquet = IP(dst= »alphorm.com »)
Affichage du Paquet
Après avoir créé notre paquet, nous pouvons l’afficher pour visualiser ses différentes informations à l’aide de la méthode `show()` :
En affichant le paquet, nous pouvons voir les différents composants, y compris les champs par défaut remplis automatiquement, tels que l’adresse source qui représente notre adresse IP locale.
Ajout de Couches Supplémentaires
Supposons maintenant que nous voulions créer un paquet ICMP pour effectuer un ping vers « alphorm.com » et inclure un message personnalisé. Nous pouvons le faire en ajoutant une couche ICMP au paquet IP existant : paquet = IP(dst= »alphorm.com »)/ICMP()/ »Hello les alphomeurs »
Dans cet exemple, nous avons ajouté une couche ICMP au paquet IP en utilisant l’opérateur `/` , suivi du message personnalisé « Hello les alphormeurs » .
Affichage du Paquet Modifié
Après avoir ajouté la couche ICMP, nous pouvons à nouveau afficher notre paquet pour voir les modifications apportées :
Maintenant, nous pouvons voir les différentes informations du paquet, y compris la couche ICMP et le message personnalisé ajouté à la fin.
Cette section détaille le processus de création d’un paquet avec Scapy, en commençant par le lancement de Scapy dans le terminal, puis en expliquant la création de paquets IP de base et l’ajout de couches supplémentaires comme ICMP.
La couche 2 et 3
Envoi de paquets :
nous allons explorer l’envoi de paquets à travers les couches 2 et 3 du réseau, ainsi que la réception des réponses correspondantes. Nous utiliserons les fonctions `sendp()` et `send()` pour envoyer des paquets respectivement aux couches 2 et 3.
Tout d’abord, nous avons deux options pour envoyer des paquets : `sendp()` pour la couche 2 et `send()` pour la couche 3. Utiliser `sendp()` nécessite de spécifier des informations telles que l’interface, tandis que `send()` utilise la table de routage locale pour le routage.
Pour illustrer cela, nous allons envoyer un paquet ICMP à destination de « alphorm.com » avec le message « Hello les alphormeurs » à travers la couche 2 :
Ici, nous avons construit notre propre en-tête Ethernet en utilisant `Ether()` par défaut. En spécifiant l’interface avec `iface= »eth0″` , nous envoyons le paquet à travers cette interface. L’option `loop=1` permet d’envoyer le paquet en boucle.
- sur wireshark
là en fait nous retrouvons les différents paquets qui ont été envoyés
là on retrouve le payload qu’on a pu rajouter donc les datas vers la fin de notre paquet ICMP donc du paquet qu’on a pu envoyer notre requête ICMP qu’on a pu envoyer au niveau du réseau.
Ensuite, pour envoyer un paquet à travers la couche 3 avec la fonction `send()` , nous pouvons simplement utiliser : send(IP(dst= »alphorm.com »)/ICMP()/ »Hello les alphomeurs – couche 3″)
Dans cette commande, nous n’avons pas besoin de spécifier une interface car le routage est déterminé par la table de routage locale.
Réception de réponses :
Après avoir envoyé nos paquets, nous pouvons recevoir les réponses correspondantes en utilisant les fonctions `sr()` , `sr1()` , `srp()` et `srp1()` . Par exemple :
En inspectant `response` , nous pouvons voir les paquets de réponse reçus, tandis que `no_response` contient les paquets sans réponse. Nous pouvons ensuite explorer le contenu des réponses et approfondir nos connaissances sur les différents paramètres des paquets.
Cette commande utilise `conf.route.add()` pour ajouter une entrée personnalisée à la table de routage. Dans cet mexemple, nous spécifions l’hôte de destination avec l’adresse IP ` »192.168.1.4″` et la passerelle par défaut avec l’adresse IP ` »192.168.1.1″` . Cela permet de définir une route personnalisée pour atteindre cet hôte spécifique via la passerelle indiquée.
En utilisant `conf.route.resync()` après avoir ajouté des entrées personnalisées, nous pouvons synchroniser la table de routage avec les modifications apportées. Cette commande garantit que les nouvelles entrées sont prises en compte et que la table de routage est à jour.
Ces commandes sont utiles pour configurer des routes spécifiques dans un environnement réseau, ce qui peut être nécessaire dans certains scénarios de configuration avancée ou de débogage.
Lab : Script Python de Scan ARP pour Découvrir les Hôtes du Réseau
La quatrième partie de cet article est un laboratoire où nous explorons la création d’un script avec Scapy pour scanner notre réseau local et découvrir les hôtes présents. Voici le code correspondant :
Script Python :
importsys
from scapy.all import *
if len(sys.argv) != 2:
print("Utilisation : python ARPScanner.py 192.168.1.0/24")
sys.exit(1)
try:
alive, dead = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=sys.argv[1]),timeout=2,verbose=0)
print("Adresse MAC - Adresse IP")
for i inrange(0, len(alive)):
print(alive[i][1].hwsrc + " - " + alive[i][1].psrc)
except:
pass
Ce script utilise la bibliothèque Scapy pour envoyer des requêtes ARP à toutes les adresses IP d’un réseau local spécifié. Il récupère ensuite les réponses des machines actives et affiche leurs adresses MAC et IP.
Sortie du script :
La sortie du script affiche les adresses MAC et IP des machines actives détectées sur le réseau local. Chaque ligne de la sortie représente une machine, avec l’adresse MAC suivie de l’adresse IP, séparées par un tiret (-). Par exemple :
Ces informations sont utiles pour identifier les appareils connectés au réseau local et peuvent être utilisées pour diverses tâches de gestion réseau et de dépannage.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment utiliser Scapy pour créer des paquets réseau ?
Quelle est l'importance de Scapy dans la programmation réseau ?
Comment envoyer des paquets avec Scapy à travers différentes couches réseau ?
Comment Scapy facilite-t-il la découverte d'hôtes sur un réseau local ?
Quels sont les prérequis pour utiliser Scapy efficacement ?
Conclusion
Scapy est un outil puissant pour les développeurs réseau, offrant une grande flexibilité dans la manipulation des paquets. Quel aspect de Scapy aimeriez-vous explorer davantage dans vos projets de programmation réseau ?