最近网上有人爆出了VMware vCenter v7.0.2.00100版本存在未授权SSRF漏洞,相关的POC也已经公开,漏洞本身比较简单,但是深度分析VMware vCenter相关模块调用和认证机制还是很有必要的,毕竟作为一名喜欢刨根问底的技术宅男,绝对不能满足于做一个脚本小子,不知其所以然不足以支撑挖出新的洞洞来。

调试配置

在以前的文章中已经介绍过VMware vCenter远程调试配置方式:

调试配置参考
QCyber,公众号:且听安全CVE-2021-22005-VMware VCenter Server 从目录穿越到命令执行(需CEIP开启)

这里回顾一下配置方式。漏洞位于`vsphere-ui`服务中,使用如下命令获取启动参数:

tr '\0' ' ' < /proc/PID/cmdline

使用`service-control --stop vsphere-ui`命令停止服务,并在`vsphere-ui.launcher`命令后添加`-Xdebug`调试选项,在`vsphere-ui`用户下手动启动命令,随后8787端口被监听:

关闭系统防火墙,使用IDEA远程连接8787调试端口:


漏洞复现

根据公开信息,漏洞url为`/ui/vcav-bootstrap/rest/vcav-providers/provider-logo`,正常访问时提示url参数不存在。

通过500错误获取代码调用栈,最后在`ProvidersController.getProviderLogo`执行时出错。

`getProviderLogo`函数代码比较简单,通过URLConnection读取URL并解析。

首先是可以实现SSRF:

构造url参数读取本地配置文件:

调用机制分析

漏洞复现不是本文重点,本文重点是分析VMware vCenter相关配置和认证绕过的机制。根据500错误返回的调用栈信息,漏洞触发期间首先执行了`BridgeServlet`:

解压`h5-bridge-webapp.war`后在web.xml中找到有关定义,请求由`BridgeServletEx`处理:

`BridgeServletEx`为典型的OSGI处理,简要流程为`BridgeServlet->ProxyServlet->DispatcherServlet->OSGI Bundle`:

回到漏洞触发链接,找到一个名为`h5-vcav-bootstrap-ui`的war包,其plugin.xml定义了bundle的名称:

通过MANIFEST.MF文件`Web-ContextPath`得知bundle请求地址为`ui/vcav-bootstrap`,访问war包下的`homescreen.html`可成功返回内容。

这里尝试寻找bundle的加载流程,但日志中与Bundle加载相关的插件为`com.vmware.h4.vsphere.bootstrap.ui`,与xml里id并不匹配。(相关Java Package包的定义位于h5-vacv-bootstrap-service.jar中)。

在`bundle-context.xml`中找到`ProvidersController`的调用。

继续分析war包`web.xml`配置,servlet请求通过`/rest`路由处理,而`ProvidersController`属于`Servlet`接口。

`ProvidersController`代码位于`h5-vacv-bootstrap-service.jar`中,jar包中的`bootstrap-context.xml`对接口同样进行了定义:

接口请求的URL为`vcav-providers/[FUNCTION]`:

根据Servlet代码构造最终链接为`/ui/vcav-bootstrap/rest/vcav-providers/providers-list`,可实现对接口未授权访问。

调试跟踪

下面是代码调试截图,进入`BridgeServletEx`处理:

执行到`ProxyServlet`:

最后调用`getProviderLogo`函数:

利用漏洞既可以实现SSRF攻击,也可以实现任意文件读取,比如读取postgresql数据库配置:


至此整个模块调用机制就分析完毕,漏洞完整原理也一目了然。