House of Orange

Sostieni HackTricks

Informazioni di Base

Codice

Obiettivo

  • Abusare della funzione malloc_printerr

Requisiti

  • Sovrascrivere la dimensione del top chunk

  • Perdite di Libc e heap

Contesto

Alcune informazioni necessarie dai commenti di questo esempio:

Il punto è che, nelle versioni più vecchie di libc, quando veniva chiamata la funzione malloc_printerr, essa avrebbe iterato attraverso una lista di strutture _IO_FILE memorizzate in _IO_list_all, e in realtà 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 riuscendo a ottenere il 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 perdite di indirizzi 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 un bin piccolo, impostando specificamente la sua dimensione su 0x61. Questo serve a due scopi:

  1. Inserimento nel Small Bin 4: Quando malloc esamina l'unsorted bin e vede questo chunk, cercherà di inserirlo nel small bin 4 a causa delle sue dimensioni ridotte. Questo fa sì che il chunk finisca all'inizio della lista del 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.

  2. 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 chiama malloc_printerr.

La manipolazione del bin piccolo 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 sull'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 un bin piccolo.

  • 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 sull'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:

  1. Configura il top chunk: Alloca un chunk e modifica la dimensione del top chunk.

  2. Forza il top chunk nell'unsorted bin: Alloca un chunk più grande.

  3. Perdite di indirizzi di Libc: Usa la vulnerabilità per leggere dall'unsorted bin.

  4. Esegui l'attacco all'unsorted bin: Scrivi in _IO_list_all utilizzando un overflow.

  5. Riduci il vecchio top chunk: Regola la sua dimensione per adattarla a un bin piccolo.

  6. Configura una falsa struttura _IO_FILE: Forgia una falsa struttura file per dirottare il flusso di controllo.

  7. 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 operazioni standard di allocazione di memoria. Ciò consente l'esecuzione di codice arbitrario, potenzialmente portando alla creazione di una shell o ad altre attività dannose.

Riferimenti

Sostieni HackTricks

Last updated