使用 dd 和 dcfldd 获取磁盘映像
适用场景
- 需要对嫌疑驱动器创建取证副本以供调查时
- 事件响应过程中,需在分析前保留易失性磁盘证据时
- 法律或司法程序要求提供经过验证的逐位副本时
- 对存储设备进行破坏性分析之前
- 从物理驱动器、USB 设备或存储卡获取映像时
前提条件
- 基于 Linux 的取证工作站(SIFT、Kali 或任何 Linux 发行版)
dd(所有 Linux 系统预装)或dcfldd(增强的取证版)- 已配置硬件写保护器或软件写保护
- 目标驱动器有足够的存储空间(大于源驱动器)
- 在取证工作站上拥有 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 指定数量进行部分获取
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 | 遇到读取错误时继续,并用零填充以保持偏移对齐 |
| 保管链 | 证明证据未被篡改的文档记录轨迹 |
| 分片映像 | 将大型映像拆分为更小的文件,便于存储和传输 |
| 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 哈希,拆分为 4GB 片段以便刻录 DVD 存档,验证哈希匹配,在案例笔记中记录。
场景 2:对受感染工作站的 USB 闪存驱动器进行成像
使用 blockdev --setro 软件写保护,使用 dcfldd 包含 MD5 和 SHA-256 双哈希获取,映像足够小可存储为单个文件,验证后存储在加密案例驱动器上。
场景 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 用零填充间隙,在错误日志中记录哪些扇区无法读取。
输出格式
获取摘要:
源设备: /dev/sdb (500GB Western Digital WD5000AAKX)
目标文件: /cases/case-2024-001/images/evidence.dd
工具: dcfldd 1.9.1
块大小: 4096 字节
耗时: 2h 15m 32s
复制字节数: 500,107,862,016
错误: 0 个坏扇区
源 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
映像 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
验证结果: 通过 - 哈希匹配