「メール・クラウドストレージの証跡」「Windowsレジストリの深堀り分析」「暗号化・隠蔽ファイルの検出」「カーネル・ドライバレベルの異常検出」「アンチフォレンジック対策の発見」の5本柱のコマンドを徹底解説 対応OS:Windows / macOS / Linux

解析

フォレンジック系コマンド記事の第4弾です。第1〜3弾でイベントログ・ネットワーク証跡・USB履歴・メモリ解析・ブラウザ証跡・タイムライン再構築・ログ改ざん検出など幅広いテーマを扱ってきました。今回はさらに踏み込んだ領域へ進みます。

テーマは「メール・クラウドストレージの証跡」「Windowsレジストリの深堀り分析」「暗号化・隠蔽ファイルの検出」「カーネル・ドライバレベルの異常検出」「アンチフォレンジック対策の発見」の5本柱です。攻撃者が「証拠を残さないように」工夫するほど、その痕跡が別の場所に刻まれます。その矛盾を突くコマンドを徹底解説します。

⚠️ 重要: 本記事の内容は自分が管理するシステムの調査・学習を目的としています。他者のシステムへの無断調査は不正アクセス禁止法の対象です。組織内での調査は必ず法務・情報セキュリティ部門の承認のもとで実施してください。


目次

  1. 【メール・クラウドストレージ証跡編】デジタル通信の痕跡を追うコマンド
  2. 【レジストリ深堀り編】Windowsの「記憶」を読み解くコマンド
  3. 【暗号化・隠蔽ファイル検出編】隠されたデータの存在を暴くコマンド
  4. 【カーネル・ドライバ編】OSの深部で起きている異常を検出するコマンド
  5. 【アンチフォレンジック検出編】証拠隠滅の痕跡を逆に証拠にするコマンド
  6. まとめ

【メール・クラウドストレージ証跡編】デジタル通信の痕跡を追うコマンド

情報漏えいインシデントの多くは「メール」か「クラウドストレージ」を経路として発生します。IPA「企業における情報漏えいの実態調査(2024年版)」によると、メール誤送信・意図的な社外メール転送・クラウドへの無断アップロードが、内部犯行による情報持ち出しの3大手口として挙げられています。これらの通信は必ずPC上に何らかの痕跡を残します。

① Outlookのメール送受信ログを調べる(Windows)

MicrosoftOutlookはメールデータをOSTファイル・PSTファイルとしてローカルに保存します。また、送受信ログや添付ファイルの一時展開先にも証拠が残ります。

Windows(PowerShell):

# OutlookのデータファイルとOSTファイルの場所を確認
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Outlook\" -Recurse -Include "*.ost","*.pst" |
  Select-Object FullName, LastWriteTime, @{N='SizeMB';E={[math]::Round($_.Length/1MB,2)}} |
  Format-Table -AutoSize

# Outlookが最近アクセスしたファイルをレジストリで確認
reg query "HKCU\Software\Microsoft\Office\16.0\Outlook\Profiles" /s |
  Select-String "001e6610\|001f6610" | Select-Object -First 20

# 添付ファイルの一時展開フォルダを確認(OLKxxxx形式の隠しフォルダ)
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Windows\INetCache" -Recurse -Force |
  Where-Object { $_.Name -match "^OLK" } |
  ForEach-Object {
    Get-ChildItem $_.FullName -Force |
      Select-Object FullName, LastWriteTime, @{N='SizeKB';E={[math]::Round($_.Length/1KB,1)}}
  } | Sort-Object LastWriteTime -Descending | Select-Object -First 30

# Outlookの送信済みアイテムフォルダのサイズ変化をOSTファイルで確認
$ostFiles = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Outlook\" -Filter "*.ost" -Force
foreach ($f in $ostFiles) {
  Write-Host "ファイル: $($f.Name)"
  Write-Host "  サイズ: $([math]::Round($f.Length/1MB,1)) MB"
  Write-Host "  最終更新: $($f.LastWriteTime)"
}

💡 FACT: OutlookのOSTファイルはExchange/Microsoft 365のオフラインキャッシュです。削除したメールも「Deleted Items」フォルダや「Recoverable Items」として一定期間保持されます。Microsoft 365では管理者がコンプライアンスセンターからeDiscovery(電子証拠開示)ツールで全メールを検索・保全できますが、ローカルのOSTファイルにも削除済みメールのキャッシュが残ることがあります。

② メールヘッダーを解析して送信経路を追跡する

フィッシングメールや不審なメールの真の送信元を特定するには、メールヘッダーの解析が有効です。

macOS / Linux(コマンドラインでメールヘッダーを解析):

# メールヘッダーファイルからReceivedヘッダーを時系列で抽出
grep "^Received:" email_header.txt | tac

# メール送信IPアドレスを抽出
grep -E "Received: from|X-Originating-IP:" email_header.txt |
  grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | sort -u

# SPF・DKIM・DMARC認証結果を確認(なりすまし検出)
grep -E "Authentication-Results:|DKIM-Signature:|Received-SPF:" email_header.txt

# メッセージIDの送信ドメインを確認
grep "^Message-ID:" email_header.txt

# X-Mailerヘッダーで使用メールクライアントを特定
grep "^X-Mailer:\|^User-Agent:" email_header.txt

Windows(PowerShell):

# emlファイルからヘッダー部分のみを表示
$eml = Get-Content "suspicious_email.eml" -Encoding UTF8
$eml | Where-Object { $_ -match "^Received:|^From:|^X-Originating|^Authentication" }

③ クラウドストレージの同期ログを調べる

OneDrive・Dropbox・Google Driveなどのクラウドストレージクライアントは、ファイルの同期ログをローカルに保存します。「どのファイルをいつクラウドにアップロードしたか」を後から追跡できます。

Windows(PowerShell):

# OneDriveの同期ログを確認
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\OneDrive\logs" -Recurse -Include "*.log" |
  Sort-Object LastWriteTime -Descending | Select-Object -First 5 |
  ForEach-Object { Write-Host "=== $($_.Name) ==="; Get-Content $_.FullName | Select-Object -Last 50 }

# OneDriveで同期されたファイルの最近の変更を確認
Get-ChildItem "$env:USERPROFILE\OneDrive" -Recurse |
  Sort-Object LastWriteTime -Descending | Select-Object -First 30 |
  Select-Object FullName, LastWriteTime, @{N='SizeKB';E={[math]::Round($_.Length/1KB,1)}}

# Dropboxの同期ログの場所を確認
$dropboxLog = "$env:APPDATA\Dropbox\logs"
if (Test-Path $dropboxLog) {
  Get-ChildItem $dropboxLog -Recurse -Include "*.txt","*.log" |
    Sort-Object LastWriteTime -Descending | Select-Object -First 5 |
    ForEach-Object { Get-Content $_.FullName | Select-String "upload\|sync\|move" | Select-Object -Last 20 }
}

macOS:

# OneDriveのログ確認
ls -la ~/Library/Logs/OneDrive/ 2>/dev/null
tail -100 ~/Library/Logs/OneDrive/*.log 2>/dev/null | grep -i "upload\|sync\|error"

# iCloudの同期ログ
log show --predicate 'subsystem == "com.apple.clouddocs"' --last 7d | grep -i "upload\|push"

【レジストリ深堀り編】Windowsの「記憶」を読み解くコマンド

Windowsのレジストリはシステムのあらゆる設定と履歴を記録した巨大なデータベースです。フォレンジック調査においてレジストリは「Windowsの長期記憶」とも呼ばれ、ユーザーの行動・接続したデバイス・実行したプログラム・アクセスしたネットワークなど膨大な情報が眠っています。

① UserAssistキー — GUIで実行したプログラムの履歴

UserAssistキーはエクスプローラー経由で実行されたプログラムの実行回数・最終実行日時をROT13形式でエンコードして記録しています。

Windows(PowerShell):

# UserAssistキーの生データを確認
Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist" |
  ForEach-Object {
    Get-ChildItem $_.PsPath | ForEach-Object {
      Get-ItemProperty $_.PsPath | Select-Object * -ExcludeProperty PS*
    }
  }

# ROT13デコードしてプログラム名を読み取る(PowerShell)
function Decode-ROT13 {
  param([string]$text)
  $result = ""
  foreach ($c in $text.ToCharArray()) {
    if ($c -match '[A-Za-z]') {
      $base = if ($c -cmatch '[a-z]') { [int][char]'a' } else { [int][char]'A' }
      $result += [char](($([int][char]$c) - $base + 13) % 26 + $base)
    } else { $result += $c }
  }
  return $result
}

# UserAssistのキー名をROT13デコードして実行プログラム一覧を表示
$uaPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist"
Get-ChildItem $uaPath | ForEach-Object {
  Get-ChildItem "$($_.PsPath)\Count" -ErrorAction SilentlyContinue |
    Get-ItemProperty | Get-Member -MemberType NoteProperty |
    Where-Object { $_.Name -notlike "PS*" } |
    ForEach-Object { Write-Host (Decode-ROT13 $_.Name) }
}

② MUICache — 実行されたアプリケーションの表示名の記録

MUICacheはプログラムが実行されたときにその表示名をキャッシュするレジストリキーです。プログラムが削除された後もエントリが残るため、「かつてここに存在したが今はないプログラム」の証拠になります。

Windows(PowerShell):

# MUICacheに記録されたアプリケーションの一覧
Get-ItemProperty "HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" |
  Get-Member -MemberType NoteProperty |
  Where-Object { $_.Name -notlike "PS*" } |
  Select-Object Name | Format-Table -AutoSize

# 特定のパスに関連するエントリを検索(Cドライブ以外から実行されたものを抽出)
reg query "HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" |
  findstr /i "USB\|Removable\|Downloads\|AppData\|Temp\|tmp"

③ WordWheelQuery — エクスプローラーの検索履歴

エクスプローラーの検索ボックスに入力したキーワードが記録されています。「どんなファイルを探していたか」が分かります。

Windows(コマンドプロンプト):

# エクスプローラーの検索履歴を確認
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\WordWheelQuery"

# PowerShellで見やすく表示(MRU順に並べて表示)
$key = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\WordWheelQuery"
$props = Get-ItemProperty $key
$mruOrder = $props.MRUListEx
$props | Get-Member -MemberType NoteProperty |
  Where-Object { $_.Name -match "^\d+$" } |
  Sort-Object { [int]$_.Name } |
  ForEach-Object {
    $bytes = $props.$($_.Name)
    $text = [System.Text.Encoding]::Unicode.GetString($bytes).TrimEnd([char]0)
    Write-Host "[$($_.Name)] $text"
  }

④ NetworkList — 過去に接続したWi-Fiネットワークの詳細

接続したことのあるすべてのネットワーク情報が記録されています。「どこのWi-Fiに接続したか」「いつ初めて接続したか」がわかります。

Windows(PowerShell):

# 接続したことがある全ネットワークの一覧と最終接続日時
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged\*" |
  Select-Object ProfileGuid, Description, FirstNetwork, DefaultGatewayMac |
  Format-Table -AutoSize

# ネットワーク接続の日時情報
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles" |
  ForEach-Object {
    $p = Get-ItemProperty $_.PsPath
    [PSCustomObject]@{
      Name        = $p.ProfileName
      Category    = switch ($p.Category) { 0{"パブリック"} 1{"プライベート"} 2{"ドメイン"} }
      DateCreated = if ($p.DateCreated) {
        [datetime]::FromFileTime([BitConverter]::ToInt64($p.DateCreated, 0))
      }
      DateLastConnected = if ($p.DateLastConnected) {
        [datetime]::FromFileTime([BitConverter]::ToInt64($p.DateLastConnected, 0))
      }
    }
  } | Sort-Object DateLastConnected -Descending | Format-Table -AutoSize

💡 FACT: WindowsのNetworkListレジストリキーは、PCをVPNで接続した場合でも通常のネットワーク情報が記録されます。フォレンジック調査では「調査対象者がどのロケーション(社内・自宅・カフェ等)でPCを使っていたか」を時系列で再構築する際の重要な証拠になります。


【暗号化・隠蔽ファイル検出編】隠されたデータの存在を暴くコマンド

機密データを隠蔽するために暗号化や偽装が使われることがあります。しかし「暗号化されたファイルが存在する」という事実自体は隠せません。ファイルのエントロピー(ランダム性)・拡張子と実際のファイル形式の不一致・隠しボリュームの痕跡などから、暗号化・隠蔽の存在を検出します。

① fileコマンドで拡張子偽装を検出する(macOS/Linux)

fileコマンドはファイルの先頭バイト(マジックナンバー)を読んで実際のファイル形式を判定します。拡張子を.txtや.jpgに偽装した実行ファイルや暗号化済みアーカイブを発見できます。

macOS / Linux:

# ファイルの実際の種類を判定
file suspicious_file.txt
file /path/to/unknown_binary

# ディレクトリ内のすべてのファイルを一括で判定
find /home/user/Downloads -type f | xargs file 2>/dev/null | head -50

# 拡張子と実際のファイル形式が異なるファイルを検出
find /tmp /home -type f 2>/dev/null | while read f; do
  ext="${f##*.}"
  type=$(file -b "$f" 2>/dev/null | cut -d, -f1)
  case "$ext" in
    txt) echo "$type" | grep -qiv "text\|ASCII" && echo "⚠ 偽装疑い: $f ($type)" ;;
    jpg|jpeg) echo "$type" | grep -qiv "JPEG\|image" && echo "⚠ 偽装疑い: $f ($type)" ;;
    pdf) echo "$type" | grep -qiv "PDF" && echo "⚠ 偽装疑い: $f ($type)" ;;
    exe|dll) echo "$type" | grep -qiv "PE32\|executable" && echo "⚠ 偽装疑い: $f ($type)" ;;
  esac
done

② エントロピー分析で暗号化・圧縮ファイルを検出する

暗号化されたファイルや高度に圧縮されたファイルは、バイトの分布がほぼ均一になり「エントロピー(情報のランダム性)」が最大値(8.0bit)に近くなります。この特性を使って、通常のファイルに偽装した暗号化データを検出できます。

macOS / Linux(Pythonを使用):

# エントロピー計算スクリプトをワンライナーで実行
python3 -c "
import os, sys, math, collections

def entropy(data):
    if not data: return 0
    counts = collections.Counter(data)
    total = len(data)
    return -sum((c/total)*math.log2(c/total) for c in counts.values())

path = sys.argv[1] if len(sys.argv) > 1 else '.'
for root, dirs, files in os.walk(path):
    for f in files:
        fp = os.path.join(root, f)
        try:
            with open(fp,'rb') as fh:
                data = fh.read(65536)  # 最初の64KBを読む
            e = entropy(data)
            if e > 7.5:  # 7.5以上は暗号化・圧縮の可能性
                print(f'{e:.3f}  {fp}')
        except: pass
" /home 2>/dev/null | sort -rn | head -30

解釈の目安:

  • エントロピー 7.5〜8.0: 暗号化済み・高圧縮ファイル(zip/7z/encrypted)の可能性が高い
  • エントロピー 6.0〜7.5: バイナリ実行ファイル・パックされた実行ファイル
  • エントロピー 0〜4.5: テキストファイル・構造化データ(通常のファイル)

③ TrueCrypt/VeraCryptの隠しボリューム痕跡を検出する

Windows(PowerShell):

# VeraCryptのインストール・使用痕跡を確認
reg query "HKLM\SOFTWARE\VeraCrypt" 2>$null
reg query "HKCU\Software\VeraCrypt" 2>$null
Get-ChildItem "$env:APPDATA\VeraCrypt" -ErrorAction SilentlyContinue

# マウントされたVeraCryptボリュームの痕跡(ドライブレター履歴)
Get-ChildItem "HKLM:\SYSTEM\MountedDevices" | ForEach-Object {
  $name = $_.Name
  if ($name -match "DosDevices") {
    Write-Host $name
  }
}

# VeraCryptのコンテナファイルらしきもの(大容量・高エントロピー・拡張子なし)を検索
Get-ChildItem "C:\Users" -Recurse -ErrorAction SilentlyContinue |
  Where-Object {
    $_.Length -gt 100MB -and
    $_.Extension -eq "" -or $_.Extension -match "^\.tc$|^\.vc$"
  } | Select-Object FullName, Length, LastWriteTime

macOS / Linux:

# 高エントロピーかつ拡張子なしの大容量ファイルを検索
find /home /Users -type f -size +50M ! -name "*.*" 2>/dev/null | while read f; do
  size=$(du -h "$f" 2>/dev/null | cut -f1)
  echo "$size  $f"
done

# dmgやディスクイメージ形式のファイルを確認(macOS)
find /Users -name "*.dmg" -o -name "*.sparseimage" -o -name "*.sparsebundle" 2>/dev/null |
  xargs ls -lh 2>/dev/null

💡 FACT: VeraCryptは「隠しボリューム(Hidden Volume)」機能を持っており、外側のパスワードと内側のパスワードで異なるコンテンツを表示させることができます。この「合理的な否認可能性(Plausible Deniability)」機能はプライバシー保護を目的に設計されましたが、フォレンジック調査では存在の検出がほぼ不可能とされる難関技術です。


【カーネル・ドライバ編】OSの深部で起きている異常を検出するコマンド

rootkitや高度なマルウェアはカーネルレベルで動作し、通常のプロセス一覧やファイル確認コマンドから自身を隠します。OS標準のコマンドを補完する形で、ドライバの整合性・カーネルモジュールの一覧・システムコールの差し替えを確認します。

① ロードされているドライバ・カーネルモジュールを確認する

Windows(PowerShell):

# ロードされているカーネルドライバ一覧
Get-WmiObject Win32_SystemDriver |
  Select-Object Name, DisplayName, PathName, State, StartMode |
  Sort-Object State | Format-Table -AutoSize

# 署名なしドライバを検出(正規ドライバには通常Microsoftの署名がある)
Get-WmiObject Win32_SystemDriver |
  Where-Object { $_.State -eq "Running" } |
  ForEach-Object {
    $path = $_.PathName -replace '"',''
    if ($path -and (Test-Path $path)) {
      $sig = Get-AuthenticodeSignature $path -ErrorAction SilentlyContinue
      if ($sig.Status -ne "Valid") {
        Write-Host "⚠ 署名なし/無効: $($_.Name) -> $path"
        Write-Host "   ステータス: $($sig.Status)"
      }
    }
  }

# System32\drivers以外に置かれたドライバを検出
Get-WmiObject Win32_SystemDriver |
  Where-Object { $_.PathName -notlike "*System32\drivers*" -and $_.PathName -ne $null } |
  Select-Object Name, PathName | Format-Table -AutoSize

Linux:

# ロードされているカーネルモジュールを確認
lsmod

# 特定モジュールの詳細を確認
modinfo suspicious_module_name

# 最近ロードされたカーネルモジュールをdmesgで確認
dmesg | grep -E "module\|insmod\|rmmod" | tail -30

# /proc/modulesと/sys/module の内容を比較(rootkitはここを書き換える)
ls /sys/module/ | sort > /tmp/sys_modules.txt
cat /proc/modules | awk '{print $1}' | sort > /tmp/proc_modules.txt
diff /tmp/sys_modules.txt /tmp/proc_modules.txt
# 差異がある場合はrootkitの可能性

# dmesgでカーネルの警告・エラーを確認
dmesg --level=warn,err | tail -50

② Windowsのカーネルパッチを検出する(DKOM/KPP関連)

Windows(PowerShell):

# カーネルの整合性チェック(Windows Defender Resource Guard)
Get-CimInstance -Namespace "root/Microsoft/Windows/DeviceGuard" -ClassName "Win32_DeviceGuard" |
  Select-Object VirtualizationBasedSecurityStatus, CodeIntegrityPolicyEnforcementStatus

# Secure Boot状態の確認
Confirm-SecureBootUEFI 2>$null
if ($?) { Write-Host "Secure Boot: 有効" } else { Write-Host "Secure Boot: 無効または非対応" }

# Early Launch Anti Malware(ELAM)ドライバの確認
Get-WmiObject Win32_SystemDriver |
  Where-Object { $_.StartMode -eq "Boot" } |
  Select-Object Name, PathName, State | Format-Table -AutoSize

# カーネルのバージョンと最終パッチ日時を確認
[System.Environment]::OSVersion
(Get-Item "$env:windir\System32\ntoskrnl.exe").LastWriteTime

③ Linuxのrootkit検出ツールをコマンドで使う

Linux(要インストール):

# rkhunterのインストールと実行
sudo apt install rkhunter
sudo rkhunter --update
sudo rkhunter --check --sk   # --sk:対話的な確認をスキップ

# chkrootkitのインストールと実行
sudo apt install chkrootkit
sudo chkrootkit

# デフォルトのシステムコマンドを置き換えるrootkitを手動確認
# /bin・/usr/binの主要コマンドとディストリビューションのデフォルトハッシュを比較
for cmd in ls ps netstat ss find awk grep; do
  path=$(which $cmd)
  echo -n "$cmd ($path): "
  sha256sum "$path" 2>/dev/null | cut -d' ' -f1
done

# プロセスリストに見えないのにネットワーク接続が存在するか確認(rootkitの典型)
comm_count=$(ss -tunap | grep ESTABLISHED | awk '{print $NF}' | grep -v users | wc -l)
echo "通信はあるがプロセスが見えない接続: $comm_count 件"

【アンチフォレンジック検出編】証拠隠滅の痕跡を逆に証拠にするコマンド

洗練された攻撃者や内部犯行者は、フォレンジック調査を妨害するためにさまざまな「アンチフォレンジック技術」を使います。しかし「証拠を消した」という行為自体が新たな証拠を生みます。このセクションでは、その逆説を活かして証拠隠滅の痕跡を検出する手法を解説します。

💡 FACT: SANS Institute DFIR(Digital Forensics and Incident Response)の研究では、アンチフォレンジックツール(CCleaner・BleachBit・Eraser等)の使用痕跡はWindowsのレジストリ・プリフェッチ・イベントログに必ず残ると報告されています。「証拠を消そうとした事実」は法的手続きにおいて「証拠隠滅の意図」の証明になりえます。

① ファイル削除ツールの使用痕跡を検出する(Windows)

Windows(PowerShell):

# CCleaner・BleachBit・Eraserの使用痕跡をレジストリから確認
$cleaningTools = @(
  "HKLM:\SOFTWARE\Piriform\CCleaner",
  "HKLM:\SOFTWARE\WOW6432Node\Piriform\CCleaner",
  "HKCU:\Software\BleachBit",
  "HKCU:\Software\Heidi Computers\Eraser 6"
)
foreach ($key in $cleaningTools) {
  if (Test-Path $key) {
    Write-Host "⚠ 検出: $key"
    Get-ItemProperty $key | Select-Object * -ExcludeProperty PS* | Format-List
  }
}

# プリフェッチでクリーニングツールの実行痕跡を確認
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
  Where-Object { $_.Name -match "CCLEANER|BLEACHBIT|ERASER|SDELETE|CIPHER" } |
  Select-Object Name, LastWriteTime | Sort-Object LastWriteTime -Descending

# format /p(ゼロ書き込みフォーマット)の実行痕跡
Get-WinEvent -FilterHashtable @{LogName='System'; Id=4} -ErrorAction SilentlyContinue |
  Where-Object { $_.Message -match "format" } | Select-Object -First 10

② タイムスタンプ改ざんツールの痕跡を検出する

Windows(PowerShell):

# timestomperやtouchコマンドの使用痕跡
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
  Where-Object { $_.Name -match "TIMESTOMP|TOUCH\." } |
  Select-Object Name, LastWriteTime

# タイムスタンプの論理的矛盾を持つファイルを検索
# (MFT作成時刻 < ファイル作成時刻 は偽装の可能性)
Get-ChildItem "C:\Users" -Recurse -ErrorAction SilentlyContinue |
  Where-Object {
    $_.LastWriteTime -lt $_.CreationTime -and
    ($_.CreationTime - $_.LastWriteTime).TotalDays -gt 30
  } |
  Select-Object FullName, CreationTime, LastWriteTime |
  Sort-Object CreationTime | Select-Object -First 20

③ イベントログの削除・無効化の痕跡を深堀りする

Windows(PowerShell):

# イベントログが削除された時刻とオペレーター(誰が消したか)の記録
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=1102} |
  ForEach-Object {
    Write-Host "Securityログクリア: $($_.TimeCreated)"
    Write-Host "  実行ユーザー: $($_.Properties[1].Value)\$($_.Properties[0].Value)"
  }

# ログが最後に記録されてから現在まで時間が空きすぎていないか確認
$logs = @("Security","System","Application")
foreach ($log in $logs) {
  $latest = (Get-WinEvent -LogName $log -MaxEvents 1 -ErrorAction SilentlyContinue).TimeCreated
  $gap = (Get-Date) - $latest
  if ($gap.TotalHours -gt 3) {
    Write-Host "⚠ $log ログの最新エントリから $([math]::Round($gap.TotalHours,1)) 時間が経過"
  }
}

# Windowsイベントログサービスが止められた記録
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7036} |
  Where-Object { $_.Message -match "Windows Event Log" } |
  Select-Object TimeCreated, Message | Select-Object -First 10

④ ディスク上書きツール(sdelete・shred)の痕跡を検出する

Linux(macOS):

# shredコマンドの使用をbash履歴から確認
grep -E "shred|wipe|dd if=/dev/zero|srm" ~/.bash_history 2>/dev/null

# /tmpや/varに「消去済みファイル」のゼロ埋めされた痕跡がないか確認
find /tmp /var/tmp -name "*.DELETED" -o -name "*.shred" 2>/dev/null

# auditdのログからファイル削除・上書きの記録を確認(auditd有効環境)
sudo ausearch -k delete 2>/dev/null | grep "shred\|wipe\|srm" | tail -20

# ジャーナルログからshredやddの実行記録を確認
journalctl --since "7 days ago" | grep -E "shred|dd.*zero|wipe" | tail -20

Windows(PowerShell):

# SDeleteツール(Sysinternals)の使用痕跡
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
  Where-Object { $_.Name -match "SDELETE" } |
  Select-Object Name, LastWriteTime

# cipher /w(Windowsの空き領域上書き)の実行痕跡
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688} -ErrorAction SilentlyContinue |
  Where-Object { $_.Properties[5].Value -match "cipher" } |
  Select-Object TimeCreated, @{N='Command';E={$_.Properties[8].Value}}

まとめ

本記事で紹介したコマンドと手法を一覧にまとめました。

カテゴリコマンド / 手法調査目的
メール・クラウドOSTファイルの確認・添付ファイル一時展開フォルダメール添付ファイルのアクセス証拠
メール・クラウドメールヘッダーの解析(Received/SPF/DKIM)フィッシング・なりすましメールの送信元特定
メール・クラウドOneDrive / Dropboxログの確認クラウドへの不審なアップロード検出
レジストリ深堀りUserAssist(ROT13デコード)GUIで実行されたプログラムの履歴
レジストリ深堀りMUICache削除済みプログラムの実行痕跡
レジストリ深堀りWordWheelQueryエクスプローラーの検索ワード履歴
レジストリ深堀りNetworkList(初回・最終接続日時)接続したWi-Fiネットワークの記録
暗号化・隠蔽検出fileコマンドで拡張子偽装を検出実際のファイル形式と拡張子の不一致を発見
暗号化・隠蔽検出Pythonエントロピー計算スクリプト暗号化・圧縮ファイルの存在を検出
暗号化・隠蔽検出VeraCryptコンテナファイルの検索隠しボリュームの存在確認
カーネル・ドライバ署名なしドライバの検出不正ドライバのロードを確認
カーネル・ドライバlsmod + /sys/module vs /proc/modules比較rootkitによるモジュール隠蔽を検出
カーネル・ドライバrkhunter / chkrootkit既知rootkitシグネチャとの照合
アンチフォレンジックCCleanerなどのレジストリ痕跡クリーニングツールの使用履歴
アンチフォレンジックタイムスタンプ矛盾の検出timestomping(改ざん)の発見
アンチフォレンジックイベントログサービス停止記録(ID:7036)ログ無効化の試みを証拠化
アンチフォレンジックSDelete・shredのプリフェッチ痕跡ディスク消去ツール使用の証拠化

4回シリーズを通して見えてくること

フォレンジック4弾を通じて、一つの重要な原則が繰り返し現れます。それは「攻撃者が何かをしようとすればするほど、その行為の痕跡が増える」という逆説です。

  • プログラムを実行すれば → Prefetch・Amcache・UserAssistに記録される
  • ファイルを削除すれば → $Recycle.Binの$Iファイルとイベントログに残る
  • ログを消せば → ログクリアのイベント(ID:1102)として新たに記録される
  • クリーニングツールを使えば → そのツール自身のPrefetchが残る
  • タイムスタンプを偽装すれば → タイムスタンプの論理的矛盾として検出できる

本シリーズで紹介した手法はすべて、専用の高価なフォレンジックツールを使わずに実現できるものです。日頃からこれらのコマンドに慣れ親しんでおくことが、いざというときの迅速な対応につながります。


※ 本記事の内容は情報セキュリティの学習・自己管理目的で掲載しています。他者のシステムへの無断調査は不正アクセス禁止法により処罰の対象となります。企業・組織内での調査は法務・情報セキュリティ部門の承認のもとで実施してください。暗号化検出・カーネル解析・アンチフォレンジック検出は、自分が管理するシステム上でのみ実施してください。

コメント