16章

2 MFTのファストフォレンジック

この節では、前の節で学習したMFTに関する知識をベースに、実際のファストフォレンジックで実施する効率的かつ詳細な分析方法を紹介します。具体的な内容は、CDIR-Aを使用した各MFTレコードのパース方法(CSV形式)や、表計算ソフトによるパース結果のソート/検索(フィルタリング)など、分析方法の紹介です。その中で、必要な情報を抽出するための手順や着眼点/留意点なども紹介します。

MFTのパース手順例

MFTは、多くの有償・無償ツールでパースできます。ここでは、CDIR-Aで提供する各種アーティファクトのパースツール群から、「mft.exe」を使用する方法を紹介します。

mft.exeは、保全したMFT($MFTファイル)を入力して、1つのMFTレコードのヘッダ領域や各属性情報に記録された内容を、項目分けした1行のデータに加工し、CSV形式で一括出力します。出力するCSVファイルは、ファイル名「C_$MFT_output.csv 」として(Cドライブから保全した$MFTの場合)、実行時に指定する出力先フォルダへ保存されます。

実行するコマンドは次のとおりです。

mft.exe  -o  [出力先フォルダ ]  [入力となる$MFTファイルの保全フォルダ]

例 > mft.exe  -o  C:\CDIR-A_out\MFT  C:\pc-sales01_2022xx\NTFS


mft.exeが出力するCSVファイルには、次の項目が出力されます。

  • ComputerName: 保全したPCのコンピュータ名
  • Filename: ファイル名
  • Path: フルパス(親フォルダ)
  • FileID: ファイル ID
  • Flag: ヘッダ領域のフラグの値により、次のとおり表示される
    • 現存ファイル: File
    • 現存フォルダ: Directory
    • 削除済みファイル: File(Deleted)
    • 削除済みフォルダ: Directory(Deleted)
  • FileSize: ファイルサイズ
  • Created: 作成日時($STANDARD INFORMAION属性)
  • Modified: 最終更新日時($STANDARD INFORMAION属性)
  • RecordChanged: エントリ更新日時($STANDARD INFORMAION属性)
  • Accessed: 最終アクセス日時($STANDARD INFORMAION属性)
  • Created($FN): 作成日時($FILE NAME属性)
  • Modified($FN): 最終更新日時($FILE NAME属性)
  • RecordChanged($FN): エントリ更新日時($FILE NAME属性)
  • Accessed($FN): 最終アクセス日時($FILE NAME属性)
  • TimeZone: タイムスタンプのタイムゾーン
  • Owner: パーミッション関連情報
  • Security: パーミッション情報($SECURE ファイル内の ID と対応)
  • Misc: 代替データストリーム(ADS)が存在する場合、ADSのストリーム名


  • mft.exeによるMFTのパース例

l-2_01


  • NTFS管理用システムファイル(ファイルID:0~11)のMFTレコードを表示

l-2_02


MFTパース結果の分析における着眼点/留意点

ファイルID

ファイルIDは、各ファイル/フォルダに付与される連番のユニークIDです。

ファイル/フォルダの新規作成時には、連番が加算されて新しいファイルIDが付与されるほか、削除されたファイル/フォルダのMFTレコードが残っている場合、ファイルIDが再利用される場合もあります。つまり、時間軸が異なれば、同じファイルIDでも別のファイル/フォルダに付与されている可能性があります。同じPCから、異なる時間軸で証拠保全した複数の$MFTやディスクイメージがある場合は、この点に留意して下さい。

なお、同じファイルIDに紐づくファイル/フォルダの変遷は、次の章で紹介するUSNジャーナルを保全して分析することにより、明らかにできます。

また、各ファイル/フォルダ自体のファイルIDとは別に、$FILE NAME($FN)属性には、親フォルダのファイルID(親フォルダID)が記録されています。親フォルダIDは、単一の上位フォルダに紐づきます。つまり深い階層になっているファイルパスであれば、1つ上のサブフォルダにのみ紐づきます。したがって、1つ上のサブフォルダから、さらにその親フォルダIDを最上位まで階層的にたどることで、ファイルパス全体を明らかにする必要があります。mft.exeでは、こうしたファイルパス検索処理を自動的に行い、その結果を「Path」として出力しています。


l-2_02_1


タイムスタンプ

MFTレコードには、$STANDARD INFORMATION($SI)属性と$FILE NAME($FN)属性にそれぞれタイムスタンプが記録されています。$SIのタイムスタンプはユーザーレベルプロセスで変更可能ですが、$FNはカーネルレベルでのみ変更可能となっています。$SIのタイプスタンプは、エクスプローラーのプロパティや、コマンドプロンプトの「dir」コマンドでも表示される作成日時や更新日時などですが、マルウェアや攻撃者によって改ざんされる可能性もあります。

このような特性を考えると、$SIと$FNのタイムスタンプが不自然に乖離しているファイルは、マルウェアや攻撃者によって$SIのタイムスタンプが改ざんされている可能性があります。MFTのパース結果から、$SIと$FNのタイムスタンプを比較することも、不審なファイルの発見に有効でしょう。

それぞれのタイムスタンプが更新されるタイミングは、多くのフォレンジック調査担当者や研究者によって検証されています。次の2つの表は、SANS社の公式ブログ( https://www.sans.org/blog/digital-forensics-detecting-time-stamp-manipulation/ )をベースとして作成した、タイムスタンプ更新タイミングのチャートです。縦軸がタイムスタンプの種類(mft.exeによりパースされる項目名)、横軸がファイルに対する操作で、そのタイミングで更新されるものに「〇」マークを表示しています。

$STANDARD INFORMATION($SI)属性 新規作成 変更 コピー(複製) リネーム 移動(同一ドライブ内) 移動(別ドライブ間) 削除 アクセス
Created 〇 ― 〇 ― ― ― ― ―
Modified 〇 〇 ― ― ― ― ― ―
Accessed 〇 〇 〇 ― ― 〇 ― 〇(*)
RecordChanged 〇 ― 〇 〇 〇 〇 〇 ―

(*) Windows Vista以降のOSでは、アクセス時のタイムスタンプ更新がデフォルトで無効になっています。また、マイクロソフト社の公式ドキュメントによれば、最終アクセス日時は必ずしもリアルタイムで更新されるわけではなく、最大1時間遅延することがあるとされています。

$FILE NAME($FN)属性 新規作成 変更 コピー(複製) リネーム 移動(同一ドライブ内) 移動(別ドライブ間) 削除 アクセス
Created($FN) 〇 ― 〇 ― ― 〇 ― ―
Modified($FN) 〇 ― 〇 ― 〇 〇 〇 ―
Accessed($FN) 〇 ― 〇 ― ― 〇 ― ―
RecordChanged($FN) 〇 ― 〇 ― 〇 〇 〇 ―


この2つの表でわかるとおり、$SIと$FNとでは、各タイムスタンプの更新タイミングが異なる場合があります。また、同じタイミングで更新されても、システム上のタイムラグが発生するケースもあります。

なお、1つ目の表($SI)のとおり、$SIのタイムスタンプは、ファイルのコピー操作時に、Created(作成日時)が更新されますが、Modified(最終更新日時)は更新されません。したがって、コピーされたファイルは、$SIの作成日時と最終更新日時の新旧が逆転することにも留意して下さい。

  • 例:「ABC.txt」を、2022/6/10 9:00に「DEF.txt」へコピーした場合

    • ABC.txt(作成日時 < 最終更新日時)

      • 作成日時:2022/6/8 10:00

      • 最終更新日時:2022/6/9 11:00

        ↓↓↓ コピー

    • DEF.txt(作成日時 > 最終更新日時)

      • 作成日時:2022/6/10 9:00

      • 最終更新日時:2022/6/9 11:00


削除済みファイル/フォルダの検索(フィルタリング)

デジタルフォレンジック調査において、削除済みでかつ復元できる可能性があるファイルを網羅的に把握したいケースがあります。そのような場合、MFTパース結果から、削除済みファイル/フォルダのMFTレコードを一括で抽出できます。

次の図は、MFTパース結果の項目「Flag」を、文字列「Deleted」を含む条件でフィルターした結果の例です。


  • 「Flag」に文字列「Deleted」を含む行をフィルターで抽出した例

l-2_03


さらに絞り込むために、ファイル/フォルダのいずれかのみ、指定したフォルダ配下のみ、特定日時など、必要に応じて抽出条件を追加していきます。一般的にMFTレコードは、数万件という単位の数が出力されますので、フィルターを活用して効率的に分析しましょう。

ごみ箱内ファイルの検索(フィルタリング)

ごみ箱内ファイルのMFTレコードを一括抽出する場合は、MFTパース結果の項目「Path」(親フォルダ名)を、ごみ箱のフォルダ名「$Recycle.bin」が含まれるという条件でフィルターします。

ごみ箱内にマルウェアや攻撃者がデータを隠匿している場合、エクスプローラー上のごみ箱に表示されないよう、ごみ箱に入れる前の元のファイル名・ファイルパスを管理するインデックス情報ファイル(「$I」で始まるファイル名)の改ざんや削除を行っている可能性が考えられます。インデックス情報ファイルは、元のファイルと「$I」「$R」以降のファイル名が同一になるルールがありますので、ペアとなるべきインデックス情報ファイルが存在しないなど、不審な点がないかどうかを調査しましょう。

なお、フォルダごとごみ箱に入れられた場合には、フォルダ内のサブフォルダやファイルはリネームされません。その場合、ごみ箱内にあるフォルダの親フォルダ名(ファイルパス)を確認しましょう。ファイルパスの末尾がSID(C:\$Recycle.Bin\(SID))であれば、フォルダごとごみ箱に入れられた場合の最上位フォルダです。正常な状態であれば、最上位フォルダのみが「$R」で始まる名称にリネームされ、ペアとなるインデックス情報ファイルが作成されています。


  • 「Path」に文字列「$Recycle.bin」を含む行をフィルターで抽出した例

l-2_04


代替データストリーム(ADS)の検索(フィルタリング)

ADS(データ内容とは別の情報を、追加した$DATA属性に保持)が存在するファイルをリストアップする必要がある場合は、MFTパース結果の項目「Misc」が空白でない行のみを抽出する条件でフィルターします。

マルウェアや攻撃者が、情報を隠匿するためにADSを利用することがありますので、不審なADSの有無も確認しましょう。

  • 「Misc」が空白でない行をフィルターで抽出した例

l-2_05


USNジャーナル分析での活用・連携

NTFSのUSNジャーナルには、ドライブ内のファイル/フォルダに対する、新規作成、更新、リネーム、移動、コピー、削除などの操作履歴がロギングされています。インシデント調査のタイムライン分析においては、極めて有用な情報です(詳細は次の章で紹介します)。

一方、USNジャーナルには、各ファイル/フォルダの名称は記録されていますが、親フォルダの名称(ファイルパス)は記録されていません。記録されているのは、親フォルダのファイルID(親フォルダID)のみです。そのため、USNジャーナルにロギングされたファイル/フォルダについて、保存されていたファイルパスを明らかにするためには、MFTから親フォルダのファイルIDを検索する必要があります。USNジャーナルを分析する際には、必ず同時にMFTもパースし、表計算ソフトなどで検索可能な形式にしておきましょう。

次の想定例で、MFTパース結果から、実際に親フォルダを調査する方法を紹介します。

  • USNジャーナル

    • ファイル名:123.exe(削除済み)

    • ファイルID:50

    • 親フォルダのファイルID:25

  • mft.exeによるMFTのパース結果例(CSVファイルの抄)

Filename Path FileID Flag
999.txt C:\tmp\system 50 File
test C:\Windows\etc 25 Directory

この例では、過去に存在した「123.exe」が削除され、同ファイルに割り当てられていたファイルID「50」のMFTレコードは、すでに全く別の「C:\temp\system\999.txt」というファイルに再利用されています。この2つのファイルは関連しないと考えるべきでしょう。

一方、親フォルダのファイルID「25」については、フォルダの作成日時が「123.exe」の作成日時以前であれば、親フォルダであったと認定できます。その場合、「123.exe」のファイルパスは次のようになります。

  • C:\Windows\etc\test\123.exe

    ※MFTの「Filename」欄に記録されたフォルダ名「test」が、ファイルパスにおける最下位のサブフォルダ名になります。

なお、有償の商用フォレンジックツールや、一部の無償ツール(NTFS Log Tracker 等)には、自動的にUSNジャーナルとMFTをリンクさせ、親フォルダ名も併せた形でタイムラインを作成できるものがあります。

results matching ""

    No results matching ""