Java反序列化漏洞利用工具的实现

2017-07-19 10:21赵长松余华兴
重庆电力高等专科学校学报 2017年3期
关键词:序列化线程队列

赵长松,余华兴,贺 胜,董 纬,王 玉

(国网重庆市电力公司江北供电公司,重庆401147)

Java反序列化漏洞利用工具的实现

赵长松,余华兴,贺 胜,董 纬,王 玉

(国网重庆市电力公司江北供电公司,重庆401147)

通过对Java反序列化漏洞形成原因及利用原理的研究,结合RMI编程技术,自主设计漏洞扫面及漏洞利用算法,并实现了针对WebLogic中间件的漏洞利用工具,包含自动扫描探测漏洞以及系统命令执行、文件上传等功能。通过实际测试,该工具能准确地发现存在的漏洞主机并有效地利用漏洞执行相关操作,在一定程度上可帮助运维人员及时修补安全隐患,提高业务系统防护水平。

反序列化;RMI;漏洞扫描;漏洞利用;WebLogic

1 Java反序列化漏洞简介

Java是一种可以编写跨平台应用程序的纯面向对象的程序设计语言。该语言技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网。与传统程序不同,Java语言在推出之际就作为一种开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。“Java语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。

序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象[1]。Java中的ObjectOutputStream类的writeObject()方法可以实现序列化,ObjectInput Stream类的readObject()方法用于反序列化。如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行[2-4]。

基于Java语言的应用系统在国内的应用范围比较广,支撑着很多企业的核心业务。因此,2015年11月6日,FoxGlove Security安全团队发布的博客中介绍的Java反序列化漏洞产生了巨大影响。Java反序列化漏洞是利用Apache Commons Collec tions这个常用的Java库来实现任意代码执行,可以用来攻击最新版的WebLogic,WebSphere,JBoss,Jen kins,OpenNMS等Java应用。Apache Commons Col lections包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。该漏洞出现的根源在Apache Commons Collections组件中,对于集合的操作存在可以进行反射调用的方法,并且Ob jectInputStream类在反序列化时,没有对生成对象的类型进行限制以及任何校验。

2 工具介绍

2.1 工具简介

Java反序列化漏洞利用工具是基于Java反序列化漏洞,针对WebLogic中间件进行漏洞利用。在基于Java的分布式应用中,远程方法调用(remote method invocation,RMI)技术默认使用序列化和反序列化来完成所有的交互。此外,WebLogic是通过T3协议来传输序列化的类,只要能访问WebLogic,就可以使用,不需要加载远程类。因此,利用RMI技术编写包含Apache Commons Collections组件的接口,并通过T3协议来完成工具和服务器之间的通信,就可以利用漏洞完成相关操作[5]。

RMI是jdk1.1中引入的分布式对象软件包,支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程。RMI目前使用Java远程消息交换协议(java remote messaging protocol,JRMP)进行通信,其开发的应用系统可以部署在任何支持Java运行环境(java run environ ment,JRE)的平台上。此外,RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接。RMI还可利用标准JDBC包与现有的关系数据库连接[6]。RMI/JNI和RMI/JDBC相结合,可使RMI与目前使用非Java语言的现有服务器进行通信,而且在需要时可扩展Java在这些服务器上的使用。

RMI工作过程如图1所示。RMI由4个主要的类组成:远程对象的本地接口、远程对象实现、RMI客户机和RMI服务器。RMI服务器生成远程对象实现的1个实例,并用1个专有的URL注册。RMI客户机在远程RMI服务器上查找服务对象,并将它转换成本地接口类型。其中RMI客户机中stub程序扮演着远程服务器对象的代理角色,使该对象可被客户激活。远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往1个还是多个服务器。传输层管理实际的连接,并且追踪可以接受方法调用的远程对象。服务器端的Skeleton程序完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回[7]。

图1 RMI工作过程

2.2 工具功能简介

Java反序列化漏洞利用工具采用Java RMI技术,利用Java反序列化漏洞原理,对运行有WebLog ic中间件的主机进行漏洞扫描,并利用存在的漏洞实现进行命令执行等功能[8]。

工具通过解析用户输入的主机地址、网段、端口号、线程数量等信息,自动生成任务队列,在调度算法的作用下对目标进行扫描探测,测试漏洞是否存在,并及时输出反馈探测结果,有助于管理人员及时发现并修补相关漏洞。此外,工具还提供了漏洞利用功能,对存在漏洞的主机进行文件上传、命令执行等操作,进一步验证漏洞的真实性[9]。

3 工具设计与分析

本文所介绍的Java反序列化漏洞利用工具,包含漏洞扫描以及漏洞利用模块两大部分。其使用流程如图2所示。

首先,操作人员启动漏洞扫描模块,在指定的输入框内输入所需要扫描的多个目标地址或网段、相应的端口范围,以及扫描时所需的线程数量,并以逗号进行分隔。而后,点击“扫描”按钮开始扫描。工具会根据相应算法生成任务队列,在调度算法的调度管理下进行扫描工作,再将扫描进度以及存在漏洞的主机信息,如IP地址、端口号、操作系统类型等输出显示。当操作人员得到存在漏洞的主机信息时,可使用漏洞利用模块对漏洞进行进一步验证以及实现执行系统命令、文件上传等功能[10]。

图2 工具使用过程

4 功能模块实现

4.1 漏洞扫描模块

漏洞扫描模块旨在根据操作人员输入的目标地址信息(包含网段、地址范围等)以及端口信息,自动生成扫描任务队列,并在调度程序的作用下进行扫描、探测漏洞信息,并将扫描结果返回输出。该模块主要包含输入数据处理子模块、作业调度子模块、漏洞探测子模块等3部分。其主要结构如图3所示。

图3 漏洞扫描模块结构图

1)输入数据处理子模块

输入数据处理子模块旨在根据操作员输入的信息,自动生成任务队列,为作业调度子模块提供作业信息。其中,IP地址输入信息支持多地址、多网段输入,各个地址及网段之间用“,”分隔,如“192.168.1.1,192.168.1.2,192.168.3.0/24”;端口输入信息支持多端口输入,各个端口之间用“,”分隔,如“7001,7002,7010-7020”。操作员输入完成后,工具会根据不同的作业调度算法生成不同的作业队列。

①“线程-主机”算法作业队列

“线程-主机”算法作业队列由主机地址信息队列和主机端口信息队列组成。

主机地址信息队列主要存放目标主机IP地址信息,通过对IP地址输入信息进行解析并生成。

首先,对非空的IP地址输入信息按“,”进行分割。而后,逐一判断分割后的子信息是否为一个单独的IP地址:若是单独的IP地址,则加入到主机地址信息队列;若不是单独的IP地址,则对该子信息按“/”分割,分离出网络号和子网掩码。最后,通过网络号和子网掩码位数计算出该网段中所有IP地址,并逐一加入到主机地址信息队列中。

主机端口信息队列主要存放目标主机端口信息,通过对端口输入信息进行解析并生成。

首先,对非空的端口输入信息按“,”进行分割。而后,逐一判断分割后的子信息是否为一个单独的端口:若是单独的端口信息,则加入到主机端口信息队列;若不是单独的端口,则对该子信息按“-”分割,分离出其实端口号和结束端口号。最后,计算出该端口范围中所包含的端口信息,并逐一加入到主机端口信息队列中。

②“线程-端口”算法作业队列

“线程-端口”算法作业队列仅有一个作业信息队列,队列中每个元素包含1个主机IP地址信息和1个端口信息。该队列生成方法与“线程-主机”算法作业队列类似,将主机地址信息队列中每个IP地址和主机端口信息队列中所有端口进行对应,形成作业信息队列。

2)作业调度子模块

作业调度子模块旨在根据不同的调度算法为作业队列中的作业分配线程进行处理[11]。

①“线程-主机”调度算法

“线程-主机”调度算法是将主机地址信息队列中某1个地址分配给1个线程,由该线程完成该地址所有端口的扫描任务。其算法流程如图4所示。

首先,判断当前线程是否已达到操作员要求的线程数上限:若已达到,则等待线程退出;若未达到,则新建线程。而后,线程判断目前主机地址信息队列是否为空:若为空,则线程退出;若不为空,则从主机地址信息队列中取出该地址信息,并和主机端口信息中所有端口信息进行组合后,交由漏洞探测子模块进行漏洞探测,所有端口均已探测后,线程退出。待所有线程退出且主机地址信息队列为空时,调度算法退出,扫描工作完成。

图4 “线程-主机”调度算法流程图

②“线程-端口”调度算法

“线程-端口”调度算法是将作业信息队列中每个作业分配给1个线程,每个线程只负责1个地址1个端口的扫描任务。

首先,判断当前线程是否已达到操作员要求线程数上限:若已达到,则等待线程退出;若未达到,则新建线程。而后,线程判断目前作业信息队列是否为空:若为空,则线程退出;若不为空,则从作业信息队列中取出1条作业信息,将其中的地址信息和端口信息交漏洞探测子模块进行漏洞探测,探测完毕后线程退出。待所有线程退出且作业信息队列为空时,调度算法退出,扫描工作完成[12]。

3)漏洞探测子模块

漏洞探测子模块旨在根据作业调度子模块中传送的地址信息和端口信息,进行漏洞探测验证,并将结果反馈显示。

首先,根据地址信息和端口信息连接目标主机,上传漏洞验证包,并进行服务注册操作。若系统报错,并经过重连测试后仍不成功,则断开连接,并退出;若系统不报错则远程执行系统命令,如“whoami”。若执行成功则说明存在该漏洞,工具在显示输出目标主机信息后断开连接;若命令执行不成功则断开连接。

4.2 漏洞利用模块

漏洞扫描模块主要功能是利用漏洞原理,对存在漏洞的主机进行命令执行、文件上传等操作。该模块主要包含目标主机连接子模块、命令执行子模块、文件上传子模块等3部分其主要结构如图5所示[13]。

图5 漏洞利用模块结构图

1)主机连接子模块

主机连接子模块为整个漏洞利用模块的前驱模块,其功能是根据操作人员输入的目标主机信息(含IP地址、端口号、操作系统类型),连接目标主机,将已经编译好的包含函数接口的jar包通过WebLogic中T3协议上传至目标主机,并在目标主机上注册绑定已上传的jar包服务。该jar包主要包括命令执行接口和文件上传接口,如图6所示。此外,该子模块还负责在连接断开时解绑并删除目标主机上的jar包服务。

图6 服务接口定义

2)系统命令执行子模块

系统命令执行子模块在主机连接子模块成功的前提下进行操作。其主要功能为通过本地远程调用已注册的服务中命令执行功能,执行操作人员所输入的命令,并回显命令执行结果。

3)文件上传子模块

文件上传子模块同样是在主机连接子模块成功的前提下进行操作。其主要功能为通过本地远程调用已注册的服务中文件读写功能,将操作人员所指定的文件内容写在目标主机指定的目录下,实现文件上传功能[14]。

5 工具实践

5.1 实践环境部署

本次实践在虚拟机上进行,目标主机IP为192.168.56.100,操作系统为Windows Server 2003 SP2,安装WebLogic 10.36,服务端口7001。工具运行机IP为192.168.56.1,操作系统为win10专业版,安装Java 8.0(工作版本为1.8.0_60-b27)。

5.2 工具运行实践

启动工具,对192.168.99,192.168.100,192.168.101这3个地址的7000-7010号端口进行扫描,总计任务量33个,扫描线程3个。扫描结果如图7所示,发现存在漏洞的主机IP地址为192.168.56.100,端口为7001,操作系统为Windows。

图7 漏洞扫描

根据扫描结果进行漏洞利用,执行系统命令“net user”,其结果如图8所示。上传java_test.txt文件至目标主机“C:\”下,执行结果如图9所示[15]。

图8 命令执行

图9 文件上传

5.3 存在的不足与改进

在工具的实践过程中,利用工具对存在漏洞的虚拟服务器进行漏洞扫描和利用,能较为真实地模拟实际运行环境,充分验证工具漏洞扫描模块的准确性和漏洞利用模块的稳定性。然而,该工具仅针对WebLogic中间件进行扫描和利用,目标环境较为单一,可逐步增加对Jenkins,Jboss,WebSphere等常用中间件的支持。

6 结束语

本文针对2015年年底发布的Java反序列化漏洞进行了深入分析。在对漏洞原理进行深入研究的基础上,给出了基于Java反序列化漏洞扫描利用工具的设计,并且就漏洞扫描模块及漏洞利用模块的实现进行了比较详细的阐述。在工具实践环节,笔者也通过搭建虚拟服务器模拟真实运行环境,并利用工具成功发现漏洞、利用漏洞,达到预期目标。

[1] 肖波,陈正学.基于JAVA的序列化应用研究[J].智能计算机与应用,2008(6):53-55.

[2] 晏立,沈锐.Java序列化技术的探讨[J].红河学院学报,2011(4):37-39.

[3] 朱建红,陆保国.基于对象序列化技术的数据分发系统[J].网络安全技术与应用,2014(1):49-50.

[4] 许晖.应用XML实现Java对象序列化技术简述[C]//中国计算机学会计算机应用专业委员会.Java技术及应用的进展——第七届中国Java技术及应用交流大会文集.北京:[出版者不详],2004:10.

[5] 佚名.Lib之过?Java反序列化漏洞通用利用分析[EB/OL].(2015-11-12)[2016-09-10].http://www.secpulse.com/archives/40420.html.

[6] 戴亮,方晓勤,李丽.一种新的基于序列化的Java RMI方法[J].计算机工程,2006,32(22):99-101.

[7] 高雅侠,邹海荣.基于Java的RMI技术的研究与应用[J].计算机与数字工程,2011,39(8):174-177.

[8] 刘楠,金护平.RMI分布式对象技术的研究与应用[J].航空计算技术,2009,39(1):142-145.

[9] BREG F,POLYCHRONOPOULOSC D.Java virtualma chine support for object serialization[C]//John Wiley&Sons,Ltd.,2001:173-180.

[10]LOERTSCHER D V.The library learning commons col lection is core-or is it?[J].Teacher Librarian,2014,41(4):48-63.

[11]毛莉,刘海.WebLogic安全构架及安全技术应用[J].计算机技术与发展,2004,14(9):56-59.

[12]夏家莉,陈辉,杨兵.一种动态优先级实时任务调度算法[J].计算机学报,2012,35(12):2 685-2 695.

[13]CALLEJA G,PASTOR R.A dispatching algorithm for flexible job shop scheduling with transfer batches:an in dustrial application[J].Production Planning&Control,2014,25(2):93-109.

[14]Breenmachine.What Do WebLogic,WebSphere,JBoss,Jenkins,OpenNMS,and Your Application Have in Com mon?This Vulnerability[EB/OL].(2015-11-16)[2016-09-10].https://foxglovesecurity.com/2015/11/06/what-do-WebLogic-websphere-jboss-jen kins-opennms-and-your-application-have-incommon-this-vulnerability.

[15]张海南.用WebLogic中间件构架应用系统[D].南京:南京理工大学,2004.

[16]曾雅琳,郭斌.基于Java的GUI设计与实现[J].计算机与现代化,2005(10):116-117.

A Study on the Creation of the De Serialized Tool of the Exploitation of Vulnerabilities of Java

ZHAO Changsong,YU Huaxing,HE Sheng,DONGWei,WANG Yu
(Jiangbei Power Supply Branch of State Grid Chongqing Electric Power Company,Chongqing 401147,P.R.China)

Based on the causes and the exploitation principles of the de serialized vulnerabilities of Java,in combina tion with the RMIprogramming technique,this paper introduces a self designed algorithm for the scanning and ex ploiting of vulnerabilities,which can help create a tool of the exploitation of vulnerabilities for theWebLogicmiddle ware with such functions as automatically scanning and detecting vulnerabilities,implementing system commands and uploading files.Practical tests have shown that the tool can accurately discover hosts with vulnerabilities and carry out relevantoperations by exploiting them,which can help operation and maintenance staffmembers patch po tential safety hazards and improve their professional skills in the system protection.

deserialization;RMI;vulnerability scanning;exploitation of vulnerabilities;WebLogic

TP312.2

A

1008 8032(2017)03 0049 05

2016-11-03

该文获重庆市电机工程学会2016年学术年会优秀论文二等奖

赵长松(1987-),工程师,主要从事信息安全工作。

猜你喜欢
序列化线程队列
基于C#线程实验探究
如何建构序列化阅读教学
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于国产化环境的线程池模型研究与实现
在队列里
丰田加速驶入自动驾驶队列
浅谈linux多线程协作
Java反序列化漏洞探析及其修复方法研究
Java 反序列化漏洞研究