.. | ||
tools | ||
elf-tricks.md | ||
README.md |
Основна методологія експлуатації бінарних файлів
{% hint style="success" %}
Вивчайте та практикуйте хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks
Вивчайте та практикуйте хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами на Twitter 🐦 @hacktricks_live.
- Поширюйте хакерські трюки, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Основна інформація про ELF
Перш ніж почати експлуатувати що-небудь, корисно розуміти частину структури ELF-бінарного файлу:
{% content-ref url="elf-tricks.md" %} elf-tricks.md {% endcontent-ref %}
Інструменти експлуатації
{% content-ref url="tools/" %} tools {% endcontent-ref %}
Методологія переповнення стека
З такою кількістю технік корисно мати схему, коли кожна техніка буде корисною. Зверніть увагу, що одні й ті ж захисти впливатимуть на різні техніки. Ви можете знайти способи обійти захисти в кожному розділі захисту, але не в цій методології.
Керування потоком
Існують різні способи керування потоком програми:
- Переповнення стека перезаписуючи вказівник повернення зі стеку або EBP -> ESP -> EIP.
- Можливо, потрібно використовувати Переповнення цілочисельних значень, щоб викликати переповнення.
- Або через Довільні записи + Записати що де до виконання
- Рядки формату: Зловживання
printf
для запису довільного вмісту за довільними адресами. - Індексування масивів: Зловживання погано спроектованим індексуванням для можливості керування деякими масивами та отримання довільного запису.
- Можливо, потрібно використовувати Переповнення цілочисельних значень, щоб викликати переповнення
- bof до WWW через ROP: Зловживання переповненням буфера для побудови ROP та можливості отримати WWW.
Техніки Записати що де до виконання можна знайти в:
{% content-ref url="../arbitrary-write-2-exec/" %} arbitrary-write-2-exec {% endcontent-ref %}
Вічні петлі
Щось, на що варто звернути увагу, це те, що зазвичай лише одна експлуатація вразливості може бути недостатньою, щоб виконати успішну експлойтацію, особливо якщо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти зробити одну вразливість експлойтованою кілька разів в одному виконанні бінарного файлу:
- Записати в ланцюжок ROP адресу функції
main
або адресу, де відбувається вразливість. - Керуючи правильним ланцюжком ROP, ви можете виконати всі дії в цьому ланцюжку
- Записати адресу
exit
в GOT (або будь-яку іншу функцію, яку використовує бінарний файл перед завершенням) адресу, щоб повернутися назад до вразливості - Як пояснено в .fini_array, зберігайте тут 2 функції, одну для виклику вразливості знову та іншу для виклику
__libc_csu_fini
, яка знову викличе функцію з.fini_array
.
Цілі експлуатації
Мета: Виклик існуючої функції
- ret2win: Є функція в коді, яку потрібно викликати (можливо з певними параметрами) для отримання прапорця.
- У звичайному bof без PIE та canary, вам просто потрібно записати адресу у вказівник повернення, збережений у стеку.
- У bof з PIE, вам потрібно обійти його
- У bof з canary, вам потрібно обійти його
- Якщо вам потрібно встановити кілька параметрів для правильного виклику функції ret2win, ви можете використовувати:
- Ланцюжок ROP якщо є достатньо гаджетів для підготовки всіх параметрів
- SROP (у випадку, якщо ви можете викликати цей системний виклик) для керування багатьма регістрами
- Гаджети з ret2csu та ret2vdso для керування декількома регістрами
- Через Записати що де до виконання ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію
win
. - Перенаправлення вказівників: У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
- ASLR або PIE можуть вплинути на адреси.
- Неініціалізовані змінні: Ніколи не знаєш.
Мета: RCE
Через shellcode, якщо вимкнено nx або змішування shellcode з ROP:
- (Stack) Shellcode: Це корисно для зберігання shellcode у стеку перед або після перезапису вказівника повернення, а потім перейти до нього, щоб виконати його:
- У будь-якому випадку, якщо є canary, у звичайному 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
на адресу системи в GOT з адресою'/bin/sh'
в параметрі (вам потрібно це з'ясувати). - З ASLR але без PIE, знанням libc та без використання бінарного файлу функцією
system
: - Використовуйте
ret2dlresolve
для вирішення адресиsystem
та виклику її - Обійдіть ASLR та розрахуйте адресу
system
та'/bin/sh'
в пам'яті. - З ASLR та PIE і без знання версії libc: Вам потрібно:
- Обійти PIE
- Знайти використану версію libc (витік кількох адрес функцій)
- Перевірте попередні сценарії з ASLR, щоб продовжити.
Через EBP/RBP
- Stack Pivoting / EBP2Ret / EBP Chaining: Керування ESP для керування RET через збережений EBP в стеку.
- Корисно для off-by-one переповнень стеку
- Корисно як альтернативний спосіб закінчення керування EIP, використовуючи EIP для побудови навантаження в пам'яті, а потім переходу до нього через EBP
Різне
- Перенаправлення вказівників: У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
- ASLR або PIE можуть вплинути на адреси.
- Незініціалізовані змінні: Ніколи не знаєте