使用 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 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/
關鍵概念
| 概念 | 說明 |
|---|---|
| 位元對位元複本 | 包含未配置空間與 Slack 空間的原始複本 |
| 寫入阻斷器 | 防止寫入證據媒體的硬體或軟體機制 |
| 雜湊驗證 | 比較來源與映像的加密雜湊以證明完整性 |
| 區塊大小 (bs) | 影響速度的傳輸區塊大小;鑑識常用 4096 或 64K |
| conv=noerror,sync | 遇到讀取錯誤時繼續執行,並以零填充以維持偏移對齊 |
| 證據監管鏈 | 證明證據未被篡改的文件化流程 |
| 分割映像 | 將大映像分割成較小的檔案以便儲存與傳輸 |
| Raw/dd 格式 | 不包含元資料容器額外負荷的位元對位元映像格式 |
工具與系統
| 工具 | 用途 |
|---|---|
| dd | 標準 Unix 磁碟複製工具,用於原始映像擷取 |
| dcfldd | 美國國防部電腦鑑識實驗室增強的 dd 版本,內建雜湊功能 |
| dc3dd | 來自美國國防部網路犯罪中心的另一種鑑識用 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:透過網路遠端擷取
使用 dd 透過 netcat 或 ssh 進行遠端擷取:ssh root@remote "dd if=/dev/sda bs=4096" | dd of=remote_image.dd bs=4096,分別在兩端計算雜湊以驗證傳輸完整性。
情境 4:從故障硬碟擷取
先使用 ddrescue 復原可讀取的磁區,再使用帶有 conv=noerror,sync 的 dd 以零填充缺口,並在錯誤記錄中記錄哪些磁區無法讀取。
輸出格式
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