본문 바로가기

[+] Forensic

File System - NTFS (9)

이번에는 NTFS 에서 메타데이터 참조 모델에 해당 하는 것들을 알아보자.

메타데이터란, 파일이나 디렉토리를 설명하는 데이터를 포함하는 것이다.

메타데이터 참조 모델을 분석함으로써 파일이나 디렉토리의 상세 정보를 얻을 수 있다.

[$STANDARD_INFORMATION]
해당 속성은 모든 파일과 디렉토리에 존재하는 속성으로, 포함하는 데이터로는 타임스탬프 세트 및 소유권, 보안, 할당 정책이 있다. 해당 속성 타입 ID는 16이며 윈도우 별로 고정된 크기를 갖는다.

 * 참고 : Windows 2000(72byte), Windows NT(48byte)

 해당 속성이 가지고 있는 타임스탬프는 총 4개의 시간 값을 가지고 있는데 그 종류는 아래와 같다.

 - 생성 시간 : 파일이 생성된 시간
 - 수정 시간 : $DATA 또는 $INDEX 속성 내용이 마지막으로 수정된 시간
 - MFT 수정 시간 : 파일 메타데이터가 마지막으로 수정된 시간
 - 접근 시간 : 파일의 내용에 마지막으로 접근한 시간


 * 참고 : NTFS에서의 타임스탬프는 1970년 1월 1일 UTC를 기준으로 현재 시간과의 차이를 100나노로 표현한 64bit 값이다.

또한 이 속성은 읽기 전용, 시스템, 아카이브 등의 일반적인 속성을 위해 플래그 값을 하나 가진다. 이 플래그 값은 읽기 전용등의 속성뿐만 아니라 압축, sparse, 암호화 등의 속성 또한 설명 해 준다. 하지만 이 플래그는 해당 엔트리가 파일을 위한 것인지, 디렉토리를 위한 것인지에 대한 구분은 해주지 않는다.
NTFS 3.0 이상 버전에서는 응용 프로그램 수준의 기능들을 위해 추가 값들을 가지고 있는데, 파일 소유자 신원정보와 사용자가 사용 할 수 있는 데이터량을 나타내는 할당 데이터의 인덱스이다. 


[$FILE_NAME]
모든 파일과 디렉토리는 해당 속성을 필히 가지고 있다. 해당 속성의 타입 ID는 48이고, 크기는 기본적으로 66byte이지만, 파일 이름의 길이에 따라 유동적이다. 해당 속성은 UTF-16 유니코드로 인코딩된 파일이름을 포함한다.
해당 속성은 부모 엔트리의 주소를 포함하며, 이 정보는 MFT 엔트리 전체의 경로를 파악하는데 유용하게 쓰인다. 
또 이 속성은 $STANDARD_INFORMATION 속성처럼 타임스탬프 값을 포함하고 있다. 하지만 윈도우는 $FILE_NAME 속성의 타임스탬프 값을 $STANDARD_INFORMATION 속성 처럼 자주 업데이트는 하지 않고 아래와 같은 경우에만 $FILE_NAME 속성의 타임스탬프 값을 업데이트 한다. 

 - 파일 생성
 - 파일 이동
 - 파일 이름 변경


해당 속성은 $STANDARD_INFORMATION 속성과 같이 읽기 전용, 시스템, 아카이브, 압축, 암호화 등을 구분하기 위한 플래그 값을 포함하고 있다.


[$DATA]
해당 속성은 데이터의 내용을 저장하기 위해 사용되며, 특별히 정의된 값이나 레이아웃을 가지고 있지 않다.
속성 타입 ID는 128 이며, 크기는 내용에 따라 유동적이다. 해당 속성은 각 파일이나 디렉토리의 MFT 엔트리에 기본적으로 할당되기는 하지만, 직접적인 이름은 할당되지 않는다. 이렇게 기본적으로 MFT 엔트리에 할당되는 $DATA 속성은 이름이 존재하지 않아도 되지만, 추가적으로 할당되는 $DATA 속성은 반드시 이름이 있어야 한다.
이러한 추가 $DATA는 어떤 데이터를 숨길 수도 있으며, 디렉토리의 목록을 확인 할 때 보이지 않는다.
대부분의 포렌식 도구들은 ADS(Alternate Data Streams)라고 불리는 추가적인 $DATA 속성들을 보여준다.

 * 참고 : 사용자가 직접 $DATA를 생성 할 수도 있는데 아래와 같이 하면 test라는 이름의 $DATA가 생성된다.
             ex) echo 'Hello World!!!' > file.txt:test


$DATA 속성은 비인가된 접근을 막기 위해 암호화하거나, 공간 절약을 위하여 압축을 할 수 있다. 이러한 선택 사항은 속성 헤더의 플래그를 설정함으로써 사용 할 수 있다. 


[$ATTRIBUTE_LIST]
해당 속성은 파일이나 디렉토리의 모든 속성들을 저장하기 위해 MFT 엔트리가 하나 이상일 때 사용되는 속성이다. 하나의 파일이나 디렉토리에는 65536개의 속성이 올 수가 있지만 MFT 엔트리 하나에 이 속성들을 모두 저장한다는 것은 불가능하다. 그래서 비기준 MFT 엔트리를 생성 한 후 기준 MFT 엔트리에 해당 속성을 할당한다.
해당 속성의 내용은 기준 MFT 엔트리에 저장하지 못한 속성 타입 ID와 저장하지 못한 속성이 포함된 비기준 엔트리의 주소로 이루어져 있다. 


[$Secure 파일]
해당 파일은 $SECURITY_DESCRITOR 속성에서 사용하는 파일로, 보안 식별자를 저장하는 용도로 사용된다.
보안 식별자는 파일이나 디렉토리에 접근제어 정책을 정의 할 때 사용한다.
해당 파일은 MFT 엔트리 열 번째에 해당 하며 NTFS 버전 3.0 이상에서만 사용한다.
NTFS의 모든 파일이나 디렉토리에 할당되는 $STANDARD_INFORMATION 속성에는 SID(Security ID)라는 하나의 식별자를 포함하는데, 이 ID가 $Secure 파일에 인덱스로 사용된다. 

 * 참고 : SID(Security ID)와 윈도우에서 사용자에게 할당하는 SID(Security Identifiers)는 다르다.

해당 파일은 $SDH, $SII 인덱스와 이름이 $SDS인 $DATA 속성을 포함한다. $DATA는 실제 SID(Security ID)를 포함하고, 두 인덱스는 SID를 참조하기 위해 사용된다.
$SII 인덱스는 $STANDARD_INFORMATION 속성에 포함되는 SID(Security ID)로 정렬되는데 $Secure 파일의 SID를 확인 할 때 $Secure 파일의 SID의 위치를 확인하기 위해 사용된다.
$SDH 인덱스는 SID(Security ID)의 해쉬에 의해 정렬된다. 만약 해쉬가 없다면 두 인덱스에 의해 SID가 생성된다.


[할당 알고리즘]
메타데이터의 할당 알고리즘은 3가지 방법이 있다.

[MFT 엔트리와 속성 할당]
윈도우는 MFT 엔트리의 주소를 24부터 할당하는데 그 이유는 MFT 엔트리의 0~15는 예약(메타데이터 파일)되어 있어서 할당을 하지 않고, 16~23까지는 MFT 예약 영역이기 때문에 할당하지 않는다.
MFT 엔트리는 비 할당 상태일 때 할당 상태 플래그 값만 변경이 있을 뿐 다른 데이터의 변경은 없다.
그렇기 때문에 할당 상태였던 MFT 엔트리가 비 할당 상태가 되어도 해당 엔트리의 내용은 모두 복구가 가능하다.
하지만 해당 엔트리가 비 할당 상태에서 다시 할당 상태로 변경되면 기존에 가지고 있던 내용은 모두 지워져 복구가 불가능하다. 이러한 이유로 MFT 엔트리에는 슬랙 데이터가 존재 하지 않는다. 

 

[타임스탬프]
기본적으로 파일에 시간정보는 파일의 속성창에서 확인 할 수 있고 이 시간 값들은 $STANDARD_INFORMATION에 포함되어 있는 값들이다. NTFS에서 시간값이 업데이트 되는 조건은 FAT과 유사한데 그 조건은 아래에서 확인 할 수 있다.

 - 파일을 생성하거나 복사하면 생성시간은 현재 시간으로 업데이트 된다.
 - 마지막 수정시간은 $DATA, $INDEX_ROOT, $INDEX_ALLOCATION 속성 값이 수정 될 때 업데이트 된다.
 - MFT 수정시간은 어떤 속성이 수정되어도 업데이트 되며, 어떠한 파일을 Open 한 것만으로도 업데이트 된다.
 - 마지막 접근시간은 메타데이터 또는 내용을 봤을 때 업데이트 된다.


[분석 시 주의사항]
해당 참조 모델을 분석 할 때에는 $DATA의 숨겨진 데이터를 주의해야 한다. $DATA는 여러개가 있을 수 있어 기본 $DATA외에 추가적으로 할당 된 $DATA는 윈도우상으로 보여지지 않아 히든데이터가 될 수 있다.
비 할당 MFT 엔트리를 찾을 때에는 $FILE_NAME 속성의 원래 이름과, 부모 디렉토리의 MFT 엔트리 주소를 사용하면 전체 MFT 경로를 알 수 있어 비 할당 MFT 엔트리 검색에 효율적이다.
또 NTFS에서의 지워진 파일은 쉽게 복구가 가능하다. 만약 할당 상태에서 비 할당 상태로 변경된 MFT 엔트리가 있는데 해당 엔트리의 $DATA 속성이 거주 속성이라면 클러스터 재 할당 문제를 생각하지 않아도 되지만, 만약 비거주 속성이라면 클러스터 재 할당 문제를 생각해봐야 한다. 
$DATA는 암호화, 압축등이 가능한데, 암호화나 압축이 되어 있는 지워진 파일은 복구가 불가능하다. 이때는 디스크 비 할당 공간에 복호화된 복사본이 있는지 찾아보는 것이 좋다. 

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

File System - NTFS (11)  (0) 2012.02.13
File System - NTFS (10)  (0) 2012.02.13
File System - NTFS (8)  (0) 2012.02.09
File System - NTFS (7)  (0) 2012.02.09