天天看点

weblogic漏洞分析之CVE-2021-2394

Oracle官方发布了2021年7月份安全更新通告,通告中披露了WebLogic组件存在高危漏洞,攻击者可以在未授权的情况下通过IIOP、T3协议对存在漏洞的WebLogic Server组件进行攻击。成功利用该漏洞的攻击者可以接管WebLogic Server。

这是一个二次反序列化漏洞,是CVE-2020-14756和CVE-2020-14825的调用链相结合组成一条新的调用链来绕过weblogic黑名单列表。

Oracle WebLogic Server 10.3.6.0.0

Oracle WebLogic Server 12.1.3.0.0

Oracle WebLogic Server 12.2.1.3.0

Oracle WebLogic Server 12.2.1.4.0

Oracle WebLogic Server 14.1.1.0.0

为了更好的理解漏洞,我将介绍漏洞中涉及的每一个类的作用,再将所有类串起来形成调用链

Coherence 组件中存在一个 <code>com.tangosol.io.ExternalizableLite</code>,它继承了 <code>java.io.Serializable</code>,另外声明了 <code>readExternal</code> 和 <code>writeExternal</code> 这两个方法。

weblogic漏洞分析之CVE-2021-2394

<code>ExternalizableHelper</code>类可以将实现上面<code>ExternalizableLite</code>接口的类进行序列化和反序列化操作,在反序列化操作中,会调用<code>ExternalizableHelper#readObject</code>

weblogic漏洞分析之CVE-2021-2394

如上图,在<code>ExternalizableHelper#readObject</code>中,会调用<code>readObjectInternal</code>方法,此方法会根据要还原类的类型,选择对应的方法进行解析,对于实现 <code>com.tangosol.io.ExternalizableLite</code> 接口的对象,会进入到 <code>readExternalizableLite</code> 方法:

weblogic漏洞分析之CVE-2021-2394

在<code>readExternalizableLite</code> 方法中,会根据类名加载类,然后并且实例化出这个类的对象,然后调用它的 <code>readExternal()</code> 方法。

weblogic漏洞分析之CVE-2021-2394

此类中<code>getDatabaseMetaData</code>方法会调用<code>this.connect</code>

weblogic漏洞分析之CVE-2021-2394

而<code>this.connect</code>则调用了<code>InitialContext#lookup</code>,如果<code>this.getDataSourceName()</code>为恶意uri,则可以产生JNDI注入

weblogic漏洞分析之CVE-2021-2394

此类中有一个<code>getAttributeValueFromObject</code>方法,在<code>getAttributeValueFromObject</code>方法中,可以调用<code>invoke</code>来执行任意方法,前提是三个参数可控getMethod、anObject、parameters

weblogic漏洞分析之CVE-2021-2394

此类的<code>compare</code>方法会调用<code>this.extract</code>

weblogic漏洞分析之CVE-2021-2394

此类是整个漏洞绕过上一个补丁的关键类,它实现了<code>ExternalizableLite</code>接口,并且父类是<code>AbstractExtractor</code>

weblogic漏洞分析之CVE-2021-2394

在此类中有两个比较重要的方法,首先来看第一个<code>extract</code>方法,此方法会调用<code>attributeAccessor</code>的<code>getAttributeValueFromObject</code>方法

weblogic漏洞分析之CVE-2021-2394

第二个是<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

此方法调用了<code>SerializationHelper#readAttributeAccessor</code>来从序列化数据中还原<code>this.attributeAccessor</code>的值

跟进<code>readAttributeAccessor</code>方法,可以看到是自己<code>new</code>了一个<code>MethodAttributeAccessor</code>对象,这里就是绕过补丁的关键

weblogic漏洞分析之CVE-2021-2394

<code>TopNAggregator$PartialResult</code>是一个静态内部类,也实现了<code>ExternalizableLite</code>接口,里面有个<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

在<code>readExternal</code>方法中也是调用的<code>ExternalizableHelper</code>进行还原每一个元素,170行还原了<code>m_comparator</code>后,到172行调用了<code>instantiateInternalMap</code>方法并且传入了还原的<code>m_comparator</code>,跟进<code>instantiateInternalMap</code>

weblogic漏洞分析之CVE-2021-2394

这里首先<code>new</code>了一个<code>SortedBag.WrapperComparator</code>,传入<code>comparator</code>,跟进<code>WrapperComparator</code>可以看到把<code>comparator</code>的值赋予给了<code>this.f_comparator</code>

weblogic漏洞分析之CVE-2021-2394

之后把<code>new</code>出来的<code>SortedBag.WrapperComparator</code>对象传入了<code>TreeMap</code>构造方法,跟进<code>TreeMap</code>构造方法

weblogic漏洞分析之CVE-2021-2394

在<code>TreeMap</code>构造方法只是对<code>comparator</code>的一个赋值,把刚刚的<code>SortedBag.WrapperComparator</code>对象传递给了<code>this.comparator</code>

weblogic漏洞分析之CVE-2021-2394

回到<code>TopNAggregator$PartialResult</code>类,最终的把<code>TreeMap</code>对象赋值给了<code>this.m_map</code>,接下来看176行的this.add

weblogic漏洞分析之CVE-2021-2394

跟进<code>add</code>方法看到调用了父类的<code>add</code>

weblogic漏洞分析之CVE-2021-2394

跟进其父类<code>SortedBag</code>类的<code>add</code>,在父类<code>add</code>方法中,调用了<code>map.put</code>,而这里的<code>map</code>就是上面的<code>TreeMap</code>对象

weblogic漏洞分析之CVE-2021-2394

在<code>TreeMap</code>类中,其<code>put</code>方法会调用<code>compare</code>

weblogic漏洞分析之CVE-2021-2394

在<code>compare</code>中调用了<code>comparator.compare</code>,此处的<code>comparator</code>是在上个内部类中赋予的值<code>SortedBag.WrapperComparator</code>类

weblogic漏洞分析之CVE-2021-2394

此类的<code>compare</code>方法会调用<code>this.f_comparator.compare</code>

weblogic漏洞分析之CVE-2021-2394

这个是整个漏洞的入口,在此类中实现了<code>readExternal</code>方法,在还原<code>this.m_oValue</code>值时候会调用<code>ExternalizableHelper.readObject</code>

weblogic漏洞分析之CVE-2021-2394

先上gadget:

POC用Timeline Sec团队的:

在<code>objectIntputStream.readObject();</code>处下断点

weblogic漏洞分析之CVE-2021-2394

跟进到<code>AttributeHolder#readExternal</code>,这里使用了<code>ExternalizableHelper</code>从序列化数据中还原<code>this.m_oValue</code>

weblogic漏洞分析之CVE-2021-2394

跟进<code>ExternalizableHelper#readObject</code>,调用了<code>readObjectInternal</code>

weblogic漏洞分析之CVE-2021-2394

在<code>readObjectInternal</code>中,判断<code>nType</code>的值,进入<code>readExternalizableLite</code>来处理

weblogic漏洞分析之CVE-2021-2394

在<code>readExternalizableLite</code>中,先实例化了<code>TopNAggregator$PartialResult</code>类,然后调用了它的<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

跟进到<code>TopNAggregator$PartialResult</code>的<code>readExternal</code>方法,开始依次还原几个变量,先看还原第一个<code>m_comparator</code>

weblogic漏洞分析之CVE-2021-2394

跟进<code>ExternalizableHelper#readObject</code>到<code>readExternalizableLite</code>方法,实例化出了<code>FilterExtractor</code>对象,调用其<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

跟进<code>FilterExtractor#readExternal</code>方法,发现调用了<code>SerializationHelper.readAttributeAccessor</code>方法来还原<code>this.attributeAccessor</code>的值

weblogic漏洞分析之CVE-2021-2394

跟进<code>SerializationHelper.readAttributeAccessor</code>后,可以看到会 <code>new</code> 一个 <code>MethodAttributeAccessor</code> 对象,然后从 <code>DataInput</code> 中还原它的 <code>setAttributeName</code>,<code>setGetMethodName</code> 以及 <code>setSetMethodName</code> 属性,最后进行返回。

weblogic漏洞分析之CVE-2021-2394

回到<code>TopNAggregator$PartialResult</code>的<code>readExternal</code>方法中,此时<code>this.m_comparator</code>已经变成了<code>FilterExtractor</code>对象

weblogic漏洞分析之CVE-2021-2394

接着调用到172行的<code>instantiateInternalMap</code>方法,传入了<code>this.m_comparator</code>

weblogic漏洞分析之CVE-2021-2394

在<code>instantiateInternalMap</code>方法中,首先<code>new</code>了一个<code>SortedBag.WrapperComparator</code>,传入<code>comparator</code>,跟进<code>WrapperComparator</code>可以看到把<code>comparator</code>的值赋予给了<code>this.f_comparator</code>

weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394

跟进<code>add</code>方法看到调用了父类的<code>add</code>,可以看到<code>value</code>的值已经变成了<code>JdbcRowSetImpl</code>

weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394

在<code>TreeMap</code>类中,其<code>put</code>方法会调用<code>compare</code>,此时传入的<code>key</code>就是<code>JdbcRowSetImpl</code>对象

weblogic漏洞分析之CVE-2021-2394

在<code>compare</code>中调用了<code>comparator.compare</code>,此处的<code>comparator</code>是在上面<code>TreeMap</code>中赋予的<code>SortedBag.WrapperComparator</code>类

weblogic漏洞分析之CVE-2021-2394

接着进入<code>SortedBag.WrapperComparator#compare</code>中,可以看到调用了<code>FilterExtractor#compare</code>,其中o1、o2的值为<code>JdbcRowSetImpl</code>

weblogic漏洞分析之CVE-2021-2394

跟进<code>FilterExtractor#compare</code>中,调用了<code>this.extract</code>

weblogic漏洞分析之CVE-2021-2394

转到<code>this.extract</code>,调用了<code>MethodAttributeAccessor#getAttributeValueFromObject</code>

weblogic漏洞分析之CVE-2021-2394

查看<code>MethodAttributeAccessor#getAttributeValueFromObject</code>

weblogic漏洞分析之CVE-2021-2394

利用<code>invoke</code>调用了<code>JdbcRowSetImpl#getDatabaseMetaData</code>

weblogic漏洞分析之CVE-2021-2394

最终进行了<code>lookup</code>,其<code>this.getDataSourceName()</code>就是我们输入的LDAP地址

weblogic漏洞分析之CVE-2021-2394

弹出计算器

weblogic漏洞分析之CVE-2021-2394

https://xz.aliyun.com/t/10052#toc-12

https://github.com/lz2y/CVE-2021-2394