Analyser une capture réseau avec Python

Il arrivera probablement un jour où vous allez vouloir analyser une capture de flux réseau tout en lui appliquant un traitement automatisé. Python permet de faire cela assez facilement. Vous trouverez ci-dessous quelques exemple pour vous aider à prendre en main l’outil scapy. Ces méthodes sont notamment très utiles pour l’analyse forensique.

Intallation de scapy

pip install scapy

Lecture du fichier

from scapy.all import *

pcap = rdpcap('capture.pcapng') 

for trame in pcap:
    ........................
    .......  analyse  ...... 
    ........................

Extraction d’une couche protocolaire (X-PDU)

La transmission de données entre 2 machines s’effectue généralement en encapsulant différentes couches de protocoles comme des poupées russes (cf. modèle OSI). Chacune des couches est un X-PDU (avec X représentant son niveau dans le modèle OSI ou TCP/IP).

Couches OSI
Couche X-PDU Protocoles
Application A-PDU HTTP , DNS , DHCP , FTP
Presentation P-PDU
Session S-PDU
Transport T-PDU (Message) TCP , UDP
Réseau N-PDU (Paquet) IP
Liaison L-PDU (Trame) Ethernet

Il est possible d’extraire les X-PDU des différents protocoles encapsulés :

from scapy.all import *

pcap = rdpcap('capture.pcapng') 

for trame in pcap:

    # Trame Ethernet
    _ethernet = trame[Ethernet]
 
    # Paquet IP
    _ip = trame[IP]

    # Segment TCP
    _tcp = trame[TCP]

Manipulation des données

Prenons exemple de l’analyse des segments TCP pdu = trame[TCP] (mais les commandes sont les mêmes pour d’autres couches) :

Vérifier la présence d’une couche :
if pdu.haslayer(DNS) :
Afficher les données d’une couche :
pdu.show()
Informations sur la couche (couches encapsulées, attributs) :
ls(pdu)
Couche en hexadécimale :
hexa = raw(pdu).hex()

Exemple

Extraction d’une payload cachée dans des paquets IP :

from scapy.all import *

pcap = rdpcap('capture.pcapng')
data = ""

for trame in pcap:
    payload = raw( trame[IP] ).hex()

    data += payload[26:28]

print(data)