9.8 KiB
Casa di Orange
Impara l'hacking di AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF Controlla i PIANI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri La Famiglia PEASS, la nostra collezione di esclusive NFT
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud repos di github.
Informazioni di Base
Codice
- Trova un esempio in https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c
- La tecnica di exploit è stata corretta in questa patch quindi non funziona più (funzionante in versioni precedenti alla 2.26)
- Stesso esempio con più commenti in https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Obiettivo
- Abusare della funzione
malloc_printerr
Requisiti
- Sovrascrivere la dimensione del top chunk
- Perdite di Libc e heap
Contesto
Alcuni background necessari dai commenti di questo esempio:
La questione è che, nelle versioni più vecchie di libc, quando veniva chiamata la funzione malloc_printerr
, essa avrebbe iterato attraverso un elenco di strutture _IO_FILE
memorizzate in _IO_list_all
, ed effettivamente eseguito un puntatore di istruzione in quella struttura.
Questo attacco forgerà una falsa struttura _IO_FILE
che scriveremo in _IO_list_all
, e causerà l'esecuzione di malloc_printerr
.
Poi eseguirà qualsiasi indirizzo che abbiamo memorizzato nella tabella di salto delle strutture _IO_FILE
, e otterremo l'esecuzione del codice
Attacco
L'attacco inizia gestendo l'ottenimento del top chunk all'interno del unsorted bin. Questo viene ottenuto chiamando malloc
con una dimensione maggiore della dimensione corrente del top chunk ma minore di mmp_.mmap_threshold
(di default è 128K), che altrimenti attiverebbe l'allocazione di mmap
. Ogni volta che la dimensione del top chunk viene modificata, è importante assicurarsi che il top chunk + la sua dimensione sia allineato alla pagina e che il bit prev_inuse del top chunk sia sempre impostato.
Per ottenere il top chunk all'interno dell'unsorted bin, allocare un chunk per creare il top chunk, cambiare la dimensione del top chunk (con un overflow nel chunk allocato) in modo che top chunk + dimensione sia allineato alla pagina con il bit prev_inuse impostato. Quindi allocare un chunk più grande della nuova dimensione del top chunk. Nota che free
non viene mai chiamato per ottenere il top chunk nell'unsorted bin.
Il vecchio top chunk è ora nell'unsorted bin. Supponendo di poter leggere i dati al suo interno (possibilmente a causa di una vulnerabilità che ha causato anche l'overflow), è possibile ottenere le direzioni di Libc da esso e ottenere l'indirizzo di _IO_list_all.
Viene eseguito un attacco all'unsorted bin abusando dell'overflow per scrivere topChunk->bk->fwd = _IO_list_all - 0x10
. Quando viene allocato un nuovo chunk, il vecchio top chunk verrà diviso e un puntatore all'unsorted bin verrà scritto in _IO_list_all
.
Il passo successivo comporta la riduzione della dimensione del vecchio top chunk per adattarla a una small bin, impostando specificamente la sua dimensione a 0x61. Questo serve a due scopi:
- Inserimento nella Small Bin 4: Quando
malloc
esamina l'unsorted bin e vede questo chunk, cercherà di inserirlo nella small bin 4 a causa delle sue dimensioni ridotte. Questo fa sì che il chunk finisca all'inizio della lista della small bin 4 che è la posizione del puntatore FD del chunk di_IO_list_all
poiché abbiamo scritto un indirizzo vicino in_IO_list_all
tramite l'attacco all'unsorted bin. - Attivazione di un Controllo Malloc: Questa manipolazione della dimensione del chunk causerà a
malloc
di eseguire controlli interni. Quando controlla la dimensione del falso chunk in avanti, che sarà zero, attiva un errore e chiamamalloc_printerr
.
La manipolazione della small bin ti permetterà di controllare il puntatore in avanti del chunk. L'overlap con _IO_list_all viene utilizzato per forgiare una falsa struttura _IO_FILE. La struttura è attentamente progettata per includere campi chiave come _IO_write_base
e _IO_write_ptr
impostati su valori che superano i controlli interni in libc. Inoltre, viene creato una tabella di salto all'interno della struttura falsa, dove un puntatore di istruzione è impostato all'indirizzo in cui può essere eseguito del codice arbitrario (ad esempio, la funzione system
).
Per riassumere la parte rimanente della tecnica:
- Riduci il Vecchio Top Chunk: Regola la dimensione del vecchio top chunk a 0x61 per adattarlo a una small bin.
- Configura la Falsa Struttura
_IO_FILE
: Sovrapporre il vecchio top chunk con la falsa struttura _IO_FILE e impostare i campi in modo appropriato per dirottare il flusso di esecuzione.
Il passo successivo comporta la forgiatura di una falsa struttura _IO_FILE che si sovrappone al vecchio top chunk attualmente nell'unsorted bin. I primi byte di questa struttura sono attentamente progettati per includere un puntatore a un comando (ad esempio, "/bin/sh") che verrà eseguito.
I campi chiave nella falsa struttura _IO_FILE, come _IO_write_base
e _IO_write_ptr
, sono impostati su valori che superano i controlli interni in libc. Inoltre, viene creato una tabella di salto all'interno della falsa struttura, dove un puntatore di istruzione è impostato all'indirizzo in cui può essere eseguito del codice arbitrario. Tipicamente, questo sarebbe l'indirizzo della funzione system
o un'altra funzione che può eseguire comandi shell.
L'attacco culmina quando una chiamata a malloc
attiva l'esecuzione del codice attraverso la struttura _IO_FILE manipolata. Ciò consente efficacemente l'esecuzione di codice arbitrario, che di solito porta alla creazione di una shell o all'esecuzione di un altro payload dannoso.
Sommario dell'Attacco:
- Configura il top chunk: Alloca un chunk e modifica la dimensione del top chunk.
- Forza il top chunk nell'unsorted bin: Alloca un chunk più grande.
- Perdite di indirizzi di Libc: Usa la vulnerabilità per leggere dall'unsorted bin.
- Esegui l'attacco all'unsorted bin: Scrivi in _IO_list_all utilizzando un overflow.
- Riduci il vecchio top chunk: Regola la sua dimensione per adattarla a una small bin.
- Configura una falsa struttura _IO_FILE: Forgia una falsa struttura file per dirottare il flusso di controllo.
- Attiva l'esecuzione del codice: Alloca un chunk per eseguire l'attacco ed eseguire del codice arbitrario.
Questo approccio sfrutta i meccanismi di gestione dell'heap, le perdite di informazioni di Libc e gli overflow dell'heap per ottenere l'esecuzione del codice senza chiamare direttamente free
. Creando attentamente la falsa struttura _IO_FILE e posizionandola nella posizione corretta, l'attacco può dirottare il flusso di controllo durante le normali operazioni di allocazione di memoria. Ciò consente l'esecuzione di codice arbitrario, potenzialmente portando alla creazione di una shell o ad altre attività dannose.
Riferimenti
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_orange/
- https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Impara l'hacking su AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!
Altri modi per supportare HackTricks:
- Se desideri vedere la tua azienda pubblicizzata su HackTricks o scaricare HackTricks in PDF controlla i PIANI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri La Famiglia PEASS, la nostra collezione esclusiva di NFT
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud github repos.