hacktricks/macos-hardening/macos-red-teaming/macos-keychain.md

9.2 KiB

macOS Keychain

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :

Principaux Keychains

  • Le User Keychain (~/Library/Keychains/login.keycahin-db), utilisé pour stocker les identifiants spécifiques à l'utilisateur tels que les mots de passe d'applications, les mots de passe internet, les certificats générés par l'utilisateur, les mots de passe réseau et les clés publiques/privées générées par l'utilisateur.
  • Le System Keychain (/Library/Keychains/System.keychain), qui stocke les identifiants à l'échelle du système tels que les mots de passe WiFi, les certificats racine du système, les clés privées du système et les mots de passe des applications système.

Accès au Keychain de mots de passe

Ces fichiers, bien qu'ils ne soient pas protégés par nature et puissent être téléchargés, sont chiffrés et nécessitent le mot de passe en clair de l'utilisateur pour être déchiffrés. Un outil comme Chainbreaker pourrait être utilisé pour le déchiffrement.

Protections des entrées du Keychain

ACLs

Chaque entrée dans le keychain est régie par des Listes de contrôle d'accès (ACLs) qui dictent qui peut effectuer diverses actions sur l'entrée du keychain, y compris :

  • ACLAuhtorizationExportClear : Permet au détenteur d'obtenir le texte clair du secret.
  • ACLAuhtorizationExportWrapped : Permet au détenteur d'obtenir le texte clair chiffré avec un autre mot de passe fourni.
  • ACLAuhtorizationAny : Permet au détenteur d'effectuer n'importe quelle action.

Les ACLs sont en outre accompagnées d'une liste d'applications de confiance qui peuvent effectuer ces actions sans demande. Cela pourrait être :

  • Nil (aucune autorisation requise, tout le monde est de confiance)
  • Une liste vide (personne n'est de confiance)
  • Liste d'applications spécifiques.

De plus, l'entrée peut contenir la clé ACLAuthorizationPartitionID, qui est utilisée pour identifier le teamid, apple, et cdhash.

  • Si le teamid est spécifié, alors pour accéder à la valeur de l'entrée sans invite, l'application utilisée doit avoir le même teamid.
  • Si apple est spécifié, alors l'application doit être signée par Apple.
  • Si le cdhash est indiqué, alors l'application doit avoir le cdhash spécifique.

Création d'une entrée Keychain

Lorsqu'une nouvelle entrée est créée en utilisant Keychain Access.app, les règles suivantes s'appliquent :

  • Toutes les applications peuvent chiffrer.
  • Aucune application ne peut exporter/déchiffrer (sans demander à l'utilisateur).
  • Toutes les applications peuvent voir le contrôle d'intégrité.
  • Aucune application ne peut changer les ACLs.
  • Le partitionID est défini sur apple.

Lorsqu'une application crée une entrée dans le keychain, les règles sont légèrement différentes :

  • Toutes les applications peuvent chiffrer.
  • Seule l'application créatrice (ou toute autre application explicitement ajoutée) peut exporter/déchiffrer (sans demander à l'utilisateur).
  • Toutes les applications peuvent voir le contrôle d'intégrité.
  • Aucune application ne peut changer les ACLs.
  • Le partitionID est défini sur teamid:[teamID ici].

Accéder au Keychain

security

# 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

APIs

{% hint style="success" %} L'énumération des trousseaux et l'extraction des secrets qui ne généreront pas de demande peuvent être effectuées avec l'outil LockSmith {% endhint %}

Lister et obtenir des informations sur chaque entrée du trousseau :

  • L'API SecItemCopyMatching fournit des informations sur chaque entrée et il y a certains attributs que vous pouvez définir lors de son utilisation :
  • kSecReturnData : Si vrai, il essaiera de déchiffrer les données (mettre sur faux pour éviter les pop-ups potentiels)
  • kSecReturnRef : Obtenez également une référence à l'élément du trousseau (mettre sur vrai au cas où vous verriez que vous pouvez déchiffrer sans pop-up)
  • kSecReturnAttributes : Obtenez des métadonnées sur les entrées
  • kSecMatchLimit : Combien de résultats retourner
  • kSecClass : Quel type d'entrée de trousseau

Obtenir les ACL de chaque entrée :

  • Avec l'API SecAccessCopyACLList, vous pouvez obtenir l'ACL pour l'élément du trousseau, et cela retournera une liste d'ACLs (comme ACLAuhtorizationExportClear et les autres mentionnés précédemment) où chaque liste a :
  • Description
  • Liste d'applications de confiance. Cela pourrait être :
  • Une application : /Applications/Slack.app
  • Un binaire : /usr/libexec/airportd
  • Un groupe : group://AirPort

Exporter les données :

  • L'API SecKeychainItemCopyContent obtient le texte en clair
  • L'API SecItemExport exporte les clés et les certificats mais pourrait devoir définir des mots de passe pour exporter le contenu chiffré

Et voici les exigences pour pouvoir exporter un secret sans demande :

  • Si 1+ applications de confiance sont listées :
  • Besoin des autorisations appropriées (Nil, ou faire partie de la liste des applications autorisées dans l'autorisation pour accéder aux informations secrètes)
  • Besoin que la signature de code corresponde au PartitionID
  • Besoin que la signature de code corresponde à celle d'une application de confiance (ou être membre du bon KeychainAccessGroup)
  • Si toutes les applications sont de confiance :
  • Besoin des autorisations appropriées
  • Besoin que la signature de code corresponde au PartitionID
  • Si aucun PartitionID, alors cela n'est pas nécessaire

{% hint style="danger" %} Par conséquent, s'il y a 1 application listée, vous devez injecter du code dans cette application.

Si apple est indiqué dans le partitionID, vous pourriez y accéder avec osascript donc tout ce qui fait confiance à toutes les applications avec apple dans le partitionID. Python pourrait également être utilisé pour cela. {% endhint %}

Deux attributs supplémentaires

  • Invisible : C'est un indicateur booléen pour cacher l'entrée de l'application UI Keychain
  • Général : C'est pour stocker des métadonnées (donc ce n'est PAS CHIFFRÉ)
  • Microsoft stockait en texte clair tous les jetons d'actualisation pour accéder à des points de terminaison sensibles.

Références

Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres moyens de soutenir HackTricks :