从 OS X Keychain 中提取不可提取的私钥

逆向工程 二元分析 调试器 文件格式 操作系统 编译器
2021-06-14 04:26:09

我正在尝试.p12Mac OS X 10.9.4Keychain Access.app/usr/bin/security在 Mac OS X 10.9.4 上提取不可提取的私钥作为文件


基本上,似乎security import有一个-x选项来指定private keys are non-extractable after being imported

如上所述,这是通过CSSM_KEYATTR_EXTRACTABLE在导入期间显式省略来实现的随后,在尝试导出时,无法导出没有此类属性的密钥。

我可以找到至少两个相关的提及,它们似乎阻止了此类密钥的导出(提示:用于fgrep -OR在搜索 Apple 源代码时避免跟随符号链接):


我已经从 github.com/torsten 尝试过 keychain_access,但是没有用。

我试过使用 lldb , lldb -- security export -t identities -f pkcs12 -o /tmp/mycerts.p12, 来打破SecWrappedKeys.cpp::impExpWrappedKeyOpenSslExport(),但这似乎也不起作用,因为break impExpWrappedKeyOpenSslExport发出错误invalid command 'breakpoint impExpWrappedKeyOpenSslExport'

我已尝试使用 DTrace来跟踪 Cisco AnyConnect,但我对 DTrace 不够熟悉,无法显示数据结构。

我已经尝试重新编译Security 和 SecurityTool 包,但它们似乎都需要引导,但似乎没有到位。

我如何获得私钥?

2个回答

通过研究我的钥匙串子问题之一的答案,我找到了一个解决方案。

根据 SecItem.h,这kSecAttrIsExtractable已在 OS X 10.6 中引入。

因此,我在以下方面进行了尝试并取得了成功:

  • scp ~/Library/Keychains/login.keychain 从 OS X 10.9 到 OS X 10.5

  • 在 OS X 10.5 上,根据手册页中的示例:

    security export -k /tmp/login.keychain -t identities -f pkcs12 -o /tmp/mycerts.p12

    security应用程序会要求您提供多个密码:

    1. 第一个对话中的新密码是为了保护正在导出的 p12;
    2. 第二个是login.keychain密码,通常与钥匙串文件来自的原始 OS X 10.9 上用户的登录密码相同。
  • scp /tmp/mycerts.p12 从 10.5 回到 OS X 10.9

我用chainbreaker fork找到了一种更简单的方法它适用于 MacOS 10.14 Mojave。请参阅此处的完整说明

就我而言,我执行了以下操作:

$ pip2 install hexdump pycrypto pyopenssl
$ git clone https://github.com/gremwell/chainbreaker.git && cd chainbreaker
$ python2 chainbreaker.py -f ~/Library/Keychains/login.keychain-db -p <PASS>
$ openssl x509 -inform DER -in exported/associated/1/*.crt -out secret.crt
$ openssl rsa -inform DER -in exported/associated/1/*.key -out secret.key
$ openssl pkcs12 -export -out secret.p12 -inkey secret.key -in secret.crt

然后secret.p12 就可以在另一台机器上导入了。