
検知を考慮したBloodHound攻撃パスのスコアリング - 目的達成への最も静かな経路を、5つの検知ティア(audit/EDR/Elastic/MDI/WDAC)とAzureにわたって調整。

検知を考慮した Active Directory 攻撃パスのスコアリング。 DreadHost Research | OffsetInspect (PowerShell) および OffsetScan (Rust) のコンパニオン
BloodHound(およびその上に構築された PlumHound)は、目的に到達するためのあるパスを見つけ出します。 NoiseHound は同じグラフデータを取り込み、ホップ数ではなく予想検知コストによってパスを再ランク付けします。これにより、オペレーターは単に「どうやって到達するか」ではなく、「Domain Admin へ最も静かに到達する方法は何か」を問うことができます。
初めての方へ? Operator Walkthrough が、このツールの動作を最も手早く確認できる方法です - インストールから実際の BloodHound CE による概念実証(スコアを UI に書き戻す)、DeadAir エンジン、ブルーチーム向けの検知ギャップレポートまでを、スクリーンショットを交えて実践的に案内するツアーです。
プロジェクトステータス (v1.2.0): 安定版であり、複数のドメインにわたる実際の BloodHound データでテスト済みです。77 個のコーパスエッジのうち 37 個がラボで実測済みであり、5 つのオンプレミス検知層(Windows 監査、Defender for Endpoint、Elastic SIEM、Defender for Identity ランタイムアラート、WDAC 監査)に加え、実測済みの Azure/Entra 層をカバーしています - これらは
profiles/内の 6 つのドロップインプロファイルとして提供され、パスのランキングを実際に変化させることをクローズドループで証明しています(docs/VALIDATION.md)。 コーパスには 13 個の Azure/Entra エッジが含まれており(docs/AZURE.md)、AzureHound の出力からそのまま取り込むことができます。 未実測のオンプレミスエッジおよびすべての Azure エッジには専門家による推定値が付与されています。キャリブレーションハーネス(noisehound-calibrate)は、これらの値やお客様自身の環境を実測するための手段です。未キャリブレーションのランキングは、根拠のあるガイダンスとして扱い、絶対的な真実とはみなさないでください。
許可されたエンゲージメント専用です。このツールは、テストの書面による許可を得たシステムに対して、OPSEC 計画のための攻撃パスをスコアリングします。
NoiseHound は独立したコミュニティプロジェクトです。SpecterOps や BloodHound プロジェクトとは提携、承認、または関連していません。BloodHound のオープンデータ形式を利用しています。
.zip)、生の JSON ファイル、またはエクスポートのディレクトリを内部グラフに取り込みます。オフライン分析やテスト用に、正規化された {nodes, edges} JSON 形式も受け付けます。AD CS の ESC1-8 昇格エッジは、BloodHound が収集した証明書テンプレートと CA のファクトからロード時に合成されます(下記参照)。effective_noise_score(0-100)を付与します。複数の権限が同じノードペアを接続している場合は、最も静かなものが選択されます。コーパスに存在しないエッジタイプは、保守的なスコア(60)にデフォルト設定されるため、ギャップは過小報告ではなく安全側に倒れます。オプションの環境プロファイルは、ターゲットの宣言された検出態勢に合わせてスコアを調整します(下記参照)。パスのノイズは意図的に単純な合計ではありません。同じ検出に二度引っかかることは二倍の騒がしさではありません(SOC のトリアージであり、生のイベント数ではありません)。NoiseHound は次を使用します:
path_score = max(edge_scores) * 0.6 + mean(edge_scores) * 0.4
これは、累積的な露出を考慮しつつ、最も騒がしい単一ステップ(1つの悪いステップが作戦全体を台無しにすることが多い)に重みを置いています。重みは設定可能(--max-weight / --mean-weight)であり、APT29/Calderaラボから実際の検出データが得られれば、経験的に調整できます。
各パスは検出確率も報告します。これは相関アラートをトリガーする可能性であり、最も騒がしいエッジと全エッジの累積ノイズOR(--correlationで調整)をブレンドしたものです。これはノイズスコアとは異なる問いに答えます。短くても騒がしいパスは、長くても静かなパスよりも検出される全体的な確率が低いことがあります。--rank-by probabilityでこれによるランク付けができます。
大規模グラフでは、求解はコンパニオンのRustエンジンであるDeadAir(OffsetScan-to-OffsetInspect層)にディスパッチされます。NoiseHoundは機能豊富なフロントエンド(取り込み、コーパス、環境/Sigma、制約、レポート)として留まり、準備されたグラフを求解するエンジンに渡すため、どちらの場合も結果は同一です。
--engine auto(デフォルト):DeadAirのバイナリが見つかりかつグラフが大規模(>= 5000ノード)な場合にDeadAirを使用し、それ以外は組み込みのPythonソルバーを使用します。--engine python:組み込みソルバーを強制します(バイナリ不要)。--engine rust:DeadAirを強制します(バイナリがない場合はエラー)。DeadAirは$NOISEHOUND_DEADAIR、次にPATH、次に兄弟ディレクトリの../deadair/target/{release,debug}/ビルドの順で検索されます。大規模グラフでは10〜100倍高速(250kノードのグラフはPythonで約30秒に対し約2秒で求解)でありながら、バイト単位で同一のランキングを生成します。出力にはどのエンジンが実行されたかが記録されます。
ノイズ、ホップ数、検出確率は異なる方向に引っ張り合うため、--paretoは単一の勝者を強制する代わりにパレートフロンティア(3つすべてにおいて他のどのパスにも同時に劣らないすべてのパス)を返します。また、実際の作戦には制約があります。--avoid NODEは特定のホスト(EDR監視下のジャンプボックス、ハニーポット)をパスから除外し、--avoid-edge TYPEは特定のテクニックを拒否します(例:--avoid-edge DCSync)。どちらも繰り返し指定可能で、その場で再求解されます。
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --pareto
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --avoid FILESERVER01 --avoid-edge HasSession
重み付き BloodHound パスファインディングは目新しいものではないため、ここでは正直な位置づけを示します:
NoiseHound の貢献はその組み合わせにあります: 機械可読な BloodHound エッジから検出テレメトリへのコーパス、オペレーターの OPSEC (「DA への最も静かな道」) として枠付けられたノイズ重み付き再求解、対象の宣言された態勢に適応する環境モデル、そしてラボでの検出を実測スコアに変換するキャリブレーションループです。グラフの数学はありふれたものですが、コーパスとその枠付けこそが要点です。その価値はコーパスの質にのみ依存するため、キャリブレーションとコミュニティからの貢献が第一級の扱いとなっています - 以下を参照してください。
cd NoiseHound
python -m pip install -r requirements.txt # networkx>=3.0
# optional editable install to get the `noisehound` command on PATH:
python -m pip install -e .
Python 3.10+ が必要です。
# Text summary (default)
python -m noisehound --input export.zip --objective "Domain Admins" --source jdoe
# JSON, for downstream tooling / correlation across the DreadHost suite
python -m noisehound -i export.zip -o "Domain Admins" -s jdoe -f json --out paths.json
# Self-contained HTML report
python -m noisehound -i export.zip -o "Domain Admins" -s jdoe -f html --out report.html
まず、エクスポートに対してパーサーのサニティチェックを行います(ヒストグラム + コーパスカバレッジ、パス処理なし)。これはNoiseHoundを実世界のデータで検証する最速の方法です:
noisehound-inspect -i export.zip
zip の代わりに、--input を BloodHound CE がデータを格納する Neo4j データベースに向けると、NoiseHound は(すでに分析済みの)グラフを Bolt 経由で直接読み取ります:
pip install 'noisehound[neo4j]'
export NEO4J_PASSWORD=bloodhoundcommunityedition # match your BHCE compose
noisehound-inspect -i bolt://localhost:7687
python -m noisehound -i bolt://localhost:7687 -s jdoe -o "Domain Admins"
BloodHound CE(7687 番ポートで Neo4j をバンドル)を公式の compose で起動します:
curl -L https://ghst.ly/getbhce | docker compose -f - up。
バンドルされているサンプルに対して試してみてください:
python -m noisehound -i samples/sample_graph.json -s jdoe -o "Domain Admins" -d CONTOSO.LOCAL
python -m noisehound -i samples/sample_bloodhound_ce.zip -s jdoe -o "Domain Admins"
python -m noisehound -i samples/sample_adcs_ce.zip -s jdoe -o "Domain Admins" # ADCS ESC1
# Full-spectrum export exercising every edge family (sessions, delegation, DCSync, ADCS, trusts):
python -m noisehound -i samples/sample_fullspectrum_ce.zip -s ALICE -o "Domain Admins" -d CONTOSO.LOCAL -k 3