フォレンジック系コマンド記事の第4弾です。第1〜3弾でイベントログ・ネットワーク証跡・USB履歴・メモリ解析・ブラウザ証跡・タイムライン再構築・ログ改ざん検出など幅広いテーマを扱ってきました。今回はさらに踏み込んだ領域へ進みます。
テーマは「メール・クラウドストレージの証跡」「Windowsレジストリの深堀り分析」「暗号化・隠蔽ファイルの検出」「カーネル・ドライバレベルの異常検出」「アンチフォレンジック対策の発見」の5本柱です。攻撃者が「証拠を残さないように」工夫するほど、その痕跡が別の場所に刻まれます。その矛盾を突くコマンドを徹底解説します。
⚠️ 重要: 本記事の内容は自分が管理するシステムの調査・学習を目的としています。他者のシステムへの無断調査は不正アクセス禁止法の対象です。組織内での調査は必ず法務・情報セキュリティ部門の承認のもとで実施してください。
目次
- 【メール・クラウドストレージ証跡編】デジタル通信の痕跡を追うコマンド
- 【レジストリ深堀り編】Windowsの「記憶」を読み解くコマンド
- 【暗号化・隠蔽ファイル検出編】隠されたデータの存在を暴くコマンド
- 【カーネル・ドライバ編】OSの深部で起きている異常を検出するコマンド
- 【アンチフォレンジック検出編】証拠隠滅の痕跡を逆に証拠にするコマンド
- まとめ
【メール・クラウドストレージ証跡編】デジタル通信の痕跡を追うコマンド
情報漏えいインシデントの多くは「メール」か「クラウドストレージ」を経路として発生します。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が残る
- タイムスタンプを偽装すれば → タイムスタンプの論理的矛盾として検出できる
本シリーズで紹介した手法はすべて、専用の高価なフォレンジックツールを使わずに実現できるものです。日頃からこれらのコマンドに慣れ親しんでおくことが、いざというときの迅速な対応につながります。
※ 本記事の内容は情報セキュリティの学習・自己管理目的で掲載しています。他者のシステムへの無断調査は不正アクセス禁止法により処罰の対象となります。企業・組織内での調査は法務・情報セキュリティ部門の承認のもとで実施してください。暗号化検出・カーネル解析・アンチフォレンジック検出は、自分が管理するシステム上でのみ実施してください。


コメント