본 글은 AI가 작성했습니다. 내용의 정확성을 위해 출처를 함께 확인하시기 바랍니다.
참고 명세
Microsoft Open Specifications [MS-SHLLINK] Shell Link Binary File Format
SANS FOR500 Windows Forensic Analysis
Eric Zimmerman's Tools https://ericzimmerman.github.io/

개요

Windows LNK 파일(Shell Link, 바로가기)은 다른 파일·폴더·URL을 가리키는 포인터 역할을 하는 이진 파일이다. 확장자는 .lnk이며, 파일을 열거나 프로그램을 실행할 때마다 자동으로 생성·갱신된다. 단순한 편의 기능처럼 보이지만, 포렌식 관점에서는 사용자의 파일 접근 행위, 연결된 디바이스 정보, 원격지 경로, 심지어 네트워크 어댑터 MAC 주소까지 담고 있는 중요한 아티팩트다.


저장 위치

Windows는 파일을 열 때마다 자동으로 LNK 파일을 Recent 경로에 생성한다.

경로설명
%APPDATA%\Microsoft\Windows\Recent\최근 파일 목록 (자동 생성 LNK)
%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\Jump List 자동 대상
%APPDATA%\Microsoft\Windows\Recent\CustomDestinations\Jump List 사용자 고정 대상
%USERPROFILE%\Desktop\바탕화면 바로가기
%APPDATA%\Microsoft\Windows\Start Menu\Programs\시작 메뉴 바로가기
%APPDATA%\Microsoft\Internet Explorer\Quick Launch\빠른 실행 바로가기
C:\ProgramData\Microsoft\Windows\Start Menu\전체 사용자 시작 메뉴

Recent 폴더 특성

  • 파일을 열기만 해도 자동 생성
  • 원본 파일이 삭제되어도 LNK 파일은 남아 있음 → 삭제된 파일의 존재 증명 가능
  • 기본 보존 개수: 최대 1000개 (Windows 10/11 기준)

LNK 파일은 Microsoft의 [MS-SHLLINK] 명세를 따르는 이진 형식이다. 크게 5개 섹션으로 구성된다.

┌─────────────────────────────┐
│   Shell Link Header (76B)   │  ← 항상 존재, 고정 크기
├─────────────────────────────┤
│   LinkTargetIDList          │  ← 선택적
├─────────────────────────────┤
│   LinkInfo                  │  ← 선택적
├─────────────────────────────┤
│   StringData                │  ← 선택적
├─────────────────────────────┤
│   ExtraData                 │  ← 선택적, 복수 블록
└─────────────────────────────┘

모든 LNK 파일의 첫 76바이트. 핵심 메타데이터가 담겨 있다.

오프셋크기필드설명
0x004HeaderSize항상 0x4C (76)
0x0416LinkCLSID{00021401-0000-0000-C000-000000000046}
0x144LinkFlags섹션 존재 여부 플래그
0x184FileAttributes대상 파일 속성
0x1C8CreationTime대상 파일 생성 시각 (FILETIME)
0x248WriteTime대상 파일 수정 시각 (FILETIME)
0x2C8AccessTime대상 파일 접근 시각 (FILETIME)
0x344FileSize대상 파일 크기 (하위 32bit)
0x384IconIndex아이콘 인덱스
0x3C4ShowCommand창 표시 방식
0x402HotKey단축키

⚠️ 중요: 여기 기록된 타임스탬프는 LNK 파일 자신의 시각이 아니라 대상 파일의 시각이다. 원본 파일이 삭제되어도 마지막 접근 당시의 타임스탬프가 보존된다.


2. LinkTargetIDList

대상 파일의 ID 리스트(Shell Item) 구조로, 파일 시스템 경로를 계층적으로 표현한다. 드라이브 문자부터 파일까지 각 경로 구성 요소가 별도의 ItemID로 저장된다.

Shell Item 내부에는 파일명 외에도 FAT/NTFS 타임스탬프, 파일 크기 등이 추가로 기록되는 경우가 있어 Header의 타임스탬프와 교차 검증이 가능하다.


3. LinkInfo

대상이 위치한 스토리지 환경 정보.

항목포렌식 가치
DriveType로컬·USB·네트워크 드라이브 구분
DriveSerialNumber볼륨 시리얼 번호 → 특정 디바이스 식별
VolumeLabel드라이브 레이블명
LocalBasePath로컬 절대 경로
CommonNetworkRelativeLinkUNC 네트워크 경로 (\\server\share)

DriveType 값:

의미
1경로 없음
2이동식 미디어 (USB 등)
3고정 디스크
4네트워크 드라이브
5CD-ROM
6RAM 디스크

4. StringData

필드설명
NAME_STRING바로가기 설명
RELATIVE_PATH상대 경로
WORKING_DIR작업 디렉터리
COMMAND_LINE_ARGUMENTS실행 인자 ← 악성 LNK 분석 시 핵심
ICON_LOCATION아이콘 경로

악성 LNK 파일은 COMMAND_LINE_ARGUMENTS에 PowerShell, cmd, mshta 등의 페이로드를 숨기는 경우가 많다.


5. ExtraData

가장 풍부한 포렌식 정보를 담고 있는 가변 길이 섹션.

TrackerDataBlock ← 핵심

필드포렌식 가치
MachineID대상 파일이 있던 컴퓨터의 NetBIOS 호스트명
VolumeID Droid볼륨 개체 ID — UUID v1, 타임스탬프 포함
FileID Droid파일 개체 ID — UUID v1, 마지막 6바이트에 MAC 주소 포함

FileID Droid — UUID v1 구조

FileID DroidUUID 버전 1 형식으로 저장된다. UUID v1은 생성 시각(60bit 타임스탬프)과 생성 장치의 네트워크 어댑터 MAC 주소(48bit)를 결합해 만들어지며, 이 MAC 주소가 그대로 필드 마지막 6바이트에 기록된다.

UUID v1 구조 (16바이트)
┌────────────┬──────┬──────┬──────┬──────────────┐
│ time_low   │t_mid │t_hi  │clock │  node (MAC)  │
│  (4B)      │ (2B) │ (2B) │ (2B) │    (6B)      │
└────────────┴──────┴──────┴──────┴──────────────┘
                                   ↑
                           공격자 MAC 주소

예를 들어 UUID가 6226b280-f5d2-11e9-8f0b-362b9e155667 이라면 마지막 36:2b:9e:15:56:67이 LNK를 생성한 시스템의 MAC 주소다.

💡 악성 LNK 파일을 공격자가 직접 제작해 배포한 경우, FileID Droid에서 추출한 MAC 주소로 파일을 만든 시스템의 NIC를 특정할 수 있다. 분석 대상 장치의 MAC 주소와 대조하면 제작 주체 귀속(Attribution)의 근거가 된다.

기타 ExtraData 블록

블록설명
SpecialFolderDataBlock특수 폴더(바탕화면, 문서 등) ID
KnownFolderDataBlockKNOWNFOLDERID GUID
EnvironmentVariableDataBlock환경변수 기반 경로
ConsoleDataBlock콘솔 창 속성
PropertyStoreDataBlock확장 속성 저장소

분석 도구

LECmd (Eric Zimmerman)

가장 널리 쓰이는 LNK 분석 CLI 도구.

# 단일 파일 분석
LECmd.exe -f "C:\Users\user\AppData\Roaming\Microsoft\Windows\Recent\document.lnk"

# 디렉터리 전체 분석 + CSV 출력
LECmd.exe -d "C:\Users\user\AppData\Roaming\Microsoft\Windows\Recent" --csv C:\output

# 모든 사용자 Recent 폴더 재귀 분석
LECmd.exe -d "C:\Users" -q --csv C:\output

LnkParse3 (Python)

import lnkparse3

with open("document.lnk", "rb") as f:
    lnk = lnkparse3.LnkParse3(f)
    lnk.print_lnk_info()

기타 도구

도구특징
KAPE자동 수집 + LECmd 연동
AutopsyLNK 파서 플러그인 내장
Eric Zimmerman’s JLECmdJump List 분석 (AutoDest/CustomDest)
ExifTool기본 메타데이터 추출
CyberChef16진수 직접 파싱