
Honeypot OPC UA ad alta interazione per ICS/SCADA — multi-profilo (oil & gas, acqua, rete elettrica), simulazione di processo in tempo reale, scoring delle minacce per sessione e integrazione SIEM (syslog/CEF/webhook/Elasticsearch). Basato su .NET 8 e LibUA.
Un honeypot OPC UA ad alta interazione per ambienti ICS/SCADA. Basato su LibUA — uno stack OPC UA Binary completo, non un emulatore di protocollo. Simula sistemi di controllo industriale realistici attraverso molteplici profili di settore con valori di processo in tempo reale, rilevamento completo delle minacce e logging pronto per SIEM.
Realizzato da 0xAJStrike.
📄 Talk: Read the Plant like a Blueprint — la presentazione SecTor 2026 per cui è stato creato questo strumento (superficie d'attacco OPC UA, progettazione dell'honeypot e una demo dal vivo).
La maggior parte degli honeypot ICS (Conpot, GRFICSv2) offre un'emulazione parziale del protocollo. OpcUaTrap implementa il protocollo OPC UA Binary completo — negoziazione del canale sicuro, ciclo di vita della sessione, sottoscrizioni, cronologia e tutti i set di servizi. Strumenti di exploit e scanner reali (OpalOPC, script Nmap per OPC UA) interagiscono con esso come farebbero con un sistema di produzione.
| Bassa | Media | OpcUaTrap | |
|---|---|---|---|
| Protocollo | Solo banner | Emulazione parziale | Stack reale completo |
| Stato della sessione | Nessuno | Base | Ciclo di vita completo |
| Spazio degli indirizzi | Statico / vuoto | Pochi nodi | 100–130 nodi realistici |
| Sottoscrizioni | No | No | Sì — dati in tempo reale inviati |
| Resilienza agli exploit | Crash | Parziale | Sopravvive a framework completi |
docker run -d --name opcuatrap -p 4840:4840 \
-e OPCUATRAP_PROFILE=oil-gas \
-v opcuatrap-data:/data \
ghcr.io/0xajstrike/opcuatrap:latest
L'honeypot è ora attivo su opc.tcp://<host>:4840. Cambia l'impianto con
-e OPCUATRAP_PROFILE=water-treatment (o power-grid). L'immagine è multi-arch
(amd64 + arm64, quindi funziona anche su un Raspberry Pi), non-root, e persiste il suo
certificato e i log NDJSON nel volume opcuatrap-data. I dettagli completi su Docker
(Compose, tutte le variabili d'ambiente) sono disponibili in Deployment → Docker.
.NET 9.0 SDK o versione successiva — necessario per compilare dai sorgenti, poiché il LibUA incluso supporta più target fino a net9.0. L'honeypot stesso viene eseguito sul runtime .NET 8. (Non necessario se usi Docker — l'immagine compila tutto internamente.)
LibUA — lo stack OPC UA. OpcUaTrap viene compilato contro un fork leggermente modificato (0xAJStrike/LibUA, un fork di nauful/LibUA) che aggiunge limiti di difesa in profondità per diverse CVE di OPC UA, oltre a risposte di inganno opzionali per l'honeypot.
Clona entrambi i repository affiancati sotto una directory padre comune:
git clone https://github.com/0xAJStrike/OpcUaTrap.git
git clone https://github.com/0xAJStrike/LibUA.git
Layout previsto (OpcUaTrap fa riferimento a ../../../LibUA/NET-Core/LibUA/LibUA.csproj
relativamente al suo file di progetto, ovvero LibUA si trova accanto a OpcUaTrap):
parent/
├── OpcUaTrap/ # this repo
└── LibUA/ # the fork, cloned as a sibling
dotnet build src/OpcUaTrap/OpcUaTrap.csproj
# Oil & gas profile (default, port 4840)
dotnet run --project src/OpcUaTrap
# Water treatment profile
dotnet run --project src/OpcUaTrap -- --profile water-treatment
# Power grid profile
dotnet run --project src/OpcUaTrap -- --profile power-grid
# Custom port
dotnet run --project src/OpcUaTrap -- --port 7718
# Custom log directory
dotnet run --project src/OpcUaTrap -- --log-dir /var/log/opcuatrap
Il server si avvia in ~400 ms e inizia immediatamente a simulare i valori di processo.
I profili sono file JSON in src/OpcUaTrap/Profiles/. Ognuno definisce l'identità della struttura, lo spazio degli indirizzi completo, la classificazione dei tag, le regole di simulazione e la configurazione di hardening.
| Profilo | --profile | Impianto | Nodi | Identità del fornitore |
|---|---|---|---|---|
oil-gas | (predefinito) | PetroVista Central Processing Facility | ~120 | Schneider Electric SCADAPack 57x |
water-treatment | water-treatment | Cascade Municipal Water Treatment Plant | ~100 | Rockwell Automation ControlLogix |
power-grid | power-grid | Ridgeline 138kV Transmission Substation | ~130 | ABB RTU560 |
PetroVista Central Processing Facility/
Site_Information/
Wellheads/ WH_101 – WH_104 (pressure, temp, flow, choke position)
Separators/ SEP_HP_201, SEP_LP_202 (pressure, level, setpoints)
TankFarm/ TK_OIL_301, TK_OIL_302 (level, alarms, inlet/outlet valves)
PumpStations/ PMP_XFER_401 (speed, discharge pressure, start/stop commands)
CompressorStation/ COMP_501 (RPM, vibration, discharge temp, load %)
Pipelines/ PL_EXPORT_601 (pressure, flow, block valve)
SafetySystems/ ESD (status, shutdown valves, trigger/reset methods)
FireAndGas (gas detectors %LEL, flame detectors)
Utilities/ Instrument air, fuel gas, power generation
Cascade Municipal Water Treatment Plant/
Site_Information/
RawWaterIntake/ Flow, turbidity, pH, temp, intake pumps, isolation valve
Coagulation/ Rapid mix, alum dose rate and setpoint
Flocculation/ Slow mixer, polymer feed rate and setpoint
Sedimentation/ Basin levels, turbidity, sludge blanket, scrapers
Filtration/ 4 filters — differential pressure, turbidity, backwash status
Disinfection/ Primary/secondary chlorination, ammonia feed (chloramine)
ClearWell/ Finished water storage — level, turbidity, pH, Cl2 residual
Distribution/ High-service pumps, pressure zones, elevated tank level
SafetySystems/ ESD, chlorine/ammonia leak detectors and isolation valves
Utilities/ Power, backup generator, SCADA system status