JRMPClient 反序列化

JRMPClient 反序列化

当目标存在反序列化入口时,可以尝试构造反序列化链让目标在指定端口开启 JRMP 服务,这样我们就可以连接目标开启的 JRMP 服务进行一些后续操作。

Gadget

/*
 * Gadget:
 *   UnicastRemoteObject#readObject
 *     UnicastRemoteObject#reexport
 *       UnicastRemoteObject#exportObject
 *         UnicastRemoteObject#exportObject
 *           UnicastServerRef#exportObject
 *             LiveRef#exportObject
 *               TCPEndpoint#exportObject
 *                  TCPTransport#exportObject
 *                    TCPTransport#listen
 * */

UnicastRemoteObject#readObject 调用 UnicastRemoteObject#reexport 方法

image-20220124221648216

UnicastRemoteObject#reexport 方法调用 UnicastRemoteObject#exportObject 方法

image-20220124221723793

传入指定的端口实例化 UnicastServerRef 对象

image-20220124221823395

跟进一下实例化过程

image-20220124221844486

跟进实例化 LiveRef 的过程,ObjID 对象主要用来标识的,在这里没啥作用,这里构造方法有很多重载,我们关注 ep 属性的赋值

image-20220124222131995

跟进 TCPEndpoint#getLocalEndpoint 方法,传入的参数为指定的端口,这里是关键的地方,主要用来创建一个 TCPEndpoint 对象并对其进行操作之后返回。

image-20220124222331076

具体逻辑捋一捋,这里看一个比较关键的地方,实例化一个 TCPTransport 并赋值给 var3.transport

image-20220124222726328

跟进一下实例化的过程,发现是把传入的参数赋值给了 epList 属性,这个挺关键的,后面会用到

image-20220124222825092

然后操作完成之后返回 var3,这里相当于是把 var3 赋值给 ep 属性

image-20220124222932800

实例化 LiveRef 出来之后调用 UnicastServerRef 的父类构造,把实例化出来的 LiveRef 赋值给 ref 属性

image-20220124223942906

实例化完之后回到 exportObject 方法

image-20220124222958498

调用 UnicastRemoteObject#exportObject 方法

image-20220124223057775

然后调用 UnicastServerRef#exportObject 方法

image-20220124224130529

调用 ref 属性的 exportObjec 方法,ref 属性根据前面分析就是 LiveRef

image-20220124224233486

调用 ep 属性的 exportObject 方法,ep 属性就是 TCPEndpoint ,那么调用 TCPEndpoint#exportObjec

image-20220124224333673

接着调用 transport 属性的 exportObject 方法,transport 属性就是 TCPTransport,那么就调用 TCPTransport#exportObject 方法

image-20220124224458518

这里接着调用 TCPTransport#listen 方法

image-20220124224537417

看一下 getEndpoint 方法,这里返回的就是 epList 属性,前面这个属性被设置有内容的

image-20220124224644170

最后获取端口等信息开启 JRMP 服务

image-20220124224728431

public class JRMPListener {

    public static byte[] getSerializeData() throws Exception{
        UnicastRemoteObject unicastRemoteObject = (UnicastRemoteObject) Reflect.reflectGetObject("java.rmi.server.UnicastRemoteObject", new Class[]{}, new Object[]{});
        // 反射修改 port 属性
        Reflect.reflectSetField(unicastRemoteObject,"port", Integer.parseInt(ParseArgs.JRMPListenerPort));
        byte[] bytes = SerWithUnSer.serialize(unicastRemoteObject);
        return bytes;
    }

    public static void main(String[] args) throws Exception{
        ParseArgs.parseArgs(args);
        byte[] bytes = getSerializeData();
        SerWithUnSer.unSerialize(bytes);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值