Honeypots and Detection
practicalHoneypots & Detection
La détection en environnement OT repose sur deux piliers : leurres (honeypots) et monitoring passif.
Conpot
Conpot est un honeypot basse-interaction maintenu par MushMush Foundation. Émule Modbus, S7comm, BACnet, IPMI, HTTP, SNMP, EtherNet/IP. Configuration par défaut : Siemens SIMATIC S7-200.
pip install conpot
conpot --template default --logfile /var/log/conpot.json
nmap -p 502 --script modbus-discover localhost
Template custom — station d'épuration :
<core>
<template>
<entity name="protocol_name">modbus</entity>
<entity name="template_description">Water treatment SCADA</entity>
<entity name="vendor_name">Schneider Electric</entity>
<entity name="product_name">Modicon M340</entity>
</template>
</core>
ATTENTION : Un honeypot mal isolé devient une porte d'entrée. Déployez dans une VLAN totalement séparée.
T-Pot
T-Pot (Telekom Security) agrège plusieurs honeypots dont Conpot, Cowrie, Dionaea. Tableau de bord Kibana, export MISP.
Signatures Snort/Suricata
alert tcp any any -> $MODBUS_SERVER 502 (msg:"MODBUS - Write Single Coil unauthorized"; \
flow:established,to_server; content:"|00 00|"; offset:2; depth:2; \
content:"|05|"; offset:7; depth:1; \
sid:1000001; rev:1;)
alert tcp any any -> $MODBUS_SERVER 502 (msg:"MODBUS - Force Listen Only Mode"; \
flow:established,to_server; content:"|08|"; offset:7; depth:1; \
content:"|00 04|"; offset:8; depth:2; \
sid:1000002; rev:1;)
alert tcp any any -> $MODBUS_SERVER 502 (msg:"MODBUS - Slave ID enumeration"; \
flow:established,to_server; content:"|11|"; offset:7; depth:1; \
threshold:type both, track by_src, count 5, seconds 60; \
sid:1000003; rev:1;)
Monitoring passif
Solutions commerciales : Claroty CTD, Nozomi Guardian, Dragos Platform, Forescout SilentDefense. Open source :
from scapy.all import sniff, TCP, Raw
from collections import defaultdict
baseline = defaultdict(set)
def analyze(pkt):
if pkt.haslayer(TCP) and pkt[TCP].dport == 502 and pkt.haslayer(Raw):
payload = bytes(pkt[Raw].load)
if len(payload) >= 8:
func_code = payload[7]
src = pkt[0][1].src
key = (src, func_code)
if key not in baseline:
print(f"[ALERT] Nouveau couple : {src} -> FC {func_code}")
baseline[src].add(func_code)
sniff(iface="eth1", filter="tcp port 502", prn=analyze, store=0)
Cadres normatifs
- NIST CSF 2.0 fonction DETECT, catégorie DE.CM
- IEC 62443-3-3 SR 6.2 : détection des événements de sécurité
- CISA publie des advisories ICS-CERT hebdomadaires (flux STIX/TAXII)
Limites des honeypots
Un attaquant expérimenté détecte un honeypot via : - Timing de réponse anormalement régulier - Absence de jitter sur valeurs analogiques - Incohérences identification slave (FC 17) vs comportement - Bannières Conpot par défaut
Personnalisez les templates. GridPot (extension Conpot pour smart grid) offre une référence.