hacktricks/binary-exploitation/libc-heap/off-by-one-overflow.md

120 lines
12 KiB
Markdown
Raw Normal View History

# Υπερχείλιση ενός byte
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο Hacking του AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Μάθετε & εξασκηθείτε στο Hacking του GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Υποστηρίξτε το HackTricks</summary>
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Κοινοποιήστε κόλπα χάκερ υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
</details>
{% endhint %}
## Βασικές Πληροφορίες
Έχοντας μόνο πρόσβαση σε μια υπερχείλιση 1 byte επιτρέπει σε έναν εισβολέα να τροποποιήσει το πεδίο `size` από το επόμενο κομμάτι. Αυτό επιτρέπει να παραβιαστούν τα κομμάτια που πραγματικά ελευθερώνονται, πιθανώς δημιουργώντας ένα κομμάτι που περιέχει ένα άλλο νόμιμο κομμάτι. Η εκμετάλλευση είναι παρόμοια με το [διπλό free](double-free.md) ή την επικάλυψη κομματιών.
Υπάρχουν 2 τύποι ευπάθειας off by one:
* Αυθαίρετο byte: Αυτός ο τύπος επιτρέπει την αντικατάσταση αυτού του byte με οποιαδήποτε τιμή
* Μηδενικό byte (off-by-null): Αυτός ο τύπος επιτρέπει την αντικατάσταση αυτού του byte μόνο με 0x00
* Ένα κοινό παράδειγμα αυτής της ευπάθειας μπορεί να δει κανείς στον παρακάτω κώδικα όπου η συμπεριφορά των `strlen` και `strcpy` είναι ασυνεπής, η οποία επιτρέπει την τοποθέτηση ενός byte 0x00 στην αρχή του επόμενου κομματιού.
* Αυτό μπορεί να εκμεταλλευτεί με το [House of Einherjar](house-of-einherjar.md).
* Αν χρησιμοποιείτε Tcache, αυτό μπορεί να εκμεταλλευτεί σε μια κατάσταση [διπλού free](double-free.md).
```c
// From https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off_by_one/
int main(void)
{
char buffer[40]="";
void *chunk1;
chunk1 = malloc(24);
puts("Get Input");
gets(buffer);
if(strlen(buffer)==24)
{
strcpy(chunk1,buffer);
}
return 0;
}
```
</details>
Μεταξύ άλλων ελέγχων, τώρα κάθε φορά που ένα κομμάτι είναι ελεύθερο, συγκρίνεται το προηγούμενο μέγεθος με το μέγεθος που έχει ρυθμιστεί στα μεταδεδομένα του κομματιού, κάνοντας αυτήν την επίθεση αρκετά πολύπλοκη από την έκδοση 2.28.
### Παράδειγμα κώδικα:
* [https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c](https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c)
* Αυτή η επίθεση δεν λειτουργεί πλέον λόγω της χρήσης των Tcaches.
* Επιπλέον, αν προσπαθήσετε να το καταχραστείτε χρησιμοποιώντας μεγαλύτερα κομμάτια (έτσι ώστε να μην εμπλέκονται οι tcaches), θα λάβετε το σφάλμα: `malloc(): invalid next size (unsorted)`
### Στόχος
* Κάντε ένα κομμάτι να περιέχεται μέσα σε ένα άλλο κομμάτι, έτσι ώστε η εγγραφή πρόσβασης σε αυτό το δεύτερο κομμάτι να επιτρέπει τον αντικατάσταση του περιεχόμενου του πρώτου
### Απαιτήσεις
* Υπερχείλιση ενός byte για τροποποίηση των μεταδεδομένων μεγέθους
### Γενική επίθεση off-by-one
* Διατείνονται τρία κομμάτια `A`, `B` και `C` (π.χ. μεγέθη 0x20), και ένα άλλο για να αποτρέψει τη συγχώνευση με το κομμάτι κορυφής.
* Απελευθερώστε το `C` (εισαγμένο στη λίστα ελεύθερων Tcache 0x20).
* Χρησιμοποιήστε το κομμάτι `A` για υπερχείλιση στο `B`. Κατάχρηση του off-by-one για να τροποποιήσετε το πεδίο `size` του `B` από 0x21 σε 0x41.
* Τώρα έχουμε το `B` που περιέχει το ελεύθερο κομμάτι `C`
* Απελευθερώστε το `B` και εκχωρήστε ένα κομμάτι 0x40 (θα τοποθετηθεί εδώ ξανά)
* Μπορούμε να τροποποιήσουμε το δείκτη `fd` από το `C`, το οποίο είναι ακόμα ελεύθερο (δηλητηρίαση Tcache)
### Επίθεση off-by-null
* Κρατούνται 3 κομμάτια μνήμης (a, b, c) το ένα μετά το άλλο. Στη συνέχεια το μεσαίο απελευθερώνεται. Το πρώτο περιέχει μια ευπάθεια υπερχείλισης ενός byte και ο επιτιθέμενος την καταχρηστεύεται με ένα 0x00 (αν το προηγούμενο byte ήταν 0x10 θα κάνει το μεσαίο κομμάτι να υποδεικνύει ότι είναι 0x10 μικρότερο από ό,τι πραγματικά είναι).
* Στη συνέχεια, δεσμεύονται 2 μικρότερα κομμάτια στο μεσαίο ελεύθερο κομμάτι (b), ωστόσο, καθώς το `b + b->size` δεν ενημερώνει ποτέ το κομμάτι c επειδή η διευθυνση που δείχνεται είναι μικρότερη από ό,τι θα έπρεπε.
* Στη συνέχεια, απελευθερώνονται τα b1 και c. Καθώς το `c - c->prev_size` εξακολουθεί να δείχνει στο b (τώρα b1), και τα δύο συγχωνεύονται σε ένα κομμάτι. Ωστόσο, το b2 βρίσκεται ακόμα μέσα ανάμεσα στο b1 και το c.
* Τέλος, γίνεται μια νέα κλήση malloc ανακτώντας αυτήν την περιοχή μνήμης που πρόκειται να περιέχει το b2, επιτρέποντας στον κάτοχο της νέας κλήσης malloc να ελέγχει το περιεχόμενο του b2.
Αυτή η εικόνα εξηγεί τέλεια την επίθεση:
<figure><img src="../../.gitbook/assets/image (1247).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks">https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks</a></p></figcaption></figure>
## Άλλα Παραδείγματα & Αναφορές
* [**https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks**](https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks)
* [**Bon-nie-appetit. HTB Cyber Apocalypse CTF 2022**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/bon-nie-appetit/)
* Off-by-one λόγω της `strlen` που λαμβάνει υπόψη το πεδίο `size` του επόμενου κομματιού.
* Χρησιμοποιείται η Tcache, έτσι μια γενική επίθεση off-by-one λειτουργεί για να λάβει ένα αυθαίρετο γραπτό πρωτογενές με δηλητηρίαση Tcache.
* [**Asis CTF 2016 b00ks**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#1-asis-ctf-2016-b00ks)
* Είναι δυνατόν να καταχραστείτε ένα off by one για να διαρρεύσετε μια διεύθυνση από τη στοίβα επειδή το byte 0x00 στο τέλος ενός string αντικαθίσταται από το επόμενο πεδίο.
* Το αυθαίρετο γραπτό λαμβάνεται καταχρώμενοντας το off by one γράφοντας το δείκτη prev_size σε `0x4e0`.
* Σημειώστε πώς τα μεγέθη των αρχικά δεσμευμένων κομματιών1, 2, 5 και 3 συν τις κεφαλίδες των 4 αυτών των κομματιών ισούνται με `0x4e0`: `hex(0x1f8 + 0x10 + 0x68 + 0x10 + 0x50 + 0x10 + 0x200) = 0x4e0`
* Στη συνέχεια, απελευθερώνεται το κομμάτι 4, δημιουργώντας ένα κομμάτι που καταναλώνει όλα τα κομμάτια μέχρι την αρχή:
* ```python
[ 0x4e0 Κομμάτι 1-2-5-3 (ελεύθερο) ] [ 0xf0 Κομμάτι 4 (διεφθαρμένο) ] [ 0x400 Κομμάτι άμυνας ]
```
* ```python
[ 0x200 Κομμάτι 1 (ελεύθερο) ] [ 0x50 Κομμάτι 2 ] [ 0x68 Κομμάτι 5 (ελεύθερο) ] [ 0x1f8 Κομμάτι 3 (ελεύθερο) ] [ 0xf0 Κομμάτι 4 ] [ 0x400 Κομμάτι άμυνας ]
```
* Στη συνέχεια, δεσμεύονται `0x200` bytes γεμίζοντας το αρχικό κομμάτι 1
* Και δεσμεύονται άλλα 0x200 bytes και καταστρέφεται το κομμάτι2 και επομένως δεν υπάρχει διαρροή και αυτό δεν λειτουργεί; Ίσως αυτό δεν θα έπρεπε να γίνει
* Στη συνέχεια, δεσμεύεται ένα κομμάτι με 0x58 "a"s (αντικαθιστώντας το κομμάτι2 και φτάνοντας το κομμάτι5) και τροποποιείται ο δείκτης `fd` του γρήγορου κομματιού του κομματιού5 δείχνοντας στο `__malloc_hook`
* Στη συνέχεια, δεσμεύεται ένα κομμάτι 0x68 έτσι το ψεύτικο γρήγορο κομμάτι στο `__malloc_hook` είναι το επόμενο γρήγορο κομμάτι
* Τέλος, δεσμεύεται ένα νέο γρήγορο κομμάτι 0x68 και το `__malloc_hook` αντικαθίσταται με μια διεύθυνση `one_gadget`
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Μάθετε & εξασκηθείτε στο GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Υποστηρίξτε το HackTricks</summary>
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομά
* **Κοινοποιήστε κόλπα χάκερ κάνοντας υποβολή PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια στο GitHub.
</details>
{% endhint %}