一次Ubuntu服务器感染挖矿病毒的处理概要

起因

某日,在更新服务器上运行于 Docker 容器中的业务后台时,进程不断被系统 Killed,导致无法正常运行。即使将业务后台版本回退,也未能解决问题。

排查流程

最初怀疑是否由于 OOM(Out of Memory)导致进程被终止。通过 dmesg | grep -i 'killed' 检查,结果并未出现相关日志,初步排除了 OOM 的可能。

随后尝试重新启动容器,观察进程状态,发现进程在最初能够正常运行,但数十秒后突然被 Killed。怀疑容器可能配置了资源限制,然而在查询配置文件后并未发现类似限制。将容器中的业务后台放到主机运行,依旧被 Killed,因此可以排除 Docker 环境因素。

观察业务后台启动时的资源占用,发现其内存占用并不高,但 CPU 利用率相对较高。由此推测进程被杀可能与 CPU 占用率有关。为验证这一猜想,编写了两个测试脚本:

  1. 内存脚本:不断申请系统内存并打印当前已分配内存大小,直到进程 OOM。测试结果显示,在达到平台内存上限前,进程并未被 Killed,由此排除了内存方面导致进程被终止的可能性。
  2. CPU 脚本:启动一个死循环,占用单个核心 100% 的 CPU 利用率。大约运行 40 秒后,脚本进程被系统 Killed。因此可以确定,长时间高负载的 CPU 占用会触发进程被系统终止。

这也解释了为何业务后台在更新并重新启动时被 Killed:重启过程触发了大量资源初始化,CPU 一度占用过高;而在平稳运行期间 CPU 占用率较低,则不会被系统终止。通过进一步调整 CPU 脚本的负载,最终确定当进程的 CPU 利用率超过约 40%-50% 并持续一段时间后,该进程就会被系统杀死。

如此异常的现象引发了对病毒入侵的怀疑(由于不可抗力因素,该服务器使用了弱口令,且默认 22 端口暴露在互联网上)。查看 /var/log/auth.log 后,发现了大量弱口令爆破的记录,并且每隔一分钟就会有一个定时任务打开 root session。使用 top 观察时,发现 CPU 总占用率很高,占用了12个核心中的6个核心,且 CPU 温度也偏高。

1735389745165

1735389778173

然而在 top 中看不到明显的高占用进程,因此推测存在隐藏进程。通过 netstat -antp 查看,发现与 87.***.***.37:3333 的 TCP 连接,该地址位于荷兰,结合 3333 端口常见用于挖矿服务的特征,高度怀疑服务器被挖矿病毒感染。

安装 unhide 工具并扫描后,发现多个指向已被删除路径的可疑隐藏进程。杀死其中一个可疑进程后,所有隐藏进程随即消失,CPU 占用恢复正常,业务后台也不再被 Killed

3b86b128264373914bbde0c19448994

然而仅过了不久,占用率再次升高,隐藏进程重新出现。结合登录日志中一分钟一次 root session的现象,可以推断这是由于 cron 中新增了拉起挖矿进程的定时任务。使用 crontab -l 并未发现异常定时任务,但在 /etc/cron.d/ 及其子文件夹中,找到了多个可疑的定时任务脚本,每分钟都会在 /bin 目录下启动同一个可疑可执行文件。

image-20241228205604993

image-20241228205729008

至此可判断,该可执行文件就是最终的病毒文件。清理掉隐藏进程后,手动执行一次该文件,果然再次出现隐藏进程,彻底确认了病毒来源。

后续处理

  • 检查所有定时任务文件夹,清理所有可疑定时任务
  • 检查系统服务,清理所有可疑系统服务
  • 删除病毒文件本体
  • 清理authorized_keys,防止已被添加不可信的公钥
  • 更改默认ssh端口
  • 关闭ssh密码登录,统一使用密钥登录,避免爆破
文章作者: Serendipity
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 闲人亭
杂货店 Linux
喜欢就支持一下吧