☰
测试环境遭Outlaw与魔铲挖矿木马联合入侵的应急复盘
2026/9/30 12:26:28 网站建设 项目流程

凌晨两点半,值班电话把我从床上拽了起来。监控大屏上,数据中心测试网段的一台Linux服务器,CPU负载已经连续15分钟超过90%。我第一反应是夜间批量任务出问题,但远程登录看一眼后,后背就有点发凉:top命令刷出一长串十几位随机字符串命名的进程,占满了几乎所有的核,CPU时间还在疯涨。这台机器是测试数据库,没有任何重负载任务在跑,不存在“正常业务打满CPU”的可能性。中招了,而且是挖矿木马。

当天的处置最终定性为Outlaw僵尸网络与“魔铲”挖矿工具链在银行测试环境中的联合入侵。攻击者先通过SSH爆破获取权限,随后投递了两套彼此独立的挖矿程序,在同一台机器上完成持久化并同时开挖,把CPU彻底打爆。这个过程里既有老生常谈的弱口令问题,也有测试环境被边缘化、安全管控缺失的深层原因。我把这一整次的应急过程、溯源思路、清理步骤和事后反思完整记下来,希望对做安全运营和应急响应的同行有实际参考价值——尤其是那些和我一样,曾经觉得“测试环境而已,影响不大”的人。

1. 事件首发:告警、进程与第一判断

1.1 告警特征:CPU持续走高并非偶然

监控系统发出的告警信息其实很简单:测试网段某台服务器,CPU使用率连续15分钟超过90%,触发“高资源占用”规则。按照日常经验,测试环境偶尔也会有大批量作业把资源跑满,通常持续几分钟就会回落。但这一次不同,曲线非常平稳地贴在90%以上,没有半点波动,明显是有人为控制的持续行为。

登录服务器之前,我先看了一眼监控平台的网络流量数据,发现这台机器存在稳定的TCP外联,目的端口是常见矿池端口,目的IP来自境外。到这里,我心里基本已经给事件定了性:不是批量任务,不是环境Bug,是挖矿木马。远程登录后,top命令给出了更直观的证据——多个随机字符串进程占据了CPU头部位置,单个进程CPU占用率高得离谱,而且进程数量不止一个。

1.2 测试环境为什么会成为目标

很多非安全岗位的同事听说挖矿木马进了银行测试环境,第一反应是“测试环境有什么好挖的?”。这正是安全运营中最危险的认知误区。挖矿木马对目标的价值判断和人类完全不同,它不看数据值多少钱,只看CPU算力够不够、安全门槛高不高、被发现的概率大不大。

测试环境的机器硬件配置通常不差,很多都是和正式环境同规格的设备,CPU性能足够挖矿。更重要的是,测试环境的管控思路普遍宽松,安全设备覆盖不全面,运维人员响应也不及时,即使中招了,攻击者也能安稳地挖上很久。这就像一个安保团队把所有人员都安排在正门,结果小偷发现侧门连门锁都没装。本次事件中的这台服务器,就是一个典型的“侧门受害者”。

2. 攻击链还原:Outlaw与魔铲的联合套路

2.1 Outlaw僵尸网络的典型行为

Outlaw是近年来活跃度较高的挖矿类僵尸网络家族,2018年前后大规模出现,核心目的就是挖门罗币。它的初始入侵手法以SSH弱口令扫描为主,通过对互联网大范围扫描,找到开放22端口且口令薄弱的机器,然后批量尝试登录,成功后投递恶意脚本。

这次事件中发现的Outlaw组件结构与公开分析报告中描述的基本一致:攻击脚本会下载一个内含多个工具的压缩包,落地位置通常在/tmp或者/var/tmp这类容易混淆视听的地方;落地后会立即注册crontab定时任务,确保即使进程被手动清理,过几分钟还会被重新拉起来;同时释放一份SSH后门,让攻击者后续可以随时重新进入。

值得注意的是,Outlaw的旧版本中普遍存在“互杀”逻辑,也就是发现其他挖矿进程就会主动杀掉,以独占CPU资源。但本次这台机器上Outlaw与魔铲的挖矿进程形成了共存局面,说明要么攻击者投放的是同一套工具链,只是新旧组件之间的互杀机制没有生效,要么两个家族分别瞄上了这台机器,只是Outlaw的清理逻辑对魔铲的进程保护没有起作用。无论哪种解释,双挖矿共存的局面都显著增加了处置难度。

2.2 “魔铲”挖矿工具的横向扩散特点

“魔铲”这个名字在安全圈内并不陌生,它本质上是一套高度自动化的挖矿工具集,之所以被叫“铲”,大概是因为它在挖矿这件事上挖得又快又彻底。相比Outlaw偏重口令爆破的做法,魔铲更依赖已知漏洞利用模块进行横向扩散,比如常见的未授权访问漏洞、反序列化漏洞、远程命令执行漏洞等。拿到一台机器后,它会复制自身、修改定时任务、关闭系统安全服务、植入守护进程,甚至会把系统中的安全软件进程结束掉。

本次这台机器上的魔铲组件,特征表现为典型的“下载器+矿工程序+守护脚本”三段式结构。下载器负责从指定URL拉取最新的矿工程序,矿工程序负责连接矿池计算,守护脚本则负责检查矿工进程是否存活,一旦发现被杀就立刻重启。这种三段式结构极大提高了清除难度,只杀掉矿工程序没有任何意义,守护脚本会在一分钟内把它重新拉起来。

2.3 双挖矿叠加带来的真实风险

双挖矿威胁叠加,不是说两台挖矿木马同时运行、CPU多吃点那么简单。它带来的是整个安全运营层面的复杂度提升:

第一,归因困难。两套工具链都有各自的外联IP、配置文件和持久化机制,安全人员需要分别分析,判断哪条才是真正的入侵入口,这比单一挖矿事件要多花好几倍的时间。

第二,证据相互污染。两套工具链都会修改crontab、系统配置和文件时间戳,导致攻击时间线的重建变得非常困难。比如Outlaw改过一遍crontab,魔铲又改一遍,最后留下的定时任务列表可能混杂着两套工具的痕迹,要逐条分辨来源。

第三,被利用的跳板风险。挖矿木马往往携带后门组件,一旦被其他攻击者发现这台机器已经失陷,完全有可能顺着后门进入内网。测试环境虽然隔离等级不高,但往往与正式网段存在运维通道,如果真的被利用,后果就不是多挖几天CPU的问题了。

3. 溯源分析:从日志与样本还原入侵路径

3.1 时间线重建:让攻击过程说话

应急响应的第一步不是杀毒,而是先搞清楚发生了什么。我在现场做的最重要的一件事,就是整理出完整的攻防时间线。主要依据是三类数据:系统登录日志、命令历史、各类文件的创建时间戳。

系统登录日志是最有价值的。这台机器开启了SSH账号密码认证,/var/log/secure日志里记录了所有登录尝试。我按时间顺序提取了其中所有失败记录和成功记录,很快锁定了攻击者的源IP:在感染窗口期内,有一个来自境外IP的账号从凌晨1点23分开始持续尝试登录,分别尝试了root、admin、test等多个用户名,最终在凌晨1点47分通过一个遗留测试账号成功登录。

结合登录成功的时间点,再去翻这个账号的命令历史(.bash_history)和文件系统时间,就能串起整个攻击过程。大致的时间线整理如下:

时间事件
01:23境外IP开始SSH爆破
01:47攻击者通过测试账号成功登录
01:50攻击者下载恶意压缩包到/tmp
01:52解压并执行恶意脚本
01:55修改crontab写入定时任务
02:01挖矿进程启动并外联矿池
02:15监控平台告警触发

3.2 样本静态分析:从脚本看行为逻辑

拿到恶意压缩包和落地脚本后,我没有急着删,先做了一轮静态分析。先用file命令看了一下文件类型,发现是经过UPX加壳的ELF可执行文件,这是挖矿木马最常用的免杀手段之一。加壳可以改变文件特征,让传统杀毒软件的静态特征匹配失效。

真正信息量最大的还是那些shell脚本。把核心脚本用文本方式打开后,逻辑非常清晰:脚本先检测当前用户权限,如果是root权限就继续执行,然后下载远程服务器上的矿工程序,接着检查系统中是否已经存在crontab任务,不存在就写入。脚本里还有一段循环检测逻辑,每隔几分钟检查一次进程是否存活,如果进程被杀死就再次拉起。这段脚本用极简的几行代码完成了一个完整的自我修复闭环,属于比较典型的实战型攻击工具。

在分析过程中我还发现,Outlaw组件带有一个SSH后门文件,它会在系统原有的SSH配置中追加一个特殊配置,允许攻击者通过特定密钥直接免密登录。这意味着即使清理了挖矿程序,只要这个后门没有移除,攻击者随时还能回来。这种后门的隐蔽性极高,不直接检查SSH配置文件很难发现。

3.3 证据保全与处置留痕

在银行环境做应急响应,有一点和其他行业很不一样:证据保全必须做得非常规范。我这次处置的第一步不是清理,而是把所有关键样本复制了一份保存,包括恶意脚本、挖矿程序、crontab导出文件、sshd配置文件和登录日志切片。这些证据不仅用于本次事件的分析,也是后续流程中可能需要提交的正式材料。

每一步操作都记录下来是个好习惯。我在整个处置过程中记录下自己执行过的每一条命令,什么时候杀的进程、删了哪些文件、改了哪个配置,全部留痕。这样做的好处,一是避免误操作导致二次事故,二是后续如果要追责复盘,有据可查。

4. 应急处置与清除整改实操

4.1 断网还是不断:一个被讨论过无数次的决策

很多刚从事故现场回来的同事都会问同一个问题:发现中招了,第一件事难道不是拔网线吗?我的经验是,盲断网在绝大部分场景下都不是最优选择。试想一下,如果你拔了网线,远程登录通道立刻中断,后续取证、分析、清理都只能通过人工到机房操作,效率极低。万一这台机器上还跑着什么业务,断网的影响面会从“一台服务器中病毒”迅速扩大到“业务中断”。

正确的思路是“隔离但保持可控”。我在交换机侧把目标服务器的端口从原有业务VLAN中移出,直接划到一个临时的隔离VLAN,这个VLAN只允许访问安全分析跳板机,禁止访问其他任何机器,同时保留了对公网矿池地址的可见性用于观察外联行为。这样既切断了挖矿木马正常使用带宽的能力,也控制了横向传播风险,又给我们保留了远程分析和取证的通道。整个过程几分钟内完成,远比拔网线稳妥。

4.2 清理核心步骤:先杀进程还是先删文件

清理挖矿木马有一个非常经典的顺序问题:到底先杀进程还是先删文件?我的建议是先断能、再清调度、后杀进程、最后删文件。

挖矿木马的生命力核心不是进程,而是实现“自我复活”的调度机制。如果先杀进程,crontab里的定时任务在一分钟内就会把进程重新拉起来,你杀掉10次它就重启11次,毫无意义。正确顺序是先清理任务调度:删除crontab中的恶意条目,删除/etc/cron.d下的恶意脚本,清理/etc/rc.local以及systemd服务中注册的自启动项。把这些重生机制全部删除后,再杀掉进程,此时进程才是真正死透了,最后删除磁盘上残留的恶意文件。

我在实际操作中按以下顺序执行:

  1. 先导出当前crontab内容,保留证据后清空恶意条目;
  2. 逐个检查/etc/cron.d、/etc/cron.hourly、/etc/crontab文件,删除一切指向/tmp目录恶意脚本的任务;
  3. 检查systemd服务列表,禁用异常服务单元;
  4. 用ps命令定位所有挖矿相关进程,一次性kill掉;
  5. 清除/tmp、/var/tmp下的恶意压缩包和脚本文件;
  6. 检查SSH配置,移除攻击者注入的后门配置和密钥;
  7. 最后用进程扫描和文件扫描确认无残留。

这套顺序执行下来,基本可以杜绝“杀完又复活”的问题。如果你发现清理完过一会儿进程又回来了,不用怀疑,一定是还有某个定时任务或者自启动项没有被找到。

4.3 挖矿检测自查:一分钟定位可疑进程

清除结束之后,还有一个重要环节是确认同一个网段的其他机器没有同样的感染。这里分享几个我在现场反复使用的实用检测命令,不算高深,但真的能救命:

检查CPU异常的进程,优先关注ps输出时间长的:

ps aux --sort=-%cpu | head -20

检查/tmp和/var/tmp目录下近期生成的隐藏文件:

find /tmp /var/tmp -type f -mtime +0 -mtime -30 -exec ls -lah {} \;

检查所有用户的定时任务,不只是当前用户:

for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l 2>/dev/null; done ls -la /etc/cron.*

很多挖矿木马会把挖矿文件伪装成看似正常的系统文件名。比较推荐的做法是直接检查/proc目录下的进程启动命令,即使系统进程列表被rootkit隐藏,从/proc/PID/cmdline也能看到真实命令:

for p in /proc/[0-9]*; do echo -n "$p "; cat $p/cmdline 2>/dev/null | tr '\0' ' '; echo; done | grep -Ev "\[" | head

这套方法能覆盖大多数场景,但如果遇到使用内核级rootkit的样本,还需要借助专门的行为检测工具和干净的系统环境来分析。

4.4 恢复验证:不能只以CPU降下来为准

清理完成后,我留了24小时的观察窗口,而不是急着把机器恢复投入使用。观察期间重点关注三个指标:CPU是否回落到底噪水平、是否还有到矿池IP的外联流量、系统日志里是否还有异常的登录记录。这三项中任何一项异常,都必须重新进入排查流程。

这台机器在清理后的第一个小时内CPU就回落到正常水平,但网络层面仍偶发出现到境外IP的握手请求。进一步追踪发现是魔铲组件中另一个守护脚本残留,藏在/usr/lib/x86_64-linux-gnu目录下,伪装成动态链接库文件。这个文件不在我的第一轮清理范围内,因为它的文件名极具迷惑性,没有专门工具的话,大多数管理员根本不会注意到。这让我意识到,一次合格的清除必须做到“多次检查、交叉验证”,不能寄希望于一轮命令就解决所有问题。

5. 纵深防御反思:这次事件真正的问题不在挖矿

5.1 六个被忽视的盲区

整起事件处置完之后,我花了很长时间复盘,想找到真正让攻击者长驱直入的深层原因。表面上看是SSH弱口令问题,但往深了挖,至少存在六个系统性的盲区需要正视:

第一,测试环境安全投入过低。主机安全Agent没有覆盖到测试网段,EDR、HIDS这类关键检测手段在正式环境部署得很齐全,测试环境却基本处于裸奔状态,导致攻击者从入侵到被发现的几个小时里,我们完全没有任何主动发现能力,只能靠监控平台级别比较低的CPU告警来感知。

第二,东西向流量基本没有控制。我们的网络边界上防火墙、IDS一应俱全,但整个内部网络之间的访问控制非常松散,测试网段甚至可以访问数据中心里几乎所有的其他网段。一旦这台机器被攻破,它就变成了一个横向移动的跳板。

第三,出站流量未做策略限制。内网服务器向外网发起连接没有经过审批或白名单控制,一台服务器可以自由连接任何公网矿池。这在很多传统架构里是常态,但恰恰是挖矿木马能持续存活的土壤。

第四,账号管理长期混乱。这台机器上遗留了多个测试账号,密码强度极弱,离职人员账号移交流程没有落实。攻击者爆破成功利用的是半年前就闲置的测试账号,这个账号的生命周期管理基本处于失控状态。

第五,安全基线与异常检测体系缺失。我们说不清楚这台机器平时的CPU基线是多少、正常外联对象有哪些、进程白名单是什么,所以当挖矿进程跑起来时,除了“CPU太高”之外没有任何一台设备能告诉我们是哪里出了问题。

第六,事件响应流程对测试环境存在盲区。日常安全巡检和值班值守的资源全部向正式系统倾斜,测试环境不在应急响应的重点保障范围内。这台机器告警后15分钟才有人登录上去看,而这个时间窗口足够挖矿木马完成下载、植入和开挖的全套动作。

5.2 分层防御体系需要补的课

基于这次事件,我把后续要落地的改进措施整理成了一张行动清单,这里也分享给同行:

网络层:对测试环境单独划分VLAN,禁止与生产网段直连,所有跨区访问必须经过防火墙并且白名单化;限制全部服务器出站互联网访问,只允许通过统一的代理或前置机访问外部资源。

主机层:强制关闭SSH密码登录,全面改为密钥认证;对于必须使用密码的场景,部署登录失败自动封禁策略;回收闲置测试账号并建立账号生命周期管理制度;主机安全Agent覆盖范围扩大到所有服务器,不得因为“测试环境”缩减检测覆盖面。

检测层:建立基于行为的异常检测规则,重点覆盖CPU突变、异常外联、定时任务变更、隐藏进程等场景;接入矿池IP情报库,及时发现到矿池的通信行为;定期做安全基线扫描,持续发现偏离基线的设备。

流程层:把测试环境纳入常规应急响应范围,明确处置时限、响应人员、汇报路径;定期组织全面排查和修复行动,把测试环境的失陷当作正式环境失陷来严肃对待。

5.3 几个当天就能落地的低成本措施

除了上面这些动辄要写几个方案才能推动的大动作,我也整理了几个当天就能落地的低成本措施,供同行参考:

先在核心服务器上禁用密码登录,只保留密钥认证,这是对付SSH爆破最直接有效的手段,五分钟就能做完。

然后统一检查一遍测试环境里所有账号的登录权限,把长期没人使用的账号全部禁用或删除。这个不需要申请任何预算,只需要一份清单和一点耐心。

再在监控平台加一条简单的规则:任何服务器对外连接非标准端口的流量直接告警。矿池通信大多数走非标准端口,抓到这类流量基本就等于抓到了挖矿行为。这条规则上线当天,我们就又发现了两台存在可疑外联的机器。

最后把安全Agent的安装范围从“生产必须装”扩展为“所有服务器必须装”,这个说难也不难,难的是打破“测试环境可以不管”的惯性思维。

我不太想说太多“以后要重视安全”这类空话,因为安全意识的建立从来不是靠口号,靠的是每一次真实事件中积累的细节和教训。这次事件给团队带来的最大变化,其实是整个团队再也不觉得“测试环境”这四个字可以成为安全管控缺失的挡箭牌了。一台服务器的价值确实只是几块CPU,但一个被打出洞的网络,价值归零。整个处置过程持续了将近三十个小时,最累的不是通宵清理样本,而是反复验证“是不是真的清干净了”的那种心理压力。希望这份处置记录,能帮大家少踩一些我踩过的坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询