본문 바로가기

[+] Forensic

File System - NTFS (10)

이번 글에서는 NTFS에서 파일이름 참조모델에 해당하는 데이터들을 알아 볼 것이다.

파일이름 참조모델은 파일이름과 파일내용을 연결하여 주는 데이터를 포함하고 있는 모델이다.

NTFS에서는 앞에서 언급한 인덱스를 이용하여 디렉토리 내용을 구성한다.

인덱스 엔트리는 노드 값을 포함하며, $INDEX_ROOT, $INDEX_ALLOCATION 속성에 저장된다.

$INDEX_ROOT 속성에 저장된 값은 항상 트리구조에서 루트 노드 값에 해당하며, $INDEX_ALLOCATION 속성에 저장 된 인덱스 엔트리들은 트리구조에서 리프노드에 해당한다. 

또 $BITMAP 속성은 인덱스 레코드들의 할당 상태를 관리하는데 사용된다.  

 * 참고 : 인덱스 레코드는 $INDEX_ALLOCATION속성에서 인덱스 엔트리를 포함하는 집합이다.

지금부터 파일이름 참조모델에 해당하는 데이터들을 하나씩 살펴보도록 하겠다.

[디렉토리 인덱스]
NTFS의 디렉토리들은 기본적으로 헤더, $STANDARD_INFORMATION, $FILE_NAME 속성을 가진 MFT 엔트리를 가지고 있다. 또 디렉토리 인덱스의 엔트리들은 $FILE_NAME과 파일 참조 주소를 포함하고 있다.
$FILE_NAME 속성은 파일이름, 비주류 정보, 크기와 기본 플래그 정보를 포함하는데 윈도우에서는 이 값들 중 비주류 정보와 크기 정보를 업데이트 한다. 이러한 이유로 이 정보들은 정확성을 가지고 있다.
아래는 NTFS에서의 디렉토리 구조이다.

 [그림 1 - NTFS 디렉토리 기본 구조]

위와 같이 NTFS에서의 디렉토리 구조는 b-tree 구조를 가지고 있다. 


 

[루트 디렉토리]
파일시스템 전체경로에서 어떠한 파일을 찾으려고 할 때 가장 먼저 파악해야 할 것이 루트 디렉토리 인데, NTFS에서는 루트 디렉토리가 항상 MFT에서 여섯 번째 엔트리에 위치한다.
해당 엔트리는 기본적으로 $INDEX_ROOT, $INDEX_ALLOCATION, $BITMAP 속성을 갖는다.
모든 메타데이터 파일이 루트 디렉토리에 위치하며, 메타데이터 파일은 숨김 속성으로 인해 사용자에게는 보이지 않는다. 


[파일과 디렉토리의 연결]
NTFS에서는 하드링크를 이용해 파일이 하나 이상의 이름을 가지도록 하는데, 해당 하드 링크 부모 디렉토리 인덱스에 할당 되며 원본과 동일한 MFT 엔트리를 가리킨다. MFT 헤더에는 링크 카운트라는 플래그가 있는데 해당 플래그는 하드 링크가 생성 될 때마다 값이 하나씩 증가한다.
하드링크는 사용자가 파일을 삭제하여도 파일이 디스크 상에 남아 있다면 계속 그 파일을 가리키고 있어 파일 복구 가능 여부를 판단하게 도와준다. MFT 엔트리에는 하드링크를 위한 $FILE_NAME 속성이 존재한다.

 * 참고 : 하드링크는 동일 볼륨 내에서만 생성된다.

NTFS 3.0 이상 버전에서는 재파싱 기능을 지원한다. 재파싱 기능이란 파일, 디렉토리, 볼륨들을 서로 연결하여 주는 기능인데, 이 기능은 디렉토리나 파일로 존재하며, 그 내용으로는 어떠한 것들을 연결하고 있는지에 대한 정보이다.
재파싱 기능에는 여러 종류가 있는데 그 종류는 아래와 같다.

 - 심볼릭 링크 : 파일과 파일 간의 연결
 - Junction : 디렉토리와 디렉토리 간의 연결
 - 마운트 : 디렉토리와 볼륨 간의 연결


재파싱 기능은 파일이나 디렉토리로서 존재한다고 위에서 언급하였는데, 재파싱 기능은 $STANDARD_INFORMATION과 $FILE_NAME, $REPARSE_POINT 속성을 가진다.

 * 참고 : $REPARSE_POINT 속성은 연결 대상 파일이나 디렉토리 위치 정보를 포함하는 속성이다.

NTFS는 재파싱 기능의 경로를 기록으로 남기기도 하는데 이 기록은 \$Extend\$Reparse 파일시스템 메타데이터 파일의 인덱스를 이용한다.
또 루트 디렉토리의 $DATA 속성에 마운트 경로를 기록하도 하는데 이 속성은 $MountMgrRemoteDatabase라는 이름을 가진 $DATA 속성으로 마운트 대상 볼륨 목록을 포함한다.

 * 참고 : 위에서 설명한 $DATA 속성은 마운트 수행 시 생성된다.


[오브젝트 식별자]
NTFS 3.0 이상 버전에서는 지금까지 설명한 디렉토리 이름, 파일 이름, MFT 엔트리 주소를 제외한 다른 주소 지정 방법을 제공한다. 운영체제는 각 파일이나 디렉토리에 128bit 고유한 오브젝트 식별자를 할당하여 파일의 이동이나 이름 변경 시 해당 오브젝트 식별자를 이용하여 파일을 참조한다. 오브젝트 식별자가 할당 되면 해당 MFT 엔트리에는 $OBJECT_ID 속성이 할당되며, 해당 속성에는 원본 도메인과 해당 파일이나 디렉토리가 생성되었던 볼륨 정보를 저장된다.


[분석 시 주의사항]
NTFS에서 사용하는 b-tree 특성 상 파일이나 디렉토리가 생성, 삭제 될 시 노드 값들이 재정렬 되고, 노드 값이 다른 노드로 포함되기도 한다. 이러한 과정에서 비 할당 노드 공간에 있던 데이터가 다른 노드 값을 덮어 씌어져 삭제 될 수도 있다.
또 위 과정으로 인해 비 할당 공간에 삭제된 데이터가 있을 수도 있어 인덱스에 비 할당 공간을 검색하여 찾고자 하는 파일이 있는지 확인해 봐야 한다.
지워진 파일 이름을 찾고자 할때에는 파일 참조 순서 번호를 참조하여 MFT 엔트리가 파일이 지워진 후 재 할당 되었는지를 확인해야 한다. 또 $FILE_NAME 속성은 인덱스에 존재하며, 해당 속성에는 타임스탬프와 여러 플래그가 포함되어 있어 MFT 엔트리가 재 할당 되더라도 파일의 기본 정보는 확인이 가능하다.
어떠한 디렉토리에서 지워진 파일이 존재하는지 알아보고자 할 때에는 아래와 같은 것들을 조사해 봐야 한다.

 - 디렉토리 인덱스 트리 각 노드의 비 할당 영역
 - 비 할당 MFT 엔트리


비 할당 MFT 엔트리를 조사하는 이유는 파일이 지워지면 해당 파일의 MFT 엔트리가 비 할당 상태로 변경되기 때문이다.
비 할당 MFT 엔트리 $FILE_NAME 속성의 부모 디렉토리 MFT 주소를 확인하면 적어도 어떤 디렉토리의 일부분인지 확인이 가능하다.

'[+] Forensic' 카테고리의 다른 글

File System - NTFS (12)  (0) 2012.02.14
File System - NTFS (11)  (0) 2012.02.13
File System - NTFS (10)  (0) 2012.02.13
File System - NTFS (9)  (0) 2012.02.10
File System - NTFS (8)  (0) 2012.02.09