mcpField
A
analyzing-mft-for-deleted-file-recovery

analyzing-mft-for-deleted-file-recovery

github.com/mukul975安全35.2k327 次安装8 周前更新
代码仓库

关于 analyzing-mft-for-deleted-file-recovery

供数字取证分析人员检查 NTFS 主文件表数据的指南,介绍删除文件证据、时间线重建,以及使用现有解析工具关联辅助痕迹。

主要功能

  1. 01解析 MFT 记录与属性
  2. 02检查 USN 日志和 $LogFile
  3. 03分析 MFT 松弛空间
  4. 04关联回收站与卷影副本
  5. 05检测时间戳篡改

适用场景

  1. 01恢复已删除文件的元数据
  2. 02重建文件活动时间线
  3. 03调查疑似时间戳篡改
  4. 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 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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)开头,并包含:

偏移大小字段
0x004 字节签名("FILE")
0x042 字节更新序列偏移
0x062 字节更新序列大小
0x088 字节$LogFile 序列号
0x102 字节序列号
0x122 字节硬链接计数
0x142 字节第一个属性偏移
0x162 字节标志(0x01 = InUse,0x02 = Directory)
0x184 字节MFT 记录已用大小
0x1C4 字节MFT 记录分配大小
0x208 字节基础文件记录引用
0x282 字节下一个属性 ID
关键 MFT 属性
类型 ID名称描述
0x10$STANDARD_INFORMATION时间戳、标志、所有者 ID、安全 ID
0x30$FILE_NAME文件名、父 MFT 引用、时间戳
0x40$OBJECT_ID文件的唯一 GUID
0x50$SECURITY_DESCRIPTORACL 权限
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 记录

参考资料

示例输出

$ 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