在实际内网攻防演练中,一个极具挑战性的场景是:攻击者历经多层突破后成功进入虚拟化集群挂载的 NAS 存储,发现其中保存着域控、管理员工作站等关键虚拟机的 .vmdk、.vmsn、.sav 等文件。然而,由于网络带宽受限,一个上百 GB 的磁盘镜像往往需要数天才能完整传输。长时间的数据外传不仅效率极低,同时也会显著增加被 SOC 平台发现并切断渗透链路的概率。
虚拟机在运行过程中,其内存状态能够被完整序列化并保存至磁盘,也就是常见的 Snapshot(快照)或挂起状态文件。这些文件实际上保留了虚拟机当时的全部内存内容,包括尚未落盘的 LSASS 进程数据、域管理员 NTLM 哈希、Kerberos 票据、BitLocker 密钥等敏感信息。
VMkatz 是一款基于 Rust 编写的命令行工具,可直接解析虚拟机内存快照文件(.vmsn)、虚拟磁盘文件(.vmdk、.qcow2、.vdi)以及 LSASS Minidump 文件,并从中提取 Windows 系统中的主流凭据数据。
整个工具编译后仅约 3MB,为静态二进制文件,无需额外依赖,可直接在 ESXi、Proxmox 或 NAS 等环境中运行。
无需传输大型镜像、无需启动虚拟机、不会产生系统日志,网络流量仅 KB 级别。
上传一个 3MB 的工具后,仅需执行一条命令即可快速提取凭据。
支持私有云、IDC 虚拟化平台、混合云以及 NAS 存储环境。
采用静态编译方式,可直接在 Linux / ESXi 等环境裸跑,无库依赖冲突问题。
VMkatz 基本实现了 Mimikatz 所支持的主流 SSP 凭据提取能力,支持以下数据类型:
| 类型 | 说明 |
|---|---|
| NTLM 哈希 | 提取本地账户及域账户的 NT/LM Hash |
| Kerberos 票据 | 可导出为 .kirbi 或 .ccache 格式,用于票据传递 |
| DPAPI 主密钥 | 生成适用于 Hashcat 的 $DPAPImk$ 格式哈希 |
| LSA Secrets | 提取服务账户密码、自动登录信息、机器账户密钥 |
| SAM 哈希 | 获取本地账户 NT/LM Hash 及账户状态 |
| 缓存域凭据 | 提取 DCC2 格式的缓存域登录信息 |
| NTDS.dit | 从域控磁盘直接导出完整 AD 哈希 |
| BitLocker FVEK | 从内存池中提取 BitLocker 全卷加密密钥 |
VMkatz 使用方式较为简单,可前往 GitHub 获取源码自行编译,或直接下载 Release 版本使用。
以下示例基于笔者此前创建的 VMware Windows 10 虚拟机文件进行测试。
提取到的 Hash 数据还可通过 cmd5 等平台进行识别或验证。
.vmsn 快照文件./vmkatz snapshot.vmsn
./vmkatz --disk disk.vmdk snapshot.vmsn
该方式可恢复更多已换出的内存内容,提取结果更完整。
VMkatz 会自动解析磁盘中的 NTFS 文件系统,定位并读取注册表 Hive(SAM、SYSTEM、SECURITY),进而提取本地账户 Hash、LSA Secrets 与缓存域凭据。
./vmkatz disk.vmdk
./vmkatz disk.qcow2
该操作效果等同于执行一次 ntdsutil 或卷影复制导出,但无需登录域控系统,也不会产生运行时痕迹。
./vmkatz --ntds dc-disk.qcow2
VMkatz 能自动发现目录中的 .vmsn、.vmdk 等文件并进行综合分析,适用于已获取 datastore 访问权限后的批量处理场景。
./vmkatz /path/to/vm-directory/
可一次性扫描整个存储中的所有虚拟机。
./vmkatz -r /vmfs/volumes/datastore1/
适用于单独获取到注册表文件的场景,例如通过 Volume Shadow Copy 导出的副本。
./vmkatz SAM SYSTEM SECURITY
兼容标准 Minidump 格式,可替代传统 Mimikatz 的离线解析方式,适用于无法直接运行 Mimikatz 的环境。
./vmkatz lsass.dmp