
Lab Docker riproducibile + exploit raw-socket per CVE-2015-3306 (copia arbitraria di file pre-autenticazione in ProFTPD mod_copy) — un esercizio di apprendimento sul patch-diffing
Un laboratorio completamente riproducibile e un exploit scritto a mano per CVE-2015-3306 — realizzato come esercizio di apprendimento nella ricerca di vulnerabilità: analisi dei patch, attivazione manuale e sviluppo di exploit tramite socket raw.
Il modulo mod_copy di ProFTPD implementa la coppia di comandi SITE CPFR / SITE CPTO,
che copia file lato server senza trasferire dati al client.
Nella versione 1.3.5, nessuno dei due handler verificava se la sessione fosse autenticata. Il modulo semplicemente assumeva "nessuno invierà comandi SITE prima del login" — un'assunzione errata che è diventata una CVE. Qualsiasi client non autenticato poteva copiare qualsiasi file leggibile dal processo server in qualsiasi posizione scrivibile da esso.
La correzione (commit 212d54271f, rilasciata nella 1.3.5a) fa due cose:
copy_cpfr e :
copy_cptoauthenticated = get_param_ptr(cmd->server->conf, "authenticated", FALSE);
if (authenticated == NULL || *authenticated == FALSE) {
pr_response_add_err(R_530, _("Please login with USER and PASS"));
errno = EPERM;
return PR_ERROR(cmd);
}
CopyEngine on|off — in precedenza il modulo non poteva
nemmeno essere disabilitato nelle build che lo includevano.Il diff unificato completo è in patch.diff. Leggere le patch è
l'abilità: la correzione ti dice dove si trovava la ferita.
Il Dockerfile compila ProFTPD 1.3.5 (l'ultima release vulnerabile) dal
tarball sorgente ufficiale con mod_copy abilitato:
docker build -t proftpd-135 .
docker run -d --name lab135 -p 127.0.0.1:2121:21 -p 127.0.0.1:30000-30010:30000-30010 proftpd-135
docker exec lab135 chmod 777 /home/ftp
PassivePorts in proftpd.conf fissa il canale dati — l'architettura a due canali
di FTP (controllo + dati dinamici) è il motivo per cui i mapping container ingenui
falliscono: la porta di controllo funziona, quella dati no.
exploit.py usa socket raw — niente ftplib, perché le librerie nascondono il
protocollo, e nascondere il protocollo è esattamente ciò contro cui stiamo combattendo:
SITE CPFR /etc/segredo.txt -> 350 (nessun USER/PASS inviato: questo È il bug)
SITE CPTO /home/ftp/... -> 250 (copia arbitraria eseguita)
USER ftp / PASS ... -> 230 (il login è solo il percorso di esfiltrazione)
PASV / RETR -> 150 -> 226 (flag catturato)
DELE -> 250 (pulizia: nessun IOC lasciato indietro)
AllowOverwrite, mapping delle porte) determina l'impatto finale.time.time_ns(), non time.time()), e nessuna dipendenza
da stato residuo.RETR risponde due volte: 150,
poi 226. Scarica entrambe prima del comando successivo.-d10) ti dice esattamente
quale controllo è scattato.Solo per scopi educativi e uso in laboratorio autorizzato. Eseguirlo contro sistemi che non possiedi o per cui non hai il permesso scritto di testare è illegale.