House of Roman
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Це була дуже цікава техніка, яка дозволяла отримати RCE без leak через фальшиві fastbins, атаку unsorted_bin та відносні перезаписи. Однак вона була виправлена.
You can find an example in https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
RCE by abusing relative pointers
Edit fastbin and unsorted bin pointers
12 bits of randomness must be brute forced (0.02% chance) of working
Створіть кілька чанків:
fastbin_victim
(0x60, offset 0): UAF chunk, який пізніше редагується, щоб вказати на значення LibC.
chunk2
(0x80, offset 0x70): Для хорошого вирівнювання
main_arena_use
(0x80, offset 0x100)
relative_offset_heap
(0x60, offset 0x190): відносний зсув на чанку 'main_arena_use'
Потім free(main_arena_use)
, що помістить цей чанк у неупорядкований список і отримає вказівник на main_arena + 0x68
в обох вказівниках fd
та bk
.
Тепер виділяється новий чанк fake_libc_chunk(0x60)
, оскільки він міститиме вказівники на main_arena + 0x68
в fd
та bk
.
Потім relative_offset_heap
та fastbin_victim
звільняються.
fastbin_victim
має fd
, що вказує на relative_offset_heap
relative_offset_heap
є зсувом відстані від fake_libc_chunk
, який містить вказівник на main_arena + 0x68
Просто змінивши останній байт fastbin_victim.fd
, можна змусити fastbin_victim
вказувати на main_arena + 0x68
Для попередніх дій атакуючий повинен мати можливість змінювати вказівник fd fastbin_victim
.
Тоді main_arena + 0x68
не є таким цікавим, тому давайте змінимо його так, щоб вказівник вказував на __malloc_hook
.
Зверніть увагу, що __memalign_hook
зазвичай починається з 0x7f
і нулів перед ним, тому його можна підробити як значення в швидкому біні 0x70
. Оскільки останні 4 біти адреси є випадковими, існує 2^4=16
можливостей для значення, щоб вказувати на те, що нас цікавить. Тому тут виконується атака BF, щоб шматок закінчився як: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)
.
(Для отримання додаткової інформації про решту байтів перегляньте пояснення в how2heap приклад). Якщо BF не спрацює, програма просто зламається (тому починайте знову, поки не спрацює).
Потім виконуються 2 malloc, щоб видалити 2 початкові швидкі бін-частини, а третя виділяється, щоб отримати шматок у __malloc_hook:
Для отримання додаткової інформації ви можете перевірити:
Unsorted Bin AttackАле в основному це дозволяє записати main_arena + 0x68
в будь-яке місце, вказане в chunk->bk
. І для атаки ми вибираємо __malloc_hook
. Потім, після перезапису, ми використаємо відносний перезапис, щоб вказати на one_gadget
.
Для цього ми починаємо отримувати chunk і поміщаємо його в unsorted bin:
Використовуйте UAF в цьому чанку, щоб вказати unsorted_bin_ptr->bk
на адресу __malloc_hook
(ми раніше це брутфорсили).
Зверніть увагу, що ця атака пошкоджує несортований бін (отже, маленький і великий також). Тому ми можемо використовувати алокації тільки з швидкого біна зараз (більш складна програма може виконати інші алокації і зламатися), і щоб це викликати, ми повинні алокувати той же розмір, інакше програма зламається.
Отже, щоб викликати запис main_arena + 0x68
в __malloc_hook
, ми виконуємо після встановлення __malloc_hook
в unsorted_bin_ptr->bk
, нам просто потрібно зробити: malloc(0x80)
На першому кроці ми закінчили контроль над чанком, що містить __malloc_hook
(в змінній malloc_hook_chunk
), а на другому кроці нам вдалося записати main_arena + 0x68
сюди.
Тепер ми зловживаємо частковим перезаписом в malloc_hook_chunk
, щоб використати адресу libc, яку ми записали там (main_arena + 0x68
), щоб вказати адресу one_gadget
.
Тут потрібно брутфорсити 12 біт випадковості (більше інформації в how2heap приклад).
Нарешті, коли правильна адреса перезаписана, викликайте malloc
і викликайте one_gadget
.
Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)