Основна методологія експлуатації бінарних файлів
Reading time: 7 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основна інформація про ELF
Перед початком експлуатації чогось цікаво зрозуміти частину структури ELF бінарного файлу:
Інструменти для експлуатації
Методологія переповнення стеку
З такою кількістю технік добре мати схему, коли кожна техніка буде корисною. Зверніть увагу, що ті ж самі захисти вплинуть на різні техніки. Ви можете знайти способи обійти захисти в кожному розділі захисту, але не в цій методології.
Контроль потоку
Існує кілька способів, як ви можете контролювати потік програми:
- Переповнення стеку, переписуючи вказівник повернення зі стеку або EBP -> ESP -> EIP.
- Можливо, потрібно зловживати переповненням цілого числа, щоб викликати переповнення.
- Або через Довільні записи + Записати що де виконання.
- Форматні рядки: Зловживати
printf
, щоб записати довільний вміст у довільні адреси. - Індексація масивів: Зловживати погано спроектованою індексацією, щоб мати можливість контролювати деякі масиви та отримати довільний запис.
- Можливо, потрібно зловживати переповненням цілого числа, щоб викликати переповнення.
- bof до WWW через ROP: Зловживати переповненням буфера, щоб побудувати ROP і мати можливість отримати WWW.
Ви можете знайти техніки Записати що де виконання в:
Вічні цикли
Що слід врахувати, так це те, що зазвичай лише одне використання вразливості може бути недостатнім для виконання успішної експлуатації, особливо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти, щоб зробити одну вразливість експлуатованою кілька разів в одному виконанні бінарного файлу:
- Записати в ROP ланцюг адресу
main
функції або адресу, де відбувається вразливість. - Контролюючи правильний ROP ланцюг, ви можете виконати всі дії в цьому ланцюгу.
- Записати в адресу виходу в GOT (або будь-яку іншу функцію, що використовується бінарним файлом перед завершенням) адресу, щоб повернутися до вразливості.
- Як пояснено в .fini_array, зберігайте тут 2 функції, одну для повторного виклику вразливості та іншу для виклику
__libc_csu_fini
, яка знову викликатиме функцію з.fini_array
.
Цілі експлуатації
Мета: Виклик існуючої функції
- ret2win: Існує функція в коді, яку потрібно викликати (можливо, з деякими специфічними параметрами), щоб отримати прапор.
- У звичайному bof без PIE та канарки вам просто потрібно записати адресу у вказівник повернення, збережений у стеку.
- У bof з PIE вам потрібно буде обійти його.
- У bof з канаркою вам потрібно буде обійти її.
- Якщо вам потрібно встановити кілька параметрів для правильного виклику функції ret2win, ви можете використовувати:
- Ланцюг ROP, якщо є достатньо гаджетів, щоб підготувати всі параметри.
- SROP (якщо ви можете викликати цей системний виклик), щоб контролювати багато регістрів.
- Гаджети з ret2csu та ret2vdso для контролю кількох регістрів.
- Через Записати що де ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію
win
. - Перенаправлення вказівників: У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу.
- ASLR або PIE можуть вплинути на адреси.
- Невизначені змінні: Ви ніколи не знаєте.
Мета: RCE
Через shellcode, якщо nx вимкнено або змішуючи shellcode з ROP:
- (Стек) Shellcode: Це корисно для зберігання shellcode у стеку до або після переписування вказівника повернення, а потім перейти до нього, щоб виконати його:
- У будь-якому випадку, якщо є канарка, у звичайному bof вам потрібно буде обійти (викрити) її.
- Без ASLR та nx можливо перейти до адреси стеку, оскільки вона ніколи не зміниться.
- З ASLR вам потрібно буде використовувати такі техніки, як ret2esp/ret2reg, щоб перейти до неї.
- З nx вам потрібно буде використовувати деякі ROP для виклику
memprotect
і зробити деяку сторінкуrwx
, щоб потім зберегти shellcode там (викликавши read, наприклад) і потім перейти туди. - Це змішає shellcode з ROP ланцюгом.
Через системні виклики
- Ret2syscall: Корисно для виклику
execve
, щоб виконати довільні команди. Вам потрібно буде знайти гаджети для виклику конкретного системного виклику з параметрами. - Якщо ASLR або PIE увімкнені, вам потрібно буде їх обійти для використання ROP гаджетів з бінарного файлу або бібліотек.
- SROP може бути корисним для підготовки ret2execve.
- Гаджети з ret2csu та ret2vdso для контролю кількох регістрів.
Через libc
- Ret2lib: Корисно для виклику функції з бібліотеки (зазвичай з
libc
), такої якsystem
з деякими підготовленими аргументами (наприклад,'/bin/sh'
). Вам потрібно, щоб бінарний файл завантажив бібліотеку з функцією, яку ви хочете викликати (зазвичай libc). - Якщо статично скомпільовано і без PIE, адреси
system
і/bin/sh
не зміняться, тому їх можна використовувати статично. - Без ASLR і знаючи версію libc, адреси
system
і/bin/sh
не зміняться, тому їх можна використовувати статично. - З ASLR але без PIE, знаючи libc і з бінарним файлом, що використовує функцію
system
, можливоret
до адреси system в GOT з адресою'/bin/sh'
в параметрі (вам потрібно буде це з'ясувати). - З ASLR але без PIE, знаючи libc і без бінарного файлу, що використовує
system
: - Використовуйте
ret2dlresolve
, щоб вирішити адресуsystem
і викликати її. - Обійти ASLR і обчислити адреси
system
і'/bin/sh'
в пам'яті. - З ASLR і PIE і не знаючи libc: Вам потрібно:
- Обійти PIE.
- Знайти версію
libc
, що використовується (викрити кілька адрес функцій). - Перевірити попередні сценарії з ASLR, щоб продовжити.
Через EBP/RBP
- Поворот стеку / EBP2Ret / Ланцюг EBP: Контролюйте ESP, щоб контролювати RET через збережений EBP у стеку.
- Корисно для off-by-one переповнень стеку.
- Корисно як альтернативний спосіб контролювати EIP, зловживаючи EIP для побудови корисного навантаження в пам'яті, а потім переходячи до нього через EBP.
Різне
- Перенаправлення вказівників: У разі, якщо стек містить вказівники на функцію, яка буде викликана, або на рядок, який буде використаний цікавою функцією (system або printf), можливо, переписати цю адресу.
- ASLR або PIE можуть вплинути на адреси.
- Невизначені змінні: Ви ніколи не знаєте.
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.