WebLogic反序列化漏洞分析(CVE-2018-2628)

前言

2018年4月18日,Oracle官方发布了4月份的安全补丁更新CPU(Critical Patch Update),更新中修复了一个高危的 WebLogic 反序列化漏洞CVE-2018-2628。攻击者可以在未授权的情况下通过T3协议对存在漏洞的WebLogic组件进行远程攻击,并可获取目标系统所有权限。
影响版本:
Oracle WebLogic Server10.3.6.0
Oracle WebLogic Server12.2.1.2
Oracle WebLogic Server12.2.1.3
Oracle WebLogic Server12.1.3.0

基础知识

Java 序列化与反序列化:

Java序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的
writeObject() 方法可以实现序列化。

Java 反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject()
方法用于反序列化。

HTTP:多平台之间的通信,管理等

RMI:是 Java 的一组拥护开发分布式应用程序的 API,实现了不同操作系统之间程序的方法调用。值得注意的是,RMI 的传输 100%
基于反序列化,Java RMI 的默认端口是 1099 端口。

JMX:JMX 是一套标准的代理和服务,用户可以在任何 Java 应用程序中使用这些代理和服务实现管理,中间件软件 WebLogic
的管理页面就是基于JMX开发的,而JBoss则整个系统都基于JMX构架。

漏洞分析

这个洞产生原因是weblogic对于T3协议发送的数据包没有过滤,注册一个RMI接口,通过T3协议建立连接,加载回来再一步步解包,利用readObject解析,从而造成反序列化远程代码执行。当然weblogic因为CVE-2017-3248对rmi接口做一个限制,在InboundMsgAbbrev类中,多了一个resolveProxyClass,对RMI接口类型进行了判断,对于是java.rmi.registry.Registry接口注册的,会抛出InvalidObjectException错误。(ps:在测试中发现10.3.6.0版本默认没有这个判断,所以在没有打CVE-2017-3248 patch的情况下可以直接打)
WebLogic-CVE-2018-2628-1.png

在java.rmi.registry.Registry处下断点调试,经过一系列的readObject后,最终反序列化执行了命令。
这里用未修改的ysoserial生成payload打,可以看见抛出了InvalidObjectException错误,不能成功利用。
WebLogic-CVE-2018-2628-2.png

WebLogic-CVE-2018-2628-3.png

漏洞利用

因为ysoserial生成的payload是用的java.rmi.registry.Registry,而weblogic对他进行了判断会出错。所以要修改ysoserial里JRMPClient的实现代码,换成其他的RMI接口就可以了,只要是继承extends java.rmi.Remote即可,可以是
java.rmi.activation、javax.management.remote.rmi.RMIConnection、sun.jvmstat.monitor.remote.RemoteVm等

Activator proxy = (Activator)Proxy.newProxyInstance(JRMPClient.class.getClassLoader(),new Class[]{Activator.class},obj);

所以可以仿照JRMPClient写一个JRMPClient2,重新编译,就可以用ysoserial生成payload打了。这里已经有人写好了https://github.com/brianwrf/ysoserial
注册rmi接口,看到JRMPLister有请求过来了
WebLogic-CVE-2018-2628-4.png

执行exploit,建立连接,接收数据payload
WebLogic-CVE-2018-2628-5.png

成功执行了命令
WebLogic-CVE-2018-2628-6.png

这里有个坑,12.2.1.2版本的weblogic,改了rmi接口,虽然远程的服务器能收到连接,但是命令没有执行,而10.3.6.0的weblogic则可以。后来发现是commons-collections库的版本问题,因为weblogic中的依赖jar中,使用了CommonsCollections,10.3.6.0的commons-collections是3.2.0。而12.2.1.2的是com.bea.core.apache.commons.collections.jar,对反序列化问题做了一些检查。

CVE-2018-2628补丁分析

对补丁(p27395085_1036_Generic),发现WeblogicFilterConfig.class的黑名单多了一个sun.rmi.server.UnicastRef

private static final String[] DEFAULT_BLACKLIST_CLASSES = new String[]{"org.codehaus.groovy.runtime.ConvertedClosure", "org.codehaus.groovy.runtime.ConversionHandler", "org.codehaus.groovy.runtime.MethodClosure", "org.springframework.transaction.support.AbstractPlatformTransactionManager", "sun.rmi.server.UnicastRef"};

是否可以绕过呢!?

参考

  1. Weblogic 反序列化漏洞(CVE-2018-2628)漫谈
  2. weblogic反序列化漏洞分析与调试
  3. CVE-2018-2628
  4. CVE-2018-2628 简单复现与分析