Windows Artifact[3] - LNK
- Digital Forensic/Windows-Forensic
- 2018. 4. 5. 09:46
(본 포스팅에서는 기본적인 도구 사용법에서는 다루지 않습니다)
이번 포스팅에서는 LNK파일 분석에 대해서 알보겠습니다.
----------------------------------------------------------------------------------------------------------------------------------------
1. LNK 파일
Windows Shortcut Files (MS-ShellLink) 는 윈도우 시스템에서 사용하는 파일에 대한 링크 파일입니다. 특정 실행파일을 간편하게 실행하기 위해 사용자 지정 위치에 링크되며, LNK 확장자를 가집니다.
LNK 파일은 사용자가 직접 생성하는 것 이외에도, Windows OS 설치 시 기본적으로 특정 경로에 바탕화면의 “내 컴퓨터”, “휴지통”부터 “최근 문서” 등과 같은 파일이 생성됩니다. 또한 윈도우 설치시 LNK파일 생성은 기본옵션으로 활성화 되어 있기 때문에 사용자가 파일이나 폳더를 액세스 할 경우 LNK파일이 생성됩니다.
LNK파일은 포렌식 분석관점에서 매우 중요한 아티팩트(증거)가 됩니다. 사용자가 최근 엑세스한 파일이나 접근한 폳더정보를 알 수 있으며, 외부로 유출된 자료조사 시 유용하게 활용할 수 있습니다.
2. LNK파일 저장경로
LNK파일이 저장되는 경로는 다음과 같습니다.
■C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu
-기본 시작메뉴
■C:\Users\<username>\Public
-관리자 라이브러리
■C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu
-사용자 시작메뉴
■C:\Users\<username>\Public
-사용자 라이브러리
■C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Recent
-최근문서
■C:\Users\<username>\Desktop
-사용자별 바탕화면
■C:\Users\<username>\AppData\Roaming\Microsoft\Windows\SendTo
-SendTo 메뉴 링크
■C:\Users\<username>\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch
-사용자 빠른실행
3. LNK파일 구조 분석
LNK 파일에서 파일 타임스탬프, 원본 파일 경로, 실행 옵션 등의 확인이 가능하며, 원본 실행파일에 대한 정보를 다음 5가지 부분의 구조를 가지고 있습니다.
구분 | 설명 | 비고 |
SHELL_LINK_HEADER | 식별 정보, 타임스탬프, 선택 가능한 구조의 존재 유무 표시 플래그 |
|
LINKTARGET_IDLIST | 원본에 대한 정보 |
|
LINKINFO | 원본 위치를 찾을 때 필요한 정보 |
|
STRING_DATA | 사용자 인터페이스나 경로 식별(Path identification) 정보 |
|
EXTRA_DATA | 기타 정보 |
|
[표 1] LNK 포맷
1) SHELL_LINK_HEADER
SHELL_LINK_HEADER는 총 76 바이트이며, 헤더에는 식별 정보, 타임스탬프 등이 포함됩니다. 헤더의 구조는 다음과 같습니다.
[그림 1] SHELL_LINK_HEADER 분석
각 필드에 대한 내용은 아래 [표 2]와 같습니다.
필드명 | 설명 | 비고 |
HeaderSize | 헤더의 크기 | Default : 0x4C |
LinkCLSID | 클래스 식별자 | Default : 00021401-0000-0000-C000-000000000046 |
LinkFlags | 쉘 링크에 대한 정보와 어떤 구조체들이 추가로 포함되는지 알려줌 |
|
FileAttributes | 파일 속성 정보로 원본에 대한 정보를 가짐 |
|
CreationTime | 원본의 생성 시간 | 64비트 윈도우 시간 |
AccessTime | 원본의 접근 시간 | 64비트 윈도우 시간 |
WriteTime | 원본의 수정 시간 | 64비트 윈도우 시간 |
FileSize | 원본의 파일 크기 | 원본 파일 크기 > 0xFFFFFFFF 인 경우 원본 크기가 좌측 32비트 |
IconIndex | 아이콘 인덱스. 주어진 아이콘 위치 안에서의 아이콘 인덱스를 가리킴 |
|
ShowCommand | Shell Link에 의해 실행되는 애플리케이션의 윈도우 상태를 나타냄 0x1 : SW_NORMAL 0x2 : SW_SHOWMINIMIZED 0x3 : SW_SHOWMAXIMIZED |
|
HotKey | 바로가기에 의해 지정된 애플리케이션을 바로 실행하기 위한 키보드 조합 |
|
Reserved1 | 예약 영역 | 0 으로 채워짐 |
Reserved2 | ||
Reserved3 |
[표 2] SHELL_LINK_HEADER 필드 내용
2) LINKTARGET_IDLIST 분석
LINKTARGET_IDLIST는 바로가기의 필수 항목이며, 총 사이즈는 2바이트(IDList의 크기) + 가변(IDList) 입니다. 이 중 IDList는 다시 두 부분으로 나뉘는데, 첫째 부분은 2바이트 고정길이를 갖는 ItemIDSize 이며, 그 뒤로는 가변길이의 Data가 붙게 됩니다. IDList의 Data는 일정한 구조가 없으며 데이터의 맨 끝 위치에 2바이트의 예약영역이 존재합니다. 이 예약영역은 0으로 채워져 있으며, 데이터의 종료를 나타냅니다.
[그림 3] LINKTARGET_IDLIST
필드에 대한 내용은 아래와 같습니다.
필드명 | 설명 | 비고 |
IDListSize | IDList 의 크기 |
|
IDList (variable) | 아이템들의 ID 리스트 |
|
[표 2] LINKTARGET_IDLIST 필드 내용
3) LinkInfo 분석
LinkInfo는 바로가기의 필수 항목이며, 원본 파일이 정해진 위치에 없는 경우 그것을 찾기 위한 필수 정보들을 가지고 있습니다. 그 필수 정보에는 원본이 저장되어 있던 볼륨의 정보 혹은 Mapped 드라이브 문자, 원본까지의 UNC 경로 등이 포함됩니다.
[그림 4] LinkInfo
각 필드에 대한 내용은 아래와 같습니다.
필드명 | 설명 | 비고 |
LinkInfoSize | LinkInfo 구조체의 크기 |
|
LinkInfoHeaderSize | LinkInfo Header 섹션의 크기 |
|
LinkInfoFlag | LinkInfo Flags. 전체 32비트 중 왼쪽 2비트만을 사용하며, 나머지는 0으로 채워짐 |
|
VolumeIDOffset | VolumeID 필드까지의 Offset |
|
LocalBasePathOffset | LocalBasePath 필드까지의 Offset |
|
CommonNetwork- RelativeLinkOffset | CommonNetworkRelativeLink 필드까지의 Offset |
|
CommonPathSuffixOffset | CommonPathSuffix 필드까지의 Offset |
|
LocalBasePathOffsetUnicode (optional) | LocalBasePath 필드까지의 Unicode Offset |
|
CommonPathSuffixOffsetUnicode(optional) | CommonPathSuffix 필드까지의 Unicode Offset |
|
VolumeID (variable) | 바로가기가 생성 될 당시에 원본이 있던 볼륨의 데이터 | 원본이 제 위치에 없는 경우 찾는데 사용 |
LocalBasePath | Link 파일 또는 Link 대상 파일의 기본 경로 CommonPathSuffix 와 결합하여 전체 경로가 됨 |
|
CommonNetworkRelativeLink | Link Target 이 저장 된 네트워크 위치에 대한 정보 |
|
CommonPathSuffix | Link 파일 또는 Link 대상 파일의 파일 경로 LocalBasePath 와 결합하여 전체 경로가 됨 |
|
LocalBasePathUnicode | LocalBasehPath 의 Unicode 타입 | LinkInfoHeader-Size 필드가 0x00000024 보다 클 경우 Enable |
CommonPathSuffixUnicode | CommonPathSuffix 의 Unicode 타입 | |
VolumeIDSize | VolumeID 크기. 이 값은 반드시 0x10보다 커야 함 |
|
DriveType | 드라이브 형태 |
|
DriveSerialNumber | 드라이브의 시리얼 번호 |
|
VolumeLabelOffset | 아스키 또는 유니코드 형식의 VolumeLabel 까지의 Offset |
|
Data | VolumeLabel |
|
[표 3]LinkInfo 필드 내용
드라이브 형태로는 아래와 같습니다.
문자열 | 설명 | 비고 |
DRIVE_UNKNOWN 0x00000000 | 알려지지 않은 타입 |
|
DRIVE_NO_ROOT_DIR 0X00000001 | 루트 경로를 사용할 수 없는 경우 |
|
DRIVE_REMOVABLE 0X00000002 | 이동형 저장장치 플로피 디스크, USB, 플래시 카드 리더 등 |
|
DRIVE_FIXED 0X00000003 | 고정형 저장장치 |
|
DRIVE_REMOTE 0X00000004 | 네트워크 드라이브 |
|
DRIVE_CDROM 0X00000005 | CD-ROM |
|
DRIVE_RAMDISK 0X00000006 | RAM Disk |
|
[표 4]DriveType
3. LNK파일 분석
LNK파일 분석은 LinkParser를 이용하여 분석 할 수 있습니다. [그림 5]는 LinkParser를 실행한 화면이며, [그림 6]은 분석 결과입니다.
[그림 5] LinkParser 도구 실행화면
[그림 6] Link파일 분석 내용
지금까지 LNK파일에 대해서 알아 보았으며, 다음 포스팅에서는 휴지통에 대해서 알아보겠습니다.
'Digital Forensic > Windows-Forensic' 카테고리의 다른 글
Windows Artifact[6] - EventLog[1] (0) | 2018.07.09 |
---|---|
Windows Artifact[5] - Thumbnail/IconCache (0) | 2018.04.12 |
Windows Artifact[2] - MFT,Logfile (0) | 2018.03.30 |
Windows Artifact[1] - $MFT(4) (0) | 2018.03.16 |
Windows Artifact[4] - Recycle (0) | 2018.03.13 |
이 글을 공유하기