House of Force
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Questa tecnica è stata corretta (qui) e produce questo errore: malloc(): corrupted top size
Puoi provare il codice da qui per testarlo se vuoi.
L'obiettivo di questo attacco è essere in grado di allocare un chunk in un indirizzo specifico.
Un overflow che consenta di sovrascrivere la dimensione dell'intestazione del chunk superiore (ad es. -1).
Essere in grado di controllare la dimensione dell'allocazione heap.
Se un attaccante vuole allocare un chunk nell'indirizzo P per sovrascrivere un valore qui. Inizia sovrascrivendo la dimensione del chunk superiore con -1
(forse con un overflow). Questo assicura che malloc non utilizzerà mmap per alcuna allocazione poiché il chunk superiore avrà sempre abbastanza spazio.
Poi, calcola la distanza tra l'indirizzo del chunk superiore e lo spazio target da allocare. Questo perché verrà eseguita una malloc con quella dimensione per spostare il chunk superiore in quella posizione. Questo è come la differenza/dimensione può essere facilmente calcolata:
Pertanto, allocare una dimensione di target - old_top - 4*sizeof(long)
(i 4 long sono dovuti ai metadati del top chunk e del nuovo chunk quando allocato) sposterà il top chunk all'indirizzo che vogliamo sovrascrivere.
Poi, eseguire un altro malloc per ottenere un chunk all'indirizzo target.
L'obiettivo di questo scenario è un ret2win in cui dobbiamo modificare l'indirizzo di una funzione che verrà chiamata dall'indirizzo della funzione ret2win
Il binario ha un overflow che può essere sfruttato per modificare la dimensione del top chunk, che viene modificata in -1 o p64(0xffffffffffffffff)
Poi, viene calcolato l'indirizzo del luogo in cui esiste il puntatore da sovrascrivere, e la differenza dalla posizione attuale del top chunk a lì viene allocata con malloc
Infine, un nuovo chunk viene allocato che conterrà questo target desiderato all'interno del quale viene sovrascritto dalla funzione ret2win
Nel Input your name:
c'è una vulnerabilità iniziale che consente di leak un indirizzo dalla heap
Poi nella funzionalità Org:
e Host:
è possibile riempire i 64B del puntatore s
quando viene chiesto il nome dell'organizzazione, che nello stack è seguito dall'indirizzo di v2, che è poi seguito dal nome host indicato. Poiché poi, strcpy copierà il contenuto di s in un chunk di dimensione 64B, è possibile sovrascrivere la dimensione del top chunk con i dati inseriti nel nome host.
Ora che la scrittura arbitraria è possibile, il GOT di atoi
è stato sovrascritto con l'indirizzo di printf. È stato quindi possibile leak l'indirizzo di IO_2_1_stderr
con %24$p
. E con questo leak di libc è stato possibile sovrascrivere di nuovo il GOT di atoi
con l'indirizzo di system
e chiamarlo passando come parametro /bin/sh
Un metodo alternativo proposto in questo altro writeup è sovrascrivere free
con puts
, e poi aggiungere l'indirizzo di atoi@got
, nel puntatore che sarà poi liberato in modo che venga leakato e con questo leak sovrascrivere di nuovo atoi@got
con system
e chiamarlo con /bin/sh
.
C'è un UAF che consente di riutilizzare un chunk che è stato liberato senza cancellare il puntatore. Poiché ci sono alcuni metodi di lettura, è possibile leak un indirizzo di libc scrivendo un puntatore alla funzione free nel GOT qui e poi chiamando la funzione di lettura.
Poi, House of force è stato utilizzato (sfruttando l'UAF) per sovrascrivere la dimensione dello spazio rimanente con un -1, allocare un chunk abbastanza grande per arrivare al free hook, e poi allocare un altro chunk che conterrà il free hook. Poi, scrivere nel hook l'indirizzo di system
, scrivere in un chunk "/bin/sh"
e infine liberare il chunk con quel contenuto di stringa.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)