INDX アーティファクト(1)でも書いた通り、NTFSのフォルダ構造では$INDEX_ROOT属性と$INDEX_ALLOCATION属性を使います。$INDEX_ROOTはResidentな属性でありMFTエントリ内のみを保存場所に使いますが、$INDEX_ALLOCATION、いわゆるINDXレコードはNon-Residentな属性でありクラスタを割り当てます。例えば図のように、ファイル/フォルダの作成、更新、削除の処理の組み合わせによっては、フォルダに相当するMFTエントリが上書きされてもINDXレコード使っていたクラスタは上書きされない場合があります。
fteは、①や②のようにMFTのエントリとして情報が残っていれば、その内容に従いINDXレコードをパースしますが、③の状態にあるような未割当領域に存在するINDXレコードはそのままではパースすることができません。別途カービング系のツールを使ってファイルとして抽出することにより、fteでパースすることはできます。
以下ではThe Sleuth Kitのblklsとカービングツールのscalpelを使ってINDXレコードをファイルとして切り出す方法を例にします。
未割当領域の抽出
blklsはデフォルトで未割当領域のデータを表示しますので、特別なオプションを付与する必要はありません。Windows環境では以下のような形式で実行します。
(ddイメージ)
> blkls.exe [-o オフセット] イメージファイル > unallocated(E0イメージ)
> blkls.exe -i ewf [-o オフセット] イメージファイル > unallocated(物理ドライブ)
> blkls.exe -o オフセット \\.\PhysicalDrive数字 > unallocated(論理ドライブ)
> blkls.exe \\.\ドライブレター: > unallocated
物理イメージや物理ドライブの場合には処理対象のファイルシステムのオフセット値を指定しなければなりませんので、先にmmlsを実行して得た値を入力することになります。
生成するunallocatedファイルのサイズは、エクスプローラ等で空き領域と表示されるサイズに相当しますので、十分に空き領域のあるドライブを出力先に指定するなど考慮する必要があります。
INDXレコードのカービング
代表的なカービングツールとしてはforemostとscalpelがありますが、Windows環境であればWindowsバイナリが用意されているscalpelが手軽に使えておすすめです。
INDXレコードは通常4096バイトで構成され、シグネチャも定義されているためカービングに適したデータ構造です。scalpel.confに以下の設定を追記します。
INDX y 4096 \x49\x4E\x44\x58\x28\x00\x09\x00
5バイト目からはfixup関連などの値で本来のシグネチャの意味合いとは異なりますが、Windows 8を含む現在普及しているWindowsではこのパターンになります。取りこぼしが気になる、いわゆる再現率を上げたい場合は先頭4バイト"\x49\x4E\x44\x58"のみをシグネチャに利用してください。設定ファイルの準備ができたら以下の形式でscalpelを実行します。
> scalpel.exe [-q サイズ] unallocated
-qオプションは、ここで指定したサイズを対象ファイルのブロック単位として扱い、ブロックの先頭からシグネチャがはじまるデータのみ抽出します。INDXレコードは通常セクタやクラスタの途中からはじまることはないため、-q 512などを指定することにより、ノイズを減らしつつ高速に処理することができます。-q 4096でも問題ないと考えていましたが、試した限りでは抽出数が激減しましたので、-q 512とするか指定しないで実行してみたほうがよいかもしれません。
実行終了後は実行時のフォルダにscalpel-outputフォルダができていて、抽出したINDXレコードが保存されています。
未割当領域内INDXレコードのパース
fteのINDXタブを指定した状態で、生成したファイルをドラッグ&ドロップするとパースした結果を表示します。
未割当領域内に存在するINDXレコードをパースすることにより、着目しているファイル/フォルダ過去のメタデータ(サイズ、タイムスタンプ)が得られる可能性があります。また、pagefile.sysファイルにもINDXレコードの残骸は残っているため、INDXレコードをカービングすることにより有用な情報が見つかるかもしれません。