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)
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 >_