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参数进行拼接且没有任何的过滤,返回文件路径,然后对指定文件进行反序列化
而在de.laures.cewolf.CewolfRenderer#doGet
中会调用getChartImage
,可以看到前面提到的id参数就是从request中获取的img值,明显可以看到这是一个servlet类
查看一下web.xml,找到了/cewolf/*
接口,接着进行抓包构造,这里往服务器根目录上放一个cb链构造的序列化文件
构造包,并通过目录穿越指定文件进行反序列化触发漏洞弹出计算器
XXE的点
这里先放一些解析XML的主要函数(可能存在XXE漏洞的函数)
|
|
这个洞就是javax.xml.parsers.DocumentBuilderFactory
解析用户传进来的未过滤的参数导致的XXE
在com.adventnet.sym.adsm.auditing.server.category.ProcessTrackingListener#parseTaskContent
中,对Task Content
或者Task New Content
的值进行xml解析触发XXE漏洞
直接来看com.adventnet.sym.adsm.auditing.webclient.ember.api.ADAPAgentAPIServlet
和它对应的路由接口,所有请求最后都会进入到executeAgentRequest
中
在executeAgentRequest
中先是将/api/agent/
后的值提取出来,然后在this.agentAPIMapping
中匹配取出对应的mappingInfo,这里是我随便输入的值111,而漏洞的点在/tabs/agentData
中
更改为目标url后通过反射进入到com.adventnet.sym.adsm.auditing.webclient.ember.api.agent.AgentDataHandler#receiveData
中,最后在notify
中将post包内容添加到队列中
而在notify
函数的类EventDataAdapter
中的子类EventDispatcher
中会对消息队列进行处理,这里会提取DomainName
的值,而该值必须为域环境的域名否则后面会直接抛出异常无法触发漏洞
这里Y4er师傅提到了可以通过
/api/agent/configuration/getAgentServerInfo
接口获取完整的fqdn,前提是目标配置了agent
在process
中,filterEvents
会先对消息进行过滤,其中会提取EventCode
的值,如果没有的话将会直接抛出异常,而前面讲到的DomainName
如果值不是域环境中的域名的话domainMap
会为空然后抛出异常
接着会进入到addEventRows
中,这里如果EventCode
的值在filterEvents
中不存在话会导致procesedEventTable
为null就触发不了漏洞
在addEventRows
中,会通过CategoryId
获取eventCategoryListener
而为了进入漏洞触发点,它需要为ProcessTrackingListener
,而当CategoryId
为11时才满足这个条件,而在一开始filterEvents
对消息队列进行检测时会通过getCategoriesForEventId
获取CategoryId
的值,可以看到EventCode
的值为592或者4688时都符合(可能还有符合的)
最后进入到getEventRow
中,接着进入到parseTaskContent
中触发XXE漏洞,这里post包参数还需要有EventType
和TimeGenerated
,否则的话会直接抛出异常
两个点结合rce
这样的话可以通过XXE的jar协议上传一个恶意的序列化文件在通过file协议获取文件的路径,在通过反序列化的点触发即可达到rce的目的
因为jar协议上传文件时如果链接协议断开,文件则会消失,因此使用BlockingServer工具使目标文件长时间停留在目标服务器上
开启BlockingServer,其中aaa.png为通过cb链构造的序列化文件,然后通过jar协议发送post包,此时上传的文件为aaa.png
|
|
接着通过xxe-ftp-server工具查看上传的文件路径,其中如果目标系统为windows的话还要知道目标用户(这里可以先通过列举/Users 获取所有用户名),此时知道了文件名和路径,直接通过反序列化的点指定文件进行触发漏洞