服务器突然风扇狂转,CPU占用率飙到100%,SSH登录卡顿,这些现象十有八九是遇上了挖矿木马或者恶意进程。处理这类问题不能只靠杀毒软件一扫了之,必须从进程链、网络连接、持久化机制三个维度同时下手,才能彻底清除威胁。
排查异常进程的第一步不是敲top命令,而是先确认你的ps、top、lsof这些基础工具是否被替换。攻击者拿到root权限后,第一件事就是替换系统命令,让你看不见恶意进程。执行 rpm -Va 或者 debsums 做完整性校验,如果发现 /bin/ps、/usr/bin/top 等文件校验失败,说明系统已被深度入侵,此时应该立即隔离服务器,从备份恢复,而不是继续在受污染的环境里排查。
确认基础工具干净后,用 ps auxf 查看进程树。注意看父子进程关系,正常的系统进程都有明确的父进程,比如systemd或者内核线程。如果看到一个进程的父进程ID是1但名字看起来像随机字符串,或者父进程是一个已经退出的短暂进程,这通常是恶意进程的特征。重点观察进程名带有空格、特殊字符、或者伪装成系统进程但路径不对的情况,比如 /tmp/.X11-unix/ 目录下运行的进程。
深入分析可疑进程的运行时信息找到可疑进程PID后,不要急着kill,先收集证据。cat /proc/[PID]/cmdline 查看启动命令,注意cmdline可能被伪造,所以还要看 /proc/[PID]/exe 指向的实际可执行文件路径,以及 /proc/[PID]/cwd 当前工作目录。用 lsof -p [PID] 列出该进程打开的所有文件和网络连接,恶意进程通常会打开一个到外部IP的持久连接。查看 /proc/[PID]/environ 获取环境变量,有些恶意程序会把加密密钥或C2服务器地址藏在环境变量里。
网络连接反向定位异常进程很多情况下,异常进程会隐藏进程名但无法隐藏网络连接。用 netstat -antp 或 ss -antp 查看所有TCP连接,重点关注状态为ESTABLISHED且目标端口为高端口或非标准端口的连接。如果发现连接到一个陌生IP的4444、5555、6666、7777、8443、14444这类端口,基本可以确定是反弹shell或C2通信。拿到目标IP后,用 whois 查询IP归属,如果是境外VPS服务商的IP,嫌疑更大。然后用 iptables 临时封禁该IP,阻断通信后再清理进程,防止攻击者在清理过程中反扑。
定时任务与自启动项排查杀掉进程只是临时止血,攻击者通常已经布置了持久化机制。检查以下位置:
/var/spool/cron/ 目录下所有用户的crontab,特别注意root和www-data这类高权限用户。用 crontab -l -u [用户名] 逐一检查。攻击者喜欢用 */1 * * * * 这种每分钟执行的频率来维持恶意进程存活。
/etc/crontab 和 /etc/cron.d/ 目录,很多挖矿木马会把脚本藏在这里,文件名伪装成系统任务,比如 sysstat、ntpdate、sendmail 等。
/etc/rc.local、/etc/init.d/、/etc/systemd/system/ 这些开机启动路径,检查是否有可疑的service文件。用 systemctl list-units --type=service --state=running 列出所有运行中的服务,逐一核实服务名和对应的二进制文件路径。
动态链接库劫持检测高等级的攻击会使用LD_PRELOAD劫持系统调用,让你用常规工具根本看不到恶意进程和文件。检查 /etc/ld.so.preload 文件内容,如果里面有指向 /tmp/、/var/tmp/、/dev/shm/ 等可写目录的.so文件,说明系统被动态库劫持。用 cat /etc/ld.so.preload 查看,然后用 strace 跟踪可疑进程的系统调用,如果发现 connect、sendto 等网络系统调用被重定向,就能确认劫持行为。清除方法是先注释掉ld.so.preload里的恶意库路径,然后重启相关服务。
内存马与无文件攻击排查现在越来越多的攻击采用无文件方式,恶意代码直接驻留在内存中,磁盘上找不到任何文件。这类攻击通常通过Web应用漏洞注入,比如Java内存马、PHP内存马。排查方法是检查进程的内存映射,cat /proc/[PID]/maps 查看是否有匿名可执行内存段,权限为rwx的匿名映射很可疑。用 gdb 或者 /proc/[PID]/mem 做内存dump分析,但这对技术要求较高。更实用的方法是用 curl 请求Web应用的关键路径,观察响应头中是否有异常的Set-Cookie或者额外的脚本内容,同时检查Web服务器日志中是否有异常的请求模式。
使用自动化工具辅助排查手动排查效率低且容易遗漏,可以配合专用工具。chkrootkit 和 rkhunter 是经典的rootkit检测工具,能扫描已知的恶意软件签名和异常文件。安装后执行 chkrootkit -q 和 rkhunter --check,注意这两个工具需要定期更新病毒库。对于挖矿木马,可以用 clamav 做全盘扫描,重点扫描 /tmp、/var/tmp、/dev/shm 这些临时目录。还有一个实用技巧是用 find 命令查找最近被修改的可疑文件:
find / -type f -name "*.sh" -mtime -3 2>/dev/null | grep -v "/usr\|/lib\|/etc" find / -type f -perm -4000 -o -perm -2000 2>/dev/null | grep -v "/usr\|/bin\|/sbin"
第一条命令查找最近3天修改的shell脚本,排除系统目录;第二条查找所有SUID和SGID文件,攻击者经常设置SUID权限来提权。
安全处置与系统加固确认恶意进程和文件后,处置顺序很重要。先阻断网络,用 iptables -P OUTPUT DROP 临时禁止所有出站流量,然后添加白名单规则允许必要的服务通信。接着用 kill -9 终止恶意进程,删除恶意文件和定时任务。注意删除前用 chattr -i 去掉文件的不可变属性,攻击者经常用 chattr +i 锁定恶意文件防止被删除。清理完成后,检查 /etc/passwd 和 /etc/shadow 是否有新增的异常账户,检查 /root/.ssh/authorized_keys 和 /home/*/.ssh/authorized_keys 是否有攻击者留下的公钥。
系统恢复后必须做安全加固。修改所有账户密码,尤其是root和数据库账户。更新SSH配置,禁止密码登录改用密钥认证,修改默认端口。用 systemd 或 supervisor 管理服务进程,限制进程的资源使用,比如用 cgroup 限制CPU和内存上限,这样即使再次被植入挖矿程序,也不会把服务器资源耗尽。配置 auditd 审计系统关键文件和目录的变更,当 /etc/crontab、/etc/ld.so.preload 等敏感文件被修改时能及时告警。
最后一步是溯源。分析恶意进程连接的C2服务器IP,查看Web访问日志中攻击者上传恶意文件的请求,找到最初的入侵点。常见入口包括:Web应用漏洞(如Struts2、Log4j、Fastjson反序列化)、Redis未授权访问、Docker API未授权访问、SSH弱口令爆破。只有堵住源头,才能避免清理后再次被入侵。如果无法确定入侵点,建议重装系统并从干净的备份恢复数据,不要抱有侥幸心理。
