vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE--4901)Exploit代码分析与利用

时间:2024-05-22 20:27:26

本文简单分析了代码的结构。有助于理解。

转:http://www.freebuf.com/news/141442.html

0×01 事件分析

2017年7月19 unamer在其github上发布了一个针对Vmware的虚拟机逃逸的exploit源码,使用C++编写。据称影响了Vmware Workstation 12.5.5以前的版本,并给出了演示过程,实现了从虚拟机到宿主机器的代码执行,弹出了熟悉的计算器。该代码开源后,只需要将执行计算器部分的shellcode替换成其他具有恶意攻击的代码,可以造成很大的危害。

通过代码梳理,发现该exploit针对的漏洞就是三月份被曝光的CVE-2017-4901。关于该漏洞,长亭安全研究实验室(Chaitin Security Research Lab)发布了其2017年3月参加Pwn2Own 黑客大赛关于这个Vmware漏洞的挖掘与利用的很多细节 。

 

而该漏洞的原理与2016年11月在360PwnFest中展示的CVE-2016-7461这个漏洞的原理也是一致的,均是出在drag-and-drop函数和copy-and-paste函数中,只不过该漏洞是出现在version4中,而当前CVE-2017-4901出现在Version 3这个版本中。Vmware给了关于其的公告:https://www.vmware.com/security/advisories/VMSA-2016-0019.html 。

 

0×02 exploit代码分析

 

根据exploit的代码,按照步骤分析漏洞的整个利用过程。

 

(1)设置 version 3.0 版本

因为该漏洞存在于DnD和CnP机制的Version 3中,故设置DnD与CnP均为version3的版本。使用的命令分别“tool.capability.dnd_version 3“和tools.capability.copypaste_version 3“。

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

(2)溢出堆

 

为了达到代码执行,需要溢出堆中对象函数指针或者虚表指针。

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

 

(3)创建Version 3 的DnD和CnP对象

 

需要通过查询DnD和CnP的版本才能使设置生效,需要发送的命令分别为:vmx.capability.dnd_version 和vmx.capability.copypaste_version,这两个命令均会检查 DnD/CnP 机制的版本,同时根据版本会创建两个对象,DnD和CnP,其中version3对应的C++对象大小为0xA8。

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

(4)覆盖c++对象虚表地址

 

根据C++对象的大小进行多次越界写内存。

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

(5)通过信息泄露绕过ASLR

 

通过命令info-set guestinfo.KEY VALUE 和info-get guestinfo.KEY 来设置和获取数据,通过这两个命令后面的值来泄露堆上的对象,从而获取对象的虚表地址,从而得到vmware-vmx的地址。

 

 vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

 

(6)实现代码执行

 

根据信息泄露判断溢出的是哪一种C++对象,DnD还是CnP。根据判断类型,分别利用ROP绕过DEP,拼接shellcode后完成exploit的构造。

 

CnP类型对象溢出利用构造:

 

覆盖对象虚表地址,指向伪造的虚表,然后发送CP命令,触发虚函数调用。

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

其中 SetGlobalPointer 函数发送unity.window.contents.start命令,通过在命令中指定参数的宽度和高度,写入一个64位的堆栈迁移gadget地址。

 

 vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

 

DnD类型对象溢出利用构造:

 

 vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

 

发送payload完成构造

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

0x03 exploit利用

 

作者在其github上提到,因为没有对Windows LFH随机化处理好,所以并没有实现完美的利用。在测试过程中虚拟机确实出现了利用不稳定的情况:直接崩溃或者弹出计算机后虚拟机退出。测试版本:Vmware Workstation Pro 12.5.1 Build build-4542065。

 

(1)弹出计算器后闪退

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

 vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

 

(2)直接崩溃

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

(3)利用成功

 

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用 

 

对于作者开源的exploit代码来看,结构还是很清晰的,对于要修改后利用,主要是两个方面,增加exploit的稳定性以及 shellcode 功能部分的修改。

 

0×04 缓解措施

 

目前很多的企业、*都使用了Vmware的产品,在虚拟机与宿主机之间的这一“虚拟与现实”之间的安全隔离也不再坚不可摧了,目前该漏洞影响Vmware Workstation Pro/Player和Vmware Fusion Pro/Fusion的较低版本,在高版本中已经修复。对于使用Vmware的用户可以通过【帮助】->【关于Vmware Workstation】来查看版本信息,若是版本低于12.5.5,请及时升级;建议升级到当前最新的版本12.5.7。

 

0x05 参考文献

 

https://github.com/unamer/vmware_escape

 

https://zhuanlan.zhihu.com/p/27733895?utm_medium=social&utm_source=wechat_timeline&from=timeline&isappinstalled=1