mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
133 lines
7.8 KiB
Markdown
133 lines
7.8 KiB
Markdown
# macOS Keychain
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Haupt-Keychains
|
|
|
|
- Der **Benutzer-Keychain** (`~/Library/Keychains/login.keychain-db`), der verwendet wird, um **benutzerspezifische Anmeldeinformationen** wie Anwendungskennwörter, Internetkennwörter, benutzergenerierte Zertifikate, Netzwerkkennwörter und benutzergenerierte öffentliche/private Schlüssel zu speichern.
|
|
- Der **System-Keychain** (`/Library/Keychains/System.keychain`), der **systemweite Anmeldeinformationen** wie WiFi-Kennwörter, Systemstammzertifikate, systemprivate Schlüssel und Systemanwendungskennwörter speichert.
|
|
- Es ist möglich, andere Komponenten wie Zertifikate in `/System/Library/Keychains/*` zu finden.
|
|
- In **iOS** gibt es nur einen **Keychain**, der sich in `/private/var/Keychains/` befindet. Dieser Ordner enthält auch Datenbanken für den `TrustStore`, Zertifizierungsstellen (`caissuercache`) und OSCP-Einträge (`ocspache`).
|
|
- Apps werden im Keychain nur auf ihren privaten Bereich basierend auf ihrer Anwendungskennung beschränkt.
|
|
|
|
### Passwort-Keychain-Zugriff
|
|
|
|
Diese Dateien, obwohl sie keinen inhärenten Schutz haben und **heruntergeladen** werden können, sind verschlüsselt und erfordern das **Klartextpasswort des Benutzers zur Entschlüsselung**. Ein Tool wie [**Chainbreaker**](https://github.com/n0fate/chainbreaker) könnte zur Entschlüsselung verwendet werden.
|
|
|
|
## Schutz der Keychain-Einträge
|
|
|
|
### ACLs
|
|
|
|
Jeder Eintrag im Keychain wird durch **Zugriffskontrolllisten (ACLs)** geregelt, die festlegen, wer verschiedene Aktionen auf dem Keychain-Eintrag ausführen kann, einschließlich:
|
|
|
|
- **ACLAuhtorizationExportClear**: Erlaubt dem Inhaber, den Klartext des Geheimnisses zu erhalten.
|
|
- **ACLAuhtorizationExportWrapped**: Erlaubt dem Inhaber, den Klartext, der mit einem anderen bereitgestellten Passwort verschlüsselt ist, zu erhalten.
|
|
- **ACLAuhtorizationAny**: Erlaubt dem Inhaber, jede Aktion auszuführen.
|
|
|
|
Die ACLs werden zusätzlich von einer **Liste vertrauenswürdiger Anwendungen** begleitet, die diese Aktionen ohne Aufforderung ausführen können. Dies könnte sein:
|
|
|
|
- **N`il`** (keine Autorisierung erforderlich, **jeder ist vertrauenswürdig**)
|
|
- Eine **leere** Liste (**niemand** ist vertrauenswürdig)
|
|
- **Liste** spezifischer **Anwendungen**.
|
|
|
|
Außerdem könnte der Eintrag den Schlüssel **`ACLAuthorizationPartitionID`** enthalten, der verwendet wird, um die **teamid, apple** und **cdhash** zu identifizieren.
|
|
|
|
- Wenn die **teamid** angegeben ist, muss die verwendete Anwendung, um den **Eintrag** ohne **Aufforderung** zu **zugreifen**, die **gleiche teamid** haben.
|
|
- Wenn **apple** angegeben ist, muss die App von **Apple** **signiert** sein.
|
|
- Wenn die **cdhash** angegeben ist, muss die **App** die spezifische **cdhash** haben.
|
|
|
|
### Erstellen eines Keychain-Eintrags
|
|
|
|
Wenn ein **neuer** **Eintrag** mit **`Keychain Access.app`** erstellt wird, gelten die folgenden Regeln:
|
|
|
|
- Alle Apps können verschlüsseln.
|
|
- **Keine Apps** können exportieren/entschlüsseln (ohne den Benutzer aufzufordern).
|
|
- Alle Apps können die Integritätsprüfung sehen.
|
|
- Keine Apps können ACLs ändern.
|
|
- Die **partitionID** wird auf **`apple`** gesetzt.
|
|
|
|
Wenn eine **Anwendung einen Eintrag im Keychain erstellt**, sind die Regeln etwas anders:
|
|
|
|
- Alle Apps können verschlüsseln.
|
|
- Nur die **erstellende Anwendung** (oder andere explizit hinzugefügte Apps) können exportieren/entschlüsseln (ohne den Benutzer aufzufordern).
|
|
- Alle Apps können die Integritätsprüfung sehen.
|
|
- Keine Apps können die ACLs ändern.
|
|
- Die **partitionID** wird auf **`teamid:[teamID hier]`** gesetzt.
|
|
|
|
## Zugriff auf den Keychain
|
|
|
|
### `security`
|
|
```bash
|
|
# 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
|
|
|
|
> [!TIP]
|
|
> Die **Aufzählung und das Dumping** von Geheimnissen, die **keine Eingabeaufforderung erzeugen**, kann mit dem Tool [**LockSmith**](https://github.com/its-a-feature/LockSmith) durchgeführt werden.
|
|
>
|
|
> Weitere API-Endpunkte finden Sie im Quellcode von [**SecKeyChain.h**](https://opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55017/lib/SecKeychain.h.auto.html).
|
|
|
|
Listen Sie die **Informationen** zu jedem Schlüsselbund-Eintrag mit dem **Security Framework** auf oder überprüfen Sie auch das Open-Source-CLI-Tool von Apple [**security**](https://opensource.apple.com/source/Security/Security-59306.61.1/SecurityTool/macOS/security.c.auto.html)**.** Einige API-Beispiele:
|
|
|
|
- Die API **`SecItemCopyMatching`** gibt Informationen zu jedem Eintrag und es gibt einige Attribute, die Sie bei der Verwendung festlegen können:
|
|
- **`kSecReturnData`**: Wenn wahr, wird versucht, die Daten zu entschlüsseln (auf falsch setzen, um potenzielle Pop-ups zu vermeiden)
|
|
- **`kSecReturnRef`**: Auch Referenz auf den Schlüsselbund-Eintrag erhalten (auf wahr setzen, falls Sie später sehen, dass Sie ohne Pop-up entschlüsseln können)
|
|
- **`kSecReturnAttributes`**: Metadaten über Einträge erhalten
|
|
- **`kSecMatchLimit`**: Wie viele Ergebnisse zurückgegeben werden sollen
|
|
- **`kSecClass`**: Welche Art von Schlüsselbund-Eintrag
|
|
|
|
Erhalten Sie die **ACLs** jedes Eintrags:
|
|
|
|
- Mit der API **`SecAccessCopyACLList`** können Sie die **ACL für den Schlüsselbund-Eintrag** abrufen, und es wird eine Liste von ACLs zurückgegeben (wie `ACLAuhtorizationExportClear` und die zuvor genannten), wobei jede Liste hat:
|
|
- Beschreibung
|
|
- **Vertrauenswürdige Anwendungs-Liste**. Dies könnte sein:
|
|
- Eine App: /Applications/Slack.app
|
|
- Ein Binary: /usr/libexec/airportd
|
|
- Eine Gruppe: group://AirPort
|
|
|
|
Exportieren Sie die Daten:
|
|
|
|
- Die API **`SecKeychainItemCopyContent`** erhält den Klartext
|
|
- Die API **`SecItemExport`** exportiert die Schlüssel und Zertifikate, könnte jedoch erforderlich sein, Passwörter festzulegen, um den Inhalt verschlüsselt zu exportieren
|
|
|
|
Und dies sind die **Anforderungen**, um ein **Geheimnis ohne Eingabeaufforderung zu exportieren**:
|
|
|
|
- Wenn **1+ vertrauenswürdige** Apps aufgelistet sind:
|
|
- Benötigen Sie die entsprechenden **Berechtigungen** (**`Nil`**, oder Teil der erlaubten Liste von Apps in der Berechtigung zum Zugriff auf die geheimen Informationen sein)
|
|
- Benötigen Sie eine Codesignatur, die mit **PartitionID** übereinstimmt
|
|
- Benötigen Sie eine Codesignatur, die mit der eines **vertrauenswürdigen Apps** übereinstimmt (oder Mitglied der richtigen KeychainAccessGroup sein)
|
|
- Wenn **alle Anwendungen vertrauenswürdig** sind:
|
|
- Benötigen Sie die entsprechenden **Berechtigungen**
|
|
- Benötigen Sie eine Codesignatur, die mit **PartitionID** übereinstimmt
|
|
- Wenn **keine PartitionID**, dann ist dies nicht erforderlich
|
|
|
|
> [!CAUTION]
|
|
> Daher, wenn **1 Anwendung aufgelistet** ist, müssen Sie **Code in dieser Anwendung injizieren**.
|
|
>
|
|
> Wenn **apple** in der **partitionID** angegeben ist, könnten Sie darauf mit **`osascript`** zugreifen, sodass alles, was alle Anwendungen mit apple in der partitionID vertraut, darauf zugreifen kann. **`Python`** könnte auch dafür verwendet werden.
|
|
|
|
### Zwei zusätzliche Attribute
|
|
|
|
- **Unsichtbar**: Es ist ein boolesches Flag, um den Eintrag aus der **UI** Schlüsselbund-App **zu verbergen**
|
|
- **Allgemein**: Es dient zur Speicherung von **Metadaten** (es ist also NICHT VERSCHLÜSSELT)
|
|
- Microsoft speicherte alle Refresh-Token im Klartext, um auf sensible Endpunkte zuzugreifen.
|
|
|
|
## References
|
|
|
|
- [**#OBTS v5.0: "Lock Picking the macOS Keychain" - Cody Thomas**](https://www.youtube.com/watch?v=jKE1ZW33JpY)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|