尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

挖矿木马排查与应急响应:从CPU异常到彻底清除的实战指南

挖矿木马排查与应急响应:从CPU异常到彻底清除的实战指南 上周处理了一起服务器告警客户语气很急“这台机器CPU卡在97%已经三天了业务没涨啊你们帮我看看。”我登上去习惯性先敲了top结果屏幕上的数字有点意思负载高得吓人用户态CPU占用却是0.0%。再一看/proc里的进程树好家伙熟悉的陌生名字又出现了。这不是第一次遇到挖矿木马也不会是最后一次。挖矿木马这玩意儿跟踪了这么多年我的感觉是它在黑产圈里已经成了“硬通货”。不管你是搞Linux运维、管容器集群还是刚入行做安全应急迟早会在某台机器上撞见它。尤其是2025年云原生环境越来越普及攻击者的打法也在翻新今天这篇就把我这些年在一线踩过的坑、拆过的样本、清过的东西一次性盘清楚。内容尽量写得通俗从原理到家族盘点到手把手排查处置争取让零基础的朋友看完也能上手。1. 先弄清楚挖矿木马到底是什么玩意儿1.1 挖矿木马的核心逻辑挖矿木马本质上做的事情特别“单纯”未经你同意偷偷占用你服务器上的CPU、GPU资源去算哈希、挖加密货币算出来的币进攻击者的钱包。代价是你的电费、带宽、服务器寿命收益是别人的。这个过程里最常用的币是门罗币XMR因为它抗ASIC矿机、算法对普通CPU友好而且交易匿名性强追踪起来很费劲。偶尔也有挖以太坊或其它币种的但主流还是门罗币。打个比方你就明白了有人悄悄溜进你家把你家的空调、烤箱、微波炉全部开着24小时不关你月底收到电费单一脸懵他还拿走了所有做好的饭菜。服务器被植入挖矿木马就是这么个感觉。一个完整的挖矿木马攻击链通常是这样的有漏洞或者弱口令的入口 → 攻进去执行一段下载脚本 → 脚本拉下来矿工程序和持久化组件 → 伪装隐藏进程、清理痕迹 → 连接矿池开始算力输出 → 收益进入攻击者钱包。很多挖矿木马还会做二次横向传播比如扫描内网其它机器的Redis、SSH、Weblogic把同一套操作复制到更多机器上。1.2 2025年挖矿木马为什么还这么猖獗你可能觉得比特币都减半过好几轮了挖矿这事儿应该降温了吧实际恰恰相反。从威胁情报和应急响应案例来看2025年挖矿木马不仅没退场反而在某些场景下是入侵事件里的头号目的。原因也不复杂。第一币价有波动但黑产眼里成本是零。正规矿工要买矿机、租矿场、交电费黑产直接偷你的算力毛利无限大。第二暴露面变大了。以前主要是裸奔的Linux服务器被挖现在容器、Kubernetes、Docker API、云数据库实例全都成了入口。很多团队上了云原生安全意识却没跟上默认口令、暴露的2375端口、未鉴权的Redis分分钟变成矿工的提款机。第三挖矿木马本身也在进化。现在的样本普遍带反调试、反沙箱、进程伪装、Rootkit等对抗手法有的甚至会主动清除同行的矿马把算力独占。说白了黑产之间都在内卷。2. 2025年活跃挖矿木马家族盘点下面这些家族是我在实际处置和公开情报里见得比较多的列出来给大家做个“通缉令”式的参考。别指望靠这个清单穷尽所有变种但认识他们你一眼就能认出矿马的“路数”。2.1 Kinsing容器环境里的老熟人Kinsing是实在绕不开的一个。它已经活跃好几年了2025年依然经常出现在告警平台上尤其是云原生环境。Kinsing的攻击路径很典型先打暴露的Redis、PostgreSQL、Docker API拿到执行权限后迅速下载恶意脚本落地再通过crontab和systemd服务做持久化。很多运维朋友第一次见到Kinsing是在/tmp或者/var/tmp下看到一个叫kinsing的可执行文件。这个名字它不藏不躲就明晃晃摆在那里。它的脚本还会做一件事把机器上其它挖矿木马挖的矿池钱包地址进程杀掉业内叫做“清理竞争对手”而且会在系统里留下自己的标识文件。另外它还喜欢把SSH的authorized_keys替换掉方便后续随时回连。在云环境里Kinsing还会尝试卸载安全软件、停掉云盾相关进程。处理Kinsing时别只盯着/tmp下的文件要全面检查crontab、systemd服务、SSH信任关系缺一个都可能被回马枪。2.2 8220 Miner Group内网渗透的老手8220是一批长期活跃的挖矿团伙的统称名字源于安全厂商跟踪到的编号。他们最擅长批量利用公开的漏洞比如Log4j2、Weblogic反序列化、Confluence OGNL注入这些入侵成功后直接拉矿机。8220的矿机程序经常伪装成内核线程的名字比如kthreaddk、kworkerd、ksoftirqd初看ps输出你会以为是系统内核线程不会细看。实际上你只需要执行ps -ef对比一下线程名和真实进程路径或者检查/proc/PID/exe就能发现猫腻。他们的横向手法也很系统扫描内网SSH弱口令、抓历史SSH密钥、扫云厂商metadata接口拿临时凭据。所以说一台机器中了8220它绝对不只是“这一台”的事内网里的其它Linux主机都要一起排查。2.3 BillGates老牌僵尸网络与挖矿混合体BillGates也叫“病猫”是Linux平台上非常有“年代感”的矿马/DDoS僵尸网络了。它的二进制编译产物里常带有“BillGates”字符串也有变种叫El Moe。这东西不纯粹是挖矿它先是一个DDoS僵尸网络后来加了挖矿模块变成混合体。传播途径还是那老三样SSH爆破、Redis未授权、Web漏洞。但BillGates在对抗检测上有一手会用Rootkit隐藏进程常见的有svch0、rctl之类的进程伪装有些变种还能通过修改内核模块来拦截系统调用让你查不到它的进程和文件。这种老家族企业内网里非常常见因为很多老服务器几年都不重装一下清了又回来。遇到BillGates家族我通常建议不要恋战如果业务允许就备份数据重装系统不要指望凭一己之力把Rootkit清干净。2.4 Hadooken与云原生供应链投毒Hadooken是前两年被安全厂商重点追踪的新兴挖矿木马家族名字出自《阿拉丁》里的角色。它主要感染Oracle WebLogic这类中间件也会借云环境里的应用入口扩散。落地后释放挖矿程序同时还有一个“横向”模块会尝试通过SSH口令、已知私钥向其它主机蔓延。更值得关注的是供应链投毒趋势。现在的云原生开发流程里开发人员会从公共镜像仓库拉取镜像或者直接用别人发布的应用包。攻击者会往这些渠道里塞带矿马的镜像和包等你自己去装。有的恶意镜像甚至伪装成知名数据库、消息队列的官方镜像如果不校验哈希很容易中招。这类投毒型矿马有个特点它不需要“攻破”你是你亲手把它请进来的。所以排查的时候光查漏洞没用要回头看看近期拉取的镜像、安装的第三方包把来源捋一遍。2.5 Go语言变种跨平台埋伏圈这几年Go语言写的挖矿木马肉眼可见地增多典型代表就是圈内常说的“快Go”FastGo家族。Go语言交叉编译太方便了一份代码能出Linux、Windows、ARM、MIPS多个平台的版本直接覆盖服务器、PC、路由器、摄像头各种硬件。快Go家族除了挖矿还会从网盘类地址下载一堆攻击工具扫描内网Windows主机植入挖矿模块。因为它体积小、依赖少、字符串有混淆杀软查杀率普遍不高。IoT设备和国产ARM服务器尤其要小心很多管理员觉得“这破设备谁会黑”实际上挖矿木马最爱的就是这种没人管的小机器跑得慢但量大积少成多。为了看着方便我把这几个家族的要点整理成一个速查表格家族/团伙常见入口典型特征处置要点KinsingRedis未授权、Docker API、PostgreSQL/tmp/kinsing、清理同行矿池、替换SSH密钥全面清cron、systemd、SSH信任关系8220 Miner GroupWeb漏洞、SSH爆破、云凭据矿机伪装成kthreaddk、kworkerd内网全量排查检查云上凭据BillGatesSSH爆破、Redis未授权Rootkit隐藏、DDoS模块、svch0等建议重装系统别硬清HadookenWebLogic、云应用入口释放矿机SSH横向模块查中间件漏洞排查横向范围Go木马家族多样包含供应链投毒跨平台、字符串混淆、网盘下载工具排查近期第三方软件来源镜像哈希校验3. 挖矿木马的攻防对抗为什么有时杀毒软件查不出来很多人不理解为什么明明感觉机器有问题杀毒软件全盘扫描也报不出东西这就要聊到挖矿木马的隐藏手段了了解了这些你才能知道手工排查该怎么使劲。3.1 挖矿木马常见的“障眼法”第一个是进程伪装。最简单的一招是把进程名改成sshd、java、nginx或者更直接的把可执行文件就叫/usr/bin/sshd利用运维人员“进程名看起来正常就懒得看”的心理。高级一点的用prctl这类系统调用把进程的comm字段改成[kworker]这种内核线程格式让top显示出一堆“合法”的内核线程实际全是矿工进程。第二个是LD_PRELOAD劫持。这是Linux平台很经典的隐藏手法恶意动态库被写入/etc/ld.so.preload然后拦截readdir、stat、open这些系统调用。结果就是ls看不到恶意文件ps看不到恶意进程top看不到高CPU。系统自带工具全成了“睁眼瞎”你以为机器没毛病其实它在疯狂挖矿。第三个是Rootkit。更激进的方式是直接替换或者挂钩内核模块在更底层拦截系统调用。到了这个级别光靠常规杀毒基本没法发现必须借助专门的内核检测工具或者干脆用live CD启动一套可信环境再查。第四个是清理痕迹与反沙箱。很多样本会检测自己是不是跑在虚拟机、容器、沙箱里发现不对劲就进入休眠还会主动清空bash_history、删日志、关闭防火墙。你上机去排查的时候不仅看不到入侵过程连它出口连的是哪个矿池IP都可能查不到。3.2 零基础手工排查的四步法不依赖EDR、不依赖商业工具就靠终端命令行我们也能定位大多数普通挖矿木马不含Rootkit那种顶级隐藏。第一步看异常负载。uptime看负载mpstat -P ALL 1看各核使用率pidstat 1看实时的进程CPU排名。如果总CPU高但top里找不到对应进程先怀疑LD_PRELOAD劫持或者Rootkit。第二步查隐藏文件与进程真相。执行ps -ef列全部进程重点看/proc下每个进程的真实信息ls -l /proc/PID/exe能看到执行文件真实路径cat /proc/PID/cmdline看完整启动参数。随便一个进程名伪装这一步就会露出马脚。第三步排查断点与定时任务。crontab -l、cat /etc/crontab、ls /etc/cron.d/、ls /var/spool/cron/全过一遍。然后是systemd服务命令是systemctl list-unit-files --stateenabled再配合systemctl cat 服务名看启动命令。第四步检查预加载和最近的文件。cat /etc/ld.so.preload一定要看正常服务器这个文件是不存在的。然后按时间戳找可疑文件find / -mtime -3 -type f \( -name *.so -o -perm -111 \) 2/dev/null | grep -v -E ^/(proc|sys|dev)重点看/tmp、/var/tmp、/dev/shm、/usr/lib这些目录。这一套走下来正常情况下能定位到80%的挖矿木马。剩下的那20%通常就是用了Rootkit硬刚你的下面实战部分再讲。4. 实战一台服务器被“挖”之后完整处置流程说一万句理论不如走一遍处置。下面用的是我实际应急里很常见的一个场景CentOS 7服务器Tomcat应用暴露在公网内网SSH互通安全组策略放得宽。报警信息是CPU持续告警业务响应变慢。4.1 第一眼验证“看不见的CPU占用”上机第一步先跑htop或top。真实情况是CPU占用显示很高但进程列表里没有对应进程。这时候别慌手动验证一下执行cat /proc/loadavg看负载执行mpstat -P ALL 1 3看是不是每个核都在忙。看到整体CPU高、用户态低就说明有东西在内核态干活比如Rootkit或者内核模块。为了进一步确认我执行了perf top屏幕上出现了几个在/proc/kallsyms里查不到源的可疑内核符号基本确定中了内核级隐藏。另一个辅助判断是/proc/modules里面出现了名字很随机、类似xxxxxxxx.ko的模块配合lsmod确认模块加载状态。模块时间是最近的这就跑不了了。4.2 锁定恶意程序和Rootkit载体虽然ps看不见但/proc目录里是藏不住的。我直接遍历/proc/[0-9]*/逐个看/proc/PID/status里的Name字段对比ps -ef的输出。找了一圈发现有几个PID的Name被改成了[kworker]但它们的父进程是1init而且/proc/PID/exe指向的是/usr/lib/...下的一个随机名字的so文件。这种“执行文件是so文件”的怪象基本就是恶意动态库被当作进程拉起来了。接着检查/etc/ld.so.preload里面确实被写入了那个so文件路径。到这一步为什么系统工具全部“失明”就解释清楚了ls、ps、top在启动的时候都会经过LD_PRELOAD加载这个so所有“敏感”文件都被它过滤掉了。4.3 清理顺序比清理本身更重要很多人一上来就kill -9然后删文件结果刚删完一刷新进程又活了。原因是持久化没断系统服务或者定时任务会立刻重新拉起。正确顺序是先断持久化再断网络最后杀进程、删文件。我当时做了四步处理第一步清理定时任务。crontab -l里果然有一条每分钟执行的恶意下载任务指向一个陌生的URL。我用crontab -r清掉当前用户的还检查了/etc/cron.d/、/var/spool/cron/把那几个恶意脚本文件也删了。第二步清理systemd服务。执行systemctl list-unit-files --stateenabled找到一个名字类似系统服务的unitsystemctl cat看到ExecStart是那个恶意so路径。执行systemctl disable 服务名再删除/usr/lib/systemd/system/下的恶意unit文件。第三步切断矿池通信。先从ss -antp里找到外联的IP和端口然后临时用iptables drop掉这些IP的进出流量。当时矿池连的是境外IP端口是443伪装成HTTPS流量单看端口根本分不清。这一步是为了防止它在清除过程中继续外传数据或者拉新指令。第四步处理LD_PRELOAD。先把/etc/ld.so.preload清空然后杀掉恶意so对应的进程最后删掉恶意so文件。清空LD_PRELOAD之后系统工具就恢复正常了再用ps能看到之前被隐藏的进程再用ls能看到恶意文件。这四步做完CPU马上回落到正常水平。但是注意如果确认是Rootkit级别有内核模块驻留我的建议完全不同别在运行的系统里反复折腾了直接备份业务数据、重装操作系统然后把业务部署流程规范化。因为内核态已经被攻破你很难保证清干净攻击者可能在某个固件里、某个引导项里留有后门。4.4 止血与加固不清完不准上线清除之后别急着宣布“搞定”还有一整套收尾动作。必须做修改所有账号密码root、应用账号、数据库账号包括内网其它主机的SSH口令。清理SSH信任关系删除~/.ssh/authorized_keys里不认识的公钥、清理/root/.ssh/known_hosts里的可疑记录。关闭无用公网端口通过安全组策略收口只保留业务必须的端口并且限制来源IP。修复入口漏洞Tomcat版本升级、Redis加密码并绑定内网、Docker API不要裸暴露。部署日志外发把所有服务器的auth.log、syslog统一收集以后出了事能溯源。检查内网横向凡是那台机器能连到的Linux/Windows主机都要做过一遍同样的排查宁可错杀不可漏过。很多人处置完就结束了忘了第三点结果过了两周另一台机器又被挖了。挖矿木马很少只“毒”一台机器它一定会尝试横向扩散。5. 常踩的坑与排查技巧实录5.1 五个让人捶桌的坑第一个坑先杀进程后清持久化。这是新手最常犯的。杀完进程定时任务1分钟后又给你拉起来你还在奇怪“怎么杀不死”。记住持久化是根进程是叶先除草再砍枝。第二个坑只查/tmp以为清完就结束了。恶意文件不只是/tmp还会在/var/tmp、/dev/shm、/usr/lib、/lib、/opt、甚至/boot里。有些攻击者会故意把文件名伪装成.so、.log你得建立文件时间戳的概念哪个文件最近动的哪个就可疑。第三个坑不查内网横向。前面反复强调挖矿木马普遍带扫描爆破模块。你清完这台隔壁几台可能早就中招了只是还没爆发而已。等它们爆发你会发现之前白忙活。第四个坑用带病系统里的工具查带病的系统。如果中了LD_PRELOAD劫持你用系统自带的ps、top、ls看到的一切都可能被“过滤”过。遇到这种情况用stat、/usr/bin/busybox这种静态编译工具或者挂载一个干净的救援系统结果才可靠。第五个坑觉得“就是费点电而已”。挖矿木马只是表象它背后往往有完整的攻击链。能进来挖矿就能进来读数据、装后门、勒索你。处置时一定要把这个问题当成完整入侵事件来看别自己安慰自己。5.2 “三板斧”速查命令清单把上面讲到的内容浓缩成一段可以直接抄走的排查命令清单遇到情况照着走就行# 1. 看整体负载 uptime mpstat -P ALL 1 3 # 2. 看进程注意对比/proc真实信息 ps -ef pidstat 1 5 for pid in /proc/[0-9]*; do echo $pid: $(cat $pid/comm 2/dev/null) - $(readlink $pid/exe 2/dev/null); done | grep -v -E /(usr/bin|bin|usr/sbin|sbin|systemd|kthreadd) # 3. 看网络连接 ss -antp | grep ESTAB lsof -i -n -P 2/dev/null | grep -v -E (nginx|java|mysql|sshd) # 4. 看定时任务与系统服务 crontab -l ls -la /etc/cron.d/ /var/spool/cron/ systemctl list-unit-files --stateenabled | head -50 # 5. 看预加载与启动项 cat /etc/ld.so.preload ls -la /etc/rc.local /etc/profile.d/ /root/.bash_profile # 6. 找最近新增的可疑文件 find /tmp /var/tmp /dev/shm /usr/lib /lib -mtime -7 -type f -perm -0002 -o -type f -mtime -7 -name *.so 2/dev/null这套命令不需要装任何东西纯终端就能跑。遇到不懂的进程记住一个原则查它的exe、cmdline、启动时间、网络外联四件套基本就能断案。5.3 排查技巧如何快速识别“伪装者”最后再分享几个不太常见但很实用的识别技巧一是看进程树结构。正常系统里所有进程都是从systemd或者init一路fork出来的父进程关系清晰。挖矿木马往往被crontab拉起来父进程是crond或者被systemd拉起来父进程是1但它的子进程会有一堆奇怪的后代。看到某个陌生进程下面挂了好几个挖矿子进程直接锁定。二是看启动时间。挖矿木马会在入侵那一刻才启动所以进程的启动时间往往非常“巧”正好对应攻击时间。用ps -o pid,lstart,cmd -p PID一看便知。三是看CPU亲和性。很多矿工会把CPU绑定到所有核心上以榨干性能比如taskset -pc 0-31。正常的应用很少这么干。如果你发现某个进程的CPU affinity是全核而且CPU占用时高时低大概率就是矿机。四是看钱包地址。矿池通信虽然有些会走加密但很多老样本还是明文HTTP直接在日志或者流量里能看到wallet字段。那个以4开头的一长串字符串就是门罗币钱包地址可以作为溯源线索。6. 说几句掏心窝的话跟挖矿木马打了这么多年交道我的体会是它其实是所有恶意软件里“最不藏着掖着”的一种因为它必须消耗大量CPU资源才能产生收益这个物理特征是藏不住的。只要你认真看负载、看进程、看外联它基本都会现形。怕就怕你看不见、看不懂、或者看见了不当回事。我现在的习惯是给每台服务器提前做一份“干净基线”装完系统、部署完业务后立刻把关键二进制的MD5/SHA256记录下来把开放端口、登录方式、定时任务全部归档。等到怀疑被入侵的时候拿基线一对比三分钟就能定位异常。这招比任何扫描工具都可靠。另外想多说一句处理这类问题心态要稳。挖矿木马清不干净是常态因为持久化手法太多了cron、systemd、rc.local、profile.d、LD_PRELOAD、内核模块、SSH公钥哪一环漏了都会复活。如果你不想陷入“杀完又长、长了又杀”的循环最好的办法是重装系统、规范基线、收紧暴露面。一次重装远比你反复应急排查十次更划算。这篇内容写到这里该讲的家族、原理、排查、处置、避坑都说透了。如果你按照文章里的方法在一台疑似中招的机器上从头走一遍大概率能自己解决大部分挖矿木马问题。真遇到Rootkit级别搞不定的也别硬扛格式化重装干净利落。
返回列表