
Prueba de concepto de explotación para un desbordamiento de búfer previo a la autenticación en GNU InetUtils telnetd (CVE-2026-32746), que incluye un entorno de laboratorio con Docker y un script de detección para pruebas de seguridad autorizadas.
Ejecución remota de código previa a la autenticación mediante desbordamiento de búfer en el manejador LINEMODE SLC (Set Local Characters) de telnetd de GNU InetUtils.
CVSS 3.1: 9.8 (Crítico) | CWE: CWE-120, CWE-787
La función add_slc() en telnetd/slc.c añade 3 bytes por cada triplete SLC a un búfer fijo de 108 bytes (slcbuf) sin comprobar los límites. Un atacante no autenticado puede enviar una subopción SLC manipulada con 40+ tripletes (códigos de función > 18/NSLC) durante la negociación de opciones, antes de cualquier indicador de inicio de sesión, desbordando el búfer, corrompiendo el puntero slcptr en BSS y logrando una escritura arbitraria cuando end_slc() utiliza el puntero corrupto.
# Construir el entorno de laboratorio vulnerable
docker compose up -d
# Detección (no destructivo)
python3 detect.py 127.0.0.1 2323
# Explotación (bloquea telnetd - confirma la vulnerabilidad)
python3 exploit.py 127.0.0.1 2323
# Limpieza
docker compose down
La configuración de Docker ejecuta un contenedor Debian con inetutils-telnetd 2.4 bajo xinetd, expuesto en el puerto 2323. Totalmente aislado: nada toca tu sistema host.
WILL LINEMODE para activar la negociación LINEMODEDO LINEMODE y entra en el procesamiento de la subopción SLCadd_slc() pone en cola una respuesta "no soportado" (3 bytes) por cada triplete en un búfer de 104 bytesslcptr y los datos BSS adyacentesend_slc() escribe el marcador de fin de subopción mediante el slcptr corrupto (escritura arbitraria)| Archivo | Descripción |
|---|---|
exploit.py | PoC de bloqueo/DoS |
Dockerfile | Laboratorio telnetd vulnerable |
docker-compose.yml | Configuración de laboratorio con un solo comando |
xinetd-telnet.conf | Configuración del servicio xinetd |
detect.py | Script de detección de versión no destructivo |
Para ir más allá del DoS, necesitarías:
slcbuf → slcptr)end_slc() escribe mediante el slcptr corruptoEsta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. No la utilices contra sistemas que no poseas o para los que no tengas permiso explícito de prueba. El autor no es responsable del mal uso.
MIT