关于 analyzing-mft-for-deleted-file-recovery
供数字取证分析人员检查 NTFS 主文件表数据的指南,介绍删除文件证据、时间线重建,以及使用现有解析工具关联辅助痕迹。
主要功能
- 01解析 MFT 记录与属性
- 02检查 USN 日志和 $LogFile
- 03分析 MFT 松弛空间
- 04关联回收站与卷影副本
- 05检测时间戳篡改
适用场景
- 01恢复已删除文件的元数据
- 02重建文件活动时间线
- 03调查疑似时间戳篡改
- 04为文件内容雕刻提供线索
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill analyzing-mft-for-deleted-file-recovery安装后在 Claude Code 中输入/analyzing-mft-for-deleted-file-recovery确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
分析 MFT 以恢复已删除文件
概述
NTFS 主文件表($MFT)是 NTFS 卷上每个文件和目录的核心元数据存储库。每个文件至少由一个 1024 字节的 MFT 记录表示,其中包含 $STANDARD_INFORMATION(时间戳、权限)、$FILE_NAME(名称、父目录、时间戳)和 $DATA(文件内容或簇运行指针)等属性。当文件被删除时,其 MFT 记录会被标记为非活动(清除 InUse 标志),但元数据会一直保留,直到该条目被新文件重新分配。这种持久性使 MFT 分析成为恢复已删除文件证据、重建文件系统时间线以及检测时间戳篡改等反取证活动的主要技术。
何时使用
- 当调查需要分析 MFT 以恢复已删除文件的安全事件时
- 当为该领域构建检测规则或威胁狩猎查询时
- 当 SOC 分析师需要该分析类型的结构化流程时
- 当验证相关攻击技术的安全监控覆盖范围时
前置条件
- 取证磁盘镜像(E01、raw/dd、VMDK 或 VHDX 格式)
- MFTECmd(Eric Zimmerman)或 analyzeMFT(基于 Python)
- FTK Imager、Arsenal Image Mounter 或类似的镜像挂载工具
- Timeline Explorer 或 Excel 用于 CSV 分析
- Python 3.8+ 用于自定义分析脚本
- 了解 NTFS 文件系统内部结构
MFT 结构与记录布局
MFT 记录头
每条 MFT 记录以签名 "FILE"(0x46494C45)开头,并包含:
| 偏移 | 大小 | 字段 |
|---|---|---|
| 0x00 | 4 字节 | 签名("FILE") |
| 0x04 | 2 字节 | 更新序列偏移 |
| 0x06 | 2 字节 | 更新序列大小 |
| 0x08 | 8 字节 | $LogFile 序列号 |
| 0x10 | 2 字节 | 序列号 |
| 0x12 | 2 字节 | 硬链接计数 |
| 0x14 | 2 字节 | 第一个属性偏移 |
| 0x16 | 2 字节 | 标志(0x01 = InUse,0x02 = Directory) |
| 0x18 | 4 字节 | MFT 记录已用大小 |
| 0x1C | 4 字节 | MFT 记录分配大小 |
| 0x20 | 8 字节 | 基础文件记录引用 |
| 0x28 | 2 字节 | 下一个属性 ID |
关键 MFT 属性
| 类型 ID | 名称 | 描述 |
|---|---|---|
| 0x10 | $STANDARD_INFORMATION | 时间戳、标志、所有者 ID、安全 ID |
| 0x30 | $FILE_NAME | 文件名、父 MFT 引用、时间戳 |
| 0x40 | $OBJECT_ID | 文件的唯一 GUID |
| 0x50 | $SECURITY_DESCRIPTOR | ACL 权限 |
| 0x60 | $VOLUME_NAME | 卷标(仅卷元数据文件) |
| 0x80 | $DATA | 文件内容(若小于 700 字节则常驻)或簇运行列表 |
| 0x90 | $INDEX_ROOT | 目录的 B-tree 索引根 |
| 0xA0 | $INDEX_ALLOCATION | 大型目录的 B-tree 索引条目 |
| 0xB0 | $BITMAP | 索引或 MFT 的分配位图 |
已删除文件恢复技术
技术 1:使用 MFTECmd 进行 MFT 记录分析
# Extract $MFT from forensic image using KAPE or FTK Imager
# Parse the $MFT with MFTECmd
MFTECmd.exe -f "C:\Evidence\$MFT" --csv C:\Output --csvf mft_full.csv
# Filter for deleted files (InUse = FALSE) in Timeline Explorer
# Look for entries where InUse column is False
在 CSV 输出中识别已删除文件:
InUse= False 表示已删除或已重新分配的记录ParentPath显示删除前的原始文件位置FileSize显示原始大小(可能仍可恢复)$STANDARD_INFORMATION和$FILE_NAME属性中的时间戳会保留
技术 2:USN 日志($UsnJrnl:$J)分析
USN 日志记录 NTFS 卷上所有文件变更,包括创建、删除、重命名和数据修改事件。
# Parse USN Journal with MFTECmd
MFTECmd.exe -f "C:\Evidence\$J" --csv C:\Output --csvf usn_journal.csv
# Key USN reason codes for deletion evidence:
# USN_REASON_FILE_DELETE = 0x00000200
# USN_REASON_CLOSE = 0x80000000
# USN_REASON_RENAME_OLD_NAME = 0x00001000
# USN_REASON_RENAME_NEW_NAME = 0x00002000
技术 3:$LogFile 事务分析
$LogFile 存储 NTFS 事务记录,即使 USN 日志已循环覆盖,也能揭示文件操作。
# Parse $LogFile with LogFileParser
LogFileParser.exe -l "C:\Evidence\$LogFile" -o C:\Output
# Look for REDO and UNDO operations indicating file deletion:
# - DeallocateFileRecordSegment
# - DeleteAttribute
# - UpdateResidentValue (clearing InUse flag)
技术 4:MFT 空闲空间分析
MFT 空闲空间存在于 MFT 记录已用部分的末尾与所分配 1024 字节的末尾之间。该区域可能包含先前文件记录的残留。
import struct
def parse_mft_slack(mft_path: str, output_path: str):
"""Extract and analyze MFT slack space for deleted file remnants."""
with open(mft_path, "rb") as f:
record_size = 1024
record_num = 0
slack_findings = []
while True:
record = f.read(record_size)
if len(record) < record_size:
break
# Verify FILE signature
if record[:4] != b"FILE":
record_num += 1
continue
# Get used size from offset 0x18
used_size = struct.unpack("<I", record[0x18:0x1C])[0]
if used_size < record_size:
slack = record[used_size:]
# Check if slack contains readable strings or attribute headers
if any(c > 0x20 and c < 0x7F for c in slack[:50]):
slack_findings.append({
"record": record_num,
"used_size": used_size,
"slack_size": record_size - used_size,
"slack_preview": slack[:100].hex()
})
record_num += 1
return slack_findings
与辅助产物的关联
将 MFT 与 $Recycle.Bin 交叉引用
# Parse Recycle Bin with RBCmd
RBCmd.exe -d "C:\Evidence\$Recycle.Bin" --csv C:\Output --csvf recycle_bin.csv
# Correlate: $I files contain original path and deletion timestamp
# Match MFT entry numbers from $R files back to original MFT records
将 MFT 与卷影副本交叉引用
# List volume shadow copies
vssadmin list shadows
# Mount shadow copies and extract $MFT from each
# Compare MFT records across shadow copies to track file changes over time
取证价值
- 已删除文件元数据恢复:原始文件名、路径、大小和时间戳
- 时间线重建:文件创建、修改、访问和删除事件
- 时间戳篡改检测:比较 $SI 与 $FN 时间戳
- 数据雕刻指引:MFT 簇运行指向磁盘上的文件内容
- 反取证检测:识别已擦除或被篡改的 MFT 记录
参考资料
- NTFS MFT 高级取证分析:https://www.deaddisk.com/posts/ntfs-mft-advanced-forensic-analysis-guide/
- MFT Slack 空间的取证价值:https://www.sygnia.co/blog/the-forensic-value-of-mft-slack-space/
- MFTECmd 文档:https://ericzimmerman.github.io/
- SANS FOR500:Windows 取证分析
示例输出
$ MFTECmd.exe -f "C:\Evidence\$MFT" --csv /analysis/mft_output
MFTECmd v1.2.2 - MFT Parser
==============================
Input: C:\Evidence\$MFT (Size: 384 MB)
Total MFT Entries: 395,264
Parsing MFT entries... Done (12.4 seconds)
--- Deleted File Recovery Summary ---
Total Entries: 395,264
Active Files: 245,832
Deleted Files: 149,432
Recoverable: 87,234 (resident data or clusters not reallocated)
Partially Recoverable: 31,456 (some clusters overwritten)
Unrecoverable: 30,742 (all clusters reallocated)
--- Recently Deleted Files (Incident Window: 2024-01-15 to 2024-01-18) ---
MFT Entry | Filename | Path | Size | Deleted (UTC) | Recoverable
----------|-----------------------------------|------------------------------------|-----------|-----------------------|------------
148923 | exfil_tool.exe | C:\ProgramData\Updates\ | 1,258,496 | 2024-01-17 02:45:12 | YES
148924 | exfil_tool.log | C:\ProgramData\Updates\ | 45,312 | 2024-01-17 02:45:14 | YES
149001 | passwords.txt | C:\Users\jsmith\Desktop\ | 2,048 | 2024-01-17 02:50:33 | YES
149150 | scan_results.csv | C:\Users\jsmith\AppData\Local\Temp | 892,416 | 2024-01-17 03:00:01 | PARTIAL
149200 | mimikatz.exe | C:\Windows\Temp\ | 1,250,816 | 2024-01-18 01:15:22 | YES
149201 | sekurlsa.log | C:\Windows\Temp\ | 32,768 | 2024-01-18 01:15:25 | YES
149302 | .bash_history | C:\Users\jsmith\ | 4,096 | 2024-01-18 03:00:00 | NO
149400 | ClearEventLogs.ps1 | C:\Windows\Temp\ | 1,536 | 2024-01-18 03:01:12 | YES
--- $STANDARD_INFORMATION vs $FILE_NAME Timestamp Analysis (Timestomping Detection) ---
MFT Entry | Filename | $SI Created | $FN Created | Delta | Verdict
----------|---------------------|----------------------|----------------------|-----------|----------
148923 | exfil_tool.exe | 2023-06-15 10:00:00 | 2024-01-15 14:34:02 | -214 days | TIMESTOMPED
149200 | mimikatz.exe | 2022-01-01 00:00:00 | 2024-01-16 02:30:15 | -745 days | TIMESTOMPED
Recovered files exported to: /analysis/mft_output/recovered/
Full CSV report: /analysis/mft_output/mft_analysis.csv (395,264 rows)
Timeline CSV: /analysis/mft_output/mft_timeline.csv
评论
支持 Markdown