4

渗透技巧——Windows下NTFS文件的USN Journal

 3 years ago
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的利用思路,给出取证上的建议。


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK