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

发布于 2024-10-26 17:48:11 字数 5564 浏览 4 评论 0

0x00 前言

本文将要继续研究 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

Joakim Schicht 的 github 有很多取证的工具值得参考:https://github.com/jschicht/

0x06 小结

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文