Protostar – Heap Buffer Overflow – Heap 2

Tempo di lettura: 5 minuti

Proseguiamo con un altro esercizio della serie Protostar. Questa volta andremo ad analizzare una vulnerabilità presente nell’heap quando un programma continua ad utilizzare un puntatore dopo che è stato liberato (con l’istruzione free), Use-After-Free appunto.

Il puntatore originale alla memoria liberata viene utilizzato di nuovo e punta ad un punto all’interno della nuova allocazione. Man mano che i dati vengono modificati, questo corrompe la memoria e può portare ad un comportamento indefinito nel processo e, in condizioni ideali (per noi), ad un’esecuzione di comandi.

Heap 2

Heap 2
Heap 2

Questo programma permette diversi comandi:

  • Auth: a riga 24, viene allocata una quantità di memoria di lunghezza auth e, se l’input è <31 viene l’input viene assegnato alla struct auth.name
  • Reset: a riga 31, che esegue la free.
  • Service: a riga 34, che copia la stringa inserita in input
  • Login: a riga 37, utilizzato per controllare se la variabile auth.auth è assegnata e di conseguenza l’utente è loggato. Ed è proprio questo che dovremo stampare per superare la sfida

Facciamo un test rapido con ltrace

Esecuzione con ltrace
Esecuzione con ltrace

Come si può notare, una volta che viene inserito il comando reset, auth sarà sempre sovrascritto sullo stesso indirizzo, e potremo sfruttare questo problema per cercare di sovrascrivere auth.auth e superare il livello.

Passando su gdb ed eseguendolo con lo stesso payload

Struttura di auth
Struttura di auth

In questo caso service non è ancora stato allocato. Proviamo ad inserire service CC

Service allocato
Service allocato

Ed ecco che, poiché auth ora è allocato sempre alla stessa posizione, possiamo calcolare l’offset tra service e auth.auth (che è la variabile che dovremo sovrascrivere).

osboxes@osboxes:~/Desktop/Protostar$ echo $((0x804b848 - 0x804b838))
16

Dovendo essere almeno 16 caratteri, ne andiamo ad inserire 17

Inserimento di 17 caratteri in service
Inserimento di 17 caratteri in service

E tornando ad analizzare lo heap

Auth.auth è stata sovrascritta
Auth.auth è stata sovrascritta

Vediamo che service ha sovrascritto auth.auth, che adesso contiene le nostre D. E infatti, se proviamo ad effettuare il login

Livello superato!
Livello superato!

La stessa modalità la possiamo eseguire al di fuori di GDB, con un payload molto semplice.

Livello superato!
Livello superato!

Conclusioni

La vulnerabilità Use-After-Free è una delle più frequenti, anche nei sistemi e programmi moderni. Come abbiamo potuto notare non è semplice da identificare, ma proprio per questo motivo rimane la più comune e pericolosa della categoria dello heap. Per chi volesse comprendere meglio, consiglio questo post di SensePost, che include anche due esercizi aggiuntivi.