11月10日周日晚上21:58分收到阿里云监控告警邮件,提示云服务器被挖矿,顿时意识到事情严重,于是立马登陆到机器上处理。
定位并清除挖矿程序
由于这是一个线上服务器,当前首要任务是找到并Kill掉挖矿病毒,恢复正常。
首先,使用top命令定位挖矿程序,发现是一个名称为base64的进程,妥妥的,CPU使用率飙到了715%。
然后,查看该挖矿进程是如何运行的
找到之后,我们要想办法尽快干掉它,恢复业务1
2
3# cd /root/.tmp00
# ls
bash bash64 bash.pid cfg cfgi uuid
收回程序的可执行权限,这里一定要先回收可执行权限才能kill掉进程,否则无效1
2 chmod -x bash64
chmod -x bash
杀掉bash64进程1
pkill bash64
接下来尝试删除病毒文件,发现删除后会自动生成,并自动运行。1
rm -rf ./*
因为一般病毒会使用chattr +i命令,于是使用chattr -i bash64,然后再 rm -f bash64,发现也无法删除。
于是只有重复上面步骤。
再次使用top命令查看,发现bash64挖矿进程消失,持续观察一段时间后进程没有再起来,总算先抑制住了,可以松口气了!
遗留问题1:挖矿病毒暂时无法删除
定位并清除crontab定时任务
OK,这里只是暂时压制住了这个邪恶的东西,继续排查其他问题。
接下来查看有无crontab定时任务1
2# crontab -l
*/1 * * * * export DISPLAY=:0 && /root/.tmp00/bash >/dev/null 2>&1
果然有,于是尝试使用crontab -e 删除掉crontab,但删掉后又自动创建了。这里我们已经知道该定时任务为每分钟执行一次。所以我们怎么删也无用,crontab服务被破坏掉了,无法正常停止,当然最粗暴的是先备份crontab可执行程序,然后删掉它。
好吧,试试其他办法,于是1
2 cd /var/spool/cron
rm -f root VM
纳尼,root文件可以删除,VM删除后又自动生成,好吧,我尝试去修改它,发现修改后又会自动生成新的一行。
使用crontab -r也无法删除。
接下来,确认/etc/init.d目录下有没有挖矿程序,OK,没有。
遗留问题2:该挖矿程序定时任务暂时无法删除
禁止挖矿程序连接网络
OK,那我们就追本溯源,看看/root/.tmp00/bash64这个程序,是黑猫还是白猫。1
2# more /root/.tmp00/bash
******** /root/.tmp00/bash: Not a text file ********
尝试VIM打开,好吧,如所料这是一个编译后的文件(非bash脚本)无法直接查看。
回到上面,我们通过ps命令获悉该挖矿进程通过-c参数指定了配置文件,查看该配置文件的内容
好家伙,该文件内容经过base64编码处理,base64解码后配置内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33{
"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,能通。1
telnet proxkekman.ru:8080
由于挖矿程序base和base64没有时间去解码,所以看不到程序代码。根据我的个人推测,挖矿病毒需要使用这个url地址去做些勾当,为了保险起见,于是使用iptables禁止访问这个url地址。1
2iptables -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等命令。
综合评估最优选择,经过内部商议,决定回滚该云服务器的系统盘快照恢复系统(该实例运行的是边缘业务)。
补充要点
如何快速定位异常用户
检查系统用户,查看是否有异常的系统用户1
cat /etc/passwd
查看是否产生了新用户,UID和GID为0的用户1
# grep “0” /etc/passwd
查看passwd的修改时间,判断是否在不知的情况下添加用户1
ls -l /etc/passwd
查看是否存在特权用户1
# awk -F: ‘3==0 {print3==0 {print1}’ /etc/passwd
查看是否存在空口令帐户1
# awk -F: ‘length(2)==0 {print2)==0 {print1}’ /etc/shadow
打开 /root/.ssh/authorized_keys, 删除你不认识的账号。删除之前,先备份,以免误删。1
cp authorized_keys authorized_keys.back
清理定时任务
(先清理定时任务,再删除挖矿病毒本体,防止再生),包括但不限于1
2
3
4
5
6
7
8
9 crontab
spool root
spool crontabs/root
cron.d/system
cron.d/root
cron.hourly/oanacron
cron.daily/oanacron
cron.monthly/oanacron
cron.monthly/oanacron3
删除相关动态链接库
包括但不限于1
2
3
4
5/etc/ld.so.preload
/etc/libjdk.so
/usr/local/lib/md.so
/usr/local/lib/screen.so
/usr/local/lib/y.so4
其他
查找挖矿程序根源所在地,如果知道PID是14454,则1
2
3cd /proc/14454
ls -a //查询到/etc/目录存在启动文件nfstruncate
exe -> /etc/rc.d/init.d/nfstruncate //这个nfstruncate文件也需要删除
是否修改了动态链接库
如果找不到占用CPU较高的进程,可考虑排查是否修改了动态链接库,使用cat /etc/ld.so.preload 或echo $LD_PRELOAD 命令查看是否有预加载的动态链接库文件。也可以使用ldd命令查看命令依赖库中是否有可疑动态库文件。
总结
1.服务器如非必须,禁止开放端口,按需开放即可;
2.重要服务的端口,如数据库等服务端口,应禁用默认端口,启用密码认证并禁止外网连接;
3.一定要有数据备份,包括业务数据备份(如数据库)和基础数据备份(如系统盘和数据盘)等。总之,有备份,睡觉也踏实;
4.及时修复系统漏洞,打安全补丁;
5.严格控制所有用户的操作权限,需特殊权限需特殊审批;
腾讯CTO张志东曾说:安全问题可以让腾讯一天倒闭。这是不是真的,我不知道。但笔者曾亲身经历过的公司因被专业黑客持续攻击,导致损失上百万,从而成为倒闭的主因之一。
在此小记,以免忘了!