從VMware vCenter SSRF漏洞調試來看系統模塊調用與認證機制
最近網上有人爆出了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數據庫配置:

至此整個模塊調用機制就分析完畢,漏洞完整原理也一目了然。