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

针对 VMware 的虚拟机逃逸 exploit 源码实现了从虚拟机到宿主机器的代码执行,弹出了熟悉的计算器。该开源代码,只需要将执行计算器部分的 shellcode 替换成其他具有恶意攻击的代码,就可以造成很大的危害。

影响范围

  • VMware Workstation Pro / Player(12.5.5 之前版本)
  • VMware Fusion Pro / Fusion

漏洞分析

  1. 首先分析漏洞存在于 DnD 和 CnP 机制的 Version3 中,故设置 DnD 与 CnP 均为 version3 的版本。使用的命令分别为「tool.capability.dnd_version 3」和「tools.capability.copypaste_version 3」。
  2. 为了达到代码执行,需要溢出堆中对象函数指针或者虚表指针。
  3. 需要通过查询DnD和CnP的版本才能使设置生效,需要发送的命令分别为:「vmx.capability.dnd_version」和「vmx.capability.copypaste_version」,这两个命令均会检查 DnD/CnP 机制的版本,同时根据版本会创建两个对象,DnD 和 CnP,其中 version3 对应的 C++ 对象大小为 0xA8。
  4. 根据 C++ 对象的大小进行多次越界写内存。
  5. 通过命令 info-set guestinfo.KEY VALUE 和 info-get guestinfo.KEY 来设置和获取数据绕过 ASLR,通过这两个命令后面的值来泄露堆上的对象,从而获取对象的虚表地址,从而得到 vmware-vmx 的地址。
  6. 我们根据信息泄露判断溢出的是哪一种 C++ 对象,是 DnD 还是 CnP。根据判断类型,分别利用 ROP 绕过 DEP,拼接 shellcode 后完成 exploit 的构造。CnP 类型对象溢出利用构造:覆盖对象虚表地址,指向伪造的虚表,然后发送 CP 命令,触发虚函数调用,实现命令执行。

    SetGlobalPointer 函数发送 「unity.window.contents.start」 命令,通过在命令中指定参数的宽度和高度,写入一个 64 位的堆栈迁移 gadget 地址。然后 DnD 类型对象溢出利用构造,最终发送 payload 完成构造!

逃逸演示

稳定性讨论

因为 Windows LFH 堆的随机化,当前的 exploit 无法做到 100% 成功率。不过可以尝试下列方法来提高成功率:

  • 观察 0xA8 大小的内存分配,考虑是否可以通过一些 malloc 和 free 的调用来实现确定性的 LFH 分配,参考这里和这里。
  • 寻找堆上的其他 C++ 对象,尤其是那些可以在堆上喷射的
  • 寻找堆上其他带有函数指针的对象,尤其是那些可以在堆上喷射的
  • 找到一个独立的信息泄漏漏洞

项目地址:https://github.com/unamer/vmware_escape

VMware 虚拟机逃逸漏洞的更多相关文章

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

    本文简单分析了代码的结构.有助于理解. 转:http://www.freebuf.com/news/141442.html 0×01 事件分析 2017年7月19 unamer在其github上发布了 ...

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

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

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

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

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

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

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

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

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

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

  7. VBox&vmware虚拟机安装Linux及Linux基础入门学习

    VBox&vmware虚拟机安装Linux及Linux基础入门学习 通过VMware workstation安装Linux 在安装虚拟机之前,我特意上网搜索了一下目前常使用的虚拟机软件,了解了 ...

  8. 怎样在VMware虚拟机中使用安装并设置Ubuntu系统

    1 2 3 4 5 6 7 分步阅读 Ubuntu 系统是一款优秀的.基于GNU/Linux 的平台的桌面系统. 当然,目前为止很多应用程序还完全不能允许运行在 Ubuntu 系统上,而且 Ubunt ...

  9. Vmware虚拟机安装Ubuntu并设置root登陆

    主机操作系统是win7.在Ubuntu官网下好系统镜像.iso文件,安装好Vmware workstation软件 1 安装Ubuntu系统到Vmware虚拟机: 注意下面这步是无法直接设置账号为ro ...

随机推荐

  1. 解决WebStorme点击谷歌浏览器图标无反应问题

    解决思路: 在设置中重新设置谷歌浏览器路径,一定要选中到谷歌浏览器安装目录的Chrome.exe文件,选中后记得apply. 设置步骤: file->seeting->tools-> ...

  2. Atlas 2.1.0 实践(2)—— 安装Atlas

    在完成Atlas编译以后,就可以进行Atlas的安装了.Atlas的安装主要是安装Atlas的Server端,也就Atlas的管理页面,并确保Atlas与Kafka Hbase Solr等组件的集成. ...

  3. 什么是Solon?

    Solon是参考Spring boot 和 Javalin 而设计.吸取了两者的的优点,避开了很多繁重的设计,使其支持http, websocket, socket 三种通讯信号接入.Solon 2M ...

  4. mysql explain参数详解

    主要对几个参数做一些记录 type:显示的是访问类型 从最好到最差的连接类型为:const.eq_reg.ref.range.index和ALL 至少要达到range,基本是ref  最好是const ...

  5. 负载均衡各个算法JAVA诠释版

    00 前言 首先给大家介绍下什么是负载均衡(来自百科) 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽.增加 吞吐量.加强网络数据处理能力.提高网络的灵活 ...

  6. js--数组的every()和some()方法检测数组是否满足条件的使用介绍

    前言 阅读本文之前先来思考一个问题,如何如实现判断一个数组中是否存在满足条件的元素,如何去判断数组中是否全部元素都满足判断条件,这里可能能想到使用for循环遍历数组,if()判断每一项是否符合条件,同 ...

  7. UML第三次结对作业

    这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/homework/11274 这个作业的目标 <学会使用专业的建模工具> 队 ...

  8. Apache下的配置文件httpd.conf、httpd-vhosts.conf 转

    Apache下的配置文件httpd.conf.httpd-vhosts.conf(windows) 2013-05-24 22:09 by youxin, 58 阅读, 0 评论, 收藏, 编辑 ht ...

  9. 用python+sklearn(机器学习)实现天气预报 准备

    用python+sklearn机器学习实现天气预报 准备 项目地址 系列教程 0.流程介绍 1. 环境搭建 a.python b.涉及到的机器学习相关库 sklearn panda seaborn j ...

  10. MongoDB按照嵌套数组中的map的某个key无法正常排序的问题

    前阵子同事有一个需求: 在一个数组嵌套map的结构中,首先按照map中的某个key进行筛选,再按照map中的某个key进行排序,但是奇怪的是数据总是乱序的. 再检查了代码和数据之后并没有发现什么错误, ...