hacktricks/macos-hardening/macos-red-teaming/macos-keychain.md
2023-07-07 23:42:27 +00:00

12 KiB
Raw Blame History

macOS Keychain

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

メインのキーチェーン

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

パスワードキーチェーンへのアクセス

これらのファイルは、固有の保護はありませんが、暗号化されており、ユーザーの平文パスワードを復号化するために必要です。Chainbreakerのようなツールを使用して復号化することができます。

キーチェーンエントリの保護

ACLs

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

  • ACLAuhtorizationExportClear:保持者が秘密のクリアテキストを取得できるようにします。
  • ACLAuhtorizationExportWrapped:保持者が別の提供されたパスワードで暗号化されたクリアテキストを取得できるようにします。
  • ACLAuhtorizationAny:保持者が任意のアクションを実行できるようにします。

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

  • Nil(認証は必要ありません、誰もが信頼されています
  • 空のリスト(誰も信頼されていません
  • 特定のアプリケーションリスト

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

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

キーチェーンエントリの作成

Keychain Access.appを使用して新しいエントリを作成する場合、次のルールが適用されます:

  • すべてのアプリが暗号化できます。
  • アプリはエクスポート/復号化できません(ユーザーにプロンプトを表示せずに)。
  • すべてのアプリが整合性チェックを表示できます。
  • すべてのアプリがACLを変更できません。
  • partitionIDは**apple**に設定されます。

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

  • すべてのアプリが暗号化できます。
  • エントリのエクスポート/復号化(ユーザーにプロンプトを表示せずに)は、作成したアプリケーション(または明示的に追加された他のアプリ)のみができます。
  • すべてのアプリが整合性チェックを表示できます。
  • すべてのアプリがACLを変更できません。
  • partitionIDは**teamid:[ここにteamIDを入力]**に設定されます。

キーチェーンへのアクセス

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" %} キーチェーンの列挙とシークレットのダンプは、LockSmithというツールを使用して、プロンプトを生成しないで行うことができます。 {% endhint %}

各キーチェーンエントリについてのリストと情報を取得します:

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

各エントリのACLを取得します:

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

データをエクスポートします:

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

そして、プロンプトなしでシークレットをエクスポートするための要件は次のとおりです:

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

{% hint style="danger" %} したがって、1つのアプリケーションがリストされている場合、そのアプリケーションにコードをインジェクトする必要があります。

PartitionIDappleが指定されている場合、**osascriptを使用してアクセスできます。つまり、PartitionIDにappleを含むすべてのアプリケーションを信頼しているものにアクセスできます。これにはPython**も使用できます。 {% endhint %}

2つの追加属性

  • InvisibleUIキーチェーンアプリからエントリを非表示にするためのブールフラグです
  • Generalメタデータを保存するためのものです(つまり、暗号化されていません
  • Microsoftは、機密なエンドポイントにアクセスするためのすべてのリフレッシュトークンを平文で保存していました。

参考文献

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥