CVE-2020-14756 漏洞利用以及分析

Andrew2021-02-15 01:48:10

0x01利用思路

weblogicT3协议反序列化漏洞一直是一个比较热门也比较好用的漏洞,weblogic针对该漏洞的解决方案就是不断填充黑名单,在高版本jdk下配合jep290机制实现黑名单,在低版本下配合resolveClass进行防御,所以安全人员对于T3反序列化的利用也是一直在寻找黑名单之外的利用链。

CVE-2020-14756 这个漏洞的利用比较巧妙,通过利用weblogic coherence组件中的类,绕过了黑名单机制的检测,重新能够利用黑名单中的类,造成代码执行。

0x02漏洞分析

weblogiccoherence.jar中,存在着一个比较特殊的接口com.tangosol.io.ExternalizableLite,他继承了Serializable接口。
图片

readExternalwriteExternal方法
图片

ExternalizableLite接口的对象可以在com.tangosol.util.ExternalizableHelper里被序列化。
图片

这里的nType是在writeObject写入的,是可控的
图片

readExternalizableLite方法的具体内容为:

这里会加载传入的对象,对象需要是ExternalizableLite的实现类
图片

这里直接调用class.forName还原对象
图片
之后,会继续调用对象的readExternal方法,这样一来,后续的流程就绕过了ObjectInputStream对于对象的还原,而weblogic的黑名单检测也主要是针对ObjectInputStream的,所以,现在只需要找到后续的利用链就可以造成代码执行。

漏洞发现者使用了com.tangosol.util.aggregator.TopNAggregator.PartialResult这个类。这里会利用ExternalizableHelper还原m_comparator参数,是一个Comparator类型的对象。
图片

然后调用了instantiateInternalMap方法,传入m_comparator
图片
首先实例化SortedBag.WrapperComparator,赋值f_comparator,然后返回TreeMap对象
图片

接着,调用add方法,在add方法里调用super.add,即SortedBag.add,继续调用put方法。

图片
put方法里,调用了compare方法
图片
而这里又会调用WrapperComparatorcompare方法

图片
这个f_comparator就是之前已经赋值过的。
图片
所以,最终的利用就在f_comparator这里,f_comparator从前面可以知道,需要是一个Comparator类型,这里使用的是 MvelExtractor 这是之前黑名单里的一个类,在CVE-2020-2555中有使用,不过现在我们不受黑名单的限制,MvelExtractor 没有compare方法。于是调用父类AbstractExtractorcompare方法。
图片
然后又会调用子类MvelExtractorextract方法。

序列化入口一

到现在我们的入口是TopNAggregator$PartialResult,他的readExternal(DataInput in)不是标准的readExternal(ObjectInput in),序列化的过程中是不会自动调用到该方法的,所以还需要找一个入口,这里作者发现了AttributeHolder

这里不但会将ObjectInput转为DataInput,还会主动调用ExternalizableHelper.readObject。所以我们只需要m_oValueTopNAggregator$PartialResult即可完成利用。
图片

调用栈
图片

序列化入口二

另外一个入口是com.tangosol.net.security.PermissionInfo,我们看他的readExternal方法,将输入流传入readCollection方法里,PermissionInfoExternalizableHelper的子类,所以这里PermissionInfo没有readCollection方法,直接调用其父类ExternalizableHelper的方法。
图片
判断输入流类型之后,调用了readObject
在调用readCollection的时候,将ObjectInput转为了DataInput
图片
走到这里,就和之前的流程一模一样了。
图片
调用栈
图片

0x03 12.1.3版本问题

经测试,12.1.3 利用存在如下问题

图片
从前面的分析可以知道,类的加载是在loadClass方法里,利用class.forName去加载类。
图片
这里的loader就很关键了,决定了哪些类可以加载,哪些类没发加载,这里的loader是调用getContextClassLoader获得的一个线程上下文类加载器。
图片

这里的线程上下文类加载器是默认的 AppClassLoader,在loaders里发现JarLoader加载了的coherence组件的依赖只有coherence.jarcoherence-web.jar,而MvelExtractorcoherence-rest.jar里,所以没有办法加载。
图片
图片

以下是一些尝试(未成功):
于是我这里先是考虑了另一个在黑名单的类,ReflectionExtractor,这个类在coherence.jar包下,不过在构造利用这个反射执行链的时候,需要反序列化Runtime.class对象,而Runtime.class对象不是ExternalizableLite的实现类,根据nType,在序列化的时候会调用readSerializeable方法
图片

该方法还是会走ObjectInputStream的反序列化流程,即使是通过修改nType让他走readExternalizable,后面还是会有类型转换报错。
图片

所以这样是不行的,12.1.3版本很多类都利用不了,比如RemoteConstructorUniversalExtractorLockVersionExtractor这些类在 12.1.3 版本中都没有,已知的利用链在 12.1.3 来说是没有办法进行利用的。

0x04官方修复之梅开二度

(补丁只能针对实现了jep290jdk
根据补丁来看:
图片

对输入流的类型进行了判断,如果是ObjectInputStream,那么会去调用checkObjectInputFilter方法,方法如下:

图片

这里会获取filter,在ExternalizableHelper的静态代码块里初始化了filter
首先会获取是否存在ObjectInputFilter,来判断jdk环境中是否存在jep290
图片

然后通过getObjectInputFilter/getInternalObjectInputFilter方法去获取serialFilter,之后,调用checkInput,对当前序列化的类进行检测。

不过,对于没有实现jep290jdk版本而言,这个修补是没有作用的,因为低版本jdk不存在ObjectInputFilter,所以说filter参数就为null,也就是说checkObjectInputFilter方法直接返回true
图片

既然为true,那么还是能进行类的实例化。
图片

原创: ob1t0 补天平台
原创链接:https://mp.weixin.qq.com/s/QT3K__1EMXC0uqB...

漏洞序列化
本作品采用《CC 协议》,转载必须注明作者和本文链接
最近两个月我一直在做拒绝服务漏洞相关的时间,并收获了Spring和Weblogic的两个CVE但DoS漏洞终归是鸡肋洞,并没有太大的意义,比如之前有人说我只会水垃圾洞而已,所以在以后可能打算做其他方向早上和pyn3rd师傅聊天
浅谈Java反序列化漏洞
2022-05-17 17:48:01
Java序列化与反序列化Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。
序列化漏洞汇总
2022-01-07 22:17:34
漏洞出现在WLS Security组件,允许远程攻击者执行任意命令。攻击者通过向TCP端口7001发送T3协议流量,其中包含精心构造的序列化Java对象利用此漏洞。然后将其序列化,提交给未做安全检测的Java应用。Java应用在进行反序列化操作时,则会触发TransformedMap的变换函数,执行预设的命令。
序列化的核心思维旨在,将A变成B,最后再从B还原回A。 总之,在一些条件苛刻或者变化无常的环境与需求中,产生了这种灵活的可逆性的B的中间体。 理解不安全反序列化的最好方法是了解不同的编程语言如何实现序列化和反序列化。这里的序列化与反序列化指的是程序语言中自带的实施与实现。而非自创或者自定义的序列化与反序列化机制(比如:N进制形式hashmap树型等其他数据结构里的序列化中间体)。
漏洞影响版本 Jboss 漏洞搭建 在阿里云端,用docker 搭建测试环境jboos使用的漏洞库是 vulhub ,进入漏洞库选择jboos里面有三个选项选择第一个cve.输入 docker-compose up -d 启动 本地测试,在浏览器输入访问 /invoker/readonly,若显示HTTP Status 500,则说有反序列化漏洞。使用工具测试验证漏洞是否存在,工具下载地址: ... 执行whoami命令
前置知识分析Transformer接口及其实现类。transform()传入对象,进行反射调用。构造调用链调用链构造原则:找调用关系要找不同名的方法,如果找到同名,再通过find usages得到的还是一样的结果。找到InvokerTransformer类中的transform(),右键,点 Find Usages,找函数调用关系,最好找不同名的方法,调用了transform()。因为transform()调用transform()不能换到别的方法里,没有意义。如果有一个类的readObject()调用了get(),那我们就可能找到了调用链。最终选择TransformedMap这个类,因为TransformedMap类中有好几处都调用了transform()。
使用 SerializationBinder 无法完全修复反序列化漏洞隐患。经过深入研究总结了两种不安全 SerializationBinder 限定的绕过方式,下面分享给大家。
近日Oracle通报了一个反序列化漏洞CVE-2022-21445,未经身份认证的远程攻击者可利用该漏洞实现反序列化操作导致任意代码执行。任何基于ADF Faces框架开发的程序都受到此漏洞的影响,包括Oracle的多个产品。
Fastjson Develop Team发布安全公告,修复了一个存在于Fastjson1.2.80 及之前版本中的反序列化漏洞漏洞编号:暂无,漏洞威胁等级:高危。
JDK7u21的核心点是我们在cc1中也出现过的AnnotationInvocationHandler,在cc1中我们用到了他会触发this.memberValues.get(var4);这个点,而在JDK7u21中利用到了他里面的equalsImpl。先来看一下equalsImpl。
Andrew
暂无描述