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 解析它,并把这些路径与活动文件系统(或一份取证镜像)交叉参照。一切都在你的浏览器中本地完成。
延伸阅读
- Mandiant 的 Caching Out the Val:把 ShimCache 当作被删工具证人的论据。
- SANS DFIR program execution poster:ShimCache 在执行证据中的位置。