Tcache Bin Attack

Sostieni HackTricks

Informazioni di Base

Per ulteriori informazioni su cosa sia un bin di Tcache, controlla questa pagina:

Bins & Memory Allocations

Innanzitutto, nota che il Tcache è stato introdotto nella versione 2.26 di Glibc.

L'attacco Tcache (noto anche come Tcache poisoning) proposto nella pagina guyinatuxido è molto simile all'attacco fast bin dove l'obiettivo è sovrascrivere il puntatore al prossimo chunk nel bin all'interno di un chunk liberato con un indirizzo arbitrario in modo da allocare successivamente quell'indirizzo specifico e sovrascrivere potenzialmente i puntatori.

Tuttavia, al giorno d'oggi, se esegui il codice menzionato, otterrai l'errore: malloc(): unaligned tcache chunk detected. Quindi, è necessario scrivere come indirizzo nel nuovo puntatore un indirizzo allineato (o eseguire abbastanza volte il binario in modo che l'indirizzo scritto sia effettivamente allineato).

Attacco agli indici di Tcache

Di solito è possibile trovare all'inizio dell'heap un chunk contenente la quantità di chunk per indice all'interno del tcache e l'indirizzo al chunk di testa di ciascun indice di tcache. Se per qualche motivo è possibile modificare queste informazioni, sarebbe possibile far puntare il chunk di testa di alcuni indici a un indirizzo desiderato (come __malloc_hook) per poi allocare un chunk della dimensione dell'indice e sovrascrivere i contenuti di __malloc_hook in questo caso.

Esempi

  • Leak di informazioni su Libc: È possibile riempire i tcache, aggiungere un chunk nella lista non ordinata, svuotare il tcache e ri-allocare il chunk dalla lista non ordinata sovrascrivendo solo i primi 8B, lasciando intatto il secondo indirizzo a libc dal chunk in modo da poterlo leggere.

  • Attacco Tcache: Il binario è vulnerabile a un overflow di heap di 1B. Questo verrà sfruttato per cambiare l'intestazione di dimensione di un chunk allocato rendendola più grande. Quindi, questo chunk verrà liberato, aggiungendolo al tcache dei chunk della dimensione falsa. Successivamente, verrà allocato un chunk con la dimensione falsificata e il chunk precedente verrà restituito sapendo che questo chunk era effettivamente più piccolo e ciò offre l'opportunità di sovrascrivere il prossimo chunk in memoria. Questo verrà sfruttato per sovrascrivere il puntatore FD del prossimo chunk per farlo puntare a malloc_hook, quindi sarà possibile allocare 2 puntatori: prima il puntatore legittimo appena modificato e poi la seconda allocazione restituirà un chunk in malloc_hook che è possibile sfruttare per scrivere un one gadget.

  • Leak di informazioni su Libc: C'è un uso dopo la liberazione e una doppia liberazione. In questo writeup l'autore ha fatto trapelare un indirizzo di libc leggendo l'indirizzo di un chunk posizionato in un bin piccolo (come se lo stesse facendo trapelare dal bin non ordinato ma da quello piccolo)

  • Attacco Tcache: Viene eseguito un Tcache tramite una doppia liberazione. Lo stesso chunk viene liberato due volte, quindi all'interno del Tcache il chunk punterà a se stesso. Successivamente, viene allocato, il suo puntatore FD viene modificato per puntare al free hook e quindi viene allocato di nuovo in modo che il prossimo chunk nella lista sarà nel free hook. Successivamente, anche questo viene allocato ed è possibile scrivere l'indirizzo di system qui in modo che quando un malloc contenente "/bin/sh" viene liberato otteniamo una shell.

  • La principale vulnerabilità qui è la capacità di liberare qualsiasi indirizzo nell'heap indicandone l'offset

  • Attacco agli indici di Tcache: È possibile allocare e liberare un chunk di una dimensione tale che quando viene memorizzato all'interno del chunk di tcache (il chunk con le informazioni dei bin di tcache) genererà un indirizzo con il valore 0x100. Questo perché il tcache memorizza la quantità di chunk su ciascun bin in byte diversi, quindi un chunk in un indice specifico genera il valore 0x100.

  • Quindi, questo valore sembra che ci sia un chunk di dimensione 0x100. Consentendo di sfruttarlo liberando questo indirizzo. Questo aggiungerà quell'indirizzo all'indice dei chunk di dimensione 0x100 nel tcache.

  • Quindi, allocando un chunk di dimensione 0x100, l'indirizzo precedente verrà restituito come un chunk, consentendo di sovrascrivere altri indici di tcache. Ad esempio mettendo l'indirizzo di malloc hook in uno di essi e allocando un chunk della dimensione di quell'indice permetterà di ottenere un chunk in calloc hook, che consente di scrivere un one gadget per ottenere una shell.

  • Stessa vulnerabilità di prima con un'ulteriore restrizione

  • Attacco agli indici di Tcache: Attacco simile al precedente ma con meno passaggi liberando il chunk che contiene le informazioni del tcache in modo che il suo indirizzo venga aggiunto all'indice del tcache della sua dimensione in modo da poter allocare quella dimensione e ottenere le informazioni del tcache come un chunk, che consente di aggiungere free hook come l'indirizzo di un indice, allocarlo e scrivere un one gadget su di esso.

  • Write After Free per aggiungere un numero al puntatore fd.

  • È necessario molto heap feng-shui in questa sfida. Il writeup mostra come controllare la testa della lista libera di Tcache sia molto utile.

  • Leak di Glibc attraverso stdout (FSOP).

  • Tcache poisoning per ottenere un primitivo di scrittura arbitrario.

Sostieni HackTricks

Last updated