拿到一台被入侵的 Linux 服务器,或者收到一个 Linux 镜像文件,第一件事不是急着翻日志、敲命令,而是想清楚一个问题:我做每一步操作,会不会破坏原始证据?这是取证和普通运维排查最本质的区别。运维追求的是尽快恢复业务,怎么快怎么来;取证追求的是“每一步都可解释、可复现、经得起推敲”,哪怕慢一点,也要保证证据链完整。
这篇内容适合三类人看:一是刚接触电子取证比赛的学生,想弄明白 Linux 取证到底要采集哪些东西;二是做服务器应急响应的运维或安全工程师,需要在业务不能停的前提下尽可能留存证据;三是做数字取证、司法鉴定相关工作的技术人员,需要一套规范化的操作流程作为参考。我会按照实际取证的推进顺序来写:先讲现场如何固定证据,再讲服务器本体的痕迹提取,然后是日志分析、内存取证和流量取证,最后聊聊怎么把散落的线索串成一条完整的证据链。
1. 取证前的第一件事:定边界、保现场、算时间
很多人拿到机器就习惯性敲 last、history,想赶紧看看黑客干了什么。这个冲动必须忍住。一旦你执行了命令,命令本身就会改变系统状态——atime 会变、shell 历史会追加、临时文件会被创建,这些变化在法庭上或者比赛评分里都可能是致命的扣分点。
正确的顺序是先做三件事:
- 给目标机器拍照或者录像,记录屏幕当前状态、连接的网络线缆、U 盘等外设,物理现场的信息往往比数字证据更先消失。
- 记录当前系统时间,用
date命令查看系统时间,并和真实时间做对比,因为攻击者可能篡改过系统时间,这会直接影响日志分析的时间线判断。 - 确定取证范围:是只取这台服务器本体,还是需要连带采集它的网络流量、外部存储、云控制台日志。边界定得越清楚,后面分析越省力。
在这个阶段还有一个容易被忽略的点:取证工具必须来自可信源。建议提前准备一个“取证 U 盘”或者移动硬盘,里面放好静态编译好的工具集,包括 lsof、ps、netstat、ss、ls 等常用命令的静态版本。为什么要强调静态编译?因为被入侵的服务器上,系统自带的 ps、ls、netstat 很可能已经被替换成恶意版本,攻击者用 rootkit 挂了个钩子,你敲 ps 看到的进程列表是假象。运行你自己带的静态编译版本,才能拿到相对可信的数据。当然,静态编译工具只能降低被欺骗的概率,不能百分之百保证,如果条件允许,最稳妥的做法是把内存完整 dump 下来,用专门的内存分析工具去解析。
时间是个容易被忽略的大问题。攻击者在拿到权限之后,第一件事往往就是改系统时间,试图让日志记录错乱,干扰追踪。所以采集证据时,必须同时记录“系统时间”和“真实时间”的偏差。方法很简单:取证的机器上先 date 看系统时间,再用手机或另一台机器对一下标准时间,把这个偏差值记录下来。后续分析日志时,所有时间戳都要换算到真实时间线上,否则你排查入侵时间点就是白费功夫。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 易失性数据采集:内存、进程、网络连接,越早越好
如果机器还开着机,取证优先级最高的不是硬盘,而是内存。内存里的数据是断电即失的,包括正在运行的进程、解密的密钥、内存中的恶意代码、网络连接状态等,这些是判断攻击行为最直接的证据。当然,实操中很多情况下我们不方便直接给服务器断电拔硬盘(尤其是线上业务不能停),那就按下面的优先级顺序采集:
2.1 进程信息采集:看一眼就够了,但要看全
用你自带的静态 ps 命令采集当前进程快照,输出重定向到外部存储设备,比如U盘或取证硬盘。命令如下:
bash复制./ps -ef > /mnt/usb/ps_ef.txt
./ps aux > /mnt/usb/ps_aux.txt
./ps -eo pid,ppid,user,group,cmd,lstart > /mnt/usb/ps_full.txt
重点看三件事:
- 有没有名字伪装成系统进程的可疑进程,比如
[kthreadd]变成了kthreadd(少了方括号),或者sshd变成了sshd加了一堆奇怪参数。 - 有没有高 CPU 占用的进程,挖矿程序通常会把 CPU 跑满,但有些高明的攻击者会限制 CPU 占用率来隐藏自己,所以不能只看 CPU,还得看进程路径。
- 进程的启动时间和启动用户,
lstart参数可以看到精确的启动时间,如果发现某个进程是在凌晨三点启动的,而且启动用户是www-data,那基本就是 webshell 反弹的 shell。
/proc 目录也值得单独采集,它记录着每个进程的运行时信息。可以直接把整个 /proc 目录打包,但要注意 /proc 里有些文件是动态生成的,打包时可能会报错,这很正常,不用管,能采集多少算多少。重点是 /proc/[pid]/cmdline、/proc/[pid]/environ、/proc/[pid]/fd 这些目录,它们能告诉你进程是怎么启动的、环境变量里有没有敏感信息(比如数据库密码)、打开了哪些文件。
2.2 网络连接采集:找出外联的通道
网络连接是判断“数据是否已经外泄”的核心证据。用静态 netstat 或 ss 采集:
bash复制./netstat -tunap > /mnt/usb/netstat_tunap.txt
./ss -tunap > /mnt/usb/ss_tunap.txt
./netstat -anp > /mnt/usb/netstat_anp.txt
分析时优先关注 ESTABLISHED 状态的外联连接——本机主动连出去的连接。正常的服务器不该有太多主动外联,如果一个 nginx 进程连着某个不认识的 IP 的 443 端口,那十有八九是被种了后门。还要关注监听在高端口的服务,比如监听在 4444、5555、6666 这些端口的进程,很多反弹 shell 和木马都爱用这些非标准端口。
注意,netstat 和 ss 只能看到采集那一刻的连接状态,如果攻击者已经把后门关了,你就什么都看不到了。所以网络连接这块需要和流量取证配合,后面会专门讲。
