
ICS/SCADA向けの高対話型OPC UAハニーポット — マルチプロファイル(石油・ガス、水道、電力網)、ライブプロセスシミュレーション、セッションごとの脅威スコアリング、SIEM統合(syslog/CEF/webhook/Elasticsearch)を備えています。.NET 8とLibUA上に構築されています。
ICS/SCADA環境向けのハイインタラクション型OPC UAハニーポット。LibUA上に構築されています — プロトコルエミュレータではなく、完全なOPC UAバイナリスタックです。複数の業界プロファイルにわたる現実的な産業制御システムを、ライブのプロセス値、包括的な脅威検知、SIEM対応ログとともにシミュレートします。
0xAJStrikeによって開発されました。
📄 講演: Read the Plant like a Blueprint — このツールが開発されるきっかけとなったSecTor 2026のプレゼンテーション(OPC UAの攻撃対象領域、ハニーポットの設計、ライブデモ)。
ほとんどのICSハニーポット(Conpot、GRFICSv2)は部分的なプロトコルエミュレーションしか提供していません。OpcUaTrapは完全なOPC UAバイナリプロトコルを実装しています — セキュアチャネルネゴシエーション、セッションライフサイクル、サブスクリプション、履歴、そしてすべてのサービスセットです。実際のエクスプロイトツールやスキャナ(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、すべての環境変数)は
Deployment → 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
サーバーは約400msで起動し、直ちにプロセス値のシミュレーションを開始します。
プロファイルは src/OpcUaTrap/Profiles/ 内の JSON ファイルです。各ファイルは施設の識別情報、完全なアドレス空間、タグ分類、シミュレーションルール、およびハードニング設定を定義します。
| プロファイル | --profile | 施設 | ノード | ベンダー識別 |
|---|---|---|---|---|
oil-gas | (デフォルト) | 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
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 を使用します。