CentOS僵尸进程的备份与取证
一、核心原则
二、取证与备份清单
三、安全处置与修复
四、一键取证脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
OUTDIR="/var/log/zombie_forensics/$(date +%F_%H-%M-%S)"
mkdir -p "$OUTDIR"
# 1) 僵尸进程清单
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/ {printf "PID=%s PPID=%s CMD=%s\n", $1, $2, substr($0, index($0,$4))}' \
> "$OUTDIR/zombies.txt"
# 2) 进程树片段(含父进程上下文)
if command -v pstree >/dev/null 2>&1; then
pstree -p | grep -A5 -B5 Z > "$OUTDIR/pstree_Z.txt" || true
fi
# 3) 命令行与资源快照(针对僵尸及其父进程)
for pid in $(awk '$3 ~ /Z/ {print $1}' "$OUTDIR/zombies.txt"); do
ps -o pid,ppid,stat,cmd,%cpu,%mem --no-headers -p "$pid" >> "$OUTDIR/zombie_cmd.txt" 2>/dev/null || true
ppid=$(ps -o ppid= -p "$pid" 2>/dev/null || echo "UNKNOWN")
echo "=== Parent PID: $ppid ===" >> "$OUTDIR/parent_info.txt"
ps -o pid,ppid,stat,cmd,%cpu,%mem --no-headers -p "$ppid" >> "$OUTDIR/parent_info.txt" 2>/dev/null || true
done
# 4) 打开文件与网络连接(针对父进程)
for ppid in $(awk '$3 ~ /Z/ {print $2}' "$OUTDIR/zombies.txt" | sort -u); do
lsof -p "$ppid" > "$OUTDIR/parent_${ppid}_files.txt" 2>/dev/null || true
done
# 5) systemd 单元状态与日志(若可用)
if command -v systemctl >/dev/null 2>&1; then
for svc in $(systemctl list-units --type=service --state=running --no-pager | awk '{print $1}'); do
if systemctl is-active --quiet "$svc"; then
systemctl status "$svc" -l > "$OUTDIR/svc_${svc}.status" 2>/dev/null || true
journalctl -u "$svc" -b --since "$(date -d '1 hour ago' +%F_%H:%M:%S)" \
> "$OUTDIR/svc_${svc}.journal" 2>/dev/null || true
fi
done
fi
# 6) 打包归档
tar czvf "$OUTDIR.tar.gz" -C "$(dirname "$OUTDIR")" "$(basename "$OUTDIR")"
echo "Zombie forensics saved to: $OUTDIR.tar.gz"
提示: