콘텐츠로 이동

디렉터리 인덱스 ($I30)

$I30란

모든 NTFS 디렉터리는 그 안에 있는 파일의 인덱스를 $I30이라는 이름으로 유지합니다. 작은 디렉터리는 이를 $MFT 레코드($INDEX_ROOT)에 보관하고, 큰 디렉터리는 $INDEX_ALLOCATION:$I30 스트림에 INDX 레코드(보통 각각 4,096바이트)도 가집니다. 각 인덱스 항목에는 파일의 $FILE_NAME 사본이 들어 있습니다. 즉, NTFS가 해당 항목을 마지막으로 갱신한 시점의 이름, MFT 참조, 상위 디렉터리, 네 개의 타임스탬프, 두 개의 크기입니다.

파일이 삭제되거나 이름이 변경되어 디렉터리에서 빠지면, NTFS는 해당 항목을 제거하고 그 뒤의 항목들을 이동시킵니다. 이전 바이트는 이후 항목이 덮어쓸 때까지 사용 중인 항목 뒤쪽, 즉 INDX 레코드의 슬랙에 남습니다. 인덱스 슬랙은 $MFT 레코드가 재사용되고 USN 저널 레코드도 순환되어 사라진 파일의 이름, 시간, 크기를 보존하고 있을 수 있습니다.

가장 타당한 결론: 인덱스 슬랙에서 발견된 이름은 어느 시점에 명시된 $FILE_NAME 시간과 크기로 이 디렉터리의 인덱스에 존재했습니다. 슬랙 항목은 그것이 언제 제거되었는지, 또는 삭제, 이름 변경, 재균형에 의한 이동 중 어느 것이었는지를 알려 주지 않습니다.

위치와 수집

C:\<directory>:$I30:$INDEX_ALLOCATION

$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에 해당 섹터를 기록합니다.

조사 전략

  1. 요약에 표시된 슬랙의 사본이 아닌 이름부터 시작한 다음, --slack-only --no-copies로 필터링합니다.
  2. $MFT에서 FileEntry를 조회합니다. FileSequence가 같으면 같은 파일이며, 더 높으면 그 사이에 레코드가 해제되었고 재사용되었을 수 있습니다.
  3. USN 저널에서 이름을 검색하여 언제 삭제되거나 이름이 변경되었는지 확인합니다.
  4. 타임스탬핑을 확인하기 위해 $FILE_NAME 시간을 $MFT의 $STANDARD_INFORMATION 시간과 비교합니다.
  5. 파일이 어떻게 사용되었는지 Prefetch, LNK, Jump Lists 및 이벤트 로그와 상관 분석합니다.

추가 정보