渗透技巧——Windows 下 NTFS 文件的 USN Journal
0x00 前言
本文将要继续研究 NTFS 文件另一处记录文件修改时间的位置——USN Journal,同样是分析利用思路,给出取证上的建议。
0x01 简介
本文将要介绍以下内容:
- 基本概念
- 读取 USN Journal 的方法
- 利用思路
- 取证建议
0x02 USN Journal 的基本概念
USN Journal (Update Sequence Number Journal),也称作 Change Journal,用来记录 NTFS volume 中文件修改的信息,能够提高搜索文件的效率
每个 NTFS volume 对应一个 USN Journal,存储在 NTFS metafile
的 $Extend\$UsnJrnl
中,也就是说,不同的 NTFS volume 对应的 USN Journal 不同
USN Journal 会记录文件和目录的创建、删除、修改、重命名和加解密操作,每条记录的格式如下:
typedef struct {
DWORD RecordLength;
WORD MajorVersion;
WORD MinorVersion;
DWORDLONG FileReferenceNumber;
DWORDLONG ParentFileReferenceNumber;
USN Usn;
LARGE_INTEGER TimeStamp;
DWORD Reason;
DWORD SourceInfo;
DWORD SecurityId;
DWORD FileAttributes;
WORD FileNameLength;
WORD FileNameOffset;
WCHAR FileName[1];
} USN_RECORD_V2, *PUSN_RECORD_V2;
官方资料:https://docs.microsoft.com/en-us/windows/desktop/api/winioctl/ns-winioctl-usn_record_v2
在 NTFS metafile
的 $Extend\$UsnJrnl\$Max
保存 USN Journal 文件的总大小,如果 USN Journal 的记录长度超出总大小,会从最初始的记录开始覆盖
0x03 读取 USN Journal 的方法
1、使用命令 fsutil usn
(1) 查看 C 盘的 USN Journal 信息
fsutil usn queryjournal c:
包括以下信息:
- Usn Journal ID
- First Usn
- Next Usn
- Lowest Valid Usn
- Max Usn
- Maximum Size
- Allocation Delta
(2) 查看 C 盘所有的 USN Journal
fsutil usn enumdata 1 0 1 c:
包括以下信息:
- File Ref#
- ParentFile Ref#
- Usn
- SecurityId
- Reason
- Name
输出结果不够详细
2、使用开源工具
(1) 导出 USN Journal
下载地址:https://github.com/jschicht/ExtractUsnJrnl
参数如下:
ExtractUsnJrnl /DevicePath:c: /OutputPath:c:\test /OutputName:UsnJrnl_vol1.bin
(2) 将 USN Journal 转为 CSV 格式输出
下载地址:https://github.com/jschicht/UsnJrnl2Csv
参数如下:
UsnJrnl2Csv /UsnJrnlFile:c:\test\UsnJrnl_vol1.bin /OutputPath:c:\test
包括以下信息:
- Offset
- FileName
- USN
- Timestamp
- Reason
- MFTReference
- MFTReferenceSeqNo
- MFTParentReference
- MFTParentReferenceSeqNo
- FileAttributes
- MajorVersion
- MinorVersion
- SourceInfo
- SecurityId
输出结果很完整
3、c++实现
我这里写了一个简单的示例代码,下载地址:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnumUsnJournal.cpp
代码实现了枚举 C 盘的 USN Journal,仅输出文件名
0x04 利用思路
1、清除所有 USN Journal
(1) 使用 fsutil
fsutil usn deletejournal /d c:
注:我在测试环境下没有删除成功
(2)API
https://docs.microsoft.com/en-us/windows/desktop/api/winioctl/ns-winioctl-delete_usn_journal_data
注:
我在测试环境下没有删除成功
2、清除单条 USN Journal
我还没有找到可用的 API 接口
唯一的方法是直接修改 NTFS 文件,但是自 nt6.x 开始,Windows 禁止加载未经签名的驱动文件
这里可以尝试使用付费版的 WinHex 对 NTFS 文件进行操作,修改 $Extend\$UsnJrnl
中的内容
也可以尝试绕过驱动保护
$UsnJrnl 的内容可参考:http://forensicinsight.org/wp-content/uploads/2013/07/F-INSIGHT-Advanced-UsnJrnl-Forensics-English.pdf
按照格式读取 USN Journal,删除指定 USN Journal,再写入磁盘
3、暴力覆盖
首先查看磁盘 USN Journal 文件的总长度
然后通过创建、删除、修改、重命名等操作生成 USN Journal 的记录,当超过总长度后会覆盖最初始的记录,直至覆盖所有的 USN Journal
0x05 取证建议
1、读取 USN Journal,列出所有记录,查找是否存在可疑记录
该方法并非完全可信,攻击者只要能够绕过驱动保护,就能修改 USN Journal
2、尝试其他方法
比如从内存中读取 $MFT records
Joakim Schicht 的 github 有很多取证的工具值得参考:https://github.com/jschicht/
0x06 小结
本文介绍了 NTFS 文件的 USN Journal 的利用思路,给出取证上的建议。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论