House of Orange
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)
Техніка експлуатації була виправлена в цьому патчі, тому це більше не працює (працює в версіях до 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 та розміщуючи її в правильному місці, атака може захопити контрольний потік під час стандартних операцій виділення пам'яті. Це дозволяє виконання довільного коду, що потенційно призводить до оболонки або інших шкідливих дій.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)