Network Forensics
L’analyse forensique réseau consiste à capturer, préserver et analyser le trafic réseau pour reconstituer des événements, détecter des intrusions, et identifier des exfiltrations de données.
Capture de trafic§
tcpdump§
# Capture basique
tcpdump -i eth0 -w capture.pcap
# Avec un filtre
tcpdump -i eth0 -w capture.pcap 'host 192.168.1.10'
tcpdump -i eth0 -w capture.pcap 'port 443'
tcpdump -i eth0 -w capture.pcap 'tcp and not port 22'
# Taille de fichier limitée — rotation
tcpdump -i eth0 -w capture_%Y%m%d_%H%M%S.pcap -G 3600 # Rotation toutes les heures
tcpdump -i eth0 -w capture.pcap -C 100 # Nouveau fichier tous les 100 Mo
# Capture complète avec snaplen
tcpdump -i eth0 -s 0 -w capture.pcap # -s 0 = paquets complets (pas de troncation)
# Afficher sans fichier (analyse en direct)
tcpdump -i eth0 -n -v 'tcp[tcpflags] & tcp-syn != 0' # SYN packets (tentatives de connexion)
Wireshark (GUI et tshark)§
# tshark — Wireshark en ligne de commande
tshark -r capture.pcap -Y "http.request" # Requêtes HTTP
tshark -r capture.pcap -Y "dns" # Trafic DNS
tshark -r capture.pcap -Y "tcp.flags.syn==1" # Paquets SYN
# Extraire des champs spécifiques
tshark -r capture.pcap -Y "http.request" \
-T fields -e http.host -e http.request.uri -e ip.src
# Statistiques
tshark -r capture.pcap -q -z conv,tcp # Conversations TCP
tshark -r capture.pcap -q -z io,phs # Hiérarchie des protocoles
tshark -r capture.pcap -q -z endpoints,ip # Endpoints IP
# Extraire des fichiers HTTP (fichiers transférés)
tshark -r capture.pcap --export-objects http,/tmp/exported/
Analyse Wireshark — filtres de display essentiels§
# Trafic par hôte
ip.addr == 192.168.1.10
ip.src == 10.0.0.1
ip.dst == 8.8.8.8
# Protocoles
http
dns
ftp
smtp
tls
# Ports
tcp.port == 443
udp.port == 53
# Flags TCP
tcp.flags.syn == 1 && tcp.flags.ack == 0 # SYN (nouvelles connexions)
tcp.flags.reset == 1 # RST (connexions réinitialisées)
tcp.flags.fin == 1 # FIN (connexions fermées)
# Patterns suspects
tcp.analysis.retransmission # Retransmissions (instabilité/scan)
tcp.analysis.zero_window # Saturation buffer
# Rechercher du contenu
frame contains "password"
http contains "login"
dns.qry.name contains "attaquant"
# Combinaisons
http.request.method == "POST" && http.request.uri contains "login"
dns.qry.type == 1 && dns.qry.name matches ".*\.ru$" # Requêtes DNS vers .ru
Analyse de captures — scénarios courants§
Exfiltration DNS§
# Requêtes DNS anormalement longues = tunneling potentiel
tshark -r capture.pcap -Y "dns" -T fields -e dns.qry.name |
awk '{print length($0), $0}' | sort -rn | head -20
# Fréquence élevée vers un domaine = tunneling ou DGA
tshark -r capture.pcap -Y "dns.qry.type==1" -T fields -e dns.qry.name |
awk -F'.' '{print $(NF-1)"."$NF}' | sort | uniq -c | sort -rn | head -20
# Sous-domaines avec encodage base32/64 (caractères inhabituels)
tshark -r capture.pcap -Y "dns" -T fields -e dns.qry.name |
grep -E "[a-z0-9]{30,}" # Sous-domaines de plus de 30 caractères
Scan de ports§
# Détecter un scan Nmap (SYN scan)
# Beaucoup de SYN vers différents ports depuis une même IP
tshark -r capture.pcap -Y "tcp.flags.syn==1 && tcp.flags.ack==0" \
-T fields -e ip.src -e tcp.dstport |
sort | uniq -c | sort -rn
# Connexions RST en réponse = port fermé (scan SYN)
# SYN+ACK en réponse = port ouvert
# Scan ICMP (ping sweep)
tshark -r capture.pcap -Y "icmp.type==8" -T fields -e ip.dst |
sort | uniq -c | sort -rn
Exfiltration HTTP/HTTPS§
# Volumes de données par IP (exfiltration = upload important)
tshark -r capture.pcap -q -z conv,tcp | grep -E "[0-9]+ bytes" |
sort -k5 -rn | head -20
# Requêtes HTTP POST volumineuses
tshark -r capture.pcap -Y "http.request.method==POST" \
-T fields -e ip.src -e http.host -e http.request.uri -e http.content_length
# User-Agent suspects
tshark -r capture.pcap -Y "http" -T fields -e http.user_agent |
sort | uniq -c | sort -rn
# Fichiers téléchargés via HTTP (reconstitution)
tshark -r capture.pcap --export-objects http,/tmp/http_files/
C2 (Command & Control)§
# Connexions périodiques régulières (beaconing)
# Trafic toutes les X secondes vers la même IP = C2 potentiel
tshark -r capture.pcap -Y "ip.dst == 203.0.113.1" \
-T fields -e frame.time_relative -e ip.len |
awk '{diff=$1-prev; prev=$1; print diff}' |
sort | uniq -c | sort -rn
# Connexions sortantes sur des ports inhabituels
tshark -r capture.pcap -Y "tcp.flags.syn==1 && tcp.flags.ack==0" \
-T fields -e ip.dst -e tcp.dstport |
grep -v " 80\| 443\| 53\| 22\| 25\| 587" | sort | uniq -c | sort -rn
# TLS avec des certificats auto-signés ou suspects
# Extraire les SNI (Server Name Indication) des connexions TLS
tshark -r capture.pcap -Y "tls.handshake.type==1" \
-T fields -e ip.dst -e tls.handshake.extensions_server_name
Zeek (anciennement Bro)§
Zeek est un analyseur de protocoles réseau qui génère des logs structurés à partir de captures.
# Analyser un pcap avec Zeek
zeek -r capture.pcap
# Fichiers générés :
# conn.log → toutes les connexions (IP src/dst, ports, durée, octets)
# dns.log → requêtes DNS
# http.log → requêtes HTTP
# files.log → fichiers transférés
# ssl.log → connexions TLS (SNI, certificat, JA3)
# weird.log → anomalies détectées
# Analyser conn.log
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration orig_bytes |
sort -k6 -rn | head # Top connexions par volume
# JA3 fingerprinting (empreinte du client TLS)
cat ssl.log | zeek-cut ja3 ja3s server_name |
sort | uniq -c | sort -rn
# JA3 permet d'identifier le type de client (Metasploit, Cobalt Strike ont leurs signatures)
Suricata — NIDS sur PCAP§
# Analyser un pcap avec les règles Suricata
suricata -r capture.pcap -l /tmp/suricata_output/ -c /etc/suricata/suricata.yaml
# Examiner les alertes
cat /tmp/suricata_output/fast.log
cat /tmp/suricata_output/eve.json | jq 'select(.event_type=="alert")'
# Règle Suricata exemple (détection de beaconing toutes les 60s)
alert tcp any any -> any any (
msg:"Possible C2 Beaconing";
detection_filter:track by_src,count 5,seconds 300;
sid:9999001;
)
NetworkMiner — Extraction de fichiers§
# Extraire automatiquement les fichiers, credentials, et sessions
# NetworkMiner (GUI) : File > Open > capture.pcap
# → Onglet Files : tous les fichiers transférés
# → Onglet Credentials : identifiants HTTP, FTP, SMTP en clair
# → Onglet Sessions : reconstruction des sessions
# En ligne de commande (alternative)
foremost -i capture.pcap -o /tmp/extracted/ # Extraction par magic bytes
Artefacts réseau sur un hôte§
# Connexions actives et en écoute
ss -tulnp
netstat -antp
# Table ARP — machines sur le réseau local
arp -a
ip neigh
# Table de routage
ip route
route -n
# Connexions DNS récentes (cache)
systemd-resolve --statistics
resolvectl statistics
# Connexions récentes (non temps réel)
# /proc/net/tcp → connexions TCP actives (adresses en hex)
cat /proc/net/tcp | awk '{print $2, $3, $4}'
# Format : adresse_locale:port_local adresse_distante:port_distant état
# Convertir hex vers IP
python3 -c "
import socket, struct
def hex_to_ip(hex_str):
ip = struct.pack('<I', int(hex_str, 16))
return socket.inet_ntoa(ip)
print(hex_to_ip('0101007F')) # 127.0.1.1
"—The Gardener