记一次挖矿处理

11月10日周日晚上21:58分收到阿里云监控告警邮件,提示云服务器被挖矿,顿时意识到事情严重,于是立马登陆到机器上处理。
image

定位并清除挖矿程序

由于这是一个线上服务器,当前首要任务是找到并Kill掉挖矿病毒,恢复正常。
首先,使用top命令定位挖矿程序,发现是一个名称为base64的进程,妥妥的,CPU使用率飙到了715%。
image

然后,查看该挖矿进程是如何运行的
image

找到之后,我们要想办法尽快干掉它,恢复业务

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 ./*

image

因为一般病毒会使用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

image

纳尼,root文件可以删除,VM删除后又自动生成,好吧,我尝试去修改它,发现修改后又会自动生成新的一行。
image

使用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脚本)无法直接查看。
image

回到上面,我们通过ps命令获悉该挖矿进程通过-c参数指定了配置文件,查看该配置文件的内容
image

好家伙,该文件内容经过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
2
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等命令。

综合评估最优选择,经过内部商议,决定回滚该云服务器的系统盘快照恢复系统(该实例运行的是边缘业务)。

补充要点

如何快速定位异常用户

检查系统用户,查看是否有异常的系统用户

1
# cat /etc/passwd

查看是否产生了新用户,UID和GID为0的用户

1
# grep0/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
/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

删除相关动态链接库

包括但不限于

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
3
cd /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张志东曾说:安全问题可以让腾讯一天倒闭。这是不是真的,我不知道。但笔者曾亲身经历过的公司因被专业黑客持续攻击,导致损失上百万,从而成为倒闭的主因之一。

在此小记,以免忘了!

0%