
ネイティブ ADSI/COM インターフェースを使用した低観測性の Active Directory セキュリティ列挙ツール。.NET や PowerShell を使用せずに ACL、委任、信頼、ADCS、Kerberoast ターゲット、攻撃経路を列挙し、BloodHound 互換の出力を生成します。
BloodHoundは経路を示す。Kestrelは、内部にすでに存在するものを示す。
誰もが同じものをマッピングする。攻撃経路、すなわち 誰がDomain Adminに到達できるか だ。それは正しい問いであり、それに答えるツールも素晴らしい。しかし「誰が誰に到達できるか」というグラフは、ある種の問題全体に対して盲目だ。Active Directoryにおける最悪の脅威のいくつかは、経路ではまったくないのだから。
それらは属性に溶接されたバックドアだ。パスワードがリセットされた後も長く認証し続ける証明書。スキーマ自体に刻印された権限で、以後作成されるすべてのオブジェクトが黙って継承する。誰かが静かに復元権限を保持し続けた削除済みアカウント。単一のdeny-read ACEによって列挙から隠されたオブジェクト。
それらのどれもグラフのエッジではない。そしてすべてが、今この瞬間もあなたのディレクトリの中に存在している。 Kestrelはそれを読み取る。ネイティブなWindows呼び出しと通常のドメインユーザー権限だけで。サーバーも、Pythonも、エージェントも不要で、ドメインコントローラ上のフットプリントはイベント単位で文書化されるほどに抑制されている。
1つの.exe。1つのコマンド。以下がすべて。
攻撃的なADエコシステム(SharpHound、impacket、Certipy、そしてそれらの背後にあるグラフ)は素晴らしい。しかし、それらはすべて同じ表面、すなわち到達可能性だけを見ている。Kestrelは、その表面では表現できない3つの次元を見る。
defaultSecurityDescriptorバックドア、隠しオブジェクト、OWNER RIGHTSのdeny-ACE、AD FSのDKMキー。グラフツールはこれらを収集しない。描くべきエッジがないからだ。Kestrelがグラフより速いという話ではない。Kestrelは、グラフが問うことすらできない質問に答えるのだ。
通常なら十数本のスクリプトと2つの言語に分散する20以上のチェックが、ここでは1つのバイナリに集約される。そして最後には、重大度順に並べられた単一の判定結果で締めくくられる。
Kestrel.exe --all --report audit.html
すべてを実行して、完全なHTMLレポートを取得する。そしてコンソールの一番最後に、本当に重要な部分が表示される:
═══ Kestrel - Prioritized Findings ═══
CRITICAL DCSync CORP\svc_sql - non-default principal can replicate directory changes (DCSync)
→ fix: remove GetChanges/GetChangesAll from the principal on the domain head (dsacls) unless it is a DC
CRITICAL AD FS CN=... - read access to the DKM key (Golden SAML precondition)
→ fix: remove non-default read ACEs on the DKM object (dsacls) and rotate the token-signing certificate
HIGH Persistence CN=... - object hidden from enumeration via a broad deny-read ACE
→ fix: inspect the hidden object and remove the broad deny-read ACE (dsacls)
[=] 2 critical · 1 high · 0 medium · 0 low
出力の羅列ではない。重要な発見事項だけがランク付けされ、それぞれに修正コマンドが付いている。
--opengraph)にエクスポートして既存のコレクションと融合させるか、任意のプリンシパルからピボットする(--from)。--diffで変化したものを捉える。さらに、正確な検出フットプリントが公開されているため、ホワイトリスト登録や、それに合わせた独自アラートの調整ができる。Kestrelは読み取り専用だ。ディレクトリに書き込むことも、レプリケーションすることも、SeSecurityPrivilegeを必要とすることも、クラウドに触れることもない。ワイヤ上では、誰がDCSyncできるかを読み取ることは、DCSyncを実行することとはまったく似ていない。DRSUAPIも、レプリケーション署名4662も発生しない。実行するすべてのクエリと、生成できる(そしてできない)すべてのイベントは、**FOOTPRINT.md**にカタログ化されている。検出方法を防御側に正確に伝える監査ツールは矛盾ではない。それこそが本質だ。
ビルドを入手する。 CIが成功するたびにKestrel.exeの成果物が公開される。Actionsタブからダウンロードするだけで、ツールチェーンは不要だ。
自分でビルドする。 Visual Studio(v143+)またはMSBuild:
git clone https://github.com/ssteelfactor-oss/Kestrel.git
cd Kestrel
msbuild Kestrel.vcxproj /p:Configuration=Release /p:Platform=x64
Pure C、サードパーティ依存ゼロ。/MTでビルドすれば単一の自己完結型実行ファイルになる。ドメイン参加済みホストに置いて、通常のユーザーとして実行するだけだ。
実行する。
Kestrel.exe --all --report audit.html # everything, HTML report + ranked findings
Kestrel.exe --acl --adcs --adfs # pick specific checks
Kestrel.exe --paths --from CORP\jdoe # attack paths from one principal
Kestrel.exe --all --diff last-week.json # what changed since the last snapshot
Kestrel.exe --all --opengraph graph.json # export to BloodHound CE OpenGraph
--allで全スキャンを実行するか、任意のサブセットを選択する。完全なヘルプ: Kestrel.exe --help
出力と相互運用: --report <file>(.html / .json / .yaml) · --opengraph <file>(BloodHound CE) · --diff <snapshot.json> · --verbose。
これらは好みではなく約束だ。本番環境で実行しても安全な理由そのものである。このいずれかを破ることはセキュリティバグと見なされる(SECURITY.mdを参照)。
SeSecurityPrivilegeなし、DACLのみのセキュリティマスク。.exe。親プロジェクト: NetEnum - ADSI / COM / LDAPによるAD列挙。
@ssteelfactor-oss - セキュリティリサーチとCOM / Windows内部構造。
Apache License 2.0の下でライセンスされている。LICENSEを参照。無保証で「現状のまま」提供される。監査を許可されたディレクトリに対してのみ実行すること。
| 罪 | Kestrelが見つけるもの | フラグ |
|---|
| レプリケーションと委任 | DCSync権限(レプリケーションを実行することなく、誰がレプリケーションできるか)、制約なし/制約付き/RBCD/S4U委任 | --acl · --delegation |
| 証明書の悪用 | AD CS ESC1–5/9、NTAuthストア内の不正CA、長期間有効な証明書による永続化、AD FS DKMキーACL - Golden SAMLの前提条件 | --adcs · --adfs |
| 属性内の永続化 | シャドウクレデンシャル、SID履歴の注入、トゥームストーン復活権限、隠しオブジェクト、スキーマのdefaultSecurityDescriptorバックドア、孤立したadminCount | --shadowcreds · --sidhistory · --acl · --schema · --adminsdholder |
| 平文・クラック可能な認証情報 | SYSVOL全体のGPP cpassword、unattend/sysprepシークレットとスクリプトパスワード、Kerberoast可能・AS-REP-roast可能なアカウント、LAPSのカバレッジギャップ | --gpp · --roast · --laps |
| クロスドメインとハイブリッド | 特権グループ内の外部プリンシパル、Tier-0としてタグ付けされたEntra Connect同期アカウント、信頼の状態、MachineAccountQuota経由で作成されたマシンアカウント(mS-DS-CreatorSID) | --groups · --trust · --machines |
| 状態と偵察 | パスワード/PSOポリシー、krbtgtの経過期間、LLMNR / NBT-NS / WDigest / NTLMv1のGPO設定、gMSAリーダー、非アクティブなコンピュータ、委任トポロジ | --pwdpolicy · --policy · --gmsa · --stale |
| フラグ | スキャン内容 |
|---|
--acl | ACLエッジ、DCSync権限、所有者/継承/カノニカルハイジーン、隠しオブジェクト、トゥームストーン復活 |
--groups | 推移的な特権メンバーシップ+外部セキュリティプリンシパル |
--delegation | 制約なし/制約付き/RBCD/S4U2Self |
--paths / --from | Tier-0への攻撃経路分析(任意で特定のプリンシパル起点) |
--adcs | AD CS証明書テンプレート/CA監査(ESC1–5/9)+NTAuthストア+有効性 |
--adfs | AD FS DKMキーACL(Golden SAMLの前提条件) |
--schema | スキーマのdefaultSecurityDescriptorバックドア監査 |
--trust | ドメイン/フォレストの信頼状態 |
--machines | MachineAccountQuota経由で作成されたマシンアカウント(mS-DS-CreatorSID) |
--roast | Kerberoast可能+AS-REP-roast可能なアカウント |
--shadowcreds | シャドウクレデンシャル(msDS-KeyCredentialLink) |
--sidhistory | sIDHistoryの注入(特権/外部) |
--adminsdholder | 孤立したadminCount=1オブジェクト |
--gpp | SYSVOLシークレットスイープ - GPP cpassword、unattend、スクリプト認証情報 |
--gpolateral | GPOローカルグループ→横移動エッジ(AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
--policy | GPOセキュリティポリシー(LLMNR / NBT-NS / WDigest / NTLMv1) |
--pwdpolicy | パスワード/PSOポリシー · krbtgtの経過期間 · MachineAccountQuota |
--hygiene | 認証情報ハイジーン(PASSWD_NOTREQD / DONT_EXPIRE / 可逆暗号化 / descriptionからの漏えい) |
--gmsa | gMSAパスワードリーダーの列挙 |
--laps | LAPSカバレッジ(レガシー+Windows LAPS 2023+) |
--stale | lastLogonTimestampによる非アクティブなコンピュータ |
--topology | SPNデコードによるコンピュータトポロジ |
--adws | ADWSエンドポイント検出(各DCの9389/TCP) |
| バージョン | 状態 | マイルストーン |
|---|
| v0.13 | ✅ | 参入条件の状態 |
| v0.14 | ✅ | ACLの深さ+横移動エッジ |
| v0.15 | ✅ | ACL構造監査(ADelegクラス) |
| v0.16 | ✅ | ステルス永続化+SYSVOL / ADCSの深掘り |
| v0.17 | ✅ | クロスドメイン+ハイブリッドフットプリント |
| v0.18 | ✅ | クエリハイジーン+誠実なフットプリント |
| v1.0 | ✅ | 機能完成: 優先順位付き発見事項+修復、CI、Apache 2.0 |
| v1.1 | 🔲 | 時系列タイムライン · 不正DC / DCShadow検出 · ADIDNS · 防御態勢パス |