フォレンジック系コマンド記事の第3弾です。第1弾ではイベントログとネットワーク証跡、第2弾ではUSB履歴・削除ファイル・永続化検出・メモリ解析を扱いました。今回はさらに深いレイヤーへ踏み込みます。
テーマは「プログラムの実行痕跡」「ブラウザ・アプリケーションの証跡」「タイムライン再構築」「ログ改ざんの検出」「リモートアクセスの痕跡」の5本柱です。攻撃者がいかに証拠を消そうとしても、OSやアプリケーションが自動的に残す痕跡は思いのほか多く残ります。それを読み解くコマンドを徹底解説します。
⚠️ 重要: 本記事の内容は自分が管理するシステムの調査・学習を目的としています。他者のシステムへの無断調査は不正アクセス禁止法の対象です。組織内での調査は必ず法務・情報セキュリティ部門の承認のもとで実施してください。
目次
- 【プログラム実行痕跡編】何が動いていたかを証明するコマンド
- 【ブラウザ・アプリ証跡編】ユーザーの行動履歴を追うコマンド
- 【タイムライン再構築編】複数ログを統合して事件を時系列で可視化する
- 【ログ改ざん検出編】証拠の隠蔽を見破るコマンド
- 【リモートアクセス証跡編】外部からの侵入経路を追うコマンド
- まとめ
【プログラム実行痕跡編】何が動いていたかを証明するコマンド
「マルウェアを実行してしまったかもしれない」「不審なツールが動いていた形跡を探したい」――こうした場面で頼りになるのが、OSが自動的に記録する「プログラム実行の痕跡」です。プロセスがすでに終了していても、実行された事実を示す証拠が複数の場所に残ります。
💡 FACT: MITRE ATT&CKフレームワークのデータソース定義では、Windowsのプリフェッチ・Shimcache・Amcacheは「プロセス実行の検出(T1059)」に対する主要な痕跡源として明記されています。これらは攻撃者が意識的に削除しないかぎり自動的に蓄積されるため、フォレンジック証拠として高い信頼性を持ちます。
① Prefetchファイルの解析(Windows)
WindowsのPrefetch機能は、アプリケーションの起動を速くするため実行履歴をキャッシュします。副作用として、「いつ・何のプログラムが実行されたか」という証拠がC:\Windows\Prefetch\に残ります。
Windows(PowerShell):
# Prefetchファイルの一覧(実行ファイル名と最終実行日時)
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
Select-Object Name, LastWriteTime, LastAccessTime |
Sort-Object LastWriteTime -Descending |
Format-Table -AutoSize
# 特定のファイル名で検索(例:powershell, cmd, wscriptなど不審な実行)
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
Where-Object { $_.Name -match "POWERSHELL|CMD|WSCRIPT|MSHTA|REGSVR32|CERTUTIL" } |
Select-Object Name, LastWriteTime | Sort-Object LastWriteTime -Descending
# Prefetchが有効かどうかを確認
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters" /v EnablePrefetcher
Prefetchファイルには最大8回分の実行日時と、そのプログラムが参照したファイルの一覧も含まれています。サードパーティツール(WinPrefetchView等)でさらに詳しく解析できます。
② Shimcache / AppCompatCache の確認(Windows)
ShimcacheはWindowsのアプリケーション互換性機能が記録する実行ファイルの追跡データです。実行されたかどうかに関わらず、ファイルシステム上に存在したすべての実行ファイルのパスとタイムスタンプが記録されます。
Windows(PowerShell):
# ShimcacheはSYSTEMハイブに格納されているため、regeditでの確認が基本
# コマンドでエントリ数を確認する場合
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache" /v AppCompatCache
# AppCompatCacheの生データサイズを確認(エントリが多いほどサイズが大きい)
(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache").AppCompatCache.Count
Shimcacheのバイナリデータを完全解析するにはAppCompatCacheParser(Eric Zimmerman製・無償)などの専用ツールが必要ですが、レジストリキーの存在確認や変更日時だけでも有用な手がかりになります。
③ Amcache.hve の調査(Windows)
AmcacheはWindows 8以降で導入された実行ファイルの追跡データベースです。SHA-1ハッシュ値・インストール日時・ファイルパスが記録されており、マルウェアのファイルが既に削除されていてもハッシュ値が残ります。
Windows(PowerShell):
# Amcache.hveの場所と最終更新日時を確認
Get-Item "C:\Windows\AppCompat\Programs\Amcache.hve" |
Select-Object FullName, LastWriteTime, Length
# reg loadでAmcacheをマウントして内容を確認(管理者権限)
reg load HKLM\AmcacheHive "C:\Windows\AppCompat\Programs\Amcache.hve"
reg query HKLM\AmcacheHive\Root\InventoryApplicationFile /s | Select-String "FileId|LowerCaseLongPath|ProductName" | Select-Object -First 60
reg unload HKLM\AmcacheHive
④ bash_history / .zsh_history — コマンド実行履歴を精査する(macOS/Linux)
シェルの操作履歴ファイルは、攻撃者が実行したコマンドを記録している可能性があります。削除されていても、断片的な痕跡が残ることがあります。
macOS / Linux:
# ホームディレクトリの履歴ファイルを確認
ls -la ~/.bash_history ~/.zsh_history ~/.sh_history 2>/dev/null
# 全ユーザーの履歴ファイルを確認(root権限)
sudo find /home /root -name ".*history" -type f 2>/dev/null | xargs ls -la
# 不審なコマンドを抽出(wget・curl・nc・base64など)
grep -E "wget|curl|nc |ncat|base64|chmod.*\+x|/tmp/|/dev/shm" ~/.bash_history
# タイムスタンプ付きの履歴を確認(HISTTIMEFORMATが設定されている場合)
HISTTIMEFORMAT="%F %T " history
# 複数ユーザーの履歴を横断検索
sudo find /home -name ".bash_history" 2>/dev/null |
xargs -I{} sh -c 'echo "=== {} ==="; grep -E "wget|curl|python|perl|ruby|nc " {}'
【ブラウザ・アプリ証跡編】ユーザーの行動履歴を追うコマンド
ブラウザはユーザーの行動を詳細に記録します。フィッシングサイトへのアクセス・不正ダウンロード・内部情報の外部サービスへのアップロードなど、インシデントの起点がブラウザ操作にあるケースは少なくありません。ブラウザの履歴データはSQLiteデータベースとして保存されており、コマンドラインで直接クエリを実行できます。
💡 FACT: Google ChromeとMicrosoft EdgeはいずれもSQLite形式でブラウザ履歴・ダウンロード記録・Cookieを保存しています。SQLiteはパブリックドメインのオープンソースDBエンジンで、世界で最も広く使われているデータベースエンジンとされており、スマートフォンやブラウザを含む数十億台のデバイスで動作しています。
① SQLiteでブラウザ履歴を直接クエリする
Google Chrome / Microsoft Edge の履歴ファイルパス:
- Windows (Chrome):
%LOCALAPPDATA%\Google\Chrome\User Data\Default\History - Windows (Edge):
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\History - macOS (Chrome):
~/Library/Application Support/Google/Chrome/Default/History - Linux (Chrome):
~/.config/google-chrome/Default/History
macOS / Linux(sqliteコマンド):
# ブラウザが閉じている間に実行する(使用中はロックされる)
# 念のためコピーしてから解析する
cp ~/Library/Application\ Support/Google/Chrome/Default/History /tmp/chrome_history.db
# 閲覧履歴の最新100件を表示
sqlite3 /tmp/chrome_history.db \
"SELECT datetime(last_visit_time/1000000-11644473600, 'unixepoch', 'localtime'), url, title
FROM urls ORDER BY last_visit_time DESC LIMIT 100;"
# ダウンロード履歴を確認
sqlite3 /tmp/chrome_history.db \
"SELECT datetime(start_time/1000000-11644473600, 'unixepoch', 'localtime'),
target_path, tab_url, received_bytes
FROM downloads ORDER BY start_time DESC LIMIT 50;"
# 特定ドメインへのアクセス履歴を検索
sqlite3 /tmp/chrome_history.db \
"SELECT datetime(last_visit_time/1000000-11644473600, 'unixepoch', 'localtime'), url
FROM urls WHERE url LIKE '%pastebin%' OR url LIKE '%dropbox%' OR url LIKE '%wetransfer%'
ORDER BY last_visit_time DESC;"
Windows(PowerShell + sqlite3.exe):
# sqlite3.exeをSQLiteの公式サイトからダウンロードして使用
$histPath = "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\History"
$tmpPath = "$env:TEMP\chrome_history_copy.db"
Copy-Item $histPath $tmpPath
.\sqlite3.exe $tmpPath "SELECT datetime(last_visit_time/1000000-11644473600, 'unixepoch', 'localtime'), url FROM urls ORDER BY last_visit_time DESC LIMIT 100;"
② Firefoxの履歴を解析する
FirefoxもSQLiteを使用しますが、ファイル名が異なります。
macOS / Linux:
# Firefoxプロファイルの場所を探す
find ~/.mozilla/firefox -name "places.sqlite" 2>/dev/null
find ~/Library/Application\ Support/Firefox/Profiles -name "places.sqlite" 2>/dev/null
# コピーしてから解析
cp ~/.mozilla/firefox/*.default-release/places.sqlite /tmp/firefox_places.db
# 閲覧履歴を確認
sqlite3 /tmp/firefox_places.db \
"SELECT datetime(last_visit_date/1000000, 'unixepoch', 'localtime'), url, title
FROM moz_places WHERE visit_count > 0
ORDER BY last_visit_date DESC LIMIT 100;"
# ダウンロード履歴を確認
sqlite3 /tmp/firefox_places.db \
"SELECT datetime(dateAdded/1000000, 'unixepoch', 'localtime'), content, place_id
FROM moz_annos WHERE anno_attribute_id IN
(SELECT id FROM moz_anno_attributes WHERE name='downloads/destinationFileURI')
ORDER BY dateAdded DESC LIMIT 50;"
③ アプリケーションの最近使ったファイル履歴を確認する(Windows)
Windowsは最近使ったファイルの履歴を複数の場所に記録しています。
Windows(PowerShell):
# 最近使ったファイル(RecentDocs)レジストリ
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs" /s |
Select-String "REG_BINARY" | Select-Object -First 30
# エクスプローラーで最近開いたフォルダ(TypedPaths)
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths"
# Recentフォルダ(lnkファイル)を確認
Get-ChildItem "$env:APPDATA\Microsoft\Windows\Recent" |
Sort-Object LastWriteTime -Descending |
Select-Object Name, LastWriteTime | Select-Object -First 30
# ジャンプリスト(アプリケーションごとの最近使ったファイル)
Get-ChildItem "$env:APPDATA\Microsoft\Windows\Recent\AutomaticDestinations" |
Sort-Object LastWriteTime -Descending | Select-Object Name, LastWriteTime
【タイムライン再構築編】複数ログを統合して事件を時系列で可視化する
個別のログを個別に見るだけでは、インシデントの全体像はつかめません。「何時にログインし、何時にファイルにアクセスし、何時にデータを外に出したか」を時系列で並べることで、はじめて攻撃の流れが見えてきます。
① Windowsで複数イベントをまとめてタイムライン化する(PowerShell)
Windows(PowerShell):
# ログオン・プロセス起動・オブジェクトアクセスを一括で時系列に並べる
$events = @()
# ログオンイベントを取得
$events += Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4624,4625,4648
StartTime=(Get-Date).AddDays(-3)
} | Select-Object TimeCreated,
@{N='EventType';E={"[LOGON] ID:$($_.Id)"}},
@{N='Detail';E={$_.Properties[5].Value}}
# プロセス作成イベントを取得(4688が有効な場合)
$events += Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4688
StartTime=(Get-Date).AddDays(-3)
} -ErrorAction SilentlyContinue | Select-Object TimeCreated,
@{N='EventType';E={"[PROCESS] ID:4688"}},
@{N='Detail';E={$_.Properties[5].Value}}
# タスク作成イベントを取得
$events += Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4698,4702
StartTime=(Get-Date).AddDays(-3)
} -ErrorAction SilentlyContinue | Select-Object TimeCreated,
@{N='EventType';E={"[TASK] ID:$($_.Id)"}},
@{N='Detail';E={$_.Message -replace "`n"," " | Select-Object -First 1}}
# 時系列に並べてCSVに出力
$events | Sort-Object TimeCreated |
Export-Csv "C:\forensics\timeline.csv" -NoTypeInformation -Encoding UTF8
Write-Host "タイムラインを C:\forensics\timeline.csv に出力しました"
② Linuxで複数ログを統合してタイムライン化する
Linux:
# auth.log・syslog・apache2のアクセスログを統合して時系列ソート
# 各ログの日付形式を統一するため awkで前処理
# auth.logからSSH関連のみ抽出してファイルに保存
grep -E "sshd|sudo|su:" /var/log/auth.log |
awk '{print $1, $2, $3, "[AUTH]", $0}' > /tmp/tl_auth.txt
# cronジョブの実行記録を抽出
grep "CMD\|session opened\|session closed" /var/log/syslog |
awk '{print $1, $2, $3, "[SYSLOG]", $0}' > /tmp/tl_syslog.txt
# Webアクセスログを抽出(Apacheの場合)
awk '{print $4, "[WEB]", $1, $7, $9}' /var/log/apache2/access.log |
sed 's/\[//' | sed 's/\]//' > /tmp/tl_web.txt 2>/dev/null
# 統合してソート
cat /tmp/tl_auth.txt /tmp/tl_syslog.txt /tmp/tl_web.txt |
sort > /tmp/unified_timeline.txt
echo "統合タイムラインを /tmp/unified_timeline.txt に保存しました"
wc -l /tmp/unified_timeline.txt
③ log2timeline / plaso — フォレンジック専用タイムラインツール
より本格的なタイムライン分析には、オープンソースのフォレンジックツールを使います。
Linux(要インストール):
# Plasoのインストール(pip)
pip3 install plaso
# ディスクイメージ全体からタイムラインを生成
log2timeline.py --storage-file timeline.plaso disk_image.img
# 生成したデータをCSVに変換
psort.py -o l2tcsv -w timeline.csv timeline.plaso
# 特定の期間にフィルタリング
psort.py -o l2tcsv -w filtered.csv timeline.plaso \
"date > '2025-02-01 00:00:00' AND date < '2025-02-28 23:59:59"
# ファイルシステムのタイムスタンプのみ抽出
psort.py --slice "2025-02-15" --slice_size 30 -o dynamic timeline.plaso
💡 FACT: Plasoは英国NCA(National Crime Agency)・米国FBI・オーストラリアAFP(連邦警察)など複数の国の法執行機関が採用しているオープンソースのフォレンジックタイムラインツールです。単一のディスクイメージから数百万件のタイムスタンプイベントを自動抽出・統合できます。
【ログ改ざん検出編】証拠の隠蔽を見破るコマンド
高度な攻撃者はログを削除・改ざんして痕跡を消そうとします。しかし「ログを消す」という行為自体が新たな痕跡を残します。また、ログの不自然な空白・タイムスタンプの矛盾・ファイルハッシュの不一致といった手がかりからログ改ざんを検出できます。
① Windowsイベントログのクリア記録を検出する
Windowsイベントログはクリアされると、クリアされた事実を記録する特別なイベントが生成されます。
Windows(PowerShell):
# イベントログがクリアされた記録(イベントID 1102:Securityログクリア)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=1102} |
Select-Object TimeCreated, Message | Format-List
# Systemログのクリア記録(イベントID 104)
Get-WinEvent -FilterHashtable @{LogName='System'; Id=104} |
Select-Object TimeCreated, Message | Format-List
# 監査ログが無効にされた記録(イベントID 4719)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4719} |
Select-Object TimeCreated, Message | Format-List
# 全セキュリティログの時系列に不自然な「穴」がないかを確認
Get-WinEvent -LogName Security |
Select-Object TimeCreated |
Sort-Object TimeCreated |
ForEach-Object {
if ($prev -and (($_.TimeCreated - $prev).TotalHours -gt 2)) {
Write-Host "⚠ 空白期間: $prev 〜 $($_.TimeCreated) ($([math]::Round(($_.TimeCreated-$prev).TotalHours,1))時間)"
}
$prev = $_.TimeCreated
}
② ファイルのタイムスタンプ改ざんを検出する(Timestomping検出)
攻撃者はtimestomp(タイムスタンプ改変)ツールを使ってファイルの更新日時を偽装することがあります。しかしNTFSには複数のタイムスタンプが存在し、すべてを同時に書き換えることは難しいです。
Windows(PowerShell):
# ファイルの$STANDARD_INFORMATIONと$FILE_NAMEタイムスタンプを比較
# (通常はツールが必要だが、まず基本的な確認から)
# 作成日時より更新日時が古いファイルを検出(改ざんの疑い)
Get-ChildItem "C:\Windows\System32" -File |
Where-Object { $_.LastWriteTime -lt $_.CreationTime } |
Select-Object Name, CreationTime, LastWriteTime | Format-Table -AutoSize
# ファイルが作成されてから変更されていない(CreationTime = LastWriteTime)ファイルを探す
# 更新が一切ない実行ファイルは偽装の可能性も
Get-ChildItem "C:\Users" -Recurse -Include "*.exe","*.dll" -ErrorAction SilentlyContinue |
Where-Object { $_.CreationTime -eq $_.LastWriteTime } |
Select-Object FullName, CreationTime | Sort-Object CreationTime -Descending | Select-Object -First 20
macOS / Linux:
# mactime(The Sleuth Kit付属)でファイルのタイムスタンプ一覧を生成
# The Sleuth Kitのインストール
# sudo apt install sleuthkit (Linux)
# brew install sleuthkit (macOS)
# ファイルシステムのタイムスタンプをBodyファイル形式で出力
fls -r -m / /dev/sda1 > /tmp/bodyfile.txt 2>/dev/null
# taimetimeでタイムラインに変換
mactime -b /tmp/bodyfile.txt -d > /tmp/fs_timeline.csv
# MACb(Modified・Accessed・Changed・Born)タイムスタンプの矛盾を確認
stat /path/to/suspicious_file
③ Linuxシステムバイナリの改ざんを検出する
Linux:
# パッケージマネージャーでシステムファイルの整合性を確認(Debian/Ubuntu)
sudo dpkg --verify 2>&1 | grep -v "^$"
# RPM系(CentOS/RHEL/Fedora)
sudo rpm -Va 2>&1 | grep -v "^$"
# 出力の見方:S=サイズ変更、M=パーミッション変更、5=MD5不一致、T=タイムスタンプ変更
# aide(Advanced Intrusion Detection Environment)による整合性チェック
# インストール
sudo apt install aide
# 初回データベース作成
sudo aideinit
# 整合性チェック(変更されたファイルを報告)
sudo aide --check
# 重要コマンドのハッシュ値を比較
sha256sum /bin/ls /bin/ps /bin/netstat /usr/bin/find /usr/bin/sudo |
tee /tmp/current_hashes.txt
# 以前保存しておいたハッシュと比較
diff /tmp/baseline_hashes.txt /tmp/current_hashes.txt
💡 FACT: 「rootkit」と呼ばれる高度なマルウェアは、ls・ps・netstatなどのシステムコマンド自体を改ざんして自身を隠蔽します。これをライブシステム上で検出するには、別のクリーンな環境から起動したOSや外部メディアのバイナリで確認する必要があります。Linuxベンダーのパッケージ整合性チェック(rpm -Va・dpkg --verify)はこの検出の第一歩です。
【リモートアクセス証跡編】外部からの侵入経路を追うコマンド
2024年のIBM X-Force Threat Intelligence Indexによると、サイバー攻撃の初期侵入経路として最も多いのはフィッシングと有効な認証情報の悪用で、その多くがRDP・VPN・SSHなどのリモートアクセス経路を通じて行われています。リモートアクセスの証跡を詳しく追うことで、侵入の起点と経路を特定できます。
① RDP(リモートデスクトップ)の接続履歴を調べる(Windows)
Windows(PowerShell):
# RDPを使って接続してきたクライアントのIPアドレスをイベントログから抽出
Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4624
StartTime=(Get-Date).AddDays(-30)
} | Where-Object { $_.Properties[8].Value -eq 10 } | # LogonType 10 = RemoteInteractive
Select-Object TimeCreated,
@{N='UserName';E={$_.Properties[5].Value}},
@{N='SourceIP';E={$_.Properties[18].Value}} |
Sort-Object TimeCreated -Descending | Select-Object -First 50
# RDPの受信接続ログ(TerminalServices-RemoteConnectionManager)
Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational" |
Where-Object { $_.Id -eq 1149 } |
Select-Object TimeCreated,
@{N='UserName';E={$_.Properties[0].Value}},
@{N='SourceIP';E={$_.Properties[2].Value}} |
Sort-Object TimeCreated -Descending | Select-Object -First 30
# RDPでの接続先(自分が接続しに行ったホスト名)をレジストリから確認
reg query "HKCU\Software\Microsoft\Terminal Server Client\Servers" /s
# より詳しい接続先の記録
Get-ChildItem "HKCU:\Software\Microsoft\Terminal Server Client\Servers" |
ForEach-Object { Get-ItemProperty $_.PsPath } |
Select-Object PSChildName, UsernameHint
② SSHの接続ログを詳しく解析する(macOS/Linux)
macOS / Linux:
# SSH接続成功のIPアドレスと接続方式(パスワード/公開鍵)を抽出
grep "Accepted" /var/log/auth.log | awk '{print $1,$2,$3,"USER:"$9,"FROM:"$11,"METHOD:"$7}'
# 接続元IPアドレス別にログイン成功回数を集計
grep "Accepted password\|Accepted publickey" /var/log/auth.log |
awk '{print $11}' | sort | uniq -c | sort -rn
# SSH公開鍵認証のauthorized_keysを確認(不正な鍵が追加されていないか)
sudo find /home /root -name "authorized_keys" 2>/dev/null | xargs -I{} sh -c 'echo "=== {} ==="; cat {}'
# sshd_configの設定を確認(rootログイン許可・パスワード認証の状態)
sudo grep -E "PermitRootLogin|PasswordAuthentication|AllowUsers|DenyUsers|Port" /etc/ssh/sshd_config
# SSHの既知ホスト(接続したことがあるサーバー一覧)を確認
cat ~/.ssh/known_hosts | awk '{print $1}' | sort -u
③ VPN・プロキシ接続の痕跡を確認する
Windows(PowerShell):
# VPN接続の設定とプロファイル一覧
Get-VpnConnection
# ダイヤルアップ・VPN接続の使用履歴
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='RasClient'} |
Select-Object TimeCreated, Message | Select-Object -First 20
# ネットワークプロファイルの変更履歴(接続したネットワーク一覧)
Get-WinEvent -FilterHashtable @{
LogName='Microsoft-Windows-NetworkProfile/Operational'; Id=10000,10001
} | Select-Object TimeCreated, Message | Select-Object -First 30
# プロキシ設定の確認
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" |
findstr "ProxyEnable ProxyServer"
macOS / Linux:
# OpenVPNのログを確認(一般的な保存場所)
cat /var/log/openvpn.log 2>/dev/null | tail -100
journalctl -u openvpn --since "7 days ago" 2>/dev/null
# ネットワークインターフェースの一覧(tun0など仮想NICの有無を確認)
ifconfig | grep -E "^[a-z]|inet "
ip addr show | grep -E "^[0-9]|inet "
# ルーティングテーブルの確認(不審な経路が追加されていないか)
netstat -rn
ip route show
④ Windowsのジャンプリストとシェルバッグでアクセスしたリモートパスを追跡する
Windows(PowerShell):
# シェルバッグ(エクスプローラーで開いたフォルダ履歴)を確認
# ネットワークパスへのアクセス履歴も含む
reg query "HKCU\Software\Microsoft\Windows\Shell\BagMRU" /s | Select-String "MRUListEx" | Select-Object -First 20
# ネットワーク接続の履歴(過去に接続したネットワーク共有)
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU"
# MRU(Most Recently Used)リストからアクセスしたファイルパスを確認
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU" /s
# 過去の実行コマンド(「ファイル名を指定して実行」の履歴)
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU"
まとめ
本記事で紹介したコマンドと手法を一覧にまとめました。
| カテゴリ | コマンド / 手法 | 調査目的 |
|---|---|---|
| プログラム実行痕跡 | Prefetchファイルの一覧(Get-ChildItem) | 過去に実行されたプログラムの特定 |
| プログラム実行痕跡 | reg load Amcache.hve | SHA-1ハッシュと実行ファイルパスの確認 |
| プログラム実行痕跡 | .bash_history / .zsh_history | シェル操作履歴の精査 |
| ブラウザ証跡 | sqlite3 + Chrome/Edge History DB | 閲覧履歴・ダウンロード記録の抽出 |
| ブラウザ証跡 | sqlite3 + Firefox places.sqlite | Firefoxの閲覧・ダウンロード履歴 |
| ブラウザ証跡 | reg query RecentDocs / RecentItems | 最近開いたファイルとフォルダの履歴 |
| タイムライン再構築 | Get-WinEvent 複数ID統合 | Windowsの複数ログを時系列で統合 |
| タイムライン再構築 | grep + awk + cat + sort | Linuxの複数ログを統合タイムライン化 |
| タイムライン再構築 | log2timeline / plaso | ディスクイメージからの自動タイムライン生成 |
| ログ改ざん検出 | Get-WinEvent ID:1102 / 104 / 4719 | ログクリア・監査無効化の記録確認 |
| ログ改ざん検出 | タイムスタンプ矛盾の検出 | 作成日時より古い更新日時の検出 |
| ログ改ざん検出 | dpkg –verify / rpm -Va | システムバイナリの改ざん検出 |
| リモートアクセス | Get-WinEvent LogonType=10 | RDPログイン記録とIPアドレスの抽出 |
| リモートアクセス | reg query Terminal Server Client | RDPで接続したホスト名の履歴 |
| リモートアクセス | authorized_keys確認 + sshd_config | 不正SSH鍵の検出と設定確認 |
| リモートアクセス | Get-VpnConnection / reg query RunMRU | VPN接続履歴とMRUリストの確認 |
フォレンジック調査シリーズ 3本の振り返り
本シリーズ3本で扱ったテーマを整理すると、フォレンジック調査のほぼすべての領域をカバーしています。
- 第1弾: イベントログ基礎・ネットワーク証跡・ファイルタイムスタンプ・プロセス調査
- 第2弾: USB接続履歴・削除ファイル復元・永続化検出・メモリ解析・自動収集スクリプト
- 第3弾: プログラム実行痕跡・ブラウザ証跡・タイムライン再構築・ログ改ざん検出・リモートアクセス追跡
これらのコマンドに共通しているのは、「攻撃者が消せない証拠を読む」という思想です。OSやアプリケーションが自動的に記録する痕跡は、攻撃者が意識しないかぎり残り続けます。その「無意識の痕跡」を読み解く技術こそが、デジタルフォレンジックの本質です。
※ 本記事の内容は情報セキュリティの学習・自己管理目的で掲載しています。他者のシステムへの無断調査は不正アクセス禁止法により処罰の対象となります。ブラウザデータベースへのアクセスは自分が使用するPCのみで実施してください。企業・組織内での調査は法務・情報セキュリティ部門の承認のもとで実施してください。


コメント