欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

VMware Fusion 11通过WebSocket接口控制虚拟机RCE漏洞分析(CVE-2019-5514)

来源:本站整理 作者:佚名 时间:2019-04-15 TAG: 我要投稿

攻击者可以通过某个网站,在无需掌握任何预备知识的前提下,在VMware Fusion Guest VM上运行任意命令。基本来说,VMware Fusion仅仅会在本地主机上侦听WebSocket。攻击者可以通过这一WebSocket界面完全控制所有虚拟机,也可以创建或删除快照,或者进行其他的操作,包括启动应用程序。攻击者需要在Guest虚拟机上安装VMware Tools,才能够启动应用程序,但实际上,大家应该都已经安装了。因此,通过在网站上创建JavaScript,攻击者就可以与未经文档记录的API实现交互。当然,这都是未经过身份验证的。
早期发现成果
几个星期前,我在Twitter上看到了@CodeColorist发表的一篇推文,谈到了这个问题。他是最早发现这一问题的人,但由于我一直没有时间研究这个问题,导致搁置了一段时间。当我再想回去看时,发现这篇推文已经被删除了。但是,我在这位研究者的微博帐号中发现了同样的推文(@CodeColorist)。下面是他发布的微博截图:

可以在这里看到,我们可以通过Web套接字在Guest VM上执行任意命令,该接口由amsrv进程启动。我非常信任这位研究者的研究成果,因此我接下来将在他提供的信息基础上做进一步的研究。
AMSRV
在研究中,我使用了GitHub上面的ProcInfoExample项目,利用Proc Info库来监控运行VMware Fusion时启动的进程类型。在启动VMware时,将启动vmrest(VMware REST API)和amsrv:
2019-03-05 17:17:22.434 procInfoExample[10831:7776374] process start:
pid: 10936
path: /Applications/VMware Fusion.app/Contents/Library/vmrest
user: 501
args: (
    "/Applications/VMware Fusion.app/Contents/Library/amsrv",
    "-D",
    "-p",
    8698
)
 
2019-03-05 17:17:22.390 procInfoExample[10831:7776374] process start:
pid: 10935
path: /Applications/VMware Fusion.app/Contents/Library/amsrv
user: 501
args: (
    "/Applications/VMware Fusion.app/Contents/Library/amsrv",
    "-D",
    "-p",
    8698
)
它们似乎是相关的,特别是,我们可以通过这个端口访问到一些未记录的VMware REST API调用。由于我们可以通过amsrv进程控制应用程序菜单,所以我认为这类似于“应用程序菜单服务”(Application Menu Service)。如果我们导航到/Applications/VMware Fusion.app/Contents/Library/VMware Fusion Applications Menu.app/Contents/Resources的位置,我们可以找到一个名为app.asar的文件,在文件的末尾有一个node.js实现,与这个侦听8698端口的WebSocket相关。在该文件中,源代码的格式规范非常好,因此我们并不需要进行硬核的逆向工程。
我们查看这部分代码,它表明VMware Fusion应用程序菜单确实会在8698端口上启动amsrv进程,如果该端口被占用,那么将会尝试下一个可以启用的端口,依次类推。
const startVMRest = async () => {
   log.info('Main#startVMRest');
   if (vmrest != null) {
      log.warn('Main#vmrest is currently running.');
      return;
   }
   const execSync = require('child_process').execSync;
   let port = 8698; // The default port of vmrest is 8697
   let portFound = false;
   while (!portFound) {
      let stdout = execSync('lsof -i :' + port + ' | wc -l');
      if (parseInt(stdout) == 0) {
         portFound = true;
      } else {
         port++;
      }
   }
   // Let's store the chosen port to global
   global['port'] = port;
   const spawn = require('child_process').spawn;
   vmrest = spawn(path.join(__dirname, '../../../../../', 'amsrv'), [
      '-D',
      '-p',
      port
   ]);
我们可以在VMware Fusion Application目录日志中找到相关的日志信息:
2019-02-19 09:03:05:745 Renderer#WebSocketService::connect: (url: ws://localhost:8698/ws )
2019-02-19 09:03:05:745 Renderer#WebSocketService::connect: Successfully connected (url: ws://localhost:8698/ws )
2019-02-19 09:03:05:809 Renderer#ApiService::requestVMList: (url: http://localhost:8698/api/internal/vms )
这样一来,我们就可以确认Web套接字和其他API接口。
REST API – 泄漏虚拟机信息
如果我们导航到上面的URL(http://localhost:8698/api/internal/vms),我们将获得格式良好的JSON,以及关于我们的虚拟机的详细信息:
[
{
    "id": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
    "processors": -1,
    "memory": -1,
    "path": "/Users/csaby/VM/Windows 10 x64wHVCI.vmwarevm/Windows 10 x64.vmx",
    "cachePath": "/Users/csaby/VM/Windows 10 x64wHVCI.vmwarevm/startMenu.plist",

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载