今天又是weblogic补丁日。这次补丁日中我成功捡漏一个cve漏洞。下面给大家分享一下怎么捡漏weblogic和怎么反馈给weblogic补丁。
既然我们谈到挖weblogic。weblogic框架非常大,初次接触的老哥可能无从下手不知道从哪里开始挖洞。我们可以从补丁来分析一下历史漏洞。这篇文章是我去年下半年在部门分享中讲过,现在分享给大家。在这里还有很多漏洞类型没有覆盖,这种情况不要见怪,这只是一个最基础的讲解。
1. 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]
来解决这个问题
https://support.oracle.com/epmos/faces/PatchHome?_adf.ctrl-state=1cdjuh74ay_4&_afrLoop=92240149765348#
下载后,解压至任意文件夹 Windows 执行下面的命令java -jar opatch_generic.jar -J-Doracle.installer.oh_admin_acl=true -silent oracle_home=<ORACLE_HOME_LOCATION>
其它系统执行下面的命令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 下载补丁
我们只关心安全补丁,下面说下怎么下载补丁 登录Oracle support网站,找到Patchs&Updates 栏目,点击进去
查询条件,自己根据需要构造即可 REC的补丁,并且被标记为security,且Generic Platform平台,即是补丁
注意,oracle每年发布四次安全补丁,安全补丁可以跨版本打,也就是说,老补丁同时也集成在新补丁中,这点一定注意。
1.4 weblogic 补丁分析方法
weblogic中的补丁,其实是一个个编译好的class文件,我们直接使用idea打开补丁文件夹,就可以利用idea的反编译功能区分析补丁。
补丁中,每个class文件,都对应weblogic 实际目录中的一个class文件,打补丁你可以认为强行替换weblogic 中相关jar包中的class文件。
下面讲一下分析要点。对于这种安全补丁中,只有关于weblogic自身的安全问题,才会在这里体现,一般第三方包的安全漏洞,不会在该补丁中。
1.4.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.4.2 其他反序列化类
如果触发反序列化的类在正常业务中可能需要,或者因为其他原因不能屏蔽,weblogic的修复方法为直接修改相关的类。
如果一个类在readObject方法中,自己私自调用ObjectInputStream去执行反序列化操作而不是用weblogic提供的FilterInputStream执行反序列化操作,这样的话会导致weblogic的黑名单失效。这也就是反序列化中的反序列化漏洞,这种漏洞在weblogic中挺常见的。(不限于T3协议
例如 SOAPInvokeStat
我们diff中,可以明显发现weblogic的补丁将ObjectInputStream更改为FilterInputStream。在weblogic中,只有FilterInputStream才会在反序列化的流程中检查黑名单类。
然后,我们根据这个类中的参数,自己构造一个类即可。
在idea中,覆盖一个类最简单的办法是,在自己的项目中创建一个与被覆盖的类包名相同类名相同的类,然后修改你想要修改的代码即可。例如在这个反序列化中,我要修改writeExternal
方法。直接强行替换成cve-2020-2555的gadget。
1.4.3 T3反序列化 XXE
一般情况下该类漏洞都是在继承自Exterinalizable的类 中,在自定义序列过程时,将类的某些字段,作为XML去存储在反序列化的信息中。反序列化时候,读取序列化信息中相关的字符串作为XML去解析。解析的过程中没有考虑到XXE攻击。这次我捡漏的cve就是该类型的漏洞。
在weblogic.wsee.security.wssc.sct.SCCredential#readExternal
方法中
this.appliesTo是反序列化得到的字符串,如果以<![[]]>
开头,就会调用DOMUtils.toXMLNode
去解析。其实也就是当成xml解析,并且没有任何过滤。
poc如下
2. 向oracle提交漏洞
网上查了一圈,好像没有太多讲解,正好我在这里分享一下我的提交过程。
这个xxe cve-2020-2211漏洞,是我去年12月的某天晚上失眠而挖到的一个洞。别大惊小怪,就是一个简单的xxe。然后写邮件给oracle。oracle提交漏洞的邮箱是secalert_us@oracle.com
。
在邮件的主题中,注明你这次挖到的洞是什么类型。邮件要用英文书写,反正也别说乱七八糟的客套话,老外也看不懂。开门见山直接分析漏洞,扔给他poc,截几张图就行了。
![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com/20210421131555.png
一般等两三天左右,oracle就会回复你的邮件,确认漏洞分配一个内部编号。然后再回复你一封邮件,告诉你不要将这个漏洞透露给任何人。
然后就坐等cve编号即可。我这个漏洞等了将近半年,才发下cve编号。一般在oracle补丁日前两三天发邮件告诉你的cve编号,影响等等各种信息。
至此,就获得一个cve编号。老铁们还不快点转发分享,下次再睡不着觉挖一个洞玩玩。
补丁已经放在星球中了,有需要的同学自取