ORIONPOINT 2021. 11. 13. 18:10

NTFS (New Technology File System)

: 윈도우NT부터 사용된 파일 시스템으로 운영체제의 변화에 따라 많은 발전과 다양한 버전 가짐

 

특징

1. USN 저널(Update Sequende Number Journal) or Change Journal

    - 파일 시스템 오류 났을 때 복구하기 위해 지원. 백업 & 롤백

2. ADS(Alternate Data Stream) 

    - 데이터 은닉 목적으로 쓰일 수 있음

3. Sparse 파일

4. 파일 압축

5. EFS(Encrypting File System)

6. VSS(Volume Shadow Copy Service)

    - 파일 수정하고 변환작업 했을 때 복원 할 수 있게 백업해주는 기능

7. Quatas

    - 사용자가 쿼터 지정 가능(서버)

8. 유니코드 지원

9. 동적 배드 클러스터 재할당 

 

구조

VBR : Volume Boot Record, 부트섹터랑 추가적은 부트코드 저장됨. 고정값 아니고 클러스터 크기나 포맷 소프트웨어에 따라 사이즈가 다름.

MFT : 파일과 디렉토리 관리하기 위한 MFT Entry의 집합체. Data 영역과 확실하게 구분되지 않음. 파일 시스템 포맷시 MFT 영역 할당됨. 할당된 영역이 모두 사용되면 동적으로 클러스터 추가해서 크기 증가시킴

   -  FAT32랑 다른점 : FAT32는 예약영역 있고 File Allocation Table 고정된 사이즈로 정해져 있는데 NTFS는 MFT가 고정되어 있지 않음. MFT에 들어가는 기본적인 내용 들어가고 이후 파일 생성하고 작업할 때 MFT 관련된 내용이 들어가는데데 이 영역에 반드시 할당되는 것은 아님. 

DATA : 파일의 실제 내용이 저장됨.  모든 관련정보는 MTF Entry에 의해 관리됨

 

 

클러스터 크기에 따른 VBR 크기

클러스터 크기(Byte) VBR 크기(Sector)
512 1
1K 2
2K 4
4K 8

 - 클러스터 크기가 512byte면 VBR 크기가 1섹터이므로 VBR 자체가 부트 섹터가 됨 

 - 1섹터를 넘는 경우 : 나머지 섹터들은 추가적인 부트 코드 저장용도로 사용되거나 NTLDR(NT Loader)을 빠르게 로드하기 위해 NTLDR의 위치를 저장하기 위한 용도로 사용됨

 

NTFS 부트 섹터 구조

바이트 Offset 설명
10진수 16진수
0 ~ 2 0x0000 - 0x0002 Jump command to boot code
3 ~ 10 0x0003 - 0x000A OEM ID, 윈도우 에서는 'NTFS'라 기록함
11 ~ 83 0x000B - 0x0053 BIOS Parameter Block
84 ~ 509 0x0054 - 0x01FD Boot code and error message
510 ~ 511 0x01FE - 0x01FF Signature, 0x55AA

 

부트 섹터 구조

▶ BIOS Parameter Block

Byte Range 설명
10진수 16진수
0 ~ 2 0x0000 - 0x0002 Jump command to boot code
(usually 0xeb5290)
3 ~ 10 0x0003 - 0x000A OEM ID, 윈도우 에서는 'NTFS'라 기록함
11 ~ 12 0x000B - 0x000C Byte per sector
13 0x000D Sectors per cluster
14 ~ 15 0x000E - 0x000F Reserved
16 ~ 18 0x0010 - 0x0012 Always 0
19 ~ 20 0x0013 - 0x0014 Unused
48 ~ 55 0x0030 - 0x0037 Logical cluster number for the File $MFT ($MFT = MFT 영역 시작위치)
56 ~ 63 0x0038 - 0x003F Logical cluster number for the File $Mftmirr ($Mftmirr = MFT 백업)
510 ~ 511 0x01FE - 0x01FF Signature, 0x55AA

 

MFT Entry 

  • 파일 위치, 시간 정보, 크기, 파일 이름 등의 속성 정보 저장한 구조
  • 파일 시스템의 메타파일 역할을 함
  • MFT Entry 0 ~ 15(고정)는 파일 시스템 생성시 함께 생성되는 예약된 MFT Entry임
  • 사용자가 파일 생성할 때 새로운 MFT Entry가 할당되어 해당 파일의 정보가 유지 관리됨

MFT

  • MFT Entry의 묶음으로 모든 파일의 정보를 나타냄
엔트리 번호 엔트리 이름 설명
0 $MFT MFT 영역에 대한 MFT 엔트리
1 $MFTMirr $MFT 백업본
2 $LogFile 메타데이터(MFT)의 트랙잭션 저널 정보
3 $Volume 볼륨 레이블, 식별자, 버전 등의 정보
4 $AttrDef 속성 식별자, 이름, 크기 등의 정보
5 .(Root Directory) 볼륨의 루트 디렉터리 나타냄
6 $Bitmap 볼륨의 클러스터 할당 정보
7 $Boot 볼륨이 부팅 가능할 경우 부트섹터 정보
8 $BadClus 배드 섹터 가지는 클러스터 정보
9 $Secure 파일 보안, 접근제어와 관련된 정보
10 $Upcase 모든 유니코드 문자의 대문자
11 $Extend $Objid, $Quota, $Reparse Points, $Usnjrnl 등의 추가적 파일 정보 기록 위해 사용됨
12 ~ 15 - 미래를 위해 예약되어 있음
- $Objid 파일의 고유한 Id 정보
- $Quota 사용자별 할당량 정보
- $Reparse Reparse Points 정보
- $UsnJrnl Usn 저널 정보

 

MFT Entry 0번

  • $MFT 파일로 다른 Entry와 다르게 전체 파일 이름을 대문자로 표현함.
  • MFT 자체를 가리키는 것. NTFS 상에 존재하는 모든 MFT Entry 정보를 담고 있음
  • MFT 파일 시스템의 여러 영역에 조각나 존재할 수 있음(DATA 영역 동적할당 때문) >> MFT 전체 정보 유지 관리를 위해 $MFT 정보획득이 선행되어야 함

 

$MFT 파일 획득 방법

VBR 부트섹터              ▶   MFT의 시작 클러스터 : 31

MFT Entry 0 (31 clus)    ▶   $MFT 클러스터 : 31 ~ 33, 77 ~ 79

  1. VBR 부트 섹터 BPB(Bios Parameter Block) 항목에서 MFT 시작위치를 확인. $MFT 파일 정보는 MFT Entry 0번에 저장되어 있으므로 바로 접근 가능
  2. $MFT 파일의 $DATA 속성 정보를 확인해 조각나 있는 MFT Entry 정보를 확인함으로써 전체 MFT 정보 획득 가능함.

 

MFT Entry 구조

End Marker : MFT 끝난 부분 표시

 

바이트 Offset 설명
10진수 16진수
0 ~ 3 0x0000 - 0x0003 Signature('FILE')
4 ~ 5 0x0004 - 0x0005 Offset to fixup array (위치)
6 ~ 7 0x0006 - 0x0007 Number of entries in fixup array
8 ~ 15 0x0008 - 0x000F #LogFile sequence Number(LSN)
16 ~ 17 0x0010 - 0x0011 Sequence Number
18 ~ 19 0x0012 - 0x0013 Link count
20 ~ 21 0x0014 - 0x0015 Offset to first attribute
24 ~ 27 0x0018 - 0x001B Used size of MTF Entry
28 ~ 31 0x001C - 0x001F Allocated size of MTF Entry

- Attributes가 고정된 사이즈가 아니기 때문에 사용된 크기나 할당된 크기를 기재하는 부분이 있음

 

 

MFT Entry는 1,024 바이트의 고정된 크기

  • 42바이트 크기의 고정된 헤더
  • Fixup 배열
    • 해당 섹터의 데이터에 문제가 없느니 검사하기 위해 사용
    • 저장하고자 하는 데이터가 하나 이상의 섹터를 사용할 경우 각 섹터의 마지막 2바이트를 Fixup 배열에 따로 저장

Fixup 적용되기 전

Fixup 적용된 후

- 각 섹터의 마지막 2바이트를 Fixup Array에 옮기고 해당 부분에 Fixup Array 식별자값을 넣음

 

MFT Entry 속성 구조

  • 속성 헤더와 속성 내용으로 구성됨
  • $와 같이 표현되며 NTFS에서 지원하는 속성 나타냄
  • 일반적인 속성 구조

Attr Header - Content 묶음

 

속성 헤더

바이트 Offset 설명
10진수 16진수
0 ~ 3 0x0000 - 0x0003 Attribute type identifier (식별자)
4 ~ 7 0x0004 - 0x0007 Length of attribute
8 0x0008 Non-resident flag (약속된 데이터 안에 자료가 들어가있는지 여부)
9 0x0009 Length of name
10 ~ 11 0x000A - 0x000B Offset to name
12 ~ 13 0x000C - 0x000D Flags
14 ~ 15 0x000E - 0x000F Attribute identifier

 

추가적인 Resident 속성 헤더

바이트 Offset 설명
10진수 16진수
0 ~ 15 0x0000 - 0x000F General header
16 ~ 19 0x0010 - 0x0013 Size of content
20 ~ 21 0x0014 - 0x0015 Offset to content

추가적인 Non-Resident 속성 헤더

바이트 Offset 설명
10진수 16진수
0 ~ 15 0x0000 - 0x000F General header
16 ~ 23 0x0010 - 0x0017 Starting Virtual Cluster Number(VCN) of the runlist (클러스터 시작 정보)
20 ~ 21 0x0014 - 0x0015 Ending VCN of the runlist (끝부분 정보)

 

속성 리스트

속성 번호 속성 이름 설명
16(0x10) $STANDARD_INFORMATION 파일 최근 생성, 접근, 수정시간, 소유자 등 일반적인 정보 
32(0x20) $ATTRIBUTE_LIST 속성들에 대한 리스트
48(0x30) $FILE_NAME 파일 이름(유니코드), 최근 생성, 접근, 수정 시간
64(0x40) $VOLUME_VERSION 볼륨 정보(윈도우 NT 1,2 버전에만 존재)
64(0x40) $OBJECT_ID 파일 및 디렉터리의 16바이트 고유값
80(0x50) $SECURITY_DESCRIPTOR 파일의 접근 제어와 보안 속성 
96(0x60) $VOLUME_NAME 볼륨 이름
112(0x70) $VOLUME_INFORMATION 파일 시스템 버전과 플래그 정보
128(0x80) $DATA 파일 내용 (현재 MFT Entry 안에 데이터가 들어가있는지 여부)
144(0x90) $INDEX_ROOT 인덱스 트리의 루트 노드 정보
160(0xA0) $INDEX_ALLOCATION 인덱스 트리의 루트와 연결된 하위 노드 정보
176(0xB0) $BITMAP $MFT의 비트맵 정보(할당된 클러스터 여부 표시)

 

일반적인 파일 속성

속성 번호 오름차순대로 들어감

일반적인 파일

  • 속성 타입 번호가 낮은 순서대로 저장
  • $STANDARD_INFORMATION(16), $FILE_NAME(48), $DATA(128)
  • 속성 번호 144번인 $INDEX_ROOT, 160번인 $INDEX_ALLOCATION 속성은 파일 빠르게 탐색하기 위한 속성으로 트리 형태로 구성됨

 

Resident 속성

  • MFT Entry 내에 속성 헤더와 속성 내용이 모두 저장되는 경우
  • 700바이트 이하일 경우 $DATA 속성으로 처리 가능

 

Non-Resident 속성

  • 속성 내용이 많아 별도의 클러스터에 해당 속성 저장하고 해당 클러스터 위치 정보만을 저장함
  • $ATTRIBUTE_LIST, $DATA
  • Cluster Runs
    • 여러개의 클러스터에 내용 저장할 경우 클러스터 시작 위치와 개수 

 

파일 삭제 및 복구

  • 파일 삭제되거나 Directory Entry 또는 MFT Entry가 덮어 쓰이지 않은 경우
    • 파일 내용 복구 가능, 삭제된 파일의 메타정보 이용해 시간 순으로 정렬할 수 있음
  • 파일 복구는 사용자가 의도적으로 파기한 파일 찾을 수 있어 매우 유용함

 

파일 시스템 별로 삭제된 파일 판별 방법

 

파일시스템 내용
FAT 파일 시스템 데이터 영역의 루트 디렉토리부터 모든 하위 디렉터리 탐색하면서 오프셋 0x00의 값이 0xE5를 갖는 Directory Entry 찾음
NTFS 시스템 MFT Entry 0번의 $MFT의 $BITMAP 속성에서 0x00값을 갖는 MFT Entry 찾음

 

미할당 클러스터 

  • 메타 정보 통해 접근할 수 없는 클러스터
  • Directory Entry나 MFT Entry 정보도 남아있지 않은 영역
  • 포맷하기 이전(빠른포맷=논리적인 포맷) 데이터 또는 할당되었다가 삭제된 후 메타 정보가 사라진 데이터가 남아있음
  • 매우 오래 전 데이터가 남아있는 경우가 있을 수 있어 포렌식 관점에서 의미 있는 부분

 

미할당 클러스터 판별법

 

파일시스템 내용
FAT 파일 시스템 FAT 영역에서 0x00값 갖는 Directory Entry를 검색해 각 Entry에 대응되는 클러스터 찾기
NTFS 시스템 MFT Entry 6번의 $Bitmap(MFT Entry이름임. 속성 아님) 파일로부터 할당되지 않은 클러스터 찾기

 

시간 정보 분석

 

시간 정보 

  • 효율적 분석 위해 사건이 발생한 특정 시점의 데이터 대상으로 하거나 시간 흐름대로 데이터 분석하기도 함

파일 시스템 별로 시간 정보 위치

파일시스템 내용
FAT 파일 시스템 Directory Entry 정보 확인하면 파일 생성시간, 파일 생성 날짜, 마지막으로 파일 내용에 접근한 날짜, 마지막으로 파일 내용 수정한 날짜 확인 가능함
NTFS 시스템 파일의 MFT Entry에서 $STANDARD_INFORMATION, $FILE_NAME 속성 확인하면 파일 생성 일시, 마지막으로 파일 내용에 접근한 날짜, MFT 내용이 마지막으로 수정된 날짜, 마지막으로 파일 내용 수정한 날짜 확인 가능함

 

미사용 영역 분석 의미

  • 미사용 영역 분석해 특정 데이터가 삽입된 흔적 있는지 파악
파일시스템 내용
FAT 파일 시스템
  • MBR과 예약 영역 사이 미사용 영역
  • 예약 영역에서 사용하지 않는 섹터(0, 1, 2, 6, 7, 8번 섹터 제외)
  • FSINFO 구조체 섹터에서 사용되지 않는 영역
NTFS 시스템
  • MBR과 예약 영역 사이의 미사용 영역
  • VBR에서 부트 섹터 제외한 나머지 섹터
  • 미래를 위해 예약해 둔 MFT Entry 12 ~ 15번 영역

 

은닉 파일 확인

 

파일시스템 내용
FAT 파일 시스템 파일의 Directory Entry 항목 중 오프셋 11개의 Attribute가 0x02값 가짐
NTFS 시스템 파일의 MFT Entry에서 $STANDARD_INFORMATION 속성이 오프셋 32 ~ 35의 Flags가 0x0002임

 

NTFS에서 암호화 속성 확인하는 방법

  • 파일의 MFT Entry에서 $STANDARD_INFORMATION 속성의 오프셋 32 ~ 35의 Flags가 0x4000임

 

파일 삭제 복구

  • $MFT 파일의 BITMAP 속성에서 해당 MFT Entry 비트가 0으로 설정됨
  • $Bitmap 파일의 $DATA 속성에서 해당 파일에 할당되었던 클러스터 비트가 0으로 설정됨
  • Resident 속성일 경우 MFT Entry 상에 저장되므로 완벽 복구 가능
  • Non-Resident 속성일 경우 Cluster Runs 정보를 통해 완벽 복구 가능