服务器被挂马后,如何溯源攻击来源?
服务器被挂马后,很多新手第一反应是直接重装或杀毒,但如果不查明攻击来源,同样的漏洞可能再次被利用。
下面按步骤讲清楚如何溯源攻击来源,每一步都配有命令和操作路径,跟着做就能找到蛛丝马迹。
准备工作:先备份再动手
溯源前必须做好两件事:
- 立即备份关键文件:将
/etc/passwd、/etc/shadow、web 站点目录、数据库导出备份到离线位置,防止后续操作破坏证据。 - 保留现场不被覆盖:不要重启服务器,不要直接删除可疑文件,先拷贝一份到安全目录。例如:
cp -a /var/log /root/log_backup
cp -a /etc /root/etc_backup
- 准备工具:通过 SSH 连接服务器,使用 root 或 sudo 权限操作。如果需要离线分析,也可以把日志和可疑文件下载到本地。
第一步:从日志中定位最早的可疑时间点
攻击者通常会留下痕迹,日志是最直接的突破口。
查看登录日志(CentOS/Debian 通用):
# 查看最近失败的 SSH 登录尝试
grep "Failed password" /var/log/auth.log
# 或者 /var/log/secure(CentOS 6/7)
检查 web 访问日志(以 Nginx 为例):
tail -n 5000 /var/log/nginx/access.log | grep -E "(\.php|eval|base64)"
将结果按 IP 排序,找出异常 IP 和访问时间:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
注意:重点关注 POST 请求或包含 eval、base64_decode、system 等函数的 URL,这些往往是 webshell 的上传或执行点。
第二步:揪出可疑进程和文件
找到最早异常时间后,检查该时间点附近有哪些进程在运行,以及新增或修改过的文件。
查看当前可疑进程:
ps aux | grep -E "(bash|python|perl|curl|wget)" | grep -v grep
如果发现 CPU 占用异常或名称奇怪的进程(如 kworker 伪装),记录 PID 后查看其父进程和打开文件:
lsof -p PID
查找最近修改的可疑文件:
find / -type f -mtime -3 -name "*.php" | xargs -I {} ls -la {}
# 搜索包含危险函数的文件
grep -r "eval(" /var/www/html --include="*.php"
重点关注目录:
/tmp、/var/tmp、/dev/shm:攻击者常在这些目录释放恶意文件。- 网站上传目录:
/var/www/html/uploads或wp-content/uploads。 - 系统计划任务文件:
/etc/crontab、/var/spool/cron/。
第三步:检查历史命令和后门入口
查看所有用户的历史命令,特别是 root 用户的历史记录:
cat /root/.bash_history | tail -100
cat /home/*/.bash_history | tail -50
分析可疑操作:比如下载远程脚本、修改权限、删除日志等。
如果发现 wget、curl 加 chmod +x 的痕迹,基本可以确认入侵点。
检查后门常见位置:
- SSH 授权文件:
~/.ssh/authorized_keys中有无未知公钥。 - 开机启动项:
systemctl list-unit-files | grep enabled对比业务服务。 - 计划任务:
crontab -l和cat /etc/crontab,查找异常脚本。 - 系统用户:
cat /etc/passwd查看有无非正常 UID 0 的用户。
避坑指南:这些事千万不要做
- 不要直接杀掉进程或删除文件:攻击者可能设置了定时重启脚本,你一删它又起来,甚至触发清除日志的命令。应该先
strace -p PID跟踪行为,或者用kill -STOP PID暂停进程,再分析。 - 不要重启服务器:重启会清空
/proc下的进程信息,也可能触发攻击者的自动清除脚本。 - 不要直接重装系统:除非你已完全溯源并备份了证据,否则无法排查漏洞根源,下次照样被黑。
- 不要只用杀毒软件:很多后门是免杀的,扫描不出来,人工分析更可靠。
效果验证:确保攻击源头已切断
完成以上步骤后,执行以下检查确认溯源结果:
- 所有可疑进程已暂停并记录 PID,删除对应文件后重启服务,再次
ps aux确认未复活。 - 修改所有管理员密码(SSH、数据库、面板)、更新 SSH 端口。
- 将备份的日志文件压包保存,以便后续分析或提交安全团队。
- 再次扫描高危端口:
netstat -tulpn | grep LISTEN,确认无未知监听。 - 部署文件完整性监控(如 AIDE 或 Tripwire),预防再次被篡改。
如果你正在处理服务器被挂马后溯源攻击来源的场景,建议先按上述步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握溯源方法,比单纯重装更扎实。