Major Study./System hacking

디지털 포렌식 Forensic Duplication.

sosal 2010. 12. 5. 10:54
/*
 http://sosal.tistory.com/
 * made by so_Sal
 */


침해 사고가 발생한 시스템에서 증거 확보 및 차후 분석을 위해서 디스크
이미지를 복사하려고 한다.

다음 조건을 만족하도록 dd 를 이용하여 백업을 수행하고
생성된 디스크 이미지 파일의 md5 체크섬을 계산하라.
(백업 이미지는 자신의 홈디렉토리에서만 생성 가능하다.)

<조건>
1. dd를 사용하여 바이트 단위로 복사
2. 복사 대상 파티션 : /home
3. 생성된 디스크 이미지 파일이름 : victim.data.dd




해킹사고가 발생하였을시, 현재 컴퓨터 상태를 분석하기 위해 필히 복사를 해야한다.
포렌식 도중에 OS 환경이 바뀔 시, 증거자료로 사용할 수 없게되기 때문이다.

그럼 디스크 이미지를 복사하는 방법은? : 'dd 명령어'

문제와 직접적인 관련은 없지만, 일반적으로 이미지를 복사하기 전에
리눅스가 설치된 파티션의 시작 실린더 번호와 끝 실린더 번호를 기록해야한다. 'fdisk 명령어'

[root@sosal tmp]# fdisk

Usage: fdisk [-l] [-b SSZ] [-u] device
E.g.: fdisk /dev/hda  (for the first IDE disk)
  or: fdisk /dev/sdc  (for the third SCSI disk)
  or: fdisk /dev/eda  (for the first PS/2 ESDI drive)
  or: fdisk /dev/rd/c0d0  or: fdisk /dev/ida/c0d0  (for RAID devices)

fdisk -l /dev/hda > /tmp/partition-info.txt

// man page

       -v     버전 정보를 보여주고 마친다.

       -l     현재 시스템의 파티션 테이블을 나열하고 마친다. 계산되는 장 치 는
              다 음과 같다.  /dev/hda, /dev/hdb, /dev/sda, /dev/sdb, /dev/sdc,
              /dev/sdd, /dev/sde, /dev/sdf, /dev/sdg, /dev/sdh

       -s파티션
              도스파티션이 아니면(가령, 파티션 ID가 10보다 크면), 그 파티션 의
              크기가 출력된다. 이 값은 보통 mkfs(8) 풀그림에서 사용된다.

하드이미지의 파티션 정보를 보기
[root@sosal tmp]# fdisk -l /dev/hda

Disk /dev/hda: 40.0 GB, 40060403712 bytes
255 heads, 63 sectors/track, 4870 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        4870    39013852+  8e  Linux LVM

파티션의 크기 출력 ( -l 옵션에서도 다 확인이 가능한 내용)
[root@sosal tmp]# fdisk -s /dev/hda2
39013852

이렇게, 파티션정보를 확인했으며, dd 명령어를 이용하여, 하드디스크를 이미지로 복사해보자.

dd 명령어 옵션
// man page
if=file : 지정한 파일로부터 읽는다.
of=file : if='file' 에서 지정한 파일로부터 불러들인다.
ibs=size : 지정한 사이즈만큼 읽는다.
obs=size : 지정한 사이즈만큼 쓴다.
bs=size : 지정한 사이즈만큼 읽고 쓴다.
count=n : 입력블록의 ibs크기만큼 복사한다.
seek=blocks : 출력 시작에서 blocks 단위 만큼 ibs 크기를 건너띈다.
.. 이하 옵션에 대해서는 man 페이지 참조

하드디스크를 복사한다는 가정하에, df 명령어를 이용하여 한번더 하드디스크 디바이스를 확인해볼 수 있다.

[root@sosal tmp]# df
Filesystem                                     1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00    36248264   5871268  28505944   18% /
/dev/hda1                                           101086      35241      60626   37% /boot
tmpfs                                                  387516            0    387516    0% /dev/shm


dd if=/dev/hda1 of=/tmp/backup.image
: if=/dev/hda1 // hda1 로부터 읽어와서
: of=/tmp/backup.image // /tmp/backup.image라는 파일로 이미지 저장



[root@igrus tmp]# file ./backup.image
./backup.image: Linux rev 1.0 ext3 filesystem data (needs journal recovery)

그럼 이미지를 디바이스로 복구하기 위해선
dd if=/tmp/backup.image of=/dev/hda1
이렇게 거꾸로 써주면 된다.

위에서 작성한 파티션 정보를 'fdisk -l /dev/hda > /tmp/partition-info.txt'
이용하여, fdisk를 이용하여 똑같이 만들어줘야만 한다..

그럼 문제를 풀어보자.
df 명령어를 통해, 우리가 이미지를 복사하고자 하는 위치의 디스크 정보를 얻자.



우리가 복사하고자하는 곳은 /home 이므로,
if=/dev/dsk/c1t5d0s3 으로부터 파일을 읽어야 하며,

바이트단위로 복사하여야 하기 때문에 bs=1,

victim.data.dd 라는 이름으로 저장하라고 했기에,
of=./victim.data.dd 옵션을 준다.

dd bs=1 if=/dev/dsk/c1t1d0s6 of=./victim.data.dd 를 입력한다.
음... 한참 걸린다 ㅠ