【问题标题】:How to export non-exportable private key from store如何从商店导出不可导出的私钥
【发布时间】:2011-04-24 07:31:46
【问题描述】:

我需要从 Windows 商店导出私钥。如果密钥被标记为不可导出,我该怎么办?我知道有可能,程序越狱可以导出这个密钥。

要导出密钥,我使用从(RSACryptoServiceProvider)cryptoProv.ExportParameters(true) 导出密钥的Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair()。我在 Org.BouncyCastle.Cms.CmsSignedDataGenerator 中用于 CMS 签名的导出密钥。

我需要 .Net 的解决方案,但任何解决方案都会很有用。谢谢。

【问题讨论】:

  • FindPrivateKey.exe util(类似于 CspKeyContainerInfo.UniqueKeyContainerName)可以在“Microsoft\Crypto\RSA\”文件夹中获取私钥文件名。这些文件真的包含私钥吗?如何从这个文件中解密密钥?

标签: .net encryption bouncycastle rsacryptoserviceprovider


【解决方案1】:

你说得对,我知道根本没有 API 可以导出标记为不可导出的 PrivateKey。 但是如果你修补(在内存中)普通的 API,你可以使用普通的方式来导出:)

有一个新版本的 mimikatz 也支持 CNG 导出(Windows Vista / 7 / 2008 ...)

  1. 下载(并以管理权限启动):http://blog.gentilkiwi.com/mimikatz(主干版本或最新版本)

运行它并在其提示符中输入以下命令:

  1. privilege::debug(除非您已经拥有它或仅针对 CryptoApi)
  2. crypto::patchcng (nt 6) 和/或 crypto::patchcapi (nt 5 & 6)
  3. crypto::exportCertificates 和/或 crypto::exportCertificates CERT_SYSTEM_STORE_LOCAL_MACHINE

导出的 .pfx 文件使用密码“mimikatz”进行密码保护

【讨论】:

  • 谢谢。据我了解,此实用程序仅导出存储中的所有密钥,如果存储包含太多证书,则需要很长时间。也许我还没想通,但你能用这个工具导出特定的 pfx 证书吗?以及如何在我的程序中解码 *.pvk 文件?我通过将 RSACryptoServiceProvider 集成到 CmsSignedDataGenerator 中解决了我的问题。
  • 此工具导出证书/密钥的所有密钥和单个 PFX。也许我可以调整代码以仅选择指定的证书(它是取证工具而不是实用程序;))对于 PVK 格式,OpenSSL 1.x 将其转换没有任何问题:) openssl rsa -inform pvk -in fichier.pvk -outform pem -out fichier.pem
  • 加密模块中的命令发生了变化:crypto::cng or crypto::capi or crypto::keys /export
  • crypto::certificates /export /systemstore:CERT_SYSTEM_STORE_LOCAL_MACHINE 用于计算机商店 (github.com/gentilkiwi/mimikatz/blob/master/README.md#crypto)
  • @NickG / Ville,这是不正确的。 official mimikatz releases 包含恶意软件,根本。不幸的是,该工具被称为mislabeled as malware by anti-virus software,因为它通常用于漏洞利用……就像任何可用于提取密码和私钥的工具一样,它很容易被非法使用。
【解决方案2】:

Gentil Kiwi 的answer 是正确的。他开发了这个 mimikatz 工具,该工具能够检索不可导出的私钥。

但是,他的指示已经过时了。你需要:

  1. https://github.com/gentilkiwi/mimikatz/releases下载最新版本

  2. 在请求证书的同一台机器上以管理员权限运行 cmd

  3. 切换到 mimikatz bin 目录(Win32 或 x64 版本)

  4. 运行mimikatz

  5. 关注wiki instructions,.pfx 文件(使用密码mimikatz 保护)将被放置在 mimikatz bin 的同一文件夹中

mimikatz #crypto::capi
本地 CryptoAPI 已修补

mimikatz # 权限::调试
特权 '20' OK

mimikatz #crypto::cng
“KeyIso”服务已修补

mimikatz #crypto::certificates /systemstore:local_machine /store:my /出口
* 系统存储:'local_machine' (0x00020000)
* 商店:“我的”

  1. example.domain.local
    密钥容器:example.domain.local
    提供者:Microsoft 软件密钥存储提供者
    类型:CNG 密钥 (0xffffffff)
    可导出密钥:否
    密钥大小:2048
    公共导出:好的 - 'local_machine_my_0_example.domain.local.der'
    私人导出:好的 - 'local_machine_my_0_example.domain.local.pfx'

【讨论】:

  • 所有店铺位置见msdn.microsoft.com/en-us/library/windows/desktop/aa388136.aspx,另外,请注明所有导出pfx的密码是“mimikatz”
  • @Bernhard,我已编辑添加有关密码的信息。谢谢。
  • 这绝对应该被赞成。当我订购证书并且在 Windows 中创建请求时未能将密钥标记为可导出时,它只是保存了我的背面......:|
  • 被趋势科技识别为威胁并拒绝访问:trendmicro.com/vinfo/us/threat-encyclopedia/search/…
  • 当我运行privilege::debug 时,我得到ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061。我在 Windows 10.0.18363.1016 中使用 mimikatz 2.2.0 (x64)。
【解决方案3】:

我想特别提一下Jailbreak(GitHub)

越狱

越狱是一种用于导出标记为的证书的工具 不可从 Windows 证书存储中导出。这可以帮助 您需要提取证书以进行备份或测试。你必须有 完全访问文件系统上的私钥,以便 越狱工作。

先决条件:Win32

  • 下载适用于您的 Windows 版本的可执行二进制文件(例如 jailbreak64.exe)。

  • 启动提升的命令提示符。

  • 运行命令jailbreak64.exe %WINDIR%\system32\mmc.exe %WINDIR%\system32\certlm.msc -64 (注意 - 这与 github 上的指导不太一样。certlm.msc 在 Windows 2016 和 2019 上用于调出本地机器证书存储)。

【讨论】:

  • 为我工作,Windows 10 Pro 1703。
  • 它适用于 64 位系统(如 Windows 7 x64),但不适用于 W2k12R2 上的本地机器存储。
  • 第一个链接的结果是“404”。
  • 这个答案肯定需要更多的工作:实际程序是什么?在 Windows 10 64 位([版本 10.0.18363.1016])中尝试(32 位和 64 位)我只得到了CreateProces failed with error code = 740
  • 另外一件事是:如果我在不越狱的情况下运行命令,我只能看到管理用户的用户证书,而不是我感兴趣的用户。
【解决方案4】:

here 可用于控制台应用程序的代码和二进制文件可以导出标记为不可导出的私钥,而 won't trigger antivirus mimikatz 等应用程序可以。

代码基于NCC Group 的一篇论文。 将需要使用本地系统帐户运行该工具,因为它通过直接写入 Windows 的lsass 进程使用的内存来工作,以便临时将密钥标记为可导出。这可以使用来自 SysInternals 的PsToolsPsExec 来完成:

  1. 生成一个以本地系统用户身份运行的新命令提示符:

    PsExec64.exe -s -i cmd
    
  2. 在新的命令提示符下,运行该工具:

    exportrsa.exe
    
  3. 它将遍历每个本地计算机存储,使用私钥搜索证书。对于每一个,它都会提示您输入密码 - 这是您要用来保护导出的 PFX 文件的密码,所以可以是任何您想要的密码

【讨论】:

  • 这似乎有效。它提示我输入每个文件的密码,然后说它已成功导出到“4.pfx”——但我找不到那个文件。它出口到哪里?
  • 我找到了:它在我的 64 位机器上导出到 c:\windows\syswow64。
  • 迄今为止最干净、最简单的解决方案。关于传递给 PSexec 的 -s 选项的注释 - 检查它的作用,因为这将影响 exportrsa 可见的证书存储。个人商店不需要。
  • 这是一个很好的解决方案。我终于可以在我的 Mac 上工作了,尽管我的管理员说这是不可能的:D
  • 值得一提的是,这里提到的程序在没有 PsExec64 的情况下对我有用,所以在某些情况下,管理员帐户下的 cmd 就足够了。但我是从 UserStore 导出证书,而不是从系统导出证书。
【解决方案5】:

很遗憾,上述工具已被多家防病毒供应商阻止。如果您遇到这种情况,请查看以下内容。

在证书存储中打开不可导出的证书并找到指纹值。

接下来,打开 regedit 到以下路径并找到与指纹值匹配的注册表项。

注册表项的导出将包含完整的证书,包括私钥。导出后,将导出复制到另一台服务器并将其导入注册表。

证书将出现在证书管理器中,其中包含私钥。

Machine Store:HKLM\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates 用户存储:HKCU\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates

在紧要关头,您可以将导出保存为证书的备份。

【讨论】:

  • 刚刚检查过,私钥不存在 - 只是指向某个 SID 的指针,可能是磁盘上的文件(已加密)。所以我认为这种方法行不通。
  • 它在%APPDATA%\Microsoft\Crypto\RSA\$YOURSID ...我故意使用来自$YOURSID 的无效作为占位符,因为您需要找出自己的SID。可能最容易在HKEY_USERS 下使用regedit ...您还可以使用HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 来确定哪个 SID 对应于您的用户名。最后但并非最不重要的一点是来自 Microsoft/Sysinternals 的 psgetsid %USERDOMAIN%\%USERNAME%
【解决方案6】:

您可能需要卸载防病毒软件(在我的情况下,我必须摆脱 Avast)。

这确保crypto::cng 命令能够正常工作。否则它会给我错误:

mimikatz $ crypto::cng
ERROR kull_m_patch_genericProcessOrServiceFromBuild ; OpenProcess (0x00000005)

删除 Avast 后:

mimikatz $ crypto::cng
"KeyIso" service patched

魔法。 (:

顺便说一句

Windows Defender 是另一个阻止该程序工作的程序,因此您至少需要在使用程序时将其禁用。

【讨论】:

  • 我不确定是否将 Windows Defender 称为“间谍软件”?!
【解决方案7】:

如果它是由 digicert 颁发的,您可以使用适用于 Windows 的 DigiCert 证书实用程序。在创建它的服务器上执行“修复”。然后您可以将其导出为喜欢 c:\temp 为 .pfx。这对我来说是一个真正的 ssl 证书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多