Tcache Bin Attack
Reading time: 5 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Basic Information
Для отримання додаткової інформації про те, що таке Tcache bin, перегляньте цю сторінку:
По-перше, зверніть увагу, що Tcache був введений у версії Glibc 2.26.
Tcache attack (також відомий як Tcache poisoning), запропонований на сторінці guyinatuxido, дуже схожий на fast bin attack, де мета полягає в переписуванні вказівника на наступний chunk у bin всередині звільненого chunk на довільну адресу, щоб пізніше можна було виділити цю конкретну адресу і потенційно переписати вказівники.
Однак, в даний час, якщо ви запустите згаданий код, ви отримаєте помилку: malloc(): unaligned tcache chunk detected
. Тому потрібно записати в новий вказівник вирівняну адресу (або виконати бінарний файл достатню кількість разів, щоб записана адреса насправді була вирівняна).
Tcache indexes attack
Зазвичай на початку купи можна знайти chunk, що містить кількість chunk'ів на індекс всередині tcache та адресу головного chunk'а кожного індексу tcache. Якщо з якоїсь причини можливо змінити цю інформацію, можна зробити так, щоб головний chunk деякого індексу вказував на бажану адресу (таку як __malloc_hook
), щоб потім виділити chunk розміру індексу та переписати вміст __malloc_hook
у цьому випадку.
Examples
- CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
- Libc info leak: Можна заповнити tcaches, додати chunk у несортований список, очистити tcache та перевиділити chunk з несортованого bin, переписуючи лише перші 8B, залишаючи другу адресу до libc з chunk'а недоторканою, щоб ми могли її прочитати.
- Tcache attack: Бінарний файл вразливий до 1B heap overflow. Це буде використано для зміни заголовка розміру виділеного chunk'а, роблячи його більшим. Потім цей chunk буде звільнений, додавши його до tcache chunk'ів фальшивого розміру. Потім ми виділимо chunk з фальшивим розміром, і попередній chunk буде повернуто, знаючи, що цей chunk насправді був меншим, що дає можливість переписати наступний chunk в пам'яті.
Ми будемо зловживати цим, щоб переписати вказівник FD наступного chunk'а, щоб вказувати наmalloc_hook
, так що потім можливо виділити 2 вказівники: спочатку легітимний вказівник, який ми щойно змінили, а потім друге виділення поверне chunk уmalloc_hook
, який можна зловживати для запису one gadget. - CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
- Libc info leak: Є використання після звільнення та подвійне звільнення. У цьому звіті автор злив адресу libc, читаючи адресу chunk'а, розміщеного в малому bin (як зливати її з несортованого bin, але з малого).
- Tcache attack: Tcache виконується через подвійне звільнення. Один і той же chunk звільняється двічі, тому всередині Tcache chunk вказує на себе. Потім він виділяється, його вказівник FD змінюється, щоб вказувати на free hook, а потім він знову виділяється, тому наступний chunk у списку буде в free hook. Потім це також виділяється, і тут можна записати адресу
system
, так що коли malloc, що містить"/bin/sh"
, буде звільнено, ми отримаємо shell. - CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
- Основна вразливість тут полягає в можливості
free
будь-якої адреси в купі, вказуючи її зсув - Tcache indexes attack: Можна виділити та звільнити chunk розміру, який, коли зберігається всередині tcache chunk (chunk з інформацією про tcache bins), генеруватиме адресу зі значенням 0x100. Це тому, що tcache зберігає кількість chunk'ів у кожному bin в різних байтах, тому один chunk в одному конкретному індексі генерує значення 0x100.
- Тоді це значення виглядає так, ніби є chunk розміру 0x100. Дозволяючи зловживати цим, звільняючи цю адресу. Це додасть цю адресу до індексу chunk'ів розміру 0x100 у tcache.
- Потім, виділяючи chunk розміру 0x100, попередня адреса буде повернута як chunk, що дозволяє переписати інші індекси tcache.
Наприклад, помістивши адресу malloc hook в один з них і виділивши chunk розміру цього індексу, ми отримаємо chunk у calloc hook, що дозволяє записати one gadget для отримання shell. - CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
- Та ж вразливість, що й раніше, з одним додатковим обмеженням
- Tcache indexes attack: Схожий напад на попередній, але з меншим числом кроків, звільняючи chunk, що містить інформацію про tcache, так що його адреса додається до індексу tcache свого розміру, тому можливо виділити цей розмір і отримати інформацію про tcache chunk як chunk, що дозволяє додати free hook як адресу одного індексу, виділити його та записати one gadget на ньому.
- Math Door. HTB Cyber Apocalypse CTF 2023
- Write After Free для додавання числа до вказівника
fd
. - Потрібно багато heap feng-shui в цьому завданні. Звіт показує, як контроль голови Tcache free-list є досить зручним.
- Glibc leak через
stdout
(FSOP). - Tcache poisoning для отримання довільного запису.
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.