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#

· 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。

https://github.com/jschicht/HexDump

https://github.com/jschicht/MftCarver

Joakim Schicht的github有很多取证的工具值得参考:

https://github.com/jschicht/

0x06 小结

本文介绍了NTFS文件的USN Journal的利用思路,给出取证上的建议。

本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址: http://www.4hou.com/technology/16265.html
源链接

Hacking more

...