dd 및 dcfldd를 이용한 디스크 이미지 획득하기
사용 시기
- 수사 목적으로 의심스러운 드라이브의 포렌식 사본을 만들어야 할 때
- 침해 대응 중 휘발성 디스크 증거를 분석 전에 보존해야 할 때
- 법 집행 기관이나 법적 절차에서 검증된 비트 단위 사본이 필요할 때
- 저장 장치에 대해 파괴적 분석을 수행하기 전
- 물리적 드라이브, USB 장치, 메모리 카드에서 이미지를 획득할 때
전제 조건
- Linux 기반 포렌식 워크스테이션 (SIFT, Kali 또는 모든 Linux 배포판)
dd(모든 Linux 시스템에 기본 설치) 또는dcfldd(향상된 포렌식 버전)- 하드웨어 쓰기 차단기(write-blocker) 또는 소프트웨어 쓰기 차단 구성
- 충분한 저장 공간이 있는 대상 드라이브 (출처보다 큼)
- 포렌식 워크스테이션의 root/sudo 권한
- SHA-256 또는 MD5 해싱 유틸리티 (
sha256sum,md5sum)
워크플로우
1단계: 대상 장치 식별 및 쓰기 보호 활성화
# 연결된 모든 블록 장치를 나열하여 대상 식별
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
# 장치 세부 정보 확인
fdisk -l /dev/sdb
# 소프트웨어 쓰기 차단 활성화 (하드웨어 블로커가 없는 경우)
blockdev --setro /dev/sdb
# 읽기 전용 상태 확인
blockdev --getro /dev/sdb
# 출력: 1 (읽기 전용 활성화됨)
# 또는 지속적인 쓰기 차단을 위해 udev 규칙 사용
echo 'SUBSYSTEM=="block", ATTRS{serial}=="WD-WCAV5H861234", ATTR{ro}="1"' > /etc/udev/rules.d/99-writeblock.rules
udevadm control --reload-rules
2단계: 대상 준비 및 출처 문서화
# 사례 디렉토리 구조 생성
mkdir -p /cases/case-2024-001/{images,hashes,logs,notes}
# 출처 드라이브 정보 문서화
hdparm -I /dev/sdb > /cases/case-2024-001/notes/source_drive_info.txt
# 시리얼 번호와 모델 기록
smartctl -i /dev/sdb >> /cases/case-2024-001/notes/source_drive_info.txt
# 출처 장치 사전 해싱
sha256sum /dev/sdb | tee /cases/case-2024-001/hashes/source_hash_before.txt
3단계: dd를 사용하여 이미지 획득
# 진행 상황 및 오류 처리를 포함한 기본 dd 획득
dd if=/dev/sdb of=/cases/case-2024-001/images/evidence.dd \
bs=4096 \
conv=noerror,sync \
status=progress 2>&1 | tee /cases/case-2024-001/logs/dd_acquisition.log
# 공간 절약을 위한 압축 이미지
dd if=/dev/sdb bs=4096 conv=noerror,sync status=progress | \
gzip -c > /cases/case-2024-001/images/evidence.dd.gz
# 특정 크기만큼만 획득하는 부분 이미징
dd if=/dev/sdb of=/cases/case-2024-001/images/first_1gb.dd \
bs=1M count=1024 status=progress
4단계: dcfldd를 사용한 이미지 획득 (권장 포렌식 방법)
# dcfldd가 없으면 설치
apt-get install dcfldd
# 내장 해싱 및 분할 출력 기능으로 이미지 획득
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256,md5 \
hashwindow=1G \
hashlog=/cases/case-2024-001/hashes/acquisition_hashes.txt \
bs=4096 \
conv=noerror,sync \
errlog=/cases/case-2024-001/logs/dcfldd_errors.log
# 대용량 이미지를 관리 가능한 세그먼트로 분할
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256 \
hashlog=/cases/case-2024-001/hashes/split_hashes.txt \
bs=4096 \
split=2G \
splitformat=aa
# 검증 패스 포함 획득
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256 \
hashlog=/cases/case-2024-001/hashes/verification.txt \
vf=/cases/case-2024-001/images/evidence.dd \
verifylog=/cases/case-2024-001/logs/verify.log
5단계: 이미지 무결성 검증
# 획득한 이미지 해싱
sha256sum /cases/case-2024-001/images/evidence.dd | \
tee /cases/case-2024-001/hashes/image_hash.txt
# 출처 해시와 이미지 해시 비교
diff <(sha256sum /dev/sdb | awk '{print $1}') \
<(sha256sum /cases/case-2024-001/images/evidence.dd | awk '{print $1}')
# 분할 이미지를 사용한 경우 각 세그먼트 검증
sha256sum /cases/case-2024-001/images/evidence.dd.* | \
tee /cases/case-2024-001/hashes/split_image_hashes.txt
# 변경 사항이 없음을 확인하기 위해 출처 재해싱
sha256sum /dev/sdb | tee /cases/case-2024-001/hashes/source_hash_after.txt
diff /cases/case-2024-001/hashes/source_hash_before.txt \
/cases/case-2024-001/hashes/source_hash_after.txt
6단계: 획득 과정 문서화
# 획득 보고서 생성
cat << 'EOF' > /cases/case-2024-001/notes/acquisition_report.txt
디스크 이미지 획득 보고서
==============================
사건 번호: 2024-001
날짜/시간: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
검사관: [이름]
출처 장치: /dev/sdb
모델: [hdparm 출력에서]
시리얼: [hdparm 출력에서]
크기: [fdisk 출력에서]
획득 도구: dcfldd v1.9.1
블록 크기: 4096
쓰기 차단기: [하드웨어/소프트웨어 모델]
이미지 파일: evidence.dd
이미지 해시 (SHA-256): [해시 파일에서]
출처 해시 (SHA-256): [해시 파일에서]
해시 일치: 예/아니요
획득 중 오류: [오류 로그에서]
EOF
# 보관을 위한 로그 압축
tar -czf /cases/case-2024-001/acquisition_package.tar.gz \
/cases/case-2024-001/hashes/ \
/cases/case-2024-001/logs/ \
/cases/case-2024-001/notes/
주요 개념
| 개념 | 설명 |
|---|---|
| 비트 단위 사본 | 할당되지 않은 공간과 슬랙 공간을 포함한 출처의 정확한 복제본 |
| 쓰기 차단기 | 증거 매체에 대한 쓰기를 방지하는 하드웨어 또는 소프트웨어 메커니즘 |
| 해시 검증 | 출처와 이미지를 비교하여 무결성을 증명하는 암호학적 해시 |
| 블록 크기 (bs) | 속도에 영향을 미치는 전송 청크 크기; 포렌식에서는 일반적으로 4096 또는 64K 사용 |
| conv=noerror,sync | 읽기 오류 시에도 계속 진행하고 오프셋 정렬 유지를 위해 0으로 패딩 |
| 체인 오브 커스터디 | 증거가 변조되지 않았음을 증명하는 문서화된 추적 기록 |
| 분할 이미징 | 저장 및 운송을 위해 큰 이미지를 작은 파일로 나누기 |
| Raw/dd 형식 | 메타데이터 컨테이너 오버헤드가 없는 비트 단위 이미지 형식 |
도구 및 시스템
| 도구 | 용도 |
|---|---|
| dd | 표준 Unix 디스크 복제 유틸리티, 로우 이미징용 |
| dcfldd | DoD 컴퓨터 포렌식 연구소의 향상된 dd 버전, 해싱 기능 포함 |
| dc3dd | DoD 사이버 범죄 센터의 또 다른 포렌식 dd 변형 |
| sha256sum | 무결성 검증을 위한 SHA-256 해시 계산 |
| blockdev | 블록 장치 읽기 전용 모드를 설정하는 Linux 명령어 |
| hdparm | 드라이브 식별 및 매개변수 보고 |
| smartctl | 드라이브 상태 및 식별을 위한 S.M.A.R.T. 데이터 검색 |
| lsblk | 블록 장치 열거 및 식별 |
일반적인 시나리오
시나리오 1: 용의자 노트북 하드 드라이브 획득
Tableau T35u 하드웨어 쓰기 차단기를 통해 드라이브를 연결하고, /dev/sdb로 식별한 후, SHA-256 해싱과 함께 dcfldd를 사용하여 4GB 세그먼트로 분할(DVD 보관용), 해시 일치 확인, 사례 노트에 문서화.
시나리오 2: 손상된 워크스테이션의 USB 플래시 드라이브 이미징
blockdev --setro로 소프트웨어 쓰기 차단을 사용하고, MD5 및 SHA-256 이중 해싱을 포함한 dcfldd로 획득, 이미지가 단일 파일로 충분히 작은 경우 단일 파일로 저장하고 암호화된 사례 드라이브에 보관.
시나리오 3: 네트워크를 통한 원격 획득
원격 획득을 위해 netcat 또는 ssh를 통해 dd를 파이프: ssh root@remote "dd if=/dev/sda bs=4096" | dd of=remote_image.dd bs=4096, 양쪽 끝을 독립적으로 해싱하여 전송 무결성 확인.
시나리오 4: 고장 드라이브에서 획득
먼저 ddrescue를 사용하여 읽기 가능한 섹터를 복구한 다음, conv=noerror,sync와 함께 dd를 사용하여 갭을 0으로 채우고, 오류 로그에 읽을 수 없는 섹터를 문서화.
출력 형식
획득 요약:
출처: /dev/sdb (500GB Western Digital WD5000AAKX)
대상: /cases/case-2024-001/images/evidence.dd
도구: dcfldd 1.9.1
블록 크기: 4096 bytes
소요 시간: 2h 15m 32s
복사된 바이트: 500,107,862,016
오류: 0 bad sectors
출처 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
이미지 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
검증: 통과 - 해시 일치