Shellbags + Jump Lists + Prefetch:Windows 行为痕迹三部曲
原创
Pik安全实验室
Pik安全实验室
Pik安全实验室
2026年6月22日 09:30
广东
在小说阅读器读本章
去阅读
Pik 安全团队 | 2026-06-22
应急排查中有一个常见困境:攻击者清掉了浏览器历史,删了下载目录里的文件,安全日志被 1102 清空。看起来什么都没留下。但有三类痕迹,攻击者几乎从来不碰——不是不想,是不知道它们存在。
这三类痕迹分别是 Shellbags、Jump Lists、Prefetch。它们各自记录一个维度的用户行为,合在一起可以还原一台机器上\"谁在什么时间用资源管理器浏览了哪些目录、打开了哪些文件、运行了哪些程序\"。
一、Shellbags:资源管理器的\"浏览记忆\"
Shellbags 记录的是用户通过资源管理器(explorer.exe)浏览过的所有目录结构、窗口位置、最后访问时间。只要你在资源管理器里点开过一个文件夹,它就留下了记录。
存储位置
NTUSER.DAT\Software\Microsoft\Windows\Shell\BagMRU → 目录结构树
NTUSER.DAT\Software\Microsoft\Windows\Shell\Bags → 窗口属性(大小/位置/视图模式)
USRCLASS.DAT\Local Settings\Software\Microsoft\Windows\Shell\BagMRU → 桌面/下载等特殊目录
USRCLASS.DAT\Local Settings\Software\Microsoft\Windows\Shell\Bags
BagMRU 的结构
BagMRU 是一个树形结构。根节点是桌面,每个子节点编号(0, 1, 2...)代表一个用户访问过的文件夹。子节点本身又是一个 BagMRU 节点,递归记录该文件夹内的子文件夹访问。
Desktop (根)
├── 0 → 此电脑
│ ├── 0 → C:\
│ │ ├── 0 → C:\Users
│ │ │ ├── 0 → Administrator
│ │ │ │ ├── 0 → Desktop
│ │ │ │ ├── 1 → Downloads
│ │ │ │ └── 2 → Documents\敏感数据
│ │ │ └── 1 → Public
│ │ └── 1 → C:\Windows\Temp
│ └── 1 → D:\
└── 1 → 回收站
关键字段
| 字段 | 含义 | 取证价值 |
| MRUListEx | 最近使用的顺序(4字节一组,从最近到最远) | 确定访问先后 |
| NodeSlot | 节点编号 | 关联 BagMRU 和 Bags |
| LastWriteTime (注册表键) | 该目录最后一次被浏览的时间 | 时间锚点 |
Shellbags 的三个独特能力
- 记录已删除的目录
即使攻击者删除了 C:\Tools\payload\ 目录,Shellbags 中对该路径的记录仍然存在。直到对应的注册表键被覆盖或被清理工具专门清除。
- 记录 ZIP 文件内部结构
如果用户通过资源管理器直接打开 ZIP 文件(双击打开,不是解压),Shellbags 会记录 ZIP 内部的目录树。Windows 把 ZIP 当作一个虚拟文件夹处理:C:\Users\xxx\Downloads\payload.zip → payload.zip\cmd\。这意味着即使攻击者解压后删掉了文件,Shellbags 里可能还留着压缩包内部的目录名。
- 天然关联用户
每个 NTUSER.DAT 只属于一个用户。Shellbags 不会出现\"不知道是谁操作的\"这种问题。
解析工具
- ShellbagExplorer (Eric Zimmerman):直接读取注册表 Hive 文件,图形化展示目录树,支持时间排序
- 系统 regedit 不行——它只能看到二进制数据,无法解码 BagMRU 的 MRU 顺序和时间
排查实战
场景:某员工笔记本电脑失陷,怀疑数据被窃取。
排查步骤:
-
加载 NTUSER.DAT 到 ShellbagExplorer
-
按 LastWriteTime 排序,找到攻击时间段内的所有浏览记录
-
搜索关键字:财务、客户、工资、.xlsx、.docx、USB 盘符(D:\ E:\ F:\)
-
从目录层级还原:攻击者从桌面 → 此电脑 → C:\ → Users → 员工名 → Documents → 财务数据 → 复制到 → D:\(USB)
Shellbags 给不出\"文件被复制了\"这个结论,但它能给出\"攻击者导航到了这个目录\"。配合 Jump Lists 和 LNK 文件可以补上\"打开了哪个文件\"的拼图。
二、Jump Lists:最近打开文件的\"签到表\"
Jump Lists 是 Windows 7 之后的任务栏快捷跳转列表。每当用户打开一个文件,系统会在这个文件中记录文件名、完整路径、打开时间。
存储位置
%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\ → \.automaticDestinations-ms
%APPDATA%\Microsoft\Windows\Recent\CustomDestinations\ → \.customDestinations-ms
文件命名规则
AutomaticDestinations 的文件名是应用程序 ID(AppID)的 MS-SHLLINK 格式。例如:
| 文件名 | 对应程序 |
| f01b4d95cf55d32a.automaticDestinations-ms | 资源管理器 (explorer.exe) |
| 9b9cdc69c1c24e2b.automaticDestinations-ms | 记事本 (notepad.exe) |
| aaa3a5b0b0e3c46e.automaticDestinations-ms | Office Word |
| b8ab77100df80e3e.automaticDestinations-ms | 远程桌面 (mstsc.exe) |
关键是最后一个——mstsc.exe 的 Jump List 会记录攻击者通过 RDP 连接过的目标 IP 或主机名。用 JumpList Explorer 打开对应的 .automaticDestinations-ms 文件,可以直接看到 RDP 连接历史。
每条记录包含的信息
| 字段 | 说明 |
| 文件名 | 打开的文件名(如 2026年客户清单.xlsx) |
| 完整路径 | 文件的绝对路径(如 C:\Users\xxx\Desktop\2026年客户清单.xlsx) |
| 最近访问时间 | 最后一次通过该程序打开的时间 |
| 目标文件属性 | 文件大小、创建/修改时间(部分文件记录) |
Jump Lists vs LNK 文件
| Jump Lists | LNK 文件 |
| 存储位置 | AutomaticDestinations/CustomDestinations |
| 记录方式 | 按程序聚合多个文件 |
| 保留策略 | Taskband 策略控制数量(通常保留最近几十条) |
| 攻击者清理难度 | 极少有人知道这个目录 |
排查实战
场景:怀疑有人通过 RDP 连到了域控。
- 打开 %APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\
- 找到 mstsc.exe 对应的 .automaticDestinations-ms(AppID: b8ab77100df80e3e)
- JumpList Explorer 打开 → 目标地址列表
- 看到 dc01.company.local、192.168.1.10、10.0.0.50
- 交叉验证:UserAssist 中 mstsc.exe 的启动时间
与 Shellbags 的协同
Shellbags 告诉你的攻击者\"去了哪个文件夹\",Jump Lists 告诉你\"打开了哪个文件\"。两者时间线对齐:
2026-06-21 03:15:22 Shellbag → C:\Users\admin\Documents\财务\
2026-06-21 03:15:45 JumpList → 2026年Q2财报.xlsx (Excel 打开)
2026-06-21 03:17:10 Shellbag → D:\ (USB 设备)
2026-06-21 03:17:30 JumpList → 2026年Q2财报.xlsx (从 D:\ 打开)
同一文件先在 C 盘打开,三分钟后在 D 盘(USB)再次打开 → 数据被拷到了 U 盘上。
三、Prefetch:程序的\"运行计数器\"
Prefetch 是 Windows 的应用预加载机制。每次程序启动,Windows 会在 C:\Windows\Prefetch\ 目录下创建或更新一个 .pf 文件,记录程序执行次数、最后一次执行时间、加载的文件列表。
文件路径
C:\Windows\Prefetch\\*.pf
命名格式:程序名-路径哈希.pf
例如:
MSTSC.EXE-A5D3F9B2.pf → 远程桌面客户端
CMD.EXE-4A81B2C7.pf → 命令行
POWERSHELL.EXE-8D7F3A1C.pf → PowerShell
.pf 文件内的关键字段
| 字段 | 偏移 | 含义 |
| 执行次数 | 0x?? | 该程序在系统上被执行了多少次 |
| 最后执行时间 | 文件 LastWriteTime | 程序最后一次被运行的时间 |
| 之前执行时间 | 文件内部时间戳 | 倒数第二次、倒数第三次执行时间(最多记录8次) |
| 加载的文件列表 | 文件末尾 | 程序启动时加载的 DLL 和资源文件 |
为什么攻击者可能删不掉或被注意到
-
Prefetch 文件能被删除,但删除本身会留下痕迹——管理员如果之前做过系统基线,少了某些 .pf 文件就是告警
-
Prefetch 目录有大量合法系统文件(SvcHost.exe、explorer.exe 等几百个),攻击者删掉某个文件不容易被注意到——前提是他知道该删哪个
-
但如果攻击者把整个 Prefetch 目录清空,管理员登录后会立即注意到性能卡顿(所有程序重新生成 .pf)以及文件数量异常
排查技巧
用 WinPrefetchView (NirSoft) 或直接 PowerShell:
Get-ChildItem C:\Windows\Prefetch\\*.pf | Sort-Object LastWriteTime -Descending | Select-Object Name, LastWriteTime, Length -First 30
重点关注:
-
非系统目录下的 exe(如 C:\Users\xxx\AppData\Local\Temp\payload.exe)
-
在攻击时间窗口内首次出现或修改的 .pf 文件
-
同一程序短时间内多次执行(如 cmd.exe 或 powershell.exe 的 .pf 文件反复更新)
与 RDP 取证联动
之前《RDP取证全攻略》中提到的关键时间锚点:
源主机:
MSTSC.EXE-\*.pf → 攻击者启动 RDP 客户端的时间
目标主机:
TSTHEME.EXE-\.pf → RDP 远端进入桌面的时间(远程桌面主题服务启动)
RDPCLIP.EXE-\.pf → RDP 剪贴板重定向启动(攻击者可能在做复制粘贴)
这三个 Prefetch 时间相差几秒到几十秒,就是 RDP 横向移动的精确时间窗口。
三部曲合体:还原完整行为链
把 Shellbags、Jump Lists、Prefetch 三条时间线放入同一个时间轴,你几乎可以还原攻击者在图形界面上的每一步操作:
03:14:55 Prefetch MSTSC.EXE → 启动 RDP 客户端
03:15:02 Prefetch TSTHEME.EXE (目标) → 进入桌面
03:15:12 Shellbag 此电脑 → C: → Users → 导航到用户目录
03:15:18 Shellbag C:\Users\admin\Documents → 进入文档目录
03:15:22 Shellbag C:\Users\admin\Documents\财务数据 → 进入财务数据子目录
03:15:45 JumpList 2026年Q2财报.xlsx → 打开财务文件
03:16:30 Shellbag D:\ → 导航到 USB 盘符
03:16:45 JumpList 2026年Q2财报.xlsx (D:\) → 在 USB 上再次打开同一文件
03:17:05 Prefetch RDPCLIP.EXE (目标) → 启用剪贴板重定向
03:18:00 Prefetch CMD.EXE → 打开命令提示符
这就是一个完整的\"RDP 登录 → 浏览文件系统 → 找到敏感文件 → 复制到 USB → 可能通过剪贴板或命令行执行后续操作\"的行为链。
攻击者以为自己清了日志就安全了。但这三类痕迹,每一类都来自不同的机制(注册表 Hive + OLE Compound File + NTFS 文件系统),清理其中一类根本不够。要全部抹掉需要理解 Windows 内部至少 4 个子系统的行为——而大多数攻击者做不到。
工具推荐:ShellbagExplorer (Eric Zimmerman)、JumpList Explorer (Eric Zimmerman)、WinPrefetchView (NirSoft)。
本文方法论来自多起真实应急案例的实战总结。Forensic Collector 已内置这三类痕迹的自动采集模块。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论