dd 및 dcfldd를 사용한 디스크 이미지 획득
사용 시기
- 수사 대상 드라이브의 포렌식 사본을 생성해야 할 때
- 휘발성 디스크 증거를 분석 전에 보존해야 하는 침해 대응 중
- 법 집행 기관이나 법적 절차에서 검증된 비트 단위 사본이 필요할 때
- 저장 장치에 대해 파괴적 분석을 수행하기 전에
- 물리적 드라이브, USB 장치 또는 메모리 카드에서 이미지를 획득할 때
전제 조건
- Linux 기반 포렌식 워크스테이션 (SIFT, Kali 또는 모든 Linux 배포판)
dd(모든 Linux 시스템에 사전 설치됨) 또는dcfldd(향상된 포렌식 버전)- 하드웨어 쓰기 차단기 또는 소프트웨어 쓰기 차단 구성
- 원본보다 큰 용량의 대상 드라이브
- 포렌식 워크스테이션에 대한 루트/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
DISK IMAGE ACQUISITION REPORT
==============================
Case Number: 2024-001
Date/Time: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
Examiner: [Name]
Source Device: /dev/sdb
Model: [from hdparm output]
Serial: [from hdparm output]
Size: [from fdisk output]
Acquisition Tool: dcfldd v1.9.1
Block Size: 4096
Write Blocker: [Hardware/Software model]
Image File: evidence.dd
Image Hash (SHA-256): [from hash file]
Source Hash (SHA-256): [from hash file]
Hash Match: YES/NO
Errors During Acquisition: [from error log]
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로 식별한 후, dcfldd를 SHA-256 해싱과 함께 사용하여 DVD 보관을 위해 4GB 세그먼트로 분할하고, 해시가 일치하는지 확인한 후 케이스 노트에 문서화합니다.
시나리오 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으로 채우고, 오류 로그에 읽을 수 없었던 섹터를 문서화합니다.
출력 형식
Acquisition Summary:
Source: /dev/sdb (500GB Western Digital WD5000AAKX)
Destination: /cases/case-2024-001/images/evidence.dd
Tool: dcfldd 1.9.1
Block Size: 4096 bytes
Duration: 2h 15m 32s
Bytes Copied: 500,107,862,016
Errors: 0 bad sectors
Source SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
Image SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
Verification: PASSED - Hashes match