Una falla en el manejo de mensajes del protocolo SSH, un actor malicioso podría obtener acceso no autorizado a los sistemas afectados y ejecutar comandos arbitrarios sin credenciales válidas en el servidor SSH de Erlang/OTP
✅ RCE PRE-AUTH CONFIRMADO — Exploit demostrado con éxito.
📄 Blog Técnico (PDF):CVE-2025-32433-Technical-Blog.pdf
📸 Evidencia Visual:screenshots/
🔍 Detalles de la Prueba de Concepto:docs/PROOF_OF_CONCEPT.md
CVE-2025-32433 es una vulnerabilidad Crítica de CVSS 10.0 en el demonio SSH de Erlang/OTP. Un atacante no autenticado puede abrir canales SSH y ejecutar comandos arbitrarios antes de completar la autenticación — no se requieren credenciales.
Este laboratorio te proporciona un entorno aislado y completamente funcional para reproducir la vulnerabilidad, ejecutar el exploit, verificarlo y probar mecanismos de detección — todo en tu máquina local.
Antes de comenzar, asegúrate de tener instalado lo siguiente:
| Herramienta | Versión Mínima | Comando de Verificación |
|---|---|---|
| Docker Desktop | 4.x+ | docker --version |
| Docker Compose | v2.20+ | docker compose version |
| Python | 3.10+ | python --version |
También necesitas la biblioteca paramiko de Python para la suite de detección:
pip install paramiko
La etiqueta de imagen
erlang:26.2.5de Docker Hub fue sobrescrita silenciosamente con la versión parcheada26.2.5.11después de que se divulgara CVE-2025-32433. Extraerla desde Docker Hub te proporciona la versión parcheada, no la vulnerable.El
lab/Dockerfilede este laboratorio compila OTP 26.2.5 directamente desde el tarball oficial de la release de Erlang en GitHub para garantizar el runtime vulnerable genuino. La primera compilación tarda ~10 minutos.
┌──────────────────────────────────────────┐
│ Isolated Docker Bridge │
│ (cve-lab-bridge) │
└────┬────────────────────────────┬────────┘
│ │
┌───────────────┴─────────────┐┌─────────────┴──────────────┐
│ target_vulnerable ││ target_patched │
│ OTP 26.2.5 (source-built) ││ erlang:26.2.5.11 │
│ Host Port: 127.0.0.1:2222 ││ Host Port: 127.0.0.1:2223 │
└─────────────────────────────┘└─────────────────────────────┘
│
┌──────────────┴──────────────┐
│ attacker │
│ Python 3 + Scapy/Paramiko │
│ Workdir: /work │
└─────────────────────────────┘
| Contenedor | Puerto | Versión de OTP | Estado |
|---|---|---|---|
cve-2025-32433-vulnerable | 127.0.0.1:2222 | 26.2.5 (ERTS 14.2.5) | ❌ Vulnerable |
cve-2025-32433-patched | 127.0.0.1:2223 | 26.2.5.11 (ERTS 14.2.5.15) | ✅ Parcheado |
cve-2025-32433-attacker | Solo interno | Herramientas de Python 3 | Conjunto de herramientas del atacante |
git clone https://github.com/damnkrishna/CVE-2025-32433-LAB.git
cd CVE-2025-32433-LAB
⏱️ Esto tarda ~10 minutos — compila Erlang/OTP 26.2.5 desde el código fuente en C. Esto es lo esperado. No lo interrumpas.
docker compose build --no-cache target_vulnerable
Verás una salida del compilador como make[1]: Leaving directory '/tmp/otp_src_26.2.5/lib/...' —
esto es normal. Termina con:
✔ Image ine_cyber_assignment_job-target_vulnerable Built
docker compose build --no-cache target_patched
docker compose up -d target_vulnerable target_patched
docker compose ps
I'm ready to translate chunk 17 of 69. Please provide the source content you'd like me to translate.
NAME STATUS PORTS
cve-2025-32433-vulnerable Up (healthy) 127.0.0.1:2222->2222/tcp
cve-2025-32433-patched Up (healthy) 127.0.0.1:2223->2222/tcp
Ambos contenedores deben mostrar (healthy) antes de continuar.
Confirme que el contenedor está ejecutando genuinamente OTP 26.2.5 (no la versión parcheada):
docker exec cve-2025-32433-vulnerable cat /usr/local/otp/lib/erlang/releases/RELEASES
Salida esperada — debe mostrar 14.2.5 SIN el sufijo .15:
[{release,"Erlang/OTP","26","14.2.5",
[{kernel,"9.2.4",...},
Si ves 14.2.5.15 — la imagen del contenedor es incorrecta. Reconstruye con --no-cache.
Conéctate como un usuario legítimo para confirmar que el servidor acepta la autenticación estándar:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 [email protected]
Cuando se le solicite, introduzca la contraseña: LabPass2026!Secured
Aterrizará en un shell de Erlang:
Eshell V14.2.5 (press Ctrl+G to abort, type help(). for help)
1>
Prueba algunos comandos dentro del shell de Erlang:
ls().
file:write_file("test.txt", "hello").
file:read_file("test.txt").
Para salir del shell de Erlang:
q().
Antes de ejecutar el exploit, abra una segunda terminal de PowerShell y siga el registro del servidor:
Get-Content -Path .\logs\target_vulnerable\ssh.log -Wait -Tail 20
Mantén esta terminal abierta. Verás los eventos de conexión aparecer en tiempo real.
Esta es la prueba de concepto de ejecución remota de código previa a la autenticación. No se utilizan credenciales.
cd attacker_work\exploit
python payload.py
I'm ready to translate chunk 17 of 69. Please provide the source content you'd like me to translate.
[*] Connecting to SSH server...
[+] Received banner: SSH-2.0-Erlang/5.1.4
[*] Sending SSH_MSG_KEXINIT...
[*] Sending SSH_MSG_CHANNEL_OPEN...
[*] Sending SSH_MSG_CHANNEL_REQUEST (pre-auth)...
[✓] Exploit sent! If the server is vulnerable, it should have written to /lab.txt.
[+] Received response: 000003d4...
El banner debe mostrar SSH-2.0-Erlang/5.1.4 (sin el sufijo .15) para confirmar que accediste al servidor vulnerable.
docker exec cve-2025-32433-vulnerable cat /lab.txt
I'm ready to translate chunk 17 of 69. Please provide the source content you'd like me to translate.
pwned
Si ves pwned — se confirma RCE preautenticación CVE-2025-32433.
El exploit escribió en el sistema de archivos del contenedor sin credenciales.
Ejecuta el mismo exploit contra el contenedor parcheado en el puerto 2223:
Edita attacker_work\exploit\payload.py línea 6:
PORT = 2223 # change from 2222 to 2223
Ejecuta el exploit:
python payload.py
Luego verifica el archivo:
docker exec cve-2025-32433-patched cat /lab.txt