macOS Keychain

Support HackTricks

Main Keychains

  • The User Keychain (~/Library/Keychains/login.keycahin-db), το οποίο χρησιμοποιείται για την αποθήκευση διαπιστευτηρίων συγκεκριμένων χρηστών όπως κωδικοί πρόσβασης εφαρμογών, κωδικοί πρόσβασης στο διαδίκτυο, πιστοποιητικά που δημιουργούνται από τον χρήστη, κωδικοί πρόσβασης δικτύου και δημόσια/ιδιωτικά κλειδιά που δημιουργούνται από τον χρήστη.

  • The System Keychain (/Library/Keychains/System.keychain), το οποίο αποθηκεύει διαπιστευτήρια σε επίπεδο συστήματος όπως κωδικοί πρόσβασης WiFi, πιστοποιητικά ρίζας συστήματος, ιδιωτικά κλειδιά συστήματος και κωδικοί πρόσβασης εφαρμογών συστήματος.

Password Keychain Access

Αυτά τα αρχεία, αν και δεν έχουν εγγενή προστασία και μπορούν να κατεβούν, είναι κρυπτογραφημένα και απαιτούν τον καθαρό κωδικό πρόσβασης του χρήστη για να αποκρυπτογραφηθούν. Ένα εργαλείο όπως το Chainbreaker θα μπορούσε να χρησιμοποιηθεί για την αποκρυπτογράφηση.

Keychain Entries Protections

ACLs

Κάθε καταχώρηση στο keychain διέπεται από Λίστες Ελέγχου Πρόσβασης (ACLs) που καθορίζουν ποιος μπορεί να εκτελεί διάφορες ενέργειες στην καταχώρηση του keychain, συμπεριλαμβανομένων:

  • ACLAuhtorizationExportClear: Επιτρέπει στον κάτοχο να αποκτήσει το καθαρό κείμενο του μυστικού.

  • ACLAuhtorizationExportWrapped: Επιτρέπει στον κάτοχο να αποκτήσει το καθαρό κείμενο κρυπτογραφημένο με έναν άλλο παρεχόμενο κωδικό πρόσβασης.

  • ACLAuhtorizationAny: Επιτρέπει στον κάτοχο να εκτελεί οποιαδήποτε ενέργεια.

Οι ACLs συνοδεύονται επίσης από μια λίστα αξιόπιστων εφαρμογών που μπορούν να εκτελούν αυτές τις ενέργειες χωρίς προτροπή. Αυτό θα μπορούσε να είναι:

  • Nil (δεν απαιτείται εξουσιοδότηση, όλοι είναι αξιόπιστοι)

  • Μια κενή λίστα (κανείς δεν είναι αξιόπιστος)

  • Λίστα συγκεκριμένων εφαρμογών.

Επίσης, η καταχώρηση μπορεί να περιέχει το κλειδί ACLAuthorizationPartitionID, το οποίο χρησιμοποιείται για να προσδιορίσει το teamid, apple, και cdhash.

  • Εάν το teamid καθορίζεται, τότε για να προσεγγιστεί η καταχώρηση αξίας χωρίς προτροπή, η χρησιμοποιούμενη εφαρμογή πρέπει να έχει το ίδιο teamid.

  • Εάν το apple καθορίζεται, τότε η εφαρμογή πρέπει να είναι υπογεγραμμένη από την Apple.

  • Εάν το cdhash υποδεικνύεται, τότε η εφαρμογή πρέπει να έχει το συγκεκριμένο cdhash.

Creating a Keychain Entry

Όταν μια νέα καταχώρηση δημιουργείται χρησιμοποιώντας το Keychain Access.app, ισχύουν οι εξής κανόνες:

  • Όλες οι εφαρμογές μπορούν να κρυπτογραφούν.

  • Καμία εφαρμογή δεν μπορεί να εξάγει/αποκρυπτογραφεί (χωρίς προτροπή του χρήστη).

  • Όλες οι εφαρμογές μπορούν να δουν τον έλεγχο ακεραιότητας.

  • Καμία εφαρμογή δεν μπορεί να αλλάξει τις ACLs.

  • Το partitionID ορίζεται σε apple.

Όταν μια εφαρμογή δημιουργεί μια καταχώρηση στο keychain, οι κανόνες είναι ελαφρώς διαφορετικοί:

  • Όλες οι εφαρμογές μπορούν να κρυπτογραφούν.

  • Μόνο η δημιουργούσα εφαρμογή (ή οποιαδήποτε άλλη εφαρμογή που έχει προστεθεί ρητά) μπορεί να εξάγει/αποκρυπτογραφεί (χωρίς προτροπή του χρήστη).

  • Όλες οι εφαρμογές μπορούν να δουν τον έλεγχο ακεραιότητας.

  • Καμία εφαρμογή δεν μπορεί να αλλάξει τις ACLs.

  • Το partitionID ορίζεται σε teamid:[teamID here].

Accessing the Keychain

security

# List keychains
security list-keychains

# Dump all metadata and decrypted secrets (a lot of pop-ups)
security dump-keychain -a -d

# Find generic password for the "Slack" account and print the secrets
security find-generic-password -a "Slack" -g

# Change the specified entrys PartitionID entry
security set-generic-password-parition-list -s "test service" -a "test acount" -S

# Dump specifically the user keychain
security dump-keychain ~/Library/Keychains/login.keychain-db

APIs

Η καταμέτρηση και εξαγωγή μυστικών από το keychain που δεν θα δημιουργήσει προτροπή μπορεί να γίνει με το εργαλείο LockSmith

Λίστα και λήψη πληροφοριών για κάθε καταχώρηση του keychain:

  • Η API SecItemCopyMatching δίνει πληροφορίες για κάθε καταχώρηση και υπάρχουν μερικά χαρακτηριστικά που μπορείτε να ορίσετε κατά τη χρήση της:

  • kSecReturnData: Αν είναι αληθές, θα προσπαθήσει να αποκρυπτογραφήσει τα δεδομένα (ορίστε σε ψευδές για να αποφύγετε πιθανές αναδυόμενες ειδοποιήσεις)

  • kSecReturnRef: Λάβετε επίσης αναφορά στο στοιχείο του keychain (ορίστε σε αληθές σε περίπτωση που αργότερα δείτε ότι μπορείτε να αποκρυπτογραφήσετε χωρίς αναδυόμενη ειδοποίηση)

  • kSecReturnAttributes: Λάβετε μεταδεδομένα σχετικά με τις καταχωρήσεις

  • kSecMatchLimit: Πόσα αποτελέσματα να επιστραφούν

  • kSecClass: Τι είδους καταχώρηση keychain

Λάβετε ACLs κάθε καταχώρησης:

  • Με την API SecAccessCopyACLList μπορείτε να λάβετε το ACL για το στοιχείο του keychain, και θα επιστρέψει μια λίστα ACLs (όπως ACLAuhtorizationExportClear και οι άλλες που αναφέρθηκαν προηγουμένως) όπου κάθε λίστα έχει:

  • Περιγραφή

  • Λίστα Εμπιστευμένων Εφαρμογών. Αυτό θα μπορούσε να είναι:

  • Μια εφαρμογή: /Applications/Slack.app

  • Ένα δυαδικό: /usr/libexec/airportd

  • Μια ομάδα: group://AirPort

Εξαγωγή των δεδομένων:

  • Η API SecKeychainItemCopyContent αποκτά το απλό κείμενο

  • Η API SecItemExport εξάγει τα κλειδιά και τα πιστοποιητικά αλλά μπορεί να χρειαστεί να ορίσετε κωδικούς πρόσβασης για να εξάγετε το περιεχόμενο κρυπτογραφημένο

Και αυτές είναι οι απαιτήσεις για να μπορείτε να εξάγετε ένα μυστικό χωρίς προτροπή:

  • Αν 1+ εμπιστευμένες εφαρμογές αναφέρονται:

  • Χρειάζεστε τις κατάλληλες εξουσιοδοτήσεις (Nil, ή να είστε μέρος της επιτρεπόμενης λίστας εφαρμογών στην εξουσιοδότηση για πρόσβαση στις μυστικές πληροφορίες)

  • Χρειάζεστε υπογραφή κώδικα που να ταιριάζει με PartitionID

  • Χρειάζεστε υπογραφή κώδικα που να ταιριάζει με αυτήν μιας εμπιστευμένης εφαρμογής (ή να είστε μέλος της σωστής ομάδας πρόσβασης Keychain)

  • Αν όλες οι εφαρμογές είναι εμπιστευτές:

  • Χρειάζεστε τις κατάλληλες εξουσιοδοτήσεις

  • Χρειάζεστε υπογραφή κώδικα που να ταιριάζει με PartitionID

  • Αν δεν υπάρχει PartitionID, τότε αυτό δεν είναι απαραίτητο

Επομένως, αν υπάρχει 1 εφαρμογή αναφερόμενη, πρέπει να εισάγετε κώδικα σε αυτήν την εφαρμογή.

Αν apple αναφέρεται στο partitionID, μπορείτε να έχετε πρόσβαση σε αυτό με osascript οπότε οτιδήποτε εμπιστεύεται όλες τις εφαρμογές με apple στο partitionID. Python θα μπορούσε επίσης να χρησιμοποιηθεί γι' αυτό.

Δύο επιπλέον χαρακτηριστικά

  • Αόρατο: Είναι μια λογική σημαία για να κρύψει την καταχώρηση από την εφαρμογή UI Keychain

  • Γενικό: Είναι για την αποθήκευση μεταδεδομένων (οπότε ΔΕΝ είναι ΚΡΥΠΤΟΓΡΑΦΗΜΕΝΟ)

  • Η Microsoft αποθήκευε σε απλό κείμενο όλους τους ανανεωτικούς κωδικούς πρόσβασης για πρόσβαση σε ευαίσθητους τερματικούς σταθμούς.

Αναφορές

Υποστήριξη HackTricks

Last updated