欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

探索Mimikatz神器之SSP

来源:本站整理 作者:佚名 时间:2019-07-10 TAG: 我要投稿

在本系列的第一部分中,我们开始深入研究 Mimikatz。这个想法很简单就是为了揭示 Mimikatz 是如何施展它的魔力的以及说明如何开发自定义的和特定的有效载荷。 如果你还没有机会去一探究竟,请先移步到本系列文0章的第一部分。 接下来,在这篇文章中,我们将回顾一下突破微软新增的防止凭证转储的安全控制(如 Credential Guard)的一种好方法并提取受害者提供的凭证。 当然,这也是 Mimikatz 支持 SSP 的原因。
安全支持提供程序(Security Support Provider,SSP)是一个 DLL,它允许开发人员公开在某些身份验证和授权事件期间调用的许多回调。 正如我们在上一篇文章中看到的,WDigest 提供了使用这个确切的接口进行凭证缓存的能力。
Mimikatz 提供了一些不同的技术来利用 SSP。 首先是"Mimilib",它是一个带有各种功能的 DLL,其中一个就是实现 Security Support Provider 接口。 其次,还有"memssp",这是另外一种有趣的实现相同目标的方式,但它依赖于内存补丁,而不是通过加载一个 DLL 实现。
让我们从加载 SSP 的传统方法——Mimilib 开始探索之旅。
注意: 正如在上一篇文章中提到的,这篇文章大量使用了 Mimikatz 的源代码以及开发人员花费的无数时间。 感谢 Mimikatz, Benjamin Delpy 和 Vincent Le Toux 出色的研究工作。
Mimilib
Mimilib 有点像变色龙,支持 ServerLevelPluginDll 通过 RPC、DHCP 服务器 Callout 进行横向移动,甚至还可以作为 WinDBG 的扩展。 然而,出于我们的目的,我们将研究这个库如何作为一个 SSP,为攻击者提供一种方法来检索由受害者输入的凭证。
Mimilib 的工作原理是利用 SSP 接口使用明文凭证调用Security Support Provider。 这意味着凭证被以明文的方式漏出。 Mimilib 的 SSP 功能的入口点可以在 kssp.c 文件中找到,主要的入口是 kssp_SpLsaModeInitialize。 该函数通过 mimilib.def 这个定义文件从 DLL 中导出名为 SpLsaModeInitialize 的函数,并由 lsass 进程用于初始化一个包含多个回调的结构体。
以 Mimilib 为例,注册的回调方式如下:
· SpInitialize – 用于初始化 SSP 并提供函数指针列表
· SpShutDown – 在卸载 SSP 时提供释放资源的机会
· SpGetInfoFn – 提供有关于 SSP 的信息,包括版本、名称和描述
· SpAcceptCredentials – 接收 LSA 传递的明文凭证,并由 SSP 进行缓存
当然,如果你阅读了上一篇文章,你会发现 WDigest 使用 SpAcceptCredentials 来缓存凭证,因此,这导致产生了我们多年来一直在“享用”的漏洞。
随着每个回调的填充,并且知道系统将通过一个明文凭证的副本来调用 SpAcceptCredentials,之后 Mimilib 所需要做的就是按提供的方式存储凭证,这正是 kssp_SpAcceptCredentials 所做的事情:
NTSTATUS NTAPI kssp_SpAcceptCredentials(SECURITY_LOGON_TYPE LogonType, PUNICODE_STRING AccountName, PSECPKG_PRIMARY_CRED PrimaryCredentials, PSECPKG_SUPPLEMENTAL_CRED SupplementalCredentials)
{
 FILE *kssp_logfile;
#pragma warning(push)
#pragma warning(disable:4996)
 if(kssp_logfile = _wfopen(L"kiwissp.log", L"a"))
#pragma warning(pop)
 { 
  klog(kssp_logfile, L"[%08x:%08x] [%08x] %wZ\\%wZ (%wZ)\t", PrimaryCredentials->LogonId.HighPart, PrimaryCredentials->LogonId.LowPart, LogonType, &PrimaryCredentials->DomainName, &PrimaryCredentials->DownlevelName, AccountName);
  klog_password(kssp_logfile, &PrimaryCredentials->Password);
  klog(kssp_logfile, L"\n");
  fclose(kssp_logfile);
 }
 return STATUS_SUCCESS;
}
现在,我不认为 mimikatz.exe 提供了支持直接加载 Mimilib 的功能,但是我们从微软的文档中可以知道,通过添加注册表键和并重新启动,就可以添加 SSP。
然而,经过一番搜索,我发现了这条推文:

推文的意思当然是在说对 API  AddSecurityPackage 的引用,这实际上是@mattifestation 编写的 Install-SSP.ps1 脚本中加载 SSP 所使用的方法。 这意味着,实际上我们可以在不重新启动系统的情况下加载 Mimilib。 加载后,我们发现每次提取凭证的尝试都会导致凭证被写入到 kiwissp.log 文件中:

 
现在,在成熟的环境中使用 SSP 有一个缺点,那就是 SSP 必须在 lsass 进程中进行注册。 这使得防御者在试图跟踪恶意活动时可以使用大量的工件,无论是为引用 SSP 而创建的注册表项,还是 lsass 进程中的某一个不正常的 DLL 模块。 我们还可以看到 SSP 公开了名称和注释这两个字段,可以使用 EnumerateSecurityPackages 函数进行枚举,如下:
#define SECURITY_WIN32
#include
#include
#include
int main(int argc, char **argv) {
 ULONG packageCount = 0;
 PSecPkgInfoA packages;
 if (EnumerateSecurityPackagesA(&packageCount, &packages) == SEC_E_OK) {
  for (int i = 0; i
正如我们可以在下面所看到的,输出结果显示了每个已加载的 SSP 的信息,这意味着 Mimilib 可能比较显眼:
 

那么,我们该怎么做才能避免一眼就看出 Mimilib 呢? 显而易见的做法是修改 Mimilib 的 SpGetInfo 回调所返回的描述,这个回调被硬编码为如下内容:

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载