Lab - PLC Forensics
challengeLab — PLC Forensics
Premier exercice forensique OT. Capture réseau (incident_plc.pcap) de 12 minutes sur span port d'une station de pompage municipale, incident classé suspicious activity par le SOC.
Contexte
Opérateur rapporte une alarme niveau haut du réservoir T-204 à 14:37, débordement partiel détecté. Logs SCADA : aucune commande opérateur.
- PLC : Schneider Modicon M340 — IP
10.20.30.5— Unit ID1 - HMI Magelis :
10.20.30.10 - EWS :
10.20.30.15 - Capteur niveau : registre Input
30002(cm, 0-300) - Vanne sortie : coil
00012 - Pompe : coil
00013 - Consigne haute : holding register
40005
Outils
wireshark incident_plc.pcap
tshark -r incident_plc.pcap -Y "modbus" \
-T fields -e frame.time -e ip.src -e ip.dst \
-e modbus.func_code -e modbus.reference_num -e modbus.data
Questions
Q1 — Source de l'attaque
tshark -r incident_plc.pcap -Y "modbus.func_code == 5 or modbus.func_code == 6" \
-T fields -e ip.src | sort -u
Ce n'est ni HMI ni EWS.
Q2 — Action malveillante
Séquence d'écritures : 1. Écriture coil pilotant actionneur 2. Modification consigne 3. Commande pompe
Notez function code + registre + valeur.
Q3 — Désactivation de l'alarme
Écriture précédant l'incident sur consigne 40005. Valeur d'origine : 250 cm.
Q4 — Persistance
Dernières secondes : effacement de journal ou FC 90 UMAS ?
Construction du flag
Le flag est dans la dernière trame Modbus, encodé en ASCII dans une séquence d'écritures FC 16.
from scapy.all import rdpcap, Raw, TCP
packets = rdpcap("incident_plc.pcap")
for pkt in packets:
if pkt.haslayer(TCP) and pkt.haslayer(Raw):
data = bytes(pkt[Raw].load)
if len(data) > 7 and data[7] == 0x10: # FC 16
qty = int.from_bytes(data[10:12], "big")
values_raw = data[13:13 + qty * 2]
try:
text = values_raw.decode("ascii", errors="ignore")
if "ESPILON" in text:
print(f"Flag : {text}")
except: pass
Format de soumission
ESPILON{<chaine_alphanumerique>}
ATTENTION : Aucune connexion vers un PLC réel requise. Tout sur la pcap.
Critères de validation
- Identification correcte du flag
- Capacité à expliquer la séquence
- Recommandations défensives (alignement IEC 62443)
Pistes défensives
- Filtrage function codes d'écriture par firewall industriel
- Authentification Modbus TCP Security (TLS)
- Whitelist IPs autorisées à écrire
- Corrélation SCADA/trafic (toute écriture = action HMI loggée)
- Surveillance registres safety critical
Bonne investigation. Derrière chaque pcap OT se trouve un procédé physique tangible.