Buffer overflow in FreeFloat FTP Server 1.0 che illustra come un singolo gestore non sicuro possa generare molteplici voci CVE attraverso diversi comandi.
Overflow del buffer in FreeFloat FTP Server 1.0 che illustra come un singolo gestore non sicuro possa generare molteplici voci CVE attraverso comandi diversi.
Questo repository fa parte del materiale che utilizzo quando insegno lo sfruttamento della corruzione della memoria (oltre al mio lavoro regolare, insegno anche in diversi corsi di cybersecurity dove aiuto a formare la prossima generazione di reverse engineer).
CVE-2025-5548 è un caso che uso quando voglio mostrare agli studenti che la ricerca sulle vulnerabilità è un'abilità accessibile, non qualcosa riservato a ricercatori senior con anni di esperienza. FreeFloat FTP Server 1.0 è una piccola applicazione legacy per Windows, facile da configurare, facile da eseguire e facile da mandare in crash. L'overflow viene attivato attraverso un comando FTP standard, il percorso di sfruttamento è una pulita sovrascrittura di EIP vanilla, e l'intero processo, dal fuzzing alla shell funzionante, può essere completato in una singola sessione.
Questo caso è anche direttamente correlato al mio talk "The Path That Leads to Your First CVE", dove spiego che uno dei punti di ingresso più realistici nella ricerca sulle vulnerabilità per i principianti è analizzare software vecchio, capire come funziona internamente e cercare il tipo di controlli di lunghezza mancanti che producono esattamente questa classe di vulnerabilità. FreeFloat è uno degli esempi che uso per dimostrare che trovare e documentare un vero bug non richiede anni di esperienza, ma curiosità, un debugger e un approccio metodico.
Ciò che rende questo caso particolarmente efficace per l'insegnamento è come si collega a una lezione più ampia su come vengono assegnati i CVE. Lo stesso gestore di input non sicuro in FreeFloat produce overflow attraverso molteplici comandi FTP diversi, USER, PASS, NOOP e altri, ciascuno dei quali è stato segnalato indipendentemente e ha ricevuto la propria voce CVE. Gli studenti che guardano l'elenco dei CVE per questo binario e vedono dozzine di voci imparano rapidamente che il numero di CVE non equivale al numero di vulnerabilità, e che comprendere la causa principale è più prezioso che catalogare i sintomi.
Una volta che gli studenti comprendono il processo attraverso casi come questo, do loro un esempio reale di ciò che viene dopo. Dopo due settimane di pratica con buffer overflow e corruzione della memoria, il tipo di vulnerabilità che sono in grado di trovare esiste già nel software reale. Il repository seguente documenta una vulnerabilità che ho trovato specificamente per mostrare agli studenti il ciclo completo: scoperta, analisi, documentazione e richiesta CVE, su qualcosa di abbastanza accessibile da trovare all'inizio del percorso di apprendimento, come CVE-2025-70330.
Questo repository fa parte di una raccolta più ampia. Se vuoi praticare lo sfruttamento su una vasta gamma di tecniche, tipi di vulnerabilità e architetture target, dai un'occhiata al repository Binary-Exploitation, dove tutto questo materiale è organizzato e mantenuto insieme a molti altri CVE, metodologie ed esercizi di sfruttamento.
Questa vulnerabilità colpisce FreeFloat FTP Server 1.0, un server FTP Windows molto vecchio scritto senza le moderne pratiche di sicurezza. Nel 2025, un ricercatore ha segnalato molteplici CVE che interessano questo stesso binario.
Esempi includono:
Ogni CVE si riferisce a un comando FTP diverso, ma quando il programma viene reverse engineered, diventa chiaro che molti di essi raggiungono lo stesso percorso di codice vulnerabile.
Ciò rende il caso interessante non solo come esempio di buffer overflow, ma anche come dimostrazione del fatto che:
Quando si fa reverse engineering del binario, si può osservare che tutti i comandi FTP vengono elaborati dalla stessa funzione dispatcher. La stringa del comando viene memorizzata all'interno di una struttura di sessione, e molti gestori di comandi copiano l'input dell'utente in buffer a dimensione fissa utilizzando funzioni non sicure come strcpy, strcat e memcpy, senza controllare la lunghezza dei dati ricevuti.
Per questo motivo, comandi diversi possono sovrascrivere lo stack anche se la descrizione del CVE menziona un solo comando specifico.
Ad esempio, il crash può essere attivato utilizzando:
NOOP AAAAA...
USER AAAAA...
PASS AAAAA...
HOST AAAAA...
ANYTHING AAAAA...
L'unica differenza è il numero di byte necessari per sovrascrivere l'indirizzo di ritorno. Ciò significa che molti CVE segnalati per questo software condividono la stessa causa principale.
FreeFloat FTP Server elabora i comandi ricevuti sulla porta TCP 21 e memorizza la stringa del comando all'interno di una struttura di sessione interna. Successivamente, il gestore del comando copia i dati controllati dall'utente in buffer locali sullo stack senza eseguire una corretta validazione della lunghezza.
Quando si fa reverse engineering del binario, si può osservare che molti gestori di comandi utilizzano buffer a dimensione fissa e operazioni di copia non sicure. Una versione semplificata della logica vulnerabile appare così:
char buffer[256];
strcpy(buffer, user_input);
Poiché il buffer di destinazione ha una dimensione fissa e la lunghezza dell'input non viene controllata, l'invio di una stringa lunga fa sì che l'operazione di copia scriva oltre la fine del buffer.
Man mano che vengono scritti più dati, il layout dello stack si corrompe fino a quando l'indirizzo di ritorno salvato viene sovrascritto.
Quando la funzione ritorna, l'esecuzione salta a un valore controllato dall'utente, causando un crash. Sotto un debugger, ciò può essere visto come il puntatore alle istruzioni sovrascritto con dati controllati dall'attaccante.
Il crash può essere riprodotto inviando una lunga stringa dopo un comando FTP valido. Esempio utilizzando Python:
import socket
ip = "127.0.0.1"
port = 21
payload = b"A" * 500
s = socket.socket()
s.connect((ip, port))
s.recv(1024)
s.send(b"USER anonymous\r\n")
s.recv(1024)
s.send(b"PASS anonymous\r\n")
s.recv(1024)
s.send(b"NOOP " + payload + b"\r\n")
s.close()
Quando eseguito sotto un debugger, il crash mostra:
EIP = 41414141
che conferma che i dati controllati dall'utente sovrascrivono l'indirizzo di ritorno.
L'obiettivo di questo repository non è solo mostrare il crash, ma anche dimostrare l'intero processo di sfruttamento della vulnerabilità passo dopo passo, utilizzando la stessa metodologia comunemente impiegata durante lo sviluppo di exploit.
Per mantenere il README principale pulito, le note dettagliate sullo sfruttamento, gli script e i passaggi del debugger sono inseriti nella cartella Vulnerability 📂 di questo repository.
Lì troverai il flusso di lavoro completo utilizzato per sfruttare questo CVE, inclusi fuzzing, scoperta dell'offset, analisi dei caratteri dannosi, ricerca di gadget ed esecuzione di shellcode.