数字取证工具 (Digital Forensics)
数字取证(Digital Forensics)是应急响应中的核心环节。正确的取证方法不仅能帮助你找到攻击者的痕迹,还能确保证据在法律程序中有效。本章覆盖从内存取证到磁盘取证的完整工具链。
相关章节:09-历史记录与时间线分析 | 06-文件系统取证
一、证据收集优先级(RFC 3227)
1.1 易失性数据(Volatile Data)
按易失性从高到低排列,必须按此顺序收集:
| 优先级 |
数据类型 |
说明 |
收集命令 |
| 1 |
CPU 寄存器/缓存 |
最易失,通常不做采集 |
- |
| 2 |
内存(RAM) |
运行中的进程、网络连接、解密的数据 |
LiME / /proc/kcore |
| 3 |
网络连接 |
当前活动的网络连接和监听端口 |
netstat -antup / ss -antup |
| 4 |
运行中的进程 |
当前执行的程序及其参数 |
ps auxef / /proc/[pid]/* |
| 5 |
登录用户 |
当前和最近登录的用户 |
w / who / last |
| 6 |
ARP 缓存 / 路由表 |
网络层信息 |
arp -an / ip route |
1.2 非易失性数据(Non-Volatile Data)
| 优先级 |
数据类型 |
说明 |
| 7 |
磁盘数据 |
文件系统内容、已删除文件 |
| 8 |
系统日志 |
syslog、auth.log、应用日志 |
| 9 |
配置文件 |
系统和服务配置 |
| 10 |
物理介质 |
外接存储、备份磁带 |
1.3 为什么顺序重要
内存数据随时可能丢失:攻击者可能正在清理痕迹,系统可能因资源耗尽随时崩溃
操作系统每一次操作都在改变状态:你运行的每个命令都会覆盖内存中的数据
先采集易失性高的数据:一旦断电或重启,内存中的恶意进程、解密密钥、网络连接全部消失
取证工具本身也会占用资源:加载取证工具会覆盖部分内存数据,所以要提前准备好工具
实际操作原则:
不要重启服务器(除非必须)
不要在目标机器上安装软件
使用预编译的静态链接工具(从 USB 运行)
记录你的每一个操作
二、内存取证
LiME 是最常用的 Linux 内存获取工具,以内核模块方式运行
可以将完整的物理内存 dump 到文件或通过网络传输
安装和编译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
git clone https://github.com/504ensicsLabs/LiME.git cd LiME/src
sudo apt install linux-headers-$(uname -r) -y sudo yum install kernel-devel-$(uname -r) -y make
ls *.ko
|
获取内存 dump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
sudo insmod lime-$(uname -r).ko "path=/mnt/usb/memory.lime format=lime"
sudo insmod lime-$(uname -r).ko "path=/mnt/usb/memory.raw format=raw"
nc -l -p 4444 > memory.lime
sudo insmod lime-$(uname -r).ko "path=tcp:4444 format=lime"
sudo insmod lime-$(uname -r).ko "path=/mnt/usb/memory.padded format=padded"
sudo rmmod lime
sha256sum /mnt/usb/memory.lime > /mnt/usb/memory.lime.sha256
|
格式说明
| 格式 |
说明 |
适用场景 |
lime |
LiME 原生格式,包含内存范围信息 |
Volatility 分析 |
raw |
连续的原始内存 dump |
通用兼容性最好 |
padded |
用零填充不可读的内存区域 |
需要精确偏移量的分析 |
2.2 /proc/kcore 和 /dev/mem
1 2 3 4 5 6 7 8 9 10 11 12
|
sudo dd if=/proc/kcore of=/mnt/usb/kcore.dump bs=1M
sudo dd if=/dev/mem of=/mnt/usb/devmem.dump bs=1M
|
替代工具
fmem:创建 /dev/fmem 设备来绕过内核限制
AVML(Azure Virtual Machine Live Memory):Microsoft 开源的内存获取工具
1 2 3 4
| wget https://github.com/microsoft/avml/releases/latest/download/avml chmod +x avml sudo ./avml /mnt/usb/memory.lime
|
2.3 Volatility 3 分析 Linux 内存 dump
Volatility 是最强大的内存取证分析框架
安装 Volatility 3
1 2 3 4 5 6 7 8 9 10 11 12 13
| pip3 install volatility3
git clone https://github.com/volatilityfoundation/volatility3.git cd volatility3 pip3 install -r requirements.txt python3 setup.py install
vol -h
python3 vol.py -h
|
Linux 符号表(Symbol Tables)
Volatility 3 分析 Linux 内存需要对应内核的符号表
1 2 3 4 5 6 7 8 9 10 11 12
|
git clone https://github.com/volatilityfoundation/dwarf2json.git cd dwarf2json go build
sudo ./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-$(uname -r) > linux-$(uname -r).json
cp linux-$(uname -r).json /path/to/volatility3/volatility3/symbols/linux/
|
核心分析插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
vol -f memory.lime linux.pslist
vol -f memory.lime linux.pstree
vol -f memory.lime linux.netstat
vol -f memory.lime linux.bash
vol -f memory.lime linux.pagecache.Files
vol -f memory.lime linux.lsmod
vol -f memory.lime linux.hidden_modules
vol -f memory.lime linux.lsof
vol -f memory.lime linux.mountinfo
vol -f memory.lime linux.envars
vol -f memory.lime linux.elfs --pid <PID> --dump
|
示例:从内存中发现已删除的恶意进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
vol -f memory.lime linux.pslist | grep -v -E '(systemd|sshd|nginx|mysql|cron)'
vol -f memory.lime linux.proc.Maps --pid 12345
vol -f memory.lime linux.elfs --pid 12345 --dump --output /tmp/recovered/
file /tmp/recovered/pid.12345.elf sha256sum /tmp/recovered/pid.12345.elf strings /tmp/recovered/pid.12345.elf | grep -iE '(http|https|ftp|ssh|password|shell|cmd|exec)'
vol -f memory.lime linux.netstat | grep 12345
|
三、磁盘取证
3.1 dd / dcfldd 磁盘镜像
创建磁盘的完整镜像是磁盘取证的第一步
使用 dd 创建镜像
1 2 3 4 5 6 7 8 9 10
| sudo dd if=/dev/sda of=/mnt/external/sda.img bs=4M status=progress
sudo sha256sum /dev/sda > /mnt/external/sda.hash.before
sha256sum /mnt/external/sda.img > /mnt/external/sda.img.hash
|
使用 dcfldd(取证增强版 dd)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| sudo apt install dcfldd -y sudo yum install dcfldd -y
sudo dcfldd if=/dev/sda of=/mnt/external/sda.img bs=4M hash=sha256 hashlog=/mnt/external/sda.hashlog
sudo dcfldd if=/dev/sda of=/mnt/external/sda.img of2=/mnt/backup/sda.img bs=4M hash=sha256
sudo dcfldd if=/dev/sda of=/mnt/external/sda.img bs=4M split=2G splitformat=000
|
远程磁盘镜像(通过网络)
1 2 3 4 5 6 7 8 9 10 11
| nc -l -p 9999 > sda.img
sudo dd if=/dev/sda bs=4M | nc <forensic_workstation_ip> 9999
nc -l -p 9999 | openssl aes-256-cbc -d -k <password> > sda.img
sudo dd if=/dev/sda bs=4M | openssl aes-256-cbc -k <password> | nc <forensic_ip> 9999
|
3.2 Sleuthkit 工具集
Sleuthkit(TSK)是最著名的开源磁盘取证工具集
1 2 3
| sudo apt install sleuthkit -y sudo yum install sleuthkit -y
|
fls:列出文件系统中的文件(包括已删除)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| fls -r /mnt/external/sda.img
fls -r -d /mnt/external/sda.img
mmls /mnt/external/sda.img fls -r -o 2048 /mnt/external/sda.img
fls -r /mnt/external/sda.img /var/www/html/
|
icat:通过 inode 恢复文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
icat /mnt/external/sda.img 12345 > /tmp/recovered_backdoor.php
icat -o 2048 /mnt/external/sda.img 12345 > /tmp/recovered_file
fls -r -d /mnt/external/sda.img | while read line; do inode=$(echo "$line" | awk -F'[: \t]' '{print $2}' | tr -d '*') name=$(echo "$line" | awk -F: '{print $2}' | xargs) if [ -n "$inode" ] && [ "$inode" != "0" ]; then echo "Recovering inode $inode: $name" icat /mnt/external/sda.img "$inode" > "/tmp/recovered/$inode-$name" 2>/dev/null fi done
|
mactime:生成文件系统时间线
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| fls -r -m "/" /mnt/external/sda.img > bodyfile.txt
mactime -b bodyfile.txt > timeline.txt
mactime -b bodyfile.txt -d 2026-04-01..2026-04-02 > timeline_apr01.txt
mactime -b bodyfile.txt -d -z UTC 2026-04-01..2026-04-02 > timeline.csv
|
fsstat:文件系统信息
1 2 3 4 5 6 7 8 9 10
| fsstat /mnt/external/sda.img
|
3.3 Autopsy — GUI 界面
Autopsy 是基于 Sleuthkit 的图形界面取证工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| sudo apt install autopsy -y
autopsy
|
适合需要 GUI 操作或需要团队协作的场景
3.4 extundelete:ext 文件系统文件恢复
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| sudo apt install extundelete -y
sudo extundelete /dev/sda1 --restore-file var/www/html/shell.php
sudo extundelete /dev/sda1 --restore-directory var/www/html/
sudo extundelete /dev/sda1 --restore-all
sudo extundelete /dev/sda1 --restore-all --after $(date -d "2026-04-01" +%s)
|
3.5 foremost / scalpel:文件雕刻
文件雕刻(File Carving):从原始磁盘数据中根据文件头/尾特征恢复文件
不依赖文件系统元数据,适合文件系统严重损坏的场景
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| sudo apt install foremost -y
foremost -i /mnt/external/sda.img -o /tmp/carved/
foremost -t jpg,png,pdf,doc,zip -i /mnt/external/sda.img -o /tmp/carved/
sudo foremost -i /dev/sda1 -o /tmp/carved/
sudo apt install scalpel -y
sudo vim /etc/scalpel/scalpel.conf
scalpel -c /etc/scalpel/scalpel.conf -o /tmp/carved/ /mnt/external/sda.img
|
四、实时取证
4.1 取证信息收集脚本
在不做磁盘镜像的情况下,快速收集易失性和关键数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #!/bin/bash
OUTDIR="/mnt/usb/evidence/$(hostname)_$(date +%Y%m%d_%H%M%S)" mkdir -p "$OUTDIR"
echo "[*] 开始取证数据收集 - $(date)" | tee "$OUTDIR/collection.log"
echo "[+] 收集系统信息..." uname -a > "$OUTDIR/01_uname.txt" date > "$OUTDIR/01_date.txt" uptime > "$OUTDIR/01_uptime.txt" cat /etc/os-release > "$OUTDIR/01_os-release.txt"
echo "[+] 收集网络连接..." ss -antup > "$OUTDIR/02_ss_connections.txt" ip addr > "$OUTDIR/02_ip_addr.txt" ip route > "$OUTDIR/02_ip_route.txt" arp -an > "$OUTDIR/02_arp_cache.txt" cat /proc/net/tcp > "$OUTDIR/02_proc_net_tcp.txt" iptables -L -n -v > "$OUTDIR/02_iptables.txt" 2>&1
echo "[+] 收集进程信息..." ps auxef > "$OUTDIR/03_ps_full.txt" ps -eo pid,ppid,user,args --sort=start_time > "$OUTDIR/03_ps_sorted.txt" ls -la /proc/*/exe 2>/dev/null > "$OUTDIR/03_proc_exe.txt" ls -la /proc/*/cwd 2>/dev/null > "$OUTDIR/03_proc_cwd.txt" cat /proc/*/cmdline 2>/dev/null | tr '\0' ' ' > "$OUTDIR/03_proc_cmdline.txt"
echo "[+] 收集用户信息..." w > "$OUTDIR/04_who_online.txt" last -100 > "$OUTDIR/04_last_logins.txt" lastb -100 > "$OUTDIR/04_last_failed.txt" 2>/dev/null cat /etc/passwd > "$OUTDIR/04_passwd.txt" cat /etc/shadow > "$OUTDIR/04_shadow.txt" 2>/dev/null cat /etc/group > "$OUTDIR/04_group.txt"
echo "[+] 收集计划任务..." crontab -l > "$OUTDIR/05_crontab_root.txt" 2>&1 ls -la /etc/cron* > "$OUTDIR/05_cron_dirs.txt" 2>&1 for user in $(cut -d: -f1 /etc/passwd); do crontab -u "$user" -l > "$OUTDIR/05_crontab_${user}.txt" 2>/dev/null done cat /var/spool/cron/crontabs/* > "$OUTDIR/05_spool_crontabs.txt" 2>/dev/null
echo "[+] 收集服务信息..." systemctl list-units --type=service --all > "$OUTDIR/06_systemd_services.txt" 2>&1 systemctl list-unit-files --type=service > "$OUTDIR/06_systemd_unit_files.txt" 2>&1
echo "[+] 计算关键文件 hash..." find /usr/bin /usr/sbin /bin /sbin -type f -exec sha256sum {} \; > "$OUTDIR/07_binary_hashes.txt" 2>/dev/null
echo "[+] 收集 SSH 信息..." find / -name "authorized_keys" -exec echo "=== {} ===" \; -exec cat {} \; > "$OUTDIR/08_authorized_keys.txt" 2>/dev/null cat /etc/ssh/sshd_config > "$OUTDIR/08_sshd_config.txt"
echo "[+] 检查持久化机制..." cat /etc/ld.so.preload > "$OUTDIR/09_ld_preload.txt" 2>/dev/null env > "$OUTDIR/09_environment.txt" cat /etc/profile > "$OUTDIR/09_profile.txt" cat /etc/bashrc > "$OUTDIR/09_bashrc.txt" 2>/dev/null
echo "[+] 打包日志文件..." tar czf "$OUTDIR/10_var_log.tar.gz" /var/log/ 2>/dev/null
echo "[+] 生成摘要..." echo "收集完成时间: $(date)" >> "$OUTDIR/collection.log" echo "文件列表:" >> "$OUTDIR/collection.log" ls -la "$OUTDIR/" >> "$OUTDIR/collection.log"
find "$OUTDIR" -type f -exec sha256sum {} \; > "$OUTDIR/evidence_hashes.txt"
echo "[*] 取证数据收集完成,保存在: $OUTDIR"
|
4.2 取证 USB 工具包准备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
mkdir -p /mnt/usb/tools/{bin,scripts,yara-rules}
|
4.3 取证注意事项
证据完整性
对所有证据文件计算 hash 值(SHA-256)
不要在原始证据上做分析,使用副本
使用写保护设备连接目标磁盘
哈希校验
1 2 3 4 5 6 7 8
| sha256sum evidence_file > evidence_file.sha256
sha256sum -c evidence_file.sha256
find /evidence/ -type f ! -name "*.sha256" -exec sha256sum {} \; > /evidence/manifest.sha256
|
操作记录
记录每一步操作的时间、操作人、操作内容
使用 script 命令记录完整的终端会话
1 2 3 4 5 6 7 8 9
| script -t 2>/mnt/usb/evidence/timing.log /mnt/usb/evidence/session.log
exit
scriptreplay /mnt/usb/evidence/timing.log /mnt/usb/evidence/session.log
|
五、证据链维护
5.1 证据链(Chain of Custody)
证据链记录了证据从采集到分析的完整流转过程
每一次证据的转移、访问都必须记录
证据链断裂 = 证据可能被篡改 = 法律上无效
5.2 证据记录模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| cat << 'EOF' ============================================ 证据编号: IR-2026-0402-001 证据描述: 服务器 web01 内存 dump 采集时间: 2026-04-02 14:30:00 UTC+8 采集人员: [姓名] 采集方法: LiME 内核模块 (v1.9) 采集设备: USB 移动硬盘 SN:XXXX
文件名: web01_memory_20260402.lime 文件大小: 16,384 MB SHA-256: a1b2c3d4...
保管记录: | 时间 | 操作人 | 操作 | 备注 | |------|--------|------|------| | 2026-04-02 14:30 | 张三 | 采集 | 使用 LiME | | 2026-04-02 15:00 | 张三 | 转交 | 交给李四分析 | | 2026-04-02 15:05 | 李四 | 接收 | 验证 hash 一致 | | 2026-04-02 15:10 | 李四 | 创建副本 | 分析用副本 | ============================================ EOF
|
5.3 合规要求
国内法规
《网络安全法》要求日志留存不少于 6 个月
《数据安全法》对数据分类分级的要求
等保 2.0 对安全审计的要求
操作原则
最小侵入性:尽量减少对目标系统的影响
可重复性:你的分析过程要能被他人重复验证
完整记录:记录所有操作,包括失败的尝试
双人原则:关键操作有见证人
常见错误
直接在被入侵的系统上安装工具
忘记计算 hash 值
没有记录操作过程
分析原始证据而非副本
使用可能被植入后门的系统工具(应使用自带的静态工具)
参考与延伸
工具资源:
LiME:https://github.com/504ensicsLabs/LiME
Volatility 3:https://github.com/volatilityfoundation/volatility3
Sleuthkit:https://www.sleuthkit.org/
AVML:https://github.com/microsoft/avml
下一步:学习 30-YARA规则 中的恶意文件检测技术,可以配合取证工具对恢复的文件进行扫描