mimikatz
mimikatz 是一个用来内网渗透的工具,之前一直只在取证的时候会拿来搞 windows 的密码,没怎么学,现在学一手这个工具是怎么使用的
mimikatz 介绍
项目地址:ParrotSec/mimikatz
mimikatz 有 win32 和 x64 版本,直接复制文件夹就可以使用,可以用来提权、注入进程和读取进程内存
mimikatz 主要是通过在 LSASS 中获取用户账户明文密码的,我们可以先了解这个基础知识
windows 认证机制
在 windows 中登录一个用户的时候,需要经过几个关键部分
- 本地认证:当用户登录本地计算机的时候,系统会检查存储在本地的 SAM 数据库,位于
%SystemRoot%\System32\config\SAM,并且由SYSTEM hive保护,这里就存储着本地用户的账户信息和密码哈希,取证中也是利用这个来获取密码的 - 域认证:如果计算机是某个域(domain)的一部分,那么认证请求就会发送给域控制器(Domain Controller),这里和 SAM 一样,只不过存储的是域内所有用户的信息
- LSASS:无论是本地登录或是域登录,LSASS 都是核心,是一个关键的 windows 进程,负责强制执行系统的安全策略
而在 windows 环境,尤其是域环境中,最常用的两种身份验证协议是 kerberos 和 NTLM
NTLM
NTLM 是比较老的认证协议,现在主要用于 kerberos 认证失败的备用机制
工作流程:
- 客户端尝试连接服务器,并发送用户名
- 服务器发送一个随机生成的 challenge 给客户端
- 客户端利用本地存储的用户密码哈希值加密这个 challenge ,生成一个 response,发送回服务端
- 服务端将 challenge、response、用户名转发给域控制器(DC)
- DC 会用存储的密码哈希对 challenge 进行计算,然后客户端结果对比,匹配则认证成功
攻击方式:
Pass-the-Hash (PtH): 这里的攻击方法是由于 NTLM 使用的是密码哈希值而不是明文,所以只要获取到哈希值就可以伪造 response
kerberos
kerberos 主要依赖时间同步和票据(Ticket)进行认证
这里会有三个角色,除了客户端和服务器之外,还有一个 KDC
KDC 是域控制器上的一个服务,负责分发 ticket,KDC还有两个子服务
AS:认证服务
TGS:ticket 授予服务
工作流程:
- 客户端向
KDC 的AS 服务发送包含用户身份和时间戳的请求,AS 验证用户身份后,发送一个TGT(Ticket Granting Ticket)票据,这里的时间戳是为了防止重放 - 客户端使用
TGT 向TGS 申请访问特定服务的Service Ticket - 客户端使用这个
Service Ticket取访问服务,服务器验证后就授予访问权限
攻击方式:
Kerberoasting:请求服务的 TGS,将返回可离线破解的票据,用于暴力破解服务账户密码
Golden Ticket:窃取或伪造 krbtgt 密钥,域内极高权限,可以签发任意 TGT
Silver Ticket:伪造 Service Ticket 这个只需要服务账号密钥,用来绕过 KDC
Pass-the-Ticket (PtT) :窃取并重用 Kerberos ticket(TGT/TGS)
LSASS
mimikatz 的关键就在 LSASS 中,所以要理解这个有什么作用
LSASS 的进程名都是 lsass.exe 始终都是以极高权限运行
LSASS 的主要职责围绕着用户和系统的安全验证、授权和管理
LSASS 有以下一些功能
执行认证:当用户登录时,LSASS 都会与安全提供程序(
kerberos 或NTLM)交互,验证密码或凭证是否正确凭证缓存:这里是 mimikatz 关注的重点,为了实现 单点登录 (SSO)的功能,即用户登录一次后可以访问资源无需重复输入密码,LSASS 会在内存中缓存用户的凭证,包括以下几种
- 明文密码
- 密码哈希值
Kerberos票据
访问控制:当用户访问资源试,LSASS 会检查用户的权限
mimikatz 攻击本质
- 攻击者获取到管理员权限
- 使用
privilege::debug获取调试权限 - mimikatz 被授权读取 LSASS 进程的内存空间,查找
kerberos、NTLM等安全模块的数据结构 - 从这些数据中,mimikatz 提取并解密出需要的数据
mimikatz 使用
mimikatz 打开后是一个交互式的 shell,可以使用 模块名::命令[参数] 来使用各种命令
每个模块都可以通过
模块名::未知命令 来获得详细讲解,比如privilege::help
模块
privilege
权限管理模块,用来启动进程的调试权限,这个权限允许用来调试原本无权访问的进程
| 命令 | 作用 |
|---|---|
debug |
请求调试权限 |
如果出现这种报错就是没有用管理员身份启动

sekurlsa
本地安全凭证提取模块,用来从 LSASS 内存中抓取当前登录或最近登录用户的各种凭证
要启用这个模块需要满足以下任意一个条件
- 管理员,通过
privilege::debug获取调试权限 SYSTEM 账户,通过后期利用工具,计划任务,psexec -s- 使用 lsass 转储文件
如果没有访问 lsass 进程的权限,那么这里的命令都会失败,就会出现如图的报错,这里是在 win11 下运行,可以发现哪怕有 debug也不行,就是访问不到 lsass 进程,除非使用 lsass 转储文件

| 命令 | 作用 |
|---|---|
logonpasswords |
提取所有登录会话的凭证 |
minidump |
载入转储的 lsass.dmp 文件 |
kerberos |
专门从 LSASS 内存中定位并显示 Kerberos 认证包所缓存的凭证信息 |
pth |
就是前面提到的 Pass-the-Hash |
tickets |
查看进程中所有的票据 |
wdigest |
只提取明文密码 |
msv |
只提取 ntlm 哈希凭证 |
这里解析一下
pth参数列表
/user:要冒充的用户名/domain:完全限定的域名,没有域或者在本地用户/管理员的情况下,使用计算机或服务器名称、workgroup等/htlm:用户的 NTLM 密码哈希值/run:可选,要运行的命令行/rc4、/aes128、/aes256:这些都是可选的密钥这个在 windows 最新版本也有效,这里获取 hash 可以使用
lsass.dmp 转储或者使用SAM SYSTEM获取sekurlsa::pth /user:marin /domain:. /ntlm:579110c49145015c47ecd267657d3174
这里获取了转储文件后就可以直接使用命令来读取了
minidump ./lsass.dmp
使用这个命令就可以获取到所有的凭证了

lsass 转储文件
最简单的方法就是在任务管理器中找到进程,然后创建转储文件

第二个方法是利用一个工具
也得用管理员权限打开
procdump64.exe -accepteula -ma lsass.exe lsass.dmp

standard
这个模块的命令可以直接使用,不需要指定模块名
| 命令 | 作用 |
|---|---|
exit |
退出 |
cls |
清屏 |
log |
输出日志 |
base64 |
切换输入输出为 base64 形式 |
version |
获取 mimikatz 和 windows 版本 |
cd |
切换工作目录 |
lsadump
lsadump 模块主要从存储在磁盘上的本地安全数据库(SAM)或域控制器上的安全数据库中提取账户信息或哈希值
| 命令 | 作用 |
|---|---|
sam |
提取 SAM 中所有本地用户的 NTLM 哈希值 |
lsa |
提取 lsa secrets |
dcsync |
从远程域控制器中请求指定用户的密码哈希 |
cache |
提取离线域登录缓存 |
这个模块有一个命令经常用于取证获取用户 NTLM 哈希,要获取这两个文件
lsadump::sam /sam:SAM /system:SYSTEM
参考:
【内网渗透】mimikatz 基本使用 - 漫思 - 博客园

