8.1 KiB
House of Force
{% hint style="success" %}
Aprende y practica Hacking en AWS: HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: 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 los repositorios de HackTricks y HackTricks Cloud.
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 desde aquí para probarlo si lo deseas.
Objetivo
- El objetivo de este ataque es poder asignar un fragmento en una dirección específica.
Requisitos
- Un desbordamiento que permita sobrescribir el tamaño del encabezado del fragmento superior (por ejemplo, -1).
- Poder controlar el tamaño de la asignación del montón (heap).
Ataque
Si un atacante desea asignar un fragmento en la dirección P para sobrescribir un valor aquí. Comienza sobrescribiendo el tamaño del fragmento superior con -1
(quizás con un desbordamiento). Esto asegura que malloc no utilizará mmap para ninguna asignación, ya que el fragmento superior siempre tendrá suficiente espacio.
Luego, calcula la distancia entre la dirección del fragmento superior y el espacio objetivo para asignar. Esto se debe a que se realizará una asignación malloc con ese tamaño para mover el fragmento 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 objetivo - old_top - 4*sizeof(long)
(los 4 longs son debido a los metadatos del chunk superior y del nuevo chunk cuando se asigna) moverá el chunk superior a la dirección que queremos sobrescribir.
Luego, hacer 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 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 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 en el que 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
Input your name:
hay una vulnerabilidad inicial que permite filtrar una dirección del 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 seguido por el nombre del host indicado. Como entonces, 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 introducidos dentro del nombre del host. - Ahora que la escritura arbitraria es posible, el GOT de
atoi
fue sobrescrito a la dirección de printf. entonces fue posible filtrar la dirección deIO_2_1_stderr
con%24$p
. Y con esta filtración 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 writeup, es sobrescribir
free
conputs
, y luego agregar la dirección deatoi@got
, en el puntero que luego será liberado para que se filtre y con esta filtración 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 borrar 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 izquierdo con un -1, asignar un chunk lo suficientemente grande para llegar al hook de free, y luego asignar otro chunk que contendrá el hook de free. 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.
{% hint style="success" %}
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- ¡Consulta 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 los repositorios de HackTricks y HackTricks Cloud.