删掉文件、篡改时间就销声匿迹?NTFS藏着三层取证铁证

很多人都有一个误区,觉得把文件删除再清空回收站,或是修改一下文件的创建修改时间,就能彻底抹掉操作痕迹。甚至不少擅长反取证的攻击者也这么做,销毁工具、清理事件日志、篡改文件时间戳,自以为能全身而退。

但在 Windows 默认的 NTFS 文件系统里,真相远没有这么简单。它内置了至少三层相互独立的审计记录结构,只清理其中任意一层,都藏不住完整的操作痕迹。把三层证据交叉印证,就能还原出攻击者以为已经抹去的全部操作。

NTFS 里所有文件的元数据,都集中保存在 MFT (主文件表) 中。你可以把它理解成整个磁盘的文件总台账,每个文件对应一条记录,每条记录固定 1024 字节大小。

绝大多数人不知道的是,每条 MFT 记录里,都存着两套完全独立的时间戳。

第一套在 $STANDARD_INFORMATION (标准信息属性) 里。我们在 Windows 资源管理器里看到的创建时间、修改时间、访问时间,全都来自这里。普通的时间篡改工具,都是通过系统提供的标准 API 修改这部分数值,也是攻击者最常动手脚的地方。

第二套在 $FILE_NAME (文件名属性) 里。这套时间戳由 NTFS 内核驱动在文件创建时写入,只有内核能更新它,常规的用户态工具和 API 根本没有修改权限。

这就带来了一个铁一般的取证逻辑:正常情况下,文件创建时内核会把\(FILE_NAME的时间同步复制给\)STANDARD_INFORMATION,后者的创建时间永远不可能早于前者。如果取证时发现某个文件的\(STANDARD_INFORMATION创建时间,比\)FILE_NAME 的创建时间还要早,这在正常的文件系统运行中是不可能出现的情况,几乎可以直接判定时间戳被人为篡改。

$STANDARD_INFORMATION$FILE_NAME

除此之外,体积很小的文件还会把内容直接以驻留属性的形式存在 MFT 条目里。删除这类文件时,系统只是把 MFT 条目标记为可用,并不会真正清空内容,只要条目没被新文件覆盖,原始内容就一直留存在磁盘上。

如果说 MFT 是文件的静态档案,那 USN Journal (更新序列号日志) 就是文件系统的实时操作流水账。它从 Windows 2000 时代就存在,现代 Windows 系统默认开启,数据保存在系统隐藏目录的 $UsnJrnl 文件中。

USN Journal 会按顺序记录卷上发生的每一次文件系统变更,包括文件创建、删除、重命名、属性修改、安全描述符更新等等。每条记录都包含专属的 64 位编号、文件名、父目录 MFT 编号、操作原因码和时间戳。

\$Extend\$UsnJrnl$JUSN_REASON_FILE_CREATEUSN_REASON_RENAME_OLD_NAMEUSN_REASON_BASIC_INFO_CHANGE

它最核心的取证价值在于,记录一旦生成就独立于文件存在,不会随文件删除而消失。哪怕攻击者把文件彻底删除,甚至用安全擦除工具覆写了磁盘空间,USN Journal 里的操作记录依然会保留下来。

比如常见的安全删除工具 SDelete,它的典型操作逻辑是先把目标文件反复改名再执行删除,避免文件名被恢复。但每一次重命名操作,都会在 USN Journal 里生成对应的重命名旧名和新名记录,形成非常独特的操作特征。就算文件本身已经被完全擦除,这个特征序列也会完整保留下来,成为工具使用过的铁证。

AAA.AAABBB.BBBRENAME_OLD_NAMERENAME_NEW_NAME

再回到时间戳篡改的场景,如果有人修改了文件属性,USN Journal 里会生成一条 USN_REASON_BASIC_INFO_CHANGE 记录。把这条记录的时间,和 MFT 里两套时间戳的异常做对照,就能形成双重证据链,坐实篡改行为。

通常来说,一个正常使用的系统卷,USN Journal 大约能保留 20 天左右的操作记录,磁盘活跃度越高,保留的时间跨度会越短。

除了 MFT 和 USN Journal,NTFS 还有第三层常常被忽略的记录结构 $LogFile (事务日志文件)。它原本的设计目的,是保证文件系统的事务一致性,万一系统突然崩溃,可以靠它回滚未完成的操作,避免磁盘损坏。

$LogFile 里记录了所有 NTFS 元数据修改的重做和撤销操作,每个操作都对应一个 LSN (日志序列号)。而每个 MFT 条目里,都会保存最后一次修改它的 LSN 编号。

这就给取证提供了一个完全独立的时间维度。当你怀疑某个文件的\(STANDARD_INFORMATION时间被篡改时,可以通过MFT里的LSN编号,去\)LogFile 里找到对应事务的实际发生时间。

简单来说,哪怕攻击者把文件的创建时间改成了一年前,\(LogFile会清清楚楚地记下,这个\)STANDARD_INFORMATION 属性其实是昨天才被写入磁盘的。这个时间来自底层事务日志,和文件属性里的数值完全无关,是验证篡改行为最有力的第三方证据。

四、两款工具互补,高效解析三层证据

针对 NTFS 取证,有两款核心工具搭配使用,能覆盖绝大多数分析场景。

第一款是 MFTECmd,它可以直接解析\(MFT和USN Journal的\)J 数据流,导出成标准 CSV 格式,配合 Timeline Explorer 工具就能快速生成文件操作时间线,筛选删除、创建等关键事件。它的优势是开箱即用,输出结果直观,适合分析人员快速排查单个镜像。

MFTECmd.exe -f “E:\Evidence$MFT” –csv C:\output\ –csvf mft.csv

UpdateTimestampNameFileAttributesUpdateReasonsParentEntryNumberParentSequenceNumber

第二款是 dfir_ntfs,这是一个 Python 编写的底层解析库。它不直接生成可视化报表,而是把 NTFS 的原始结构暴露成可编程的对象,支持解析\(MFT、\)UsnJrnl:\(J、\)LogFile,还能直接处理磁盘镜像和卷影副本。它适合用来编写自动化脚本,对大批量机器做批量筛查,效率远高于手动分析单个文件。

$MFT$UsnJrnl:$J$LogFile

https://github.com/msuhanov/dfir_ntfs/archive/1.1.19.tar.gz
import dfir_ntfs.MFT as MFTwith open("$MFT", "rb") as mft_file:    mft = MFT.MasterFileTableParser(mft_file)    for file_record in mft.file_records(True):        if not file_record.is_in_use():            continue        si = file_record.get_standard_information()        fn = file_record.get_file_name()        if si and fn:            si_created = si.get_created_time()            fn_created = fn.get_created_time()            if si_created and fn_created:                if si_created < fn_created:                    print(f"[TIMESTOMP] {fn.get_file_name()} SI:{si_created} FN:{fn_created}")

两者不是竞争关系,而是互补。人工排查用 MFTECmd 快速定位线索,批量自动化分析用 dfir_ntfs 提升效率,是行业内的常规做法。

一套完整的 NTFS 取证调查,通常遵循从易到难、从表层到底层的顺序推进。

第一步永远是解析 $MFT。拿到全量的文件列表和元数据,先划定事件的时间窗口,筛选出可疑文件,建立基础时间线。

第二步关联 USN Journal。针对可疑文件对应的 MFT 编号,调取 USN Journal 里的全部操作记录,核对操作时间和文件显示的时间是否匹配。如果出现属性变更记录和文件时间对不上,直接标记为异常。

第三步验证时间戳篡改。对疑似被篡改的文件,直接对比\(STANDARD_INFORMATION和\)FILE_NAME 的时间戳。如果出现前者创建时间早于后者的反常情况,再进一步调取 $LogFile 中对应 LSN 的事务时间,完成最终实锤。

第四步排查卷影副本。如果有文件已经被删除,可以检查系统的卷影副本,里面往往保留了更早时间点的文件系统状态,能恢复出已经被删除的文件和元数据。

只有当\(MFT、USN Journal和\)LogFile 都被破坏,比如遇到专门擦除元数据的恶意程序时,才会动用文件雕刻技术。也就是靠文件头和文件尾的特征码,从原始磁盘数据里恢复文件。但雕刻出来的文件没有文件系统层面的来源和时间佐证,证据效力会大打折扣,属于最后的兜底手段。

绝大多数攻击者的反取证认知,都停留在删除文件、清理系统日志、修改表层时间戳的层面,根本触及不到 NTFS 更深层的记录结构。这也是为什么很多看似被清理干净的现场,依然能通过文件系统的三层结构还原出完整的攻击路径。

当然这三层结构也不是坚不可摧,专门的磁盘擦除工具和破坏性恶意程序,也可以直接破坏 NTFS 元数据。但在绝大多数日常调查场景中,三层证据交叉印证的方法,都能找回远超攻击者预期的痕迹,让看似无痕的操作,留下清晰可查的铁证。

//黑鸟补充说明

1. 双时间戳不一致是时间篡改的强特征,但并非绝对判定依据。解压携带原始时间戳的压缩包、卷克隆、卷影副本还原等合法操作也可能造成两套时间戳出现差异,实际判定需结合USN日志、预取文件等其他证据交叉印证。

2. USN Journal约20天的留存时长为常规办公主机的经验值,实际留存周期由日志最大容量与卷的文件操作频率共同决定,高活跃度服务器留存时间会更短,低使用率的卷则可能留存更久。

3. $FILE_NAME\(FILE_NAME时间戳并非绝对不可篡改,通过内核驱动、原始磁盘编辑的方式仍可修改,只是常规用户态工具与普通攻击者的工具链通常不会触及这一层,取证中其可信度显著高于\)$STANDARD_INFORMATION。

4. $LogFile默认容量有限且采用循环覆盖机制,留存的时间窗口通常短于USN Journal,解析复杂度也更高,在取证工作中多作为验证性证据,而非首要线索来源。

声明:本文来自黑鸟,稿件和图片版权均归原作者所有。所涉观点不代表东方安全立场,转载目的在于传递更多信息。如有侵权,请联系rhliu@skdlabs.com,我们将及时按原作者或权利人的意愿予以更正。

上一篇:WAIC聚光灯之外:AI基础设施正成为攻击者的隐秘靶心

下一篇:延续强劲增长!Fortinet 发布 2026 年第二季度财报