Startup 디스크 포렌식 마지막 목록엔 Challenge가 하나 있어서 풀어볼까 한다.



1. MD5 Hash 값

 - 프로그램을 통해 파일을 계산 후 결과 값



2. 볼륨의 이름은 무엇인가?

 - 2가지 방법

  1) FTK Imager


  2) MFT Entry의 $Volume


3,4. 해당 볼륨에서 활성화 된 폴더와 파일

 3) Incoming 폴더 및 폴더 내 파일





5-12. 파일들의 생성 시간

 - 2가지 방법

  1) FTK Imager에서 Export 하여 파일 시간 확인

          

Incoming 폴더 파일 생성 시간





                   


001q.jpg 와 DOI-40%.jpg 파일 생성 시간



  2) 직접 HxD에서 파일 위치 확인 후 File Name Attributes의 파일 시간 확인



    - VBR에서 MFT Entry 시작 위치로 이동

     * 9F4A = 40778

     * 326224 = 40778(MFT 위치) * 8 (클러스터 크기로 맞추기 위해(4096=512*8)



       * 326294(Root Directory) = 326224 + 70(기본 MFT Entry)


     - 위 계산으로 Incoming 폴더 위치를 확인 할 수 있고 FileName Attributes에서 파일 생성시간 위치 값을 프로그램을 이용하여 계산


    



     - 아래는 001q.jpg 파일의 파일 생성 시간을 확인

     - 파일 위치를 찾는데 파일이름의 hex value로 검색하여 MFT Entry 위치 찾음


    




13-16. 메타데이터 작성자 속성 확인

  - FTK Imager로 파일들을 Export하고 난 후 파일 속성 -> 자세히로 해당 파일의 메타데이터 값을 확인 할 수 있음




17. 001q.jpg 파일과 DOI.jpg은 같은 파일이라 볼 수 있나?


    - 아래는 두 파일을 비교했고 컨텐츠 내용은 거의 동일하다고 볼 수 있으나 아래 MD5 값 비교를 통해 같은 파일이 아님을 확인할 수 있음


     





Startup 디스크 포렌식 이론 #3 - NTFS (구조)


1) NTFS 및 MFT Entry 구조 이해


- NTFS 기본 구조


- 위 구조는 MBR -> VBR -> MFT Entry -> Root Cluster 위치


가. MBR

 - MBR의 위치는 이미지 0번 섹터에서 확인 할 수 있고 파티션의 정보가 있으며 상대적인 위치이기 때문에 계산 시 고려



나. VBR

 - MBR의 정보를 참고하여 위치를 찾을 수 있고 해당 파티션 정보를 헤더에서 확인

VBR 정보(출처: http://kali-km.tistory.com/entry/NTFS-File-System-3)






 - 헤더 정보(붉은 박스 차례대로)

  ☞ 1섹터 당 바이트 -> 0200(16) = 512 Byte

  ☞ 1클러스터 당 섹터 수 -> 08(16) = 8개

      ㄴ 1클러스터 => 4096 = 512(Byte) * 8(개)

  ☞ 해당 파티션의 총 섹터 수-> FE7FF(16) = 1042431 개

  ☞ MFT 시작 위치(섹터) -> A9AA(16) = 43434 개



다. MFT

 - MFT 시작 위치(위 붉게 표시한 정보 참고)

  ☞ 347,600 = 43,434(A9AA(16)) * 8 + 128(현재위치)




    ☞ MFT Entry는 각 번호와 이름이 있음

MFT Entry (출처: http://kali-km.tistory.com/entry/NTFS-File-System-4)



    ☞ MFT는 각 2개의 섹터를 갖기 때문에 크기는 1024(512*2)Byte

    ☞ MFT 구조

MFT Entry 구조


    ☞ MFT Header 48 Byte 이후 Fixup, Attribute, End Mark(0xFFFFFFFF), 사용되지 않은 영역 순으로 구조를 가짐(왼쪽 오른쪽 색으로 영역 구분)

    ☞ MFT Header 데이터 포맷

MFT Header 구조(출처: http://kali-km.tistory.com/entry/NTFS-File-System-4?category=522239)



    ☞ 생성된 파일이 700 byte 이하면 클러스터를 할당받지 않고 해당 MFT Entry(Index Entry) 내 데이터를 저장하고 이를 Resident 속성이라 함

    ☞ 생성된 파일이 700 byte 이상이면 클러스터를 할당 받아 다른 곳에 연속적으로 저장하며 이를 Non-Resident 속성이라 함


MFT Entry 내 데이터 저장 Resident 속성



위 MFT Entry의 실제 파일





    ☞ MFT Entry의 Attribute 속성 관련하여 아래와 같이 확인


라. Data Area

 - 데이터의 크기가 700byte 이상인 경우 이를 저장 장소



다음 이어질 내용

- Non Resident

- MFT Fixup

- MFT Attribute


Startup 디스크 포렌식 이론 #2 - 날짜, 시간 데이터 이해하기



- 포렌식 분석 또는 침해사고 분석 과정에서 타임라인 기반 상황을 나열하는 것이 중요하기 때문에 파일의 날짜, 시간 포맷을 이해하기 위해 글 작성

- 기본적으로 툴들이 알아서 파일의 MAC(Modification, Access, Creation and Change) 시간을 변환시켜 출력해주는데 여기서 우리는 시간 데이터를 변환시키는 방법 등을 확인


- FAT 파일시스템에서 특정 파일을 찾고 이 파일의 윈도우 운영체제에서 Modification(Last Written) Time, Modification(Last Written) Date(윈도우)을 계산


- 아래는 FAT32 파일시스템의 Root Directory 예제와 데이터 포맷이다.

  * 참고로 FAT32의 Root Directory를 찾는 방법은 (http://wrkk.tistory.com/36?category=538805) 참고





- Last Written Time: 마지막으로 파일이 수정된 시간( 5 / 6 / 5 끊음)

ㄴ 95 0D(리틀 엔디안): 2진수로 변환 시 1001010100001101

   ㄴ 1001010100001101 -> 10010 / 101000 / 01101

   ㄴ 10010 -> 18(10진수)

   ㄴ 101000 -> 40(10진수)

   ㄴ 01101 -> 13(10진수) -> 여기서 초는 곱하기 2를 해줘야함

☞ 생성시간은 18시 40분 26초


- Last Written Date: 마지막으로 파일이 수정된 날짜( 7 / 4 / 5 끊음)

ㄴ 48 36(리틀 엔디안): 2진수로 변환 시 0100100000110110

   ㄴ 0100100000110110 -> 0100100 / 0001 / 10110

   ㄴ 0100100 -> 36(10진수) -> 여기서 년도는 1980 더해야함

   ㄴ 0001 -> 1(10진수)

   ㄴ 10110 -> 22(10진수)

☞ 생성날짜는 2016년 1월 22일




- 책과는 다르게 수정시간을 계산해 보았고 해당 파일은 데이터 포맷의 가장 첫 번째 16진수가 E5면 삭제된 파일로 위와 같이 삭제되었음을 확인 할 수 있음

- 해당 원리를 이해하면 스스로 툴을 짜서 만들어 볼 수 있음


Startup 디스크 포렌식 이론 #1 FAT


- FAT 구조를 이해하고 데이터 위치 찾기



- FAT 구조에 따른 위치 찾기

 1) MBR -> VBR 위치 찾기

   ㄴ 00 00 00 80(HEX) = 128(10) 섹터

 

 2) RS(Reserved Sector) 위치로 FAT, Root Directory 찾기

   ㄴ 101A(h) = 4122(10)

    ㄴ 4250 (FAT 위치) = 4122(RS) + 128(VBR 위치)

    ㄴ 8320(Root Dir) = 4250(FAT 가장 앞) + (2035(0x07f3) * 2)(FAT 크기)

      ㄴ 곱하기 2를 한 이유는 FAT와 FAT Mirror 두 개 이기 때문


 3) Root Directory에서 Data 찾기

   ㄴ 해당 예제는 파일명이 긴 예제를 넣었기 때문에 다소 혼동이 될 수 있으나 abcdefg12345678.jpg 파일임

     ㄴ 0x00410080 - 0x0041009F -> 0x00410060 - 0x0041007F -> 0x00410040 - 0x0041005F 순으로 읽으면 됨

   ㄴ 해당 파일 위치 = (((Cluster Hi + Low) - 2) * 8) + 현재 섹터

     ㄴ 8344 섹터 = ((5-2) * 8) + 8320


   ㄴ 추가로 휴지통 위치로 가려면

     ㄴ 8328 = ((3-2) * 8) + 8320







 - 해당 목적은 FAT 구조 이해와 위치 찾기이고 자세한 헤더의 정보들은 많은 블로그에서 확인 필요 

 - 생각보다 복잡하고 데이터 추출 할 수 있는 코딩도 해보는 것이 더 이해가 갈 듯...





Startup 디스크 포렌식 실습


악성코드 감염 PC 복구


사용 툴: FTK Imager, HxD


※ 보안로그 수집기 가장한 악성코드로 로컬PC인 경우 MAC, IP 주소만 전송, VMware라면 MBR을 모두 0으로 변경


- MBR 복구를 위해 할 일

 1) 파티션 Type 확인

 2) BR 위치

 3) 파티션의 섹터 수

 4) 파티션 정보 파악 및 계산



1) 파티션 Type 확인

· NTFS 파일시스템의 시그니쳐(EB 52 90 4E 54 46 53) 검색

☞ FAT라면 해당 BR섹터+6 섹터의 복사본 확인


2) BR 위치

· NTFS의 시그니쳐를 통해 BR의 섹터를 확인할 수 있음



3) 파티션의 섹터 수

· NTFS BR의 백업은 해당 파티션 끝에 위치하며 NTFS 시그니쳐를 다시 검색하여 위치 확인




· 위와 같이 NTFS 파일시스템의 BR을 연속으로 확인할 수 있음

· 중간중간 NTFS 시그니쳐가 검색되지만 연속적인 파일시스템 시그니쳐가 검색되지 않아 PASS~~ 


추가 힌트는 NTFS 파일시스템이 두 개라는 점


4) 파티션 정보 파악 및 계산

· 첫 번째 파일시스템은 NTFS, BR의 시작섹터 2048(옵셋 0x100000), 마지막섹터 206847(옵셋 0x6500000)

· 따라서 아래와 같은 파티션 테이블에 입력될 값들이 완성

· 파티션 시작섹터는 2,048 -> 0x800

· 파티션 섹터 수 204,800(0x32000) = 206,848 - 2,048

  ※ 206,848인 이유는 BR 복사본의 시작 섹터가 206847이기 때문에 +1


파티션 테이블 항목

NTFS

0x07

파티션 시작 섹터

0x800(2,048)

파티션 섹터 수

0x32000(204,800)



추가 반복 필요





· 파티션 시작섹터는 206,848 -> 0x32800

· 파티션 섹터 수 83,677,184(0x4FCD000)83,884,032 - 206,848



파티션 테이블 항목

NTFS

0x07

파티션 시작 섹터

0x32800(206,848)

파티션 섹터 수

0x4FCD000(83,677,184)




5) 결과



6) 결론

 - 파티션 테이블을 완성하는데 CHS 주소는 사용되지 않아 관련된 필드는 모두 0으로 세팅됨

 - 부팅가능 여부, 파티션 타입, MBR과 BR거리, 파티션 섹터 수 핵심적인 정보로 파티션 테이블 값 셋팅

 - 실습을 하면서 계속해서 시그니쳐를 찾는데 번거로움을 느껴 추후 NTFS 시그니쳐 쉽게 찾을 수 있는 스크립트 하나 만들 생각

 - 추가적으로 바로 위 실습파일은 VMware이기 때문에 MBR 섹터가 0이 아니다. VMware 헤더정보로 MBR 위치 확인하여 값 덮어쓰기 진행함을 참고

 - 계속해서 파티션테이블을 잊지 않도록 노력!!



+ Recent posts