服务器CPU突然100%?别慌!手把手教你用top、ps、lsof揪出Linux挖矿木马
凌晨三点,服务器监控突然告警——CPU使用率飙升至100%。这种场景对于运维人员来说,就像医生遇到急诊病人,需要快速诊断病因并采取急救措施。本文将带你走进真实的服务器应急响应现场,用最实用的工具组合快速定位问题根源。
1. 紧急响应:第一时间的正确操作
当CPU使用率异常飙升时,慌乱中很容易做出错误决策。正确的第一步不是立即杀死进程或重启服务器,而是保持现场完整,就像保护犯罪现场一样重要。
关键操作顺序:
- 立即记录当前时间戳:
date +"%Y-%m-%d %H:%M:%S" - 禁用命令历史记录:
unset HISTFILE或export HISTFILE=/dev/null - 创建临时工作目录:
mkdir -p /tmp/forensics && cd $_
注意:不要使用
kill -9强制终止任何进程,这可能导致攻击者设置的守护进程立即启动新的恶意进程。
遇到命令被替换的情况时(比如ps或netstat显示异常),可以这样快速验证:
# 检查命令文件大小是否异常 ls -lh /bin/ps /bin/netstat /bin/ls # 使用busybox获取原始命令输出 busybox top2. 进程排查:从表象到根源
2.1 快速定位异常进程
top命令虽然直观,但在高级攻击场景下可能被干扰。更可靠的组合是:
# 按CPU排序显示完整命令 ps -eo pid,user,pcpu,pmem,cmd --sort=-pcpu | head -n 10 # 检查进程树关系 pstree -pan <可疑PID>典型挖矿进程特征:
- 名称伪装成
kworker、java等系统进程 - CPU占用持续90%以上
- 存在异常子进程链
2.2 深度进程取证
发现可疑进程后,需要进一步取证:
# 查看进程打开的文件 ls -l /proc/<PID>/fd # 检查进程内存映射 cat /proc/<PID>/maps | grep heap # 提取进程可执行文件 cp /proc/<PID>/exe /tmp/forensics/malware.bin对于注入型恶意进程,可以使用gdb进行内存取证:
gdb -p <PID> -batch -ex 'dump memory /tmp/forensics/mem.dump 0x00007f8c3a2e5000 0x00007f8c3a4e5000' strings -n 8 /tmp/forensics/mem.dump | grep 'http\|wget\|curl'3. 网络取证:追踪C2服务器连接
恶意程序通常会连接外部C2服务器。使用现代Linux系统推荐的替代方案:
# 查看所有TCP连接 ss -tulnp # 检查进程网络活动 nsenter -t <PID> -n netstat -ant # 持续监控异常外连 tcpdump -i eth0 'tcp and (port 3333 or port 5555 or port 7777)' -w /tmp/forensics/packet.pcap挖矿木马常见特征:
- 连接矿池常用端口:3333、4444、5555、7777
- 域名包含
pool、mine、xmr等关键词 - 使用TLS加密通信逃避检测
4. 文件系统痕迹分析
4.1 定位恶意文件
通过lsof结合时间筛选:
# 查找最近修改的可执行文件 find /usr/bin /usr/sbin -type f -mtime -3 -exec ls -lh {} \; # 检查/tmp和/dev/shm ls -la /tmp /dev/shm | grep -E '\.(so|ko|dat)$'4.2 隐藏启动项排查
定时任务检查:
# 检查所有用户的crontab for user in $(cut -f1 -d: /etc/passwd); do echo "==== $user ===="; crontab -u $user -l; done # 查找异常的系统定时任务 ls -la /etc/cron*/* /var/spool/cron/*系统服务检查:
# 列出所有systemd服务 systemctl list-units --type=service --state=running # 检查服务文件修改时间 find /lib/systemd/system /etc/systemd/system -type f -mtime -75. 事后加固与防护建议
确认清除恶意程序后,需要立即进行安全加固:
- 关键命令校验:
# 使用rpm验证系统命令完整性 rpm -Va | grep '^..5'- SSH防护升级:
# 禁用密码认证 sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config # 安装fail2ban apt-get install -y fail2ban || yum install -y fail2ban- 系统监控增强:
# 安装监控agent curl -L https://github.com/netdata/netdata/releases/latest/download/netdata-kickstart.sh | bash # 设置实时进程监控 echo '* * * * * root /usr/bin/ps -eo pid,user,pcpu,cmd --sort=-pcpu | head -n 5 >> /var/log/process_mon.log' > /etc/cron.d/process_mon在最近一次应急响应中,我们发现攻击者通过弱密码爆破入侵后,在/dev/shm下放置了经过混淆的挖矿程序,并修改了/etc/ld.so.preload实现进程隐藏。通过对比正常系统的文件哈希值,最终定位到了被篡改的系统库文件。