vCenter RCE 详细分析过程 (CVE-2021–22005)

  • A+
所属分类:安全文章

1.任意文件创建(需要启用 CEIP)

根据解决方法,可以看出在“ /analytics/telemetry/ph/api/hyper/send”和“ /analytics/ph/api/dataapp/agent ”存在危险,其中只有 RhttpProxy 服务的配置,“ /analytics/telemetry ” 可以直接访问:



vCenter RCE 详细分析过程 (CVE-2021–22005)


/analytics/telemetry”được 

处理bởiAsyncTelemetryController


vCenter RCE 详细分析过程 (CVE-2021–22005)


调用/analytics/telemetry端点时,会根据通过 HTTP 传入的参数生成“TelemetryRequest”,包括:collectorIdcollectorInstanceId、...


vCenter RCE 详细分析过程 (CVE-2021–22005)


继续进入TelemetryServiceprocessTelemetry(),上面刚刚创建的 TelemetryRequest 将被提交到一个队列并在不久之后在TelemetryRequestProcessorRunnable处执行


vCenter RCE 详细分析过程 (CVE-2021–22005)


进入TelemetryLevelBasedTelemetryServiceWrapper 之后processTelemetry(),服务器从传入的collectorIdcollectorInstanceId参数实现getTelemetryLevel() 


vCenter RCE 详细分析过程 (CVE-2021–22005)


按照目前的程序流程,还会继续调用 DefaultTelemetryLevelService.getTelemetryService() 来获取 TelemtryLevel。该代码执行以下操作:


vCenter RCE 详细分析过程 (CVE-2021–22005)


在这里我们可以很容易地看到:如果 CEIP 功能被禁用,程序将始终将遥测级别返回为 OFF!

完成关卡并返回TelemetryLevelBasedTelemetryServiceWrapperprocessTelemetry(),我们可以看到,如果TelemetryLevel = OFF,服务端将不会继续处理请求并返回。


vCenter RCE 详细分析过程 (CVE-2021–22005)


因此,此错误有一个特殊要求,即启用 CEIP 功能才能继续!

假设我们的环境启用了 CEIP,服务器继续进入LogTelemetryService分支processTelemetry (),这里的处理代码只是记录刚刚传入的TelemetryRequest,日志的内容就是请求体:


vCenter RCE 详细分析过程 (CVE-2021–22005)


日志文件存储在 

/var/log/vmware/analytics/prod/_c_i< 

instance name.json


vCenter RCE 详细分析过程 (CVE-2021–22005)


并且因为filename中同时包含collectorId和collectorInstanceId,所以一看到这一段,就想到了可以在路径遍历中添加“../”字符,在另一个文件夹中随意创建一个文件的情况。

但是,当尝试第一个请求时,什么也没发生,没有创建日志,也没有返回错误。

继续调试到“this. _logger .info()”看更清楚,F7,F8一会,遍历路径后到达logger的fileName所在的位置如下:

vCenter RCE 详细分析过程 (CVE-2021–22005)


在"/var/log/vmware/analytics/prod/"这个文件夹中的"_c_i",

可以通过路径遍历

"/var/log/vmware/analytics/prod/_c_i/。./.../.../.../.../.../tmp/test1111111.json "被认为没有找到。


vCenter RCE 详细分析过程 (CVE-2021–22005)


此路径遍历仅在前一个文件夹也存在时才有效:


vCenter RCE 详细分析过程 (CVE-2021–22005)


幸运的是,经过一段时间的杂项模糊测试后,能够在服务器上创建一个新文件夹:


vCenter RCE 详细分析过程 (CVE-2021–22005)

使用 _c="" 和 _i="/<name>",完整路径现在为:

“ /var/log/vmware/analytics/prod/_c_i/11247.json ”

当 Logger 调用RollingFileManager 时createManager(),服务器将检查父文件夹是否存在,这里是“ _c_i ”,由于这个文件夹不存在,它很快就会被创建。

创建文件夹“ _c_i ”后,可以成功完成创建上述任意文件的请求路径遍历:



vCenter RCE 详细分析过程 (CVE-2021–22005)


然而,这还不是结束,问题仍然很困难,

文件的内容和路径可以任意修改,但文件名必须有扩展名“.json”,不能写web shell并执行!

很多人发现了上面的bug,也卡在这里,不能RCE



2.任意 Web Shell 创建

感觉解决方法不够完美,找到一个完美的bug:RCE没有严格条件,只好下载patch和diff,

两个补丁之间的一些细微变化如下:


vCenter RCE 详细分析过程 (CVE-2021–22005)


大部分都是更多的机制来检查collectorId,文件名...以避免写shell。

其中,上面提到的AsyncTelemetryController有一个bug,剩下的bug肯定是在“DataAppAgentController”!

在新版本中,带有 action=collect 的端点“/dataapp/agent”已被完全删除:


vCenter RCE 详细分析过程 (CVE-2021–22005)

vCenter RCE 详细分析过程 (CVE-2021–22005)

在rhttpproxy的声明中,没有声明允许访问端点“ /analytics/ph/api/dataapp/agent ”,目前这个端点只能通过本地15080端口访问回到公告,这次修复的bug中,还有一个bug是CVE-2021-22017——rhttpproxy bypass,也是上报CVE-2021-22005的作者报告的


果然,作者找到了绕过rhttpproxy的方法,结合端点“/dataapp/agent”的漏洞,形成了一个RCE-In-Onehit链……


vCenter RCE 详细分析过程 (CVE-2021–22005)

从开始到现在,都忘了那个经典的 tomcat 案例,还在用绕过代理过滤器:“ ..;/ ”


正如预期的那样,“..;/”是关键:


vCenter RCE 详细分析过程 (CVE-2021–22005)

如何访问端点的问题已经解决了,现在只是如何再次写入文件。

  • 还有一个bug,可以直接写文件到服务器,但是内容比较有限,而且文件名会有.properties扩展名,所以我不关注这个bug了,读者可以回头看看,再往这个方向发展



vCenter RCE 详细分析过程 (CVE-2021–22005)


这里的调试过程相当漫长和棘手,经过一段时间的 F7 和 F8 不断,并通过某种链接方法,我停在ResourceItemToJsonLdMapping


vCenter RCE 详细分析过程 (CVE-2021–22005)


ResourceItemToJsonLdMapping。evaluateMappingExpression()然后继续调用 Velocity 来evaluate() 模板:


vCenter RCE 详细分析过程 (CVE-2021–22005)

有了这个。_mappingCode ”是可控值:

vCenter RCE 详细分析过程 (CVE-2021–22005)

vCenter RCE 详细分析过程 (CVE-2021–22005)

堆栈跟踪:

vCenter RCE 详细分析过程 (CVE-2021–22005)

从这里我们可以评估()一个任意模板,但这还不足以使用常见的paylaks进行RCE:


vCenter RCE 详细分析过程 (CVE-2021–22005)

新的 Velocity 版本有一些黑名单来阻止对“java.lang.Class”类方法的调用:


vCenter RCE 详细分析过程 (CVE-2021–22005)

因此,不能直接调用 Class.forName() 或 Class 的某个方法来执行。但是,在 vCenter 的当前上下文中,没有这样合适的变量,只有如下的一些变量:


vCenter RCE 详细分析过程 (CVE-2021–22005)


其中一个已经工作,并且可以用来编写任意文件。那就是“ GLOBAL-logger ”:


vCenter RCE 详细分析过程 (CVE-2021–22005)

以下是使用$GLOBAL-logger编写 shell 的步骤:

第一步:将日志路径设置为任意文件,

第 2 步:通过日志记录编写 web shell

第三步:关闭日志文件并返回日志文件名的旧值

生成的文件将如下所示:


vCenter RCE 详细分析过程 (CVE-2021–22005)


UG9DIOinhumike+8mg0KDQpodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVdWSjhSRFI3WHpzDQoNClBvQyDohJrmnKzvvJpodHRwczovL2dpc3QuZ2l0aHViLmNvbS90ZXN0YW51bGwvYzJmNmZkMDYxYzQ5NmVhOTBkZGVlMTUxZDY3MzhkMmU=

目前VMware已经发布了相关漏洞的补丁,建议受影响的用户参考VMware官方公告及时升级更新。

下载链接:

https://www.vmware.com/security/advisories/VMSA-2021-0020.html


相关推荐: 师傅们,中秋节快乐!

微信公众号:渊龙Sec安全团队为国之安全而奋斗,为信息安全而发声!如有问题或建议,请在公众号留言如果你觉得本文对你有帮助,欢迎在文章底部赞赏我们 中秋佳节 哈哈,这个祝福一不小心迟到啦~最近大家都有点忙,只能在工作之余维护公众号,希望大家能理解感谢各位师傅对我…

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: