[关闭]
@Dukebf 2017-08-27T16:57:50.000000Z 字数 2808 阅读 999

weblogic 反序列化漏洞

web安全 java安全


前人轮子:
修复weblogic的JAVA反序列化漏洞的多种方法图
我是如何造Weblogic反序列化漏洞EXP的轮子
我是如何造Weblogic反序列化漏洞EXP的轮子 github代码
What Do WebLogic, WebSphere, JBoss, Jenkins, OpenNMS, and Your Application Have in Common? This Vulnerability.

docker 命令:
docker run -i -t -p 7001:7001 -p 8101:8101 -p 5556:5556 oracle/weblogic1221:latest

0x01 weblogic的JAVA序列化漏洞的条件

  1. 可通过搜索代码查找weblogic的jar包中是否包含特定的JAVA类;
  2. 在调用weblogic的停止脚本时,会向weblogic发送JAVA序列化数据;
  3. 可通过ObjectInputStream.readObject方法解析JAVA序列化数据;
  4. weblogic发送的T3数据的前几个字节为数据长度;
  5. 替换weblogic发送的T3数据中的某个序列化数据为恶意序列化数据,可以使weblogic执行指定的代码。

0x02 抓包分析

在Wireshark中,客户端向服务器发送的数据显示为红色,服务器向客户端返回的数据显示为蓝色。

cve-2017-3248

当weblogic客户端向weblogic服务器发送序列化数据时,发送的第一个包为T3协议头.

0x03 对JAVA序列化数据进行解析

注:可以使用ObjectInputStream.readObject方法解析weblogic调用停止脚本时发送的JAVA序列化数据的结构

已知JAVA序列化数据的前4个字节为“AC ED 00 05”
使用十六进制形式查看数据包.java
cve-2017-3248

从上图可以看到,weblogic发送的JAVA序列化数据分为7个部分,第一部分的前四个字节为整个数据包的长度(1711=0x6AF),第二至七部分均为JAVA序列化数据。

此外,weblogic发送的数据包格式如下:
cve-2017-3248

0x04 利用weblogic的JAVA反序列化漏洞

在利用weblogic的JAVA反序列化漏洞时,需要向weblogic发送两个数据包。

第一个数据包为T3的协议头。
经测试,使用“t3 9.2.0\nAS:255\nHL:19\n\n”字符串作为T3的协议头发送给weblogic9、weblogic10g、weblogic11g、weblogic12c均合法。向weblogic发送了T3协议头后,weblogic也会返回相应的数据,以“\n\n”结束.
也可以使用12.2.1的版本的头部.

第二个数据包为JAVA序列化数据,可采用两种方式产生。

  1. 第一种生成方式为,将前文所述的weblogic发送的JAVA序列化数据的第二到七部分的JAVA序列化数据的任意一个替换为恶意的序列化数据。
    cve-2017-3248
  2. 第二种生成方式为,将前文所述的weblogic发送的JAVA序列化数据的第一部分与恶意的序列化数据进行拼接。

在利用weblogic的JAVA反序列化漏洞时,weblogic会抛出异常,但是weblogic已经对恶意的序列化数据执行了readObject方法,漏洞仍然会触发。

经测试,必须先发送T3协议头数据包,再发送JAVA序列化数据包,才能使weblogic进行JAVA反序列化,进而触发漏洞。如果只发送JAVA序列化数据包,不先发送T3协议头数据包,无法触发漏洞。

0x05 不同版本的weblogic对Apache Commons Collections组件的使用

由于只有Collections的特定组件才会引起反序列化漏洞
可通过以下方法准确判断weblogic是否使用了Apache Commons Collections组件特定的JAVA类。
在weblogic中任意安装一个j2ee应用,在某个jsp中写入以下代码。

  1. <%
  2. String path = [需要查找的类的完整类名].class.getResource("").getPath();
  3. out.println(path);
  4. %>

通过浏览器访问运行,可以看到对应的类所在的jar包的完整路径。
通过上述方法查找“org.apache.commons.collections.map.TransformedMap”所在的jar包.
不同版本的不同版本的weblogic对Apache Commons Collections组件的使用情况如下:

weblogic版本 TransformedMap类所在jar包路径
9.2
10.2.1(weblogic 10g)、10.3.4(weblogic 11g) weblogic安装目录的modules/com.bea.core.apache.commons.collections_3.2.0.jar
12.1.3(weblogic 12c) weblogic安装目录的wlserver/modules/features/weblogic.server.merged.jar

由于weblogic 9.2未包含TransformedMap类,因此无法触发反序列化漏洞,weblogic 10g、weblogic 11g、weblogic 12c均包含TransformedMap类,因此会触发反序列化漏洞。

0x06 漏洞修复

weblogic的默认服务端口为7001,该端口提供了对HTTP(S)、SNMP、T3等协议的服务。由于weblogic的不同协议均使用一个端口,因此无法通过防火墙限制端口访问的方式防护JAVA反序列化漏洞。

  1. T3协议与HTTP协议均基于TCP协议,T3协议以"t3"开头,HTTP协议以“GET”、“POST”等开头,两者有明显的区别。因此可以限定只允许特定服务器访问weblogic服务器的T3协议,能够修复weblogic的JAVA反序列化漏洞。

  2. 若将weblogic修复为发送T3协议时要求发送weblogic的用户名与密码,也能够修复weblogic的反序列化问题,但会带来密码如何在weblogic客户端存储的问题。

  3. 使用防火墙禁止通过公网访问weblogic的控制台.

  4. 部署负载均衡或者使用web代理

此外,当部署负载均衡或者使用web代理时,可以起到防护作用,原理如下:
在用户访问服务器的路径中:
web代理
会经过web代理时,在web代理这一层,只对http协议进行代理转发,不转发t3协议.
负载均衡
在进行负载均衡的配置中,只对http协议进行转发.
cve-2017-3248

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注