Le Laboratoire Virtuel & Terminal Pratique est en ligne :

Ouvrir le Labo
Volume 5 : Analyse Réseau, Wireshark, tcpdump & Crafting Scapy/Module 1 : Capture de Trafic & Dissection Scapy

Forge & Injection de Paquets Réseau avec Scapy (Python)

Labo Virtuel >_

Dissection & Forge Artisanale de Paquets avec Scapy



Issu du manuel de référence Python Hacking Éthique (Chapitres 3 et 4), ce cours explore la bibliothèque Python Scapy, le standard mondial pour l'artisanat de paquets, l'audit réseau, le fuzzing et la découverte de vulnérabilités.

---

1. La Syntaxe d'Empilement des Couches dans Scapy



Scapy utilise l'opérateur de division / pour empiler les couches de la pile réseau de gauche à droite (de la couche basse vers la couche haute) :

``python from scapy.all import Ether, IP, TCP, Raw

Création d'un paquet TCP complet encapsulé dans IP et Ethernet

trame = Ether(dst="aa:bb:cc:11:22:33") / IP(dst="192.168.1.1") / TCP(dport=80, flags="S") / Raw(b"GET / HTTP/1.0\r\n\r\n")

Inspection détaillée des champs de chaque couche

trame.show()
`

Lorsque vous instanciez un paquet, Scapy calcule automatiquement les valeurs par défaut non spécifiées (sommes de contrôle Checksum, longueurs de trames, protocole sous-jacent, adresses IP sources).

---

2. Balayage ICMP Ping Sweep Automatisé en Python



Voici un script complet permettant de sonder un sous-réseau entier en quelques secondes à l'aide de requêtes
ICMP Echo Request (Type 8) :

`python from scapy.all import IP, ICMP, sr, conf import sys

Désactivation des messages verbeux internes de Scapy

conf.verb = 0

def balayer_reseau_icmp(plage_cidr: str) -> list[str]: """ Envoie des requêtes ICMP Echo Request et récupère les hôtes actifs. Exemple de plage : '192.168.1.0/24' """ print(f"[*] Lancement du balayage ICMP sur : {plage_cidr}") # Création du paquet ICMP pour toute la plage CIDR paquet = IP(dst=plage_cidr) / ICMP() # sr() transmet les paquets et écoute les réponses (Couche 3) reponses, non_repondus = sr(paquet, timeout=1.5, retry=1) hotes_actifs = [] for envoi, reponse in reponses: # Si la réponse est un ICMP Echo Reply (Type 0) if reponse.haslayer(ICMP) and reponse[ICMP].type == 0: ip_hote = reponse[IP].src ttl = reponse[IP].ttl hotes_actifs.append(ip_hote) print(f" [+] Hôte actif détecté : {ip_hote:15s} (TTL: {ttl})") print(f"[*] Audit terminé : {len(hotes_actifs)} machine(s) active(s) identifiée(s).") return hotes_actifs

if __name__ == "__main__": balayer_reseau_icmp("192.168.1.0/24")
`

---

3. Les Fonctions d'Envoi Fondamentales de Scapy



*
send(paquet) : Envoie des paquets en Couche 3 (Scapy gère la couche 2 Ethernet automatiquement). * sendp(trame) : Envoie des trames en Couche 2 (vous devez spécifier l'en-tête Ether() et l'interface réseau). * sr(paquet) : Send & Receive en Couche 3. Retourne deux listes : les paquets ayant reçu une réponse et les paquets sans réponse. * sr1(paquet) : Variante de sr() qui retourne uniquement la première réponse reçue (idéal pour tester l'état d'un port TCP). * sniff(filter="...", prn=callback)` : Capture le trafic réseau en temps réel avec des filtres BPF (Berkeley Packet Filters).
Informations
Formatarticle
Durée50 min
StatutEn cours
Laboratoire Virtuel Pratique

Pratiquez cette le?on dans le Terminal Linux et l'ex?cuteur WebAssembly Python en direct.

Ouvrir dans le Labo >_