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

转: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“。

(2)溢出堆

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

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

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

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

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

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

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

(6)实现代码执行

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

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

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

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

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

发送payload完成构造

0x03 exploit利用

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

(1)弹出计算器后闪退

(2)直接崩溃

(3)利用成功

对于作者开源的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

vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用的更多相关文章

  1. VMware 虚拟机逃逸漏洞

    所谓虚拟机逃逸(Escape Exploit),指的是突破虚拟机的限制,实现与宿主机操作系统交互的一个过程,攻击者可以通过虚拟机逃逸感染宿主机或者在宿主机上运行恶意软件. 针对 VMware 的虚拟机 ...

  2. vmware漏洞之二——简评:实战VMware虚拟机逃逸漏洞

    下文取自360,是vmware exploit作者自己撰写的.本文从实验角度对作者的文章进行解释,有助于学习和理解.文章虚线内或红色括号内为本人撰写. ------------------------ ...

  3. VENOM cve-2015-3456 Qemu 虚拟机逃逸漏洞POC

    #include <sys/io.h> int main() { int i ; iopl(3); outb(0x8e, 0x3f5); outb(0x41, 0x3f5); outb(0 ...

  4. GitHub现VMware虚拟机逃逸EXP,利用三月曝光的CVE-2017-4901漏洞

    今年的Pwn2Own大赛后,VMware近期针对其ESXi.Wordstation和Fusion部分产品发布更新,修复在黑客大赛中揭露的一些高危漏洞.事实上在大赛开始之前VMware就紧急修复了一个编 ...

  5. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  6. 【转载】利用一个堆溢出漏洞实现 VMware 虚拟机逃逸

    1. 介绍 2017年3月,长亭安全研究实验室(Chaitin Security Research Lab)参加了 Pwn2Own 黑客大赛,我作为团队的一员,一直专注于 VMware Worksta ...

  7. vmware漏洞之一——转:利用一个堆溢出漏洞实现VMware虚拟机逃逸

    转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 小结: vmware通过Backd ...

  8. RunC容器逃逸漏洞席卷业界,网易云如何做到实力修复?

    近日,业界爆出的runC容器越权逃逸漏洞CVE-2019-5736,席卷了整个基于runC的容器云领域,大量云计算厂商和采用容器云的企业受到影响.网易云方面透露,经过技术团队的紧急应对,网易云上的容器 ...

  9. Vmware快速安装linux虚拟机(SUSE)

    安装环境:Vmware 11.SUSE11 64位 vmware快速安装linux虚拟机的过程还是比较简单的,步骤如下: 1.点击文件,新建虚拟机. 2.选择典型安装. 3.在红框中选择想要安装的虚拟 ...

随机推荐

  1. java通过各种类型驱动连接数据库

    常见数据库驱动实现类:JDBC-ODBC:sun.jdbc.odbc.JdbcOdbcDriver Oracle:oracle.jdbc.driver.OracleDriver MySQL:com.m ...

  2. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  3. Enterprise Architect 13 : 设置默认代码环境

    设置默认代码环境: Configure -> Options -> Source Code Engineering -> Default Language For Code Gene ...

  4. 【hdu1828/poj1177】线段树求矩形周长并

    题意如图 题解:这题非常类似与矩形面积并,也是维护一个被覆盖了一次以上的线段总长. 但是周长要算新出现的,所以每次都要和上一次做差求绝对值. x轴做一遍,y轴做一遍. 但是有个问题:矩形边界重合的时候 ...

  5. Html5学习2(Html表格、Html列表、Html5新元素、Canvas (坐标、路径、画圆、文本、渐变、图像))

    Html表格 1.表格中的表头:<th></th>.其中表头部分字体加粗,颜色深绿色 <h4>水平标题:</h4> <table border=& ...

  6. setTimeout()和setInterval()方法的区别

    setTimeout(); //5秒后执行yourFunction(),只执行一次 setInterval(); //每隔5秒执行一次 1.setTimeout(funhander,time)的作用是 ...

  7. xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

    问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了.但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高.用RandomFore ...

  8. 网络协议之HTTP协议

    HTTP协议详解(真的很经典) 转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HT ...

  9. Spark-2.3.2【SparkStreaming+SparkSQL-实时仪表盘应用】

    应用场景:实时仪表盘(即大屏),每个集团下有多个mall,每个mall下包含多家shop,需实时计算集团下各mall及其shop的实时销售分析(区域.业态.店铺TOP.总销售额等指标)并提供可视化展现 ...

  10. MVC 从控制器将数据对象赋值给前端JS对象

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...