
Classico buffer overflow basato su stack in SLMail 5.1 che mostra come i primi server di posta potessero essere compromessi tramite comandi SMTP e POP3 sovradimensionati.
Classico buffer overflow basato su stack in SLMail 5.5 che mostra come i primi server di posta potessero essere compromessi tramite comandi SMTP e POP3 di dimensioni eccessive.
Questo repository fa parte del materiale che utilizzo quando insegno l'exploitation della corruzione della memoria (oltre al mio lavoro abituale, insegno anche in diversi corsi di cybersecurity dove aiuto a formare la prossima generazione di reverse engineer).
CVE-2003-0264 è uno dei primi casi che introduco quando insegno i buffer overflow vanilla basati su stack su un protocollo di rete. È pulito, ben documentato e il percorso di exploitation è diretto: niente SEH, niente egghunter, nessun vincolo di spazio. Lo studente invia un payload, sovrascrive EIP, atterra su un gadget JMP ESP e ottiene una shell. È proprio questa chiarezza a renderlo utile come punto di partenza.
SLMail 5.5 è un server di posta legacy per Windows. La vulnerabilità risiede nel servizio POP3, in particolare nel gestore del comando PASS, che copia l'input dell'utente direttamente in un buffer di stack di dimensioni fisse senza alcuna validazione della lunghezza. Ciò che rende questo caso particolarmente utile per la didattica è il numero ridotto di componenti coinvolti:
Questa combinazione — esposta alla rete, senza autenticazione, sovrascrittura diretta di EIP, nessuna mitigazione moderna — rende CVE-2003-0264 uno degli esempi reali più puliti di stack overflow vanilla che funziona ancora sulle versioni moderne di Windows.
SLMail è un server di posta per Windows che fornisce servizi SMTP, POP3 e di amministrazione. Il servizio POP3 resta in ascolto sulla porta TCP 110 e gestisce i comandi standard di recupero della posta. La vulnerabilità risiede nel gestore del comando PASS, che elabora l'argomento password inviato da un client in connessione.
Dettagli tecnici principali:
Il servizio POP3 di SLMail elabora il comando PASS copiando l'argomento password fornito in un buffer di stack di dimensioni fisse tramite una funzione non sicura, senza alcun controllo della lunghezza. Una versione semplificata della logica vulnerabile è la seguente:
char password_buffer[256];
strcpy(password_buffer, pass_argument);
Inviare una stringa sufficientemente lunga come argomento PASS fa sì che la copia scriva oltre la fine del buffer, corrompendo lo stack fino a sovrascrivere l'indirizzo di ritorno salvato. Quando la funzione ritorna, la CPU carica il valore controllato dall'attaccante dallo stack in EIP e vi salta.
Il crash può essere riprodotto inviando un argomento PASS di dimensioni eccessive tramite POP3. Non sono richieste credenziali valide. Esempio con Python:
import socket
HOST = '127.0.0.1'
PORT = 110
payload = b"A" * 3000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.recv(1024)
s.send(b"USER username\r\n")
s.recv(1024)
s.send(b"PASS " + payload + b"\r\n")
s.close()
Se eseguito sotto un debugger, il crash mostra EIP sovrascritto con dati controllati dall'utente:
EIP = 41414141
confermando che l'indirizzo di ritorno salvato è stato corrotto dall'overflow.
L'obiettivo di questo repository non è solo dimostrare il crash, ma percorrere passo dopo passo l'intero processo di exploitation, dal fuzzing a una reverse shell funzionante.
Per mantenere pulito il README principale, le note dettagliate sull'exploitation, gli script e i passaggi con il debugger sono inseriti nella cartella Vulnerability 📂 di questo repository.
Lì troverai il flusso di lavoro completo utilizzato per sfruttare questa CVE, tra cui: