
AD、ADCS、Entra ID 向けの Rust 製攻撃パス分析
大規模環境向けに Rust で構築された、オープンソースの Active Directory、ADCS、Entra ID / Azure 攻撃パス分析ツール。CopperHound は SharpHound、bloodhound-python、ldapdomaindump、AzureHound の出力、生の LDIF ダンプ、Sysinternals AD Explorer スナップショットをメモリマップドグラフストアに取り込み、グラフデータベースを使わずにパス、露出、CHQL クエリを直接実行します。1 つのコンテナが Web UI と REST API を提供します。

![]() |
![]() |
![]() |
スクリーンショットは架空のデモデータ(scripts/demo_data.py)を使用しています。
ドキュメント: ユーザーガイド · デプロイ · データソース · REST API · CHQL · エッジリファレンス · パフォーマンス · アーキテクチャ
docker compose up -d --build
docker compose logs copperhound | grep "Initial admin password"
http://127.0.0.1:8090 を開き、admin でサインインし、SharpHound / AzureHound の .zip または .json ファイルを Data タブにドロップして Rebuild graph を押します。COPPERHOUND_ADMIN_PASSWORD でパスワードを設定し、COPPERHOUND_PORT / COPPERHOUND_HOST で公開アドレスを変更します(デフォルトは 127.0.0.1:8090 なので、8080 の BloodHound と並行して実行できます)。
まだデータがありませんか? python scripts/demo_data.py demo/ を実行すると、アップロード用の架空の環境(意図的に弱点を仕込んだ AD、ADCS、Entra ID)が書き出されます。詳細は デモデータで試す を参照してください。
Docker を使わない場合: cd web && npm ci && npm run build を実行し、続いて cargo run --release -- serve を実行します(デフォルト: 127.0.0.1:8080、データは ./data、UI は ./web/dist)。
アカウント、API トークン、ウォッチフォルダー、スケジュールレポート、変更アラート、HTTPS、シングルサインオン(OpenID Connect、SAML 2.0)については docs/DEPLOYMENT.md を参照してください。
取り込みのたびにバックグラウンドで計算されます:
CLI での同等コマンド: copperhound findings corp.chg、copperhound plan corp.chg --steps 10。
検索、パス探索、ノード詳細、すべての派生エッジに対する「これはどのように導出されたか?」、CHQL エディターとクエリライブラリ、および検出結果、修復、ゾーン、ポスチャ、レポート、データ、管理の各ページを備えた WebGL グラフキャンバス(sigma.js)。スクリーンショット付きのウォークスルー: docs/USER_GUIDE.md。
ネイティブなグラフ操作にコンパイルされる読み取り専用の Cypher 方言 — 複数のパターンと MATCH 句、OPTIONAL MATCH、WITH、集計、ORDER BY/SKIP/LIMIT、UNION、無向および可変長ホップ、パス関数、パターン述語をサポートします。ほとんどの BloodHound CE およびレガシークエリはそのまま実行できます。CHQL リファレンスと Cypher 互換性表 を参照してください。
MATCH p = shortestPath((u:User {name:'[email protected]'})-[*1..]->(t {tier0:true})) RETURN p
MATCH p = allShortestPaths((g:Group)-[*1..]->(t {tier0:true})) WHERE g.name STARTS WITH 'DOMAIN USERS@' RETURN p
MATCH (u:User {hasspn:true, enabled:true}) WHERE u.pwdlastset < 1600000000 RETURN u.name, u.pwdlastset
MATCH (g:Group)-[:AdminTo]->(c:Computer) RETURN g.name, count(c)
MATCH (p)-[r:ADCSESC1|ADCSESC6a]->(d:Domain) RETURN p, r, d
MATCH (n {owned:true}), (m:Group) WHERE m.objectid ENDS WITH '-512' MATCH p = shortestPath((n)-[*1..]->(m)) RETURN p
MATCH (dc)-[:MemberOf*0..]->(g:Group) WHERE g.objectid ENDS WITH '-516' WITH collect(dc) AS dcs
MATCH (c:Computer {unconstraineddelegation:true}) WHERE NOT c IN dcs RETURN c
コマンドラインでは、copperhound query corp.chg "MATCH …" を実行します。days_ago(n) は相対的なタイムスタンプを返します。例えば WHERE u.lastlogontimestamp < days_ago(90) のように使用します。
UI には 159 個の定義済みクエリ が 15 のカテゴリ(ドメイン情報、危険な権限、Kerberos、委任、ACL 悪用、セッションと横移動、GPO と OU、衛生管理、最短パス、Tier Zero、所有済み、ADCS、Azure / Entra ID、Azure リソース、ハイブリッド)に分かれて同梱されており、それぞれにタグが付けられ、合成グラフに対してテストされています。独自のクエリはサーバー側に保存できます。
レコードはメモリマップドファイルからすべてのコアでスキャンされ、圧縮されたスパース行グラフに変換されます。このグラフはミリ秒単位で開くことができ、パス探索や Tier Zero の露出は、そのグラフ上で専用に設計された BFS パスとして実行されます。10 GB の SharpHound コレクション(12.5M オブジェクト、65.7M エッジ)は 23~31 秒で取り込まれ、その上での Tier Zero への最短パスは 1 ミリ秒未満で計算されます。設計、チョークポイントアルゴリズム、ベンチマークについては、docs/PERFORMANCE.md を参照してください。
# Ingest: any mix of .json files, .zip archives and directories
copperhound ingest 20241105_BloodHound.zip ldd_out/ -o corp.chg
# Several collections of the same domain: the newest collection wins per object
# (see docs/DATA.md; `--merge union` for a plain union)
copperhound ingest 20241001093000_BloodHound.zip 20241105101500_BloodHound.zip -o corp.chg
copperhound stats corp.chg
# Shortest attack path (names or SIDs/GUIDs, case-insensitive)
copperhound path corp.chg --from [email protected] --to "DOMAIN [email protected]"
copperhound path corp.chg --from [email protected] --to-tier0 --exclude HasSession
# Tier Zero exposure and the edges whose removal cuts the most attack paths
copperhound tier0 corp.chg --top 25
copperhound tier0 corp.chg --json > exposure.json
# Blast radius
copperhound reach corp.chg --from WS042.CORP.LOCAL
# Property filter (JSON filter tree, see docs/API.md) and name search
copperhound filter corp.chg '{"and":[{"kind":"User"},{"truthy":"enabled"},{"truthy":"hasspn"}]}'
copperhound search corp.chg backup --kind User
copperhound columns corp.chg # list property columns (builds them for older graphs)
--all-edges は非トラバーサルエッジ(例: GetChanges、TrustedBy)を含めます。
--exclude A,B はエッジ種別を除外します。--threads N は並列度を制限します。