ASLR
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Address Space Layout Randomization (ASLR) - це техніка безпеки, що використовується в операційних системах для випадкового розміщення адрес пам'яті, які використовуються системними та прикладними процесами. Це ускладнює зловмиснику передбачити місцезнаходження конкретних процесів і даних, таких як стек, купа та бібліотеки, що зменшує ризик певних типів експлойтів, зокрема переповнень буфера.
Щоб перевірити статус ASLR на системі Linux, ви можете прочитати значення з файлу /proc/sys/kernel/randomize_va_space
. Значення, збережене в цьому файлі, визначає тип ASLR, що застосовується:
0: Немає випадкового розміщення. Все статичне.
1: Консервативне випадкове розміщення. Спільні бібліотеки, стек, mmap(), сторінка VDSO випадкові.
2: Повне випадкове розміщення. На додаток до елементів, випадкових за допомогою консервативного випадкового розміщення, пам'ять, керована через brk()
, також випадкова.
Ви можете перевірити статус ASLR за допомогою наступної команди:
Щоб вимкнути ASLR, потрібно встановити значення /proc/sys/kernel/randomize_va_space
на 0. Вимкнення ASLR зазвичай не рекомендується поза сценаріями тестування або налагодження. Ось як ви можете його вимкнути:
Ви також можете вимкнути ASLR для виконання за допомогою:
Щоб увімкнути ASLR, ви можете записати значення 2 у файл /proc/sys/kernel/randomize_va_space
. Це зазвичай вимагає прав root. Увімкнення повної рандомізації можна зробити за допомогою наступної команди:
Зміни, внесені за допомогою команд echo
, є тимчасовими і будуть скинуті після перезавантаження. Щоб зробити зміни постійними, потрібно відредагувати файл /etc/sysctl.conf
і додати або змінити наступний рядок:
Після редагування /etc/sysctl.conf
, застосуйте зміни за допомогою:
Це забезпечить збереження ваших налаштувань ASLR після перезавантаження.
PaX ділить адресний простір процесу на 3 групи:
Код і дані (ініціалізовані та неініціалізовані): .text
, .data
та .bss
—> 16 біт ентропії в змінній delta_exec
. Ця змінна випадковим чином ініціалізується з кожним процесом і додається до початкових адрес.
Пам'ять, виділена за допомогою mmap()
, та спільні бібліотеки —> 16 біт, названі delta_mmap
.
Стек —> 24 біти, що називається delta_stack
. Однак, фактично використовується 11 біт (з 10-го до 20-го байта включно), вирівняних на 16 байт —> Це призводить до 524,288 можливих реальних адрес стеку.
Попередні дані стосуються 32-бітних систем, а зменшена фінальна ентропія дозволяє обійти ASLR, повторюючи виконання знову і знову, поки експлойт не завершиться успішно.
Якщо у вас є достатньо великий переповнення, щоб вмістити великий NOP sled перед shellcode, ви можете просто брутфорсити адреси в стеку, поки потік не стрибне через якусь частину NOP sled.
Інша опція для цього, якщо переповнення не таке велике, а експлойт можна запустити локально, — це додати NOP sled і shellcode в змінну середовища.
Якщо експлойт локальний, ви можете спробувати брутфорсити базову адресу libc (корисно для 32-бітних систем):
Якщо ви атакуєте віддалений сервер, ви можете спробувати брутфорсити адресу функції libc
usleep
, передаючи в якості аргументу 10 (наприклад). Якщо в якийсь момент сервер відповідає на 10 секунд довше, ви знайшли адресу цієї функції.
В 64-бітних системах ентропія значно вища, і це не повинно бути можливим.
Можливо зайняти велику частину стеку змінними середовища, а потім спробувати зловживати бінарником сотні/тисячі разів локально, щоб його експлуатувати. Наступний код показує, як можливо просто вибрати адресу в стеку і кожні кілька сотень виконань ця адреса буде містити інструкцію NOP:
/proc/[pid]/stat
)Файл /proc/[pid]/stat
процесу завжди доступний для читання всім і містить цікаву інформацію, таку як:
startcode & endcode: Адреси вище і нижче з TEXT бінарного файлу
startstack: Адреса початку стеку
start_data & end_data: Адреси вище і нижче, де знаходиться BSS
kstkesp & kstkeip: Поточні адреси ESP та EIP
arg_start & arg_end: Адреси вище і нижче, де знаходяться cli аргументи.
env_start &env_end: Адреси вище і нижче, де знаходяться змінні середовища.
Отже, якщо атакуючий знаходиться на тому ж комп'ютері, що й бінарний файл, який експлуатується, і цей бінарний файл не очікує переповнення з сирих аргументів, а з іншого входу, який можна створити після читання цього файлу. Атакуючий може отримати деякі адреси з цього файлу і побудувати з них офсети для експлуатації.
Для отримання додаткової інформації про цей файл перегляньте https://man7.org/linux/man-pages/man5/proc.5.html, шукаючи /proc/pid/stat
Виклик полягає в отриманні leak
Якщо вам надано leak (легкі CTF завдання), ви можете розрахувати офсети з нього (припускаючи, наприклад, що ви знаєте точну версію libc, яка використовується в системі, яку ви експлуатуєте). Цей приклад експлуатації витягнуто з прикладу звідси (перегляньте цю сторінку для отримання додаткових деталей):
ret2plt
Зловживаючи переповненням буфера, можна експлуатувати ret2plt для ексфільтрації адреси функції з libc. Перевірте:
Ret2pltFormat Strings Arbitrary Read
Так само, як у ret2plt, якщо у вас є довільне читання через вразливість форматних рядків, можливо ексфільтрувати адресу функції libc з GOT. Наступний приклад звідси:
Ви можете знайти більше інформації про Format Strings arbitrary read у:
Format StringsСпробуйте обійти ASLR, зловживаючи адресами всередині стеку:
Ret2ret & Reo2popМеханізм vsyscall
служить для підвищення продуктивності, дозволяючи виконувати певні системні виклики в просторі користувача, хоча вони є фундаментальною частиною ядра. Критична перевага vsyscalls полягає в їх фіксованих адресах, які не підлягають ASLR (випадковій розкладці адресного простору). Ця фіксована природа означає, що зловмисники не потребують вразливості витоку інформації, щоб визначити свої адреси та використовувати їх у експлойті.
Однак тут не буде знайдено супер цікавих гаджетів (хоча, наприклад, можливо отримати еквівалент ret;
)
(Наступний приклад і код є з цього опису)
Наприклад, зловмисник може використовувати адресу 0xffffffffff600800
в експлойті. Хоча спроба стрибнути безпосередньо до інструкції ret
може призвести до нестабільності або збоїв після виконання кількох гаджетів, стрибок на початок syscall
, наданого секцією vsyscall, може виявитися успішним. Обережно розміщуючи гаджет ROP, який веде виконання до цієї адреси vsyscall, зловмисник може досягти виконання коду без необхідності обходити ASLR для цієї частини експлойту.
Зверніть увагу, як може бути можливим обійти ASLR, зловживаючи vdso, якщо ядро скомпільоване з CONFIG_COMPAT_VDSO, оскільки адреса vdso не буде випадковою. Для отримання додаткової інформації перегляньте:
Ret2vDSOLearn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)