利用MS-SAMR协议修改/重置用户密码
字数 1911 2025-08-03 16:43:04

利用MS-SAMR协议修改/重置用户密码技术详解

0x00 技术背景

MS-SAMR(Security Account Manager Remote Protocol)是Windows系统中用于远程管理用户账户的协议,允许管理员执行用户账户操作如创建、删除、修改密码等。在渗透测试中,当我们获取到域用户的NTLM哈希但无法解密出明文密码时,可以利用该协议修改用户密码。

0x01 利用场景

  1. 信息收集场景:拿下域控后需要搜集用户信息来寻找攻击路径
  2. 权限提升场景:利用某账户重置/修改目标账户密码
  3. 认证绕过场景:当目标系统不支持PTH(Pass-the-Hash)时,需要修改密码进行登录

0x02 两种利用方法

1. SetNTLM方法

效果:直接将域用户的密码或hash重置为新的密码或hash

利用条件

  • 当前身份对目标用户有"Reset Password"权限(域管理员通常具备此权限)

操作步骤

  1. 查看用户当前hash(使用DCSync):

    lsadump::dcsync /domain:domain.com /user:username
    
  2. 重置密码:

    lsadump::setntlm /server:<DC_IP_or_FQDN> /user:username /password:new_password
    
  3. 使用后恢复原hash:

    lsadump::setntlm /server:<DC_IP_or_FQDN> /user:username /ntlm:Original_Hash
    

2. ChangeNTLM方法

效果:在知道当前密码/hash的情况下更改为新密码

利用条件

  • 对目标用户有"Change Password"权限(Everyone通常拥有此权限)
  • 受域密码策略限制:
    • "密码最短使用期限"(默认1天,每天只能修改一次)
    • "强制密码历史"规则(可能阻碍恢复原密码)

操作步骤

  1. 修改用户密码:

    lsadump::changentlm /server:<DC_IP_or_FQDN> /user:username /old:current_hash /newpassword:newpassword
    
  2. 恢复原密码:

    lsadump::changentlm /server:<DC_IP_or_FQDN> /user:username /oldpassword:current_password_plain_text /new:original_hash
    

0x03 技术原理

1. API调用差异

  • ChangeNTLM:调用SamrChangePasswordUser API
  • SetNTLM:调用SamrSetInformationUser API

2. 完整调用流程

  1. SamrConnect5:获取Server对象句柄
  2. SamrEnumerateDomainsInSamServer:枚举Server上的域名
  3. SamrLookupDomainInSamServer:获取域名对应域的SID
  4. SamrOpenDomain:获取Domain对象句柄
  5. SamrLookupNamesInDomain:获取指定用户的RID
  6. SamrOpenUser:获取User对象句柄
  7. SamrChangePasswordUser/SamrSetInformationUser:修改/重置密码

3. 实现注意事项

  • 直接调用SamrChangePasswordUser时需要指定LMCross和NewLmEncryptedWithNewNt参数
  • LM Hash已弃用,可使用空密码对应的LM Hash(AAD3B435B51404EEAAD3B435B51404EE)

0x04 检测与防御

1. 检测方法

ChangeNTLM检测

  • 日志事件:4723(尝试更改账户密码)、4738(用户账户更改)
  • 流量特征
    • SamrOpenUser操作中Samr User Access Change Password标志位=1
    • 调用SamrChangePasswordUser(操作数38)

SetNTLM检测

  • 日志事件:4724(尝试重置账户密码)、4661(SAM对象操作)、4738(用户账户更改)
  • 流量特征
    • SamrOpenUser操作中Samr User Access Set Password标志位=1
    • 调用SamrSetUserInformation(操作数37)

2. 防御措施

  1. 针对ChangeNTLM

    • 设置"密码最短使用期限"≥1天
    • 启用"强制密码历史"规则(建议≥5个)
  2. 针对SetNTLM

    • 严格控制重置密码权限分配
    • 监控异常密码重置行为
  3. 通用防御

    • 启用详细审计策略(账户管理事件)
    • 部署SIEM系统分析异常日志模式
    • 限制域管理员账户使用范围

0x05 工具实现

1. 调用samlib导出函数

参考Mimikatz实现方式,直接调用samlib.dll中的导出函数:

  • SamiChangePasswordUser对应SamrChangePasswordUser
  • 参数更加简化

2. 直接调用MS-SAMR协议

C语言实现

  1. 使用MS-SAMR IDL生成.h和.c文件
  2. 处理STATUS_LM_CROSS_ENCRYPTION_REQUIRED错误
  3. 实现LM Hash加密逻辑

Impacket实现

已向Impacket项目提交PR,可直接使用其SAMR协议实现:

from impacket.dcerpc.v5 import samr
# 修改密码实现代码

0x06 参考资源

  1. MS-SAMR协议官方文档
  2. Mimikatz源码实现
  3. Stealthbits相关技术分析
利用MS-SAMR协议修改/重置用户密码技术详解 0x00 技术背景 MS-SAMR(Security Account Manager Remote Protocol)是Windows系统中用于远程管理用户账户的协议,允许管理员执行用户账户操作如创建、删除、修改密码等。在渗透测试中,当我们获取到域用户的NTLM哈希但无法解密出明文密码时,可以利用该协议修改用户密码。 0x01 利用场景 信息收集场景 :拿下域控后需要搜集用户信息来寻找攻击路径 权限提升场景 :利用某账户重置/修改目标账户密码 认证绕过场景 :当目标系统不支持PTH(Pass-the-Hash)时,需要修改密码进行登录 0x02 两种利用方法 1. SetNTLM方法 效果 :直接将域用户的密码或hash重置为新的密码或hash 利用条件 当前身份对目标用户有"Reset Password"权限(域管理员通常具备此权限) 操作步骤 查看用户当前hash(使用DCSync): 重置密码: 使用后恢复原hash: 2. ChangeNTLM方法 效果 :在知道当前密码/hash的情况下更改为新密码 利用条件 对目标用户有"Change Password"权限(Everyone通常拥有此权限) 受域密码策略限制: "密码最短使用期限"(默认1天,每天只能修改一次) "强制密码历史"规则(可能阻碍恢复原密码) 操作步骤 修改用户密码: 恢复原密码: 0x03 技术原理 1. API调用差异 ChangeNTLM :调用 SamrChangePasswordUser API SetNTLM :调用 SamrSetInformationUser API 2. 完整调用流程 SamrConnect5 :获取Server对象句柄 SamrEnumerateDomainsInSamServer :枚举Server上的域名 SamrLookupDomainInSamServer :获取域名对应域的SID SamrOpenDomain :获取Domain对象句柄 SamrLookupNamesInDomain :获取指定用户的RID SamrOpenUser :获取User对象句柄 SamrChangePasswordUser / SamrSetInformationUser :修改/重置密码 3. 实现注意事项 直接调用 SamrChangePasswordUser 时需要指定LMCross和NewLmEncryptedWithNewNt参数 LM Hash已弃用,可使用空密码对应的LM Hash(AAD3B435B51404EEAAD3B435B51404EE) 0x04 检测与防御 1. 检测方法 ChangeNTLM检测 日志事件 :4723(尝试更改账户密码)、4738(用户账户更改) 流量特征 : SamrOpenUser 操作中 Samr User Access Change Password 标志位=1 调用 SamrChangePasswordUser (操作数38) SetNTLM检测 日志事件 :4724(尝试重置账户密码)、4661(SAM对象操作)、4738(用户账户更改) 流量特征 : SamrOpenUser 操作中 Samr User Access Set Password 标志位=1 调用 SamrSetUserInformation (操作数37) 2. 防御措施 针对ChangeNTLM : 设置"密码最短使用期限"≥1天 启用"强制密码历史"规则(建议≥5个) 针对SetNTLM : 严格控制重置密码权限分配 监控异常密码重置行为 通用防御 : 启用详细审计策略(账户管理事件) 部署SIEM系统分析异常日志模式 限制域管理员账户使用范围 0x05 工具实现 1. 调用samlib导出函数 参考Mimikatz实现方式,直接调用samlib.dll中的导出函数: SamiChangePasswordUser 对应 SamrChangePasswordUser 参数更加简化 2. 直接调用MS-SAMR协议 C语言实现 使用MS-SAMR IDL生成.h和.c文件 处理 STATUS_LM_CROSS_ENCRYPTION_REQUIRED 错误 实现LM Hash加密逻辑 Impacket实现 已向Impacket项目提交PR,可直接使用其SAMR协议实现: 0x06 参考资源 MS-SAMR协议官方文档 Mimikatz源码实现 Stealthbits相关技术分析