16章
Hands-on-2
ここでは、CDIR-Aに含まれる「mft.exe」により、調査対象の侵害PCから保全した$MFTファイルをパースし、削除されたファイルを調査するハンズオンを行います。
CDIR-A(Analyzer)は、以下のURL(株式会社サイバーディフェンス研究所の公式Githubリポジトリ)から入手できます(すでに最新版をセットアップ済みであれば、改めてダウンロードする必要はありません)。
https://github.com/CyberDefenseInstitute/CDIR-A
MFT($MFTファイル)のパース
解析対象の$MFTファイル
このハンズオンで解析対象とする$MFTファイルは、演習用データの以下の相対パスに保存されています。
s16\h2_m1-2\C_$MFT
なお、この$MFTファイルは、CDIR-C(CDIR Corrector)で保全したものです。元のファイル名は「$MFT」ですが、CDIR-Cによる保全時に、保全したドライブレターを示す「C_」が、自動的にファイル名の先頭へ付与されています。
mft.exeの実行
mft.exeを使用して、上記の解析対象$MFTファイルをパースし、CSVファイルに出力します。
コマンドプロンプトを起動し、以下の手順でmft.exeを実行して下さい。
- cdコマンドでCDIR-A の「parser」フォルダ(mft.exeが保存されたフォルダ)へ移動
cd <CDIR-Aの格納パス>\CDIR-A\parser
- 出力先フォルダ(-o オプション)と解析対象アーティファクトのフォルダを指定して、mft.exeを実行
mft.exe -o %userprofile%\desktop\out\MFT <演習用データの格納パス>\s16\h2_m1-2
※ 出力先フォルダは、任意のフォルダ名で構いません。現存しないフォルダの場合は、新規作成しておく必要があります(現存しないフォルダを指定すると、末尾のフォルダ名がCSVファイル名として出力されます)。また、CDIR-Aの仕様上、出力先フォルダに同名のCSVファイルがあっても、警告なしにデータを書き込む(Append)ため、出力先フォルダは空にしておくことを推奨します。
- 以下の処理結果メッセージが表示されれば完了
input: <演習用データの格納パス>\s16\h2_m1-2\C_$MFT
output: C:\Users\(ユーザー名)\desktop\out\MFT\C_$MFT_output.csv
MFT のパース結果は、指定した出力フォルダのCSVファイル「C_$MFT_output.csv」に保存されます。
出力したCSVファイルの分析
分析準備
上記で出力したCSVファイル(C_$MFT_output.csv)を、エクスプローラーからダブルクリックなどで開きます。
以下、LibreOfficeの表計算アプリケーション(Calc)が、CSVファイルのデフォルト編集用アプリケーションとして設定されている想定で説明します。
「テキストのインポート」設定画面が表示されますので、「文字エンコーディング」には「Unicode(UTF-8)」、区切り文字には「タブ」を指定して下さい。
CSVファイルの表示後、列幅の調整、タイトル行の固定、オートフィルター有効化などの整形を行い、分析しやすいように準備をしましょう。
- CSVから整形済みのCalcドキュメント例

削除済みファイル/フォルダの検索
まず、削除済みファイルのリストを抽出します。
MFTのパース結果から、削除済みファイル/フォルダに絞ってリストする場合は、項目名「Flag」に「Deleted」の文字列を含むことを条件としてフィルターします。
- 「Flag」によるフィルター


ごみ箱から削除されたファイルの検索
削除済みファイル/フォルダに絞ったリストから、さらに条件を追加して、ごみ箱内のファイルのみに絞ってみましょう。項目名「Path」に「$Recycle.bin」の文字列を含むことを条件としてフィルターします。
- 「Path」によるフィルター


これで、ごみ箱から削除されたファイル/フォルダに絞り込まれました。
ごみ箱から削除されたファイルの1つである「$RC22G2G.txt」について調査してみましょう。さらにフィルター条件を追加して、このファイルとそのペアとなるインデックス情報ファイルのみを表示してみます。
項目名「Filename」に対してフィルター条件を追加します。ファイル名先頭の「$R」を除く、「C22G2G.txt」の文字列を含むことを条件としてフィルターしてみましょう。
- 「Filename」によるフィルター(条件設定画面は省略)

ペアとなるインデックス情報ファイル「$IC22G2G.txt」も、削除済みとしてMFTレコードが残っています。
タイムスタンプの分析
次に、「$RC22G2G.txt」のタイムスタンプから、元のファイルがごみ箱へ入れられた日時を分析しましょう。
MFTレコードのタイムスタンプが更新されるタイミングは、この節で紹介しました。更新タイミングのチャート図($STANDARD INFORMATION)を再掲します。
| $STANDARD INFORMATION($SI)属性 | 新規作成 | 変更 | コピー(複製) | リネーム | 移動(同一ドライブ内) | 移動(別ドライブ間) | 削除 | アクセス |
|---|---|---|---|---|---|---|---|---|
| Created | 〇 | ― | 〇 | ― | ― | ― | ― | ― |
| Modified | 〇 | 〇 | ― | ― | ― | ― | ― | ― |
| Accessed | 〇 | 〇 | 〇 | ― | ― | 〇 | ― | 〇(*) |
| RecordChanged | 〇 | ― | 〇 | 〇 | 〇 | 〇 | 〇 | ― |
ごみ箱へ入れる操作は、この節で解説したように、「削除」ではなく「移動」になります。また、同じCドライブの中での移動ですので、上記のチャート図では「移動(同一ドライブ内)」になります。したがって、ごみ箱へ入れる操作をしたタイミングで更新されるタイムスタンプは、「RecordChanged」のみです。
「$RC22G2G.txt」ファイルのタイムスタンプを、MFTパース結果から確認してみましょう。
- 「$RC22G2G.txt」ファイルのタイムスタンプ($SI属性)

「$RC22G2G.txt」ファイルの「RecordChanged」($SI属性)は、
- 2023/06/14 10:57:26.109
を示しています。さらに、同時刻に、インデックス情報ファイル「$IC22G2G.txt」が作成されたことも確認できます。したがって、この時刻にごみ箱へ入れる操作を行ったものと考えられます。
なお、「$RC22G2G.txt」ファイルの、ごみ箱移動前の原ファイルが新規に作成された日時は、「Created」と「Modified」がほぼ同時刻であることから、
- 2022/06/14 10:46:41 ころ
であることが確認できます。
「$RC22G2G.txt」ファイルの、$SI属性と$FN属性のタイムスタンプも比較してみましょう。ごみ箱への移動により、$SI属性「RecordChanged」のみ更新された日時になっていることを除くと、すべて同一です。よって、タイプスタンプの改ざんはないと判断してもよいでしょう(実際に改ざんは行っていません)。

次は、「$RC22G2G.txt」ファイルの原ファイル名とファイルパスを調査しましょう。さらに、原ファイルに記録されていたデータ内容の復元も実施します。
削除されたデータ内容の確認($DATA)
「$RC22G2G.txt」ファイルの原ファイル名とファイルパスは、インデックス情報ファイル「$IC22G2G.txt」の$DATAから取得します。インデックス情報ファイルはサイズが小さく、「Resident」であるため、ファイルが削除されていても、MFTレコードが残っていれば、$DATAからデータ内容を復元できます。
$DATAの記録内容は、MFTのパース結果からは取得できません。$MFTファイルをFTK Imagerで読み込み、HEXダンプをプレビューする必要があります。保全した$MFTファイル(C_$MFT)をFTK Imagerで読み込み、$DATAを参照してみましょう。
$MFTファイルを読み込む手順例は次のとおりです。
- 「Add Evidence Item」アイコンをクリックし、「Select Source」画面で「Contents of a Folder」を選択して、$MFTファイル(
C_$MFT)が保存されたフォルダを指定します。


- $MFTファイル(
C_$MFT)を選択して、HEXダンプをプレビューします。

ではまず、「$RC22G2G.txt」の原ファイル名・ファイルパスを確認するため、ごみ箱から削除された「$IC22G2G.txt」の$DATAを参照してみましょう。
プレビューウィンドウを右クリックし、コンテキストメニューから「Find」を選択して、「Find What」欄に、ファイル名「$IC22G2G.txt」を入力します。また、「Type」-「Unicode」をチェックオンにして下さい。

「Find」ボタンをクリックすると、「$IC22G2G.txt」のMFTレコードにヒットします。

「$IC22G2G.txt」の$DATAに記録されたファイルパスから、「$RC22G2G.txt」がごみ箱に入れられる前の原ファイル名は、
C:\Windows\Temp\temp.txt
であったことが確認できました。
次に「$RC22G2G.txt」のデータ内容を確認してみましょう。「$RC22G2G.txt」のファイルサイズは56バイトなので、「Resident」です。ごみ箱からも削除済みの状態ですが、MFTレコードが残っているため、データ内容を$DATAから確認できます。
再びコンテキストメニューから「Find」を選択して、「$RC22G2G.txt」をテキスト検索します(Down方向でヒットしない場合は、Up方向へ検索して下さい)。

「$RC22G2G.txt」(C:\Windows\Temp\tem64D5.tmp)のデータについて、次の内容を確認できました。
This is a temporary file.
このように、MFTパース結果の分析で調査対象ファイルを絞りこみ、$MFTファイル内の調査対象ファイルに関連するMFTレコードを検索することで、効率的に削除された「Resident」のファイル内容を復元できます。なお、「Non-Resident」のファイル内容を復元するためには、データ領域を含むディスクイメージが必要です。
また、代替データストリーム(ADS)の内容も、同様の手順で確認できます。以下の図は、FTK Imagerの「Find 」で、ADS名の文字列「Zone.Identifier」を検索した例です。
- 代替データストリーム(ADS)を保有するファイルのMFTレコード

問題
想定事案
- インターネットからダウンロードしたファイル「賞与.zip」が、マルウェア感染の端緒になった可能性があり、さらに関係する情報を調査します。
- 調査対象ファイル
- MFTパース結果から、削除済みのファイルであり、かつ「賞与.zip」がダウンロードされる最も直前に作成されたファイルを調査して下さい。ダウンロード日時は、「賞与.zip」の作成日時とします(「賞与.zip」は現存するファイルです)。
- Flag
- 調査対象ファイルのデータ内容に記録された、テキスト文字列を入力して下さい。なお、テキスト文字列はアルファベット小文字「m」(エム)で始まり、最後は数字の「2」で終わります。