渗透技巧——Windows下NTFS文件的USN Journal
source link: https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Windows%E4%B8%8BNTFS%E6%96%87%E4%BB%B6%E7%9A%84USN-Journal/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
0x00 前言
在上篇文章《渗透技巧——Windows下NTFS文件的时间属性》介绍了修改NTFS文件时间属性的方法和细节,以及取证上的建议。 本文将要继续研究NTFS文件另一处记录文件修改时间的位置——USN Journal,同样是分析利用思路,给出取证上的建议。
0x01 简介
本文将要介绍以下内容:
- 读取USN Journal的方法
0x02 USN Journal的基本概念
官方文档:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/bb742450(v=technet.10)
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
官方文档:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc788042(v%3dws.10)
(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#
- SecurityId
- Reason
输出结果不够详细
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
- 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
https://github.com/jschicht/HexDump
https://github.com/jschicht/MftCarver
Joakim Schicht的github有很多取证的工具值得参考:
https://github.com/jschicht/
0x06 小结
本文介绍了NTFS文件的USN Journal的利用思路,给出取证上的建议。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK