
核心要点(TL;DR)
- 先断网留证据再排查,避免攻击者察觉后清除痕迹。
- 进程与网络连接要交叉比对,孤立的外联进程最可疑。
- 定时任务、启动项、SSH公钥是三大持久化重灾区。
- 排查完必须改密码、清公钥、补漏洞,否则会二次入侵。
凌晨收到告警:CPU 跑满、带宽异常、网站被挂马——多数运维的第一反应是重启,但重启往往让攻击者留下的内存马、临时文件与日志线索一起消失。服务器被植入后门后,真正决定处置成败的是排查顺序与证据保全。本文给出一套可直接照做的检测命令与手工排查步骤,覆盖进程、网络、持久化与Web目录四大方向,帮你把后门找出来、清干净。
一、先隔离再取证:排查前的三条纪律
动手前先明确原则,否则越查越乱:
- 限制出站而非直接关机:在安全组或
iptables中封禁异常外联,保留现场; - 保留证据:备份
/var/log/、ps输出、ss结果到外部介质,攻击者常清理auth.log; - 记录时间线:记下发现时间、异常进程PID、可疑文件路径,便于后续溯源。
提示:若怀疑内核级Rootkit,优先做内存镜像,再考虑重启。
二、进程与网络连接:交叉比对找异常
后门要通信,必然留下进程与连接。先看进程树,再看网络:
ps auxf ps -eo pid,ppid,user,etime,cmd --sort=-%cpu | head -20 ls -l /proc/<PID>/exe ss -antp ss -antp | grep ESTAB
判断依据:
- 可执行文件路径位于
/tmp、/dev/shm、/var/tmp或显示(deleted); - 进程名伪装成
[kworker]、sshd但父进程异常; - 对外连接指向陌生IP的高位端口,且无对应业务。
用lsof -p <PID>看打开的文件与套接字,用cat /proc/<PID>/cmdline | tr '' ' '还原真实启动参数。发现可疑进程先kill -STOP而非直接杀,保留现场。
三、持久化排查:定时任务、启动项与SSH公钥
攻击者要长期驻留,通常在这三处下手,逐项检查:
1. 定时任务
crontab -l ls -la /var/spool/cron/ /var/spool/cron/crontabs/ cat /etc/crontab /etc/cron.d/* /etc/rc.local
重点看含curl、wget、base64 -d、/dev/tcp的条目,以及指向隐藏目录的脚本。
2. 启动项与服务
systemctl list-unit-files --state=enabled ls -la /etc/init.d/ /etc/rc*.d/ cat /etc/ld.so.preload
/etc/ld.so.preload非空是典型用户态Rootkit特征,务必核对。
3. SSH后门
find / -name authorized_keys -exec ls -l {} \;
awk -F: '==0{print}' /etc/passwd
grep -v '^#' /etc/ssh/sshd_config核对每条公钥指纹,检查是否有UID为0的新增账户、AuthorizedKeysFile是否被改到异常路径。
四、Web目录与文件完整性:查WebShell与篡改
Web入口是重灾区,按“时间+特征”双维度筛:
find /var/www -type f \( -name '*.php' -o -name '*.jsp' -o -name '*.aspx' \) -mtime -7 find /var/www -type f -perm -o+w grep -rEl 'eval\(|assert\(|base64_decode\(|Runtime.getRuntime' /var/www
再校验系统文件是否被替换:
rpm -Va --nofiles --nodigest debsums -r / 2>/dev/null | grep -v OK
对于混淆马,关键字常被拆分拼接,建议配合静态查杀工具扫描后再人工复核可疑文件。
五、排查清单与处置顺序
| 检查项 | 命令 | 可疑信号 |
|---|---|---|
| 进程 | ps auxf | 路径在/tmp、已删除文件 |
| 网络 | ss -antp | 陌生IP外联 |
| 定时任务 | crontab -l | curl下载执行 |
| SSH公钥 | find -name authorized_keys | 陌生指纹 |
| 文件完整性 | rpm -Va | 系统命令被改 |
处置顺序建议:隔离出站 → 停可疑进程 → 删除持久化(公钥、定时任务、启动项、恶意账户)→ 重置全部密码与密钥 → 升级漏洞应用 → 校验文件完整性。顺序颠倒容易“清了又回来”。
行动建议:把上述命令固化为一键巡检脚本,每周跑一次并留存基线;同时部署文件监控与主机层防护,例如 AegisX 的入侵检测与Web防护能力可对异常进程、WebShell写入与恶意外联做持续告警,把“事后排查”变成“事中阻断”。排查完成后务必复盘入口,确认漏洞已修补,否则二次入侵只是时间问题。
常见问题(FAQ)
服务器发现可疑进程,第一步应该做什么?
先隔离再取证。立即在安全组或防火墙限制出站,保留内存与日志证据,不要急着重启。然后用ps auxf看进程树、ls -l /proc/PID/exe确认可执行文件路径、ss -antp比对监听与外联,重点看路径在/tmp、/dev/shm、隐藏目录或已删除文件的进程。
怎么判断服务器是否被留了SSH后门?
检查authorized_keys与sshd配置。执行find / -name authorized_keys -exec ls -l {} \;查看所有公钥文件及修改时间,核对每一条公钥指纹;再检查/etc/ssh/sshd_config是否有异常Port、PermitRootLogin、AuthorizedKeysFile指向非默认路径,以及/etc/passwd中新增的UID 0账户。
WebShell一般藏在哪些目录,怎么快速找?
优先查上传目录与可写目录。用find定位近期修改的php/jsp文件,如find /var/www -type f \( -name '*.php' -o -name '*.jsp' \) -mtime -7,再结合grep搜索eval、assert、base64_decode、Runtime.getRuntime等特征串。注意混淆马会拆分关键字,需配合静态查杀工具与人工复核。
定时任务和启动项该怎么排查后门?
定时任务是重灾区。执行crontab -l查当前用户,遍历/var/spool/cron/下所有文件,检查/etc/cron.d、/etc/cron.daily及/etc/rc.local;启动项看systemctl list-unit-files --state=enabled与/etc/init.d。陌生脚本、curl下载执行、base64编码命令基本都是后门。
排查完成后还需要做哪些收尾工作?
必须切断持久化并修补入口。删除恶意账户与公钥、清理定时任务与启动项、重置所有账号密码与密钥、升级存在漏洞的应用版本,最后用rpm -Va或debsums校验系统文件完整性,并部署文件监控与WAF持续防护,防止二次植入。