使用 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
磁碟映像擷取報告
==============================
案件編號: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/
關鍵概念
| 概念 | 說明 |
|---|---|
| 逐位元複製 | 來源的完全複本,包含未配置空間與 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 復原可讀取的磁區,再使用 dd 搭配 conv=noerror,sync 以零填充空白區域,並在錯誤日誌中記錄哪些磁區無法讀取。
輸出格式
擷取摘要:
來源: /dev/sdb (500GB Western Digital WD5000AAKX)
目的地: /cases/case-2024-001/images/evidence.dd
工具: dcfldd 1.9.1
區塊大小: 4096 位元組
持續時間: 2 小時 15 分鐘 32 秒
複製位元數:500,107,862,016
錯誤: 0 個損壞磁區
來源 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
映像 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
驗證結果: 通過 - 雜湊相符