记一次挖矿处理
11月10日周日晚上21:58分收到阿里云监控告警邮件,提示云服务器被挖矿,顿时意识到事情严重,于是立马登陆到机器上处理。
定位并清除挖矿程序
由于这是一个线上服务器,当前首要任务是找到并Kill掉挖矿病毒,恢复正常。
首先,使用top命令定位挖矿程序,发现是一个名称为base64的进程,妥妥的,CPU使用率飙到了715%。
然后,查看该挖矿进程是如何运行的
找到之后,我们要想办法尽快干掉它,恢复业务
# cd /root/.tmp00 # ls bash bash64 bash.pid cfg cfgi uuid
收回程序的可执行权限,这里一定要先回收可执行权限才能kill掉进程,否则无效
# chmod -x bash64 # chmod -x bash
杀掉bash64进程
# pkill bash64
接下来尝试删除病毒文件,发现删除后会自动生成,并自动运行。
# rm -rf ./*
因为一般病毒会使用chattr +i命令,于是使用chattr -i bash64,然后再 rm -f bash64,发现也无法删除。
于是只有重复上面步骤。
再次使用top命令查看,发现bash64挖矿进程消失,持续观察一段时间后进程没有再起来,总算先抑制住了,可以松口气了!
遗留问题1:挖矿病毒暂时无法删除
定位并清除crontab定时任务
OK,这里只是暂时压制住了这个邪恶的东西,继续排查其他问题。
接下来查看有无crontab定时任务
# crontab -l */1 * * * * export DISPLAY=:0 && /root/.tmp00/bash >/dev/null 2>&1
果然有,于是尝试使用crontab -e 删除掉crontab,但删掉后又自动创建了。这里我们已经知道该定时任务为每分钟执行一次。所以我们怎么删也无用,crontab服务被破坏掉了,无法正常停止,当然最粗暴的是先备份crontab可执行程序,然后删掉它。
好吧,试试其他办法,于是
# cd /var/spool/cron # rm -f root VM
纳尼,root文件可以删除,VM删除后又自动生成,好吧,我尝试去修改它,发现修改后又会自动生成新的一行。
使用crontab -r也无法删除。
接下来,确认/etc/init.d目录下有没有挖矿程序,OK,没有。
遗留问题2:该挖矿程序定时任务暂时无法删除
禁止挖矿程序连接网络
OK,那我们就追本溯源,看看/root/.tmp00/bash64这个程序,是黑猫还是白猫。
# more /root/.tmp00/bash ******** /root/.tmp00/bash: Not a text file ********
尝试VIM打开,好吧,如所料这是一个编译后的文件(非bash脚本)无法直接查看。
回到上面,我们通过ps命令获悉该挖矿进程通过-c参数指定了配置文件,查看该配置文件的内容
好家伙,该文件内容经过base64编码处理,base64解码后配置内容如下:
{ "algo": "cryptonight", "autosave": false, "background": false, "colors": true, "retries": 5, "retry-pause": 5, "syslog": false, "print-time": 60, "av": 0, "safe": false, "cpu-priority": null, "cpu-affinity": null, "donate-level": 0, "threads": 8, "pools": [ { "url": "proxkekman.ru:8080", "user": "0c82cc57-7dae-4d4b-a409-12afcc45136e", "pass": "x", "keepalive": true, "nicehash": false, "variant": "r", "tls": false, "tls-fingerprint": null } ], "api": { "port": 0, "access-token": null, "worker-id": null } }
这里,重点是这个url地址proxkekman.ru:8080。使用浏览器尝试访问页面无法打开,那使用telnet试试能否通。OK,能通。
telnet proxkekman.ru:8080
由于挖矿程序base和base64没有时间去解码,所以看不到程序代码。根据我的个人推测,挖矿病毒需要使用这个url地址去做些勾当,为了保险起见,于是使用iptables禁止访问这个url地址。
iptables -A INPUT -s proxkekman.ru -j DROP iptables -A OUTPUT -d proxkekman.ru -j DROP
其实,在最开始kill掉该进程前,我们可以使用netstat查看该进程使用的端口号。然后使用安全组规则或iptables drop该端口的连接。
流程走到这里时,有2个问题没有处理掉,即挖矿病毒文件和crontab定时任务没有清除掉。山雨欲来风满楼,刚好此时在网上找解决方法时,ssh连接因超时自动退出(做等保时加了配置),此时再次以root用户或其他用户登陆再执行sudo等命令时,发现该挖矿病毒在我最开始登陆之后的1分钟左右把root用户删掉了,重新创建了一个VM的超管账号,并破坏掉了sudo等命令。
综合评估最优选择,经过内部商议,决定回滚该云服务器的系统盘快照恢复系统(该实例运行的是边缘业务)。
补充要点
如何快速定位异常用户
检查系统用户,查看是否有异常的系统用户
# cat /etc/passwd
查看是否产生了新用户,UID和GID为0的用户
# grep “0” /etc/passwd
查看passwd的修改时间,判断是否在不知的情况下添加用户
# ls -l /etc/passwd
查看是否存在特权用户
# awk -F: ‘3==0 {print3==0 {print1}’ /etc/passwd
查看是否存在空口令帐户
# awk -F: ‘length(2)==0 {print2)==0 {print1}’ /etc/shadow
打开 /root/.ssh/authorized_keys, 删除你不认识的账号。删除之前,先备份,以免误删。
cp authorized_keys authorized_keys.back
清理定时任务
(先清理定时任务,再删除挖矿病毒本体,防止再生),包括但不限于
/etc/crontab /var/spool/cron/root /var/spool/cron/crontabs/root /etc/cron.d/system /etc/cron.d/root /etc/cron.hourly/oanacron /etc/cron.daily/oanacron /etc/cron.monthly/oanacron /etc/cron.monthly/oanacron3
删除相关动态链接库
包括但不限于
/etc/ld.so.preload /etc/libjdk.so /usr/local/lib/md.so /usr/local/lib/screen.so /usr/local/lib/y.so4
总结
1.服务器如非必须,禁止开放端口,按需开放即可;
2.重要服务的端口,如数据库等服务端口,应禁用默认端口,启用密码认证并禁止外网连接;
3.一定要有数据备份,包括业务数据备份(如数据库)和基础数据备份(如系统盘和数据盘)等。总之,有备份,睡觉也踏实;
4.及时修复系统漏洞,打安全补丁;
5.严格控制所有用户的操作权限,需特殊权限需特殊审批;
腾讯CTO张志东曾说:安全问题可以让腾讯一天倒闭。这是不是真的,我不知道。但笔者曾亲身经历过的公司因被专业黑客持续攻击,导致损失上百万,从而成为倒闭的主因之一。