CVE-2020-28653-如何绕过反序列化漏洞补丁-Zoho ManageEngine OpManager

VSole2021-11-10 05:56:59

引言

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漏洞补丁。后面数据包构造具体过程与前面类似,这里就不过多赘述,有兴趣的小伙伴可以自行研究。

序列化zoho
本作品采用《CC 协议》,转载必须注明作者和本文链接
未授权的反序列化漏洞,评分为7.5分,初步感觉可能缺少Gadget,导致无法RCE。但分析后发现可以找到RCE Gadget。此外CVE-2020-28653补丁修复存在缺陷,导致很容易被绕过,形成新的RCE漏洞CVE-2021-3287。
本仓库所涉及的技术、思路和工具仅供安全技术研究,任何人不得将其用于非授权渗透测试,不得将其用于非法用途和盈利,否则后果自行承担。
根据国家信息安全漏洞库统计,2021年8月份采集安全漏洞共1911个。合计1633个漏洞已有修复补丁发布,本月整体修复率85.45%。截至2021年08月31日,CNNVD采集漏洞总量已达167566个。总体来看,本月整体修复率,由上月的88.29%下降至本月的85.45%。
在我们之前的文章中,我们讨论了 DNS 的基础知识。在本文中,我们将介绍一些 DNS 冗余的高级技术: 主域名解析托管一个或多个区域的主 DNS 服务器充当权威 DNS,DNS 管理员通过该服务器管理区域文件并执行 DNS 更改,例如添加、删除和更新 DNS 记录。 区域和区域文件DNS 服务器中托管的域称为区域。区域文件是人类可读的文本文件,其中包含不同类型的 DNS 记录。
Java安全中Groovy组件从反序列化到命令注入及绕过和在白盒中的排查方法
最近两个月我一直在做拒绝服务漏洞相关的时间,并收获了Spring和Weblogic的两个CVE但DoS漏洞终归是鸡肋洞,并没有太大的意义,比如之前有人说我只会水垃圾洞而已,所以在以后可能打算做其他方向早上和pyn3rd师傅聊天
浅谈Java反序列化漏洞
2022-05-17 17:48:01
Java序列化与反序列化Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。
java序列化与反序列化
2022-04-13 16:35:35
java反序列化指字节序列恢复到java对象。bit,则一个字最大为 FFFF。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。
序列化漏洞汇总
2022-01-07 22:17:34
漏洞出现在WLS Security组件,允许远程攻击者执行任意命令。攻击者通过向TCP端口7001发送T3协议流量,其中包含精心构造的序列化Java对象利用此漏洞。然后将其序列化,提交给未做安全检测的Java应用。Java应用在进行反序列化操作时,则会触发TransformedMap的变换函数,执行预设的命令。
序列化的核心思维旨在,将A变成B,最后再从B还原回A。 总之,在一些条件苛刻或者变化无常的环境与需求中,产生了这种灵活的可逆性的B的中间体。 理解不安全反序列化的最好方法是了解不同的编程语言如何实现序列化和反序列化。这里的序列化与反序列化指的是程序语言中自带的实施与实现。而非自创或者自定义的序列化与反序列化机制(比如:N进制形式hashmap树型等其他数据结构里的序列化中间体)。
VSole
网络安全专家