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
- VBR 부트 섹터 BPB(Bios Parameter Block) 항목에서 MFT 시작위치를 확인. $MFT 파일 정보는 MFT Entry 0번에 저장되어 있으므로 바로 접근 가능
- $MFT 파일의 $DATA 속성 정보를 확인해 조각나 있는 MFT Entry 정보를 확인함으로써 전체 MFT 정보 획득 가능함.
MFT Entry 구조
바이트 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에서 지원하는 속성 나타냄
- 일반적인 속성 구조
속성 헤더
바이트 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 파일 시스템 |
|
NTFS 시스템 |
|
은닉 파일 확인
파일시스템 | 내용 |
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 정보를 통해 완벽 복구 가능
'Digital Forensics' 카테고리의 다른 글
FAT32 (0) | 2021.12.11 |
---|