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.
Questo programma permette diversi comandi:
Facciamo un test rapido 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
In questo caso service non è ancora stato allocato. Proviamo ad inserire service CC
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
E tornando ad analizzare lo heap
Vediamo che service ha sovrascritto auth.auth, che adesso contiene le nostre D. E infatti, se proviamo ad effettuare il login
La stessa modalità la possiamo eseguire al di fuori di GDB, con un payload molto semplice.
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.