# Σπίτι του Orange
{% hint style="success" %}
Μάθε & εξάσκησε στο Hacking του AWS:[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Μάθε & εξάσκησε στο Hacking του GCP: [**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Υποστήριξε το HackTricks
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Συμμετέχετε** 💬 στην [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγράφου**](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.
{% endhint %}
## Βασικές Πληροφορίες
### Κώδικας
* Βρείτε ένα παράδειγμα στο [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)
* Η τεχνική εκμετάλλευσης διορθώθηκε σε αυτό το [patch](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0) οπότε δεν λειτουργεί πλέον (λειτουργεί σε παλαιότερες εκδόσεις από 2.26)
* Ίδιο παράδειγμα **με περισσότερα σχόλια** στο [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
### Στόχος
* Κατάχρηση της λειτουργίας `malloc_printerr`
### Απαιτήσεις
* Αντικατάσταση του μεγέθους του κορυφαίου τμήματος (top chunk)
* Διαρροή Libc και heap
### Υπόβαθρο
Κάποιες απαραίτητες πληροφορίες από τα σχόλια από [**αυτό το παράδειγμα**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)**:**
Το θέμα είναι ότι, σε παλαιότερες εκδόσεις της libc, όταν καλούνταν η λειτουργία `malloc_printerr`, θα **επαναλάμβανε μια λίστα από δομές `_IO_FILE` που αποθηκεύονταν στο `_IO_list_all`**, και πραγματικά **εκτελούσε** ένα δείκτη εντολών σε αυτή τη δομή.\
Αυτή η επίθεση θα δημιουργήσει μια **ψεύτικη δομή `_IO_FILE`** την οποία θα γράψουμε στο **`_IO_list_all`**, και θα προκαλέσει την εκτέλεση της `malloc_printerr`.\
Στη συνέχεια θα **εκτελέσει οποιαδήποτε διεύθυνση** έχουμε αποθηκευμένη στους **δείκτες άλματος των δομών `_IO_FILE`**, και θα λάβουμε εκτέλεση κώδικα
### Επίθεση
Η επίθεση ξεκινά από τον χειρισμό για να πάρει το **κορυφαίο τμήμα** μέσα στο **unsorted bin**. Αυτό επιτυγχάνεται καλώντας την `malloc` με ένα μέγεθος μεγαλύτερο από το τρέχον μέγεθος του κορυφαίου τμήματος αλλά μικρότερο από το **`mmp_.mmap_threshold`** (προεπιλεγμένο είναι το 128ΚΒ), το οποίο αλλιώς θα ενεργοποιούσε την εκχώρηση `mmap`. Κάθε φορά που το μέγεθος του κορυφαίου τμήματος τροποποιείται, είναι σημαντικό να εξασφαλιστεί ότι το **κορυφαίο τμήμα + το μέγεθός του** είναι σε σελίδα-ευθυγραμμισμένο και ότι το bit **prev\_inuse** του κορυφαίου τμήματος είναι πάντα ορισμένο.
Για να πάρετε το κορυφαίο τμήμα μέσα στο unsorted bin, εκχωρήστε ένα τμήμα για να δημιουργήσετε το κορυφαίο τμήμα, αλλάξτε το μέγεθος του κορυφαίου τμήματος (με ένα υπερχείλισμα στο εκχωρημένο τμήμα) έτσι ώστε το **κορυφαίο τμήμα + μέγεθος** να είναι σελίδα-ευθυγραμμισμένο με το bit **prev\_inuse** να είναι ορισμένο. Στη συνέχεια εκχωρήστε ένα τμήμα μεγαλύτερο από το νέο μέγεθος του κορυφαίου τμήματος. Σημειώστε ότι το `free` δεν καλείται ποτέ για να πάρει το κορυφαίο τμήμα στο unsorted bin.
Το παλιό κορυφαίο τμήμα είναι τώρα στο unsorted bin. Υποθέτοντας ότι μπορούμε να διαβάσουμε δεδομένα μέσα σε αυτό (πιθανώς λόγω μιας ευπαθότητας που προκάλεσε επίσης το υπερχείλισμα), είναι δυνατό να διαρρεύσουμε διευθύνσεις Libc από αυτό και να πάρουμε τη διεύθυνση του **\_IO\_list\_all**.
Μια επίθεση στο unsorted bin πραγματοποιείται καταχρώμενη το υπερχείλισμα για να γράψει `topChunk->bk->fwd = _IO_list_all - 0x10`. Όταν εκχωρηθεί ένα νέο τμήμα, το παλιό κορυφαίο τμήμα θα χωριστεί, και ένας δείκτης στο unsorted bin θα γραφτεί στο **`_IO_list_all`**.
Το επόμενο βήμα περιλαμβάνει τη συρρίκνωση του μεγέθους του παλιού κορυφαίου τμήματος για να χωρέσει σε ένα μικρό bin, συγκεκριμένα να ορίσει το μέγεθός του σε **0x61**. Αυτό εξυπηρετεί δύο σκοπούς:
1. **Εισαγωγή στο Small Bin 4**: Όταν το `malloc` σαρώνει το unsorted bin και βλέπει αυτό το τμήμα, θα προσπαθήσει να το εισάγει στο small bin 4 λόγω του μικρού μεγέθους του. Αυτό κάνει το τμήμα να καταλήξει στην κορυφή της λίστας small bin 4 που είναι η τοποθεσία του δείκτη FD του τμήματος του **`_IO_list_all`** καθώς γράψαμε μια κοντινή διεύθυνση στο **`_IO_list_all`** μέσω της επίθεσης στο unsorted bin.
2. **Ενεργοποίηση ελέγχου Malloc**: Αυτή η διαμόρφωση μεγέθους τμήματος θα προκαλέσει το `malloc` να πραγματοποιήσει εσωτερικούς ελέγχους. Όταν ελέγχει το μέγεθος του Ϩεύθυνσης του ψευδο-εμπρός τμήματος, το οποίο θα είναι μηδέν, προκαλεί ένα σφάλμα και καλεί την `malloc_printerr`.
Η διαχείριση του μικρού bin θα σας επιτρέψει να ελέγξετε τον μπροστινό δείκτη του τμήματος. Η επικάλυψη με το **\_IO\_list\_all** χρησιμοποιείται για να δημιουργήσετε μια ψεύτικη δομή **\_IO\_FILE**. Η δομή διαμορφώνεται προσεκτικά για να περιλαμβάνει βασικά πεδία όπως `_IO_write_base` και `_IO_write_ptr` που ορίζονται σε τιμές που περνούν εσωτερικούς ελέγχους στην libc. Επιπλέον, δημιουργείται ένας πίνακας άλματος μέσα στη ψεύτικη δομή, όπου ένας δείκτης εντολών ορίζεται στη διεύθυνση όπου μπορεί να εκτελεστεί αυθαίρετος κώδικας (π.χ., η λειτουργία `system`).
Για να περιληφθεί το υπόλοιπο μέρος της τεχνικής:
* **Συρρίκνωση του Παλιού Κορυφαίου Τμή
## Αναφορές
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο Hacking του AWS:[**Εκπαίδευση HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Μάθετε & εξασκηθείτε στο Hacking του GCP: [**Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Υποστηρίξτε το HackTricks
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε** 💬 [**στην ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε κόλπα hacking υποβάλλοντας PRs** στα αποθετήρια [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
{% endhint %}