记一次挖矿处理

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

在此小记,以免忘了!