House of Force
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di Base
Codice
- Questa tecnica è stata corretta (qui) e produce questo errore:
malloc(): corrupted top size - Puoi provare il codice da qui per testarlo se vuoi.
Obiettivo
- Lâobiettivo di questo attacco è essere in grado di allocare un chunk in un indirizzo specifico.
Requisiti
- Un overflow che consenta di sovrascrivere la dimensione dellâintestazione del top chunk (ad es. -1).
- Essere in grado di controllare la dimensione dellâallocazione della heap.
Attacco
Se un attaccante vuole allocare un chunk nellâindirizzo P per sovrascrivere un valore qui. Inizia sovrascrivendo la dimensione del top chunk con -1 (forse con un overflow). Questo assicura che malloc non utilizzerĂ mmap per alcuna allocazione poichĂŠ il Top chunk avrĂ sempre abbastanza spazio.
Poi, calcola la distanza tra lâindirizzo del top chunk e lo spazio target da allocare. Questo perchĂŠ verrĂ eseguita una malloc con quella dimensione per spostare il top chunk in quella posizione. Questo è come la differenza/dimensione può essere facilmente calcolata:
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
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.
Riferimenti e Altri Esempi
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- Lâobiettivo di questo scenario è un ret2win dove 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 a -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, viene allocato un nuovo chunk che conterrĂ questo target desiderato allâinterno del quale viene sovrascritto dalla funzione ret2win
- https://shiftâcrops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
- Nel
Input your name:câè una vulnerabilitĂ iniziale che consente di rivelare un indirizzo dalla heap - Poi nella funzionalitĂ
Org:eHost:è possibile riempire i 64B del puntatoresquando viene chiesto il nome dellâorganizzazione, che nello stack è seguito dallâindirizzo di v2, che è poi seguito dal nome host indicato. PoichĂŠ strcpy copierĂ i contenuti 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 rivelare lâindirizzo diIO_2_1_stderrcon%24$p. E con questa leak di libc è stato possibile sovrascrivere di nuovo il GOT diatoicon lâindirizzo disysteme chiamarlo passando come parametro/bin/sh - Un metodo alternativo proposto in questo altro writeup è sovrascrivere
freeconputs, e poi aggiungere lâindirizzo diatoi@got, nel puntatore che sarĂ poi liberato in modo che venga rivelato e con questa leak sovrascrivere di nuovoatoi@gotconsysteme chiamarlo con/bin/sh. - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- Câè un UAF che consente di riutilizzare un chunk che è stato liberato senza cancellare il puntatore. PoichĂŠ ci sono alcuni metodi di lettura, è possibile rivelare un indirizzo 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.
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

