深入解读MS14-068漏洞:微软精心策划的后门?

时间:2022-04-26
本文章向大家介绍深入解读MS14-068漏洞:微软精心策划的后门?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

0x0 背景

初次认识该漏洞是在FreeBuf上对该漏洞的预警《漏洞预警:系统权限提升漏洞(CVE-2014-6324)影响全版本Windows服务器》:

微软今天(2014-11-18)发布了一个紧急补丁,修复了一个影响全部版本Windows服务器的严重漏洞。今天发布的MS14-068漏洞补丁用于解决Microsoft Windows Kerberos KDC漏洞(CVE-2014-6324),该漏洞允许黑客提升任意普通用户权限成为域管理员(Domain Admin)身份。也就是说,你在一台普通域用户的机器上利用这个漏洞,那么这个域用户就变成域管理员权限,然后,该域用户就可以控制整个域的所有机器了。http://www.freebuf.com/articles/system/52127.html

那么,问题来了,该漏洞的威力真的有这么大吗?

网上出现了Github上爆出的该漏洞的Python利用程序,Python Kerberos Exploitation Kit,也就是PyKek,当然,其它站点也都开始了转发。经过测试,Win7的普通域用户运行该漏洞程序确实能够成为域管理员权限。但网上大家的测试都是在域用户的本地账户中才能测试成功。

为什么Windows关于MS14-068的公告板中并没有提出这一点?按道理来说,越是有限制的漏洞利用对软件开发人员越是有利的,漏洞利用的机会越少,他们受到的谴责就会越少。

那么,问题又来了,真的只能用域用户的本地账户漏洞才能利用成功吗?

自从Freebuf发布该漏洞预警后,再也没看到另有分析文章出现,甚至也没有POC,这让我为心目中伟大的Freebuf捉急哇,心情低落到极点,所以,自己决心从头开始研究该漏洞。

这样的话,问题又来了,作为不懂Kerberos协议的小白,这个漏洞到底是怎么产生的?

带着种种疑问,我开始了分析之旅,时隔半月,分析完成后,没想到却发现了一个天大的秘密,我从下面几点向大家分析一下关于这个漏洞的方方面面,来揭示这个笔者认为有人精心策划的漏洞。

0x1 Python版PoC的测试利用

首先网上的Python版PyKek,搭建域环境、Python环境,对该漏洞进行了测试:

(1)测试环境

目的:将普通域用户权限提升为域控权限(漏洞利用后,net use \swg.server.comc$可以直接访问域控的网络资源)

(2)测试步骤

A.利用域账户domainuser/Dom12345登录普通域机器Win7,获得该域账户的域SID:

B.以本地账户test/123456登录普通域机器Win7,运行PyKek漏洞利用程序:

此时在C:Userstest文件件会产生MIT格式的TGT文件TGT_domainuser@SERVER.COM.ccache

C.利用mimikatz工具将得到的TGT_domainuser@SERVER.COM.ccache写入内存,创建缓存证书:

利用klist命令能够看到mimikatz创建缓存证书前后的区别。

创建缓存证书之前:

创建缓存之后:

D. 在普通域机器Win7的本地账户中执行:

你会惊奇地发现,不用提供Win2003域控的账号密码就直接可以连接到其C盘,也就是说,现在可以访问Win2003域控机器C盘:

正如宣称的那样,漏洞成功利用后,域用户在不知道域控密码的情况下,可以随意访问域控上的资源,怪不得大家都说,有了这个漏洞,再也不用狂扫密码了。

这是网上普遍转发的一种漏洞利用姿势,需要注意的是,域SID是以域用户登录Win7域机器获得的,而漏洞利用则是在该域机器的本地账户下才能测试成功。如果搭建了测试环境,你会发现,“先用域账户获得SID,然后不得不再登录本地账户测试漏洞”这一过程是多么繁(dan)琐(teng)。

当然,后面会讨论为什么在域账户下无法利用成功,并提出一种绕过方法。

漏洞利用就是这样的,接下来我们分析一下这个漏洞到底是怎样产生的。

0x2 关于Kerberos协议

在谈MS14-068漏洞之前,有必要先了解一下Kerberos协议。

Kerberos协议是一种基于第三方可信主机的计算机网络协议,它允许两个实体之间在非安全网络环境(可能被窃听、被重放攻击)
下以一种安全的方式证明自己的身份。

下面我们从Kerberos是如何设计出来的来学习该协议的原理。

这个协议解决的根本问题,假设A和B共有一个秘密,在一个非安全网络环境中,A怎样才能向B证明自己就是A。

最简单的方式就是,A直接将秘密发送给B,由B来判断这个秘密的真伪。但在非安全网络环境中,秘密可能会被窃听或中间人攻击,所以这种方式不可取。

接下来考虑的是,A用秘密作为密钥加密一段文字生成一段密文,然后将文字本身和密文一起发给B,B接收后用秘密解密密文得到文字,然后和接收的文字对比,如果两者一致,那么也能证明秘密的正确性,从而也能验证A的身份。

但如果该认证请求被窃听,攻击者能得到加密后密文和加密前的明文,只要时间允许,总能推导出密钥的数值,也就是秘密肯定会被窃取。所以密码界有个规定,长期存在的密钥不适合在网络中传输,否则总会有被窃取的风险。

不使用长期存在的密钥,那使用短期存在的密钥进行验证应该是没问题的,关键是,谁来提供这个短期存在密钥给A和B?于是就出现了第三方可信机构KeyDistribution Center,KDC。

…………

[本文作者walkerfuz,本文属FreeBuf黑客与极客(FreeBuf.COM)原创文章奖励计划,未经允许禁止转载]