Digital Forensics/Linux2010. 3. 16. 02:30
반응형

3-3.  inode 가 남아있지 않는 경우 (Data Carving)

 

위의 3-2처럼 ils icat 가지고 복구할 수 없는 경우가 있다. inode table 자체가 깨진 경우이다. 이에 해당하는 경우에 사용할수 있는 방법이 있다.

바로 carving 기법이다. carving 이란 inode 가 남아있지 않아 복구가 복잡해졌을 때 쓰는 방식으로, 여러가지 기술이 있다.

예를 들자면, 파일의 signature를 통해 파일의 시작점을 찾을 수 있다.  jpeg의 경우 처음이 FF D8이고 끝부분(trailer) FF D9이다. 파일의 끝점까지 찾아서 해당 부분을 dump를 뜨는 것이 가장 완벽한 방법이나, 끝점을 찾는 것은 매우 힘들다. Jpeg과 같이 끝점에도 signature가 있는 경우는 거의 없기 때문이다. 따라서 size 정보 또는 파일의 최대 size를 이용하여 시멘트 카빙을 한 후 유의미한 data만 추출하는 방법을 사용한다.

시멘트 카빙의 경우 data가 연속배열 되어 있지 않으면 유의미한 결과를 얻을 수 없으나, 최근 hdd 용량의 대량화로 대부분 연속배열 되어있기 때문에 유용하게 사용가능하다.

 

이해를 돕기 위해, 직접 file 형태로 된 shell script 를 모두 복구해보는 예제를 들어보겠다. 위에서 실습을 위해 다운로드 받았던 이미지 파일 5(honeypot.hda5.dd )로부터, 로그 파일을 조작한 후 삭제된 shell script를 복구해보겠다.

따라해보며 개념을 익히기 바란다.

 

 

 

3-3-1. Data Carving 시 사용할 Tool 설명


        i. fsstat : Block
사이즈 살펴보기


       ii. sigfind : 디스크 상에서 signature를 포함한 Block을 찾는 툴

<사용법>  sigfind -o (offset) -b (block size) signature image위치

 

eg. sigfind BR 찾기 (BR signature 511, 512 번째에 '55 AA')


     iii. blkcat :
해당 Block Dump 하는 툴

(script 가 한 개 블록임을 가정한다. 넘어가면 짤린다.)

eg. blkcat honeypot.hda5.dd 3698    // 3698Block 스크립트를 보여준다.



iv. sigfind blkcat 툴을 사용하기 위해서는 sleuthkit 을 설치해야한다.

1.    Sleuthkit Tool download 받는다.



 

            2. 압축을 풀어 INSTALL.txt 파일을 열어본다.

 

3.    그대로 따라하며 설치한다.

 



 
3-3-2.
로그파일 수정한 Shell Script 복구하기

(Sleuthkit SIGFIND, BLKCAT Tool을 활용)

 

*. sigfind, blkcat 툴을 사용하여 shell script 파일을 싹 다 복구한 후, 로그파일을 수정한 script만 찾아내보도록 하겠다.

-> 만약 이 방법으로 나오지 않는다면, script 가 파일로 존재 하지 않는 것이므로 keyword searching 을 하는 수밖에 없다.

 

i. 각 이미지의 Block Size를 추출하는 쉘코드 작성 (Sigfind Tool 사용시 Block Size를 알아야 하기 때문)



 

ii. 추출한 fsstatdata Block Size 확인


//   honeypot.hda1.dd Block Size : 1024
      honeypot.hda5.dd Block Size : 4096

      honeypot.hda6.dd Block Size : 4096
     
honeypot.hda7.dd Block Size : 1024
      honeypot.hda8.dd Block Size : 1024 

  

iii. honeypot.hda1.dd 등에 있는 모든 script 파일을 dump

             (sript 파일의 사이즈가 하나의 Block을 넘어가지 않는다고 가정하며,
              Sleuthkit sigfind blkcat Tool을 사용하도록 한다.)


 


 

script 여부 확인 방법 : sigfind를 통해 script 파일의 맨앞 (#!/bin/sh or #!/bin/bash) 4byte 23212f62('#!/b'16진수 변환.)까지를 시그너춰로 보자. (sigfind signature 4 byte까지밖에 못준다.)

c.f) 16진수 변환 방법 : echo '문자' | xxd : 출력 중 0A는 엔터임

 

 

 

iv. 파일 복구 Shell Script 완성본!!

 쉘스크립트 파일이면서 var/log/message (로그파일 저장) 문자열을 포함하는 파일을 추려서 저장하는 기능 추가

<shell script>

#!/bin/sh

 

for i in 1 5 6 7 8            //  honeypot.hda$i.dd 로 파일 다섯개를 한번에 처리하기 위한 i 변수 지정

do

mkdir dumphda$i       //  dump shell script 를 저장할 폴더만들기

fsstat honeypot.hda$i.dd | egrep "Block Size" | awk -F ': ' '(1){print $2}'|\

//  fsstat으로 이미지 파일마다 다른 block size의 확인 후 해당부분 추출 (sigfind에서 써야함)

while read blocksize

//  변수 blocksize fsstat을 통해 추출한 이미지 별 block size 정보 넘김

do

sigfind -b $blocksize 23212f62 honeypot.hda$i.dd | awk -F ' ' '(1){print $2}' |\

while read blocknum

//  sigfind tool signature '#!/b'로 설정하여 찾은 block number 를 변수 blocknum에 넘김

do

blkcat honeypot.hda$i.dd $blocknum >> dumphda$i/$blocknum.txt

//  blkcat tool로 해당 이미지의 script가 위치한 block blocknum.txt dump

if cat dumphda$i/$blocknum.txt | grep '/var/log/message' ;then

cp dumphda$i/$blocknum.txt realhda$i/$blocknum.txt

//  blocknum.txt 파일 중 '/var/log/messages' 내용이 있는 파일을 찾아서 추출

fi

done

done

done

<그림 27. /var/log/message 문자열 포함 Shell Script 추출>

 

v. iv Shell Script 실행 결과 :


         hda5(/usr) 이미지에 일치하는 파일 1개 존재 확인


 
    hda8(/ : root) 이미지에도 일치하는 파일이 1개 확인

 

 

  

vi. 찾은 공격 스크립트 (1 block 에 해당하는 script 만 찾음)

 

반응형
Posted by CCIBOMB
Digital Forensics/Linux2010. 3. 15. 22:04
반응형

iii.  삭제된 inode 복구하기

1.   지워진 inode , 한번이라도 쓴 inode 찾기


 
*
복구의 조건 :

· st_alloc(2번째 필드) : data block의 상태를 표시해준다.
                          
f free (사용가능) 이어야 복구 가능

                 c.f) st_alloc a (allocated)인 경우는 inode가 이미 새로운 data 저장을 위해 할당되어있는 상태임을 의미하므로 복구가 불가능하다.

· st_size(11번째 필드) : 0보다 클 것 (data 가 있음을 의미)

· 주의 : 필드는 1번부터 세고, 0은 전체를 나타낸다.



ils
awk로 복구가능한 파일만 보게 조건을 걸고 그런 파일이 나오면 첫번째 필드를 출력하라고 명령을 내린 것이다. 다음과 같은 결과가 나온다.


c.f)
' ' :
쿼팅제한! 필드구분자 -F '|'

 

awk(자동화툴)  : 필드를 처리하는 툴 중 하나다. -F Field Separater를 뜻한다. 여기에서 필드를 구분해주는 것이 |이므로 '|'로 나타낸다. 두번째 필드가 f이고, 11번째 필드의 값이 0보다 커야 하므로 (왜냐하면 virgin inode가 아닌, 한번이라도 쓴 inode를 찾아서 빼기 위해서이다.)

<awk의 사용법>

     awk [옵션] '스크립트' [변수=] [파일()]

    or

  awk [옵션] -f 스크립트 파일 [변수=] [파일()]

 

ils 명령어(숨겨진 데이터를 찾기) : ils는 마운트 되어 있는 디바이스의 inode 정보를 리스트로 만들어주며, 또한 삭제된 inode 정보를 확인할 수 있다.

  <ils 옵션>

  -e : 파일 시스템의 모든 inode 정보를 리스트로 만들어 준다.

-f : 파일시스템 타입을 정의한다. 거의 모든 UNIX 시스템의 기본 파일 시스템은 ffs(Berkeley fast file system)이며, 리눅스는 기본적으로 ext2fs(second extended file system)을 사용하고 있다.

-o : 아직 열려있거나 실행중인 삭제된 파일들의 inode 정보를 만들어준다.(-aL과 동일)

-r : 삭제된 파일들의 inode 정보를 만들어 준다.(-LZ와 동일)

-v : 상세 모드 출력(stderr)

-V : 상세 모드 출력(stdout)



2.   icat 을 사용하여 해당 inode를 파일로 복구하기

 

2-1.  icat honeypot.hda5.dd 2254 > a
        
: 2254 inode a란 파일로 복구



c.f) icat : inode 숫자에 해당되는 내용을 파일로 복사하기 위해서(보통 삭제된 파일의 inode 번호 사용) icat을 사용한다. 여기서 2254는 확인된 삭제된 inode 번호이다.
 

2-2.  icat honeypot.hda5.dd 140839 > 140839
         : 140839 번 inode를 원래의 것으로 복구





                  2-3.
위처럼 inode 번호를 일일이 커맨드에 대입하는 것이 아니라, Shell script를 써서 모든 파일을 복구해보자.


                   2-4.  r을 실행해보자. 실행권한이 없다고 표시될 것이다.


                       2-5.  chmod u+x ./r : r명령의 실행 Permission을 받는다.

 

                       2-6. r 명령을 실행하면 복구가 완료됨을 볼 수 있다.



반응형
Posted by CCIBOMB
Digital Forensics/Linux2010. 3. 2. 15:57
반응형

 

 2-3-5. inode 와 파일의 생성, 링크, 삭제 (ext2)

 

i.             파일의 생성
새로운 파일이 만들어지면 그에 해당하는 inode i-list안에 만들어지며, inode inumber 파일 이름이 디렉토리에 등록된다.

 

# df -i : 사용할수 있는 inode의 값이 0이면 아무것도 생성할수 없다.

ii.            파일의 링크
이미 존재하고 있는 파일을 링크시킬 경우는 디렉토리에 그 파일에 대한 새로운 이름이 등록되고, inumber는 본래 있던 파일의 inumber가 복사된다. 이 때 복사되는 파일의 inode에서 파일의 링크수는 하나 증가하게 된다
.

iii.          파일의 삭제
파일을 삭제하면 그 파일에 대한 inode의 파일 링크수가 하나 감소되고 디렉토리 entry에서는 해당 파일의 inumber zero로 변한다. inode의 파일링크수가 zero가 되면 파일의 디스크 블록은 free가 되며 inode dellocate 된다.

 

è  따라서 inode에 담긴 정보가 손상되지 않았다면, 파일은 사용 가능하다. , 삭제된 파일이 복구가능한 것이다. ext2에서는 파일을 삭제 해도 inode는 파일 내용의 데이터블록들의 주소를 가지고 있으므로 새로운 파일이 삭제된 파일 위에 덮어 씌어지지 않는다면, 복구 가능하다.

 

 2-3-6. 해당 파일의 "inode"는 어떻게 찾는가

바로 "Directory Block"을 이용하는 것이다. 이 디렉토리 블럭은 데이터 영역에 존재한다. inode가 메타데이터 영역에서 데이터 영역으로의 포인터 정보를 담고 있다면, Directory Block은 반대로 데이터 영역에서 메타데이터 영역으로의 포인터 정보를 담고 있다. Directory Block데이터 영역은 형식이 정해져 있으며, Directory 밑에 있는 파일에 대한 inode 숫자가 담겨 있다.

c.f) EXT 파일시스템에서는 2 inode가 루트 디렉토리를 연결시켜 주다.


반응형
Posted by CCIBOMB
Digital Forensics/Linux2010. 3. 2. 15:43
반응형

 2-3-3. 유닉스 시스템(ext2)에서 inode를 이용한 File Addressing 

- Direct Addressing, Indirect Addressing -


유닉스에서 디스크는 일정한 크기의 블록으로 나누어져 있으며
,
각 파일이 디스크의 공간에 할당될 때도 정해진 크기의 블록으로 할당되어 사용된다. inode는 파일의 구성 블럭에 대한 물리적 위치가 포함되어 있다. 블록들의 물리적 위치를 기록하기 위하여 직접 어드레싱(Direct Addsressing) 및 간접 어드레싱(Indirect Addressing) 사용 되고 있다.

inode에 있는 블록위치에 대한 정보는 13개의 필드로 되어 있다. 필드 0부터 필드 9까지는 직접 블록을 어드레싱하는 부분이다. , 각 필드 내에 있는 내용은 디스크의 주소를 포함한다. 처음 10개의 블록은 이러한 방식으로 어드레싱 되며, 유닉스 내에 있는 파일의 크기는 대부분 작기 때문에 10개의 블록으로도 충분하지만, 방대한 파일인 경우에는 필드 10(Indirect Bolocks), 11(Double Indirect) 또는 12(Triple Indirect) 사용된다. 각각은 1, 2, 3차 간접 어드레싱 방법을 사용하게 된다. 필드 10은 실제의 어드레스가 있는 블록의 어드레스 즉, 주소의 주소를 가지고 있으며 어드레스 수를 통산 256개의 주소를 기록할 수 있다그러므로 필드 10은 실제주소가 있는 곳을 가리키고, 필드 11은 이중간접어드레스 필드를, 12는 삼중 어드레스를 각각 저장하고 있다. 이러한 방법에 의해 어떠한 크기의 파일이라도 유닉스에서 모두 다루어 질 수 있다.

 


 
2-3-4. inode
와 파일 크기, 파일 개수

inode의 크기는 64byte이며, 파일은 블럭들로 구성되어 있다.

한 블록의 크기가 1K이고 블록의 주소가 4바이트로 표현 가능하다면 한 블록은 256개의 블록 주소를 포함한다. 따라서 inode Indirect, Double Indirect, Triple Indirect Addressing 을 이용하면, 16 gigabyte 크기의 파일까지 표현 가능하다.


1K 블록을 표현할 수 있는 10개의 direct 블록(10K)
  256
개의 direct 블록을 가리키는 1개의 indirect 블록
(256K)
  256
개의 indirect 블록을 가리키는 1개의 double indirect 블록
(64M)
  256
개의 double indirect 블록을 가리키는 1개의 triple indirect 블록  

(16G = 1K * 256 * 256 * 256)

c.f) inode의 파일 크기 필드가 32비트인 경우 실제 파일 크기는 4 gigabytes로 제한된다.(2^32)

따라서 파일 시스템에서 “inode의 개수 = 파일의 개수라고 볼 수 있다.
    (inode table
size 는 파일 시스템 생성시 설정 가능하다.)

 

반응형
Posted by CCIBOMB