macOS FS Tricks
Συνδυασμοί δικαιωμάτων POSIX
Δικαιώματα σε ένα κατάλογο:
ανάγνωση - μπορείτε να απαριθμήσετε τα στοιχεία του καταλόγου
εγγραφή - μπορείτε να διαγράψετε/γράψετε αρχεία στον κατάλογο και μπορείτε να διαγράψετε κενούς φακέλους.
Αλλά δεν μπορείτε να διαγράψετε/τροποποιήσετε μη-κενούς φακέλους εκτός αν έχετε δικαιώματα εγγραφής πάνω σε αυτόν.
Δεν μπορείτε να τροποποιήσετε το όνομα ενός φακέλου εκτός αν το κατέχετε.
εκτέλεση - σας επιτρέπεται να διασχίσετε τον κατάλογο - αν δεν έχετε αυτό το δικαίωμα, δεν μπορείτε να έχετε πρόσβαση σε κανένα αρχείο μέσα σε αυτόν, ή σε οποιουσδήποτε υποκαταλόγους.
Επικίνδυνοι Συνδυασμοί
Πώς να αντικαταστήσετε ένα αρχείο/φάκελο που ανήκει στο ριζικό χρήστη, αλλά:
Ένας γονικός κατόχος καταλόγου στη διαδρομή είναι ο χρήστης
Ένας γονικός κατόχος καταλόγου στη διαδρομή είναι μια ομάδα χρηστών με πρόσβαση εγγραφής
Μια ομάδα χρηστών έχει πρόσβαση εγγραφής στο αρχείο
Με οποιονδήποτε από τους προηγούμενους συνδυασμούς, ένας επιτιθέμενος θα μπορούσε να ενθερμήσει ένα σύμβολο/σκληρό σύνδεσμο στην αναμενόμενη διαδρομή για να αποκτήσει προνομιούχα αυθαίρετη εγγραφή.
Ειδική περίπτωση ρίζας φακέλου R+X
Αν υπάρχουν αρχεία σε έναν κατάλογο όπου μόνο η ρίζα έχει πρόσβαση R+X, αυτά δεν είναι προσβάσιμα από κανέναν άλλο. Έτσι μια ευπάθεια που επιτρέπει τη μετακίνηση ενός αρχείου που μπορεί να διαβαστεί από έναν χρήστη, το οποίο δεν μπορεί να διαβαστεί λόγω αυτού του περιορισμού, από αυτόν τον φάκελο σε έναν διαφορετικό, θα μπορούσε να καταχραστείται για να διαβάσει αυτά τα αρχεία.
Παράδειγμα στο: https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions
Συμβολικός Σύνδεσμος / Σκληρός Σύνδεσμος
Αν ένα προνομιούχο διεργασία γράφει δεδομένα σε ένα αρχείο που θα μπορούσε να ελεγχθεί από έναν χρήστη με χαμηλότερα προνόμια, ή που θα μπορούσε να έχει δημιουργηθεί προηγουμένως από έναν χρήστη με χαμηλότερα προνόμια. Ο χρήστης θα μπορούσε απλά να το κατευθύνει σε ένα άλλο αρχείο μέσω ενός Συμβολικού ή Σκληρού συνδέσμου, και η προνομιούχα διεργασία θα γράψει σε αυτό το αρχείο.
Ελέγξτε στις άλλες ενότητες όπου ένας επιτιθέμενος θα μπορούσε να καταχραστεί μια αυθαίρετη εγγραφή για να αναβαθμίσει τα προνόμιά του.
.fileloc
Τα αρχεία με την επέκταση .fileloc
μπορούν να δείχνουν σε άλλες εφαρμογές ή δυαδικά αρχεία, έτσι όταν ανοίγονται, η εφαρμογή/δυαδικό θα εκτελεστεί.
Παράδειγμα:
Τυχαίο FD
Εάν μπορείτε να κάνετε ένα process να ανοίξει ένα αρχείο ή έναν φάκελο με υψηλά προνόμια, μπορείτε να καταχραστείτε το crontab
για να ανοίξετε ένα αρχείο στο /etc/sudoers.d
με EDITOR=exploit.py
, έτσι το exploit.py
θα λάβει το FD στο αρχείο μέσα στο /etc/sudoers
και θα το καταχραστεί.
Για παράδειγμα: https://youtu.be/f1HA5QhLQ7Y?t=21098
Αποφύγετε τα κόλπα xattrs της καραντίνας
Αφαιρέστε τα
uchg / uchange / uimmutable flag
Εάν ένα αρχείο/φάκελος έχει αυτήν τη μόνιμη ιδιότητα, δεν θα είναι δυνατή η τοποθέτηση ενός xattr σε αυτό.
Προσάρτηση defvfs
Μια προσάρτηση devfs δεν υποστηρίζει xattr, περισσότερες πληροφορίες στο CVE-2023-32364
writeextattr ACL
Αυτό το ACL εμποδίζει την προσθήκη xattrs
στο αρχείο
com.apple.acl.text xattr + AppleDouble
Η μορφή αρχείου AppleDouble αντιγράφει ένα αρχείο συμπεριλαμβανομένων των ACEs του.
Στον πηγαίο κώδικα είναι δυνατόν να δούμε ότι η αναπαράσταση κειμένου ACL που αποθηκεύεται μέσα στο xattr με το όνομα com.apple.acl.text
θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπιέσετε μια εφαρμογή σε ένα αρχείο zip με τη μορφή αρχείου AppleDouble με ένα ACL που εμποδίζει άλλα xattrs να γραφτούν σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
Ελέγξτε την πρωτότυπη αναφορά για περισσότερες πληροφορίες.
Για να αναπαράγουμε αυτό πρέπει πρώτα να αποκτήσουμε το σωστό αλφαριθμητικό acl:
(Note that even if this works the sandbox write the quarantine xattr before)
Δεν είναι πραγματικά απαραίτητο, αλλά το αφήνω εκεί απλώς για περίπτωση:
pagemacOS xattr-acls extra stuffΠαράκαμψη Υπογραφών Κώδικα
Τα Bundles περιέχουν το αρχείο _CodeSignature/CodeResources
το οποίο περιέχει το hash κάθε αρχείου στο bundle. Σημειώστε ότι το hash του CodeResources είναι επίσης ενσωματωμένο στο εκτελέσιμο, οπότε δεν μπορούμε να το αλλάξουμε.
Ωστόσο, υπάρχουν μερικά αρχεία των οποίων η υπογραφή δεν θα ελεγχθεί, αυτά έχουν το κλειδί omit στο plist, όπως:
Είναι δυνατόν να υπολογιστεί η υπογραφή ενός πόρου από το cli με:
Τοποθέτηση dmgs
Ένας χρήστης μπορεί να τοποθετήσει ένα προσαρμοσμένο dmg ακόμα και πάνω σε ορισμένους υπάρχοντες φακέλους. Έτσι μπορείτε να δημιουργήσετε ένα προσαρμοσμένο πακέτο dmg με προσαρμοσμένο περιεχόμενο:
Συνήθως το macOS προσαρτά το δίσκο μιλώντας στην υπηρεσία Mach com.apple.DiskArbitrarion.diskarbitrariond
(που παρέχεται από το /usr/libexec/diskarbitrationd
). Εάν προστεθεί η παράμετρος -d
στο αρχείο LaunchDaemons plist και επανεκκινηθεί, θα αποθηκεύσει καταγραφές στο /var/log/diskarbitrationd.log
.
Ωστόσο, είναι δυνατόν να χρησιμοποιηθούν εργαλεία όπως το hdik
και το hdiutil
για να επικοινωνήσουν απευθείας με το com.apple.driver.DiskImages
kext.
Αυθαίρετες Εγγραφές
Περιοδικά scripts sh
Εάν το script σας μπορεί να ερμηνευτεί ως ένα shell script μπορείτε να αντικαταστήσετε το /etc/periodic/daily/999.local
shell script που θα εκτελείται κάθε μέρα.
Μπορείτε να προσομοιώσετε την εκτέλεση αυτού του script με: sudo periodic daily
Daemons
Γράψτε ένα αυθαίρετο LaunchDaemon όπως το /Library/LaunchDaemons/xyz.hacktricks.privesc.plist
με ένα plist που εκτελεί ένα αυθαίρετο script όπως:
Αρχείο Sudoers
Αν έχετε αυθαίρετη εγγραφή, μπορείτε να δημιουργήσετε ένα αρχείο μέσα στον φάκελο /etc/sudoers.d/
που να σας παρέχει δικαιώματα sudo.
Αρχεία PATH
Το αρχείο /etc/paths
είναι ένα από τα κύρια μέρη που γεμίζουν τη μεταβλητή περιβάλλοντος PATH. Πρέπει να είστε root για να το αντικαταστήσετε, αλλά αν ένα σενάριο από προνομιούχο διεργασία εκτελεί κάποια εντολή χωρίς την πλήρη διαδρομή, μπορείτε να το αρπάξετε τροποποιώντας αυτό το αρχείο.
Μπορείτε επίσης να γράψετε αρχεία στο /etc/paths.d
για να φορτώσετε νέους φακέλους στη μεταβλητή περιβάλλοντος PATH
.
Δημιουργία εγγράψιμων αρχείων ως άλλοι χρήστες
Αυτό θα δημιουργήσει ένα αρχείο που ανήκει στο ροοτ και είναι εγγράψιμο από εμένα (κώδικας από εδώ). Αυτό ενδέχεται επίσης να λειτουργήσει ως προνομιακή αύξηση:
POSIX Shared Memory
Το POSIX shared memory επιτρέπει σε διεργασίες σε λειτουργικά συστήματα συμβατά με το POSIX να έχουν πρόσβαση σε μια κοινή περιοχή μνήμης, διευκολύνοντας την ταχύτερη επικοινωνία σε σύγκριση με άλλες μεθόδους επικοινωνίας μεταξύ διεργασιών. Περιλαμβάνει τη δημιουργία ή το άνοιγμα ενός κοινού αντικειμένου μνήμης με τη χρήση της shm_open()
, την ορισμό του μεγέθους του με τη χρήση της ftruncate()
, και την αντιστοίχισή του στο χώρο διευθύνσεων της διεργασίας χρησιμοποιώντας την mmap()
. Οι διεργασίες μπορούν στη συνέχεια να διαβάζουν και να γράφουν απευθείας σε αυτήν την περιοχή μνήμης. Για τη διαχείριση της ταυτόχρονης πρόσβασης και την πρόληψη διαφθοράς δεδομένων, συχνά χρησιμοποιούνται μηχανισμοί συγχρονισμού όπως mutexes ή semaphores. Τέλος, οι διεργασίες αποσυντονίζουν και κλείνουν την κοινή μνήμη με τη χρήση των munmap()
και close()
, και προαιρετικά αφαιρούν το αντικείμενο μνήμης με τη χρήση της shm_unlink()
. Αυτό το σύστημα είναι ιδιαίτερα αποτελεσματικό για αποτελεσματική, γρήγορη IPC σε περιβάλλοντα όπου πολλές διεργασίες χρειάζεται να έχουν πρόσβαση σε κοινά δεδομένα με ταχύτητα.
macOS Προστατευμένοι Δείκτες
Οι προστατευμένοι δείκτες του macOS είναι μια λειτουργία ασφαλείας που εισήχθη στο macOS για να βελτιώσει την ασφάλεια και την αξιοπιστία των λειτουργιών των αποκλειστικών δεικτών αρχείων σε εφαρμογές χρήστη. Αυτοί οι προστατευμένοι δείκτες παρέχουν έναν τρόπο σύνδεσης συγκεκριμένων περιορισμών ή "φρουρών" με τους δείκτες αρχείων, οι οποίοι επιβάλλονται από τον πυρήνα.
Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για την πρόληψη ορισμένων κατηγοριών ευπαθειών ασφάλειας όπως η μη εξουσιοδοτημένη πρόσβαση σε αρχεία ή οι συνθήκες ανταγωνισμού. Αυτές οι ευπαθείς σημεία εμφανίζονται όταν, για παράδειγμα, ένα νήμα έχει πρόσβαση σε μια περιγραφή αρχείου δίνοντας σε ένα άλλο ευάλωτο νήμα πρόσβαση πάνω σε αυτό ή όταν ένας δείκτης αρχείου κληρονομείται από ένα ευάλωτο παιδικό διεργασία. Κάποιες λειτουργίες που σχετίζονται με αυτήν τη λειτουργικότητα είναι:
guarded_open_np
: Άνοιγμα ενός FD με φρουρόguarded_close_np
: Κλείσιμοchange_fdguard_np
: Αλλαγή σημαιών φρουράς σε έναν δείκτη (ακόμα και αφαίρεση της προστασίας του φρουρού)
Αναφορές
Last updated