LNK

1. 개요

LNK 파일은 Windows 95부터 도입된 Windows에서 파일, 폴더, 응용 프로그램에 대한 ‘바로가기’ 또는 ‘링크’를 말하며, 확장자는 .LNK이다. 공식 명칭은 Shell Link로, Shell Link Binary File Format 규격을 따르며, 다른 데이터 개체에 액세스하는 데 사용할 수 있는 정보가 포함된 데이터 개체이다. 이 파일은 응용 프로그램 시작, OLE(개체 연결 및 포함) 시나리오 지원, 대상 파일 참조 저장 등에 사용되며, 키보드 단축키, 설명 코멘트, 응용 프로그램 동작 제어 설정 등 다양한 정보를 포함할 수 있다.

원본 파일과 동일한 아이콘에 좌측 하단에 화살표 표시가 있어 링크 파일임을 나타낸다. LNK 파일의 속성을 살펴보면 아래 그림처럼 ‘바로 가기’ 탭의 대상에 원본 파일의 이름과 경로를 저장하고 있고, 그 위치에 파일이 존재할 경우, ‘일반’ 탭에서 시간 날짜를 확인할 수 있다.

LNK 파일의 포렌식 관점

파일의 MAC Time, 볼륨 정보, 네트워크 공유 정보, 원본 위치, 시스템 이름, 원본 파일 추적 가능

LNK 파일 위치

LNK 파일은 사용자 필요에 따라 ‘바로 가기 만들기’를 통해 생성할 수 있고, 사용자가 파일, 폴더, 프로그램에 접근할 때 자동으로 생성된다. 윈도우 10 기준 LNK 파일이 자동 생성되는 경로는 아래와 같다. 특히 Recent 경로에는 파일, 폴더, 프로그램이 실행될 때 자동으로 lnk 파일이 생성되기 때문에 사용자의 최근 실행 목록과 그 정보를 알 수 있다.

명칭
경로

시작 메뉴

  • \ProgramData\Microsoft\Windows\Start Menu\Programs*.lnk

  • \User<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs**.ln

WinX Group

  • Users<user name>\AppData\Local\Microsoft\Windows\WinX\Group#*.lnk

빠른 실행

  • \Users<user name>\AppData\Local\Microsoft\Internet Explorer\Quick Launch.lnk

Send To

  • \Users<user name>\AppData\Roaming\Microsoft\Windows\SendTo.lnk

응용 프로그램 바로 가기

  • \Users<user name>\AppData\Local\Microsoft\Windows\Application Shortcuts*.lnk

최근 문서

  • \Users<user name>\AppData\Roaming\Microsoft\Windows\Recent*.lnk


2. 데이터 구조

LNK 파일은 크게 ShellLinkHeader(default), LinkTargetIDList, LinkInfo, StringData, ExtraData로 구성되어 있고, ABNF 준수하는 일련의 구조로 이루어져 있다. 각 구조에 대한 설명은 아래 표와 같고, 포렌식적으로 유의미한 정보를 담고 있는 구조는 ShellLinkHeaderLinkInfo이다.

명칭
설명

SHELL_LINK_HEADER

76 바이트의 기본 헤더 구조로 식별정보, 타임스탬프, 대상 파일 크기, 플래그 등이 포함된다.

LINKTARGET_IDLIST

링크 대상을 지정하는 구조이다. SHELL_LINK_HEADER의 HasLinkTargerID 비트가 설정되어 있을 때만 존재하며, 바로가기에서 필수적인 항목으로 원본에 대한 정보를 담고 있다.

LINKINFO

링크 대상을 해결하는 데 필요한 정보를 지정하는 구조이다. SHELL_LINK_HEADER의 HasLinkInfo 비트가 설정되어 있을 때만 존재하며, 원본 위치를 찾을 때 필요한 정보를 담고 있다.

STRING_DATA

사용자 인터페이스 및 경로 식별 정보를 전달하는데 사용하는 구조이다. ShellLinkHeader의 비트가 설정되어 있을 때 존재하며, 링크 대상의 문자열 정보(이름, 상대경로, 작업 디렉터리 등)을 저장하고 있다.

EXTRA_DATA

링크 대상의 화면 표시 정보, 문자열 코드 페이지, 환경 변수와 같은 추가적인 정보 저장하고 있다.

ShellLinkHeader

ShellLinkHeader는 76 바이트의 기본 헤더 구조이며, 해당 구조에는 LinkTargerIDList, LinkInfo, StringData 등 구조의 존재를 지정하는 식별정보, 타임스탬프 및 플래그가 포함되어 있는 구조이다. 해당 구조에서 원본 파일의 속성 정보와 생성, 접근 수정 시간을 확인할 수 있다. ShellLinkHeader에서 포렌식적으로 의미있는 부분은 FileAttributes, CreationTime, AccessTime, WriteTime, FileSize 등이 있다.

SHELL_LINK_HEADER의 구조 별 오프셋과 설명은 다음 표와 같다.

오프셋
명칭
크기
설명

0~3

HeaderSize

4바이트

크기를 나타내며, 값은 0x0000004C로 고정

4~13

LinkCLSID

16바이트

클래스 식별자(CLSID)로 값은 00021401-0000-0000-C000-000000000046로 고정

14~17

LinkFlags

4바이트

링크에 대한 정보와 구조의 존재 여부를 지정

18~1B

FileAttributes

4바이트

링크 대상에 대한 정보를 지정

1C~23

CreationTime

8바이트

링크 대상의 생성 시간을 UTC로 지정 (0이면 링크 대상에 시간 없음)

24~2B

AccessTime

8바이트

링크 대상의 액세스 시간을 UTC로 지정 (0이면 링크 대상에 시간 없음)

2C~33

WriteTime

8바이트

링크 대상의 쓰기 시간을 UTC로 지정 (0이면 링크 대상에 시간 없음)

34~37

FileSize

4바이트

링크 대상의 크기를 지정하는 부호 없는 정수 (링크 대상 파일이 0xFFFFFFFF보다 큰 경우 이 값은 링크 대상 파일 크기의 최하위 32비트를 지정)

38~3B

IconIndex

4바이트

주어진 아이콘 위치 내의 아이콘 인덱스를 지정하는 부호 있는 정수

3C~3F

ShowCommand

4바이트

링크에 의해 시작된 애플리케이션의 동작 모드를 나타내는 부호 없는 정수

  • SW_SHOWNORMAL(0x00000001) : 응용 프로그램이 열려 있고 해당 창이 일반적인 방식으로 열려 있음

  • SW_SHOWMAXIMIZED(0x00000003) : 응용 프로그램이 열려 있고 키보드 포커스가 주어지고 해당 창은 표시되지 않음

  • SW_SHOWMINNOACTIVE(0x00000007) : 응용 프로그램이 열려 있고 키보드 포커스가 주어지지 않고 해당 창이 표시되지 않음

40~41

HotKey

2바이트

바로 가기 키가 참조하는 응용 프로그램을 시작하는 데 사용되는 키 입력을 지정 애플리케이션이 시작된 후 애플리케이션에 할당되므로 키를 누르면 해당 애플리케이션이 활성화

42~4B

Reserved1,2,3

10바이트

예약 영역으로 0으로 고정

▶ ShellLinkHeader 구조 예시

예시를 통해 ShellLinkHeader를 살펴보면 아래 그림과 같다.

ShellLinkHeader의 첫 4바이트는 크기를 나타내며 0x0000004C로 고정되어 있고, 시간 정보 및 파일 사이즈 등을 확인할 수 있다.

LinkTargetIDList

링크 대상을 지정하는 구조로 ‘바로가기’ 파일에서 필수적인 항목으로 원본에 대한 정보를 가지고 있는 구조이다. LinkTargetIDList는 IDListSize와 IDList로 이루어져 있고, IDList는 ItemIDList와 TerminalID로 나뉜다. TerminalID는 맨 끝에 존재하는 2바이트 예약 영역이며, 종료를 나타낸다. ItemID는 ItemIDSize와 Data로 나뉜다.

LinkTargetIDList의 구조 별 설명은 다음 표와 같다.

명칭
크기
설명

IDListSize

2바이트

IDList 필드의 크기

IDList

variable

item ID 리스트를 저장하며, ABNF [RFC5234]를 준수

IDList는 ItemIDList와 TerminalID로 구성되어 있다.

명칭
크기
설명

ItemIDList

variable

ItemID 구조 배열

TerminalID

2바이트

0으로 채워져 있으며, 끝을 나타냄

ItemID는 ItemIDSize와 Data로 나뉜다.

명칭
크기
설명

ItemIDSize

2바이트

ItemID 구조 크기 (ItemIDSize 포함)

Data

variable

shell data source에 정의된 데이터

▶ 구조 예시

예시를 통해 LinkTargetIDList를 살펴보면 아래와 같다.

위 사진에서 보듯 SHELL_LINK_HEADER가 끝난 후 2바이트 0x00DA(218)가 IDList 필드의 크기를 결정하는 IDListsize 부분이고, 0x4E부터 218바이트 길이의 IDList 정보가 이어진다.

LinkInfo

원래 위치에서 링크 대상을 찾을 수 없는 경우 링크 대상을 확인하는데 필요한 정보를 가지고 있는 구조이다.

해당 구조에서 원본 파일의 크기, 원본 파일이 위치한 VolumeID와 Volume의 시리얼 번호, 경로 등을 확인할 수 있다. LinkInfo에서 포렌식적으로 의미있는 부분은 VolumeID 내의 DriveType, DriveSerialNumber, LocalBasePath 등이 있다.

LinkInfo의 구조별 설명은 다음 표와 같다.

명칭
크기
설명

LinkInfoSize

4바이트

LinkInfo 구조의 크기

LinkInfoHeaderSize

4바이트

LinkInfo 헤더 크기 (LinkInfo 헤더는 LinkInfoSize, LinkInfoHeaderSize, LinkInfoFlags, VolumeIDOffset, LocalBasePathOffset, CommonNetworkRelativeLinkOffset, CommonPathSuffixOffset 필드로 구성)

LinkInfoFlags

4바이트

VolumeID, LocalBasePath, LocalBasePathUnicode 및 CommonNetworkRelativeLink 필드가 이 구조에 있는지 여부를 지정하는 플래그

VolumeIDOffset

4바이트

VolumeID 필드의 위치를 지정

LocalBasePathOffset

4바이트

LocalBasePath 필드의 위치를 지정

CommonNetworkRelativeLinkOffset

4바이트

CommonNetworkRelativeLink 필드의 위치를 지정

CommonPathSuffixOffset

4바이트

CommonPathSuffix 필드의 위치를 지정

VolumeID

variable

링크가 생성될 때 링크 대상이 있던 볼륨에 대한 정보를 지정

파일 별로 존재 여부가 다른 구조에 대한 설명은 생략했으며, 자세한 사항에 대한 설명은 관련 문서의 LinkInfo 부분을 확인하는 것을 추천한다.

  • volumeID

    링크가 생성될 때 링크 대상이 있던 볼륨에 대한 정보를 지정. 파일이 원래 위치에서 발견되지 않은 경우 링크를 확인할 수 있다.

명칭
크기
설명

VolumeIDSize

4바이트

VolumeID의 크기를 지정하며 0x00000010보다 커야 함

DriveType

4바이트

링크 대상이 저장된 드라이브 유형을 지정

  • DRIVE_UNKNOWN (0x00000000) : 드라이브 유형 결정 못 함

  • DRIVE_NO_ROOT_DIR (0x00000001) : 루트 경로 잘못됨

  • DRIVE_REMOVABLE (0x00000002) : 드라이브에 이동식 미디어 존재

  • DRIVE_FIXED (0x00000003) : 드라이브에 고정 미디어 존재

  • DRIVE_REMOTE (0x00000004) : 드라이브가 원격 드라이브 일 때

  • DRIVE_CDROM (0x00000005) : 드라이브가 CD-ROM 일 때

  • DRIVE_RAMDISK (0x00000006) : 드라이브가 RAM 디스크

DriveSerialNumber

4바이트

링크 대상이 저장된 볼륨의 드라이브 일련 번호를 지정

VolumeLabelOffset

4바이트

링크 대상이 저장된 드라이브의 볼륨 레이블이 포함된 문자열의 위치를 지정 (VolumeID 구조의 시작부터 시스템 기본 코드 페이지에 의해 정의된 NULL로 끝나는 문자열까지의 오프셋)

VolumeLabelOffsetUnicode

4바이트

링크 대상이 저장된 드라이브의 볼륨 레이블이 포함된 문자열의 위치를 지정 (VolumeID 구조의 시작부터 NULL로 끝나는 유니코드 문자 문자열까지의 오프셋)

Data

variable

이전 필드에 지정된 대로 시스템 기본 코드 페이지 또는 유니코드 문자로 정의된 문자열로 드라이브의 볼륨 레이블을 포함하는 데이터 버퍼

▶ 구조 예시

예시를 통해 LinkInfo를 살펴보면 아래와 같다.

위 그림처럼 LINKTARGET_IDLIST가 끝난 이후 따라오는 4바이트(0x128~0x12B)는 LinkInfosize를 나타내며, 0x12C부터 101바이트가 지난 0x190에 LinkInfo가 저장되어 있다.

LinkInfoHeaderSize가 0x1C이기 때문에 선택적 필드에 대한 오프셋이 존재하지 않는다.

위 그림에서는 LinkInfo 중 volumeID의 구조를 확인할 수 있으며, LinkTarget이 저장된 드라이브와 관련된 부분을 확인할 수 있다.

StringData

파일 설명, 상대 경로, 작업 디렉토리, 명령줄 인수, 아이콘 위치 등에 대한 문자열 데이터를 확인하는데 필요한 정보를 가지고 있는 구조이다.

  • NAME_STRING: 링크의 목적을 식별하기 위해 최종 사용자에게 표시되는 바로 가기에 대한 설명을 지정

  • RELATIVE_PATH: 링크가 포함된 파일을 기준으로 링크 대상의 위치를 지정

  • WORKING_DIR: 링크 대상을 활성화할 때 사용할 작업 디렉터리의 파일 시스템 경로를 지정

  • COMMAND_LINE_ARGUMENTS: 링크 대상을 활성화할 때 지정되는 명령 인수를 저장

  • ICON_LOCATION: 링크 항목을 표시할 때 사용할 아이콘의 위치를 지정

명칭
크기
설명

CountCharacters

2바이트

시스템 기본 코드 페이지에 정의된 문자 수 또는 문자열 필드에 있는 유니코드 문자 수를 지정

String

variable

시스템 기본 코드 페이지에 의해 정의된 선택적 문자 집합 또는 CountCharacters 필드에 지정된 길이의 유니코드 문자열

ExtraData

추가적인 속성 정보로, 다수의 다양한 데이터 블록이 포함될 수 있다. 파일의 이동이나 변경 이력 및 추가 속성이 기록될 수 있어 사용자 활동 분석과 파일 속성 확인에 유용하다. 각 파일마다 가변적이므로, 이 글에서 상세한 정보를 설명하지 않겠다. 자세한 설명이 필요한 경우 MS의 LNK 파일 중 ExtraData 파트를 살펴보는 걸 추천한다.


3. 분석 방안/활용

LNK 파일 구조에서 확인할 수 있듯 LNK 파일 분석 시 원본 파일의 속성 정보, 생성, 접근, 수정 시간 등을 알 수 있다. LNK 파일 자체로 침해 사고를 파악하기 어렵기 때문에 사고 유형을 먼저 파악하고, 타임라인과 연계해 분석할 필요가 있다.

LNK 파일 분석 단계

아래와 같은 방법으로 LNK 파일을 분석할 수 있다.

  1. LNK 파일 수집 : 분석 대상에서 LNK 파일을 수집한다. (바탕화면, 최근 문서, 시작메뉴 등)

  2. 파일 식별 : 확장자, 파일 시그니처, GUID 확인 등을 통해 LNK 파일인지 확인한다.

  3. 구조 분석 : ShellLinkHeader, LinkTargetIDList, LinkInfo, StringData, ExtraData 구조를 분석한다.

  4. 데이터 추출 및 분석 : 경로, 타임스탬프, 파일 속성, 네트워크 등의 정보 추출한다.

  5. 연관 분석 : 타임라인과 연관 지어 분석하며, 사용자의 활동을 파악한다.

LNK 파일 활용 방안

LNK 파일을 포렌식적으로 활용할 수 있는 방안은 다양하며, 주로 사용자의 활동을 추적하는 데 중점을 둔다.

  1. 사용자 활동 추적 : 파일 접근 이력 및 사용 이력을 확인할 수 있고, 파일 생성 및 수정 시간을 확인할 수 있다.

  2. 파일 및 프로그램 실행 경로 추적 : LNK 파일에 저장된 경로 정보를 획득해 저장된 위치 및 숨겨진 파일을 찾는 데 활용할 수 있고, 네트워크 경로일 경우 네트워크 상의 파일 접근을 추적할 수 있다.

  3. 시스템 및 사용자 환경 분석 : 시스템 환경 정보 수집 및 아이콘 정보를 확인할 수 있다.

  4. 상관 관계 분석 : 다른 아티팩트와 연계 분석해 사용자의 활동 패턴을 분석할 수 있고, 상관 관계를 파악할 수 있다.

  5. 악성코드 분석 : 악성코드 실행 흔적을 추적할 수 있고, 자동 실행 설정을 분석할 수 있다.


4. 분석 도구

LNK 파일을 분석할 수 있는 도구에는 LECmd, 010editor, AXIOM 등 다양한 도구가 있으나 이 글에서는 사용자의 접근성이 좋다고 생각되는 Eric Zimmerman 도구 중 하나인 LECmd를 소개하도록 하겠다.

LECmd는 command line tool로 알려져 있으며, 이 도구를 활용해 LNK 파일 속성을 확인할 수 있다. LECmd 도구는 아래 링크에서 다운로드 받을 수 있다.

LECmd 사용 명령어는 아래와 같으며, 분석 결과는 출력 뿐만 아니라 내보내기 옵션을 사용해 json파일로 내보낼 수 있다.

LECmd.exe -f "C:\\Temp\\foobar.lnk"
LECmd.exe -f "C:\\Temp\\somelink.lnk" --json "D:\\jsonOutput" --pretty
LECmd.exe -d "C:\\Temp" --csv "c:\\temp" --html c:\\temp --xml c:\\temp\\xml -q
LECmd.exe -f "C:\\Temp\\some other link.lnk" --nid --neb
LECmd.exe -d "C:\\Temp" --all

LECmd를 이용해 단일 LNK파일 분석 시 나오는 결과 화면은 아래와 같다.


5. 참조

Last updated

Was this helpful?