服务器被入侵后怎么溯源?日志分析实战技巧

服务器被入侵后怎么溯源?日志分析实战技巧

你发现服务器被黑了。清理了木马,改了密码,重启了服务。但你心里不踏实——他是怎么进来的?还有没有后门?会不会明天又回来?

清理是治标,溯源是治本。不知道入侵路径,你就没堵上漏洞,下次还会来。今天聊几个溯源技巧,从日志里找出攻击者的脚印。


先看一个数据

某安全团队统计,超过70%的入侵事件,攻击者在系统日志中留下了明显痕迹。问题是没人去看。不是日志没记,是你没查。被入侵后的前48小时是溯源的黄金时间。日志轮转可能覆盖旧数据,攻击者也可能主动清理日志。时间越久,证据越少。


第一步:确认入侵时间点

溯源的第一步不是翻日志,是确定攻击什么时候发生的。找两个线索:

1. 木马文件的创建时间

bash

# 找到最近7天被改过的可疑文件
find / -type f -mtime -7 -exec ls -lh {} \; 2>/dev/null | grep -v -E "(/proc|/sys|/dev)"

输出里看木马文件的修改时间,就是攻击的大概时间窗口。挖矿程序一般放在/tmp/var/tmp,webshell常藏在/var/www/html

2. 系统关机重启记录

bash

last -x | grep shutdown
last -x | grep reboot

攻击者入侵后可能会重启系统清理内存,或者安装内核模块需要重启。


第二步:分析登录日志

找出攻击者用什么账号、从哪个IP进来的。

bash

# 查看所有登录成功记录
grep "Accepted" /var/log/auth.log      # Ubuntu/Debian
grep "Accepted" /var/log/secure        # CentOS/RHEL

# 查看失败尝试(找爆破痕迹)
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr

# 查看sudo执行记录
grep "sudo" /var/log/auth.log

如果是SSH密钥登录,检查/root/.ssh/authorized_keys,看有没有陌生公钥。如果攻击者从Web应用进来的,auth.log里不会有记录,需要看Web日志。


第三步:分析Web日志

如果服务器跑着网站,攻击者可能通过Web漏洞进来(上传webshell、SQL注入、RCE)。

bash

# Nginx access.log
grep -E "\.php|\.jsp|\.asp" /var/log/nginx/access.log | grep -E "POST|GET" | awk '{print $1, $4, $7}'

# Apache access.log
grep -E "\.php|\.jsp|\.asp" /var/log/apache2/access.log | awk '{print $1, $4, $7}'

goaccess实时分析Web日志(工具地址:https://goaccess.io):

bash

goaccess /var/log/nginx/access.log -o /tmp/report.html --log-format=COMBINED

重点关注几个方面:

  • POST请求异常:攻击者上传webshell时通常用POST
  • URL异常:访问不存在的php文件,或者带?cmd=?id=参数
  • IP聚集:某个IP对/wp-admin//uploads/的大量请求
  • 响应码:大量404说明在扫描路径,200但有异常payload

找到可疑请求后,记录IP、请求时间、URL、User-Agent。


第四步:分析进程和网络连接历史

攻击者入侵后通常会跑恶意进程,向外连矿池或C2服务器。但如果清理了进程,怎么看?

bash

# 查看被删除但仍在运行的进程(隐藏进程)
ls -l /proc/*/exe 2>/dev/null | grep deleted

# 查看系统日志里的网络连接记录
grep -i "connection" /var/log/syslog | grep -E "ESTABLISHED|LISTEN"

工具推荐rkhunter扫描rootkit,chkrootkit检测后门。地址:https://rkhunter.sourceforge.net

bash

sudo apt install rkhunter -y
sudo rkhunter --check

第五步:分析定时任务

攻击者为了持久化,会在crontab里加定时任务,定期下载木马或反弹shell。

bash

# 查看所有用户的定时任务
for user in $(cut -f1 -d: /etc/passwd); do echo "### $user ###"; crontab -u $user -l 2>/dev/null; done

# 查看系统定时任务
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
ls -la /etc/cron.weekly/

常见恶意定时任务特征:wgetcurl从陌生域名下载脚本,bash -c执行base64编码的命令,/tmp/下的可执行文件。


第六步:分析历史命令

攻击者登录后执行的命令会记录在历史文件里。

bash

cat /root/.bash_history
cat /home/*/.bash_history

搜索关键词:wgetcurlchmodnohupscreentmuxbase64/tmp

攻击者可能已清空历史文件(history -c或直接删文件),看不到不代表没发生过。检查.bash_history文件本身是否被删除或篡改。


第七步:检查系统文件完整性

aidetripwire,但前提是攻击前就装好了。如果没有,可以对比软件包文件校验和。

bash

# Ubuntu/Debian
dpkg --verify

# CentOS/RHEL
rpm -Va

输出里S表示文件大小变化,M表示权限变化,5表示MD5变化。重点关注/bin/sbin/usr/bin/usr/sbin,攻击者可能替换lspsnetstat来隐藏自己。


溯源后做什么

  1. 堵住漏洞:改密码、更新软件、修复Web漏洞
  2. 加固系统:禁用root登录、改SSH端口、装fail2ban
  3. 重装系统:不确定是否清理干净,备份数据,重装
  4. 保留证据:日志、木马样本存下来,必要时交给安全团队分析

真实案例

一台WordPress网站被黑,首页被篡改。查Web日志,发现某个IP在凌晨3点对/wp-admin/admin-ajax.php发起了大量请求,然后上传了shell.php。检查该插件版本,发现一个已知RCE漏洞未修复。溯源后,升级插件、删除后门、清理日志,再也没被黑过。

如果只看木马不清漏洞,下次攻击者换个脚本还会进来。


工具汇总

工具用途地址
goaccessWeb日志分析https://goaccess.io
rkhunterRootkit扫描https://rkhunter.sourceforge.net
chkrootkit后门检测http://www.chkrootkit.org
aide文件完整性检查https://aide.github.io

最后一句

溯源不是为了抓黑客,是为了知道洞在哪。找到攻击入口,堵上它,才算真正处理完一次入侵事件。

下次服务器被黑,清理完木马先别急着收工。花半天时间翻日志、找入口。不知道他怎么进来的,明天他还会从同一个地方进来。

日志是你的黑匣子。它记下了所有事情,只等你去读。

知识库

WebSocket连接不上?Nginx反向代理配置解析

2026-6-2 16:07:58

知识库

服务器性能压测全流程:从脚本到报告

2026-6-3 14:53:28

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧