14 KiB
House of Orange
{% hint style="success" %}
Вивчайте та практикуйте хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE)
Вивчайте та практикуйте хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами на Twitter 🐦 @hacktricks_live.
- Поширюйте хакерські трюки, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Основна інформація
Код
- Знайдіть приклад за посиланням https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c
- Техніка експлуатації була виправлена у цьому патчі, тому це більше не працює (працює у версіях раніше 2.26)
- Той самий приклад з більшою кількістю коментарів за посиланням https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Мета
- Зловживання функцією
malloc_printerr
Вимоги
- Перезаписати розмір верхнього чанка
- Витоки libc та heap
Контекст
Деяка необхідна інформація з коментарів з цього прикладу:
Справа в тому, що в старих версіях libc, коли була викликана функція malloc_printerr
, вона переглядала список структур _IO_FILE
, збережених у _IO_list_all
, і фактично виконувала вказівник інструкцій у цій структурі.
Цей атака сфабрикує фальшиву структуру _IO_FILE
, яку ми запишемо у _IO_list_all
, і спричинить виконання malloc_printerr
.
Потім вона виконає будь-яку адресу, яку ми зберегли у структурах _IO_FILE
, та ми отримаємо виконання коду
Атака
Атака починається з того, що вдається отримати верхній чанк всередині несортованого біна. Це досягається шляхом виклику malloc
з розміром більшим за поточний розмір верхнього чанка, але меншим за mmp_.mmap_threshold
(за замовчуванням 128K), що інакше спричинило б виділення через mmap
. Кожного разу, коли розмір верхнього чанка змінюється, важливо забезпечити, що верхній чанк + його розмір вирівнюється за сторінку та що біт prev_inuse верхнього чанка завжди встановлений.
Щоб отримати верхній чанк всередині несортованого біна, виділіть частину для створення верхнього чанка, змініть розмір верхнього чанка (з переповненням у виділеному чанку), щоб верхній чанк + розмір був вирівняний за сторінку з бітом prev_inuse встановленим. Потім виділіть частину більшого розміру, ніж новий розмір верхнього чанка. Зверніть увагу, що free
ніколи не викликається, щоб отримати верхній чанк у несортований бін.
Старий верхній чанк тепер знаходиться в несортованому біні. Припускаючи, що ми можемо читати дані всередині нього (можливо, через вразливість, яка також спричинила переповнення), можливо витікати адреси libc з нього та отримати адресу _IO_list_all.
Атака на несортований бін виконується шляхом зловживання переповнення для запису topChunk->bk->fwd = _IO_list_all - 0x10
. Коли виділяється новий чанк, старий верхній чанк буде розділений, і вказівник на несортований бін буде записаний у _IO_list_all
.
Наступним кроком є зменшення розміру старого верхнього чанка, щоб він вмістився у малий бін, зокрема встановивши його розмір на 0x61. Це служить двом цілям:
- Вставка в малий бін 4: Коли
malloc
просканує несортований бін і побачить цей чанк, він спробує вставити його в малий бін 4 через його малий розмір. Це призводить до того, що чанк потрапляє на початок списку малого біна 4, який є місцем вказівника FD чанку_IO_list_all
, оскільки ми записали близьку адресу в_IO_list_all
через атаку на несортований бін. - Спричинення перевірки Malloc: Ця маніпуляція розміром чанку призведе до виконання внутрішніх перевірок
malloc
. Коли він перевіряє розмір фальшивого впереднього чанку, який буде нульовим, він спричиняє помилку та викликаєmalloc_printerr
.
Маніпуляція малим біном дозволить вам контролювати впередній вказівник чанку. Перекриття з _IO_list_all використовується для створення фальшивої структури _IO_FILE. Структура уважно створена таким чином, щоб включати ключові поля, такі як _IO_write_base
та _IO_write_ptr
, встановлені на значення, які проходять внутрішні перевірки в libc. Крім того, у фальшивій структурі створюється таблиця стрибків, де вказівник інструкцій встановлений на адресу, де може бути виконаний довільний код (наприклад, функція system
).
Підсумовуючи залишкову частину техніки:
- Зменшити старий верхній чанк: Відрегулюйте розмір старого верхнього чанка на 0x61, щоб він вмістився у малий бін.
- Налаштувати фальшиву структуру
_IO_FILE
: Перекрити старий верхній чанк фальшивою структурою _IO_FILE та встановити поля відповідним чином для перехоплення потоку виконання.
Наступним кроком є створення фальшивої структури _IO_FILE, яка перекривається зі старим верхнім чанком, що зараз знаходиться в несортованому біні. Перші байти цієї структури уважно створені таким чином, щоб включати вказівник на команду (наприклад, "/bin/sh"), яка буде виконана.
Ключові поля в фальшивій структурі _IO_FILE, такі як _IO_write_base
та _IO_write_ptr
, встановлені на значення, які проходять внутрішні перевірки в libc. Крім того, у фальшивій структурі створюється таблиця стрибків, де вказівник інструкцій встановлений на адресу, де може бути виконаний довільний код. Зазвичай це буде адреса функції system
або іншої функції, яка може виконувати команди оболонки.
Атака завершується, коли виклик malloc
спричиняє виконання коду через маніпульовану структуру _IO_FILE. Це ефективно дозволяє виконання довільного коду, що зазвичай призводить до запуску оболонки або виконання іншого зловмисного навантаження.
Підсумок атаки:
- Налаштувати верхній чанк: Виділіть частину та змініть розмір верхнього чанка.
- Примусити верхній чанк у несортований бін: Виділіть більшу частину.
- Витікання адрес libc: Використовуйте вразливість для читання з несортованого біна.
- Виконати атаку на несортований бін: Записати у _IO_list_all за допомогою переповнення.
- Зменшити старий верхній чанк: Відрегулюйте його розмір, щоб він вмістився у малий бін.
- Налаштувати фальшиву структуру _IO_FILE: Створіть фальшиву файлову структуру для перехоплення потоку управління.
- Спричинення виконання коду: Виділіть частину для виконання атаки та запуску довільного коду.
Цей підхід використовує механізми управління купою, витоки інформації з libc та переповнення купи для досягнення виконання коду без прямого виклику free
. Шляхом уважного створення фальшивої структури _IO_FILE та розміщення її у відповідному місці атака може перехопити потік управління під час стандартних операцій виділення пам'яті. Це дозволяє виконання довільного коду, що потенційно призводить до запуску оболонки або інших зловмисних дій.
Посилання
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_orange/
- https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
{% hint style="success" %}
Вивчайте та практикуйте хакінг AWS:Навчання AWS Red Team Expert (ARTE) від HackTricks
Вивчайте та практикуйте хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами на Twitter 🐦 @hacktricks_live.
- Поширюйте хакінг-трюки, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.