
你发现服务器被黑了。清理了木马,改了密码,重启了服务。但你心里不踏实——他是怎么进来的?还有没有后门?会不会明天又回来?
清理是治标,溯源是治本。不知道入侵路径,你就没堵上漏洞,下次还会来。今天聊几个溯源技巧,从日志里找出攻击者的脚印。
先看一个数据
某安全团队统计,超过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/
常见恶意定时任务特征:wget、curl从陌生域名下载脚本,bash -c执行base64编码的命令,/tmp/下的可执行文件。
第六步:分析历史命令
攻击者登录后执行的命令会记录在历史文件里。
bash
cat /root/.bash_history cat /home/*/.bash_history
搜索关键词:wget、curl、chmod、nohup、screen、tmux、base64、/tmp。
攻击者可能已清空历史文件(history -c或直接删文件),看不到不代表没发生过。检查.bash_history文件本身是否被删除或篡改。
第七步:检查系统文件完整性
用aide或tripwire,但前提是攻击前就装好了。如果没有,可以对比软件包文件校验和。
bash
# Ubuntu/Debian dpkg --verify # CentOS/RHEL rpm -Va
输出里S表示文件大小变化,M表示权限变化,5表示MD5变化。重点关注/bin、/sbin、/usr/bin、/usr/sbin,攻击者可能替换ls、ps、netstat来隐藏自己。
溯源后做什么
- 堵住漏洞:改密码、更新软件、修复Web漏洞
- 加固系统:禁用root登录、改SSH端口、装fail2ban
- 重装系统:不确定是否清理干净,备份数据,重装
- 保留证据:日志、木马样本存下来,必要时交给安全团队分析
真实案例
一台WordPress网站被黑,首页被篡改。查Web日志,发现某个IP在凌晨3点对/wp-admin/admin-ajax.php发起了大量请求,然后上传了shell.php。检查该插件版本,发现一个已知RCE漏洞未修复。溯源后,升级插件、删除后门、清理日志,再也没被黑过。
如果只看木马不清漏洞,下次攻击者换个脚本还会进来。
工具汇总
| 工具 | 用途 | 地址 |
|---|---|---|
| goaccess | Web日志分析 | https://goaccess.io |
| rkhunter | Rootkit扫描 | https://rkhunter.sourceforge.net |
| chkrootkit | 后门检测 | http://www.chkrootkit.org |
| aide | 文件完整性检查 | https://aide.github.io |
最后一句
溯源不是为了抓黑客,是为了知道洞在哪。找到攻击入口,堵上它,才算真正处理完一次入侵事件。
下次服务器被黑,清理完木马先别急着收工。花半天时间翻日志、找入口。不知道他怎么进来的,明天他还会从同一个地方进来。
日志是你的黑匣子。它记下了所有事情,只等你去读。




