磁盘取证是应急响应中还原入侵事实的关键环节。服务器被植入 WebShell、后门或遭勒索加密后,系统日志常被攻击者清理,但磁盘上残留的文件系统元数据、删除文件记录与 MACB 时间戳仍能还原攻击时间线。本文给出基于 dd 镜像与 Sleuth Kit 的磁盘取证完整配置方案,包含镜像获取、哈希校验、文件系统分析、时间线构建与关键字搜索的全流程命令,适用于 Linux 服务器入侵排查与数据恢复场景。
适用场景
- 服务器遭入侵后需要还原攻击时间线,而系统日志被清理或篡改
- 需要确认攻击者上传、删除或外传了哪些文件
- 勒索软件加密后需要识别文件类型、尝试部分数据恢复
- 法务或合规要求留存可验证的取证镜像与哈希证据链
- 误删除文件后需要基于文件系统残留记录尝试恢复
前置条件
- 一台独立的取证分析机,不推荐直接在被取证主机上分析
- Linux 环境,已安装 Sleuth Kit、dcfldd 等工具
- 存储空间:原始镜像约等于被取证磁盘用量,另需预留分析副本空间
- root 权限(读取块设备节点)
- 在线服务器需先确认停机窗口,或改用快照挂载为只读副本
# Debian / Ubuntu
apt-get update && apt-get install -y sleuthkit dcfldd foremost
# CentOS / RHEL
yum install -y sleuthkit dcfldd
# 验证版本
fls -V && dcfldd --version
原理说明
Sleuth Kit 工作在文件系统层,而非操作系统层。它不依赖宿主机的挂载与文件 API,而是直接解析文件系统结构(超级块、inode 表、目录项),因此可以读取已删除文件残留、被隐藏的目录项以及被篡改时间戳的原始值。
关键概念如下:
- MACB 时间戳:Modified(内容修改)、Accessed(访问)、Changed(inode 元数据变更)、Born(创建,仅部分文件系统支持)
- 未分配空间:文件删除后其数据块被标记为未分配,但内容通常不会立即覆写,是恢复的主要来源
- slack 空间:文件末尾未占满的最后一个块,常残留上一份文件的数据
- 镜像格式:raw(dd 产物)与 E01(带压缩与校验的专业格式),取证场景建议同时对 raw 镜像计算哈希并单独保存哈希文件
Sleuth Kit 常用命令分工:mmls 读取分区表,fsstat 读取文件系统元信息,fls 列目录与文件(含删除项),icat 按 inode 提取内容,blkls 导出未分配空间,mactime 生成时间线。
操作步骤
步骤 1:现场保护与镜像获取
取证第一原则是不对原始介质写入任何数据。生产环境优先使用云厂商磁盘快照,再将快照挂载为只读副本;物理机场景建议使用硬件写保护器或直接只读挂载。
# 查看磁盘与分区
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
# 确认设备未被挂载或已只读挂载
mount | grep sdb
# 使用 dcfldd 获取镜像,边读边算哈希并记录进度
dcfldd if=/dev/sdb of=/evidence/host01_disk.img \
hash=sha256 hashwindow=1G hashlog=/evidence/host01_sha256.log \
bs=4M conv=noerror,sync
# 若磁盘已被挂载,可对单分区取证
umount /dev/sdb1 2>/dev/null
dcfldd if=/dev/sdb1 of=/evidence/host01_sdb1.img bs=4M conv=noerror,sync
conv=noerror,sync 用于坏道场景:遇到读取错误继续而非中断,并将坏块以零填充对齐,避免后续偏移错位。
步骤 2:镜像校验与分区结构识别
cd /evidence
# 生成独立哈希文件,供证据链留存
sha256sum host01_disk.img | tee host01_disk.sha256
# 校验(复核时执行)
sha256sum -c host01_disk.sha256
# 查看分区表(-B 以扇区为单位显示)
mmls host01_disk.img
# 查看各分区文件系统类型与元信息
fsstat -o 2048 host01_disk.img | head -40
其中 -o 参数为分区起始扇区号,取自 mmls 输出的 Start 列。分区偏移错误会导致后续全部解析失败,务必先核对。
步骤 3:目录与删除文件枚举
# 递归列出根目录,-r 递归,-p 显示完整路径,-l 长格式含时间
fls -r -p -l -o 2048 host01_disk.img > /evidence/fls_all.txt
# 仅列出已删除条目(条目前带 * 号)
fls -r -d -p -o 2048 host01_disk.img > /evidence/fls_deleted.txt
# 统计删除条目数量
wc -l /evidence/fls_deleted.txt
输出中行首为 r/r 表示常规文件,d/d 表示目录,* 后缀表示该条目已被删除。记录条目对应的 inode 号,用于下一步提取。
步骤 4:按 inode 提取文件内容
# 按 inode 号提取文件内容(示例 inode 128471)
icat -o 2048 host01_disk.img 128471 > /evidence/recovered_128471.bin
# 识别文件真实类型(不依赖扩展名)
file /evidence/recovered_128471.bin
# 批量提取删除文件:从 fls 输出中解析 inode 并循环提取
awk '$0 ~ /\*/ {print $2}' /evidence/fls_deleted.txt | sort -u | while read ino; do
icat -o 2048 host01_disk.img "$ino" > "/evidence/carved/inode_$ino.bin" 2>/dev/null
done
mkdir -p /evidence/carved
# 导出未分配空间,供文件雕复(carving)
blkls -o 2048 host01_disk.img > /evidence/unallocated.dd
foremost -i /evidence/unallocated.dd -o /evidence/foremost_out
blkls 导出的是未分配簇的集合,配合 foremost 可按文件头尾特征识别并恢复 jpg、pdf、zip、php 等类型文件。该方法不依赖文件系统索引,对已被删除目录项的证据尤其有效。
步骤 5:构建 MACB 时间线
# 生成 bodyfile(含 MACB 与 inode、路径)
fls -r -m / -o 2048 host01_disk.img > /evidence/bodyfile.txt
# 生成可读时间线,-d 输出 CSV,-z 指定时区
mactime -b /evidence/bodyfile.txt -d -z Asia/Shanghai > /evidence/timeline.csv
# 按时间排序后查看入侵窗口附近的活动
sort -t, -k1,1 /evidence/timeline.csv | head -50
分析时间线时重点关注:Web 目录内短时间内出现的创建事件(WebShell 落盘)、系统目录下 bin/sbin 的修改(后门替换)、大量文件的同一秒修改(勒索加密特征)。
步骤 6:关键字与 IOC 检索
# 在镜像中直接检索字符串(先定位关键字所在扇区)
grep -a -b -o -i -E "eval\(|base64_decode|cmd\.exe|/bin/bash -c" \
/evidence/host01_disk.img | head -20
# 按偏移量提取内容并查看上下文
dd if=/evidence/host01_disk.img bs=1 skip=$((OFFSET-512)) count=2048 2>/dev/null | strings
# 使用 Autopsy 图形化分析(可选,适合大范围排查)
# 导入 host01_disk.img 后启用 Ingest Modules:File Type Identification、Hash Lookup、Keyword Search
配置验证
# 1. 镜像哈希复核:与获取阶段 hashlog 一致
sha256sum -c /evidence/host01_disk.sha256
# 2. 分区解析验证:分区数量与 fsstat 输出应匹配实际
mmls /evidence/host01_disk.img | grep -c ":"
# 3. 文件系统可读性验证:能列出根目录条目
fls -o 2048 /evidence/host01_disk.img | wc -l
# 4. 时间线完整性验证:bodyfile 行数与 fls 输出条数一致
wc -l /evidence/bodyfile.txt
四项检查全部通过,方可认为取证过程可复现、证据链完整。若哈希不一致,说明镜像在获取或存储过程中发生变化,该镜像不得作为证据使用。
常见问题
FAQ 1:镜像与原盘哈希不一致,是什么原因?
常见原因有三类:一是磁盘在获取期间仍被挂载写入,必须确认目标设备处于卸载或只读状态;二是使用了 bs=4M 但未加 sync,导致尾部不足一个块的数据被丢弃;三是磁盘本身存在坏道,读取时返回了替换数据。建议改用 dcfldd 并同时输出 hashlog,出现不一致立刻重新获取,不要对可疑镜像继续分析。
FAQ 2:fls 列出的删除文件,为什么 icat 提取出来是空文件?
说明该 inode 指向的数据块已被重新分配并覆写。文件系统回收 inode 时只清除目录项与部分元数据,数据块是否仍完好取决于后续写入量。此类场景应转而使用 blkls 导出未分配空间,再用 foremost 做文件雕复,成功率取决于覆写比例。
FAQ 3:分析机磁盘空间不足,如何拆分镜像?
可按分区分别取证,仅对可疑分区(如 /var、/www、/home)制作镜像;也可使用 dcfldd 的 split 参数切分为多个分片,再用 cat part* > disk.img 还原后再计算哈希,注意还原顺序与哈希必须重新校验。
FAQ 4:能否在生产服务器上直接运行 Sleuth Kit 分析?
可以但不推荐。直接分析会被挂载状态、日志滚动与后台写入干扰,且 icat 读取已删除 inode 时若数据块被回收,结论不可复现。生产环境正确做法是:快照 → 只读挂载 → 镜像 → 离线分析,全程保持原始介质不被写入。
总结
磁盘取证的核心流程可归纳为四步:只镜像不动原盘、先哈希再分析、按分区偏移解析文件系统、用时间线与关键字交叉定位。Sleuth Kit 提供的 mmls、fsstat、fls、icat、blksl、mactime 六个命令即可覆盖从分区识别到时间线还原的绝大部分工作。与内存取证(关注运行时进程与网络连接)不同,磁盘取证关注的是落盘证据的持久化痕迹,两者结合才能完整还原一次入侵的起点、路径与影响范围。实施前务必确认停机窗口与证据留存要求,避免因操作顺序错误导致证据失效。