Mimikatz抓取密码的底层原理是什么

1 人参与

在内网渗透的实战中,Mimikatz 几乎是无人不知的“神器”。很多初学者只记得那两条经典的命令:privilege::debugsekurlsa::logonpasswords,敲下回车,屏幕上就奇迹般地吐出了明文密码。但这背后的逻辑绝非魔法,Windows 操作系统为了实现单点登录(SSO)和 Kerberos 认证,必须在内存的某个角落暂存用户的凭证信息。Mimikatz 的本质,就是一场针对 LSASS 进程内存的精密“外科手术”。

LSASS:内存中的保险箱

要理解原理,首先得找准目标。Windows 系统中有一个核心进程叫 LSASS.exe(Local Security Authority Subsystem Service)。它负责处理安全策略、验证用户登录,是系统安全的“守门人”。

当用户登录系统成功后,为了方便后续的资源访问(比如访问网络共享、通过 Kerberos 获取票据),系统并不会立刻把凭证彻底销毁,而是会将明文密码或其哈希值暂时保存在 LSASS 进程的内存空间中。这就好比为了进出方便,把家里的备用钥匙藏在了门口的地垫下。Mimikatz 的工作,就是掀开这块地垫,直接拿走钥匙。

逆向工程的暴力美学

Mimikatz 的核心能力在于它掌握了微软未公开的内部数据结构。LSASS 内存中的数据并非杂乱无章,而是按照特定的结构体存储的。Mimikatz 通过逆向分析,找到了这些关键的数据结构,比如 LSA_UNICODE_STRING,它专门用来存储密码字符串。

在旧版本的 Windows(如 Windows 2000/2003/XP)中,系统甚至“懒惰”地直接存储明文密码。而在 Windows 7 / 2008 R2 及之后的版本中,微软引入了 WDigestKerberos 安全包。虽然默认不再存储明文,但 WDigest 协议为了兼容性,在某些情况下仍会保留明文副本,直到 KB2871997 补丁的出现才彻底改变了这一局面。

Sekurlsa 模块的“黑魔法”

Mimikatz 最核心的模块便是 sekurlsa。当执行 logonpasswords 命令时,它实际上在做什么?

  1. 提升权限:通过 privilege::debug 获取 SeDebugPrivilege 权限,这是调试系统进程的“通行证”。
  2. 注入与读取:程序会枚举当前系统的所有进程,找到 LSASS.exe,然后注入代码或直接读取其内存空间。
  3. 结构解析:它在内存中搜寻特定的特征码,定位到存储凭证的链表或结构体。它会遍历内存中的 LogonSession 列表,逐个提取其中的用户名、域名、NTLM Hash 以及明文密码(如果存在)。

这就好比拿着一张藏宝图(数据结构定义),在一座巨大的迷宫(LSASS 内存)中精准定位每一个宝箱,并打开它查看里面的内容。

防御与对抗的博弈

既然知道了原理,防御者的对策也就清晰了。微软推出的 Credential Guard(凭据保护) 是目前最有效的手段之一。它利用虚拟化技术(VBS),将 LSASS 进程中的关键凭证信息隔离在一个名为“隔离用户模式”的虚拟化容器中。

在这个模式下,即便攻击者拿到了 System 权限,甚至读取了 LSASS 的内存,看到的也只是一堆加密后的乱码,根本无法还原出 NTLM Hash 或明文密码。这就像是把保险箱从大厅搬进了金库,虽然大厅还是那个大厅,但核心资产已经物理隔离了。

攻防博弈从未停止,理解底层原理,才能在攻防两端做到游刃有余。

参与讨论

1 条评论
  • BoogieOstrich

    LSASS这设计就离谱,明文存内存里可还行

    回复