weblogic反序列化介绍
weblogic是一个常用的web中间件,它的反序列化漏洞也算是比较经典,而在weblogic里面其实反序列化漏洞大致分为两种,一个是基于T3协议的反序列化漏洞,一个是基于XML的反序列化漏洞,本来想通过一篇文章把全部介绍完,但是发现weblogic相关绕过还是能介绍挺多的,所以想基于两种协议另外再写一写,还有一个原因就是配置环境配了好长时间,这篇就当作专门介绍环境搭建了吧
基于xml
这里xml本身就是序列化对象,通过XMLDecoder进行反序列化解析(循环遍历XML数据并进行拼接处理),最终拼接出完整的恶意语句并执行,列出CVE
CVE-2017-3506
CVE-2017-10271
CVE-2019-2729
CVE-2019-2725
基于T3
其实Ysoserial 生成的序列化文件也是基于T3构造的,通过直接传序列化好的payload,触发readobject()执行,列出CVE
CVE-2015-4852
CVE-2016-0638
CVE-2016-3510
CVE-2017-3248
CVE-2018-2628
CVE-2018-2893
环境搭建
个人觉得环境搭建永远都是最烦的地方,这里我同时尝试在kali上和我都云服务器上进行搭建,最后在centos云服务器上搭建成功,虽然是看着教程搭建,但是大大小小问题还是让我搞了两天,这里记录一下我最后一次成功时候的操作,两个搭建参考文章,如果还有搭建问题请留言或者私信我。
Java安全之初探weblogic T3协议漏洞 漏洞环境搭建
我这里也是用的师傅们做好的环境地址(也就是A-team 的weblogic漏洞环境)
漏洞环境地址:https://github.com/QAX-A-Team/WeblogicEnvironment
jdk地址:https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html
weblogic下载地址:https://www.oracle.com/middleware/technologies/weblogic-server-downloads.html
下载完上面三个环境后把下载好的jdk文件放在该项目的/jdks文件夹下,weblogic的源码放在/weblogics文件夹下。
然后我对Dockerfile的两个小改动,第一个红框由
FROM centos --> FROM centos:centos7
然后删了第二个红框里面的东西(一直报错,不是说没有yum就是说没有libmsl,最后摆烂直接删掉)
最后直接运行就ok了,用法+实例
docker build --build-arg JDK_PKG=<YOUR-JDK-PACKAGE-FILE-NAME> --build-arg WEBLOGIC_JAR=<YOUR-WEBLOGIC-PACKAGE-FILE-NAME> -t <DOCKER-IMAGE-NAME> .
docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=wls1036_generic.jar -t weblogic1036jdk7u21 .
docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name <CONTAINER-NAME> <DOCKER-IMAGE-NAME-YOU-JUST-BUILD>
docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic1036jdk7u21 weblogic1036jdk7u21
访问http://ip:7001/console/login/LoginForm.jsp
,出现weblogic就ok了
秉承着能用就行的学习思想,就没有再做过多的研究,这里使用一个weblogic检测工具进行测试(应该是以前GitHub上下载的吧,如果实在找不到需要的话私信我)
接下来是将一些weblogic的依赖Jar包给导出来进行远程调试
mkdir ./middleware
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./middleware/
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver ./middleware/
//这里我手动在middleware文件夹下创建了一个coherence_3.7
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib
弄好了以后我这里使用xftp把它转到我的桌面上,直接把它当成一个项目用idea去open
这里再加上一起导出来的包
再来配置远程调试,给我的ip打个码
所有都配置好之后我们找到入口类
wlserver\server\lib\wlthint3client.jar!\weblogic\rjvm\InboundMsgAbbrev.class
断点后执行检测工具,如果能直接跳到断点处就是ok了
浅浅分析
到上面这一步配置就完成了,不过既然写到这了,先浅浅分析一下,(这里其实就是t3那条链最终执行的地方)
这里调用创建一个内部类,并且调用readObject
方法,跟进查看一下 ServerChannelInputStream
。
ServerChannelInputStream
继承自ObjectInputStream
类,这里没有重写readObject
,只重写了resolveClass
,那么调用 ServerChannelInputStream#readObject
方法就是调用 ObjectInputStream#readObject
方法,并且这里调用resolveClass
实际上调用的还是父类ObjectInputStream
的resolveClass
方法,没有任何防护,既然说到resolveClass
,下面再小提一下它的作用
浅谈resolveClass
这里进入到父类的resolveClass
,resolveClass
是ObjectInputStream.readObject()
中必经的一个方法,就是说在反序列化过程中,序列化的数据都会从resolveClass
这个方法中经过一次,这里为后面防御和绕过做了铺垫。
resolveClass
方法的作用是根据反射从类序列化描述符中获取类的Class对象,如果在resolveClass
中增加一个检查,检查一下该类的序列化描述符中记录的类名是否在黑名单上,如果在黑名单上,直接抛出错误,不允许获取恶意的类的Class对象,这样就能对其增加防护。其实后面的cve都是在这里不断地绕过相应的白名单黑名单而产生的。