记一次应对挖矿程序的经历

一、背景

之前为了远程调试redis,将服务器上的redis绑定到了阿里云的公网IP上。后来上redis时发现多了两个key,查看了这两个key发现里面是curl和wget命令,于是猜到有人远程下载了脚本,但是下载的地址已经失效了,无法判断是什么脚本,但是可以肯定服务器被攻击了。后来检查服务器的资源占用,果然cpu占用间断性的会飙到100%,显然被人用来挖矿了。

二、关于漏洞的猜测

redis绑定到公网IP上很容易中招,网上全是类似的帖子(主要还是安全上没有配置好,然后使用了root用户运行了redis-server,感觉自己的辣鸡服务器不会被人盯上所以大意了)。检查了一下redis的配置,dbfilename被设置成~/.ssh/authorized_keys。原来是将攻击者将他的ssh公钥存到redis的key,然后当redis备份key时就将他的公钥存到了authorized_keys成功免密登录了。

关于之前看到的两个脚本有一种说法是,将dbfilename设置到/etc/crontabs目录下。crontabs是定时执行任务的工具,会强制执行这个目录的文件,于是脚本得以运行。

三、解决问题

第一步关闭redis-server,执行shutdown命令的时候发现无法关闭,可能被动了手脚,于是只能kill掉进程。修改redis配置文件,更换密码删掉dbfilename的配置然后重新运行。

第二步修改ssh的authorized_keys。中间我发现sudo居然都没有权限修改,sudo chmod也不能执行,这里我相当纳闷,root用户也没有权限?后来发现文件是被chattr锁定了,解除锁定前root权限都无法修改。执行chattr -i解除锁定却发现chattr程序直接被攻击者被删除了。好在服务器能联网,重新下载chattr然后修改了authorized_keys权限删除了攻击者的公钥。到现在也才防止了对方继续连接到我的服务器。

第三步要停止挖矿程序。虽然监测到cpu占用率经常到100%,但是top命令却没有找到任何占用高的进程,使用ps 也是如此。所以说挖矿程序是被隐藏了起来,找不到这个进程要怎么杀掉它?中间我找了各种办法,找操作历史,找时间段修改的文件,到/proc目录下面找也没有什么异常。有没有可能是top和ps程序被替换了?使用stat /usr/bin/top发现程序并没有被修改。就算top,ps程序没有被修改,它们依赖的库可能被修改了,但是排查起来非常麻烦,终于我找到了一个软件unhide(CentOS下),Ubuntu下面也有类似的sysdig可以检测出隐藏的进程。利用unhide很容易就找到了一些隐藏的进程:

https://tva1.sinaimg.cn/large/006y8mN6gy1g8veag1qftj309b0ch74a.jpg

在这些进程里一眼就能看出pamdicks不是什么正经程序(攻击者前面为了不让我关掉程序可谓使了很多小心机,结果这里挖矿程序的名字却如此裸露,让我一眼发现)。于是google了一下,果然是挖矿程序,据说杀掉这个进程还会继续重启,删掉进程目录也会重新生成,所以我找到进程目录清空然后用chattr给锁定了(这波啊是以其人之道还治其人之身),再杀掉进程,终于cpu占用降下来了。

https://tva1.sinaimg.cn/large/006y8mN6gy1g8veeoakymj30jo08ymxa.jpg