
Este repositorio contiene un exploit automatizado desarrollado con fines educativos y de investigación en ciberseguridad, dirigido a demostrar una potencial vulnerabilidad de ejecución remota de código (RCE) en Apache Tomcat (CVE-2025-24813).
Esta herramienta ha sido diseñada como una suite de explotación futurista enfocada en:
🧪 Diseñada para profesionales de ciberseguridad, investigadores, pentesters y red teams.
✅ Interfaz interactiva e intuitiva
✅ Payloads dinámicos (ysoserial o Java compilado)
✅ Headers camaleónicos anti-WAF
✅ Evasión automática + fragmentación de payloads
✅ Fingerprinting de ejecución en backend
✅ Logging detallado por objetivo
✅ Banner estilo cyberpunk dinámico (🔮 glitch animation)
✅ Live feedback en consola (con Rich & Colorama)
Instala los requerimientos necesarios con:
pip install -r requirements.txt
Dependencias:
requests
colorama
rich
validators
Y asegúrate de tener:
Java y javac en el PATHysoserial.jar si usas el payload tipo ysoserialEjecuta el script:
python3 POC-Exploit_CVE_2025_24813.py
Y completa la configuración:
🧬 Selecciona tipo de payload 💣 Especifica el comando 🌐 Ingresa la URL del objetivo 🔧 Ajusta la evasión y configuración SSL
🔗 [?] Ingresa la URL del objetivo: https://victima.org
💣 [?] Comando a ejecutar: whoami
🧬 [?] Tipo de payload: ysoserial
📂 [?] Ruta a ysoserial.jar: ysoserial.jar
🔧 [?] Gadget: CommonsCollections6
🔐 [?] ¿Verificar SSL? (sí/no): no
🚀 Ejecutando...
🧬 WAF detectado... cambiando estrategia
⚙️ Subida del payload en curso...
💥 Confirmación de ejecución remota
✅ Resultado: 'apache'
┌──────────────────────────────┐
│ Modo Interactivo │
├──────────────────────────────┤
│ Validación de URL │
│ Detección de sesión │
│ Detección de WAF │
│ Generación de payload │
│ Subida evasiva via PUT │
│ Verificación de ejecución │
└──────────────────────────────┘
↘ LOGS POR OBJETIVO
ysoserial, serializa gadgets vulnerables para ejecutar comandos..java personalizado que ejecuta el comando remoto desde el servidor.CommonsCollections6Spring1Jdk7u21POC-Exploit_CVE_2025_24813.py # Script principal
ysoserial.jar # Requerido si usas 'ysoserial'
logs/ # Carpeta de logs individuales por objetivo
payload.ser # Payload generado temporalmente
Exploit.java / .class # Archivos temporales para Java
Esta herramienta fue creada con fines exclusivamente legales y educativos.
✅ Permitido:
🚫 Prohibido:
Ni el autor ni los colaboradores se hacen responsables por el uso indebido. Tú eres responsable de tu conducta.
ysoserial, Java, Rich, Colorama, requests📄 CVE-2025-24813: Apache Tomcat Remote Code Execution 🔗 Ver detalles en 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...
Consulta el archivo
LICENSEpara más información.
Este README y script están diseñados para una experiencia inmersiva, visual, y elegante, en sintonía con una nueva era de ciberseguridad futurista y con propósito.
✨ No solo exploits... es una sinfonía técnica de evasión y control digital.
Versión recomendada: Python 3.8+
Librerías de Python que debes instalar:
pip install requests colorama
El script usa dos formas de payloads:
Por eso necesitas:
Java JDK (no solo JRE, porque se compila código). Verifica con:
java -version
javac -version
Si ambos comandos funcionan, estás listo.
Descarga el .jar de aquí 👉 https://github.com/frohoff/ysoserial
Guárdalo en el mismo directorio del script o indica la ruta completa cuando te lo pida. Ejemplo:
java -jar ysoserial.jar CommonsCollections6 "calc.exe" > test.ser
calc.exe) abrirá la calculadora.gnome-calculator o xcalc.Instalar Python 3.8+
Instalar librerías:
pip install requests colorama etc
Instalar Java JDK 8+
java -version
javac -version
Descargar ysoserial.jar en la carpeta del script.
👉 Con todo eso ya podrás ejecutar el script en modo laboratorio seguro (solo en entornos controlados, para pruebas).
Versión: 1.0 Propósito: Esta guía explica cómo preparar un entorno totalmente seguro para probar el script que tienes, sin afectar sistemas reales. Incluye un servidor de pruebas (mock), modo seguro (DRY_RUN / SAFE_TEST), y pasos claros para ejecutar la herramienta en laboratorio.
pip disponible.virtualenv o venv.Instala las dependencias:
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
Nota:
flaskse usa solo para el servidor de pruebas local (mock).
Crea un archivo mock_server.py con este contenido. El servidor simula los endpoints que el script espera y devuelve estados controlados (200, 409, 500) para que puedas validar la lógica del script sin tocar servidores reales.
# mock_server.py — servidor de pruebas seguro
from flask import Flask, request, make_response, jsonify
app = Flask(__name__)
uploads = {}
@app.route('/index.jsp', methods=['GET'])
def index():
# Simula una página que puede devolver una cookie JSESSIONID o un texto con "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():
# Simula un recurso escribible
return ('OK', 200)
@app.route('/uploads/../sessions/<session_id>.session', methods=['PUT'])
def upload_session(session_id):
# Simula que la subida fue aceptada pero retorna 409 (comportamiento que el script espera)
uploads[session_id] = True
return ('Conflict - uploaded', 409)
@app.route('/', methods=['GET'])
def root():
# Si la cookie coincide y la sesión fue "subida", devolvemos 500 para simular fallo por deserialización
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)
Cómo ejecutarlo:
python mock_server.py
# El mock quedará escuchando en http://127.0.0.1:8000
Para pruebas no necesitas generar payloads reales. Crea un archivo sencillo que el script pueda subir:
echo "DUMMY_PAYLOAD" > payload.ser
Este archivo no contiene código ejecutable: solo sirve para validar la lógica de subida y ver respuestas del servidor mock.
Para evitar que el script invoque utilidades externas (Java/ysoserial) o ejecute acciones peligrosas, añade este bloque al inicio del script principal (antes de cualquier generación/llamada a subprocess):
import os
SAFE_TEST = os.environ.get('SAFE_TEST', '0') == '1'
Luego modifica (o envuelve) las funciones de generación/subida para comportarse de forma segura cuando SAFE_TEST sea True.
Ejemplo de cambio mínimo para generate_ysoserial_payload y generate_java_payload:
def generate_ysoserial_payload(command, ysoserial_path, gadget, payload_file, target_url):
if SAFE_TEST:
log_info("SAFE_TEST activo — creando payload dummy (no ejecutable)", target_url)
with open(payload_file, 'wb') as f:
f.write(b"DUMMY_PAYLOAD")
return payload_file
# --- comportamiento original solo si SAFE_TEST == False ---
def generate_java_payload(command, payload_file, target_url):
if SAFE_TEST:
log_info("SAFE_TEST activo — creando payload java dummy (no ejecutable)", target_url)
with open(payload_file, 'wb') as f:
f.write(b"DUMMY_JAVA_PAYLOAD")
return payload_file
# --- comportamiento original solo si SAFE_TEST == False ---
Y en upload_and_verify_payload, si SAFE_TEST es True, usa el flujo normal (el mock lo aceptará) pero no ejecutes comandos fuera del script.
Cómo activar SAFE_TEST:
Linux/macOS:
export SAFE_TEST=1
Windows (PowerShell):
$env:SAFE_TEST = "1"
Inicia tu entorno virtual y asegúrate de tener las dependencias instaladas (ver sección Requisitos).
Lanza el mock_server.py:
python mock_server.py
Crea el payload dummy si no usas SAFE_TEST o éste no crea el payload por ti:
echo "DUMMY_PAYLOAD" > payload.ser
Activa el modo seguro en la terminal:
export SAFE_TEST=1 # Linux/macOS
# o en PowerShell: $env:SAFE_TEST = "1"
Ejecuta el script principal:
python3 tu_script.py
Contesta los prompts (usarás valores de laboratorio):
http://127.0.0.1:8000ysoserial (el script, con SAFE_TEST=1, creará un payload dummy en lugar de invocar herramientas externas)ysoserial.jar — no será usado en modo seguro)no (tu mock usa HTTP)Observa la salida en consola: deberías ver mensajes Server is writable via PUT, Payload uploaded with status 409 y Exploit succeeded! Server returned 500 after deserialization. — esto es solo en el mock y significa que el flujo lógico del script funciona.
Revisa los logs en logs/ — el script guarda entradas con marcas de tiempo. Por ejemplo logs/127_0_0_1_8000.log (según el nombre de target sanitizado).
check_writable_servlet detecte el PUT exitoso al endpoint /check.txt.payload.ser, el mock devuelva 409 y que el script luego haga un GET con la cookie JSESSIONID.Usa pytest y requests-mock para simular respuestas HTTP.
Crea tests para:
validate_url — entradas válidas/erróneas.retry_request — simular excepciones y reintentos.detect_waf — simular encabezados Server con y sin firmas.upload_and_verify_payload — usar el mock del servidor para validar el flujo.Ejemplo simple con requests-mock (esqueleto):
# 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():
# usa requests_mock para simular un GET y comprobar retry_request
pass
Autor:ByMakavali