CVE-2020-28653-如何绕过反序列化漏洞补丁-Zoho ManageEngine OpManager
引言
CVE-2020-28653漏洞官方通报:
这是一个未授权的反序列化漏洞,评分为7.5分,初步感觉可能缺少Gadget,导致无法实现RCE。但分析后发现可以找到RCE Gadget。此外CVE-2020-28653补丁修复存在缺陷,导致很容易被绕过,形成新的RCE漏洞CVE-2021-3287。
反序列化流程
关注`SUMCommunicationServlet`接口:
`doPost`函数:
进入`process`函数:
对传入的参数进行一系列处理后,进入`processSumPDU`函数:
跟进`SUMPDU.deSerializePDU`函数:
直接进行了反序列化操作。
参数构造
`requestHandler`赋值如下:
回到`doPost`函数,如果要进入`requestHandler.process`的处理流程,必须满足获取的`requestHandler`非空。这里我们看下与SUM相关的另一个接口`SUMHandShakeServlet`:
在处理POST请求时,会对相应的session会话的`requestHandler`进行赋值,只需要提交的参数满足反序列化后为1002即可。那么可以自己编写代码完成构造。
发送请求后,会生成一个session:
该session含有`requestHandler`信息,可以在后续请求中带上该session:
这样就进入了`requestHandler.process`函数。下面尝试构造序列化参数,进入`requestHandler.process`函数。
首先需要从数据流中反序列化得到一个整数`length`,然后读取序列化数据传入`ProcessSumPDU`函数。这就意味着首先需要在序列化payload前面加入一个整数类型的长度信息.。查看下 `DataInputStream.readInt`:
可以通过`DataOutputStream.writeInt`进行构建:
Gadget构造
按照上面分析过程,很容易构造DNSlog Gadget进行验证尝试:
在所有引用的jar包中发现了`commons-beanutils.jar`,但是没有`commons-beanutils`,在前面的分析文章中提到过`Click1`利用链:
【经典回顾系列】 Java反序列化之ForgeRock OpenAM CVE-2021-35464漏洞分析
QCyber,公众号:且听安全【经典回顾系列】 Java反序列化之ForgeRock OpenAM CVE-2021-35464漏洞分析
可以参考上文利用`Click1`构造出RCE Gadget ,具体实现这里不再重复赘述。同时由于系统是运行在Tomcat之上的,可以利用Tomcat实现命令回显:
补丁绕过分析
反序列化过程增加了白名单验证,`ITOMObjectInputStream#resolveClass`函数如下:
这里修复存在隐患,因为只有`classResolved`为`false`的时候,才会进行白名单检查,也就是说如果存在一个`ITOMObjectInputStream`对象连续多次`readObject`的话,由于`classResolved`在第一次反序列化时已经赋值为`true`,所以后面的反序列化操作存在绕过可能性,漏洞CVE-2021-3287就是这个原理。
继续分析`SUMHttpRequestHandler#processSumPDU`函数,CVE-2020-28653通过`deSearialPDU`完成反序列化触发,继续往下走发现还存在一个`sockClient.process`函数:
进入`sockClient.process`函数:
正好满足多次进行反序列化的要求,从而可以绕过CVE-2020-28653漏洞补丁。后面数据包构造具体过程与前面类似,这里就不过多赘述,有兴趣的小伙伴可以自行研究。
