记录一下最近的一次挖矿病毒排查过程

经验

本周一次收到了网管的警告,说实验室服务器有挖矿行为。印象中距离上一次中招应该比较久了。 虽然最终没有能彻底清除只能重装了机器,但寻找和排查的过程还是挺有收获的。 同时我们也发现这个病毒的行为跟网上的记录没有完全符合的,可能对方用的是比较新的脚本, 于是记录一下完整的过程以及学到的东西。

起因

收到警告后,我们先简单检查了一下,发现这台机器并没有什么明显的异常。 CPU 不管是用 top 还是物理上看都没什么占用。 我们开始以为是误判了,去询问了一下,果然看到了被抓到的发往矿池的 DNS 请求,算是实锤了。

排查过程

盲目自信

因为之前因为弱密码被内网其他机器感染多次,我一直在实验室推广禁止密码登录。 所以我非常自信地认为不会是感染,应该有什么别的行为导致了要向矿池发请求。 刚好组里也有 DNS 和 流量分类相关的项目,我在一开始认为肯定是做实验的数据集出了问题导致的误判。 然而沟通后发现,实验确实不涉及这个 donate.v2.xmrig.com 域名,这条线索马上就断了。

按照常见的排查方式在这台机器上找了一圈,好像没发现有什么可疑的。

新的发现

我突然想到按照以前经验,被感染的机器会在内网继续扫 ssh ,于是检查了一下其他机器的 lastb, 果然有了新发现。半个月以前,组里另外一台机器 B 曾经有过怪异的扫描行为,而且扫描用的字典全部都是 出自组里其他机器的用户名。

上去看了一下 B 果然是弱密码,更糟的是 B 上有一对密钥是可以登录被警告机器 A 以及其他的几台机器的。 于是基本可以确定这些机器是被入侵了。

弄巧成拙

虽然确定了有挖矿病毒的存在,但不像之前几次,这些机器都非常正常,完全没有异常的占用,除了一台机器 C 风扇狂转,但师弟确信这是机器本来的缺陷,从一开始用就是这样一直没解决。

我这时又一次自信认为肯定不是硬件问题,一定是病毒隐藏了进程。查了一下可以用 unhide 这个工具找到 隐藏的进程,它的基本原理是遍历 /proc/ 下的进程,与 ps 的结果进行比较。

果然!发现了隐藏的进程,运行了一个名字是八位随机字符的已经删除了的二进制文件。可是,即使我们杀掉 进程,风扇依旧没有停下来的意思。

unhide 找到的进程

我们分析刚好两个事情碰到一起了。机器的风扇确实有问题,不过也正是风扇促使我们找到了因为网络不通 藏在后面啥也没干的挖矿进程。

继续探索

这时,师弟通过 netstat -ant 命令发现了机器 C 上的这个进程向外发送但没连接成功的 TCP 连接。 除了一些矿池 IP 之外,还有一些连接内网服务器的 90901081 等端口的连接。

此外,师弟还找到了网上对最近的流行的叫 yayaya 的挖矿病毒的处理方式,发现与这次的特征非常之像, 都是 8 位随机字符的二进制文件,并且发现了一个删除掉的 systemd service。

删除掉的 systemd service

本来以为有希望了,但是行为却又不完全一样,我们并没能找到相关的内核模块。

而我这边,在之前以为提取进程删掉的二进制会非常复杂, 这次我才学习到直接将 /proc/{pid}/exe 复制出来就可以了。这使得我们对后续排查过程充满了决心。

我通过对二进制简单的 strings 处理,加上之前找到的端口,发现了有意思的事情。 二进制中包含了一个 json 文件,应该是 xmrig 的配置,通过 socks5://localhost00:9090 的代理向矿池通信。

json

进一步一找,发现这个 localhost00 赫然写在 /etc/hosts 里面,指向了一个与我们实验室没关系的内网地址。 看来是被感染后设置的了。

无能为力

于是基本可以推测这次是从内网通过经典的弱密码感染,影响了我们好几台机器, 可以通过 /etc/hosts 推测其他机器的感染情况和时间。

不过最重要的还没解决,它究竟是如何做到开机启动的, 跟我之前见过的所有挖矿病毒都不一样,似乎非常隐蔽,我们找了一圈始终没有发现, 最终只能重装,这是最保险的做法。

总结

推测的传播方式

  1. 首先通过某种方式进入内网
  2. 内网内扫描弱密码,进入更多机器
  3. 用一台机器专门扫描而不挖矿,采集被感染机器上的用户名,感染更多机器
  4. 感染后某种方式自启(我们没找到),用一个 systemd service 运行脚本,然后删除

SOTA 的 yayaya 挖矿病毒相比,

  1. 会使用代理,避免因为矿池在黑名单里面被ban以及被监控
  2. 启动项更加隐蔽,crontab, /var/spool/cron, /etc/init.d, /etc/rc.d/, /etc/profile 之类的都找了也没发现这个 systemd service 是怎么来的。也许是我们太菜了,但确实比之前难找了很多。

经验收获

  1. 因为有木桶效应,在内网也不应放松对弱密码的警惕
  2. 对 linux 还是不够熟悉,很多时候会觉得蒙在鼓里,对正在发生的事情我没法很好的利用工具去观测
  3. linux 的开机启动方式未免也太多了,为什么会这样?
  4. 一切皆文件的理念有些时候会特别有用
  5. 告警系统做的似乎不够好,扫端口这样更容易排查的行为都被忽视了
  6. 即便是不准确的警告,要是没有的话,我们不知还要再过多久才能发现自己已经被感染了, 看来想要对安全这种隐形的东西有足够高的防范意识还是比较困难的