
该存储库包含一个自动化的漏洞利用工具,以教育和网络安全研究为目的,旨在演示Apache Tomcat(CVE-2025-24813)中潜在的远程代码执行(RCE)漏洞。
🧪 为网络安全专业人士、研究人员、渗透测试人员和红队设计。
✅ 直观的交互式界面
✅ 动态 payload(ysoserial 或编译后的 Java)
✅ 变色龙式反 WAF 请求头
✅ 自动规避 + payload 分片
✅ 后端执行指纹识别
✅ 每个目标详细日志记录
✅ 赛博朋克风格动态横幅(🔮 故障动画)
✅ 控制台实时反馈(使用 Rich & Colorama)
使用以下命令安装所需依赖:
pip install -r requirements.txt
依赖项:
requests
colorama
rich
validators
并确保你有:
Java 和 javac 在 PATH 中ysoserial.jar(如果使用 ysoserial 类型 payload)运行脚本:
python3 POC-Exploit_CVE_2025_24813.py
并完成配置:
🧬 选择 payload 类型 💣 指定命令 🌐 输入目标 URL 🔧 调整规避和 SSL 设置
🔗 [?] 输入目标 URL: https://victima.org
💣 [?] 要执行的命令: whoami
🧬 [?] Payload 类型: ysoserial
📂 [?] Ysoserial.jar 路径: ysoserial.jar
🔧 [?] Gadget: CommonsCollections6
🔐 [?] 验证 SSL?(是/否): 否
🚀 正在执行...
🧬 检测到 WAF... 更换策略
⚙️ 正在上传 payload...
💥 远程执行确认
✅ 结果: 'apache'
┌──────────────────────────────┐
│ 交互模式 │
├──────────────────────────────┤
│ URL 验证 │
│ 会话检测 │
│ WAF 检测 │
│ Payload 生成 │
│ 通过 PUT 进行规避上传 │
│ 执行验证 │
└──────────────────────────────┘
↘ 每个目标的日志
ysoserial 工具,序列化易受攻击的 gadgets 以执行命令。.java 文件,从服务器远程执行命令。CommonsCollections6Spring1Jdk7u21POC-Exploit_CVE_2025_24813.py # 主脚本
ysoserial.jar # 如果使用 'ysoserial' 则需要
logs/ # 每个目标的单独日志文件夹
payload.ser # 临时生成的 payload
Exploit.java / .class # Java 临时文件
此工具的创建仅出于合法和教育目的。
✅ 允许:
🚫 禁止:
作者和贡献者均不对滥用行为负责。您应对自己的行为负责。
ysoserial、Java、Rich、Colorama、requests📄 CVE-2025-24813:Apache Tomcat 远程代码执行 🔗 查看 CVE MITRE 详情
MIT License
Copyright (c) 2025
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files...
更多信息请参阅
LICENSE文件。
此 README 和脚本旨在提供沉浸式、视觉化且优雅的体验,与未来主义网络安全的新时代相呼应。
✨ 不仅仅是漏洞利用...这是一曲规避与数字控制的技术交响曲。
推荐版本:Python 3.8+
需要安装的 Python 库:
pip install requests colorama
脚本使用两种 payload 形式:
因此你需要:
Java JDK(不仅仅是 JRE,因为需要编译代码)。 验证方法:
java -version
javac -version
如果两个命令都工作,则已准备就绪。
从此处下载 .jar 👉 https://github.com/frohoff/ysoserial
将其保存在脚本的同一目录中,或提示时指定完整路径。 示例:
java -jar ysoserial.jar CommonsCollections6 "calc.exe" > test.ser
calc.exe)将打开计算器。gnome-calculator 或 xcalc。安装 Python 3.8+
安装库:
pip install requests colorama etc
安装 Java JDK 8+
java -version
javac -version
将 ysoserial.jar 下载到脚本文件夹中。
👉 完成以上步骤后,您就可以在安全的实验室模式下运行该脚本(仅在受控环境中进行测试)。
版本: 1.0 目的: 本指南解释如何准备一个完全安全的环境来测试您拥有的脚本,而不影响真实系统。包括一个测试服务器(mock)、安全模式(DRY_RUN / SAFE_TEST),以及清晰的步骤来在实验室中运行该工具。
pip 可用。virtualenv 或 venv。安装依赖项:
python3 -m venv .venv
source .venv/bin/activate # Linux / macOS
.\.venv\Scripts\activate # Windows (PowerShell/Command Prompt)
pip install -U pip
pip install requests colorama flask
注意:
flask仅用于本地测试服务器(mock)。
创建一个包含以下内容的 mock_server.py 文件。该服务器模拟脚本预期的端点,并返回受控状态(200、409、500),以便您无需接触真实服务器即可验证脚本逻辑。
# mock_server.py — 安全测试服务器
from flask import Flask, request, make_response, jsonify
app = Flask(__name__)
uploads = {}
@app.route('/index.jsp', methods=['GET'])
def index():
# 模拟一个可能返回 JSESSIONID cookie 或包含 "Session ID" 文本的页面
resp = make_response('Index page — Session ID: testsession')
resp.set_cookie('JSESSIONID', 'testsession')
return resp
@app.route('/check.txt', methods=['PUT'])
def check_put():
# 模拟一个可写的资源
return ('OK', 200)
@app.route('/uploads/../sessions/<session_id>.session', methods=['PUT'])
def upload_session(session_id):
# 模拟上传被接受但返回 409(脚本期望的行为)
uploads[session_id] = True
return ('Conflict - uploaded', 409)
@app.route('/', methods=['GET'])
def root():
# 如果 cookie 匹配且会话已“上传”,则返回 500 以模拟反序列化失败
session = request.cookies.get('JSESSIONID')
if session and uploads.get(session):
return ('Internal Server Error', 500)
return ('Hello from mock server', 200)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8000, debug=True)
如何运行:
python mock_server.py
# mock 将监听 http://127.0.0.1:8000
对于测试,您不需要生成真实的 payload。创建一个简单的文件,供脚本上传:
echo "DUMMY_PAYLOAD" > payload.ser
此文件不包含可执行代码:仅用于验证上传逻辑并查看 mock 服务器的响应。
为防止脚本调用外部工具(Java/ysoserial)或执行危险操作,请在主脚本开头添加此代码块(在任何生成/调用 subprocess 之前):
import os
SAFE_TEST = os.environ.get('SAFE_TEST', '0') == '1'
然后修改(或包装)生成/上传函数,使其在 SAFE_TEST 为 True 时以安全方式运行。
generate_ysoserial_payload 和 generate_java_payload 的最小修改示例:
def generate_ysoserial_payload(command, ysoserial_path, gadget, payload_file, target_url):
if SAFE_TEST:
log_info("SAFE_TEST 激活 — 创建 dummy payload(不可执行)", target_url)
with open(payload_file, 'wb') as f:
f.write(b"DUMMY_PAYLOAD")
return payload_file
# --- 仅在 SAFE_TEST == False 时执行原始行为 ---
def generate_java_payload(command, payload_file, target_url):
if SAFE_TEST:
log_info("SAFE_TEST 激活 — 创建 dummy java payload(不可执行)", target_url)
with open(payload_file, 'wb') as f:
f.write(b"DUMMY_JAVA_PAYLOAD")
return payload_file
# --- 仅在 SAFE_TEST == False 时执行原始行为 ---
在 upload_and_verify_payload 中,如果 SAFE_TEST 为 True,则使用正常流程(mock 将接受),但不要执行脚本外的命令。
如何激活 SAFE_TEST:
Linux/macOS:
export SAFE_TEST=1
Windows (PowerShell):
$env:SAFE_TEST = "1"
启动您的虚拟环境,并确保已安装依赖项(参见要求部分)。
启动 mock_server.py:
python mock_server.py
如果未使用 SAFE_TEST 或该模式未为您创建 payload,则创建 dummy payload:
echo "DUMMY_PAYLOAD" > payload.ser
在终端中激活安全模式:
export SAFE_TEST=1 # Linux/macOS
# 或在 PowerShell 中:$env:SAFE_TEST = "1"
运行主脚本:
python3 tu_script.py
回答提示(您将使用实验室值):
http://127.0.0.1:8000ysoserial(脚本在 SAFE_TEST=1 时将创建 dummy payload,而不是调用外部工具)ysoserial.jar — 在安全模式下不会使用)否(您的 mock 使用 HTTP)观察控制台输出:您应该看到消息 Server is writable via PUT、Payload uploaded with status 409 和 Exploit succeeded! Server returned 500 after deserialization. — 这仅在 mock 中发生,表示脚本的逻辑流程正常工作。
检查 logs/ 下的日志文件 — 脚本会保存带有时间戳的条目。例如 logs/127_0_0_1_8000.log(根据清理后的目标名称命名)。
check_writable_servlet 函数检测到对端点 /check.txt 的成功 PUT。payload.ser 后,mock 返回 409,并且脚本随后使用 JSESSIONID cookie 发出 GET 请求。使用 pytest 和 requests-mock 模拟 HTTP 响应。
为以下内容创建测试:
validate_url — 有效/无效输入。retry_request — 模拟异常和重试。detect_waf — 模拟带有和不带有签名的 Server 请求头。upload_and_verify_payload — 使用服务器 mock 验证流程。使用 requests-mock 的简单示例(骨架):
# test_script.py
import requests
import requests_mock
from tu_script import validate_url, retry_request
def test_validate_url():
assert validate_url('http://127.0.0.1:8000')
assert not validate_url('notaurl')
def test_retry_request_success():
# 使用 requests_mock 模拟 GET 并测试 retry_request
pass
作者:ByMakavali