利用MS-SAMR协议修改/重置用户密码
字数 1911 2025-08-03 16:43:04
利用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):
lsadump::dcsync /domain:domain.com /user:username -
重置密码:
lsadump::setntlm /server:<DC_IP_or_FQDN> /user:username /password:new_password -
使用后恢复原hash:
lsadump::setntlm /server:<DC_IP_or_FQDN> /user:username /ntlm:Original_Hash
2. ChangeNTLM方法
效果:在知道当前密码/hash的情况下更改为新密码
利用条件
- 对目标用户有"Change Password"权限(Everyone通常拥有此权限)
- 受域密码策略限制:
- "密码最短使用期限"(默认1天,每天只能修改一次)
- "强制密码历史"规则(可能阻碍恢复原密码)
操作步骤
-
修改用户密码:
lsadump::changentlm /server:<DC_IP_or_FQDN> /user:username /old:current_hash /newpassword:newpassword -
恢复原密码:
lsadump::changentlm /server:<DC_IP_or_FQDN> /user:username /oldpassword:current_password_plain_text /new:original_hash
0x03 技术原理
1. API调用差异
- ChangeNTLM:调用
SamrChangePasswordUserAPI - SetNTLM:调用
SamrSetInformationUserAPI
2. 完整调用流程
SamrConnect5:获取Server对象句柄SamrEnumerateDomainsInSamServer:枚举Server上的域名SamrLookupDomainInSamServer:获取域名对应域的SIDSamrOpenDomain:获取Domain对象句柄SamrLookupNamesInDomain:获取指定用户的RIDSamrOpenUser:获取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协议实现:
from impacket.dcerpc.v5 import samr
# 修改密码实现代码