House of Force
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)
Esta técnica fue parcheada (aquí) y produce este error: malloc(): corrupted top size
Puedes probar el código desde aquí para testearlo si lo deseas.
El objetivo de este ataque es poder asignar un chunk en una dirección específica.
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.
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:
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.
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.
En el 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 pide 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 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 informe, es sobrescribir free
con puts
, y luego agregar la dirección de atoi@got
, en el puntero que será liberado más tarde 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 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 gancho de liberación, y luego asignar otro chunk que contendrá el gancho de liberación. Luego, escribir en el gancho la dirección de system
, escribir en un chunk "/bin/sh"
y finalmente liberar el chunk con ese contenido de cadena.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)