
1. 从一台看起来很正常的机器说起驱动人生挖矿木马这个话题我前后跟进过好几次每次处理完都有新的体会。简单说它就是一起典型的正规软件分发链路被污染、静默下发挖矿载荷的安全事件——用户装的是一个天天用的驱动更新工具机器却在你不知情的时候跑起了挖矿进程CPU温度飙升、风扇狂转、笔记本续航腰斩很多人第一反应是电脑老了系统卡了根本想不到是软件本身带进来的东西。这篇内容我想聊的不是某一条新闻而是挖矿木马分析与处置这一整套活儿怎么干怎么在主机上把痕迹翻出来怎么在流量里把它抓住怎么清干净并且让它不再回来。适合谁来读做过一线应急的同学可以把它当成一份可复用的排查清单刚入行的安全运维可以顺着每一步的命令和思路走一遍理解为什么要看这个地方哪怕是普通用户只要看到机器莫名卡顿、风扇狂响也能从里面挑几招自己先摸一遍底。我不会只给你结论重点是把每一步背后的判断逻辑讲透为什么先看进程而不是先删文件为什么流量证据比主机日志更难伪造为什么杀掉进程往往只是白忙一场。在展开之前先定个调子。挖矿木马的处置本质上不是杀毒而是一次小型的事件响应讲究的是证据留存、影响界定、彻底清除、验证闭环这四件事按顺序走。跳过任何一步后面大概率要返工。下面我就按我自己实际处置的节奏一层一层拆开讲。2. 处置前先想明白这类木马为什么难缠2.1 它不是病毒式传播而是供应链投毒很多人对挖矿木马的印象还停留在点了个exe中了毒但驱动人生这一类场景的关键在于载荷是从用户信任的、主动安装的正规软件的更新通道里下来的。这就意味着几件事同时成立——用户不会警觉、杀软的白名单机制容易被绕过、企业内部的软件分发系统可能成了扩散帮凶。我习惯把这类链路分成三个环节来看分发端谁把恶意模块塞进了更新包、落地端载荷在本机怎么落地和守护、外联端算力往哪儿送。分析的时候一定要把这三段分开看因为它们的证据形态完全不一样。分发端的证据在安装包哈希、更新请求日志、下载时间点里落地端在文件系统、注册表、计划任务里外联端在流量、DNS、防火墙告警里。注意判断是不是供应链投毒的核心证据是恶意文件与正常安装包之间的时间戳和路径关系。如果恶意模块的落地时间紧贴软件安装/更新时间且路径就在该软件目录下或其临时目录里基本可以锁定这条链路。为什么要先做这个定性因为它直接决定你的处置范围。如果是普通钓鱼你清理这一台就完事如果是供应链投毒那所有装过这个版本、走过这条更新通道的机器都是潜在受害者你得去拉一份资产清单出来做批量核查。这个判断做错后面就是无限返工。2.2 挖矿木马的真实目标稳、隐蔽、长命普通木马追求的是控制和窃取挖矿木马追求的是稳定产出。这个目标差异导致了它一系列很特别的行为特征理解这些特征排查时才有方向感。它希望活得久所以持久化做得比一般木马更细致它不希望被用户发现所以会想办法限制CPU占用很多挖矿木马会主动设置CPU使用率上限比如只吃50%70%的核避免把机器卡死引起怀疑它会做守护进程被杀了马上拉起来它会做对抗检测到任务管理器或调试工具就暂停挖矿。我第一次遇到的时候就被这个温柔骗过机器只是有点卡CPU占用也就60%上下看着像某个后台服务在跑不像恶意程序那种一口吃满的表现。后来才发现是故意留了余量。所以判断挖矿木马千万别只盯着CPU 100%这个特征那是比较老派的做法了。2.3 处置优先级先隔离还是先取证这是每次都要吵一遍的问题。我的原则是先快速取证再做网络隔离最后动手清除。顺序乱掉会出问题。如果一上来就断网进程可能因为连不上矿池而触发自我保护逻辑比如自杀式删除载荷、抹掉配置文件反而把证据毁了如果一上来就杀进程内存里的东西没了持久化点可能还活着你清不干净。反过来如果只取证不隔离算力还在外送影响面在扩大某些木马还会横向尝试扩散。实操上我一般这样走先用只读方式抓一遍现场进程列表、网络连接、启动项、近期文件几分钟就能完成然后把机器从网络里摘出来拔网线或防火墙阻断再做深度分析和清除。几分钟的取证窗口换来的是后面溯源时的主动权非常值。3. 主机侧痕迹排查Windows上我会按这个顺序翻3.1 第一步永远是进程与网络连接最快的突破口是进程和它对应的网络连接。挖矿木马必须联网才能干活所以谁在连接什么地址是最高价值的线索。我在现场通常会先跑这几条tasklist /v /fo csv proc.csv wmic process get ProcessId,ParentProcessId,Name,ExecutablePath,CommandLine /format:csv proc_path.csv netstat -ano | findstr ESTABLISHED第一条给进程名和会话信息第二条给进程的可执行路径和完整命令行这条最关键很多木马会把真实路径藏在命令行里第三条把连接和PID对应起来。看的时候重点抓三类东西路径异常真正的系统进程路径一定在C:\Windows\System32这类地方。如果看到svchost.exe跑在C:\Users\Public或软件安装目录下基本可以判死。命令行异常挖矿木马的启动参数里经常带矿池地址、钱包地址、--cpu这类参数虽然现在很多会做混淆但特征还是能看出来。父进程异常如果某个挖矿进程的父进程是驱动更新类软件的进程或它的更新服务那链路就清楚了。提示任务管理器里详细信息标签页的命令行列默认是不显示的右键列头把它勾上排查时能省很多事。但注意遇到有对抗能力的样本任务管理器可能被监控优先用命令行方式取证。3.2 计划任务、服务、注册表启动项老三样依然有效持久化是挖矿木马的重头戏Windows上最常见的几个位置我列一下实际排查时按这个顺序过一遍基本不会漏持久化位置查看方式常见特征计划任务schtasks /query /fo LIST /v触发器含登录/开机/空闲动作指向临时目录脚本系统服务sc query type service state all服务名随机化、可执行路径指向用户目录注册表Run键reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run名字伪装成系统组件启动文件夹查看两个Startup目录少见但仍在用WMI事件订阅Get-WmiObject -Namespace root\subscription -Class __EventFilter无文件落地靠WMI触发计划任务这块我踩过坑有样本会把任务名起成Microsoft\Windows\UpdateOrchestrator\...这种看着完全正常的名字藏在系统目录下肉眼扫一遍很容易放过。排查时要看动作而不是看名字动作里如果指向了Users目录下的可执行文件或者一段脚本那就要打问号。服务的话重点看三个属性服务名、显示名、二进制路径。挖矿类服务经常出现显示名是中文描述、路径却在临时目录这种明显错配。还有一种更隐蔽的是通过修改已有合法服务的路径实现持久化这种情况下你得对比服务的原始配置。3.3 冷门但高频WMI订阅与COM劫持如果你把前面几个位置都翻干净了机器重启后还是复发那就要往更冷门的方向找了。WMI事件订阅是挖矿木马很喜欢的一类持久化因为它几乎不落地文件普通杀软容易漏。排查命令Get-WmiObject -Namespace root\subscription -Class __EventFilter Get-WmiObject -Namespace root\subscription -Class __EventConsumer Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding正常的Windows系统里这三者一般是空的或者数量极少。如果看到里面绑定了CommandLineEventConsumer并且命令行指向一段脚本或远程地址那就是它了。另一个方向是COM劫持和AppInit_DLLs这类老手法。老归老但在挖矿场景里依然有人用尤其是配合DLL侧加载。这些都是看着不起眼、清起来很烦的位置建议做成固定清单每次排查都过一遍不要靠记忆。3.4 文件系统与时间线用时间戳串起整条链主机取证的灵魂是时间线。单个文件看不出问题但把落地时间、创建时间、修改时间排一起故事就出来了。我的做法是先圈定一个时间窗口——通常是软件安装或更新的那个时间点前后24小时——然后按修改时间排序找dir /a /s /tc /o:d C:\Users\ file_timeline.txt dir /a /s /tw /o:d C:\ProgramData\ pd_timeline.txt重点关注这几个目录%TEMP%、%APPDATA%、%ProgramData%、C:\Users\Public、C:\Windows\Temp。挖矿木马因为要自启动又不能申请系统权限往往就落在这些谁都能写的地方。文件本身也有特征。挖矿载荷经常是体积偏大的可执行文件里面打包了挖矿核心或者是几个文件配合一个加载器、一个配置、一个挖矿本体。配置里通常有矿池地址、钱包地址、worker名。看到这类文本内容直接就是铁证。注意取证阶段尽量用只读方式不要直接打开样本文件更不要双击运行。如果必须分析样本放到隔离环境里做别在生产机上顺手看看。3.5 日志侧的证据安全日志、PowerShell日志、任务计划日志前面几块是现场日志是回放。两者结合才能既知道现在有什么也知道发生过什么。几个我必看的地方安全日志关注进程创建4688和登录事件看有没有异常账号或异常父进程。PowerShell操作日志Microsoft-Windows-PowerShell/Operational挖矿木马爱用PowerShell做下载和执行脚本内容会留在这里。任务计划日志任务注册和启动事件能帮你定位持久化是什么时候建立的。系统日志服务安装事件。日志取证有个现实问题很多机器上PowerShell日志默认没开或者日志被覆盖了。所以如果条件允许在处置前先把日志导出备份尤其是安全日志和PowerShell日志导出成evtx文件留存。这一步花不了几分钟后面要写报告或者做复盘时是救命的。4. 网络侧怎么在流量里把它认出来4.1 Stratum协议挖矿通信的口音主机排查解决这台机器干净不干净流量分析解决它到底把算力送去了哪儿、还有哪些机器在送。挖矿木马和矿池之间最常用的是Stratum协议这是专门为矿池设计的通信协议JSON格式、明文或半明文特征非常明显。如果你能抓到包Stratum的关键特征包括客户端发mining.subscribe、mining.authorize这类方法名服务端返回mining.notify、挖矿难度设置报文里通常能看到钱包地址、worker名。用Wireshark或tcpdump抓一段流量直接搜mining.或者stratum关键字命中率很高tcpdump -i eth0 -A -s 0 tcp port 3333 or tcp port 5555 or tcp port 14444 -w mining.pcap很少数的样本会用TLS把Stratum包一层那就看不到方法名了这时候只能靠连接行为特征目的端口常见3333/4444/5555/7777/14444这类非标准端口、连接持续且心跳规律、单台机器长期保持少量长连接。4.2 DNS和TLS指纹看不见内容时的替代方案很多企业环境里HTTPS流量没法解密这时候DNS就是最好的朋友。矿池域名虽然会做域名生成、频繁切换但总有一些规律请求时间有周期性、同一域名被多台内网主机同时解析、域名本身是随机字符串或明显与品牌无关。我通常会在DNS日志或者镜像流量里做两件事一是按解析频次排序看有没有某个陌生域名被几十台机器反复请求二是按时间聚合看有没有整点在批量请求的情况很多木马有心跳或重连的固定节奏。TLS层面可以看JA3指纹。同一批挖矿样本的TLS指纹往往是一致的因为用的是同一套库和同样的配置。当你从某台机器上提取出可疑样本后算出它的JA3再拿这个值去全网流量里搜能快速找到同源感染的机器。这个思路在批量处置时特别有用。4.3 热点预警与告警联动企业里一般有防火墙、终端防护、威胁情报几套系统处置这类事件时要把它们串起来用。威胁情报的价值不在于检测到了而在于告诉你还有谁在同一条链路上样本哈希、恶意域名、C2地址这些IOC下发到防火墙和终端可以快速做全网普查。实际联动时我建议先做两件事一是把本次事件提取出IOC矿池域名、样本哈希、持久化文件路径二是把IOC同时下发到流量侧和主机侧做历史回溯。历史回溯经常能挖出三个月前就已经中招的机器——那些才是真正的大头因为新告警往往只覆盖最近一段时间。提示防火墙告警从某IP访问了可疑矿池地址这种单点告警升级到某主机多次访问同一批矿池地址集群的聚合视角误报率会明显下降。单次访问可能只是浏览器误触或CDN误判成簇的访问才是真感染。4.4 反查入口从矿池回推到更新服务器溯源的目标是找到第一跳恶意载荷到底是从哪里下来的。这一步的抓手是主机上的下载记录和网络日志的对应关系。我会按这个顺序推先从挖矿进程的父进程和命令行确认它的启动来源再从加载器的配置文件或脚本里找下载地址然后拿这个地址去比对主机侧和网络侧在相同时间点的请求记录。如果请求地址正好是某个软件更新域名且时间点与软件更新事件吻合链路就闭环了。这一步的价值不只是搞清楚怎么进来的更在于确定影响范围。如果入口是某个更新服务节点那所有从该节点更新的客户端都要核查如果入口是一次钓鱼点击那范围就小很多。溯源结论直接决定处置规模这比单纯写个报告重要得多。5. 清除与加固清干净还要不复发5.1 隔离先行取证留档在动手删除任何东西之前把该留的证据留全。我一般会做这几样导出进程列表、网络连接、计划任务、服务列表、启动项的完整快照复制可疑文件到隔离目录计算哈希导出关键日志截取可疑进程的内存如果工具支持。这几步做完再开始清除。很多人图快先删了再说结果复盘时发现什么痕迹都没有报告写不出来也没法验证是不是真清干净了。5.2 按自下而上的顺序清除清除的顺序很重要我的经验是先断持久化再断外联最后删文件。顺序反过来会遇到删了又回来的情况。具体步骤阻断外联防火墙或hosts层面切断矿池地址让挖矿进程失去目标这一步同时能防扩散。清除持久化逐个删除计划任务、服务、注册表启动项、WMI订阅。注意每删一个都要确认删掉某些样本会互相守护删一个另一个给你加回来。终止进程树从最顶层的父进程往下杀不要只杀挖矿本体。杀掉加载器和守护进程防止它重新拉起挖矿。删除文件清理临时目录、软件目录下的恶意模块。注意有些文件被占用时删不掉需要先停掉占用它的进程。重启复验重启后再过一遍前面所有排查点确认没有残留。注意如果发现多个进程互相守护直接杀可能会陷入拉锯。更稳妥的做法是先停掉持久化点让它重启后起不来再一次性结束整棵树然后立即删除文件别给它反应时间。5.3 加固把这条链路的每个环节都补上清除只是把这一台救回来加固才是防止再来一次。针对这条链路我会从三个层面加固软件分发层面企业内部如果有统一的软件分发和更新机制要校验安装包的完整性和签名禁止客户端直接从外部更新通道拉包。这一步能从根本上堵住供应链投毒。主机层面限制普通用户对临时目录、用户目录的可执行权限开启PowerShell脚本块日志和命令行审计把前面提到的持久化位置纳入常态化巡检。网络层面把非标准高端口的出站连接纳入监控尤其是向陌生IP的长时间心跳连接。配合威胁情报做域名和IP的持续比对。这三层里主机层面的审计收益最大因为很多中小环境没有完整的流量可见性但主机日志是现成的把日志开起来、集中收起来就能覆盖大部分场景。5.4 处置库与知识沉淀每次处置完我都会把这次的IOC、排查命令、特殊手法整理成一个可复用的处置包样本哈希、矿池地址、持久化路径特征、对应的清除命令。这样下次遇到同类样本直接导入比对几分钟就能定位不用从头再来。这个习惯我觉得比什么都值钱。安全事件处置最怕的就是每次都从零开始。你手上积累的处置库越厚响应速度就越快判断也越准。可以按样本家族或者按事件类型来组织配合简单的检索工具就够用了。6. 常见问题与排查速查表6.1 高频问题一览现象可能原因排查方向清了又回来持久化没清干净检查WMI订阅、计划任务、互相守护的进程CPU占用不算高但一直有木马设置了占用上限看进程树和外联连接别只看占用率找不到恶意进程无文件落地或注入查WMI、查内存、查加载的可疑DLL网络连接看不到木马用了隐蔽端口或TLS走DNS和TLS指纹路线多台机器同时告警供应链或内网扩散拉资产清单做批量核查任务管理器打不开木马做了对抗用命令行工具取证别依赖GUI6.2 几个我踩过的坑第一个坑只杀进程不查父进程。有一次我杀了挖矿本体机器安静了半天第二天又回来了。后来才发现父进程是一个常驻的软件更新服务它会定期检测并重新拉起挖矿模块。从那以后我养成习惯杀任何东西之前先把进程树理清楚。第二个坑忽视时间线。刚开始我只看现在有什么不关注什么时候来的。结果报告写不清影响范围也不知道是不是还有更早中招的机器。现在我做任何事件都会先画一条时间线把安装、落地、外联、告警这些节点排上去一眼就能看出关联。第三个坑信任白名单。有些样本把恶意模块伪装成正规软件的一部分靠签名或白名单机制绕过检测。所以我会额外看这个文件是不是真的该出现在这个位置它的签名是不是真的有效而不是简单地看到签名就放行。第四个坑取证时动了现场。早期图省事直接在生产机上双击看样本内容结果样本的自我保护直接把配置删了证据没了。这个教训让我记住分析样本永远在隔离环境里做现场只做只读取证。6.3 一点个人体会网络安全事件处置这件事工具和脚本只是辅助真正决定成败的是思路的顺序。先定性再定量先取证再隔离先断持久化再删文件先验证再收工。每一步都问自己一句我这么做会不会把后面的路堵死很多返工都能避免。还有一点别迷信某个一键清除工具。挖矿木马的变种太多持久化手法一直在变工具能覆盖的永远是常见那几种。真正靠谱的是你自己脑子里那份排查清单——从进程到网络、从持久化到日志、从主机到流量按顺序走一遍。这份清单是你自己的谁也拿不走。至于这类事件的处置库和IOC共享我的建议是能沉淀就沉淀哪怕只是记在一个表格里。下次再遇到类似的供应链投毒你能省下的不是几分钟而是一整轮的摸索时间。