Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cve-2010-4221-lab — Dalla patch all'RCE: exploit costruito a mano per CVE-2010-4221 (stack overflow TELNET IAC in ProFTPD), con l'intero percorso guidato dagli errori documentato | Kitploit
Strumenti/GitHubGitHub/diegslva/cve-2010-4221-lab
Framework di ExploitAnalisi delle VulnerabilitàExploitReverse EngineeringPenetration TestingApprendimento e FormazioneBinary ExploitationLab e Pratica
GitHubdiegslva/cve-2010-4221-lab

cve-2010-4221-lab

Dalla patch all'RCE: exploit costruito a mano per CVE-2010-4221 (stack overflow TELNET IAC in ProFTPD), con l'intero percorso guidato dagli errori documentato

1920 giorni faNon ancora revisionato
Vedi Repository

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2010-4221 — Overflow dello stack TELNET IAC in ProFTPD: dalla patch alla RCE

Un laboratorio completamente riproducibile e un exploit scritto a mano con socket raw per CVE-2010-4221 — l'overflow del buffer dello stack pre-autenticazione in pr_netio_telnet_gets() di ProFTPD — creato come esercizio di apprendimento nella ricerca di vulnerabilità e nello sviluppo di exploit.

Ogni fallimento è documentato. Il percorso felice è una bugia; le deviazioni sono la lezione.


Avviso legale ed etico — leggere prima di tutto

Questo repository è un artefatto educativo. Esiste affinché le persone che non possono permettersi un mentore o una formazione possano imparare come nasce realmente un exploit di corruzione della memoria: da una patch, attraverso i fallimenti, fino a una prova di concetto funzionante all'interno di un laboratorio che possiedi.

Il lavoro Red Team — la sicurezza offensiva professionale e reale — è definito da una parola: autorizzazione. Tutto ciò che un professionista fa avviene all'interno di un accordo scritto: un documento firmato di Rules of Engagement che indica l'ambito, i target, le tecniche consentite, la finestra temporale e le persone che lo hanno approvato. Senza quel documento, gli stessi identici tasti non sono una professione — sono un reato in praticamente ogni giurisdizione sulla Terra.

Quindi ecco il contratto per questo repo, non negoziabile:

  • Esegui questo solo contro il laboratorio Docker incluso o sistemi che possiedi.
  • Mai contro qualsiasi cosa senza un'autorizzazione esplicita e scritta.
  • Se stai imparando: benvenuto, questo è stato creato per te.
  • Se stai cercando un'arma da usare contro altri: chiudi questa scheda. Questa vulnerabilità è del 2010; non ti darà nulla se non una fedina penale.
  • L'arte vale la pena di essere appresa. L'arte vale qualcosa solo con la disciplina che ne deriva.


    La vulnerabilità

    ProFTPD parla le sequenze di escape TELNET sul canale di controllo FTP. In TELNET, 0xFF (IAC, "Interpret As Command") è il byte di escape; un 0xFF letterale viene inviato come 0xFF 0xFF.

    pr_netio_telnet_gets() copia i byte del client in un buffer dello stack (char buf[PR_DEFAULT_CMD_BUFSZ+1] di pr_cmd_read, 4104 byte con MAXPATHLEN=4096 di glibc), monitorando lo spazio rimanente in buflen — un size_t, senza segno.

    Il percorso vulnerabile (1.3.3a, netio.c):

    root@kitploit:~
    case TELNET_IAC:
      switch (cp) {
        ...
        default:
          *bp++ = TELNET_IAC;   // scrittura #1
          buflen--;             // decremento #1
          telnet_mode = 0;
          break;
      }
      break;
    ...
    *bp++ = cp;                 // scrittura #2
    buflen--;                   // decremento #2  <-- nessun controllo in mezzo
    

    Due scritture, due decrementi, nessun controllo dello zero tra di loro. Quando buflen è esattamente 1, la coppia lo decrementa a 0, poi lo fa sottofluire a SIZE_MAX (18 quintilioni). Il ciclo ora crede che il buffer sia infinito e continua a scrivere byte controllati dall'attaccante lungo lo stack — sopra i registri salvati, il RBP salvato e l'indirizzo di ritorno.

    Pre-autenticazione. La funzione viene eseguita prima che USER/PASS vengano mai processati.

    La patch

    La correzione (commit 3cc69b8388, "Bug#3521 - Telnet IAC processing stack overflow", rilasciata nella 1.3.3c) è di dodici righe. L'intero confine di sicurezza è:

    root@kitploit:~
    if (buflen == 0) {
      break;
    }
    

    Vedi patch.diff. Leggere la patch ti dice dove si trovava la ferita — questa è l'abilità.

    Il laboratorio

    Il Dockerfile compila ProFTPD 1.3.3a dal sorgente storico dello snapshot Debian, deliberatamente insicuro (è così che appariva il 2010):

    • -fno-stack-protector — nessun canary
    • -z execstack — stack eseguibile (nessun NX)
    • -no-pie — indirizzi binari fissi
    • eseguito sotto gdb, che disabilita l'ASLR per impostazione predefinita → stack deterministico
    root@kitploit:~
    docker build -t proftpd-133a .
    docker rm -f lab133 2>/dev/null
    docker run -d --name lab133 --cap-add SYS_PTRACE \
      --security-opt seccomp=unconfined -p 127.0.0.1:2122:21 \
      proftpd-133a sh -c 'gdb -batch -ex "set follow-fork-mode child" \
      -ex "run" -ex "continue" --args /usr/local/sbin/proftpd -n -d1 \
      > /tmp/gdb.txt 2>&1; sleep 600'
    python3 exploit.py
    

    Output atteso:

    root@kitploit:~
    [S] 220 ProFTPD 1.3.3a Server (lab-iac) ...
    [S] THE SERVER SAID: b'PWNED!!PWNED!!'
    

    (Il shellcode scrive sui fd 0, 1 e 2 perché non volevamo dipendere dal sapere quale trasporta il canale di controllo — due di loro rispondono.)

    L'architettura dell'exploit

    root@kitploit:~
    "SITE " + NOP sled + shellcode + [\xff\xff flood] + padding + [ret] + "\n"
     ^^^^^^^^^^^^^^^^^^^^                             ^^^^
     il shellcode vive DENTRO il comando               la coda dell'overflow
     buffer — la regione che nessuno tocca              consegna UN SOLO indirizzo
    
    1. "SITE " mantiene vivo il parser FTP — il comando viene processato correttamente.
    2. Il shellcode è il contenuto del comando. Il buffer è il posto più sicuro sullo stack: dopo la lettura, solo buf[4102] viene toccato (NUL di troncamento). Tutto sotto le variabili locali vive del frame è calmo.
    3. Il flood IAC porta buflen al sottoflusso (vedi "Il viaggio" per il problema della parità).
    4. Lo slot ret (buf + 4152) riceve l'indirizzo del centro del NOP sled. Quando pr_cmd_read raggiunge return 0 dopo il parsing, la CPU atterra nello sled e scivola nel shellcode.

    Questa architettura invertita — payload prima, flood dopo, indirizzo per ultimo — è stata validata contro il modulo Metasploit canonico (proftp_telnet_iac), che usa lo stesso layout. I loro target avevano NX, quindi avevano bisogno di una catena ROP con un "deref quadruplo" del puntatore res; il nostro laboratorio ha uno stack eseguibile, quindi un singolo ritorno diretto è sufficiente.

    Il viaggio (il vero scopo di questo repo)

    L'exploit finale è di 60 righe. Cosa è costato:

    1. Flood \xff cieco → niente. Il server ha chiuso educatamente la sessione. Causa principale: buflen parte da 4102 (PARI) e ogni coppia IAC decrementa di 2 — atterra su 0 pulitamente, mai su 1. Il sottoflusso richiede che la parità venga rotta. Lezione: leggere la macchina a stati batte lo spraying.

    2. Dimensione del buffer sbagliata. Il primo tentativo calibrato assumeva un buffer di 1024 byte. Quello reale è MAXPATHLEN+8 = 4104 su Linux/glibc. Il flood si è fermato 3KB prima del target. Lezione: misura il target, non assumere il target.

    3. Primo SIGSEGV. Il pattern ciclico de Bruijn (Aa0Aa1...) ha posizionato lo slot di ritorno a buf+4152, convalidato due volte (calcolo del frame + offset del pattern). Lezione: il pattern ciclico è un metro di misura, non un exploit.

    4. Controllo di RIP. Impostare lo slot a 0x4141414141414141 ha mandato in crash l'istruzione ret stessa — x86-64 rifiuta indirizzi non canonici, e il fault atterra su ret, con il nostro valore in attesa nel backtrace. Lezione: un crash su ret con il tuo valore nel frame = controllo.

    5. Shellcode sopra lo slot ret → sovrascritto. 8 byte sovrascritti da un puntatore heap (0x4d7838 — successivamente identificato come l'allocazione del pool cmd_rec). I frame dello stack sopra lo slot appartengono a funzioni che continuano a lavorare tra l'atterraggio e il dirottamento. Lezione: l'overflow non è l'ultima scrittura; il programma continua a vivere sullo stack che hai appena vandalizzato.

    6. "Zona morta" sotto lo slot → anche scarabocchiata. Le variabili locali di pr_cmd_read (cmd, buflen, cp) vivono proprio lì e continuano a essere salvate durante il parsing.

    7. Analisi forense con watchpoint hardware. watch *(long*)ADDR in gdb ha trasformato il mistero in una telecamera: ogni scrittura all'indirizzo sovrascritto, con backtrace, in ordine. Lezione: quando la domanda è "chi ha scritto questa memoria?", la risposta è a un comando gdb di distanza.

    8. Leggi il riferimento, poi capiscilo. Il modulo canonico ha confermato l'architettura invertita. Leggere un altro exploit dopo aver costruito il proprio modello mentale è studio; prima, è copiare.

    Lezioni apprese

    • size_t non diventa mai negativo — diventa gigantesco. Il sottoflusso intero in un contatore di spazio rimanente è un overflow dello stack con passaggi extra.
    • La parità è un'arma. Quando una primitiva decrementa di 2 alla volta, controlli il sottoflusso controllando la disparità, non solo la dimensione.
    • I caratteri cattivi sono una questione di protocollo. Il nostro shellcode evita \x0a (termina la lettura) e sopravvive a \xff (escape TELNET) per progettazione.
    • I server prefork perdonano i crash. Il figlio muore, il genitore continua ad accettare: tentativi infiniti. L'ingegneria dell'affidabilità fa parte dell'exploit.
    • Misura e sfrutta lo stesso artefatto. Una differenza di 11 byte in argv[0] (binario dell'albero di build vs binario installato) ha spostato l'intero stack di 0x40 e invalidato silenziosamente un exploit perfetto.
    • L'handler di segnale confessa. ProFTPD cattura SIGSEGV e registra "terminating (signal 11)" — il target ti dice che è morto, anche quando il kernel rimane in silenzio.

    Riferimenti

    • Commit di correzione: https://github.com/proftpd/proftpd/commit/3cc69b8388
    • CVE: https://nvd.nist.gov/vuln/detail/CVE-2010-4221
    • Modulo canonico: modules/exploits/linux/ftp/proftp_telnet_iac.rb (rapid7/metasploit-framework)
    • Laboratorio gemello (bug logico, stesso demone): CVE-2015-3306 mod_copy

    Autore

    Creato da diegslva, imparando in pubblico — da "non ho mai scritto un exploit" a RCE pre-autenticazione con shellcode fatto a mano, in un giorno documentato. Se questo repo ti ha insegnato qualcosa, paga in avanti.

    Scarica lo strumento