DFIR/DFIR

LNK 바로가기란?

dotaky99 2021. 6. 19. 17:35
반응형

대상 : Windows 10

 

:LNK(바로가기) 란?

LNK 파일이란 Windows에서 원본 파일, 폴더 또는 응용 프로그램에 대한 '바로가기' 또는 '링크(link)'를 말한다. 흔히 'Windows Shortcu' 이라고도 불리며, 공식적으로는 'Shell Link'이다. LNK는 Windows 95에 도입이 시작되었다.

만드는 방법은 실행 가능한 프로그램 및 파일, 폴더를 우클릭하여 '바로 가기 만들기'를 눌러주면 생성된다. 윈도우 설치 시 바로가기 파일 생성은 기본옵션으로 활성화되어 있기 때문에 사용자가 파일이나 폴더에 접근할 경우 바로가기(LNK)파일이 생성된다. 윈도우 10 기준 LNK 파일이 자동으로 생성되는 경로는 아래와 같다.

Name Path
Start Menu Places \ProgramData\Microsoft\Windows\Start Menu Places\*.lnk
Start Menu \ProgramData\Microsoft\Windows\Start Menu\Programs\*.lnk
\User\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\*\*.lnk
%UserProfile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\*\*.lnk
%ServiceProfile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\*\*.lnk
WinX Group Users\Default\AppData\Local\Microsoft\Windows\WinX\Group#\*.lnk
%UserProfile%\AppData\Local\Microsoft\Windows\WinX\Group#\*.lnk
%ServiceProfile%\AppData\Local\Microsoft\Windows\WinX\Group#\ *.lnk
Quick Launch \Users\Default\AppData\Local\Microsoft\Internet Explorer\Quick Launch\*.lnk
%UserProfile%\AppData\Local\Microsoft\Internet Explorer\Quick Launch\*.lnk
%ServiceProfile%\AppData\Local\Microsoft\Internet Explorer\Quick Launch\*.lnk
Send To \Users\Default\AppData\Roaming\Microsoft\Windows\SendTo\*.lnk
%UserProfile%\AppData\Roaming\Microsoft\Windows\SendTo\*.lnk
%ServiceProfile%\AppData\Roaming\Microsoft\Windows\SendTo\*.lnk
Application(App) Shoutcuts %UserProfile%\AppData\Local\Microsoft\Windows\Application Shoutcuts\*.lnk
Recent %UserProfile%\AppData\Roaming\Microsoft\Windows\Recent\*.lnk
Links %UserProfile\Links\*.lnk

LNK 파일은 일반적으로 대상 파일과 동일한 아이콘을 사용하지만 좌측하단에 조그맣게 웅크린 화살표가 추가되어 있다. 두 번 클릭했을 때 바로 가기는 사용자가 원본 파일을 더블 클릭했을 때와 완전히 같은 방식으로 동작한다. LNK파일은 원본 파일의 타입, 전체 경로, 파일 이름, 시간 정보 등 다양한 정보를 포함하고 있다. 또한, 파일 및 폴더를 실행 시키면 자동으로 위 표에서 Recent 경로에 자동으로 생성되기 때문에 사용자가 최근 실행시킨 파일이나 폴더 정보를 알 수 있다. 따라서 포렌식 관점에서 보면 사용자 행위 분석에 중요한 아티팩트가 될 수 있다.

::LNK 파일 포맷

LNK 파일 포맷은 Shell Link Binary File Format 이라고도 하며 확장자가 .lnk 인 윈도우 파일의 포맷을 뜻한다. LNK는 다음과 같은 구조로 구성된다.

구조체 이름 설명
SHELL_LINK_HEADER(default) 총 76바이트 크기의 기본적인 헤더로 식별정보, 타임스탬프, 대상 파일 크기 및 특성 등의 정보가 저장된다.
LINKTARGET_IDLIST(optional) 대상의 링크에 대한 정보가 명시되어 있다. SHELL_LINK_HEADER 구조체 내의 HasLinkTargetIDList bit에 의해 존재여부가 결정된다. 바로가기에서 필수적인 항목. IDList크기가 가변적이기에 이 구조체 또한 가변적이다. 원본에 대한 정보를 담고 있음.
LINKINFO(optional) 링크 대상을 분석하기 위해 필요한 데이터가 존재한다. SHELL_LINK_HEADER 구조체 내의 HasLinkInfo bit에 의해 존재여부가 결정된다. 원본의 위치를 찾을 때 필요한 정보를 담고 있다.
STRING_DATA(optional) 링크 대상의 문자열 정보(이름, 상대경로, 작업디렉터리 등)를 저장하는 구조. ShellLinkHeader에 관련된 플래그가 설정되어 있을 때만 존재한다.
EXTRA_DATA(optional) 링크 대상의 화면 표시 정보, 문자열 코드 페이지, 환경 변수와 같은 추가적인 정보 저장을 위한 구조.

:::SHELL_LINK_HEADER

SHELL_LINK_HEADER 구조체는 총 76-bit이며 LinkTarget_IDList, LInkInfo 및 StringData와 같은 선택적 구조의 존재를 지정하는 식별정보, 타임스탬프 및 플래그가 포함되어 있다. SHELL_LINK_HEADER는 오프셋 별로 저장하고 있는 정보가 다르다. 아래는 SHELL_LINK_HEADER의 구조이다. 

포렌식적으로 의미가 있는 정보는 색이 입혀진 필드이다.

※ CreationTime, AccessTime, WriteTime

-> FILETIME의 구조체. 기본적으로 UTC 기반으로 하고 있으며 만약 값이 존재하지 않는다면 링크 대상에 시간 정보가 존재하지 않는 다는 것을 뜻함.

 

각 필드에 대한 자세한 사항은 마이크로 소프트 공식 문서를 참고하면 편하다.

:::LinkTargetIDList

IDList에는 ItemIDList, TerminalID 등 다양한 구조가 이어진다. 이 또한 자세한 사항은 공식 문서를 참고하기 바란다.

::: LinkInfo

이 구조체는 링크 대상이 원래 위치에 없는 경우 해당 대상을 해결하는데 필요한 정보를 지정한다. 이 구조는 가변적이고 불필요한 내용이 많으므로 핵심 정보만을 얻어가보자.

  • VolumeID
    • DriveType
      • DRIVE_UNKNOWN : 0x00000000 ( 알 수 없음 )
      • DRIVE_NO_ROOT_DIR : 0x00000001 ( Root Path가 없음 )
      • DRIVE_REMOVABLE : 0x00000002  ( 외장 장치 )
      • DRIVE_FIXED : 0x00000003 ( Fixed 장치 )
      • DRIVE_REMOTE : 0x00000004 ( 네트워크 )
      • DRIVE_CDROM : 0x00000005 ( CD-ROM )
      • DRIVE_RAMDISK : 0x00000006 ( RAM )
    • DriveSerialNumber : 링크 대상이 저장되어 있는 볼륨의 시리얼 넘버를 나타냄
    • VolumeLabelOffset : 링크 대상이 저장된 드라이브의 볼륨명을 포함한 문자열을 나타냄
  • CommonNetworkRelativeLink : 링크 대상의 경로가 포함된다. 경로 정보는 StringData 구조를 통해 얻을 수 있다.

::: String Data

사용자 인터페이스 및 경로 식별 정보를 전달하는 데 사용되는 구조체이다.  다음과 같은 필드들로 구성된다.

  • NAME_STRING : 셸 링크의 목적을 식별하기 위해 최종 사용자에게 표시되는 바로가기에 대한 설명을 지정하는 필드. HaseName 플래그가 설정되어 있어야 함
  • RELATIVE_PATH : 셸 링크를 포함하는 파일에 상대적인 링크 대상 위치를 나타내는 필드. 링크를 복구하는데 이 문자열이 사용된다. HasRelativePath 플래그 설정되어 있어야 함
  • WORKING_DIR : 링크 대상을 활성화시키는데 사용되는 작업 디렉터리의 파일 시스템 경로를 지정하는 필드. HasWorkingDir 플래그가 설정되어 있어야 함
  • COMMAND_LINE_ARGUMENTS : 링크 대상을 활성화할 때의 Command-line 인수를 저장하는 필드. HasArguments 플래그가 설정되어 있어야 함
  • ICON_LOCATION : 아이콘 보기에 있는 셸 링크 항목을 보여줄 때 사용되는 아이콘의 위치를 나타내는 구조. HasIconLocation 플래그가 설정되어 있어야 함

::: Extra Data

링크 대상의 추가적인 정보에 대해서 나타내는 구조체이다. 각 구조체도 마찬가지로 공식문서를 참고하자.

:: LNK 파일이 가지는 포렌식적 의미

바로가기 파일은 특정 응용프로그램을 때 자동으로 생성되는 파일이며, 사용자가 편의를 위해 바로가기를 생성하거나 로컬 및 원격 데이터 파일, 문서를 열었을 때 생성되는 파일이다. 또한, 바탕화면 외에도 최근 문서 폴더, 시작프로그램, 빠른 실행 등 다양한 경로에서 바로가기(.lnk)를 볼 수 있다. 이러한 바로가기 정보들을 통해 파일의 MAC 시간이나 볼륨 정보, 네트워크 공유 정보, 원본 파일 추적이 가능하다.

 

 

 

각 구조에 대해서 더 자세한 사항은 아래 Microsoft Docs를 참고하자.

[MS-SHLLINK]: Shell Link (.LNK) Binary File Format | Microsoft Docs

반응형

'DFIR > DFIR' 카테고리의 다른 글

[Windows Forensics] 이벤트 로그  (0) 2021.11.10
프리패치(Prefetch)란?  (0) 2021.07.04
생성시간 vs 수정시간  (0) 2021.07.03
쓰기 방지(Write block)란 ?  (0) 2021.06.25
Jumplist 란?  (0) 2021.06.25