
ネットワーク共有のアクセス権をBloodHound OpenGraphsへ簡単にマッピングするPythonツール
ネットワーク共有のアクセス権限を BloodHound OpenGraph にマッピングするためのツールです。
関連ブログ記事を読む: https://specterops.io/blog/2025/10/30/sharehound-an-opengraph-collector-for-network-shares/
このリポジトリには ShareHound の2つの実装が含まれています。どちらも同じ目標(SMB共有のアクセス許可から BloodHound OpenGraph JSON を生成すること)を共有していますが、言語、ランタイム、機能セットが異なります。ワークフローに合う方を選んでください。
| 実装 | パス | 作者 | 最適な用途 |
|---|---|---|---|
| Python | Python/ | Remi Gascou (@podalirius_) @ SpecterOps | リファレンス実装。拡張やスクリプト化が容易 |
| Go | Go/ | Javier Azofra @ Siemens Healthineers | 大規模スキャン(60,000 台以上のホスト)、チェックポイント、静的バイナリ |
各サブディレクトリには、インストール、使用法、設定の詳細を記載した独自の README があります。
--effective-access-only モードOpenGraph を BloodHound にインポートしたら、以下のクエリで最も一般的なニーズをカバーできます。詳細については、各実装の README を参照してください。
MATCH (p)-[r]->(s:NetworkShareSMB)
WHERE (p)-[:CanDelete]->(s)
AND (p)-[:CanDsControlAccess]->(s)
AND (p)-[:CanDsCreateChild]->(s)
AND (p)-[:CanDsDeleteChild]->(s)
AND (p)-[:CanDsDeleteTree]->(s)
AND (p)-[:CanDsListContents]->(s)
AND (p)-[:CanDsListObject]->(s)
AND (p)-[:CanDsReadProperty]->(s)
AND (p)-[:CanDsWriteExtendedProperties]->(s)
AND (p)-[:CanDsWriteProperty]->(s)
AND (p)-[:CanReadControl]->(s)
AND (p)-[:CanWriteDacl]->(s)
AND (p)-[:CanWriteOwner]->(s)
RETURN p,r,s
MATCH x=(p)-[r:CanWriteDacl|CanWriteOwner|CanDsWriteProperty|CanDsWriteExtendedProperties]->(s:NetworkShareSMB)
RETURN x
MATCH p=(h:NetworkShareHost)-[:HasNetworkShare]->(s:NetworkShareSMB)-[:Contains*0..]->(f:File)
WHERE toLower(f.name) = toLower("flag.txt")
RETURN p
MATCH p=(h:NetworkShareHost)-[:HasNetworkShare]->(s:NetworkShareSMB)-[:Contains*0..]->(f:File)
WHERE toLower(f.extension) = toLower(".vmdk")
RETURN p
CanEffectiveRead / CanEffectiveWrite / CanEffectiveExecute エッジは、同じ SID が共有レベルと NTFS レベルの両方で一致する権限を持っている場合に Go 実装によって出力されます。つまり、SMB 経由で実際に許可されるアクセスです。
MATCH p=(principal)-[:CanEffectiveRead]->(f:File)
RETURN p
どちらの実装にもプルリクエストを歓迎します。新しい機能について先に議論したい場合は、イシューを開いてください。