漏洞详情
近期,ZOHO官方发布公告,修复了一个存在于ManageEngine PAM360、PMP 和 Access Manager Plus 的远程执行代码漏洞,漏洞编号为CVE-2022-35405。该漏洞可能允许远程攻击者在受影响的 Password Manager Pro、PAM360 和 Access Manager Plus 上执行任意代码。在PMP和PAM360产品中利用此漏洞不需要身份验证。
以下产品版本受此次漏洞的影响:
Access Manager Plus < 4302
Password Manager Pro < 12100
PAM360 < 5500
危害等级:超危
CVSS评分:9.8
背景知识
RPC(Remote Procedure Call)就是相当于提供了一种“远程接口”来供外部系统调用,常用于不同平台、不同架构的系统之间互相调用。
XML-RPC是一个远程过程调用(RPC)协议,它使用XML对其调用进行编码,并使用HTTP作为传输机制。它是一种标准规范,并提供了现成的实现方式,允许运行在不同的操作系统和环境中。在XML-RPC中,客户机通过向实现XML-RPC并接收HTTP响应的服务器发送HTTP请求来执行RPC。
通俗理解就是xml-rpc服务器可以接收外部发送的xml数据,然后进行解析,如果外部发送的xml数据中包含恶意数据(如恶意反序列化数据),xml-rpc服务器在解析恶意数据时就有可能导致任意命令执行。
环境搭建
官网下载漏洞环境,链接如下:
https://archives2.manageengine.com/passwordmanagerpro/12100/ManageEngine_PMP_64bit.exe,
安装成功后访问本机环境7272端口,会显示如下界面:
在conf/wrapper.conf文件中取消jdpa debug的注释
使用如下命令首先关闭服务后再次开启服务:
bin\wrapper.exe -p ..\conf\wrapper.conf //关闭服务
bin\wrapper.exe -t ..\conf\wrapper.conf //开启服务
本地成功连接远程debug:
漏洞分析
该漏洞与Apache Ofbiz XMLRPC(CVE-2020-9496)命令执行漏洞原因相同,均是由XmlRpcRequestParser解析xml时,xml中有恶意反序列化数据,刚好环境中包含存在反序列化漏洞的包(Commons-beautils.jar),导致触发反序列化命令执行。
研究XmlRpcRequestParser类会发现该类主要有startElement()和endElement()两个函数,是用来解析xml标签。
startElement()会依次匹配请求中的xml标签,包括methodCall、methodName、params、param和value,
匹配value标签时,会执行startValueTag()函数,将inValueTag变量赋值为true,typeParser变量赋值为null,
如果value标签中还有其他子标签,就会执行super.startElement()函数
函数内容如下,其中会使用factory.getParser()函数判断value中的子标签是否可以匹配已有的解析类。
发送如下测试请求,跟进到factory.getParser()函数中
xml value中的子标签可以识别如下:nili1i2i8floatdombigdecimalbigintegerserializabledateTimeintbooleandoubledateTime.iso8601arraystructbase64string。
我们重点关注serializable,SerializableParser类中只有一个getResult()函数,ois.readObject()处可以执行反序列化,漏洞触发点就是这里。
getResult()函数只有RecursiveTypeParserImpl.envValueTag()处调用了。
endValueTag()只有在MapParser和ObjectArrayParser处进行了调用。
所以只要按照MapParser或ObjectArrayParser解析类的解析格式发送恶意请求,就可以调用ois.readObject()执行反序列化。
以ObjectArrayParser解析类触发的调用链如下:
XMLDocumentFragmentScannerImpl&FragmentContentDispatcher.dispatch()中是解析xml标签的流程。以ObjectArrayParser解析类触发漏洞为例,xml请求大概如下:
整个xml解析的流程大概如下:
XMLDocumentFragmentScannerImpl&FragmentContentDispatcher.dispatch()匹配<、/等方式循环调用XmlRpcRequestParser.startElement()和XmlRpcRequestParser.endElement(),
在XmlRpcRequestParser中解析methodCallmethodNameparamsparam和value,value中的子标签array等则交给XmlRpcRequestParser的父类RecursiveTypeParserImpl,由RecursiveTypeParserImpl根据子标签的标签名寻找对应的解析类,array标签对应的是ObjectArrayParser解析类,接着由ObjectArrayParser解析接下来的arraydata和value,serializable标签ObjectArrayParser解析不了,又交给父类RecursiveTypeParserImpl,RecursiveTypeParserImpl根据serializable名字找到SerializableParser解析类,而SerializableParser没有startElement()函数,又调用父类ByteArrayParser.startElement(),对反序列化数据进行base64解密,
然后dispatch开始调用endElement()函数,在解析/value时,ObjectArrayParser.endElement()会调用endValueTag()函数,
endValueTag()函数就会调用typeParser.getResult(),最终调用SerializableParser.getResult()。
缓解措施
官方已经发布了针对此次漏洞的补丁,链接为:
https://archives2.manageengine.com/passwordmanagerpro/12101/ManageEngine_PasswordManager_Pro_12100_to_12101.ppm
补丁中SerializableParser.getResult()关闭了反序列化。
参考链接
https://cert.360.cn/report/detail?id=ba5eeaf8536ba73611dd4abd198c4eb9
https://y4er.com/post/cve-2022-35405-zoho-password-manager-pro-xml-rpc-rce/