Ret2lib
Last updated
Last updated
Вивчайте та практикуйте хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)
Суть Ret2Libc полягає в перенаправленні потоку виконання вразливої програми на функцію у спільній бібліотеці (наприклад, system, execve, strcpy), замість виконання шелл-коду, наданого зловмисником на стеку. Зловмисник створює навантаження, яке змінює адресу повернення на стеку, щоб вказати на потрібну функцію бібліотеки, а також організовує необхідні аргументи відповідно до конвенції виклику.
Отримайте адресу функції, яку потрібно викликати (наприклад, system), та команду для виклику (наприклад, /bin/sh)
Створіть ланцюжок ROP для передачі першого аргументу, що вказує на рядок команди, та потоку виконання до функції
Припускаючи, що libc
, яка використовується, є тією, що на поточній машині, ви можете знайти, де вона буде завантажена в пам'ять за допомогою:
Якщо ви хочете перевірити, чи змінює ASLR адресу libc, ви можете виконати:
Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції system
за допомогою:
Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції рядка /bin/sh
за допомогою:
Знаючи використану бібліотеку libc, також можна використовувати Peda або GEF, щоб отримати адресу функції system, функції exit та рядка /bin/sh
:
Якщо процес створює дочірні процеси кожен раз, коли ви з ним розмовляєте (мережевий сервер), спробуйте прочитати цей файл (ймовірно, вам знадобиться права root).
Тут ви можете знайти точне місце завантаження libc всередині процесу та де буде завантажено для кожного дочірнього процесу цього процесу.
У цьому випадку він завантажений за адресою 0xb75dc000 (це буде базова адреса libc)
Можливо, ви не знаєте, яку бібліотеку libc завантажує виконуваний файл (оскільки він може знаходитися на сервері, до якого у вас немає доступу). У цьому випадку ви можете скористатися вразливістю для витоку деяких адрес та визначення, яка бібліотека libc використовується:
https://github.com/HackTricks-wiki/hacktricks/blob/ua/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.mdТакож ви можете знайти шаблон pwntools для цього в:
https://github.com/HackTricks-wiki/hacktricks/blob/ua/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.mdПеревірте сторінку https://libc.blukat.me/ та скористайтеся парою адрес функцій всередині libc, щоб дізнатися використану версію.
Ці атаки на основі перебору корисні лише для 32-бітних систем.
Якщо експлойт локальний, ви можете спробувати перебрати базову адресу libc (корисно для 32-бітних систем):
Якщо ви атакуєте віддалений сервер, ви можете спробувати перебрати адресу функції usleep
у libc
, передаючи як аргумент 10 (наприклад). Якщо в якийсь момент сервер витрачає додаткові 10 секунд на відповідь, ви знайшли адресу цієї функції.
Виконайте оболонку, просто перейшовши до однієї конкретної адреси у libc
:
У цьому прикладі ASLR brute-force інтегрований у код, а вразливий бінарний файл розташований на віддаленому сервері:
Перевірте приклад з:
ROP - Return Oriented ProgramingУ випадку ARM64, інструкція ret переходить туди, куди вказує реєстр x30, а не туди, куди вказує реєстр стеку. Тому це трохи складніше.
Також в ARM64 інструкція робить те, що робить інструкція (неможливо перейти посеред інструкцій і перетворити їх на нові).
Перевірте приклад з:
https://github.com/HackTricks-wiki/hacktricks/blob/ua/binary-exploitation/rop-return-oriented-programing/ret2lib/ret2lib-+-printf-leak-arm64.mdЦе дозволяє витік інформації з процесу, викликаючи printf
/puts
з певними даними, розміщеними як аргумент. Наприклад, розміщення адреси puts
в GOT у виклику puts
дозволить витік адреси puts
в пам'яті.
Це в основному означає зловживання Ret2lib для перетворення його в уразливість рядків формату printf
, використовуючи ret2lib
для виклику printf зі значеннями для експлуатації (здається непотрібним, але можливим):
Ret2lib, з витоком адреси функції в libc, використовуючи один гаджет
64 біти, ASLR увімкнено, але немає PIE, перший крок - заповнити переповнення до байту 0x00 канарейки, а потім викликати puts і витікати її. З канарейкою створюється ROP гаджет для виклику puts для витоку адреси puts з GOT та ROP гаджет для виклику system('/bin/sh')
64 біти, ASLR увімкнено, немає канарейки, переповнення стеку в main від дочірньої функції. ROP гаджет для виклику puts для витоку адреси puts з GOT, а потім виклик одного гаджета.
64 біти, без pie, без канарейки, без relro, nx. Використовує функцію write для витоку адреси write (libc) та виклика одного гаджета.
Використовує рядок формату для витоку канарейки зі стеку та переповнення буфера для виклику системи (вона в GOT) з адресою /bin/sh
.
32 біти, без relro, без канарейки, nx, pie. Зловживання поганим індексуванням для витоку адрес libc та купи зі стеку. Зловживання переповненням буфера для виклику ret2lib system('/bin/sh')
(адреса купи потрібна для обходу перевірки).