
ネイティブ ADSI/COM インターフェースを使用した低観測性の Active Directory セキュリティ列挙ツール。.NET や PowerShell を使用せずに ACL、委任、信頼、ADCS、Kerberoast ターゲット、攻撃経路を列挙し、BloodHound 互換の出力を生成します。
# Kestrel
[](https://github.com/ssteelfactor-oss/Kestrel/actions/workflows/build.yml)
[](LICENSE)
[](#)
[](#)
> ### BloodHoundは道筋を示す。Kestrelはすでに内部にあるものを示す。
誰もが同じものをマッピングしている。攻撃経路、つまり*誰がDomain Adminに到達できるか*だ。それは正しい問いであり、それに答えるツールは優れている。しかし「誰が誰に到達できるか」というグラフは、ある種の問題群に対しては盲目だ。なぜなら、Active Directoryにおける最悪のもののいくつかは、経路などではないからだ。
それらは属性に溶接されたバックドアだ。パスワードがリセットされた後もずっと認証を続ける証明書。スキーマ自体に刻印されたアクセス許可で、これ以降に作成されるすべてのオブジェクトがそれを静かに継承する。誰かが密かに復元する権利を保持していた削除済みアカウント。単一の拒否読み取りACEによって列挙から隠されたオブジェクト。
**そのいずれもグラフのエッジではない。そのすべてが今、あなたのディレクトリに存在している。** Kestrelはそれを読み取る。ネイティブWindows呼び出し、通常のドメインユーザー権限を使用し、サーバーもPythonもエージェントも不要で、ドメインコントローラーへのフットプリントは極めて控えめで、[イベントごとに文書化されている](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)。
1つの`.exe`。1つのコマンド。以下すべて。
---
## あなたは間違った方向を見てきた
攻撃側のADエコシステム、すなわちSharpHound、impacket、Certipy、そしてその背後にあるグラフは素晴らしいものであり、すべて同じ表面、つまり到達可能性を見ている。Kestrelは、その表面では表現できない3つの次元を見る。
- **時間。** グラフはスナップショットだ。Kestrelはレプリケーションメタデータを読み取る。つまり、Tier-0属性が*いつ*変更されたか、*どのDC*がそれを発生させたか。昨夜付与されたDCSync権限は、何年も前から存在するものと同じ検出結果ではない。そしてそのうちの1つだけが、あなたが今まさに攻撃されていることを意味する。
- **エッジではなく、属性における永続化。** シャドウ資格情報、SID履歴、reanimate-tombstones、スキーマの`defaultSecurityDescriptor`バックドア、隠しオブジェクト、`OWNER RIGHTS`拒否ACE、AD FS DKMキー。グラフツールはこれらを収集しない。なぜなら描くべきエッジが存在しないからだ。
- **反転した防御態勢。** 「誰が攻撃できるか」ではなく、「何が保護されていないか」。サイロの外にあるTier-0アカウント、誰もタグ付けしなかったランダムなRIDを持つ同期アカウント、スプレーを決して抑制しないロックアウトポリシー。
Kestrelがグラフより速いという話ではない。グラフが問えない問いに答えるのだ。
---
## あらゆるADの罪を、1つのネイティブexeで
| 観点 | Kestrel が見つけるもの | フラグ |
|-----|-------------------|---------|
| **レプリケーションと委任** | DCSync 権限(*誰が*レプリケーションを実行できるか - 実際にレプリケーションを行わなくても)、非制約 / 制約 / RBCD / S4U 委任 | `--acl` · `--delegation` |
| **証明書の悪用** | AD CS ESC1–5/9、NTAuth ストア内の不正な CA、長期間有効な証明書による永続化、**AD FS DKM キーの ACL - Golden SAML の前提条件** | `--adcs` · `--adfs` |
| **属性への永続化** | シャドウクレデンシャル、SID 履歴の注入、**tombstone-reanimation 権限**、**隠しオブジェクト**、**スキーマ `defaultSecurityDescriptor` のバックドア**、孤立した `adminCount` | `--shadowcreds` · `--sidhistory` · `--acl` · `--schema` · `--adminsdholder` |
| **平文およびクラック可能な認証情報** | GPP の `cpassword`、SYSVOL 全体にわたる `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` |
| **考古学** | **孤立した危険な ACE**(削除されたプリンシパルが保持する権限 - SID が誰にも解決されない)、**古い特権アカウント**(忘れ去られ、過剰な権限を持ち、パスワードが古い) | `--archaeology` |
| **ドメインの堅牢化** | `dSHeuristics` の匿名 LDAP / AdminSDHolder 除外フラグ、Pre-Windows 2000 Compatible Access の広範なメンバーシップ | `--hardening` |
| **サービスの態勢** *(AD から読み取り、サービスへのパケット送信なし)* | **Exchange から DA への昇格と EOL**、**SCCM コンテナの乗っ取りとサイトマップ**、**ADIDNS ゾーンポイズニング**(Authenticated Users がレコードを作成可能) | `--exchange` · `--sccm` · `--dns` |
通常は十数個のスクリプトと 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
```
出力の壁ではない。重要な発見を順位付けし、それぞれに解決するためのコマンドを添える。
---
## 1つの exe。レッド、ブルー、パープル。
- **レッド / グレー** - グラフが見落とす永続化と委任を列挙し、BloodHound CE OpenGraph (`--opengraph`) へ直接エクスポートして既存のコレクションと統合する、あるいは任意のプリンシパルからピボットする (`--from`)。
- **ブルー** - 優先順位付けされた修復済みの発見リスト、先週のスナップショットに対する `--diff` で*変化した*ものを捉え、正確な検出フットプリントが公開されているツールによりホワイトリスト化して独自のアラートを調整できる。
- **パープル** - 双方が同じように読める単一の成果物。レッドが見つけ、ブルーが修正し、全員が同じ行番号を指す。
## 設計上検出可能
Kestrel は読み取り専用である。ディレクトリへの書き込みは一切行わず、レプリケーションも行わず、`SeSecurityPrivilege` を必要とせず、クラウドにも一切触れない。*誰が* DCSync を*できるか*を読むことは、ワイヤ上では DCSync を*行う*こととはまったく異なる - DRSUAPI もなく、レプリケーション署名の `4662` もない。実行するすべてのクエリと、生成できる(および生成できない)すべてのイベントは **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)** にカタログ化されている。監査ツールが防御者に捕まえ方を正確に教えることは矛盾ではない - それがまさに要点である。
---
## クイックスタート
**ビルドを取得する。** グリーンの CI 実行ごとに `Kestrel.exe` アーティファクトが公開される - [Actions タブ](https://github.com/ssteelfactor-oss/Kestrel/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`。
| フラグ | スキャン |
|------|------|
| `--acl` | ACL エッジ、DCSync 権限、所有者/継承/正規の衛生状態、隠しオブジェクト、reanimate-tombstones |
| `--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` / 可逆 / 説明の漏洩) |
| `--gmsa` | gMSA パスワード読み取り者列挙 |
| `--laps` | LAPS カバレッジ(レガシー + Windows LAPS 2023+) |
| `--stale` | `lastLogonTimestamp` による古いコンピューター |
| `--topology` | SPN デコードによるコンピュータートポロジー |
| `--adws` | ADWS エンドポイント検出(DC ごとに 9389/TCP) |
| `--archaeology` | 孤立した危険な ACE(死んだ所有者、生きた権限)+ 古い特権アカウント |
| `--hardening` | ドメインハードニングフラグ: `dSHeuristics` 匿名アクセス / SDProp 除外 + Pre-Windows 2000 Compatible Access |
| `--exchange` | Exchange 態勢: バージョン/EOL + Exchange から DA への昇格(ドメイン上の WriteDACL)*(サービス; オプトイン)* |
| `--sccm` | SCCM/MECM 態勢: `System Management` コンテナ ACL + 管理ポイント / サイトマップ *(サービス; オプトイン)* |
| `--dns` | AD 統合 DNS(ADIDNS): ゾーン CreateChild DACL + wpad/isatap/ワイルドカード + DnsAdmins *(サービス; オプトイン)* |
**サービス態勢**(`--exchange` · `--sccm` · `--dns`)はオプトインであり、`--all` には**含まれません**。レイヤー全体を実行するには `--services` を使用します。検出結果には **MITRE ATT&CK** テクニックタグが付与されるようになりました。
**出力と相互運用:** `--report <file>`(`.html` / `.json` / `.yaml`)· `--opengraph <file>`(BloodHound CE)· `--diff <snapshot.json>` · `--verbose`。
---
## 設計上の不変条件
これらは好みではなく約束です - 本番環境で安全に実行できる理由です。これらいずれかに違反することはセキュリティバグです([SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md) を参照)。
- **読み取り専用** - ディレクトリオブジェクトを作成、変更、削除することは決してありません。読み取り/アクセスイベントのみで、変更イベントはありません。
- **通常のドメインユーザー** - 特権昇格なし、`SeSecurityPrivilege` なし、DACL のみのセキュリティマスク。
- **レプリケーションなし** - 誰が DCSync *できるか* を検出しますが、DRSUAPI 自体を呼び出すことは決してありません。
- **ディレクトリと SYSVOL のみ** - メンバーホストに対する RPC/SMB は行いません。
- **回避なし** - クエリの断片化、タイミング操作、ログ改ざんは行いません。[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md) を参照。
- **オンプレミスのみ** - Entra / Graph / クラウド呼び出しは行いません。ハイブリッドが *AD 内に* 残すフットプリントを監査します。
- **ネイティブかつ自己完結** - 純粋な C、サードパーティ依存ゼロ、単一の `.exe`。
---
## ロードマップ
| バージョン | ステータス | マイルストーン |
|---------|:------:|-----------|
| 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** | ✅ | **パッシブなサービス姿勢レイヤー: Exchange · SCCM · ADIDNS · ドメインハードニング · MITRE ATT&CK タグ** |
| **v1.2** | ✅ | **AD 考古学: 孤立した危険な ACE + 古い特権アカウント** |
| v1.3 | 🔲 | ハイブリッドの継ぎ目 (Entra Connect / Seamless SSO) · nTDSConnection / DCShadow の前提条件 |
---
## ドキュメント
- **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)** - 各スキャンが残す正確な LDAP / SYSVOL トレースと、それが生成する (そして生成できない) DC イベント。
- **[SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)** - 報告、スコープ、および検証可能な保証としての設計不変条件。
- **[LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE)** - Apache 2.0。
## 関連
親プロジェクト: [NetEnum](https://github.com/ssteelfactor-oss/NetEnum) - ADSI / COM / LDAP による AD 列挙。
## 作者
[@ssteelfactor-oss](https://github.com/ssteelfactor-oss) - セキュリティリサーチおよび COM / Windows 内部構造。
## ライセンス
**Apache License 2.0** の下でライセンスされています - [LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE) を参照してください。無保証で「現状のまま」提供されます。監査を許可されているディレクトリに対してのみ実行してください。