Fast 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 fast bin, consulta esta página:
Bins & Memory AllocationsDebido a que el fast bin es una lista enlazada simple, hay muchas menos protecciones que en otros bins y solo modificar una dirección en un chunk de fast bin liberado es suficiente para poder asignar más tarde un chunk en cualquier dirección de memoria.
Como 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 chunks de fast bin de tamaños mayores, lo que potencialmente permite realizar ataques de fast bin en escenarios donde anteriormente no era posible. Esta situación es útil en el contexto de large bin attack y unsorted bin attack
Es posible asignar chunks, liberarlos, leer su contenido y llenarlos (con una vulnerabilidad de desbordamiento).
Consolidar chunk para infoleak: La técnica consiste básicamente en abusar del desbordamiento para crear un prev_size
falso, de modo que un chunk anterior se coloque dentro de uno más grande, por lo que al asignar el más grande que contiene otro chunk, es posible imprimir sus datos y filtrar una dirección a libc (main_arena+88
).
Sobrescribir malloc hook: Para esto, y abusando de la situación de superposición anterior, fue posible tener 2 chunks que apuntaban a la misma memoria. Por lo tanto, al liberar ambos (liberando otro chunk en medio para evitar protecciones) fue posible tener el mismo chunk en el fast bin 2 veces. Luego, fue posible asignarlo nuevamente, sobrescribir la dirección del siguiente chunk para apuntar un poco antes de __malloc_hook
(de modo que apunte a un entero que malloc piensa que es un tamaño libre - otro bypass), asignarlo nuevamente y luego asignar otro chunk que recibirá una dirección a malloc hooks.
Finalmente, se escribió un one gadget allí.
Hay un desbordamiento de heap y uso después de liberar y doble liberación porque cuando un chunk se libera es posible reutilizar y volver a liberar los punteros.
Libc info leak: Simplemente libera algunos chunks y obtendrán un puntero a una parte de la ubicación de la arena principal. Como puedes reutilizar punteros liberados, solo lee esta dirección.
Fast bin attack: Todos los punteros a las asignaciones se almacenan dentro de un array, por lo que podemos liberar un par de chunks de fast bin y en el último sobrescribir la dirección para apuntar un poco antes de este array de punteros. Luego, asigna un par de chunks del 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 a system
y luego escribir "/bin/sh"
en el chunk 1 para luego llamar a free(chunk1)
que en su lugar ejecutará system("/bin/sh")
.
Otro ejemplo de abusar de un desbordamiento de un byte para consolidar chunks en el unsorted bin y obtener un libc infoleak y luego realizar un ataque de fast bin para sobrescribir malloc hook con una dirección de one gadget.
Después de un infoleak 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 chunk en un lugar donde se encontraban los punteros a chunks 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/heap (cuando sea necesario).
Solo podemos asignar chunks 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 chunks. Esto proporciona una primitiva de lectura/escritura arbitraria, que permite modificar la GOT y hacer que algunas funciones apunten a system
.
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)