skills/analyzing-mft-for-deleted-file-recovery/SKILL.md
通过检查 MFT 记录条目、$LogFile、$UsnJrnl 和 MFT 松弛空间,使用 MFTECmd、analyzeMFT 和 X-Ways Forensics 分析 NTFS 主文件表($MFT)以恢复已删除文件的元数据和内容。
npx skillsauth add killvxk/cybersecurity-skills-zh analyzing-mft-for-deleted-file-recoveryInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
NTFS 主文件表($MFT)是 NTFS 卷上每个文件和目录的中央元数据存储库。每个文件至少由一条 1024 字节的 MFT 记录表示,其中包含 $STANDARD_INFORMATION(时间戳、权限)、$FILE_NAME(名称、父目录、时间戳)和 $DATA(文件内容或簇运行指针)等属性。文件被删除时,其 MFT 记录被标记为非活动状态(InUse 标志清除),但元数据保留到被新文件的条目覆盖为止。这种持久性使 MFT 分析成为恢复已删除文件证据、重建文件系统时间线以及检测反取证活动(如时间戳篡改)的主要技术。
每条 MFT 记录以签名"FILE"(0x46494C45)开头,包含:
| 偏移量 | 大小 | 字段 | |--------|------|------| | 0x00 | 4 字节 | 签名("FILE") | | 0x04 | 2 字节 | 更新序列偏移量 | | 0x06 | 2 字节 | 更新序列大小 | | 0x08 | 8 字节 | $LogFile 序列号 | | 0x10 | 2 字节 | 序列号 | | 0x12 | 2 字节 | 硬链接计数 | | 0x14 | 2 字节 | 第一个属性偏移量 | | 0x16 | 2 字节 | 标志(0x01 = 使用中,0x02 = 目录) | | 0x18 | 4 字节 | MFT 记录已用大小 | | 0x1C | 4 字节 | MFT 记录已分配大小 | | 0x20 | 8 字节 | 基础文件记录引用 | | 0x28 | 2 字节 | 下一个属性 ID |
| 类型 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 树索引根 | | 0xA0 | $INDEX_ALLOCATION | 大型目录的 B 树索引条目 | | 0xB0 | $BITMAP | 索引或 MFT 的分配位图 |
# 使用 KAPE 或 FTK Imager 从取证镜像提取 $MFT
# 使用 MFTECmd 解析 $MFT
MFTECmd.exe -f "C:\Evidence\$MFT" --csv C:\Output --csvf mft_full.csv
# 在 Timeline Explorer 中过滤已删除文件(InUse = FALSE)
# 查找 InUse 列为 False 的条目
在 CSV 输出中识别已删除文件:
InUse = False 表示已删除或已重新分配的记录ParentPath 显示删除前的原始文件位置FileSize 显示原始大小(可能仍可恢复)$STANDARD_INFORMATION 和 $FILE_NAME 属性中的时间戳持续存在USN 日志记录 NTFS 卷上文件的所有更改,包括创建、删除、重命名和数据修改事件。
# 使用 MFTECmd 解析 USN 日志
MFTECmd.exe -f "C:\Evidence\$J" --csv C:\Output --csvf usn_journal.csv
# 删除证据的关键 USN 原因代码:
# USN_REASON_FILE_DELETE = 0x00000200
# USN_REASON_CLOSE = 0x80000000
# USN_REASON_RENAME_OLD_NAME = 0x00001000
# USN_REASON_RENAME_NEW_NAME = 0x00002000
$LogFile 存储 NTFS 事务记录,即使 USN 日志已循环,也能揭示文件操作。
# 使用 LogFileParser 解析 $LogFile
LogFileParser.exe -l "C:\Evidence\$LogFile" -o C:\Output
# 查找表示文件删除的 REDO 和 UNDO 操作:
# - DeallocateFileRecordSegment(释放文件记录段)
# - DeleteAttribute(删除属性)
# - UpdateResidentValue(清除 InUse 标志)
MFT 松弛空间存在于 MFT 记录已用部分末尾和已分配 1024 字节末尾之间。该区域可能包含之前文件记录的残留数据。
import struct
def parse_mft_slack(mft_path: str, output_path: str):
"""提取并分析 MFT 松弛空间中已删除文件的残留数据。"""
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
# 验证 FILE 签名
if record[:4] != b"FILE":
record_num += 1
continue
# 从偏移量 0x18 获取已用大小
used_size = struct.unpack("<I", record[0x18:0x1C])[0]
if used_size < record_size:
slack = record[used_size:]
# 检查松弛空间是否包含可读字符串或属性头部
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
# 使用 RBCmd 解析回收站
RBCmd.exe -d "C:\Evidence\$Recycle.Bin" --csv C:\Output --csvf recycle_bin.csv
# 关联: $I 文件包含原始路径和删除时间戳
# 将 $R 文件中的 MFT 条目号匹配回原始 MFT 记录
# 列出卷影副本
vssadmin list shadows
# 挂载卷影副本并从每个副本提取 $MFT
# 比较不同卷影副本中的 MFT 记录以追踪文件随时间的变化
testing
设计并执行社会工程学渗透测试,包括钓鱼、语音钓鱼、短信钓鱼和物理借口活动,以衡量人员安全韧性并识别培训差距。
testing
主持结构化的事件后审查,以识别根本原因、记录有效和无效的措施,并提出可操作的改进建议以提升未来的事件响应能力。
testing
通过分析举报的邮件、提取指标、评估凭据受攻陷情况、在全组织范围隔离恶意邮件并修复受影响账号来响应网络钓鱼事件。涵盖邮件头分析、URL/附件沙箱检测和邮箱范围清除操作。适用于网络钓鱼响应、邮件事件、凭据钓鱼、鱼叉式网络钓鱼调查或钓鱼修复相关请求。
tools
票据传递(Pass-the-Ticket,PtT)是一种横向移动技术,使用窃取的 Kerberos 票据(TGT 或 TGS)在不知道用户密码的情况下向服务进行认证。通过从已控制的主机内存中提取 Kerberos 票据,攻击者可以将这些票据注入自己的会话以模拟票据所有者。