Desbordamiento de Heap
Reading time: 6 minutes
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.
Informaci贸n B谩sica
Un desbordamiento de heap es como un desbordamiento de pila pero en el heap. B谩sicamente significa que se reserv贸 un espacio en el heap para almacenar algunos datos y los datos almacenados eran m谩s grandes que el espacio reservado.
En los desbordamientos de pila sabemos que algunos registros como el puntero de instrucci贸n o el marco de pila se van a restaurar desde la pila y podr铆a ser posible abusar de esto. En el caso de los desbordamientos de heap, no hay informaci贸n sensible almacenada por defecto en el bloque de heap que puede ser desbordado. Sin embargo, podr铆a haber informaci贸n sensible o punteros, por lo que la criticidad de esta vulnerabilidad depende de qu茅 datos podr铆an ser sobrescritos y c贸mo un atacante podr铆a abusar de esto.
tip
Para encontrar los desplazamientos de desbordamiento, puedes usar los mismos patrones que en desbordamientos de pila.
Desbordamientos de Pila vs Desbordamientos de Heap
En los desbordamientos de pila, la disposici贸n y los datos que van a estar presentes en la pila en el momento en que se puede activar la vulnerabilidad son bastante confiables. Esto se debe a que la pila es lineal, siempre aumentando en memoria colisionante, en lugares espec铆ficos de la ejecuci贸n del programa, la memoria de la pila generalmente almacena un tipo de datos similar y tiene una estructura espec铆fica con algunos punteros al final de la parte de la pila utilizada por cada funci贸n.
Sin embargo, en el caso de un desbordamiento de heap, la memoria utilizada no es lineal, sino que los bloques asignados suelen estar en posiciones separadas de la memoria (no uno al lado del otro) debido a bins y zonas que separan las asignaciones por tama帽o y porque la memoria previamente liberada se utiliza antes de asignar nuevos bloques. Es complicado saber el objeto que va a colisionar con el que es vulnerable a un desbordamiento de heap. Por lo tanto, cuando se encuentra un desbordamiento de heap, es necesario encontrar una manera confiable de hacer que el objeto deseado est茅 al lado en memoria del que puede ser desbordado.
Una de las t茅cnicas utilizadas para esto es Heap Grooming, que se utiliza, por ejemplo, en esta publicaci贸n. En la publicaci贸n se explica c贸mo, cuando en el kernel de iOS una zona se queda sin memoria para almacenar bloques de memoria, se expande por una p谩gina del kernel, y esta p谩gina se divide en bloques de los tama帽os esperados que se utilizar铆an en orden (hasta la versi贸n 9.2 de iOS, luego estos bloques se utilizan de manera aleatoria para dificultar la explotaci贸n de estos ataques).
Por lo tanto, en la publicaci贸n anterior donde ocurre un desbordamiento de heap, para forzar que el objeto desbordado colisione con un objeto v铆ctima, se forzan varios kallocs
por varios hilos para intentar asegurar que todos los bloques libres est茅n llenos y que se cree una nueva p谩gina.
Para forzar este llenado con objetos de un tama帽o espec铆fico, la asignaci贸n fuera de l铆nea asociada con un puerto mach de iOS es un candidato ideal. Al elaborar el tama帽o del mensaje, es posible especificar exactamente el tama帽o de la asignaci贸n kalloc
y cuando el puerto mach correspondiente se destruye, la asignaci贸n correspondiente se liberar谩 inmediatamente de nuevo a kfree
.
Luego, algunos de estos marcadores de posici贸n pueden ser liberados. La lista libre kalloc.4096
libera elementos en un orden de 煤ltimo en entrar, primero en salir, lo que b谩sicamente significa que si algunos marcadores de posici贸n son liberados y el exploit intenta asignar varios objetos v铆ctima mientras intenta asignar el objeto vulnerable al desbordamiento, es probable que este objeto sea seguido por un objeto v铆ctima.
Ejemplo libc
En esta p谩gina es posible encontrar una emulaci贸n b谩sica de desbordamiento de heap que muestra c贸mo sobrescribir el bit de uso previo del siguiente bloque y la posici贸n del tama帽o previo es posible consolidar un bloque utilizado (haci茅ndolo pensar que es no utilizado) y luego asignarlo nuevamente pudiendo sobrescribir datos que se est谩n utilizando en un puntero diferente tambi茅n.
Otro ejemplo de protostar heap 0 muestra un ejemplo muy b谩sico de un CTF donde un desbordamiento de heap puede ser abusado para llamar a la funci贸n ganadora para obtener la bandera.
En el ejemplo de protostar heap 1 es posible ver c贸mo abusando de un desbordamiento de b煤fer es posible sobrescribir en un bloque cercano una direcci贸n donde se van a escribir datos arbitrarios del usuario.
Ejemplo ARM64
En la p谩gina https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/ puedes encontrar un ejemplo de desbordamiento de heap donde un comando que se va a ejecutar se almacena en el siguiente bloque del bloque desbordado. As铆, es posible modificar el comando ejecutado sobrescribi茅ndolo con un exploit f谩cil como:
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
Otros ejemplos
- Auth-or-out. Hack The Box
- Usamos una vulnerabilidad de desbordamiento de enteros para obtener un desbordamiento de heap.
- Corrompemos punteros a una funci贸n dentro de un
struct
del chunk desbordado para establecer una funci贸n comosystem
y obtener ejecuci贸n de c贸digo.
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.