Chapter 12. NTFS 분석 - 파일시스템 범주
-> 이 장에서는 5가지 분류모델을 이용한 NTFS 분석기술과 고려사항을 논의하도록 하겠다. 13장에서는 "NTFS 데이터 구조체"를 다룬다. NTFS는 모든것이 한개의 파일이기 때문에 무척 어렵다. 그래서 메타데이터 범주의 속성을 알아야 파일시스템 범주의 파일시스템 메타데이터를 볼 수 있다.
12.1 파일시스템 범주
- 파일시스템 범주는 파일시스템의 전반적인 설명데이터를 포함한다. 이 데이터는 특정 사용자의 파일이 아니다. NTFS에서는 이러한 데이터를 파일시스템 메타 데이터 파일에서 저장하고, 루트 디렉토리에 이 파일 이름들이 있다. 이러한 데이터들은 파일 시스템 어디든 위치할 수 있다. 다만 부트코드는 예외이다.
- 이런 파일들의 흥미로운 한 가지 특징은 일반 파일들과 비슷하게 날짜와 시간 스탬프들을 가지고 있다는 것이다. 날짜와 시간 스탬프들은 파일시스템이 생성될 때 시간을 설정하기 때문에 분석에 유용하게 사용될 수 있다. 이 절에서는 각 파일 시스템 메타데이터 파일들을 상세히 분석한다.
▶ $MFT 파일 개요
- $MFT 파일은 가장 중요한 파일시스템 메타데이터 파일 중 하나이다. 그 파일은 모든 파일과 디렉토리 엔트리를 갖는 MFT(Master File Table)를 포함한다. 그래서 일반 파일들을 찾기 위해서는 이 $MFT 파일이 필요하다.
- MFT의 첫 엔트리는 $MFT를 위한 것이고, 그것의 $DATA 속성은 MFT에 의해 사용되는 클러스터들을 포함한다. $MFT에는 MFT엔트리들의 할당 상태를 관리하는 $BITMAP 속성이 있다. 또한 $MFT 파일은 표준 $FILE_NAME과 $STANDARD_INFOMATION 속성을 갖는다. 윈도우에서 $MFT 파일은 되도록 작게 시작하고 파일이나 디렉토리들이 늘어나면서 더욱 커진다. 그래서 일부 공간은 확장을 위해 예약이 되고 이러한 내용은 '내용범주'의 '파일시스템레이아웃
에서 설명하겠다.
- TSK istat 도구를 이용해서 파일시스템 메타데이터 파일의 세부내용을 살펴보자
-> $MFT에서 임시 데이터는 보통 파일시스템을 생성한 날짜이고, 그 날짜는 업데이트되지 않는다. 위 예에서 $STANDARD_INFOMATION, $FILE_NAME, $DATA, $BITMAP이 있는 것을 볼 수 있다.
▶ $MFTMirr 파일 개요
- 앞에서 $MFT 파일은 모든 파일, 디렉토리를 찾는데 중요하다고 했다. 부트섹터나 $MFT엔트리들이 손상이되면 파일을 찾는데 문제가 생긴다. 따라서 중요한 MFT엔트리들은 백업본이 존재한다. MFT엔트리 1은 $MFTMirr 파일을 위한 것이고 그 파일은 첫번째 MFT엔트리의 복사본을 포함하는 비거주 속성을 갖는다.
- $MFTMirr의 $DATA 속성은 파일시스템 중간에 있는 클러스터들을 할당하고 적어도 4개 MFT엔트리 <$MFT, $LOGFILE, $MFTMirr, $VOlUME> 복사본을 저장한다.
만약 MFT레이아웃을 결정하는데 문제가 발생하면 복구도구는 볼륨크기를 이용해서 파일시스템의 중간 섹터가 어디에 위치하는지 계산한다. 각 MFT엔트리들은 MFT엔트리를 검증하기 위해 사용할 수 있는 시그니처 값을 갖는다.
※ 예제 이미지에서 $MFTMirr 파일의 세부내용은 다음과 같다
▶ $Boot 파일 개요
- $Boot 파일시스템 메타데이터 파일은 MFT엔트리에서 7번째에 위치하고 파일시스템의 부트섹터를 포함한다. 이것은 고정된 위치를 갖는 파일시스템 메타데이터 파일이다. 그것의 $DATA속성은 부팅시 필요하기 때문에 항상 파일 시스템의 첫 섹터에 위치한다.
- NTFS 부트섹터는 FAT의 많은 필드들과 거의 유사하다. 심지어 잃어버린 부트섹터를 찾을 때 사용하는 시그니처조차 0xAA55로 FAT와 같다. 부트섹터는 각 클러스터 크기, 파일 시스템의 섹터수, MFT시작 클러스터 주소, 각 MFT엔트리 크기의 기본 크기정보를 제공하고, 파일시스템을 위한 일련번호를 제공한다.
- $Boot 파일의 $DATA속성에 할당된 섹터들의 나머지는 부트코드를 위해 사용된다. 여기서 부트코드는 단지 부팅을 위해 필요하고 운영체제가 적재된 위치를 알려준다.
- 부트섹터 백업본은 볼륨 마지막이나 중간에 있는데 대부분 마지막섹터에 있다. 보통은 볼륨크기가 파일시스템보다 크기 때문에 슬랙공간에 부트섹터 백업본을 저장한다.
※ $Boot 파일의 속성 세부사항들을 보기 위해 예제 이미지에서 istat을 이용한 결과는 아래와 같다.
-> 마지막 줄은 8KB이며 클러스터 0-7에 할당된 $DATA속성을 포함한 4개의 속성이 있다는 것을 보여준다.
▶ $Volume 파일 개요
- $Volume 파일시스템 메타데이터 파일은 MFT 3번째 엔트리에 위치하고, 볼륨레이블과 다른 버전 정보를 포함하며 다른 파일에는 없는 2개의 고유 속성을 갖는다. $VOLUME_NAME 속성은 볼륨의 유니코드 이름을 포함하고 $VOLUME_INFORMATION 속성은 NTFS 버전과 오류상태를 포함한다. 이 두개의 속성은 13장에서 확인하자. NTFS의 버전은 계속 변경되어오고 있는데 이는 이 파일에서 확인이 가능하다.
※ 예제 이미지에서 $VOLUME 파일의 속성 세부사항들은 다음과 같다.
-> $VOLUME_NAME과 $VOLUME_INFORMATION은 흥미로운 데이터를 포함한다. 그리고 $DATA 속성은 존재하지만 크기가 0인것에 유의하자.
▶ $AttrDef 파일 개요
-> $AttrDef 파일시스템 메타데이터 파일은 MFT엔트리 4에 존재한다. 이 파일의 $DATA속성은 각 속성 타입을 위해 이름과 타입 식별자를 정의한다. NTFS에는 몇가지 순환 논리가 있고 이는 그 중 하나이다.
- $DATA 속성을 읽기 위해서 그 속성에 있는 기본 값들을 이용하자.
- 이 파일은 각 파일시스템들이 고유한 속성을 갖도록하고 각 파일시스템이 표준 속성들을 위해 식별자를 재정의 할 수 있도록한다. 예제 이미지에서 $AttrDef 파일의 세부사항은 다음과 같다.
▶ 예제 이미지
- 지금까지 예제이미지에서 파일 세부사항 중 일부만 보여주었고 이제 fsstat 실행 결과를 보여주겠다.
▶ 분석기술
- 파일시스템의 설정과 레이아웃을 판단하기 위해서 파일시스템 범주를 분석한다. NTFS 파일시스템에서 첫 단계는 파일시스템의 첫 섹터에 존재하는 부트섹터를 처리하는 것인데 이 부트섹터는 $Boot 파일의 일부분이다. 그 부트섹터는 MFT 시작위치와 각 MFT 엔트리 크기를 식별할 수 있도록 한다.
- 이런정보를 이용하여 $MFT 파일에 있는 첫 MFT 엔트리를 처리할 수 있다. 이 엔트리는 나머지 MFT가 어디에 위치하는지 알려준다. 어떤 데이터가 손상되었고, 볼륨의 크기를 알고있다면 $MFTMirr에 저장되어있는 첫 MFT 엔트리 복사본을 찾기 위해 파일시스템의 중간 섹터를 계산할 수 있다. (아까도 나온건데 중간섹터에 복사본이있나보다)
- MFT 레이아웃을 결정한 후 $Volume과 $AttrDef 파일시스템 메타데이터 파일들의 위치를 찾고 해석한다. 여기서 파일시스템의 버전, 볼륨레이블, 속성, 정의들을 확인할 수 있다.
▶ 분석 고려사항
- 파일시스템 범주에는 사용자들이 이용하는 데이터는 많지 않다. 부트섹터를 이용해 기본적인 레이아웃을 확인할 수 있다. 헥사편집기로 직접확인하기에는 어렵다. 부트섹터에는 일부는 반드시 0이여야 한다. -> 0이아니면 마운트 안되게끔 설치가 되어있는 부분이 존재
- 부트섹터에 데이터를 숨길 수 있는 공간들이 있고, $Boot 파일끝에 더 많은 공간이 있다. 볼륨과 파일 시스템의 슬랙공간을 조사하고, 파일시스템 다음 영역에 비사용 공간이 있는지 확인한다.
- 파일시스템 메타데이터 파일들과 관련이 있는 한시적 데이터는 파일시스템 생성 시간 값들이 해당하며, 이것은 디스크 포맷 시간을 확인하는데 도움이 된다.
- $MFT파일은 어떠한 크기로던지 가능하고 줄어들지는 않는다. 누군가 많은 파일을 생성해서 MFT크기를 늘렸다고 가정하자. 이때 파일들이 삭제되면 데이터를 숨길 수 있는 많은 비사용 엔트리들이 생긴다. 또한 그것은 각 파일시스템의 메타데이터 파일속성을 식별하는데 유용할 수 있다. 누군가는 데이터를 숨기기 위해 파일들에 추가 속성을 할당할 수도 있다.
▶ 분석 시나리오
- 디스크를 수집하는 과정에서 첫 섹터 (파티션 테이블 위치)와 섹터 63(첫번째 파티션 시작위치)에 불량이 있을 수 있다. 그래서 파티션이 섹터 63에서 시작하는지 판단하고 이후 타입과 크기를 결정하자. 여기서 사용할 디스크는 NTFS파일 시스템을 사용하고 0번째에 불량섹터가 존재한다.
- 먼저 검색할 것은 부트섹터의 시그니처 값, 0xAA55를 섹터의 마지막 2바이트에서 찾는 것이다. 이후 NTFS의 첫 섹터나 백업본이 위치한 파일시스템의 다음 섹터를 찾을 수 있다.
※ 검색을 위해 Sigfind 도구를 사용했다. (16진수 검색가능한 어떠한 도구도 사용이 가능하다)
-> 위 결과는 210,809섹터를 시작으로 일치한 값들이 밀접하게 있는 것을 알 수 있다. 부트코드는 복사본이 아닌 부트섹터 뒤에 나오므로 이것들은 파일시스템의 시작에서 볼 수 있는 부트섹터가 아니다.
※ 복사본 중 한개를 보자
-> 이는 FAT12 파일시스템의 부트섹터와 동일해보인다.
※ 다음을 보면 FAT32파일시스템의 부트섹터와 동일하다 (사진은 생략)
- 오탐을 줄이기 위해서 섹터의 바이트 3에서 시작하고, OEM 항목 중 하나인 'NTFS'를 검색해보자. 이는 NTFS 부트섹터의 필수 데이터는 아니기 때문에 없을 수 있다. 'NTFS'는 헥사값으로 0x4e544653이고 일부 도구는 2개의 시그니처를 갖는 섹터들을 찾아준다.
명령어는 다음과 같다
#Sigfind -o 3 4e54463 disk5.dd
p.s 이번에는 그릴게 없었다....그래서 더 재미가 없..