64

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

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

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

4

7 回答 7

55

你是对的,我知道根本没有 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”进行密码保护

于 2010-10-19T23:30:11.987 回答
25

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

然而,他的指示已经过时了。你需要:

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

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

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

  4. mimikatz

  5. 按照wiki 说明操作,.pfx 文件(使用密码mimikatz保护)将放置在 mimikatz bin 的同一文件夹中

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

mimikatz # privilege::debug
Privilege '20' OK

mimikatz #crypto::cng
"KeyIso" 服务已修补

mimikatz # crypto::certificates /systemstore:local_machine /store:my /export
* 系统存储:'local_machine' (0x00020000)
* 存储:'my'

  1. example.domain.local
         密钥容器:example.domain.local
         提供者:Microsoft 软件密钥存储提供者
         类型:CNG 密钥 (0xffffffff)
         可导出密钥:NO
         密钥大小:2048
         公共导出:OK - 'local_machine_my_0_example.domain.local.der'
         私有导出:好的-'local_machine_my_0_example.domain.local.pfx'
于 2016-03-22T15:42:12.353 回答
18

我想特别提到越狱GitHub

越狱

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

先决条件:Win32

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

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

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

于 2011-08-16T14:45:16.557 回答
17

这里有用于控制台应用程序的代码和二进制文件,可以导出标记为不可导出的私钥,并且不会触发像 mimikatz 这样的防病毒应用程序。

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

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

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

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

于 2019-05-29T12:12:04.507 回答
1

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

这确保该crypto::cng命令将起作用。否则它给了我错误:

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

删除 Avast 后:

mimikatz $ crypto::cng
"KeyIso" service patched

魔法。(:

顺便提一句

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

于 2018-09-27T15:35:26.310 回答
1

不幸的是,上面提到的工具被多家防病毒供应商阻止。如果您遇到这种情况,请查看以下内容。

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

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

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

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

机器存储:HKLM\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates 用户存储:HKCU\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates

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

于 2018-03-13T22:27:13.097 回答
0

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

于 2021-04-16T18:41:51.450 回答