前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vCenter RCE 详细分析过程 (CVE-2021–22005)

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

作者头像
Khan安全团队
发布2021-10-12 11:39:10
2K0
发布2021-10-12 11:39:10
举报
文章被收录于专栏:Khan安全团队Khan安全团队

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

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

/analytics/telemetry”được

处理bởi类AsyncTelemetryController

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

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

进入TelemetryLevelBasedTelemetryServiceWrapper 之后。processTelemetry(),服务器从传入的collectorId、collectorInstanceId参数实现getTelemetryLevel() :

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

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

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

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

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

日志文件存储在

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

instance name> .json

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

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

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

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

可以通过路径遍历

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

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

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

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

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

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

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

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

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

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

2.任意 Web Shell 创建

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

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

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

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

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

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

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

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

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

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

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

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

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

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

堆栈跟踪:

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

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

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

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

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

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

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

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

生成的文件将如下所示:

UG9DIOinhumike+8mg0KDQpodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVdWSjhSRFI3WHpzDQoNClBvQyDohJrmnKzvvJpodHRwczovL2dpc3QuZ2l0aHViLmNvbS90ZXN0YW51bGwvYzJmNmZkMDYxYzQ5NmVhOTBkZGVlMTUxZDY3MzhkMmU=

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

下载链接:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Khan安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档