mapping-attack-paths-with-bloodhound-ce について
BloodHound CEでActive DirectoryとEntra IDの権限昇格経路を調べる、認可済みテスト向けのセキュリティスキルです。データ収集、グラフ分析、経路の優先順位付けに加え、ハイブリッド環境の経路も扱います。
主な機能
- 01SharpHoundによるADデータ収集
- 02AzureHoundによるEntra IDデータ収集
- 03組み込みおよび独自Cypher経路の分析
- 04侵害済みプリンシパルのOwned登録
- 05権限昇格経路の優先順位付けと記録
活用シーン
- 01足掛かりからDomain Adminsへの経路調査
- 02同期されたADとEntra IDのリスク評価
- 03パープルチーム演習での検知検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill mapping-attack-paths-with-bloodhound-ceインストール後、Claude Code で/mapping-attack-paths-with-bloodhound-ceを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py詳細
BloodHound CE によるアタックパスのマッピング
法的通知: このスキルは、認可されたセキュリティテスト、レッドチーム演習、および教育目的のみを対象としています。Active Directory および Entra ID の偵察によって、ドメイン/テナント全体の侵害につながる権限昇格の連鎖が明らかになります。所有している環境、または明示的な書面による認可(交戦規則)を得た環境に対してのみ使用してください。無許可での使用は、コンピュータ詐欺・不正利用防止法およびそれに相当する法律に違反します。
概要
BloodHound Community Edition(CE)は、SpecterOps が提供するグラフベースのアタックパス管理プラットフォームです。セキュリティプリンシパル(ユーザー、コンピューター、グループ、OU、GPO、Entra ID のユーザー/グループ/アプリ/ロール)をノードとして、それらの間の権限、グループメンバーシップ、セッション、信頼関係、ACL をエッジとしてモデル化します。Active Directory と Entra ID を有向グラフとして捉えることで、BloodHound は「この低権限アカウントは Domain Admins / Global Administrator に到達できるか」という問いを最短経路クエリに変換し、人間のレビュー担当者が見落とすような権限昇格の連鎖を見つけ出します。
BloodHound CE は、従来の Neo4j 専用の BloodHound を、コンテナ化されたスタックに置き換えたものです。このスタックは、Go 製の API サーバー、PostgreSQL のリレーショナルストア、Neo4j のグラフデータベースで構成され、すべて最新の Web UI と REST API の背後に配置されています。データは、SpecterOps が保守する 2 つのコレクターによって収集されます。
- SharpHound(CE/.NET コレクター。ドメイン参加済みの Windows ホスト上、またはそのホストに対して実行)は、オンプレミスの AD から、オブジェクト、グループメンバーシップ、ACL、セッション、ローカル管理者権限、信頼関係、GPO、証明書サービス(ADCS)、LAPS の読み取り可否を収集します。出力は JSON の ZIP ファイルです。
- AzureHound(クロスプラットフォームの Go バイナリ)は、Microsoft Graph と Azure REST API を介して、Entra ID および Azure Resource Manager のデータを収集します。対象は、ユーザー、グループ、アプリの登録、サービスプリンシパル、ディレクトリロール、サブスクリプション/ロールの割り当て、キーコンテナーです。出力は単一の JSON ファイルです。
最近の CE リリースでは、AD ドメインと、それと同期された Entra ID テナントの両方を取り込むと、BloodHound は ハイブリッドアタックパス を自動的に描画します。これは、オンプレミスと クラウドの境界をまたぐ連鎖です(例:オンプレミスのユーザーが、特権の Entra ロールを保持するクラウドアカウントに同期されているケース)。MITRE ATT&CK にマッピングすると、中核となる活動は T1069 – Permission Groups Discovery であり、これを T1087(Account Discovery)、T1482(Domain Trust Discovery)、T1018(Remote System Discovery)が補完します。
使用するタイミング
- 任意のドメインへの足がかりや Entra 認証情報を取得した後の、認可された内部ペネトレーションテストまたはレッドチーム演習中
- 所有しているプリンシパルから Tier-0 資産(Domain Admins、Global Administrator)への権限昇格ルートに優先順位を付ける必要があるとき
- オンプレミスの AD が Entra ID に同期されているハイブリッド ID のリスクを評価するとき
- 収集段階と経路実行段階で検知が発動することを検証するパープルチーム演習中
- 防御側のクライアントに向けて、アタックパスの証跡と修復ガイダンスを作成するとき
前提条件
- AD/Entra の偵察を対象範囲に含む認可
- 足がかり:有効なドメインユーザー(SharpHound 用)、および/または有効な Entra 認証情報またはトークン(AzureHound 用)
- 分析用ワークステーションに Docker と Docker Compose があること
- コレクター:
# Deploy BloodHound CE (pulls Postgres, Neo4j, and the BloodHound API) curl -L https://ghst.ly/getbhce -o docker-compose.yml docker compose pull docker compose up -d # Reveal the randomly generated initial admin password docker compose logs bloodhound | grep -i "Initial Password" # AzureHound (download the release binary for your OS from the GitHub releases page) # https://github.com/SpecterOps/AzureHound/releases chmod +x ./azurehound # SharpHound CE collector: download SharpHound.zip from the BloodHound CE # web UI (Administration -> Download Collectors), transfer to a domain-joined host.
目的
- BloodHound CE をデプロイし、Web UI と API で認証する
- SharpHound で AD データを、AzureHound で Entra データを収集する
- 両方のデータセットを取り込み、侵害されたプリンシパルを Owned としてマークする
- 組み込みの分析を実行する(Domain Admins への最短パス、Kerberoast 可能なアカウント、ADCS の悪用)
- 個別仕様およびハイブリッドのアタックパス向けに、カスタムの Cypher クエリを作成する
- 権限昇格ルートの優先順位を決め、エンゲージメントレポート用に文書化する
MITRE ATT&CK マッピング
| ID | テクニック | このスキルでの適用 |
|---|---|---|
| T1069 | Permission Groups Discovery | AD/Entra のグループメンバーシップおよびプリンシパル間の権限を列挙し、攻撃グラフを構築する |
| T1087 | Account Discovery | SharpHound/AzureHound によるユーザー、コンピューター、サービスプリンシパルの列挙 |
| T1482 | Domain Trust Discovery | ドメイン/フォレストの信頼関係を収集し、グラフのエッジとして分析する |
| T1018 | Remote System Discovery | ドメインコンピューターとその関係(セッション、ローカル管理者)を列挙する |
ワークフロー
ステップ 1: BloodHound CE のデプロイとログイン
スタックを起動し、生成されたパスワードを取得して、初回ログイン時にリセットします。
docker compose up -d
docker compose logs bloodhound 2>&1 | grep -i "Initial Password"
# Browse to http://localhost:8080 (default user: admin)
ステップ 2: SharpHound でオンプレミス AD データを収集する
ドメインに参加している Windows ホスト上で(または runas/ドメインユーザーのトークン経由で)、CE コレクターを実行します。-c All はすべての収集メソッドを実行し、--outputdirectory は ZIP の出力先を制御します。
# Full collection
.\SharpHound.exe -c All --outputdirectory C:\Temp
# Stealthier LDAP-only collection (no host touch for sessions/local-admin)
.\SharpHound.exe -c DCOnly --outputdirectory C:\Temp
# Looped session collection to map logged-on Tier-0 users over time
.\SharpHound.exe -c Session --loop --loopduration 02:00:00 --outputdirectory C:\Temp
Linux からの場合、認証情報とネットワークアクセスしかないときは、Python コレクター(bloodhound-ce-python)を代替として使用できます。
pip install bloodhound-ce
bloodhound-ce-python -u 'jdoe' -p 'Passw0rd!' -d corp.local -ns 10.0.0.10 -c All --zip
ステップ 3: AzureHound で Entra ID / Azure データを収集する
資格情報、JWT、またはリフレッシュトークンを指定して AzureHound の list を実行し、単一の JSON ファイルに出力します。
# Username/password (where allowed by CA/MFA policy)
./azurehound list -u "[email protected]" -p "$PASSWORD" -t "corp.com" -o entra.json
# Using a previously acquired JWT (e.g., from roadtx / device-code phishing)
./azurehound list --jwt "$JWT" -o entra.json
# Using a refresh token
./azurehound list --refresh-token "$REFRESH_TOKEN" -t "<tenant-id>" -o entra.json
ステップ 4: BloodHound CE にデータを取り込む
Administration -> File Ingest から SharpHound の ZIP と AzureHound の JSON をアップロードするか、API に POST します。
# API ingest (after obtaining a JWT from /api/v2/login)
TOKEN=$(curl -s http://localhost:8080/api/v2/login \
-H 'Content-Type: application/json' \
-d '{"login_method":"secret","username":"admin","secret":"<password>"}' \
| python -c "import sys,json;print(json.load(sys.stdin)['data']['session_token'])")
# Start a file-upload job, then PUT the collector ZIP/JSON to it
JOB=$(curl -s -X POST http://localhost:8080/api/v2/file-upload/start \
-H "Authorization: Bearer $TOKEN" | python -c "import sys,json;print(json.load(sys.stdin)['data']['id'])")
curl -s -X PUT "http://localhost:8080/api/v2/file-upload/$JOB" \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/zip' \
--data-binary @C:/Temp/BloodHound.zip
curl -s -X POST "http://localhost:8080/api/v2/file-upload/$JOB/end" \
-H "Authorization: Bearer $TOKEN"
ステップ 5: 侵害済みプリンシパルをマークする
UI で侵害された各アカウント/コンピューターを検索し、ノードを開いて Mark as Owned を切り替えます。Owned とマークされたプリンシパルは、経路探索クエリ({owned:true})の起点になります。
ステップ 6: 組み込みの分析クエリを実行する
Cypher タブを開くか、検索パネルの事前定義クエリを使用します。
- Domain Admins への最短経路
- high value への経路を持つ Kerberoast 可能なアカウント
- AS-REP ロast 可能なユーザー
- DCSync 権限を持つプリンシパル
- ADCS の設定ミス(CE の ESC1-ESC8 エッジ)
- 制約なしの委任が設定されたコンピューター
ステップ 7: 独自の経路用にカスタム Cypher を作成する
組み込みクエリではカバーされない経路(オンプレミス AD から Entra へのハイブリッドチェーンを含む)に対して Cypher を使用します。
// Shortest path from any owned principal to Domain Admins
MATCH p=shortestPath((n {owned:true})-[*1..]->(g:Group))
WHERE g.objectid ENDS WITH "-512"
RETURN p
// Kerberoastable users (SPN set) with a path to Domain Admins
MATCH (u:User {hasspn:true})
MATCH p=shortestPath((u)-[*1..]->(g:Group))
WHERE g.objectid ENDS WITH "-512"
RETURN p
// Principals who can DCSync the domain
MATCH (n)-[:MemberOf*0..]->()-[:DCSync|GetChanges|GetChangesAll*1..]->(d:Domain)
RETURN n.name, d.name
// ACL abuse from owned principals (GenericAll/WriteDacl/WriteOwner/ForceChangePassword)
MATCH p=(n {owned:true})-[:GenericAll|GenericWrite|WriteDacl|WriteOwner|ForceChangePassword*1..]->(t)
RETURN p
// Hybrid: on-prem user synced to an Entra account holding a privileged directory role
MATCH p=(u:User)-[:SyncedToEntraUser]->(:AZUser)-[:AZHasRole|AZGlobalAdmin*1..]->(r)
RETURN p
ステップ 8: 優先順位付けと文書化
経路をホップ数、ステルス性(HasSession のようにホストへの接触が必要な目立つエッジを避ける)、ツールの入手可否で順位付けします。各経路について、プリンシパル、エッジ、必要なアクション、修復メモ(例: 悪用可能な ACL の削除、アカウントの階層化)を記録します。
ツールとリソース
| ツール | 目的 | ソース |
|---|---|---|
| BloodHound CE | グラフベースの攻撃経路プラットフォーム(Docker スタック) | https://github.com/SpecterOps/BloodHound |
| SharpHound (CE) | オンプレミス AD コレクター | https://github.com/SpecterOps/SharpHound |
| AzureHound | Entra ID / Azure RM コレクター | https://github.com/SpecterOps/AzureHound |
| bloodhound-ce-python | Linux 向け Python AD コレクター | https://github.com/dirkjanm/BloodHound.py |
| CE Quickstart | 公式デプロイドキュメント | https://bloodhound.specterops.io/get-started/quickstart/community-edition-quickstart |
| BloodHound Cypher refs | エッジ/クエリのドキュメント | https://bloodhound.specterops.io/ |
主要なエッジ / 経路の種類
| エッジ / 経路 | 意味 | 権限昇格の例 |
|---|---|---|
| MemberOf | グループメンバーシップ | ネストされたグループから Domain Admins に到達する |
| GenericAll / WriteDacl | オブジェクトへの完全/ACL 制御 | 特権ユーザーのパスワードをリセットする |
| ForceChangePassword | 別のプリンシパルのパスワードをリセットできる | Tier-0 アカウントを乗っ取る |
| HasSession | ユーザーがコンピューターにログインしている | 侵害されたホストから DA のトークンを窃取する |
| ADCSESC1..ESC8 | 証明書サービスの設定ミス | 特権プリンシパルとして証明書を登録する |
| SyncedToEntraUser / AZGlobalAdmin | ハイブリッドアイデンティティのエッジ | オンプレミスの足がかりからクラウドの Global Admin へ |
検証基準
- BloodHound CE がデプロイされ、到達可能であること。デフォルトの管理者パスワードが変更されていること
- スコープ内のすべてのドメインから SharpHound データが収集されていること
- スコープ内のテナントについて AzureHound の JSON が収集されていること(ハイブリッド環境またはクラウドがスコープに含まれる場合)
- 両方のデータセットが正常に取り込まれていること(失敗したアップロードジョブがないこと)
- 侵害済みのプリンシパルが Owned としてマークされていること
- Domain Admins / Global Administrator までの最短パスが特定されていること
- ADCS および ACL 悪用のパスが列挙されていること
- 少なくとも 1 つのカスタム Cypher クエリ(該当する場合はハイブリッドクエリを含む)が実行されていること
- パスがホップ数や発覚のしにくさで優先順位付けされ、修復策とともに文書化されていること