macOS Keychain

Support HackTricks

Main Keychains

  • ユーザーキーチェーン (~/Library/Keychains/login.keychain-db) は、アプリケーションパスワード、インターネットパスワード、ユーザー生成証明書、ネットワークパスワード、ユーザー生成の公開/秘密鍵などのユーザー固有の資格情報を保存するために使用されます。

  • システムキーチェーン (/Library/Keychains/System.keychain) は、WiFiパスワード、システムルート証明書、システムプライベートキー、システムアプリケーションパスワードなどのシステム全体の資格情報を保存します。

  • /System/Library/Keychains/* には、証明書などの他のコンポーネントを見つけることができます。

  • iOS には、/private/var/Keychains/ に1つのキーチェーンがあります。このフォルダーには、TrustStore、証明書機関(caissuercache)、およびOSCPエントリ(ocspache)のデータベースも含まれています。

  • アプリは、アプリケーション識別子に基づいて、キーチェーン内のプライベートエリアのみに制限されます。

Password Keychain Access

これらのファイルは、固有の保護がなく、ダウンロード可能ですが、暗号化されており、復号化するためにユーザーの平文パスワードが必要です。復号化には、Chainbreakerのようなツールが使用できます。

Keychain Entries Protections

ACLs

キーチェーン内の各エントリは、さまざまなアクションを実行できる人を規定する**アクセス制御リスト(ACL)**によって管理されています。これには以下が含まれます:

  • ACLAuhtorizationExportClear: 秘密のクリアテキストを取得することを許可します。

  • ACLAuhtorizationExportWrapped: 別の提供されたパスワードで暗号化されたクリアテキストを取得することを許可します。

  • ACLAuhtorizationAny: すべてのアクションを実行することを許可します。

ACLは、これらのアクションをプロンプトなしで実行できる信頼されたアプリケーションのリストを伴います。これには以下が含まれます:

  • Nil(認証不要、誰でも信頼される

  • 空のリスト(誰も信頼されない)

  • 特定のアプリケーションのリスト

また、エントリには**ACLAuthorizationPartitionIDというキーが含まれている場合があり、これはteamid、apple、およびcdhash**を識別するために使用されます。

  • teamidが指定されている場合、プロンプトなしでエントリの値にアクセスするには、使用されるアプリケーションが同じteamidを持っている必要があります。

  • appleが指定されている場合、アプリはAppleによって署名されている必要があります。

  • cdhashが指定されている場合、アプリは特定のcdhashを持っている必要があります。

Creating a Keychain Entry

Keychain Access.appを使用して新しいエントリを作成する際には、以下のルールが適用されます:

  • すべてのアプリが暗号化できます。

  • アプリはエクスポート/復号化できません(ユーザーにプロンプトなしで)。

  • すべてのアプリが整合性チェックを確認できます。

  • アプリはACLを変更できません。

  • partitionIDは**apple**に設定されます。

アプリケーションがキーチェーンにエントリを作成する場合、ルールは少し異なります:

  • すべてのアプリが暗号化できます。

  • 作成アプリケーション(または明示的に追加された他のアプリ)のみがエクスポート/復号化できます(ユーザーにプロンプトなしで)。

  • すべてのアプリが整合性チェックを確認できます。

  • アプリはACLを変更できません。

  • 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

キーチェーンの列挙と秘密のダンプは、プロンプトを生成しないものについては、ツールLockSmithを使用して行うことができます。

他のAPIエンドポイントは、SecKeyChain.hのソースコードで見つけることができます。

Security Frameworkを使用して各キーチェーンエントリの情報をリストおよび取得することができます。また、AppleのオープンソースCLIツールsecurityも確認できます。 一部のAPIの例:

  • API **SecItemCopyMatching**は各エントリに関する情報を提供し、使用時に設定できる属性があります:

  • kSecReturnData:真の場合、データの復号を試みます(ポップアップを避けるために偽に設定)

  • kSecReturnRef:キーチェーンアイテムへの参照も取得します(後でポップアップなしで復号できることがわかった場合は真に設定)

  • kSecReturnAttributes:エントリに関するメタデータを取得

  • kSecMatchLimit:返す結果の数

  • kSecClass:キーチェーンエントリの種類

各エントリのACLを取得:

  • API **SecAccessCopyACLList**を使用すると、キーチェーンアイテムのACLを取得でき、各リストには以下が含まれます:

  • 説明

  • 信頼されたアプリケーションリスト。これには以下が含まれる可能性があります:

  • アプリ:/Applications/Slack.app

  • バイナリ:/usr/libexec/airportd

  • グループ:group://AirPort

データをエクスポート:

  • API **SecKeychainItemCopyContent**はプレーンテキストを取得します

  • API **SecItemExport**はキーと証明書をエクスポートしますが、コンテンツを暗号化してエクスポートするためにパスワードを設定する必要があるかもしれません

そして、プロンプトなしで秘密をエクスポートするための要件は以下の通りです:

  • 1つ以上の信頼されたアプリがリストされている場合:

  • 適切な認可が必要です(Nil、または秘密情報にアクセスするための認可リストに含まれている必要があります)

  • コード署名がPartitionIDと一致する必要があります

  • コード署名が1つの信頼されたアプリのものと一致する必要があります(または正しいKeychainAccessGroupのメンバーである必要があります)

  • すべてのアプリケーションが信頼されている場合:

  • 適切な認可が必要です

  • コード署名がPartitionIDと一致する必要があります

  • PartitionIDがない場合、これは必要ありません

したがって、1つのアプリケーションがリストされている場合、そのアプリケーションにコードを注入する必要があります。

applepartitionIDに示されている場合、**osascriptを使用してアクセスできるため、partitionIDにappleを含むすべてのアプリケーションを信頼することができます。Python**もこれに使用できます。

2つの追加属性

  • Invisible:エントリをUIキーチェーンアプリから隠すためのブールフラグです

  • Generalメタデータを保存するためのもので(したがって、暗号化されていません)

  • Microsoftは、機密エンドポイントにアクセスするためのすべてのリフレッシュトークンをプレーンテキストで保存していました。

参考文献

HackTricksをサポートする

Last updated