analyzing-mft-for-deleted-file-recovery について
NTFS の MFT データを調べるデジタルフォレンジック分析者向けガイドです。既存の解析ツールを用いた削除ファイルの証拠調査、タイムライン再構成、関連アーティファクトの照合を扱います。
主な機能
- 01MFT レコードと属性の解析
- 02USN ジャーナルと $LogFile の調査
- 03MFT スラック領域の分析
- 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 ボリューム上のすべてのファイルとディレクトリの中核となるメタデータリポジトリです。各ファイルは、少なくとも 1 つの 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、または同等のツール
- CSV 分析用の Timeline Explorer または Excel
- カスタム分析スクリプト用の 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 = ディレクトリ) |
| 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 ツリーインデックスルート |
| 0xA0 | $INDEX_ALLOCATION | 大規模なディレクトリ用の B ツリーインデックスエントリ |
| 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 スラックスペースのフォレンジック上の価値: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