hacktricks/binary-exploitation/heap/tcache-bin-attack.md

5.9 KiB

Ataque al Bin Tcache

Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Información Básica

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

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

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

El ataque 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 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 de Tcache

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 principal de cada índice de 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 el hook de malloc) para luego asignar un chunk del tamaño del índice y sobrescribir el contenido del hook de malloc en este caso.

Ejemplos

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • 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 se liberará, agregándolo al tcache de chunks del tamaño falso. Luego, asignaremos un chunk con el tamaño falsificado, y el chunk anterior se devolverá sabiendo que este chunk era en realidad más pequeño y esto 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.
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • 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 hook de free y luego se asigna nuevamente para que el siguiente chunk en la lista esté en el hook de free. 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.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • Ataque a índices de Tcache: Es posible asignar y liberar un chunk de un tamaño que, cuando se almacena en la información del tcache, generará una posición con el valor 0x100 (debido a que el byte que indica cuántos chunks en ese índice se almacenan). Luego, abusando de este valor, es posible liberar esta dirección ya que parece ser un chunk de tamaño 0x100. Esto agregará esa dirección al índice de chunks de tamaño 0x100 en el tcache.
    Luego, al asignar un chunk de tamaño 0x100, es posible sobrescribir la dirección inicial del chunk de otros índices de tcache. Por ejemplo, colocar la dirección del hook de malloc en uno de ellos y asignar un chunk del tamaño de ese índice otorgará un chunk en el hook de calloc, lo que permite escribir un gadget único para obtener una shell.