ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Digital Forensic Challenge 2019 MOI200 문제 풀이
    $ 포렌식 $/$ 포렌식 문제 풀이 $ 2020. 1. 17. 19:55

     

    문제를 확인해 보면 위와 같이 160점, 20점, 20점으로 배점이 나누어져 있습니다.

    또한 압축 파일을 확인해 보면 NAND_Dump.bin 이라는 파일이 존재 합니다.

     

    이름이 NAND Dump 인것으로 보아 NAND Flash의 덤프 파일이지 않을까 생각을 해봅니다.

     

    Description을 확인해 보면 Set-top Box 의 덤프파일을 분석하는 것이 주된 목적이라고 합니다.

     

    Set-top Box 란?

    대부분의 가정 집에 존재하는 제품으로, TV에 연결되어서 외부에서 들어오는 신호를 받아서 적절히 변환을 시키는 역할을 하는 장치로

    전달 받은 신호를 TV로 출력해주는 장치를 이야기 합니다.

     

    Question은 아래와 같습니다.

    (1) 2개의 squashfs file system을 복구하기( Clear point : 160점 )

    (2) md5 해시값이 C876A936DA0F9511D80CF792AFB42AC4인 파일을 찾기( Clear point : 20점 )

    (3) set-top box의 사용자 계정을 나열하기 (Clear point : 20점 )

     

    일단 1번 질문을 해결을 해야 2번 3번을 할수 있을 것 같았습니다.

    그러기 위해서는 squashfs file system을 복구를 해야하는데, 문제로서 제공받은 .bin 파일은 덤프 파일이기 때문에 squashfs file system structure에 대해서 공부를 먼저 해야 하는것 같습니다.

     

    그렇기 때문에 squashfs file system 이 무엇인지, 어떤 구조를 가지고 있는지를 먼저 공부 해야할 것 같습니다.

     

    Squashfs File System 이란?

    간단히 이야기를 하자면 Linux를 위한 읽기 전용 파일시스템 압축 방법 입니다.

    또한 일반적으로 읽기전용 파일 시스템 이나 낮은 오버헤드가 필요한 제한된 블록 장치 메모리 시스템을 위해서 Squashfs 압축을 사용합니다.

     

    Squashfs File을 생성하기 위해서는 mksquashfs 라는 명령어를 사용해야 하며, Ubuntu OS에 기본적으로 설치가 되어있었습니다.

    Ubuntu OS 뿐만 아니라 Arch Linux, Debian, Fedoram Gentoo Linux, Linux Mint, Salix, Ubuntu, Clonezlla 등등 많은 OS에 내장되어 있습니다.

     

    Squashfs File System의 기본적인 내용은  https://en.wikipedia.org/wiki/SquashFS 해당 사이트에 나와있습니다.

     

    이번에는 특정 폴더 하나를 Squashfs File System 으로 만들어서 어떠한 구조를 가지고 있는지 확인해 보겠습니다.

     

    제가 Squashfs File System으로 만들 대상 폴더는 아래 사진의 Forensic 이라는 폴더 입니다.

     

    아래의 명령어를 이용해서 파일을 만들어 보겠습니다.

     

    압축이 완료가 되면 아래와 같이 출력을 하게 됩니다.

     

    file 명령어로 Forensic.squashfs 를 확인해 보면 아래와 같이 Squashfs filesystem 이라고 출력이 됩니다.

     

    해당 파일의 Hex값을 확인해 보면 아래와 같습니다.

     

    hsqs이 squashfs 파일의 Header Signature 인것 같습니다.

     

    binary 파일에서 hsqs 를 검색해 보겠습니다.

     

    찾을 수 없다고 합니다.

     

    파일을 분석 하다가 sqsh 문자열을 찾았습니다.

     

    2개의 sqsh 파일이 존재 합니다.

     

    문자열을 찾았는데 yS -mets 를 바꿔보면 - System 으로 4바이트씩 Reverse 되어 있는 것을 알 수 있습니다.

     

    위의 파일의 hex값을 4바이트씩 Reverse 를 해보겠습니다.

     

    HxD로 확인해 보면 hsqs가 있다는 것을 알 수 있습니다.

     

    Forensic.squashfs 파일의 구조를 한번 010 editor을 확인해 보면 아래와 같습니다.

     

    앞에서 만든 Forensic.squashfs에서 파일의 끝을 어떤 hex값으로 끝나는지 보면 아래와 같습니다.

     

    위의 빨간 박스와 파란 박스를 보면 저부분이 squashfs 파일의 마지막을 의미하는 id_table 영역입니다.

    id_table 영역을 지나면 0x00인 NULL로 채워져 있습니다.

     

    NAND_Dump_Reverse.bin 파일에서 hsqs 문자열의 주소는 0x2B5000 입니다.

    쭉 내려서 id_table과 null을 찾아보면 0xFD6850 쪽에 NULL이 있는 것을을 알 수 있습니다.

     

    위의 빨간 박스와 파란박스가 id_table이기 때문에 여유 롭게 0x2B5000 ~ 0xFD686F까지 NAND_Dump_Frist.squashfs 라고 만들어 보겠습니다.

     

    해당 파일에는 2개의 squashfs file format이 존재하기 때문에 나머지 하나의 squashfs file을 NAND_Dump_Second.squashfs 라고 만들겠습니다.

    범위는 0x6C48000 ~ 0x7897EEF 입니다.

     

    올바른 파일인 Forensic.squashfs 를 보면 export_table chunk 위는 fragment_table_index chunk 이고, 아래는 id_table chunk 이다.

     

    앞서 우리는 첫번째 파일 시스템의 id_table chunk는 알고 있다.

    그리고 첫번째 파일 시스템의 fragment_table_index chunk도 0000000000XXXXXX 으로서 0000000000h가 무조건 들어가 있을 것이므로 0000000000을 검색해 보면 된다.

    위의 언급한 내용을 토대로 첫번째 파일 시스템의 export_table chunk를 찾았습니다.

    export_table chunk의 맨아래 8바이트는 export_table chunk의 시작 주소를 나타 내기 때문에 맨아래 8바이트를 제외한 빨간 부분에 주목을 해야한다.

     

     

    첫번째 파일시스템의 맨 처음으로 가보면 compression_id가 다음과 같이 1인것을 알 수 있습니다.

     

    1이라는 값은 zlib을 의미하고 해당 파일시스템이 zlib으로 압축이 되어있다는 것을 알수 있습니다.

    다시 export_table chunk로 돌아와서 export_table chunk의 맨앞 2바이트는 chunk의 크기를 의미 합니다.

    그렇기 때문에 2바이트를 제외한 나머지는 추출해보겠습니다.

     

    위의 추출한 export_table chunk은 당연히 zlib으로 압축이 되어 있습니다.

    그렇기 때문에 export_table chunk 가 정상적으로 구성 되어 있다면 zlib을 통해서 압축이 정상적으로 풀려야 합니다.

    아래의 명령어를 이용해서 압축 해제를 해보겠습니다.

     

     

    출력된 export_table.zlib.output 파일을 확인해 보면 아래와 같이 zlib: invalid checksum. 이라는 문자열이 출력이 됩니다.

     

    export_table chunk를 다시 살펴 보면 아래와 같이 FF FF FF FF FF FF FF FF XX XX XX FF XX XX XX XX의 패턴이 반복되는것을 확인 할 수 있습니다.

    그래서 아래의 파일의 블록된 부분을 지워주고 다시 zlib 압축을 해제 해 보겠습니다.

     

     

    깔끔하게 압축이 풀린 것을 확인할 수 있습니다.

     

    첫번째 파일 시스템에 아래와 같이 똑같은 형태가 있었습니다.

     

    위의 패턴을 보면 800h, 1040h, 1880h, 20C0h.. 로 규칙적으로 존재합니다.

    아래의 코드를 실행하면 위의 패턴에 해당하는 부분을 제거해 줍니다.

     

    padding을 제외하고 정상적으로 파일시스템이 복구 된것을 확인 할 수 있습니다.

     

    이제 뒷부분에 00h 로 padding을 넣어주면 파일 시스템이 복구 됩니다.

     

    두번째 파일 시스템도 마찬가지로 복구를 진행해 줍니다.

     

    이제 복구 가 끝이 났으니 mount를 해서 2번 문제와 3번문제를 해결 하면 끝이빈다.

    마운트 하는 방법은 아래의 명령어를 입력하면 됩니다.

     

    마운트된 폴더 하위로 들어가서 파일의 해시값이 c875a936da0f9511d80cf792afb42ac4 이 되는 파일을 찾는 것입니다.

     

    결과는 ./app/Native 파일 입니다.

     

    3번째 문제는 set-top box의 user accounts들을 찾는 문제입니다.

    2개의 파일시스템의 /etc/passwd를 확인하면 계정을 확인 할 수 있습니다.

    ↑ aaaa로 마운트한 파일시스템의 /etc/passwd

     

    ↑ bbbb로 마운트한 파일시스템의 /etc/passwd

    댓글

Designed by Tistory.