• 【漏洞复现】Vmware vcenter未授权任意文件RCE


    0x00 Vmware vcenter信息

    vSphereVMware推出的虚拟化平台套件,包含ESXivCenter Server等一系列的软件。其中vCenter Server ESXi的控制中心,可从单一控制点统一管理数据中心的所有vSphere主机和虚拟机,使得IT管理员能够提高控制能力,简化入场任务,并降低IT环境的管理复杂性与成本。

    vSphere Client(HTML5)vCenter Server插件中存在一个远程执行代码漏洞。未授权的攻击者可以通过开放443端口的服务器向vCenter Server发送精心构造的请求,从而在服务器上写入webshell,最终造成远程任意代码执行。

    fofa查询

    语法:

    title="+ ID_VC_Welcome +"

    app=”vmware-ESX”||app=”vmware-VirtualCenter”||app=”vmware-vCenter”

    0x01 影响版本

    • 7.0 U1c 之前的 7.0 版本
    • 6.7 U3l 之前的 6.7 版本
    • 6.5 U3n 之前的 6.5 版本

    0x02 代码分析

    vCenter ServervROPS插件的API未经过鉴权,存在一些敏感接口。其中 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;
          try {
             if (code != 200) {
                response.sendError(code, "Arguments Missing");
                return;
             }
             wr = response.getWriter();
          } catch (IOException var14) {
             var14.printStackTrace();
             logger.info("upload Ova Controller Ended With Error");
          }
          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();
                      }
                      OutputStream out = new FileOutputStream(curfile);
                      IOUtils.copy(in, out);
                      out.close();
                      result.add(entry.getName());
                      entry = in.getNextTarEntry();
                   }
                }
                in.close();
                logger.info("Successfully deployed File at Location :/tmp/unicorn_ova_dir");
             } catch (Exception var15) {
                logger.error("Unable to upload OVA file :" + var15);
                returnStatus = "FAILED";
             }
          }
          wr.write(returnStatus);
          wr.flush();
          wr.close();
       }

    代码逻辑是将TAR文件解压后上传到 /tmp/unicorn_ova_dir 目录。注意到如下代码:

                    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 拼接并写入文件。如果文件名内存在 ../ 即可实现目录遍历。

    0x03 漏洞复现

    利用代码(Sp4ce )https://github.com/NS-Sp4ce/CVE-2021-21972

    0x04 修复建议

    • vCenter Server7.0版本升级到7.0.U1c
    • vCenter Server6.7版本升级到6.7.U3l
    • vCenter Server6.5版本升级到6.5 U3n

    转载请注明:Adminxe's Blog » 【漏洞复现】Vmware vcenter未授权任意文件RCE

  • 相关阅读:
    jQuery Dialog and timepicker显示层的问题
    js、PHP将分数字符串转换为小数
    jqgrid动态显示/隐藏某一列
    Oracle查询每天固定时间段的数据
    Python安装pandas
    Python version 2.7 required, which was not found in the registry
    python刷剑指offer(1-20)(一刷)
    图像预处理(含计算机视觉概述)
    案例分析
    (七)目标检测算法之SSD
  • 原文地址:https://www.cnblogs.com/cn-gov/p/14461291.html
Copyright © 2020-2023  润新知