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}}