前言
最近在对Weblogic进行研究,研究过程中需要对weblogic的基础知识有所了解,苦于自己懒又不愿意去查找官方文档以及各类参考文章去总结,为此在查阅了各类资料后,找到了几篇写的比较全的文章,可能是你能找到的最详细的WebLogic安全相关中文文档,由于文章介绍很详细,部分内容其实对自己的研究没什么影响,因此仅从中摘录了对于漏洞复现有关的内容,具体如下,如果有想查看原文的同学可以通过下方链接直达。不过介绍之前还是有必要声明该文章的来源及出处,防止侵权,在此也感谢各位前辈们在研究过程中付出的点点滴滴和共享的成果,让大家能够在研究的道路上摸清方向!
- WebLogic安全研究报告引用文章说明
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://nosec.org/home/detail/2859.html
来源:奇安信
本文版权归原作者所有,如有侵权请联系我及时删除
- weblogic cve漏洞捡漏指南引用文章说明
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:weblogic cve漏洞捡漏指南
来源:宽字节安全公众号
本文版权归原作者所有,如有侵权请联系我及时删除
Oracle WebLogic Server
Oracle WebLogic Server(以下简称WebLogic)是一个可扩展的企业级Java平台(Java EE)应用服务器。其完整实现了Java EE 5.0规范,并且支持部署多种类型的分布式应用程序。
实际上WebLogic是组成Oracle融合中间件的核心。几乎所有的Oracle融合中间件产品都需要运行WebLogic Server。因此,本质上,WebLogic Server不是Oracle融合中间件,而是构建或运行Oracle融合中间件的基础,Oracle融合中间件和WebLogic密不可分,却在概念上不相等。
WebLogic的版本
WebLogic版本众多,但是现在我们经常见到的只有两个类别:10.x和12.x,这两个大版本也叫WebLogic Server 11g和WebLogic Server 12c。根据Oracle官方下载页面https://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-for-dev-1703574.html(从下向上看):
10.x的版本为Oracle WebLogic Server 10.3.6,这个版本也是大家用来做漏洞分析的时候最喜欢拿来用的版本。P牛的vulhub(https://github.com/vulhub/vulhub)中所有WebLogic漏洞靶场都是根据这个版本搭建的。
12.x的主要版本有:
- Oracle WebLogic Server 12.1.3
- Oracle WebLogic Server 12.2.1
- Oracle WebLogic Server 12.2.1.1
- Oracle WebLogic Server 12.2.1.2
- Oracle WebLogic Server 12.2.1.3
- Oracle WebLogic Server 12.2.1.4
值得注意的是,Oracle WebLogic Server 10.3.6支持的最低JDK版本为JDK1.6, Oracle WebLogic Server 12.1.3支持的最低JDK版本为JDK1.7,Oracle WebLogic Server 12.2.1及以上支持的最低JDK版本为JDK1.8。因此由于JDK的版本不同,尤其是反序列化漏洞的利用方式会略有不同。同时,不同的Oracle WebLogic Server版本依赖的组件(jar包)也不尽相同,因此不同的WebLogic版本在反序列化漏洞的利用上可能需要使用不同的Gadget链(反序列化漏洞的利用链条)。但这些技巧性的东西不是本文的重点,请参考其他文章。如果出现一些PoC在某些时候可以利用,某些时候利用不成功的情况,应考虑到这两点。
WebLogic的安装
对于weblogic的安装,因为直接打包为了jar包文件,因此支持跨平台安装,既支持在windows上安装,也支持在linux下安装,windows的安装过程直接图形化界面安装即可,网上也有很多的参考资料,自行查阅相关资料即可安装;对于Linux操作系统,推荐使用WebLogic环境搭建工具,工具地址:https://github.com/QAX-A-Team/WeblogicEnvironment,也可参考我的博文 weblogic环境部署与远程调试 快速搭建和开启远程调试。
WebLogic漏洞分类
WebLogic爆出的漏洞以反序列化为主,通常反序列化漏洞也最为严重,官方漏洞评分通常达到9.8。WebLogic反序列化漏洞又可以分为xmlDecoder反序列化漏洞和T3反序列化漏洞。其他漏洞诸如任意文件上传、XXE等等也时有出现。
只有实现了Serializable接口的类的对象才可以被序列化,而Externalizable则extends Serializable接口,并增加了两个方法writeExternal()和readExternal()。这两个方法会在序列化和反序列化还原的过程中被自动调用,以便执行一些特殊的操作。而且针对于类中不需要被序列化的属性,可以加上 transient关键字,该字段代表生命周期仅在内存中而不会持久化。
WebLogic安全补丁
WebLogic安全补丁通常发布在Oracle关键补丁程序更新、安全警报和公告 (https://www.oracle.com/technetwork/topics/security/alerts-086861.html) 页面中。其中分为关键补丁程序更新(CPU)和安全警报(Oracle Security Alert Advisory)。
关键补丁程序更新为Oracle每个季度初定期发布的更新,通常发布时间为每年1月、4月、7月和10月。安全警报通常为漏洞爆出但距离关键补丁程序更新发布时间较长,临时通过安全警报的方式发布补丁。
所有补丁的下载均需要Oracle客户支持识别码,也就是只有真正购买了Oracle的产品才能下载。
weblogic 补丁分析指南
1.1 Opatch
在你挖到漏洞后,最好安装weblogic的最新补丁来校验一下你的exp是否在最新补丁下生效。weblogic使用Opatch来管理补丁。在某些补丁中,补丁包对于Opatch最小版本是有要求,这时候我们需要升级Opatch补丁号为 [28186730: OPATCH 13.9.4.2.4 FOR FMW/WLS 12.2.1.3.0, 12.2.1.4.0 AND 14.1.1.0.0]
来解决这个问题
下载后,解压至任意文件夹 Windows 执行下面的命令
1 | java -jar opatch_generic.jar -J-Doracle.installer.oh_admin_acl=true -silent oracle_home=<ORACLE_HOME_LOCATION> |
其它系统执行下面的命令
1 | java -jar <PATCH_HOME>/6880880/opatch_generic.jar -silent oracle_home=<ORACLE_HOME_LOCATION> |
有不懂的,看压缩包里的Readme
1.2 Opatch 打补丁
下载补丁后,解压至任意文件夹即可
在Oracle_home 安装目录中,找到Opatch文件夹,执行升级操作即可 Opatch apply 补丁解压的文件夹(注意是最内层文件夹)
1.3 下载补丁(需要CSI)
我们只关心安全补丁,下面说下怎么下载补丁
登录Oracle support网站,找到Patchs&Updates 栏目,点击进去
查询条件,自己根据需要构造即可
REC的补丁,并且被标记为security,且Generic Platform平台,即是补丁
注意,oracle每年发布四次安全补丁,安全补丁可以跨版本打,也就是说,老补丁同时也集成在新补丁中,这点一定注意。
weblogic 补丁分析方法
weblogic中的补丁,其实是一个个编译好的class文件,我们直接使用idea打开补丁文件夹,就可以利用idea的反编译功能区分析补丁。
补丁中,每个class文件,都对应weblogic 实际目录中的一个class文件,打补丁你可以认为强行替换weblogic 中相关jar包中的class文件。
下面讲一下分析要点。对于这种安全补丁中,只有关于weblogic自身的安全问题,才会在这里体现,一般第三方包的安全漏洞,不会在该补丁中。
1.1 weblogic 黑名单
直接看files\oracle.wls.jrf.tenancy.common.sharedlib\12.2.1.4.0\wls.common.symbol\modules\com.bea.core.utils.jar\weblogic\utils\io
文件夹下的WeblogicFilterConfig.class
文件
因为weblogic 的漏洞,绝大多数都是T3协议、IIOP协议的java反序列化漏洞。而weblogic为了修复该漏洞,最简单的办法是设置反序列化黑名单并添加黑名单列表。如果反序列化时遇到的类存在于黑名单中,则中止反序列化过程。
我们只需要diff黑名单列表,自己研究构造poc即可。有的时候不一定是rce,也有可能是其他问题。
1.2 其他反序列化类
如果触发反序列化的类在正常业务中可能需要,或者因为其他原因不能屏蔽,weblogic的修复方法为直接修改相关的类。
如果一个类在readObject方法中,自己私自调用ObjectInputStream去执行反序列化操作而不是用weblogic提供的FilterInputStream执行反序列化操作,这样的话会导致weblogic的黑名单失效。这也就是反序列化中的反序列化漏洞,这种漏洞在weblogic中挺常见的。(不限于T3协议)
我们diff中,可以明显发现weblogic的补丁将ObjectInputStream更改为FilterInputStream。在weblogic中,只有FilterInputStream才会在反序列化的流程中检查黑名单类。
然后,我们根据这个类中的参数,自己构造一个类即可。
在idea中,覆盖一个类最简单的办法是,在自己的项目中创建一个与被覆盖的类包名相同类名相同的类,然后修改你想要修改的代码即可。例如在这个反序列化中,我要修改writeExternal
方法。直接强行替换成cve-2020-2555的gadget。
1.3 T3反序列化 XXE
一般情况下该类漏洞都是在继承自Exterinalizable的类 中,在自定义序列过程时,将类的某些字段,作为XML去存储在反序列化的信息中。反序列化时候,读取序列化信息中相关的字符串作为XML去解析。解析的过程中没有考虑到XXE攻击。这次我捡漏的cve就是该类型的漏洞。
Java序列化、反序列化和反序列化漏洞的概念
关于Java序列化、反序列化和反序列化漏洞的概念,可参考@gyyyy写的一遍非常详细的文章:《浅析Java序列化和反序列化》(https://github.com/gyyyy/footprint/blob/master/articles/2019/about-java-serialization-and-deserialization.md)。这篇文章对这些概念做了详细的阐述和分析。我这里只引用一段话来简要说明Java反序列化漏洞的成因:
当服务端允许接收远端数据进行反序列化时,客户端可以提供任意一个服务端存在的目标类的对象 (包括依赖包中的类的对象) 的序列化二进制串,由服务端反序列化成相应对象。如果该对象是由攻击者『精心构造』的恶意对象,而它自定义的readobject()中存在着一些『不安全』的逻辑,那么在对它反序列化时就有可能出现安全问题。
参考文章
- https://nosec.org/home/detail/2859.html
- weblogic cve漏洞捡漏指南 (qq.com)
- https://mp.weixin.qq.com/s?__biz=MzU5NDgxODU1MQ==&mid=2247485058&idx=1&sn=d22b310acf703a32d938a7087c8e8704&chksm=fe7a221ac90dab0cac2aaed6deebe7c56e316f767e2fb91e44e8e08aaa0a48790b4eefb447df&mpshare=1&scene=1&srcid=&sharer_sharetime=1565607726135&sharer_shareid=37947731a17f1281ace10f1fc77146cf&key=e8e84aec0427272da90fdc17f4bdf02bb340c1eb7a12b95f91e0bd42a37b76b919e3b2d20fdbf79e4f262cbca90cb1e29a91ce86770010f67819219ef5c033a219db24ca7e87f72ed8786fa9ba946908&ascene=1&uin=MjMwMDM5OTYzMg%3D%3D&devicetype=Windows+10&version=62060833&lang=zh_CN&pass_ticket=l1uvYU9tgLWZe8D9eDAO27kX2BaRjKEi4OgpXzqLM1dXvVoo7n38b4y80UnpE3At