← ブログに戻る

NTFS アンチフォレンジック:攻撃者が実際にやること、そして彼らを暴くもの

· 読了 2 分

NTFS でのアンチフォレンジック手法はどれも何かを残します。理由は構造的です。MFT、USN journal$LogFile、Volume Shadow Copy はそれぞれ同じイベントの異なるビューを記録し、いずれかを変更することそれ自体が他のものが記録するイベントです。1 つのアーティファクトから隠れる攻撃者は、ほぼ常に別のアーティファクトを点灯させます。4 つすべてをまとめて走査する防御者は手強いです。

これがカタログです。各手法について、攻撃者が何をするか、何が残るか、どのアーティファクトが彼らを暴くかを示します。

Timestomping

定番です。SetMACEtimestomp、有名な Invoke-TimeStomp PowerShell スクリプト、その他無数のレッドチームヘルパーが SetFileTime を呼び出すか $STANDARD_INFORMATION を直接書き込んで、ファイルを実際より古く、または新しく見せます。最近のバリエーションは、ファイルをリネームすることで $FILE_NAME も触ります(これは NTFS に FN を更新させます)。その後、元に戻します。「二重リネーム」のトリックが、有能なオペレーターをスクリプトキディから分けます。

何が暴くか。

  • SI/FN の乖離。 単純な SetFileTime は SI だけを触ります。対応する FN のタイムスタンプはまだ実際の作成/リネーム時刻のままです。4 つの MFT タイムスタンプ を参照してください。SI created が FN created から数秒以上離れているレコードはいずれも疑わしいです。SI created が FN created より前のものは自然には不可能です。ファイルは名付けられる前には存在できません。
  • サブ秒の粒度。 NTFS はタイムスタンプを 100 ナノ秒のティックで保持します。ネイティブ操作は下位桁にノイズを残します。ほとんどの timestomping ツールは秒単位に丸めます。複数のファイル間できれいに揃った .0000000 のサフィックスの列はフィンガープリントです。
  • $UsnJrnl の真実。 USN ジャーナルはエントリが書き込まれる際に実際の変更時刻をログします。レコードの $DATA 属性に対する USN DATA_OVERWRITE が MFT の SI modified 時刻と不一致なら、timestomping を現行犯で押さえたことになります。
  • VSS スナップショット。 古い Volume Shadow Copy は stomp 前の値を保持しています。同じレコードについて現在の $MFT をスナップショットの $MFT と差分すれば、変化が見えます。

二重リネームのトリックは SI/FN の乖離を打ち負かします。USN ジャーナルエントリや VSS の差分は打ち負かしません。

ペイロード隠しとしての代替データストリーム

名前付きの $DATA 属性(legit.docx:payload.exe)はエクスプローラから見えず、dir から見えず、可視ファイルが裏切らない実行ファイル、スクリプト、エンコードされた設定を格納するのに日常的に使われます。wmic process call createrundll32、または Get-Content -Stream + Invoke-Expression で起動されます。

何が暴くか。

  • MFT 走査はあらゆる $DATA 属性を露わにします。 ファイル単位の列挙は、調べることを思いつかなかったファイルのストリームを見落とします。MFT はそうではありません。代替データストリーム を参照してください。
  • Sysmon Event ID 15(FileCreateStreamHash) は ADS 作成にハッシュを付与する唯一の Sysmon イベントです。Sysmon がデプロイされ設定されていれば、これでストリームドロップを直接捉えられます。
  • Zone.Identifier ブラウザからのダウンロードはこの ADS を持ちます。\Downloads\ のバイナリにこれが欠けていれば、それはブラウザから来ていないか、意図的に剥がされた(Unblock-File)かのいずれかです。

単一ファイルのワイプ

洗練されたワイパーはファイルのクラスタを上書きしてから MFT レコードを削除します。洗練度の低いもの(デフォルトの SDelete、cipher /wdel /f)はデータを上書きしますが MFT レコードは残します。

何が暴くか。

  • MFT レコード自体。 $FILE_NAME$STANDARD_INFORMATION が無傷の削除済みレコードは、ファイルに名前を与え、親ディレクトリを示し、削除時のタイムスタンプを示します。削除を生き残るもの を参照してください。
  • $UsnJrnl の作成と削除エントリ。 データがワイプされたかどうかとは無関係に、両方のイベントがログされます。
  • $LogFile メタデータ操作のトランザクションレコードがロールオーバーされるまでそこにあります。
  • VSS スナップショット。 ワイプ前のスナップショットが存在すれば、ファイルはそこに無傷で残っています。

MFT レコード自体のワイプ

より積極的な攻撃者は、新規ファイルを書き込んで NTFS にスロットを再利用させ、削除済みレコードを上書きします。これは成功します。スロットは失われます。削除自体は依然としてイベントです。

何が暴くか。

  • シーケンス番号のインクリメント。 $UsnJrnl または $LogFile からのレコード R シーケンス S への参照は今や古く、現在のレコードはシーケンス S+1 です。クロスリファレンスが再利用を露わにします。
  • $UsnJrnl の履歴。 元の作成、変更、削除は依然として記録されています。新規ファイルの作成も同様です。再利用は USN の痕跡を残します。
  • VSS スナップショット。 再利用前の $MFT のスナップショットコピーは、シーケンス S での元のレコードを依然として保持しています。

$UsnJrnl の切り詰め

変更ジャーナルは有限です。ノイジーな操作(多数のファイル書き込み)を実行する攻撃者は、$UsnJrnl をラップさせて古いエントリを追い出すことができます。ほとんどのインストールではデフォルトサイズは 32 MB、Server ではより大きくなります。

何が暴くか。

  • 高い開始 USN を持つ短い $UsnJrnl ホストが何週間オンラインだった上で、ジャーナルの最初のレコードがインシデントの数時間または数分前であれば、不自然に速くローテートされています。期待されるレートを計算してください。
  • $LogFile は同じようにローテートしません。 ボリュームに合わせてサイズが設定され、別のポリシーで上書きされます。USN ジャーナルを押し出した操作が、$LogFile にはまだ残っていることがあります。
  • ノイジーな操作自体が数千の MFT レコードを残します。 ジャーナルをラップするのに必要な数千の churn したファイルは $MFT に見えます。この手法は騒がしいです。

$UsnJrnl の削除

fsutil usn deletejournal /D C: はジャーナルを完全に削除します。再作成されたジャーナルは新しい USN カウンタで始まります。$Extend\$UsnJrnl MFT レコードのシーケンス番号は削除と再作成を反映してインクリメントします。

何が暴くか。

  • 疑わしく高い最初の USN または疑わしく最近の最初のレコード。 最初のレコードがインシデントより後の新規作成された $UsnJrnl は決め手です。
  • $Extend ディレクトリエントリのシーケンス番号のインクリメント。 $UsnJrnl 自体の MFT レコードはベースラインより高いシーケンスを持ちます。
  • VSS スナップショット。 削除前のスナップショットは依然として元のジャーナル全体を含みます。vshadowmount でマウントし、抽出してください。

マルウェアをシステムファイル名にリネーム

ツールを svchost.exelsass.execmd.exe、または他の見慣れた Windows バイナリとして隠します。厳密には MFT アンチフォレンジックではありませんが、実環境で最もアナリストを混乱させるトリックです。

何が暴くか。

  • $FILE_NAME の親ディレクトリ参照。 正規の svchost.exeC:\Windows\System32 に存在します。\Users\bob\AppData\Local\Temp\ にあるその名前のファイルはそれではありません。名前だけでなく親参照を確認してください。
  • $DATA のサイズとハッシュ。 正規のバイナリはよく知られています。偽物を SHA-256 し比較してください。不一致は即座に分かります。
  • Zone.Identifier ADS がダウンロードされたものなら。
  • コード署名。 Microsoft バイナリは署名されています。ディスク上のファイルで Authenticode 署名を確認します。偽物には署名がないか、Microsoft 以外の署名があります。

ハードリンクの操作

あまり一般的ではありませんが知っておく価値があります。同じ MFT レコード上の複数の $FILE_NAME 属性により、攻撃者は同じペイロードを 2 つのディレクトリに同時に表示できます。一方から削除しても 1 つの $FILE_NAME が削除されるだけで、最後のリンクが消えるまでファイルは存続します。

何が暴くか。

  • レコードヘッダの hardlink_count フィールド。 カウントが > 1 のレコードでは、すべての $FILE_NAME がリンクの 1 つです。MFT はすべてを示します。
  • $UsnJrnlHARD_LINK_CHANGE reason ハードリンクの作成と削除時。

$LogFile の改ざん

fsutil には「ログファイルを削除する」オプションは提供されていませんが、ログは自身でローテートし、ボリュームを満たす操作はエントリを押し出すことがあります。洗練されたオペレーターは、インシデント周辺のトランザクションレコードを取り除くために $LogFile をスクラブしようとすることがあります。

何が暴くか。

  • $LogFile は Windows 稼働中はロックされています。 改ざんにはボリュームのアンマウントが必要で、それ自体がイベントです。
  • 改ざん前の VSS スナップショット には依然として完全なログがあります。

ランサムウェアの MFT 落書き

一部のランサムウェアファミリー(Petya、NotPetya、それ以降のいくつか)はボリュームをマウント不能にするために $MFT を故意に破壊します。これは回避ではなく破壊で、目標は denial of service であり、ステルスではありません。

何が暴くか。

  • FILE があるべきところに BAAD レコード。 ワイプ後に NTFS が残す修復不能レコードの墓標です。落書きする側が BAAD を書かないこともあり、その場合レコードは解析できませんがシグネチャスキャン可能です。
  • 起動不能なシステム、しかしフォレンジック的に貴重なイメージ。 データクラスタは通常無傷です。ボリュームを FILE レコードでシグネチャスキャンすれば、テーブルのほとんどは読み取り可能です。詳細は MFT におけるランサムウェアパターン を参照してください。

一般原則

NTFS のすべてのアンチフォレンジック手法は、どこかにアーティファクトを残します。理由は構造的です。$MFT$UsnJrnl$LogFile、VSS はそれぞれ同じイベントの異なるビューを記録します。MFT をスクラブする攻撃者は USN エントリを残します。USN ジャーナルを削除する攻撃者は新しい $Extend\$UsnJrnl のシーケンス番号のバンプと無傷の VSS スナップショットを残します。vssadmin delete shadows を実行する攻撃者は Windows イベントログエントリ(System 8224、Application VSS 8194)と、おそらく vssadmin.exe の呼び出しに対する Sysmon Event ID 1 を残します。

4 つすべての NTFS アーティファクトに加えてイベントログと VSS を走査するトリアージが、洗練されたオペレーターを捕まえます。単一アーティファクトのトリアージは彼らを見落とします。

参考資料

外部リソース