Tcache Bin Attack

Apoya a HackTricks

Información Básica

Para obtener más información sobre qué es un bin Tcache, consulta esta página:

Bins & Memory Allocations

En primer lugar, ten en cuenta que el Tcache fue introducido en la versión 2.26 de Glibc.

El ataque Tcache (también conocido como envenenamiento Tcache) propuesto en la página 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 luego asignar esa dirección específica y potencialmente sobrescribir punteros.

Sin embargo, en la actualidad, si ejecutas el código mencionado, obtendrás el error: malloc(): unaligned tcache chunk detected. Por lo tanto, es necesario escribir una dirección alineada en el nuevo puntero (o ejecutar suficientes veces el binario para que la dirección escrita esté realmente alineada).

Ataque a índices Tcache

Por lo general, al principio del heap es posible encontrar un chunk que contiene la cantidad de chunks por índice dentro del tcache y la dirección del chunk principal de cada índice del tcache. Si por alguna razón es posible modificar esta información, sería posible hacer que el chunk principal 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.

Ejemplos

  • 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 desde el bin no ordenado solo sobrescribiendo los primeros 8B, dejando la segunda dirección a libc del chunk intacta para poder 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, agregándolo al tcache de chunks del tamaño falso. Luego, asignaremos un chunk con el tamaño falsificado, y el chunk anterior será devuelto sabiendo que este chunk era en realidad más pequeño y esto nos brinda la oportunidad de sobrescribir el siguiente chunk en memoria. Esto se abusará para sobrescribir el puntero FD del siguiente chunk para que apunte a malloc_hook, por lo que luego es 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 gadget único.

  • Fuga de información de Libc: Hay un uso después de liberar y una doble liberación. En este writeup, el autor filtró una dirección de libc leyendo la dirección de un chunk colocado en un bin pequeño (como filtrarlo desde el bin no ordenado pero desde el pequeño).

  • Ataque Tcache: Se realiza un Tcache a través de una doble liberación. El mismo chunk se libera dos veces, por lo que dentro del Tcache el chunk apuntará a sí mismo. Luego, se asigna, se modifica su puntero FD para que apunte al gancho de liberación y luego se asigna nuevamente para que el siguiente chunk en la lista esté en el gancho de liberación. Luego, esto también se asigna y es posible escribir la dirección de system aquí, por lo que cuando se libera un malloc que contiene "/bin/sh" obtenemos una shell.

  • La principal vulnerabilidad aquí es la capacidad de liberar cualquier dirección en el heap indicando su desplazamiento

  • Ataque a índices Tcache: Es posible asignar y liberar un chunk de un tamaño que, cuando se almacena dentro del chunk tcache (el chunk con la información de los bins 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 bytes diferentes, 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 liberar esta dirección. Esto agregará esa dirección al índice de chunks de tamaño 0x100 en el tcache.

  • Luego, asignar un chunk de tamaño 0x100, la dirección anterior se devolverá como un chunk, lo que permite sobrescribir otros índices tcache. Por ejemplo, colocar la dirección de malloc hook en uno de ellos y asignar un chunk del tamaño de ese índice otorgará un chunk en el gancho de calloc, lo que permite escribir un gadget único para obtener una shell.

  • Misma vulnerabilidad que antes con una restricción adicional

  • Ataque a índices Tcache: Ataque similar al anterior pero usando menos pasos al liberar el chunk que contiene la información del tcache para que su dirección se agregue al índice tcache de su tamaño, por lo que es posible asignar ese tamaño y obtener la información del chunk tcache como un chunk, lo que permite agregar el gancho de liberación como la dirección de un índice, asignarlo y escribir un gadget único en él.

  • Write After Free para agregar un número al puntero fd.

  • Se necesita mucho heap feng-shui en este desafío. El writeup muestra cómo controlar la cabeza de la lista libre del Tcache es bastante útil.

  • Fuga de Glibc a través de stdout (FSOP).

  • Envenenamiento Tcache para obtener un primitivo de escritura arbitraria.

Apoya a HackTricks

Last updated