第一次遇到服务器被别人入侵挖矿,在专业人员的帮助下找到并清除了挖矿病毒。这篇博客只是我的一个记录,不一定适用所有的情况,不过还是希望能给大家一定帮助。
-
发现问题:有程序使用了大量的GPU资源,询问了账号的主人发现并不是ta的程序,而且使用root身份kill后会自动重启。
这个程序占用了大量的GPU资源,而且在不同显卡上显存的占用出奇的统一。正常情况下用户跑的程序占用不同显卡的显存都是不一样的,例如
此外,通过ps -aux命令显示,该程序的命令为一个文件夹,用过conda的人都知道/bin下面的python是一个可执行文件,而非文件夹;跟别说里面有一个pytorch文件夹
并且文件夹anaconda3根本不存在,该服务器装的是miniconda3(猜测是入侵者先入侵了其他服务器,其他旧的服务器确实有anaconda3,然后入侵者以为所有服务器都有anaconda3,因此伪装成了anaconda3里的程序)
此外,我在网上查阅资料说,被挖矿的话CPU占用率很高,但是这个服务器的CPU占用率并不高,而GPU占用率非常高。考虑到挖矿对显卡资源的巨大要求,以及入侵者可能对CPU占用率会做一些伪装,我还是初步认定服务器是被别人入侵挖矿了,因此寻求了专业人员的帮助。 -
找到病毒文件:
- 方法一:由于入侵者对程序的名称做了伪装,无法直接通过其进行查找。因此使用PID入手,查找其在/proc里的文件,进而发现了关键路径
将所有病毒文件展示出来,可以发现关键词miner
对里面的文件作进一步的查看,可以看到ETH(以太坊)、POOL、WALLET等关键词,实锤中了挖矿病毒
此外,查看run文件,可以发现这个病毒文件确实做了伪装
- 方法二:考虑到入侵者可能会用某些方式将病毒程序作一定的隐藏,这里通过查看用户的计划任务来定位病毒文件,因为病毒文件可能被kill掉而入侵者不会每次都自己手动启动的,肯定会设置自动启动。查看计划任务的命令为
crontab -l
为了查看病毒文件在服务器上是否有多份,可以使用如下命令一次性查看所有用户的计划任务:
for u in $(cat /etc/passwd | cut -d":" -f1) do echo $u>>temp.txt crontab -l -u $u >> temp.txt done cat temp.txt rm temp.txt
- 方法三:尝试定位病毒文件中的特有关键词,比如“miner”
updatedb locate miner # 由于locate命令不能查找/dev/shm之类的路径,以防万一可以使用find命令,不过会很慢 # find / -name miner
- 方法一:由于入侵者对程序的名称做了伪装,无法直接通过其进行查找。因此使用PID入手,查找其在/proc里的文件,进而发现了关键路径
-
应对方法:
-
删除整个病毒文件夹(
python
),kill相关的PID,并删除相关定时任务(使用命令crontab -e
,或者如果只有一个定时任务的话可以用命令crontab -r
) -
更改所有用户的密码,并设置一定的密码复杂度(可以使用cracklib)
-
移除所有除了管理员以外用户的sudo权限
admin="root,sudo,%sudo" # 填入管理员账号(前三个不能删) for i in $(cat /etc/sudoers|grep "ALL=(ALL:ALL) ALL"|cut -f 1|cut -f 1 -d ' ') do echo $i if [ -z "$(echo $admin|grep $i)" ] then echo "*** deluser $i sudo" deluser $i sudo fi done for i in $(getent group sudo|cut -f 4 -d :|tr -s ',' '\n') do echo $i if [ -z "$(echo $admin|grep $i)" ] then echo "*** deluser $i sudo" deluser $i sudo fi done
-
删除现有的所有密钥&授权
updatedb # 删除公钥+密钥 for pub in $(locate .pub|grep .pub$) do u=$(ll $pub|awk '{printf $3}') # 根据UID判断所属用户是否为普通用户 if [ 999 -lt $(id -u $u) ] then pri=$(echo ${ pub%????}) rm $pub rm $pri echo del $u $pub $pri else echo save $u $pub fi done # 删除knowN_hosts for i in $(locate known_hosts|grep known_hosts$) do rm $i echo del $i done # 删除authorized_keys for i in $(locate authorized_keys|grep authorized_keys$) do rm $i echo del $i done # 查看剩余 updatedb locate .pub|grep .pub$ locate known_hosts locate authorized_keys
可能会遇到某个文件用root权限也删除不了
如果使用命令lsattr
发现该文件的隐藏属性中存在除了e以外的属性,则用命令chattr
来移除这些属性
-
设置远程连接只能使用密钥,不能使用密码
-
禁止使用root账号进行远程连接
-
使用终端安全杀毒软件、内网安全监控产品、漏洞扫描设备等专业工具
PS:垃圾矿工!!!