mimikatz 学习


mimikatz

mimikatz 是一个用来内网渗透的工具,之前一直只在取证的时候会拿来搞 windows 的密码,没怎么学,现在学一手这个工具是怎么使用的

mimikatz 介绍

项目地址:ParrotSec/mimikatz

mimikatz 有 win32 和 x64 版本,直接复制文件夹就可以使用,可以用来提权、注入进程和读取进程内存

mimikatz 主要是通过在 LSASS 中获取用户账户明文密码的,我们可以先了解这个基础知识

windows 认证机制

在 windows 中登录一个用户的时候,需要经过几个关键部分

  1. 本地认证:当用户登录本地计算机的时候,系统会检查存储在本地的 SAM 数据库,位于 %SystemRoot%\System32\config\SAM​,并且由 SYSTEM hive 保护,这里就存储着本地用户的账户信息和密码哈希,取证中也是利用这个来获取密码的
  2. 域认证:如果计算机是某个域(domain)的一部分,那么认证请求就会发送给域控制器(Domain Controller),这里和 SAM 一样,只不过存储的是域内所有用户的信息
  3. 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 攻击本质

  1. 攻击者获取到管理员权限
  2. 使用 privilege::debug 获取调试权限
  3. mimikatz 被授权读取 LSASS 进程的内存空间,查找 kerberos​、NTLM 等安全模块的数据结构
  4. 从这些数据中,mimikatz 提取并解密出需要的数据

mimikatz 使用

mimikatz 打开后是一个交互式的 shell,可以使用 模块名::命令[参数] 来使用各种命令

  • 每个模块都可以通过 模块名::未知命令​ 来获得详细讲解,比如 privilege::help

    image

模块

privilege

权限管理模块,用来启动进程的调试权限,这个权限允许用来调试原本无权访问的进程

命令 作用
debug 请求调试权限
  • 如果出现这种报错就是没有用管理员身份启动

sekurlsa

本地安全凭证提取模块,用来从 LSASS 内存中抓取当前登录或最近登录用户的各种凭证

要启用这个模块需要满足以下任意一个条件

  • 管理员,通过 privilege::debug 获取调试权限
  • SYSTEM​ 账户,通过后期利用工具,计划任务,psexec -s
  • 使用 lsass 转储文件

如果没有访问 lsass 进程的权限,那么这里的命令都会失败,就会出现如图的报错,这里是在 win11 下运行,可以发现哪怕有 debug也不行,就是访问不到 lsass 进程,除非使用 lsass 转储文件

image

命令 作用
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

image

这里获取了转储文件后就可以直接使用命令来读取了

minidump ./lsass.dmp

image

使用这个命令就可以获取到所有的凭证了

image

lsass 转储文件

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

image

第二个方法是利用一个工具

也得用管理员权限打开

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

image

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 基本使用 - 漫思 - 博客园

mimikatz使用笔记 | 独奏の小屋


文章作者: Marin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Marin !
  目录