MS14-068原理浅析
漏洞简介
影响范围:全版本的Windows服务器
漏洞危害:允许任意域成员提权为域管权限
利用条件:
1 | 1.域控没有打KB3011780补丁 |
利用工具:
kekeo 下载地址:https://github.com/gentilkiwi/kekeo/
PyKEY 工具包 下载地址:https://github.com/mubix/pykek
Ms14-068.exe 下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
mimikatz 下载地址:https://github.com/gentilkiwi/mimikatz/releases/
msf中的模块 use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
cs中的插件
漏洞原理
主要是由于Kerberos协议中的认证问题。这里对Kerberos协议不作深入探讨。
下图是Kerberos协议的认证流程图
搭配这张图更容易理解
Kerberos认证流程大致是这样
AS_REQ: client向KDC的AS请求AS_REQ,请求时带上自己的凭据:client的hash加密的时间戳以及其他一些信息
AS_REP: AS收到信息,去询问AD是否有这个用户,有就拿出NTLM-hash对AS_REQ请求中加密的时间戳进行解密,解密成功,就会返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含client的sid,client所在的组
TGS_REQ: Client凭借TGT票据向KDC中的TGS发起针对特定服务的TGS_REQ请求
TGS_REP: TGS使用krbtgt hash解密,结果正确,返回 Server hash加密的TGS票据(这一步没有验证client有没有访问服务的权限,只要TGT正确,就返回TGS票据)
AP_REQ: Client拿着TGS票据去请求服务
AP_REP: server使用自身的hash解密TGS。解密成功,server会拿着PAC去询问DC,该用户是否具有访问权限,DC拿到PAC后解密,获取client的sid以及所在的组信息,再根据该服务的ACL,判断client是否具有访问server的权限。通过认证后server 将返回最终的AP_REP并与client建立通信 (有些服务并没有验证PAC这一步,这也是白银票据能成功的前提,因为就算拥有用户hash,可以制作TGS,也不能制作PAC,PAC当然也验证不成功,但是有些服务不去验证PAC,这是白银票据成功的前提)
至此,Kerberos协议认证基本结束。只是大概讲一下认证流程,很多细节认证没有讲。
关键来了,第4步中没有验证client是否具有访问server的权限,在上述认证流程中,只要用户的hash正确,就可以拿到TGT,继而拿到TGS去访问服务。就是说上面的认证只解决了“Who am I”的问题,而没有解决 “ What can I do” 的问题
因此微软引进了 PAC
PAC包含Client的User的SID、Group的SID。PAC决定了Client的组属性,即决定了Client的权限PAC为了保证自身的合法性,还包含2个签名,Key为krbtgt的NTLM hash,签名的内容除了User SID、Group SID外,还有其他部分PAC作为TGT的一部分,是加密的,key为krbtgt的NTLM hash。Client向KDC的AS模块发起认证请求,AS返回TGT时,会根据Client所在的组,生成PAC,包含Client的User SID、Group SID,以及用于确保PAC不被篡改的2个签名
PAC 是用来验证 Client 的访问权限的,它会被放在 TGT 里发送给 Client,然后由 Client 发送给 TGS。但也恰恰是这个 PAC 造成了 MS14-068 这个漏洞。
更多关于PAC的介绍参考链接:
https://docs.microsoft.com/en-us/previous-versions/aa302203(v=msdn.10)#security-considerations
该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的PAC 。
漏洞三个成因:
KDC对PAC进行验证时,对于PAC尾部的签名算法,虽然原理上规定必须是带有Key的签名算法才可以,但微软在实现上,却允许任意签名算法,只要客户端指定任意签名算法,KDC服务器就会使用指定的算法进行签名验证。因此伪造的任意内容都可以是合法的,直接加上内容的MD5值作为签名即可
PAC没有被放在TGT中,放在其它地方。KDC在仍然能够正确解析出没有放在TGT中的PAC信息,PAC必须是密文,经过Key加密的KDC会从Authenticator中取出来subkey,把PAC信息解密并利用客户端设定的签名算法验证签名
KDC验证缺少PAC的TGT成功后,再验证不在TGT中 的PAC的合法性。如果2个均验证成功,KDC把PAC中的User SID、Group SID取出来,重新使用进行签名,签名算法和密钥与设置inclue-pac标志位为TRUE时一模一样。将新产生的PAC加入到解密后的TGT中,再重新加密制作全新的TGT发送给Client,不是TGS
至此,漏洞的原理大致了解,普通用户可以通过改变 PAC 的 TGT 来伪造票据获得管理员权限。
编写exp脚本的话无非就是按照这个思路,当然,我是废物,不会写exp,这里就画个大饼。
生成一张TGT票据(此时没有伪造的PAC,为了给伪造的PAC腾出位置),伪造PAC,向TGS请求,此时返回的TGS票据(ST)里面就含有伪造的PAC
简单分析到这,以后再补充.
如果哪里有错误,请大佬与我邮箱联系。
Peace