一个面向 ICS/SCADA 环境的高交互 OPC UA 蜜罐。基于 LibUA 构建——它是完整的 OPC UA Binary 协议栈,而非协议模拟器。它可跨多个行业配置模拟逼真的工业控制系统,具备实时过程值、全面的威胁检测以及可直接对接 SIEM 的日志记录。
由 0xAJStrike 构建。
📄 演讲: 像读蓝图一样读懂工厂 —— 本工具为之而构建的 SecTor 2026 演讲(OPC UA 攻击面、蜜罐设计以及现场演示)。
大多数 ICS 蜜罐(Conpot、GRFICSv2)仅提供部分协议模拟。OpcUaTrap 实现了完整的 OPC UA Binary 协议——安全通道协商、会话生命周期、订阅、历史记录以及所有服务集。真实的漏洞利用工具和扫描器(OpalOPC、Nmap OPC UA 脚本)会像与生产系统交互一样与它交互。
| 低 | 中 | OpcUaTrap | |
|---|---|---|---|
| 协议 | 仅横幅 | 部分模拟 | 完整真实协议栈 |
| 会话状态 | 无 | 基础 | 完整生命周期 |
| 地址空间 | 静态 / 空 | 少量节点 | 100–130 个逼真节点 |
| 订阅 | 无 | 无 | 有——推送实时数据 |
| 漏洞利用韧性 | 崩溃 | 部分 | 可承受完整框架攻击 |
docker run -d --name opcuatrap -p 4840:4840 \
-e OPCUATRAP_PROFILE=oil-gas \
-v opcuatrap-data:/data \
ghcr.io/0xajstrike/opcuatrap:latest
蜜罐现已运行在 opc.tcp://<host>:4840。使用
-e OPCUATRAP_PROFILE=water-treatment(或 power-grid)切换设施。该镜像为多架构
(amd64 + arm64,因此也可在 Raspberry Pi 上运行)、以非 root 身份运行,并将其
证书和 NDJSON 日志持久化到 opcuatrap-data 卷。完整的 Docker 详情
(Compose、所有环境变量)见 部署 → Docker。
.NET 9.0 SDK 或更高版本 — 从源码构建所必需,因为捆绑的 LibUA 多目标最高到 net9.0。蜜罐本身运行在 .NET 8 运行时上。(如果使用 Docker 则不需要 — 镜像会在内部构建所有内容。)
LibUA — OPC UA 协议栈。OpcUaTrap 基于一个经过轻微修改的分支构建 (0xAJStrike/LibUA,是 nauful/LibUA 的分支),该分支为多个 OPC UA CVE 增加了纵深防御限制,并添加了可选的蜜罐欺骗响应。
将两个仓库克隆到同一父目录下的并排位置:
git clone https://github.com/0xAJStrike/OpcUaTrap.git
git clone https://github.com/0xAJStrike/LibUA.git
预期布局(OpcUaTrap 相对于其项目文件引用 ../../../LibUA/NET-Core/LibUA/LibUA.csproj,即 LibUA 与 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
服务器在约400毫秒内启动,并立即开始模拟过程值。
配置文件是位于 src/OpcUaTrap/Profiles/ 中的 JSON 文件。每个文件定义了设施身份、完整地址空间、标签分类、模拟规则和加固配置。
| 配置文件 | --profile | 设施 | 节点 | 供应商身份 |
|---|---|---|---|---|
oil-gas | (默认) | PetroVista 中央处理设施 | ~120 | Schneider Electric SCADAPack 57x |
water-treatment | water-treatment | Cascade 市政水处理厂 | ~100 | Rockwell Automation ControlLogix |
power-grid | power-grid | Ridgeline 138kV 输电变电站 | ~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
Ridgeline 138kV Transmission Substation/
Site_Information/
HV_Bus (138kV)/ Phase voltages, line voltage, frequency, MW/MVAR/PF
CB-101 main breaker, CB-102 bus tie (status, SF6, trip/close)
Transformers/ T1 & T2, 50 MVA each — voltage, current, oil temp, winding temp,
LTC tap position (1–17), loading %, tap raise/lower commands
LV_Bus (13.8kV)/ Bus voltage, frequency, total MW/MVAR/PF
Feeders/ F1 Residential, F2 Industrial, F3 Commercial, F4 Hospital/Critical
(current, MW, MVAR, recloser ops, trip/close commands)
CapacitorBanks/ CAP-1 (energized), CAP-2 (standby) — 5 MVAR each
ProtectionRelays/ SEL-351S overcurrent, SEL-387 differential, SEL-421 distance
All have _ENABLED flag — disabling them is a critical attack target
DC_System/ 125VDC station battery — voltage, SOC, charger status, ground fault
SafetySystems/ 86 Lockout relay (trip-all-breakers), ESD
SCADA_RTU/ ABB RTU560 status, EMS comm link, historian connection
| # | 策略 | 模式 |
|---|---|---|
| 1 | None | None |
| 2 | Basic256Sha256 | Sign |
| 3 | Basic256Sha256 | SignAndEncrypt |
| 4 | Aes128_Sha256_RsaOaep | SignAndEncrypt |
配置文件可通过 hardening.authentication.allowedSecurityPolicies 配置限制所提供的策略。
预先植入的弱凭据,使用时会触发告警。定义于 appsettings.json。
| 用户名 | 密码 | 告警级别 |
|---|---|---|
operator | op3rator! | HIGH |
admin | admin123 | CRITICAL |
engineer | Welcome1 | CRITICAL |
readonly | readonly | MEDIUM |
svc_historian | h1st0rian | HIGH |
认证行为因配置文件而异——oil-gas 使用 selective 模式(拒绝未知凭据),water-treatment 使用 accept-all。
| 操作 | 响应 | 日志记录 |
|---|---|---|
| Browse | 返回完整地址空间 | 检测枚举 >100 次操作 |
| Read | 返回实时模拟值 | 静默,除非批量(>20 个节点)或关键标签 |
| Write | 返回 Good——值在 1 秒内恢复 | 记录日志 + 按标签分类进行威胁评分 |
| Call(ESD/Lockout 方法) | 返回 Good——无任何实际效果 | CRITICAL 告警,+30 威胁评分 |
| History Read | 返回 30 天的正弦波数据 | 检测批量窃取 >1000 个数据点 |
| Subscribe(关键标签) | 返回真实订阅 | CRITICAL 告警,+20 威胁评分 |
| 蜜令牌登录 | 会话被接受 | HIGH/CRITICAL 告警 |
| 匿名认证 | 按配置文件接受或拒绝 | 记录日志 |
标签按配置文件进行分类。分类决定写入威胁评分。
| 分类 | 示例标签 | 写入评分 |
|---|---|---|
| Critical | ESD_, SDV_, CMD, PSP, _LAHH, XV, CBCMD, REL_*_ENABLED | +25 |
| Sensitive | 过程变量(压力、温度、流量、电压、电流) | +10 |
| Normal | 公用设施、站点信息、运行小时数、状态计数器 | +5 |