macOS Keychain

Reading time: 10 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

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

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

  • 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

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

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

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

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

  • API **SecItemCopyMatching**は各エントリに関する情報を提供し、使用時に設定できる属性があります:
  • kSecReturnData: trueの場合、データの復号を試みます(ポップアップを避けるためにfalseに設定)
  • kSecReturnRef: キーチェーンアイテムへの参照も取得(後でポップアップなしで復号できることがわかった場合はtrueに設定)
  • kSecReturnAttributes: エントリに関するメタデータを取得
  • kSecMatchLimit: 返す結果の数
  • kSecClass: どの種類のキーチェーンエントリか

各エントリのACLを取得:

  • API **SecAccessCopyACLList**を使用すると、キーチェーンアイテムのACLを取得でき、各リストには以下が含まれます(ACLAuhtorizationExportClearなど、前述の他のもの):
  • 説明
  • 信頼されたアプリケーションリスト。これには以下が含まれる可能性があります:
  • アプリ: /Applications/Slack.app
  • バイナリ: /usr/libexec/airportd
  • グループ: group://AirPort

データをエクスポート:

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

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

  • 1つ以上の信頼されたアプリがリストされている場合:
  • 適切な認可が必要です(Nil、または秘密情報にアクセスするための認可リストに含まれている必要があります)
  • コード署名がPartitionIDと一致する必要があります
  • コード署名が1つの信頼されたアプリのものと一致する必要があります(または正しいKeychainAccessGroupのメンバーである必要があります)
  • すべてのアプリケーションが信頼されている場合:
  • 適切な認可が必要です
  • コード署名がPartitionIDと一致する必要があります
  • PartitionIDがない場合、これは必要ありません

caution

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

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

2つの追加属性

  • Invisible: エントリをUIキーチェーンアプリから隠すためのブールフラグです
  • General: メタデータを保存するためのもので(したがって、暗号化されていません)
  • Microsoftは、機密エンドポイントにアクセスするためのすべてのリフレッシュトークンをプレーンテキストで保存していました。

References

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする