House of Force
Reading time: 5 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
C贸digo
- Esta t茅cnica fue parcheada (aqu铆) y produce este error:
malloc(): corrupted top size
- Puedes probar el c贸digo de aqu铆 para testearlo si lo deseas.
Objetivo
- El objetivo de este ataque es poder asignar un chunk en una direcci贸n espec铆fica.
Requisitos
- Un desbordamiento que permita sobrescribir el tama帽o del encabezado del chunk superior (por ejemplo, -1).
- Poder controlar el tama帽o de la asignaci贸n de heap.
Ataque
Si un atacante quiere asignar un chunk en la direcci贸n P para sobrescribir un valor aqu铆. Comienza sobrescribiendo el tama帽o del chunk superior con -1
(quiz谩s con un desbordamiento). Esto asegura que malloc no usar谩 mmap para ninguna asignaci贸n ya que el chunk superior siempre tendr谩 suficiente espacio.
Luego, calcula la distancia entre la direcci贸n del chunk superior y el espacio objetivo para asignar. Esto se debe a que se realizar谩 un malloc con ese tama帽o para mover el chunk superior a esa posici贸n. As铆 es como se puede calcular f谩cilmente la diferencia/tama帽o:
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
Por lo tanto, asignar un tama帽o de target - old_top - 4*sizeof(long)
(los 4 longs son por los metadatos del chunk superior y del nuevo chunk cuando se asigna) mover谩 el chunk superior a la direcci贸n que queremos sobrescribir.
Luego, haz otro malloc para obtener un chunk en la direcci贸n objetivo.
Referencias y Otros Ejemplos
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- El objetivo de este escenario es un ret2win donde necesitamos modificar la direcci贸n de una funci贸n que va a ser llamada por la direcci贸n de la funci贸n ret2win.
- El binario tiene un desbordamiento que puede ser abusado para modificar el tama帽o del chunk superior, que se modifica a -1 o p64(0xffffffffffffffff).
- Luego, se calcula la direcci贸n al lugar donde existe el puntero a sobrescribir, y la diferencia desde la posici贸n actual del chunk superior hasta all铆 se asigna con
malloc
. - Finalmente, se asigna un nuevo chunk que contendr谩 este objetivo deseado dentro del cual se sobrescribe con la funci贸n ret2win.
- https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
- En el
Input your name:
hay una vulnerabilidad inicial que permite filtrar una direcci贸n de la heap. - Luego, en la funcionalidad
Org:
yHost:
es posible llenar los 64B del punteros
cuando se solicita el nombre de la organizaci贸n, que en la pila es seguido por la direcci贸n de v2, que luego es seguida por el nombre del host indicado. Como luego, strcpy va a copiar el contenido de s a un chunk de tama帽o 64B, es posible sobrescribir el tama帽o del chunk superior con los datos puestos dentro del nombre del host. - Ahora que la escritura arbitraria es posible, el GOT de
atoi
fue sobrescrito con la direcci贸n de printf. Luego fue posible filtrar la direcci贸n deIO_2_1_stderr
con%24$p
. Y con este leak de libc fue posible sobrescribir nuevamente el GOT deatoi
con la direcci贸n desystem
y llamarlo pasando como par谩metro/bin/sh
. - Un m茅todo alternativo propuesto en este otro informe es sobrescribir
free
conputs
, y luego agregar la direcci贸n deatoi@got
, en el puntero que ser谩 liberado m谩s tarde para que se filtre y con este leak sobrescribir nuevamenteatoi@got
consystem
y llamarlo con/bin/sh
. - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- Hay un UAF que permite reutilizar un chunk que fue liberado sin limpiar el puntero. Debido a que hay algunos m茅todos de lectura, es posible filtrar una direcci贸n de libc escribiendo un puntero a la funci贸n free en el GOT aqu铆 y luego llamando a la funci贸n de lectura.
- Luego, se utiliz贸 House of force (abusando del UAF) para sobrescribir el tama帽o del espacio restante con un -1, asignar un chunk lo suficientemente grande para llegar al free hook, y luego asignar otro chunk que contendr谩 el free hook. Luego, escribir en el hook la direcci贸n de
system
, escribir en un chunk"/bin/sh"
y finalmente liberar el chunk con ese contenido de cadena.
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.