House of Force
Last updated
Last updated
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)
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.
El objetivo de este ataque es poder asignar un fragmento en una dirección específica.
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).
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:
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.
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
En Input your name:
hay una vulnerabilidad inicial que permite filtrar una dirección del heap
Luego en la funcionalidad Org:
y Host:
es posible llenar los 64B del puntero s
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 de IO_2_1_stderr
con %24$p
. Y con esta filtración de libc fue posible sobrescribir nuevamente el GOT de atoi
con la dirección de system
y llamarlo pasando como parámetro /bin/sh
Un método alternativo propuesto en este otro writeup, es sobrescribir free
con puts
, y luego agregar la dirección de atoi@got
, en el puntero que luego será liberado para que se filtre y con esta filtración sobrescribir nuevamente atoi@got
con system
y llamarlo con /bin/sh
.
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.
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)