ysoserial exploit/JRMPListener原理剖析

本文深入解析了ysoserialexploit/JRMPListener的工作原理,详细介绍了利用JRMPListener进行攻击的过程,包括如何生成payload,以及gadget链分析。文章还探讨了JRMPListener与JRMPClient的交互机制,揭示了命令执行的触发点。

0 前言

上一篇文章讲了ysoserial exploit/JRMPClient的原理,本篇接着讲一下ysoserial exploit/JRMPListener的原理,相同的思路,我们结合着payloads/JRMPClient来分析。JRMPListener的攻击流程如下:
1、攻击方在自己的服务器使用exploit/JRMPListener开启一个rmi监听

2、往存在漏洞的服务器发送payloads/JRMPClient,payload中已经设置了攻击者服务器ip及JRMPListener监听的端口,漏洞服务器反序列化该payload后,会去连接攻击者开启的rmi监听,在通信过程中,攻击者服务器会发送一个可执行命令的payload(假如存在漏洞的服务器中有使用org.apacje.commons.collections包,则可以发送CommonsCollections系列的payload),从而达到命令执行的结果。

1 payloads/JRMPClient

1.1 Externalizable

在讲payloads/JRMPClient之前,我们先讲一下Externalizable,这是java提供的一个接口,实现该接口的类就具备了可序列化功能,下面总结一下它和Serializable接口的一些相同点与不同点:
1、实现Externalizable接口的类必须重写writeExternal(ObjectOutput out)和readExternal(ObjectInput in)两个方法,在这两个方法中可以自定义序列化和反序列化规则,而实现Serializable接口的类没有需要强制实现的方法。
2、假设类中有些敏感数据,我不希望在网络上传输该对象的序列化数据中包含该敏感数据,两种接口都可以实现:
(1)Externalizable接口,在实现writeExternal(ObjectOutput out)方法时,不对敏感数据进行序列化就可以
(2)Serializable接口,使用transient关键字修饰敏感字段,则该字段将不会被序列化。
对比一下,使用transient关键字修饰其实更方便。
3、两个各有特点,只能是根据不同的业务需求去选择使用。
下面我写了一个关于Externalizable的测试类,来进一步理解Externalizable:

public class Person implements Externalizable {
   
   

    private String username; //用户名
    private String password; //密码

    public String getUsername() {
   
   
        return username;
    }

    public void setUsername(String username) {
   
   
        this.username = username;
    }

    public String getPassword() {
   
   
        return password;
    }

    public void setPassword(String password) {
   
   
        this.password = password;
    }

    //在序列化Person对象时,只序列化username属性
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
   
   
        System.out.println("writeExternal is running ...");
        out.writeObject(username);
        out.close();
    }

    //反序列化Person对象时,只反序列化username属性
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
   
   
        this.username = (String)in.readObject();
        System.<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值