Lab - PLC Forensics

challenge

Lab — 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 ID 1
  • 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

  1. Identification correcte du flag
  2. Capacité à expliquer la séquence
  3. 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.