Fast Bin Attack
Información Básica
Para obtener más información sobre qué es un fast bin, consulta esta página:
Bins & Memory AllocationsDado que el fast bin es una lista enlazada simple, hay muchas menos protecciones que en otros bins y simplemente modificar una dirección en un chunk fast bin liberado es suficiente para poder asignar más tarde un chunk en cualquier dirección de memoria.
En resumen:
Puedes encontrar un ejemplo completo en un código muy bien explicado en https://guyinatuxedo.github.io/28-fastbin_attack/explanation_fastbinAttack/index.html:
Si es posible sobrescribir el valor de la variable global global_max_fast
con un número grande, esto permite generar fragmentos de fast bin de tamaños más grandes, potencialmente permitiendo realizar ataques de fast bin en escenarios donde previamente no era posible. Esta situación es útil en el contexto del ataque de large bin y ataque de unsorted bin.
Ejemplos
Es posible asignar fragmentos, liberarlos, leer su contenido y llenarlos (con una vulnerabilidad de desbordamiento).
Consolidar fragmento para infoleak: La técnica consiste básicamente en abusar del desbordamiento para crear un
prev_size
falso para que un fragmento anterior se coloque dentro de uno más grande, de modo que al asignar el más grande que contiene otro fragmento, es posible imprimir sus datos y filtrar una dirección a libc (main_arena+88
).Sobrescribir gancho de malloc: Para esto, y abusando de la situación de superposición anterior, fue posible tener 2 fragmentos que apuntaban a la misma memoria. Por lo tanto, liberándolos a ambos (liberando otro fragmento en medio para evitar protecciones), fue posible tener el mismo fragmento en el fast bin 2 veces. Luego, fue posible asignarlo nuevamente, sobrescribir la dirección al siguiente fragmento para apuntar un poco antes de
__malloc_hook
(para que apunte a un entero que malloc piensa que es un tamaño libre - otro bypass), asignarlo nuevamente y luego asignar otro fragmento que recibirá una dirección a los ganchos de malloc. Finalmente se escribió un one gadget allí.Hay un desbordamiento de montón y uso después de liberar y doble liberación porque cuando se libera un fragmento es posible reutilizar y volver a liberar los punteros.
Filtrado de información de libc: Simplemente libere algunos fragmentos y obtendrán un puntero a una parte de la ubicación de la main arena. Como se pueden reutilizar los punteros liberados, simplemente lea esta dirección.
Ataque de fast bin: Todos los punteros a las asignaciones se almacenan dentro de un array, por lo que podemos liberar un par de fragmentos de fast bin y en el último sobrescribir la dirección para apuntar un poco antes de este array de punteros. Luego, asignar un par de fragmentos con el mismo tamaño y obtendremos primero el legítimo y luego el falso que contiene el array de punteros. Ahora podemos sobrescribir estos punteros de asignación para hacer que la dirección GOT de
free
apunte asystem
y luego escribir"/bin/sh"
en el fragmento 1 para luego llamar afree(fragmento1)
que en su lugar ejecutarásystem("/bin/sh")
.Otro ejemplo de abuso de un desbordamiento de un byte para consolidar fragmentos en el unsorted bin y obtener un filtrado de información de libc y luego realizar un ataque de fast bin para sobrescribir el gancho de malloc con una dirección de one gadget.
Después de un filtrado de información abusando del unsorted bin con un UAF para filtrar una dirección de libc y una dirección de PIE, el exploit de este CTF utilizó un ataque de fast bin para asignar un fragmento en un lugar donde estaban ubicados los punteros a fragmentos controlados, por lo que fue posible sobrescribir ciertos punteros para escribir un one gadget en la GOT.
Puedes encontrar un ataque de Fast Bin abusado a través de un ataque de unsorted bin:
Ten en cuenta que es común antes de realizar ataques de fast bin abusar de las listas de liberación para filtrar direcciones de libc/montón (cuando sea necesario).
Solo podemos asignar fragmentos de tamaño mayor que
0x100
.Sobrescribir
global_max_fast
usando un ataque de Unsorted Bin (funciona 1/16 veces debido a ASLR, porque necesitamos modificar 12 bits, pero debemos modificar 16 bits).Ataque de Fast Bin para modificar un array global de fragmentos. Esto proporciona un primitivo de lectura/escritura arbitrario, que permite modificar la GOT y hacer que alguna función apunte a
system
.
Last updated