디렉터리 인덱스 ($I30)¶
$I30란¶
모든 NTFS 디렉터리는 그 안에 있는 파일의 인덱스를 $I30이라는 이름으로 유지합니다. 작은 디렉터리는 이를
$MFT 레코드($INDEX_ROOT)에 보관하고, 큰 디렉터리는 $INDEX_ALLOCATION:$I30 스트림에 INDX 레코드(보통
각각 4,096바이트)도 가집니다. 각 인덱스 항목에는 파일의 $FILE_NAME 사본이 들어 있습니다. 즉, NTFS가 해당
항목을 마지막으로 갱신한 시점의 이름, MFT 참조, 상위 디렉터리, 네 개의 타임스탬프, 두 개의 크기입니다.
파일이 삭제되거나 이름이 변경되어 디렉터리에서 빠지면, NTFS는 해당 항목을 제거하고 그 뒤의 항목들을
이동시킵니다. 이전 바이트는 이후 항목이 덮어쓸 때까지 사용 중인 항목 뒤쪽, 즉 INDX 레코드의 슬랙에
남습니다. 인덱스 슬랙은 $MFT 레코드가 재사용되고 USN 저널 레코드도 순환되어 사라진 파일의 이름, 시간,
크기를 보존하고 있을 수 있습니다.
가장 타당한 결론: 인덱스 슬랙에서 발견된 이름은 어느 시점에 명시된
$FILE_NAME 시간과 크기로 이 디렉터리의 인덱스에 존재했습니다. 슬랙 항목은 그것이 언제 제거되었는지, 또는
삭제, 이름 변경, 재균형에 의한 이동 중 어느 것이었는지를 알려 주지 않습니다.
위치와 수집¶
$I30은 NTFS 메타데이터입니다. 디렉터리의 $I30 스트림을 내보낼 수 있는 원시(raw) 접근 지원 포렌식 도구로
수집하십시오(내보낸 파일의 이름은 흔히 $I30입니다). Juntei는 디스크 이미지나 비할당 영역에서 INDX 레코드를
검색할 수도 있습니다. 슬랙 항목이 무엇이었는지 알 수 있도록 같은 볼륨의 $MFT와 $J도 함께 수집하십시오.
분석 시 주의 사항¶
- 인덱스 슬랙은 불완전하고 순서가 없습니다. 디렉터리가 변경되면서 항목이 덮어쓰이므로, 이름이 없다는 것은 아무것도 증명하지 않습니다.
- 많은 슬랙 항목은 항목이 이동할 때 남겨진, 아직 사용 중인 항목의 사본입니다.
CopyOfEntryInUse가 이를 표시합니다. 같은 삭제된 이름이 슬랙에 여러 번 나타날 수도 있습니다. - 인덱스 항목의 시간은 해당 항목이 마지막으로 갱신된 시점의
$FILE_NAME시간입니다. 이는 파일$MFT레코드의$STANDARD_INFORMATION시간 및$FILE_NAME시간과 모두 다를 수 있습니다. AllocatedSize와RealSize역시 항목의 마지막 갱신 시점 값이므로 오래된 값일 수 있습니다.- 슬랙 항목의
FileEntry(또는ParentEntry)는 이후 바이트가 덮어쓴 경우 없을 수 있습니다. 값이 있더라도 가리키는 MFT 레코드가 그 사이에 재사용되었을 수 있으므로 시퀀스 번호를 비교하십시오. parse-ntfs i30은 INDX 레코드를 읽습니다. 작은 디렉터리의 인덱스는$MFT레코드($INDEX_ROOT)에만 있으며, 그 파일들은$MFT에 있습니다.
Juntei로 파싱하기¶
Usage: juntei parse-ntfs i30 <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find $I30 files (with $I30 in their name, or starting with an INDX record)
-f, --file <FILE> Parse one $I30 stream, or any file holding INDX records (a disk image, unallocated space)
Filtering:
--slack-only Only the entries found in slack
--no-copies Leave out the slack entries that copy an entry in use
Output:
-o, --output <FILE> Save every entry
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-ntfs i30 -f 'Users_$I30'
juntei parse-ntfs i30 -d evidence/ -o i30.csv
juntei parse-ntfs i30 -f 'Users_$I30' --slack-only --no-copies -t jsonl
juntei parse-ntfs i30 -f disk.raw -o carved-i30.csv
요약에는 INDX 레코드(그리고 그중 부분적으로 기록된 레코드의 수), 사용 중인 항목과 슬랙의 항목, 그리고 사용 중인 항목의 정확한 사본이 아닌 슬랙 항목의 이름이 표시됩니다. 이 이름들은 삭제되거나 이름이 변경된 파일의 후보일 뿐, 그 자체로 결론은 아닙니다.
CSV 출력 필드¶
| 필드 | 해석 |
|---|---|
SourcePath |
입력 파일. 호스트와 디렉터리를 구별합니다. |
RecordOffset, EntryOffset |
입력 내 INDX 레코드와 항목의 바이트 오프셋. 검증 및 디스크 이미지에서 발견된 레코드에 필수적입니다. |
RecordVCN, RecordLSN |
인덱스 스트림 내 레코드의 위치와 $LogFile 시퀀스 번호. |
FromSlack |
사용 중인 항목 뒤에서 발견된 항목이면 True. |
CopyOfEntryInUse |
같은 디렉터리 인덱스의 사용 중인 항목과 이름, 네임스페이스, 파일(알려진 경우), 상위 디렉터리, 시간이 같은 슬랙 항목. 대개 삭제된 파일이 아니라 항목 이동 시 남은 잔재입니다. |
Filename |
디렉터리 내 이름. |
Namespace |
win32, dos (8.3 짧은 이름), win32_and_dos 또는 posix. |
FileEntry, FileSequence |
파일의 MFT 참조. 헤더가 덮어쓰인 슬랙 항목에서는 비어 있습니다. |
ParentEntry, ParentSequence |
디렉터리의 MFT 참조. 다른 바이트가 덮어쓴 경우 비어 있습니다. |
CreatedUTC, ModifiedUTC, MFT-ModifiedUTC, AccessedUTC |
항목의 마지막 갱신 시점의 $FILE_NAME 시간(100 ns 단위). |
AllocatedSize, RealSize |
NTFS가 항목에 복사한 크기. 위의 주의 사항을 참조하십시오. |
FileAttributes |
|로 연결된 속성 이름 (hidden|archive). 하위 디렉터리는 is_directory. 이 Juntei 버전이 이름을 붙이지 않는 비트는 16진수로 보존됩니다 (0x00800000). |
ReparseValue |
$FILE_NAME의 재분석 태그 또는 확장 속성 크기. |
Problems |
부분적으로 기록된 섹터 등 레코드의 손상. 손상된 레코드의 항목도 주의하여 검토할 가치가 있습니다. |
JSON/JSONL에는 동일한 필드가 snake_case로 들어 있으며, problems는 목록이고 알 수 없는 값은 null입니다.
슬랙 항목을 찾는 방법¶
슬랙은 항목이 시작되는 모든 8바이트 경계에서 스캔되며, 완전한 항목, 항목 헤더가 덮어쓰인 $FILE_NAME 속성,
그리고 슬랙의 시작 부분에서는 사용 중인 항목의 끝부분이 상위 참조를 덮어쓴 $FILE_NAME을 찾습니다. 후보는
Windows가 기록하는 형태와 같아야 합니다. 즉, 제어 문자나 경로 구분자가 없는 유효한 UTF-16 이름, 1980년과
2100년 사이의 네 개의 시간, 알려진 네임스페이스, 알려진 속성 플래그를 가져야 합니다. 32비트를 넘는 상위
참조는 덮어쓰인 바이트이므로 비워 둡니다.
각 레코드의 업데이트 시퀀스 배열이 적용됩니다. 업데이트 시퀀스 값으로 끝나지 않는 섹터는 부분적으로 기록된
것입니다. Juntei는 해당 레코드를 있는 그대로 읽고 Problems에 해당 섹터를 기록합니다.
조사 전략¶
- 요약에 표시된 슬랙의 사본이 아닌 이름부터 시작한 다음,
--slack-only --no-copies로 필터링합니다. $MFT에서FileEntry를 조회합니다.FileSequence가 같으면 같은 파일이며, 더 높으면 그 사이에 레코드가 해제되었고 재사용되었을 수 있습니다.- USN 저널에서 이름을 검색하여 언제 삭제되거나 이름이 변경되었는지 확인합니다.
- 타임스탬핑을 확인하기 위해
$FILE_NAME시간을$MFT의$STANDARD_INFORMATION시간과 비교합니다. - 파일이 어떻게 사용되었는지 Prefetch, LNK, Jump Lists 및 이벤트 로그와 상관 분석합니다.
추가 정보¶
- Microsoft: Master File Table
- libfsntfs: NTFS 형식 문서
- dfir_ntfs
- INDXRipper
- ys-ntfs-parser (해당
mft크레이트의i30모듈)