Honeypots and Detection

practical

Honeypots & 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.