🗒️weblogic 反序列化
2021-7-2
| 2023-4-18
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
weblogic

概念

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

基于T3协议

CVE

T3协议

RMI(Remote Method Invocation)即远程方法调用。它能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个Java虚拟机中的对象上的方法。它支持序列化的Java类的直接传输。
T3协议是Weblogic独有的一个协议,相比于JRMP协议多了一些特性。以下是T3协议的特点:
服务端可以持续追踪监控客户端是否存活(心跳机制),通常心跳的间隔为60秒,服务端在超过240秒未收到心跳即判定与客户端的连接丢失。 通过建立一次连接可以将全部数据包传输完成,优化了数据包大小和网络消耗。

结构

T3协议里包含请求包头和请求的主体这两部分内容。
请求包头 请求包的头如下
t3 12.2.1 AS:255 HL:19 MS:10000000 PU:t3://us-l-breens:7001 请求主体 T3协议中传输的都是序列化数据,分为七个部分,第一部分就是协议头,也就是
t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n
notion image
第二到第七部分内容,开头都是ac ed 00 05,说明这些都是序列化的数据。只要把其中一部分替换成我们的序列化数据就可以了,有两种替换方式
将weblogic发送的JAVA序列化数据的第二到九部分的JAVA序列化数据的任意一个替换为恶意的序列化数据。 将weblogic发送的JAVA序列化数据的第一部分与恶意的序列化数据进行拼接。

原理

rmi使用专门的远程消息交换协议JRMP,但在weblogic server中的rmi进行了高度优化,使用T3协议进行数据传输.在weblogic的反序列化操作中未对传入的序列化数据做任何处理 ,把T3协议中的序列化数据替换成这个生成的payload即可触发反序列化漏洞。
洞的触发点在wlserver\server\lib\wlthint3client.jar!\weblogic\rjvm\InboundMsgAbbrev.class中,其中的readObject()方法会处理T使用3协议传入的序列化数据。在readObject()方法中又去调用了InboundMsgAbbrev.ServerChannelInputStream的readObject方法,这里的var1即是Java序列化数据。
查看ServerChannelInputStream这个类,发现其继承于ObjectInputStream,而且并没有重写readObject()方法,可以说这里没有对传入的序列化数据做任何处理,直接传入ObjectInputStream的readObject()方法中进行反序列化操作。

修复

1.下载安装最新的补丁。 2.重写resolveClass方法,使用黑名单 resolveClass方法是ObjectInputStream.readObject()方法执行反序列化时必定会进行调用的一个方法, 重写resolveClass方法,使用黑名单的方式,让攻击者无法获取用于执行命令的相关类的Class对象。 3.若服务在外网的情况下,可以使用以下两种方式进行防御:
采用web代理,这样只能转发HTTP的请求,而不会转发T3协议的请求。
使用负载均衡,并且指定需要进行负载均衡的协议类型为HTTP,不接收其他的协议请求转发。 参考:https://www.bilibili.com/read/cv17256282/

基于XMLDecoder

CVE-2017-10271 影响版本:10.3.6.0.0

原因

Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,并且未对用户传入的数据进行过滤,在解析的过程中出现反序列化漏洞,导致可执行任意命令。

过程

漏洞点产生于servlet路由中,servlet调用关键的WorkContextMapInterceptor的receiveRequest方法,就有可能触发漏洞,然后在xmlDecoder.readObject()中被解析,在解析过程中,scanDocument循环执行next()方法,对XML进行了解析和事件处理。然后循环调用addAttribute方法获取其所有属性,并在解析结束标签时调用getValueObject 获取标签中的值的信息,最终在ObjectElementHandler处理器中,完成命令的拼接和执行。

修复

1、及时打上官方CVE-2019-2725补丁包。官方已于4月26日公布紧急补丁包
2、升级本地JDK版本
因为Weblogic所采用的是其安装文件中默认1.6版本的JDK文件,属于存在反序列化漏洞的JDK版本,因此升级到JDK7u21以上版本可以避免由于Java原生类反序列化漏洞造成的远程代码执行。
3、配置URL访问控制策略
部署于公网的WebLogic服务器,可通过ACL禁止对/_async/及/wls-wsat/路径的访问。
4、删除不安全文件
删除wls9_async_response.war与wls-wsat.war文件及相关文件夹,并重启Weblogic服务。 官方版本修复: CVE-2017-3506 过滤了object标签,因为void和object的handler因为是父子类关系,所以把上面的object标签替换为void即可。 CVE-2017-10271 继续把黑名单补全,可见除了object,还有method,new,array等标签都被做了处理。object,new,method标签直接被ban,void属性只能设置index,array的class只能设置为byte类型。

问题

为什么漏洞在路由中? 因为web.xml url与servlet对应关系,webService 解析soap请求并且绑定了处理协议的路由。
个人理解:漏洞也可以说是存在于组件当中吧,因为从请求路由开始到组件解析这一整个过程,前后两个部分都是可以避免漏洞产生的,在路由阶段过滤恶意请求,进行访问控制,在组件里过滤恶意标签或者标签里的恶意代码都可以进行避免.
 
 
漏洞
  • 反序列化
  • 漏洞
  • Docker Desktop和Burp suite Vulmap
    目录