标注的博客| 安全研究| 渗透测试| APT

首页

带有mimikatz和powerplat影射器的病毒.net

作者 krahenbuhl 时间 2020-03-18
all

前段时间,我们的一位客户向我们提出了一个特殊要求。出于某种合理的原因,他们需要集中收集某些证书,包括他们的私钥,这些私钥分布在运行Windows的许多客户机系统上,并存储在相应的用户存储中。不幸的是(仅在这种情况下,但从安全角度来看实际上是好的),特定的私钥被标记为不可导出,使得在用户上下文中不可能进行本机导出。似乎这还不够,提取应该在当前用户的上下文中执行(即没有管理权限),而根本不会触发现有的反病毒解决方案。此外,证书需要传输到某个受信任的系统,在该系统中不能以未经授权的方式访问它们。让我们看看我们是如何解决这些问题的:

使用Mimikatz提取证书/密钥

虽然还有其他可能进行调查,例如直接从广告中提取受DPAPI保护的证书,并尝试对加密过程进行反向工程,但我们决定采用一种通过使用mimikatz进行可预测工作的方法。使用mimikatz从用户存储中提取不可导出的证书(包括其私钥)非常简单。您只需发出以下命令,PFX文件将导出到mimikatz目录:

第一个命令修补Windows Crypto API,以便可以导出不可导出的证书,第二个命令执行实际导出。

从Mimikatz中剥离功能

所以我们可以提取出好的证书。但是mimikatz是一个非常强大的工具,可以做很多事情,比如提取NTLM散列、密码、票证等等。当然,我们不希望所有这些功能在客户端系统上潜在可用,特别是当我们想避开AV时(请参见下面的主题)。方便的是,mimikatz是开源软件,因此我们可以构建自己的版本,去掉所有这些功能。按照构建说明,我们需要设置Visual Studio并导入mimikatz项目。在“解决方案资源管理器”视图中,右键单击.c/.h文件并选择“从项目中排除”,可以安全地排除以下目录及其子目录中的所有文件:

在mimikatz/modules子目录中,我们可以排除除以下以外的所有文件:

在mimikatz目录中,我们可以排除除以下.c/.h文件之外的所有文件:

为了使mimikatz仍然可以无错误地生成,您需要通过删除除以下内容之外的所有不必要的include来修改mimikatz.h:

此外,需要按以下方式修改mimikatz.c:从const KUHL_M*mimikatz_modules[]数组中删除所有不需要的命令。在我们的例子中,现在看起来是这样的:

此外,我们需要注释掉被排除模块的所有函数调用。在我们的案例中,这是以下几行:

现在我们可以构建自己的mimikatz版本,去掉所有不必要的功能。为了进一步锁定功能,甚至可以修改mimikatz.c,以便它直接执行我们的命令,而不向用户提供所有加密和标准命令。

请注意,这是使用2017年6月底从Git中提取的mimikatz版本完成的。由于源代码可能已更改,删除功能的过程也可能已更改。但是,您可以以此为起点来构建您自己定制的mimikatz版本。

反病毒规避,权力地狱之道

下一个要求是避开反病毒引擎。正如所料,我们的修改还不足以绕过AV。虽然有一些复杂的工具可以打包和加密二进制文件以避开AV,但一些相当简单的方法可能也能做到这一点。通过Base64编码我们的二进制文件并使用Invoke ReflectivePEInjection执行它,我们能够成功地避开AV检测。我们可以在Powershell中将二进制文件转换为base64,如下所示:

然后,我们需要创建一个包含base64编码二进制文件的Powershell脚本(在本例中,将Invoke ReflectivePEInjection放在同一目录中):

如果这还不足以避开AV,那么还有更多的可能性以更隐蔽的方式来做到这一点:

私钥的安全收集

为了安全地从中央服务器上的每个客户端系统收集证书,特别是它们的私钥,需要考虑不同的可能性:

前两个选项可以保护私钥免受未经授权的访问,而第三个选项还可以在传输时保护网络上的私钥。因此,我们决定用一个强而唯一的密码来保护每个证书的私钥,并用一个公钥来加密这个密码,而公钥又包含在提取脚本中。最终,每个证书的私钥在传输过程中都受到一个单独的强密码的保护,然后可以通过与用于加密的公钥对应的私钥在某个安全可信的系统上解密。

我们希望能与您分享一些新的技术细节!

干杯,

凯文