In questo tutorial parleremo di buffer overflow (Buffer in eccesso), un guasto che esiste da molto tempo, si verifica quando i dati che vengono copiati in un'area di memoria (che è stata precedentemente riservata) non vengono controllati correttamente, può essere che l'applicazione funzioni correttamente se l'utente inserisce i dati con un dimensione adeguata, ma se riserviamo la memoria per 15 caratteri e l'utente ne inserisce 20, interesserà un'altra area di memoria, che può essere riservata o meno.
Questo può far bloccare il nostro programma, ma può anche essere molto peggio, un utente con intenzioni malevole può approfittare di questo errore e influenzare il funzionamento dell'applicazione o eseguire codice arbitrario su un computer (normalmente quel codice aprirà un interprete di comandi ). Inoltre, se il programma viene eseguito con privilegi elevati, abbiamo una grave falla di sicurezza. Un altro attacco che può alterare il funzionamento di un'applicazione o iniettare codice è XSS.
NotaLe esecuzioni che vedrai in questo tutorial sono state eseguite nel sistema operativo Ubuntu 16.04 a 32 bit.
Vediamo un Semplice esempio di codice C vulnerabile a questo attacco, quando si avvia il programma dobbiamo passare un parametro, l'applicazione aspettati di ricevere una stringa non più lunga di 15 caratteri, se è la stringa prevista sarà un accesso riuscito, in caso contrario verrà "negato". Il codice è come mostrato di seguito:
#include #include #define password "Test" void test (char * str) {char buffer [15]; intn = 0; strcpy (buffer, str); if (strcmp (buffer, password) == 0) {n = 1; } if (n) {printf ("Successo \ n"); uscita (0); } else {printf ("Accesso negato \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("L'app richiede un parametro \ n"); uscita (-1); } prova (argv [1]); }Il programma prende il nome overflow.c, e per compilare è stato utilizzato quanto segue:
gcc overflow.c -o overflow -fno-stack-protectorL'ultima parte: -fno-stack-protector Viene utilizzato in modo che il compilatore non metta protezione e possiamo mostrare l'esempio. Se l'utente inserisce i dati corretti, ovvero una stringa di massimo 15 caratteri, il programma funziona bene, se inseriamo una "password" errata ce lo mostrerà Accesso negato, e se mettiamo "Test"Ci metterà" Successo. Vediamo una cattura che esegue il programma 2 volte, una con accesso errato e un'altra con la stringa corretta:
Vediamo che tutto funziona correttamente. Ma cosa succede se inseriamo una stringa superiore, vediamo cosa succede:
Abbiamo lanciato il programma con 20 lettere A, e ci mostra Successo. In questa applicazione non abbiamo nulla, semplicemente usciamo dall'applicazione, ma siamo entrati in un'area riservata senza conoscere la password. Se sostituiamo la seguente funzione:
strcpy (buffer, str);Con il seguente:
strncpy (buffer, str, 15);sì eseguiamo il codice con 20 lettere A, abbiamo il seguente output:
Puoi anche vedere che ci avvaliamo di strcmp, invece dovremmo usare strncmp, quindi controlliamo anche la dimensione. Abbiamo controllato che possono essere copiati solo un massimo di 15 caratteri, quindi non influisce sul nostro programma se ne inseriscono di più. Se dopo aver visualizzato il messaggio Successo eseguiamo un comando di sistema (in questo caso chi sono), otteniamo le informazioni:
Sopra non siamo root, ma se lo eseguiamo con sudo, otteniamo quanto segue:
L'unica cosa che abbiamo aggiunto è una riga nel codice che abbiamo visto sopra, sotto la riga di codice:
printf ("Successo \ n");Abbiamo messo:
sistema ("whoami");Per capire un po' cosa è successo, modifico il programma per mostrare le 2 variabili che abbiamo (respingente sì n) che sia corretto o meno, e sotto c'è l'output, prima inseriamo una stringa che verrà trattata come corretta (“Test”), poi uno errato che non superi la lunghezza e infine il 20 lettere A:
Si vede che nella prima esecuzione vale 1 La variabile n, perché la catena passata è quella giusta, nella seconda vale 0, perché è sbagliato, ma nell'ultimo vale 1094795585, che fa saltare la condizione che poniamo se (n), sarà vero finché n è diverso da 0. Non è una buona condizione, anche se non dovrebbe fallire se il resto del codice fosse corretto. Se mettiamo 16 lettere A come parametro vedremo che il valore della variabile n è 65:
Se osserviamo il codice ASCII, il numero 65 corrisponde alla lettera A, abbiamo visto che la memoria della variabile n è stata da noi accidentalmente toccata, quella lettera in più che abbiamo passato come parametro è andata alla variabile n. Avremmo la memoria come segue:
Se andiamo oltre i caratteri, potrebbe essere che ci invii un messaggio di violazione del segmento (se eliminiamo il uscita (0) cosa abbiamo in se (n)), lo possiamo vedere nell'immagine seguente:
Questo avviso è dovuto ad un tentativo di accesso ad un'area di memoria che è al di fuori dei limiti di quella assegnata dal sistema operativo all'applicazione. Se abbiamo compilato l'esempio come segue:
gcc overflow.c -o overflow -fstack-protectorO semplicemente rimuovendo -fno-stack-protector Dalla compilazione che abbiamo visto la prima volta, ed eseguiamo il codice con overflow, otteniamo il seguente risultato:
Una protezione in più che ci fornisce gcc.
NotaSe volessimo eseguire un codice (codice shell) dovremmo sovrascrivere l'indirizzo di ritorno con quello del nostro shellcode, è un po' più complesso dell'esempio visto nel tutorial e quindi richiede più lavoro.
Se qualcuno riesce a sfruttare questa vulnerabilità, può causare molti danni. Evitare di avere questo tipo di guasto e che un utente malintenzionato possa trarne vantaggio è molto semplice, programmare correttamente, devi conoscere bene il linguaggio di programmazione che si sta utilizzando, sapere quali funzioni usare e cosa non usare, testare l'applicazione beh, non solo con dati corretti, deve funzionare correttamente anche quando abbiamo a che fare con dati imprevisti.
Altri attacchi che puoi esaminare e di cui essere a conoscenza in modo che non ti colpiscano o riducano al minimo i loro rischi sono: DoS e Brute Force. E non dimenticare di controllare la pagina CVE per le vulnerabilità.
Ti è piaciuto e hai aiutato questo Tutorial?Puoi premiare l'autore premendo questo pulsante per dargli un punto positivo