Tcache Bin Attack
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)
Para más información sobre qué es un Tcache bin, consulta esta página:
Bins & Memory AllocationsPrimero que nada, ten en cuenta que el Tcache fue introducido en la versión 2.26 de Glibc.
El ataque Tcache (también conocido como envenenamiento de Tcache) propuesto en la página de guyinatuxido es muy similar al ataque de fast bin donde el objetivo es sobrescribir el puntero al siguiente chunk en el bin dentro de un chunk liberado a una dirección arbitraria para que luego sea posible asignar esa dirección específica y potencialmente sobrescribir punteros.
Sin embargo, hoy en día, si ejecutas el código mencionado, obtendrás el error: malloc(): unaligned tcache chunk detected
. Por lo tanto, es necesario escribir como dirección en el nuevo puntero una dirección alineada (o ejecutar el binario suficientes veces para que la dirección escrita esté realmente alineada).
Por lo general, es posible encontrar al principio del heap un chunk que contiene la cantidad de chunks por índice dentro del tcache y la dirección del chunk cabeza de cada índice de tcache. Si por alguna razón es posible modificar esta información, sería posible hacer que el chunk cabeza de algún índice apunte a una dirección deseada (como __malloc_hook
) para luego asignar un chunk del tamaño del índice y sobrescribir el contenido de __malloc_hook
en este caso.
Fuga de información de Libc: Es posible llenar los tcaches, agregar un chunk a la lista no ordenada, vaciar el tcache y re-asignar el chunk de la bin no ordenada sobrescribiendo solo los primeros 8B, dejando la segunda dirección a libc del chunk intacta para que podamos leerla.
Ataque Tcache: El binario es vulnerable a un desbordamiento de heap de 1B. Esto se abusará para cambiar el encabezado de tamaño de un chunk asignado haciéndolo más grande. Luego, este chunk será liberado, añadiéndolo al tcache de chunks de tamaño falso. Luego, asignaremos un chunk con el tamaño falso, y el chunk anterior será devuelto sabiendo que este chunk era en realidad más pequeño y esto brinda la oportunidad de sobrescribir el siguiente chunk en memoria.
Abusaremos de esto para sobrescribir el puntero FD del siguiente chunk para que apunte a malloc_hook
, de modo que luego sea posible asignar 2 punteros: primero el puntero legítimo que acabamos de modificar, y luego la segunda asignación devolverá un chunk en malloc_hook
que es posible abusar para escribir un one gadget.
Fuga de información de Libc: Hay un uso después de liberar y un doble liberado. En este informe, el autor filtró una dirección de libc al leer la dirección de un chunk colocado en un bin pequeño (como filtrarlo de la bin no ordenada pero desde el pequeño).
Ataque Tcache: Se realiza un Tcache a través de un doble liberado. El mismo chunk se libera dos veces, por lo que dentro del Tcache el chunk apuntará a sí mismo. Luego, se asigna, su puntero FD se modifica para apuntar al free hook y luego se asigna nuevamente, por lo que el siguiente chunk en la lista estará en el free hook. Luego, esto también se asigna y es posible escribir la dirección de system
aquí para que cuando se libere un malloc que contenga "/bin/sh"
obtengamos un shell.
La principal vulnerabilidad aquí es la capacidad de free
cualquier dirección en el heap indicando su desplazamiento.
Ataque de índices de Tcache: Es posible asignar y liberar un chunk de un tamaño que, cuando se almacena dentro del chunk de tcache (el chunk con la información de los bins de tcache), generará una dirección con el valor 0x100. Esto se debe a que el tcache almacena la cantidad de chunks en cada bin en diferentes bytes, por lo tanto, un chunk en un índice específico genera el valor 0x100.
Luego, este valor parece que hay un chunk de tamaño 0x100. Permitiendo abusar de él al free
esta dirección. Esto agregará esa dirección al índice de chunks de tamaño 0x100 en el tcache.
Luego, asignando un chunk de tamaño 0x100, la dirección anterior será devuelta como un chunk, permitiendo sobrescribir otros índices de tcache. Por ejemplo, poniendo la dirección de malloc hook en uno de ellos y asignando un chunk del tamaño de ese índice otorgará un chunk en calloc hook, lo que permite escribir un one gadget para obtener un shell.
La misma vulnerabilidad que antes con una restricción adicional.
Ataque de índices de Tcache: Ataque similar al anterior pero usando menos pasos al liberar el chunk que contiene la información de tcache para que su dirección se agregue al índice de tcache de su tamaño, por lo que es posible asignar ese tamaño y obtener la información del chunk de tcache como un chunk, lo que permite agregar el free hook como la dirección de un índice, asignarlo y escribir un one gadget en él.
Write After Free para agregar un número al puntero fd
.
Se necesita mucho heap feng-shui en este desafío. El informe muestra cómo controlar la cabeza de la lista libre de Tcache es bastante útil.
Fuga de Glibc a través de stdout
(FSOP).
Envenenamiento de Tcache para obtener un primitivo de escritura arbitraria.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)