LNKファイルとジャンプリストアーティファクトの解析 は何をしますか?
概要
WindowsのLNK(ショートカット)ファイルとジャンプリストは、ファイルアクセス、プログラムの実行、ユーザーの行動に関する証拠を提供する重要なフォレンジックアーティファクトです。LNKファイルは、ユーザーがWindowsエクスプローラーまたは開く/保存ダイアログを通じてファイルを開いたときに自動的に作成され、対象ファイルの元のパス、タイムスタンプ、ボリュームシリアル番号、NetBIOS名、ホストシステムのMACアドレスなどのメタデータを保存します。ジャンプリストはWindows 7で導入され、アプリケーションごとに最近使用したファイルや頻繁にアクセスしたファイルのリストを保持することで、この機能を拡張します。これらのアーティファクトは、対象ファイルが削除された後も残り続けるため、ユーザーが特定のファイルに特定の時間にアクセスしたことを立証する上で非常に貴重です。
使用するタイミング
- LNKファイルとジャンプリストアーティファクトの分析を必要とするセキュリティインシデントを調査する場合
- この分野の検出ルールや脅威ハンティングクエリを構築する場合
- SOCアナリストがこの分析タイプの構造化された手順を必要とする場合
- 関連する攻撃手法に対するセキュリティ監視範囲を検証する場合
前提条件
- LECmd(Eric Zimmerman):LNKファイル解析用
- JLECmd(Eric Zimmerman):ジャンプリスト解析用
- Python 3.8以上(pylnk3またはLnkParse3ライブラリを使用)
- Windowsシステムからのフォレンジックイメージまたはトリアージコレクション
- CSV分析用のTimeline Explorer
LNKファイルの場所
| 場所 | 説明 |
|---|---|
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent\ | 最近アクセスされたファイル |
%USERPROFILE%\Desktop\ | ユーザー作成のショートカット |
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\ | スタートメニューのショートカット |
%USERPROFILE%\AppData\Roaming\Microsoft\Office\Recent\ | Officeの最近使ったドキュメント |
LNKファイルの構造
シェルリンクヘッダー(76バイト)
| オフセット | サイズ | フィールド |
|---|---|---|
| 0x00 | 4 | HeaderSize(常に0x0000004C) |
| 0x04 | 16 | LinkCLSID(常に00021401-0000-0000-C000-000000000046) |
| 0x14 | 4 | LinkFlags |
| 0x18 | 4 | FileAttributes |
| 0x1C | 8 | CreationTime(FILETIME) |
| 0x24 | 8 | AccessTime(FILETIME) |
| 0x2C | 8 | WriteTime(FILETIME) |
| 0x34 | 4 | 対象ファイルのFileSize |
| 0x38 | 4 | IconIndex |
| 0x3C | 4 | ShowCommand |
| 0x40 | 2 | HotKey |
LNKファイルの主要なフォレンジックフィールド
- 対象ファイルのタイムスタンプ:参照先ファイルの作成、アクセス、修正時刻
- ボリューム情報:シリアル番号、ドライブタイプ、ボリュームラベル
- ネットワーク共有情報:UNCパス、共有名
- マシン識別子:NetBIOS名、MACアドレス(TrackerDataBlockから)
- 分散リンクトラッキング:マシンIDとオブジェクトGUID
EZツールによる解析
LECmd - LNKファイルパーサー
# Recentフォルダ内のすべてのLNKファイルを解析
LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_analysis.csv
# 単一のLNKファイルを詳細情報付きで解析
LECmd.exe -f "C:\Evidence\Users\suspect\Desktop\Confidential.docx.lnk" --json C:\Output
# 追加の詳細レベルでLNKファイルを解析
LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_all.csv --all
JLECmd - ジャンプリストパーサー
# 自動ジャンプリストを解析
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv
# カスタムジャンプリストを解析
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations" --csv C:\Output --csvf jumplists_custom.csv
# すべてのジャンプリストを詳細出力付きで解析
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv --ld
ジャンプリストの構造
自動保存先(automaticDestinations-ms)
これらはOLEコンパウンドファイル(構造化ストレージ)であり、ファイル名のAppIDハッシュで識別されます。
| AppIDハッシュ | アプリケーション |
|---|---|
| 5f7b5f1e01b83767 | Windowsエクスプローラ(ピン留め/頻繁) |
| 1b4dd67f29cb1962 | Windowsエクスプローラ(最近) |
| 9b9cdc69c1c24e2b | メモ帳 |
| a7bd71699cd38d1c | Notepad++ |
| 12dc1ea8e34b5a6 | Microsoftペイント |
| 7e4dca80246863e3 | コントロールパネル |
| 1cf97c38a5881255 | Microsoft Edge |
| f01b4d95cf55d32a | Windowsエクスプローラ |
| 9d1f905ce5044aee | Microsoft Excel |
| a4a5324453625195 | Microsoft Word |
| d00655d2aa12ff6d | Microsoft PowerPoint |
| bc03160ee1a59fc1 | Outlook |
カスタム保存先(customDestinations-ms)
ユーザーがアプリケーションのジャンプリストに項目をピン留めしたときに作成されます。これらのファイルには連続したLNKエントリが含まれています。
Python解析スクリプト
import struct
import os
from datetime import datetime, timedelta
FILETIME_EPOCH = datetime(1601, 1, 1)
def filetime_to_datetime(filetime_bytes: bytes) -> datetime:
"""Windows FILETIME(1601年からの100ナノ秒間隔)をdatetimeに変換。"""
ft = struct.unpack("<Q", filetime_bytes)[0]
if ft == 0:
return None
return FILETIME_EPOCH + timedelta(microseconds=ft // 10)
def parse_lnk_header(lnk_path: str) -> dict:
"""LNKファイルからシェルリンクヘッダーを解析。"""
with open(lnk_path, "rb") as f:
header = f.read(76)
header_size = struct.unpack("<I", header[0:4])[0]
if header_size != 0x4C:
return {"error": "無効なLNKヘッダー"}
link_flags = struct.unpack("<I", header[0x14:0x18])[0]
file_attrs = struct.unpack("<I", header[0x18:0x1C])[0]
result = {
"header_size": header_size,
"link_flags": hex(link_flags),
"file_attributes": hex(file_attrs),
"creation_time": filetime_to_datetime(header[0x1C:0x24]),
"access_time": filetime_to_datetime(header[0x24:0x2C]),
"write_time": filetime_to_datetime(header[0x2C:0x34]),
"file_size": struct.unpack("<I", header[0x34:0x38])[0],
"has_target_id_list": bool(link_flags & 0x01),
"has_link_info": bool(link_flags & 0x02),
"has_name": bool(link_flags & 0x04),
"has_relative_path": bool(link_flags & 0x08),
"has_working_dir": bool(link_flags & 0x10),
"has_arguments": bool(link_flags & 0x20),
"has_icon_location": bool(link_flags & 0x40),
}
return result
調査ユースケース
ファイルアクセスの証拠
- RecentフォルダからLNKファイルを解析し、アクセスされたドキュメントを特定
- MFTタイムスタンプおよびUSNジャーナルエントリと相互参照
- LNKファイルは対象ファイルが削除された後も残り続けることに注意
リムーバブルメディアへのアクセス
- ドライブ文字E:、F:、G:を参照するLNKファイルはリムーバブルメディアの使用を示す
- LNK内のボリュームシリアル番号で特定のデバイスを識別
- TrackerDataBlock内のMACアドレスで送信元マシンを識別
ネットワーク共有アクティビティ
- UNCパス(\server\share)を含むLNKファイルはネットワークファイルアクセスを示す
- NetBIOS名でリモートサーバーを識別
- タイムスタンプでアクセスが発生した時刻を特定
Windows 10とWindows 11の違い
最近の研究(IEEE 2025)によると、Windows 11ではLNKファイルとジャンプリストのアーティファクトが異なることが示されています。
- 特定のファイルタイプに対して生成される自動LNKファイルが少ない
- モダンアプリケーション向けにジャンプリストの動作が変更された
- UWP/MSIXアプリケーションは従来のジャンプリストを生成しない場合がある
- Windows 11のクイックアクセスが最近使ったファイル機能の一部を代替する
参考文献
- Shell Link Binary File Format: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/
- Magnet Forensics LNK分析: https://www.magnetforensics.com/blog/forensic-analysis-of-lnk-files/
- Jump Lists Forensics 2025: https://www.cybertriage.com/blog/jump-list-forensics-2025/
- Eric ZimmermanのLECmd/JLECmd: https://ericzimmerman.github.io/
出力例
$ LECmd.exe -d "C:\Evidence\Users\jsmith\AppData\Roaming\Microsoft\Windows\Recent" --csv /analysis/lnk_output
LECmd v1.11.0 - LNKファイルパーサー
================================
47個のLNKファイルを処理中...
--- LNKファイル: Q4_Report.xlsx.lnk ---
ソース: C:\Evidence\Users\jsmith\Recent\Q4_Report.xlsx.lnk
ターゲットパス: C:\Users\jsmith\Downloads\Q4_Report.xlsm
ターゲット作成日: 2024-01-15 14:33:45 UTC
ターゲット更新日: 2024-01-15 14:33:45 UTC
ターゲットアクセス日: 2024-01-15 14:35:12 UTC
ファイルサイズ: 251,904 バイト
ドライブタイプ: 固定 (C:)
ボリュームシリアル: A4E7-3F21
マシンID: DESKTOP-J5M1TH
MACアドレス: 48:2A:E3:5C:9B:01
--- LNKファイル: update_client.exe.lnk ---
ソース: C:\Evidence\Users\jsmith\Recent\update_client.exe.lnk
ターゲットパス: C:\ProgramData\Updates\update_client.exe
ターゲット作成日: 2024-01-15 14:34:02 UTC
ターゲット更新日: 2024-01-15 14:34:02 UTC
ターゲットアクセス日: 2024-01-15 14:36:30 UTC
ファイルサイズ: 1,258,496 バイト
ドライブタイプ: 固定 (C:)
ボリュームシリアル: A4E7-3F21
マシンID: DESKTOP-J5M1TH
作業ディレクトリ: C:\ProgramData\Updates
引数: --silent --no-update-check
実行ウィンドウ: 非表示
======================================================================
$ JLECmd.exe -d "C:\Evidence\Users\jsmith\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv /analysis/jumplist_output
JLECmd v1.5.0 - ジャンプリストパーサー
==================================
23個のAutomaticDestinationsファイルを処理中...
--- アプリケーション: Microsoft Excel (AppID: 12dc1ea8e34b5a6) ---
エントリ数: 15
最新:
エントリ 0: C:\Users\jsmith\Downloads\Q4_Report.xlsm (2024-01-15 14:35:12 UTC)
エントリ 1: \\FILESERV01\Finance\Budget_2024.xlsx (2024-01-14 09:22:30 UTC)
エントリ 2: C:\Users\jsmith\Documents\Expenses\Dec2023.xlsx (2024-01-10 16:45:00 UTC)
--- アプリケーション: Windowsエクスプローラ (AppID: f01b4d95cf55d32a) ---
エントリ数: 28
最新:
エントリ 0: C:\ProgramData\Updates\ (2024-01-15 14:36:25 UTC)
エントリ 1: E:\Backup\ (2024-01-15 15:30:00 UTC)
エントリ 2: \\FILESERV01\HR\Employees\ (2024-01-15 16:12:45 UTC)
--- アプリケーション: cmd.exe (AppID: 9b9cdc69c1c24e2b) ---
エントリ数: 5
最新:
エントリ 0: C:\Windows\System32\cmd.exe (2024-01-15 14:36:00 UTC)
サマリー:
処理済みLNKファイル数: 47
ジャンプリストエントリ総数: 156
疑わしいアーティファクト: 3(非表示ウィンドウ実行、USBドライブアクセス、ネットワーク共有)
CSVエクスポート先: /analysis/lnk_output/ および /analysis/jumplist_output/