hacktricks/macos-hardening/macos-red-teaming/macos-keychain.md
2023-08-03 19:12:22 +00:00

8.6 KiB
Raw Blame History

macOS 密钥链

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

主要密钥链

  • 用户密钥链 (~/Library/Keychains/login.keycahin-db),用于存储特定用户的凭据,如应用程序密码、互联网密码、用户生成的证书、网络密码和用户生成的公钥/私钥。
  • 系统密钥链 (/Library/Keychains/System.keychain),用于存储系统范围的凭据,如 WiFi 密码、系统根证书、系统私钥和系统应用程序密码。

密码密钥链访问

这些文件虽然没有固有的保护,可以下载,但它们是加密的,需要用户的明文密码进行解密。可以使用 Chainbreaker 这样的工具进行解密。

密钥链条目保护

ACLs

密钥链中的每个条目都受访问控制列表 (ACLs) 的管理ACLs 规定了谁可以对密钥链条目执行各种操作,包括:

  • ACLAuhtorizationExportClear:允许持有者获取明文密码。
  • ACLAuhtorizationExportWrapped:允许持有者获取使用另一个提供的密码加密的明文密码。
  • ACLAuhtorizationAny:允许持有者执行任何操作。

ACLs 还附带了一个可信应用程序列表,这些应用程序可以在不提示的情况下执行这些操作。这可以是:

  • Nil(无需授权,每个人都受信任
  • 一个列表(没有人受信任)
  • 特定应用程序列表

此外,条目可能包含键**ACLAuthorizationPartitionID,用于标识teamid、applecdhash**。

  • 如果指定了teamid,则为了在不提示的情况下访问条目值,使用的应用程序必须具有相同的 teamid
  • 如果指定了apple,则该应用程序需要由Apple签名。
  • 如果指定了cdhash,则应用程序必须具有特定的cdhash

创建密钥链条目

当使用**Keychain Access.app创建一个新的条目**时,适用以下规则:

  • 所有应用程序都可以进行加密。
  • 没有应用程序可以导出/解密(无需提示用户)。
  • 所有应用程序都可以查看完整性检查。
  • 没有应用程序可以更改 ACLs。
  • partitionID 设置为**apple**。

当应用程序在密钥链中创建条目时,规则略有不同:

  • 所有应用程序都可以进行加密。
  • 只有创建条目的应用程序(或其他明确添加的应用程序)可以导出/解密(无需提示用户)。
  • 所有应用程序都可以查看完整性检查。
  • 没有应用程序可以更改 ACLs。
  • partitionID 设置为**teamid:[teamID here]**。

访问密钥链

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 提供有关每个条目的信息,并且在使用时可以设置一些属性:
  • kSecReturnData如果为true它将尝试解密数据设置为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个应用程序列出,您需要在该应用程序中注入代码

如果partitionID中指定了apple,则可以使用**osascript访问它因此可以信任所有具有apple的partitionID的应用程序。也可以使用Python**进行此操作。 {% endhint %}

两个附加属性

  • Invisible:这是一个布尔标志,用于从UI密钥链应用程序中隐藏条目
  • General:用于存储元数据(因此不加密
  • Microsoft将所有用于访问敏感端点的刷新令牌明文存储。

参考资料

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