¿Qué hace Análisis de Archivos LNK y Artefactos de Jump Lists?
Descripción General
Los archivos LNK (accesos directos) de Windows y las Jump Lists son artefactos forenses críticos que proporcionan evidencia de acceso a archivos, ejecución de programas y comportamiento del usuario. Los archivos LNK se crean automáticamente cuando un usuario abre un archivo a través del Explorador de Windows o del cuadro de diálogo Abrir/Guardar, almacenando metadatos sobre el archivo de destino, incluyendo su ruta original, marcas de tiempo, número de serie del volumen, nombre NetBIOS y dirección MAC del sistema anfitrión. Las Jump Lists, introducidas en Windows 7, amplían esta funcionalidad manteniendo listas por aplicación de archivos accedidos recientemente y con frecuencia. Estos artefactos persisten incluso después de que los archivos de destino se eliminan, lo que los hace invaluables para establecer que un usuario accedió a archivos específicos en momentos determinados.
Cuándo Usar
- Al investigar incidentes de seguridad que requieren analizar artefactos de archivos LNK y Jump Lists
- Al construir reglas de detección o consultas de búsqueda de amenazas para este dominio
- Cuando los analistas del SOC necesitan procedimientos estructurados para este tipo de análisis
- Al validar la cobertura de monitoreo de seguridad para técnicas de ataque relacionadas
Prerrequisitos
- LECmd (Eric Zimmerman) para análisis de archivos LNK
- JLECmd (Eric Zimmerman) para análisis de Jump Lists
- Python 3.8+ con las bibliotecas pylnk3 o LnkParse3
- Imagen forense o recopilación de triaje de un sistema Windows
- Timeline Explorer para análisis CSV
Ubicaciones de Archivos LNK
| Ubicación | Descripción |
|---|---|
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent\ | Archivos recientes accedidos |
%USERPROFILE%\Desktop\ | Accesos directos creados por el usuario |
%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\ | Accesos directos del Menú Inicio |
%USERPROFILE%\AppData\Roaming\Microsoft\Office\Recent\ | Documentos recientes de Office |
Estructura del Archivo LNK
Encabezado Shell Link (76 bytes)
| Offset | Tamaño | Campo |
|---|---|---|
| 0x00 | 4 | HeaderSize (siempre 0x0000004C) |
| 0x04 | 16 | LinkCLSID (siempre 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 del destino |
| 0x38 | 4 | IconIndex |
| 0x3C | 4 | ShowCommand |
| 0x40 | 2 | HotKey |
Campos Forenses Clave en Archivos LNK
- Marcas de tiempo del archivo destino: Tiempos de creación, acceso y modificación del archivo referenciado
- Información del volumen: Número de serie, tipo de unidad, etiqueta del volumen
- Información de recurso compartido de red: Ruta UNC, nombre del recurso compartido
- Identificadores de máquina: Nombre NetBIOS, dirección MAC (desde TrackerDataBlock)
- Seguimiento de enlaces distribuidos: ID de máquina y GUID del objeto
Análisis con Herramientas EZ
LECmd - Analizador de Archivos LNK
# Analizar todos los archivos LNK en la carpeta Recent
LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_analysis.csv
# Analizar un solo archivo LNK con todos los detalles
LECmd.exe -f "C:\Evidence\Users\suspect\Desktop\Confidential.docx.lnk" --json C:\Output
# Analizar archivos LNK con niveles de detalle adicionales
LECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\Output --csvf lnk_all.csv --all
JLECmd - Analizador de Jump Lists
# Analizar Jump Lists Automáticas
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv
# Analizar Jump Lists Personalizadas
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations" --csv C:\Output --csvf jumplists_custom.csv
# Analizar todas las Jump Lists con salida detallada
JLECmd.exe -d "C:\Evidence\Users\suspect\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv C:\Output --csvf jumplists_auto.csv --ld
Estructura de la Jump List
Destinos Automáticos (automaticDestinations-ms)
Son archivos OLE Compound (Almacenamiento Estructurado) identificados por el hash del AppID en el nombre del archivo:
| Hash del AppID | Aplicación |
|---|---|
| 5f7b5f1e01b83767 | Explorador de Windows (Anclados/Frecuentes) |
| 1b4dd67f29cb1962 | Explorador de Windows (Recientes) |
| 9b9cdc69c1c24e2b | Bloc de notas |
| a7bd71699cd38d1c | Notepad++ |
| 12dc1ea8e34b5a6 | Microsoft Paint |
| 7e4dca80246863e3 | Panel de control |
| 1cf97c38a5881255 | Microsoft Edge |
| f01b4d95cf55d32a | Explorador de Windows |
| 9d1f905ce5044aee | Microsoft Excel |
| a4a5324453625195 | Microsoft Word |
| d00655d2aa12ff6d | Microsoft PowerPoint |
| bc03160ee1a59fc1 | Outlook |
Destinos Personalizados (customDestinations-ms)
Se crean cuando los usuarios anclan elementos a las Jump Lists de las aplicaciones. Estos archivos contienen entradas LNK secuenciales.
Script de Análisis en Python
import struct
import os
from datetime import datetime, timedelta
FILETIME_EPOCH = datetime(1601, 1, 1)
def filetime_to_datetime(filetime_bytes: bytes) -> datetime:
"""Convierte FILETIME de Windows (intervalos de 100 ns desde 1601) a 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:
"""Analiza el encabezado Shell Link de un archivo 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": "Encabezado LNK inválido"}
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
Casos de Uso de Investigación
Evidencia de Acceso a Archivos
- Analizar archivos LNK de la carpeta Recent para identificar documentos accedidos
- Cruzar referencias con marcas de tiempo de MFT y entradas del diario USN
- Tener en cuenta que los archivos LNK persisten incluso después de eliminar los archivos de destino
Acceso a Medios Extraíbles
- Los archivos LNK que hacen referencia a letras de unidad E:, F:, G: indican uso de medios extraíbles
- El número de serie del volumen en el LNK identifica el dispositivo específico
- La dirección MAC en TrackerDataBlock identifica la máquina de origen
Actividad en Recursos Compartidos de Red
- Los archivos LNK con rutas UNC (\servidor\recurso) indican acceso a archivos de red
- El nombre NetBIOS identifica el servidor remoto
- Las marcas de tiempo establecen cuándo ocurrió el acceso
Diferencias entre Windows 10 y Windows 11
Investigaciones recientes (IEEE 2025) muestran que Windows 11 produce artefactos LNK y Jump List diferentes:
- Menos archivos LNK automáticos generados para ciertos tipos de archivo
- Comportamiento modificado de Jump Lists para aplicaciones modernas
- Las aplicaciones UWP/MSIX pueden no generar Jump Lists tradicionales
- El Acceso Rápido de Windows 11 reemplaza algunas funcionalidades de Recent
Referencias
- Formato de archivo binario Shell Link: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/
- Análisis forense de archivos LNK de Magnet Forensics: https://www.magnetforensics.com/blog/forensic-analysis-of-lnk-files/
- Forensia de Jump Lists 2025: https://www.cybertriage.com/blog/jump-list-forensics-2025/
- LECmd/JLECmd de Eric Zimmerman: https://ericzimmerman.github.io/
Ejemplo de Salida
$ LECmd.exe -d "C:\Evidence\Users\jsmith\AppData\Roaming\Microsoft\Windows\Recent" --csv /analysis/lnk_output
LECmd v1.11.0 - LNK File Parser
================================
Procesando 47 archivos LNK...
--- Archivo LNK: Q4_Report.xlsx.lnk ---
Origen: C:\Evidence\Users\jsmith\Recent\Q4_Report.xlsx.lnk
Ruta Destino: C:\Users\jsmith\Downloads\Q4_Report.xlsm
Creado Destino: 2024-01-15 14:33:45 UTC
Modificado Destino: 2024-01-15 14:33:45 UTC
Accedido Destino: 2024-01-15 14:35:12 UTC
Tamaño Archivo: 251,904 bytes
Tipo de Unidad: Fija (C:)
Serial del Volumen: A4E7-3F21
ID de Máquina: DESKTOP-J5M1TH
Dirección MAC: 48:2A:E3:5C:9B:01
--- Archivo LNK: update_client.exe.lnk ---
Origen: C:\Evidence\Users\jsmith\Recent\update_client.exe.lnk
Ruta Destino: C:\ProgramData\Updates\update_client.exe
Creado Destino: 2024-01-15 14:34:02 UTC
Modificado Destino: 2024-01-15 14:34:02 UTC
Accedido Destino: 2024-01-15 14:36:30 UTC
Tamaño Archivo: 1,258,496 bytes
Tipo de Unidad: Fija (C:)
Serial del Volumen: A4E7-3F21
ID de Máquina: DESKTOP-J5M1TH
Directorio de Trabajo: C:\ProgramData\Updates
Argumentos: --silent --no-update-check
Ventana de Ejecución: Oculto
======================================================================
$ JLECmd.exe -d "C:\Evidence\Users\jsmith\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv /analysis/jumplist_output
JLECmd v1.5.0 - Jump List Parser
==================================
Procesando 23 archivos de AutomaticDestinations...
--- Aplicación: Microsoft Excel (AppID: 12dc1ea8e34b5a6) ---
Entradas: 15
Más recientes:
Entrada 0: C:\Users\jsmith\Downloads\Q4_Report.xlsm (2024-01-15 14:35:12 UTC)
Entrada 1: \\FILESERV01\Finance\Budget_2024.xlsx (2024-01-14 09:22:30 UTC)
Entrada 2: C:\Users\jsmith\Documents\Expenses\Dec2023.xlsx (2024-01-10 16:45:00 UTC)
--- Aplicación: Explorador de Windows (AppID: f01b4d95cf55d32a) ---
Entradas: 28
Más recientes:
Entrada 0: C:\ProgramData\Updates\ (2024-01-15 14:36:25 UTC)
Entrada 1: E:\Backup\ (2024-01-15 15:30:00 UTC)
Entrada 2: \\FILESERV01\HR\Employees\ (2024-01-15 16:12:45 UTC)
--- Aplicación: cmd.exe (AppID: 9b9cdc69c1c24e2b) ---
Entradas: 5
Más recientes:
Entrada 0: C:\Windows\System32\cmd.exe (2024-01-15 14:36:00 UTC)
Resumen:
Total de archivos LNK procesados: 47
Total de entradas en Jump Lists: 156
Artefactos sospechosos: 3 (ejecución con ventana oculta, acceso a unidad USB, recursos compartidos de red)
CSV exportado a: /analysis/lnk_output/ y /analysis/jumplist_output/