hacktricks/binary-exploitation/libc-heap/tcache-bin-attack.md

11 KiB
Raw Blame History

Атака на Tcache Bin

{% hint style="success" %} Вивчайте та практикуйте Хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks
Вивчайте та практикуйте Хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks

Підтримайте HackTricks
{% endhint %}

Основна інформація

Для отримання додаткової інформації про те, що таке Tcache bin, перегляньте цю сторінку:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

По-перше, слід зауважити, що Tcache був впроваджений у версії Glibc 2.26.

Атака на Tcache (також відома як забруднення Tcache) запропонована на сторінці guyinatuxido дуже схожа на атаку на швидкий бін, де метою є перезапис вказівника на наступний чанк у біні всередині вивільненого чанку на довільну адресу, щоб пізніше було можливо виділити цю конкретну адресу та потенційно перезаписати вказівники.

Однак на сьогоднішній день, якщо ви запустите згаданий код, ви отримаєте помилку: malloc(): unaligned tcache chunk detected. Тому потрібно записати як адресу в новий вказівник вирівняну адресу (або виконати достатню кількість разів бінарний файл, щоб записана адреса фактично була вирівняною).

Атаки на індекси Tcache

Зазвичай на початку купи можна знайти чанк, що містить кількість чанків на кожний індекс всередині tcache та адресу головного чанку кожного індексу tcache. Якщо з якоїсь причини можливо змінити цю інформацію, буде можливо зробити головний чанк деякого індексу вказувати на бажану адресу (наприклад, __malloc_hook), а потім виділити чанк розміру індексу та перезаписати вміст __malloc_hook у цьому випадку.

Приклади

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Витік інформації про Libc: Можливо заповнити tcaches, додати чанк у неупорядкований список, очистити tcache та повторно виділити чанк з неупорядкованого біна, перезаписавши лише перші 8 байт, залишаючи другу адресу до libc з чанку недоторканою, щоб ми могли її прочитати.
  • Атака на Tcache: Бінарний файл вразливий до переливання купи 1 байт. Це буде використано для зміни заголовка розміру виділеного чанку, зробивши його більшим. Потім цей чанк буде вивільнено, додаючи його до tcache чанків фальшивого розміру. Потім ми виділимо чанк із підробленим розміром, і попередній чанк буде повернуто знавши, що цей чанк насправді був меншим, і це відкриває можливість перезаписати наступний чанк в пам'яті.
    Ми використаємо це для перезапису вказівника FD на наступний чанк, щоб вказував на malloc_hook, тому потім можна виділити 2 вказівники: спочатку законний вказівник, який ми щойно змінили, а потім друге виділення поверне чанк у malloc_hook, який можна використати для написання one gadget.
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Витік інформації про Libc: Є використання після вивільнення та подвійне вивільнення. У цьому описі автор витік адреси libc, прочитавши адресу чанку, розміщеного в малому біні (наприклад, витік з неупорядкованого біна, але з малого).
  • Атака на Tcache: Виконується Tcache через подвійне вивільнення. Той самий чанк вивільнюється двічі, тому всередині Tcache чанк буде вказувати на себе. Потім його виділять, його вказівник FD буде змінено на вказувати на free hook, і потім його знову виділять, тому наступний чанк у списку буде в free hook. Потім його також виділять і буде можливо записати адресу system тут, тому коли виділений malloc, що містить "/bin/sh", буде вивільнений, ми отримаємо оболонку.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • Основна уразливість тут - можливість вивільнити будь-яку адресу в купі, вказавши її зміщення
  • Атаки на індекси Tcache: Можливо виділити та вивільнити чанк розміру, який, коли збережений всередині tcache чанку (чанку з інформацією про біни tcache), згенерує адресу зі значенням 0x100. Це тому, що tcache зберігає кількість чанків у кожному біні у різних байтах, тому один чанк у одному конкретному індексі генерує значення 0x100.
  • Потім це значення виглядає так, ніби є чанк розміру 0x100. Це дозволяє зловживати цим, вивільнивши цю адресу. Це додасть цю адресу до індексу чанків розміром 0x100 в tcache.
  • Потім, виділивши чанк розміром 0x100, попередня адреса буде повернена як чанк, дозволяючи перезаписати інші індекси tcache.
    Наприклад, вставляючи адресу malloc hook в один з них та виділяючи чанк розміру цього індексу, дозволить отримати чанк у calloc hook, що дозволяє написати one gadget для отримання оболонки.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
  • Та ж уразливість, що й раніше з одним додатковим обмеженням
  • Атаки на індекси Tcache: Схожа атака на попередню, але з меншою кількістю кроків, вивільнивши чанк, що містить інформацію про tcache, тому його адреса додається до індексу tcache його розміру, тому можливо виділити цей розмір та отримати інформацію про чанк tcache як чанк, що дозволяє додати free hook як адресу одного індексу, виділити його та написати one gadget на ньому.
  • Math Door. HTB Cyber Apocalypse CTF 2023
  • Запис після вивільнення, щоб додати число до вказівника fd.
  • Для цього завдання потрібно багато heap feng-shui. У описі показано, як керування головою списку вільних чанків Tcache досить зручно.
  • Витік Glibc через stdout (FSOP).
  • Забруднення Tcache для отримання примітиву довільного запису.
  • Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами на Twitter 🐦 @hacktricks_live.
  • Поширюйте хакерські трюки, надсилайте PR до HackTricks і HackTricks Cloud репозиторіїв на GitHub.