Java RMI服务是远程方法调用(Remote Method Invocation)。它是一种机制,能够让在某个java虚拟机上的对象调用另一个Java虚拟机的对象的方法,它允许不在同一个地址空间中的Java程序互相通信
在Java Web中,很多地方都会用到RMI来相互调用。比如很多大型组织都会在后台部署一些Java应用,用于对外网站发布更新的静态页面,而这种发布命令的下达使用的就是这种RMI形式。
值得注意的是,RMI传输过程必然会使用序列化和反序列化,如果RMI服务端端口对外开发,并且服务端使用了像Apache Commons Collections这种库,那么会导致远程命令执行。
首先来看利用。
fofa: protocol=="java-rmi"
Oracle Java SE是美国甲骨文(Oracle)公司的一套标准版Java平台,用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。Oracle Java SE JDK and JRE 7版本,6 Update 27及其之前版本,5.0 Update 31及其之前版本,1.4.2_33及其之前版本,JRockit R28.1.4及其之前版本中的Java Runtime Environment组件中存在未明漏洞。远程攻击者可破坏关于RMI的机密性,完整性和可用性。
RE 7版本,6 Update 27及其之前版本,5.0 Update 31及其之前版本,1.4.2_33及其之前版本,JRockit R28.1.4及其之前版本
使用Metasploit 进行漏洞验证
use exploit/multi/misc/java_rmi_server
exploit(multi/misc/java_rmi_server) > set rhost 205.221.xx.xx
设置payload
执行攻击
RMI是REMOTE METHOD INVOCATION的简称,是J2SE的一部分,能够让程序员开发出基于JAVA的分布式应用。一个RMI对象是一个远程JAVA对象,可以从另一个JAVA虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地JAVA对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
对于任何一个以对象为参数的RMI接口,你都可以发一个自己构建的对象,迫使服务器端将这个对象按任何一个存在于class path中的可序列化类来反序列化。
该漏洞存在需要两个条件:1.存在反序列化传输。2.存在有缺陷的第三方库如commons-collections
小天之天的测试工具:https://pan.baidu.com/s/1pb-br4vhKT6JlT6MmjHqGg 密码:jkl8
https://www.freebuf.com/vuls/126499.html
https://www.cnblogs.com/junsec/p/11356923.html
https://www.jianshu.com/p/4a2452bf234d
http://www.codersec.net/2018/09/%E4%B8%80%E6%AC%A1%E6%94%BB%E5%87%BB%E5%86%85%E7%BD%91rmi%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%B7%B1%E6%80%9D/