ShimCache 会记录被删除的文件吗?

约 1 分钟阅读

TL;DR. 会。一条 ShimCache 条目会留在注册表中,不管该文件是否还存在于磁盘上。删除二进制并不会删除它的 ShimCache 条目。这正是该工件为什么对抓住被攻击者投放、使用又抹除的工具如此有用的原因。

该缓存在注册表 value 中保存路径和时间戳。那个 value 与文件系统并没有关联。当 NTFS 释放掉该可执行文件时,注册表数据不会动。这就是为何这个工件值得抓取的全部理由,也是它有时是入侵唯一幸存证据的全部理由。

简短回答:是的

ShimCache 在 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache 这个 value 内保存路径以及文件的 $STANDARD_INFORMATION mtime。那条记录与文件系统并没有关联。当可执行文件被删除时,NTFS 释放该文件。注册表 value 不受影响。该条目会一直留在那里,直到被更新的条目挤出(缓存最多保存约 1,024 条),或者该 value 本身被清空。

所以一个被攻击者投放到 C:\Users\Public\、运行过、十分钟后被删除的二进制,仍然可以留下一条干净、可读的 ShimCache 条目,显示它曾经占据的完整路径。

为什么这在取证上很强大

被删除文件的条目往往是攻击者工具仅存的证据:

  • 在凭据窃取后被删除的改名 mimikatz.exe。
  • 外渗后被移除的 staging 压缩包。
  • 安装完 payload 后自删的 dropper。
  • 在传输前用来打包数据的 7z.exe 副本。

文件没了。缓存里的路径告诉你它曾经存在、在哪里,以及(通过 最后修改时间戳)把它绑定到某个 build。这就是 用 ShimCache 狩猎恶意软件 和 勒索软件调查 的脊梁,攻击者在这些场景里会例行地抹除工具。

请与 MFT 和 USN journal 交叉参照。如果 journal 仍带有先创建后删除的序列,你就有了一个干净的时间线锚点。回收站 几乎不会保留它们(它们绕过回收站),但仍可顺手看看。

被删除文件的条目能存活多久?

有两个限制:

  • 驱逐。 缓存的上限是大约 1,024 条。在繁忙的主机上,大量的可执行文件活动会把旧条目挤出去。在一台安静的服务器上,它可能存活数月。
  • flush 时机。 新条目只在 clean shutdown 时才被持久化到 hive。如果主机自删除以来未关机,幸存的条目可能只在内存里。从 RAM dump 中取出,见 内存提取指南。存储与刷新模型见 ShimCache 存放在哪里。

它不能证明的事

一条被删除文件的条目能证明该文件在该主机上存在过且被检查过。它不能证明该文件被执行过,也不能告诉你它何时被删除。时间戳是文件的 mtime,不是删除时间。把它当作强力的存在证人,并用 Prefetch 或 AmCache 佐证执行。见 ShimCache 能否证明执行。

要检查一份 hive 中哪些条目指向已不存在的文件,用 Shimcache Parser 解析它,并把这些路径与活动文件系统(或一份取证镜像)交叉参照。一切都在你的浏览器中本地完成。

延伸阅读

相关文章