LNK file

개요

LNK 파일은 링크파일이라고 한다. 쉽게 이해하자면 바로가기라고 볼 수 있다. 어떤 프로그램의 링크 파일을 누르게 된다면 원본 파일에 “링크”되어 그 프로그램을 실행할 수 있는 편의기능이다. 그렇다면 의문이 들 수 있다. 바로가기 파일은 프로그램을 설치하거나 사용자가 편리하게 사용하기 위해 임의로 생성하는 것인데, 어떻게 포렌식 분석에 사용한다는 것인가? 눈치가 빠르다면 알았겠지만, 사용자만이 LNK 파일을 생성하는 것이 아니기 때문이다. 어떤 기능이 아티팩트로써 의미를 가진다는 것은 사용자의 행위를 시스템이 기록하여 해당 사용자의 행위를 추적할 수 있기 때문이라고 생각한다.
오늘은 아티팩트로써 LNK 파일을 어떻게 활용할 수 있는지, 그 구조는 어떻게 이루어져 있는지 알아볼 것이다.

파일 경로

사용자가 생성한 LNK 파일은 시스템 내 어디에나 존재할 수 있다. 따라서 LNK 파일은 어디에나 있을 수 있지만 시스템이 생성하는 LNK 파일의 경우 특정 경로에 생성되기 때문에 이를 알아둘 필요가 있다. 주로 생성되는 것은 최근 사용한 파일을 원본 프로그램과 링크하여 특정 경로에 생성하는 파일이다.
[Windows 7 and After] - C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Recent - C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Office\Recent\ [Windows XP] - C:\Documents and Settings\<username>\Recent
Bash
복사
운영체제 유형에 따라 그 경로가 다르기 때문에 항상 아티팩트를 확인하기 전에 호스트 운영체제가 뭔지 파악할 필요가 있다.

구조

LNK 파일은 구조가 매우 복잡한 편이라고 생각한다. 플래그 설정 값에 따라 어떤 구조체를 사용하는지가 달라지기 때문이다. 기본적으로 ShellLinkHeader가 존재하고, 데이터 플래그 값에 따라 HasLinkTargetIDList 가 설정되어 있다면 LinkTargetIDList가, HasLinkInfo 플래그가 활성화되어 있다면 LinkInfo 구조체에 정보가 저장되는 식으로 사용한다.
일반적으로 LNK 파일을 분석할 때 가장 흔하게 접해볼 수 있는 것은 LinkInfo 구조체이다. 따라서 ShellLinkHeader와 LinkInfo에 대해서 어떤 정보를 담고 있는지 알아보고 간단하게 실습을 진행해 보도록 하자.

ShellLinkHeader

Offset
Size
0x00
4
헤더 크기 (항상 : 0x0000004C)
0x04
16
LNK GUID: {00021401-0000-0000-c000-000000000046}
데이터 플래그
파일 속성 플래그
실행후 윈도우 창 동작
핫키 (단축키)

LinkInfo

Offset
Size
Description
0
4
LinkInfo 크기
4
4
헤더 크기
if header size ≥ 0x1C
Offset
Size
Value
Description
로컬 경로 오프셋 (Unicode)
…​
…​
Volume Information
…​
…​
로컬 경로 문자열 (ASCII) (Local Information)
…​
…​
공공 경로 (ASCII) ASCII string terminated by an end-of-string character (Network Share)
if header size ≥ 0x20
Offset
Size
Value
Description
…​
…​
공공 경로 오프셋 (Unicode)
…​
Volume Information
…​
…​
로컬 경로 문자열 (ASCII)
…​
…​
공공 경로 (UTF-16 LE)
위치 정보 플래그

데이터

어떤 데이터를 담고 있는지는 구조를 자세히 보았다면 알 수 있을 것이다. 하지만 표만 봐도 좀 복잡하고 정보가 많기 때문에 주요한 정보만 자세히 알아보도록 하자.

시간 값

어떤 파일이 언제 어떻게 사용되었는지 확인하는 것이 LNK 파일 아티팩트의 본질이다. 즉 LNK파일이 언제 생성되었고, 언제 수정되었는지를 통해서 1차적으로 정보를 얻어갈 수 있고, LNK 파일에 링크된 파일 (원본 파일)의 시간 정보를 통해서도 파일의 실행 여부를 확인해볼 수 있다.

절대 경로 & 디바이스 정보

실행된 파일의 이름과 절대 경로를 파악할 수 있다. 다만 주의사항에 적혀있는 것처럼 인코딩에 유의하여 분석해야 한다. 또한 실행된 디바이스에 대한 Volume Information을 얻어갈 수 있기 때문에 로컬 장치인지, 외부 장치인지 식별해낼 수 있다.
주의사항 데이터를 봤을 때 인코딩이 다들 제각각이었던 것을 확인할 수 있다. 헤더 크기에 따라 Unicode(UTF-8), ASCII, Unicode(UTF-16LE) 등 하나의 파일 안에서 다양한 인코딩을 이용해 데이터를 처리하게 된다. 이런 이유 때문에 도구를 사용하는 경우 인코딩이 깨진 상태로 결과가 출력되는 일이 잦을 것이므로, 도구를 탓하지 말고 인코딩을 변경해보자.

분석 도구

010-editor ( LNK format )
LNK parser ( download )

결론

LNK 파일은 많이 쓰이긴 하면서도… 어떻게 보면 그렇게 많이 참조하지는 않을 수도 있다. 때로는 등잔 밑이 어두울 수도 있기 때문에 해결해야하는 문제의 유형에 따라 알맞게 사용할 수 있다면 그것만으로 충분할 것이다. 간단한 구조에 대해서도 알아보았고, 작은 파일 크기에 비해 들어있는 정보가 생각보다 많다는 것을 느꼈을 것이다.
너무 분석 도구에만 의존하지 말고, 구조에 맞게 직접 도구를 간단하게 만들어 보는 것도 좋은 연습이라고 생각한다 :)