Was macht Analyse von LNK-Dateien und Jump-List-Artefakten?
Übersicht
Windows LNK-Dateien (Verknüpfungen) und Jump Lists (Sprunglisten) sind kritische forensische Artefakte, die Belege für Dateizugriffe, Programmausführungen und das Benutzerverhalten liefern. LNK-Dateien werden automatisch erstellt, wenn ein Benutzer eine Datei über den Windows Explorer oder den Öffnen/Speichern-Dialog öffnet, und speichern Metadaten über die Zieldatei, einschließlich ihres ursprünglichen Pfads, Zeitstempel, Volumeseriennummer, NetBIOS-Name und MAC-Adresse des Hostsystems. Jump Lists, eingeführt mit Windows 7, erweitern dies, indem sie anwendungsspezifische Listen zuletzt und häufig verwendeter Dateien führen. Diese Artefakte bleiben auch nach dem Löschen der Zieldateien erhalten, was sie unverzichtbar macht, um nachzuweisen, dass ein Benutzer zu bestimmten Zeiten auf bestimmte Dateien zugegriffen hat.
Verwendungszweck
- Bei der Untersuchung von Sicherheitsvorfällen, die eine Analyse von LNK-Dateien und Jump-List-Artefakten erfordern
- Beim Erstellen von Erkennungsregeln oder Bedrohungssuchabfragen für diesen Bereich
- Wenn SOC-Analysten strukturierte Verfahren für diese Analyseart benötigen
- Bei der Validierung der Sicherheitsüberwachungsabdeckung für verwandte Angriffstechniken
Voraussetzungen
- LECmd (Eric Zimmerman) zum Parsen von LNK-Dateien
- JLECmd (Eric Zimmerman) zum Parsen von Jump Lists
- Python 3.8+ mit den Bibliotheken pylnk3 oder LnkParse3
- Forensisches Image oder Triage-Erfassung von einem Windows-System
- Timeline Explorer zur CSV-Analyse
LNK-Dateispeicherorte
| Speicherort | Beschreibung |
|---|---|
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent\ | Zuletzt verwendete Dateien |
%USERPROFILE%\Desktop\ | Vom Benutzer erstellte Verknüpfungen |
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\ | Startmenü-Verknüpfungen |
%USERPROFILE%\AppData\Roaming\Microsoft\Office\Recent\ | Kürzlich verwendete Office-Dokumente |
LNK-Dateistruktur
Shell-Link-Header (76 Bytes)
| Offset | Größe | Feld |
|---|---|---|
| 0x00 | 4 | HeaderSize (immer 0x0000004C) |
| 0x04 | 16 | LinkCLSID (immer 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 der Zieldatei |
| 0x38 | 4 | IconIndex |
| 0x3C | 4 | ShowCommand |
| 0x40 | 2 | HotKey |
Wichtige forensische Felder in LNK-Dateien
- Zeitstempel der Zieldatei: Erstellungs-, Zugriffs- und Änderungszeitpunkte der referenzierten Datei
- Volumeninformationen: Seriennummer, Laufwerkstyp, Datenträgerbezeichnung
- Netzwerkfreigabeinformationen: UNC-Pfad, Freigabename
- Maschinenkennungen: NetBIOS-Name, MAC-Adresse (aus TrackerDataBlock)
- Distributed Link Tracking: Maschinen-ID und Objekt-GUID
Analyse mit EZ Tools
LECmd - LNK-Datei-Parser
# Alle LNK-Dateien im Ordner "Recent" parsen
LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_analysis.csv
# Eine einzelne LNK-Datei mit vollständigen Details parsen
LECmd.exe -f "C:\Evidence\Users\suspect\Desktop\Confidential.docx.lnk" --json C:\Output
# LNK-Dateien mit zusätzlichen Detailstufen parsen
LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_all.csv --all
JLECmd - Jump-List-Parser
# Automatische Sprunglisten parsen
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv
# Benutzerdefinierte Sprunglisten parsen
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations" --csv C:\Output --csvf jumplists_custom.csv
# Alle Sprunglisten mit detaillierter Ausgabe parsen
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv --ld
Jump-List-Struktur
Automatische Ziele (automaticDestinations-ms)
Diese sind OLE Compound-Dateien (Structured Storage), die im Dateinamen durch einen AppID-Hash identifiziert werden:
| AppID-Hash | Anwendung |
|---|---|
| 5f7b5f1e01b83767 | Windows Explorer Angeheftet/Häufig |
| 1b4dd67f29cb1962 | Windows Explorer Zuletzt verwendet |
| 9b9cdc69c1c24e2b | Notepad |
| a7bd71699cd38d1c | Notepad++ |
| 12dc1ea8e34b5a6 | Microsoft Paint |
| 7e4dca80246863e3 | Systemsteuerung |
| 1cf97c38a5881255 | Microsoft Edge |
| f01b4d95cf55d32a | Windows Explorer |
| 9d1f905ce5044aee | Microsoft Excel |
| a4a5324453625195 | Microsoft Word |
| d00655d2aa12ff6d | Microsoft PowerPoint |
| bc03160ee1a59fc1 | Outlook |
Benutzerdefinierte Ziele (customDestinations-ms)
Erstellt, wenn Benutzer Elemente an Anwendungs-Sprunglisten anheften. Diese Dateien enthalten sequenzielle LNK-Einträge.
Python-Analyse-Skript
import struct
import os
from datetime import datetime, timedelta
FILETIME_EPOCH = datetime(1601, 1, 1)
def filetime_to_datetime(filetime_bytes: bytes) -> datetime:
"""Konvertiert Windows FILETIME (100-ns-Intervalle seit 1601) in 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:
"""Parst den Shell-Link-Header aus einer LNK-Datei."""
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": "Ungültiger LNK-Header"}
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
Untersuchungs-Anwendungsfälle
Nachweis von Dateizugriffen
- LNK-Dateien aus dem Ordner "Recent" parsen, um aufgerufene Dokumente zu identifizieren
- Abgleich mit MFT-Zeitstempeln und USN-Journal-Einträgen
- Beachten, dass LNK-Dateien auch nach dem Löschen der Zieldateien erhalten bleiben
Zugriff auf Wechselmedien
- LNK-Dateien, die auf Laufwerksbuchstaben E:, F:, G: verweisen, weisen auf die Nutzung von Wechselmedien hin
- Die Volumeseriennummer in der LNK-Datei identifiziert das spezifische Gerät
- Die MAC-Adresse im TrackerDataBlock identifiziert den Quellrechner
Netzwerkfreigabe-Aktivitäten
- LNK-Dateien mit UNC-Pfaden (\Server\Freigabe) weisen auf Netzwerkdateizugriffe hin
- Der NetBIOS-Name identifiziert den entfernten Server
- Zeitstempel legen fest, wann der Zugriff erfolgte
Unterschiede zwischen Windows 10 und Windows 11
Aktuelle Forschung (IEEE 2025) zeigt, dass Windows 11 andere LNK- und Jump-List-Artefakte erzeugt:
- Weniger automatische LNK-Dateien für bestimmte Dateitypen
- Geändertes Jump-List-Verhalten für moderne Anwendungen
- UWP-/MSIX-Anwendungen generieren möglicherweise keine traditionellen Jump Lists
- Windows 11 Quick Access ersetzt teilweise die Recent-Funktionalität
Referenzen
- Shell Link Binary File Format: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/
- Magnet Forensics LNK Analysis: 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's LECmd/JLECmd: https://ericzimmerman.github.io/
Beispielausgabe
$ LECmd.exe -d "C:\Evidence\Users\jsmith\AppData\Roaming\Microsoft\Windows\Recent" --csv /analysis/lnk_output
LECmd v1.11.0 - LNK-Datei-Parser
================================
Verarbeite 47 LNK-Dateien...
--- LNK-Datei: Q4_Report.xlsx.lnk ---
Quelle: C:\Evidence\Users\jsmith\Recent\Q4_Report.xlsx.lnk
Zielpfad: C:\Users\jsmith\Downloads\Q4_Report.xlsm
Ziel erstellt: 2024-01-15 14:33:45 UTC
Ziel geändert: 2024-01-15 14:33:45 UTC
Ziel zugegriffen: 2024-01-15 14:35:12 UTC
Dateigröße: 251.904 Bytes
Laufwerkstyp: Festplatte (C:)
Volumeserien-Nr.: A4E7-3F21
Maschinen-ID: DESKTOP-J5M1TH
MAC-Adresse: 48:2A:E3:5C:9B:01
--- LNK-Datei: update_client.exe.lnk ---
Quelle: C:\Evidence\Users\jsmith\Recent\update_client.exe.lnk
Zielpfad: C:\ProgramData\Updates\update_client.exe
Ziel erstellt: 2024-01-15 14:34:02 UTC
Ziel geändert: 2024-01-15 14:34:02 UTC
Ziel zugegriffen: 2024-01-15 14:36:30 UTC
Dateigröße: 1.258.496 Bytes
Laufwerkstyp: Festplatte (C:)
Volumeserien-Nr.: A4E7-3F21
Maschinen-ID: DESKTOP-J5M1TH
Arbeitsverz.: C:\ProgramData\Updates
Argumente: --silent --no-update-check
Ausführen: Versteckt
======================================================================
$ JLECmd.exe -d "C:\Evidence\Users\jsmith\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv /analysis/jumplist_output
JLECmd v1.5.0 - Jump-List-Parser
==================================
Verarbeite 23 AutomaticDestinations-Dateien...
--- Anwendung: Microsoft Excel (AppID: 12dc1ea8e34b5a6) ---
Einträge: 15
Neueste:
Eintrag 0: C:\Users\jsmith\Downloads\Q4_Report.xlsm (2024-01-15 14:35:12 UTC)
Eintrag 1: \\FILESERV01\Finance\Budget_2024.xlsx (2024-01-14 09:22:30 UTC)
Eintrag 2: C:\Users\jsmith\Documents\Expenses\Dec2023.xlsx (2024-01-10 16:45:00 UTC)
--- Anwendung: Windows Explorer (AppID: f01b4d95cf55d32a) ---
Einträge: 28
Neueste:
Eintrag 0: C:\ProgramData\Updates\ (2024-01-15 14:36:25 UTC)
Eintrag 1: E:\Backup\ (2024-01-15 15:30:00 UTC)
Eintrag 2: \\FILESERV01\HR\Employees\ (2024-01-15 16:12:45 UTC)
--- Anwendung: cmd.exe (AppID: 9b9cdc69c1c24e2b) ---
Einträge: 5
Neueste:
Eintrag 0: C:\Windows\System32\cmd.exe (2024-01-15 14:36:00 UTC)
Zusammenfassung:
Verarbeitete LNK-Dateien insgesamt: 47
Jump-List-Einträge insgesamt: 156
Verdächtige Artefakte: 3 (Ausführung im versteckten Fenster, USB-Laufwerkszugriff, Netzwerkfreigaben)
CSV exportiert nach: /analysis/lnk_output/ und /analysis/jumplist_output/