Ret2lib
Основна інформація
Суть Ret2Libc полягає в перенаправленні потоку виконання вразливої програми на функцію у спільній бібліотеці (наприклад, system, execve, strcpy), замість виконання шелл-коду, наданого зловмисником на стеку. Зловмисник створює навантаження, яке змінює адресу повернення на стеку, щоб вказати на потрібну функцію бібліотеки, а також організовує необхідні аргументи відповідно до конвенції виклику.
Приклад кроків (спрощено)
Отримайте адресу функції, яку потрібно викликати (наприклад, system), та команду для виклику (наприклад, /bin/sh)
Створіть ланцюжок ROP для передачі першого аргументу, що вказує на рядок команди, та потоку виконання до функції
Пошук адрес
Припускаючи, що
libc
, яка використовується, є тією, що на поточній машині, ви можете знайти, де вона буде завантажена в пам'ять за допомогою:
Якщо ви хочете перевірити, чи змінює ASLR адресу libc, ви можете виконати:
Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції
system
за допомогою:
Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції рядка
/bin/sh
за допомогою:
Використання gdb-peda / GEF
Знаючи використану бібліотеку libc, також можна використовувати Peda або GEF, щоб отримати адресу функції system, функції exit та рядка /bin/sh
:
Використання /proc/<PID>/maps
Якщо процес створює дочірні процеси кожен раз, коли ви з ним розмовляєте (мережевий сервер), спробуйте прочитати цей файл (ймовірно, вам знадобиться права root).
Тут ви можете знайти точне місце завантаження libc всередині процесу та де буде завантажено для кожного дочірнього процесу цього процесу.
У цьому випадку він завантажений за адресою 0xb75dc000 (це буде базова адреса libc)
Невідома бібліотека libc
Можливо, ви не знаєте, яку бібліотеку libc завантажує виконуваний файл (оскільки він може знаходитися на сервері, до якого у вас немає доступу). У цьому випадку ви можете скористатися вразливістю для витоку деяких адрес та визначення, яка бібліотека libc використовується:
Також ви можете знайти шаблон pwntools для цього в:
Відома бібліотека libc з 2 зміщеннями
Перевірте сторінку https://libc.blukat.me/ та скористайтеся парою адрес функцій всередині libc, щоб дізнатися використану версію.
Обхід ASLR у 32-бітних системах
Ці атаки на основі перебору корисні лише для 32-бітних систем.
Якщо експлойт локальний, ви можете спробувати перебрати базову адресу libc (корисно для 32-бітних систем):
Якщо ви атакуєте віддалений сервер, ви можете спробувати перебрати адресу функції
usleep
уlibc
, передаючи як аргумент 10 (наприклад). Якщо в якийсь момент сервер витрачає додаткові 10 секунд на відповідь, ви знайшли адресу цієї функції.
Один Гаджет
Виконайте оболонку, просто перейшовши до однієї конкретної адреси у libc
:
Приклад коду x86 Ret2lib
У цьому прикладі ASLR brute-force інтегрований у код, а вразливий бінарний файл розташований на віддаленому сервері:
Приклад коду x64 Ret2lib
Перевірте приклад з:
Приклад ARM64 Ret2lib
У випадку ARM64, інструкція ret переходить туди, куди вказує реєстр x30, а не туди, куди вказує реєстр стеку. Тому це трохи складніше.
Також в ARM64 інструкція робить те, що робить інструкція (неможливо перейти посеред інструкцій і перетворити їх на нові).
Перевірте приклад з:
Ret-into-printf (або puts)
Це дозволяє витік інформації з процесу, викликаючи printf
/puts
з певними даними, розміщеними як аргумент. Наприклад, розміщення адреси puts
в GOT у виклику puts
дозволить витік адреси puts
в пам'яті.
Ret2printf
Це в основному означає зловживання 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')
(адреса купи потрібна для обходу перевірки).
Last updated