首页
社区
课程
招聘
[原创]CVE-2017-4901 VMware虚拟机逃逸漏洞分析【Frida Windows实例】
发表于: 2018-12-12 22:43 23811

[原创]CVE-2017-4901 VMware虚拟机逃逸漏洞分析【Frida Windows实例】

2018-12-12 22:43
23811

去年在上一家公司分析的,后来遗忘了,最近大家都在分享frida,我也想起来这篇报告,里面用到了frida hook vmware,打印出rpc通信内容。
附件中hook.js是在虚拟机中使用,hookvmx.js是在宿主机上使用

在VMware Workstation和Fusion中的拖放(Dnd)和复制粘贴(CP)功能存在堆溢出漏洞,这会让虚拟机客户端在宿主机上执行任意代码。

1. RPCI通信机制

在介绍漏洞原理之前,先来了解一下VMWare中宿主机(host)与虚拟机(guest)之间的通信机制,其中的一种方式叫做Backdoor,利用windows的特权指令in,该指令在正常的host环境用户态中执行会报异常,而在guest中正是利用该异常被host的hypervisor捕获,来实现通信。
如下图,在vmtools.dll中的Message_Send函数调用Backdoor函数,Backdoor调用in eax,dx来实现通信。

图片描述

图片描述

guest中利用frida框架注入到vmtools.exe中使用RpcChannel_SendOneRaw发送消息

图片描述

图片描述

RpcChannel_SendOneRaw调用路径:
RpcChannel_SendOneRaw -> RpcChannel_Send -> BkdoorChannelSend -> RpcOut_send -> Message_Send -> Backdoor -> in特权指令

RpcChannel_SendOneRaw的参数 const char *data就是给Host发送的指令, 在第3小节会讲host是怎么接收guest 的命令。

2. 漏洞

Dnd/CP的Version 4的dnd/cp分片数据包校验函数

open-vm-tools中的代码在此:dndCPMsgV4.c

对于Dnd/CP version 4的功能中,当guest发送分片Dnd/CP命令数据包时,会调用DnDCPMsgV4_UnserializeMultiple函数进行分片重组,重组的时候 DnDCPMsgV4IsPacketValid函数中的[1]处代码校验不严格,会导致[2]处堆溢出,可以构造如下的数据包来触发漏洞

Dnd/CP的Version 3的dnd分片数据包校验函数

open-vm-tools中的代码在此:dndCommon.c

对于老版本Version 3的Dnd/CP的功能中,在[3]处同样对分片重组的包有着校验失效的问题,可以发送如下的数据包来触发溢出。

3. 漏洞原理

第2节看完open-vm-tools中漏洞溢出的地方,现在来看vmware-vmx.exe中怎么利用漏洞实现逃逸。

图片描述

bind_function会把RPCI通信的命令和函数绑定到一个函数指针数组里面。
bind_function第3个参数是命令的名字,第4个参数是对应处理的回调函数。
回调函数的定义如下:
char fastcall handler(int64 a1, __int64 a2, const char request, int requestlen, const char **result, _DWORD resultlen);

handler第三个参数是接收的命令, 第5个参数是回复给guest的数据。

发送如下命令可以设置和查询dnd/cp的版本

讲完host如何接收guest的命令后,来看看guest的堆溢出怎么触发host的逃逸

图片描述

在处理guest的"tools.capability.dnd_version 3"命令时,设置当前的dnd_version
图片描述
在处理guest的"vmx.capability.dnd_version"命令时,会获取当前的dnd_version,并且更新dnd/cp全局对象
图片描述
在Update_DndCP_Object函数中delete掉前一个版本的obj_CP和obj_Dnd, 析构对象的时候都会调用到他们各自的虚函数,只需要溢出到虚表上就能执行漏洞代码。
图片描述
图片描述
能够执行代码的路径很多,可以溢出Dnd,也可以溢出CP, 只需要选择溢出其中一个虚函数。

要想在guest中获取host的对象,就需要有个能够泄漏信息的地方,例如guest中发送info-set和info-get命令。

图片描述
图片描述
利用info-set覆盖字符串的结尾NULL字符,让value字符串与后面的内存块连接起来,然后在info-get中读取Key,就能获取到value字符串后面的内存,达到信息泄漏。

此次分析的exp是由unamer发布在github上的vmware_escape项目。

1. 设置DnD/CP版本
图片描述

2. 绕过ASLR
多次发送info-set, info-get,进行堆溢出
图片描述
图片描述
图片描述
图片描述

获取泄漏的信息,绕过ASLR
图片描述


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-12-12 22:46 被Imyang编辑 ,原因:
上传的附件:
收藏
免费 12
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  junkboy   +5.00 2018/12/12
最新回复 (17)
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
厉害!感谢分享!
最后于 2018-12-12 22:53 被kanxue编辑 ,原因:
2018-12-12 22:53
0
雪    币: 3907
活跃值: (5817)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
4
厉害!感谢分享!
2018-12-12 22:58
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2018-12-12 23:07
0
雪    币: 982
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好文章~!
2018-12-12 23:38
0
雪    币: 2464
活跃值: (2290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习
2018-12-12 23:41
0
雪    币: 16506
活跃值: (6392)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
8
6666
2018-12-13 00:11
0
雪    币: 1392
活跃值: (5177)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
9
2018-12-13 10:50
0
雪    币: 3474
活跃值: (317)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
666
2018-12-16 11:08
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很厉害,来跟我学炒菜吧
2018-12-16 11:35
0
雪    币: 285
活跃值: (1095)
能力值: ( LV13,RANK:405 )
在线值:
发帖
回帖
粉丝
12
膜大佬
2018-12-16 18:58
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
牛逼牛逼
2019-1-4 14:53
0
雪    币: 4
活跃值: (170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
能实现稳定的利用吗
2019-1-9 10:09
0
雪    币: 1190
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
老师牛逼
2019-11-9 13:37
0
雪    币: 8186
活跃值: (6399)
能力值: ( LV12,RANK:207 )
在线值:
发帖
回帖
粉丝
16
感谢分享
2019-12-25 14:13
0
雪    币: 4995
活跃值: (6578)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
17
过来膜拜一下yang老师
2021-5-7 16:18
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18

 可以解释一下hook.js脚本吗?


最后于 2021-7-10 22:41 被mimi3333编辑 ,原因:
2021-7-3 10:32
0
游客
登录 | 注册 方可回帖
返回
//