挖洞经验 | 记一次针对Twitter(Periscope)API 的有趣挖洞经历

近期,我在Twitter的Periscope服务中发现了一个漏洞。这是一个CSRF(跨站请求伪造)漏洞,虽然这个漏洞并不算是高危漏洞,但是发现该漏洞的整个过程我认为是非常值得跟大家分享的。

就在几天之前,我发现Twitter发布了一个名叫ProducerAPI的接口,该接口目前仅提供给Twitter的合作伙伴使用,Twitter的第三方合作伙伴可以在特定的应用(例如外部相机设备)中利用该API与Periscope账号同步流媒体视频。

注:在此之前,Periscope曾是一家流媒体直播服务运营商。广大用户不仅可以通过Periscope与其他人进行视频直播,而且还可以分享视频或进行评论。Twitter在2015年3月份以接近亿美金的架构收购了Periscope,并将其融入了自己现有的社交平台服务中。

这样看来,Twitter应该在这里需要使用到一些与OAuth相关的东西,而就我过去所积累的经验来看,OAuth的实现过程中一般都会存在安全问题,因此我决定要深入分析一下这个API接口。

在分析过程中,我遇到的第一个问题就是Twitter似乎并没有提供Periscope API的开发文档。不过Twitter在一篇官方博客中列举出了能够使用这个API的第三方厂商,所以我感觉可以看看这些厂家是怎样跟这个API交互的,然后也许还能从中找出一些端倪。但不幸的是,大多数的这些厂商或服务都需要订阅之后才能使用Periscope的功能,即便是我愿意为服务付费也没用。

不过我后来发现有一个移动端应用程序(Mevo for iOS)也在使用这个API。在这个移动应用中,OAuth请求都是直接从客户端发送的,这样我们就有可能通过拦截并分析网络流量来了解API的调用情况了。与OAuth 1.0a不同的是(OAuth 1.0a使用了签名来隐藏类似consume_secret这样的重要信息,并防止流量被拦截),OAuth 2.0会通过HTTPS来发送所有流量。因此,除非应用程序使用了某种安全系数非常高的证书机制(可以使用SSL Kill Switch2来解决),否则这些还是难不倒我们的。

我遇到的第二个问题是,为了使用这个App,我首先得要有一个Mevo摄像头才行…在亚马逊上逛了一圈之后,最便宜的Mevo摄像头要399.99美金,穷哭在厕所的我当然不会为了测试而去买这么贵的东西了,而且这里还不一定存在漏洞。

于是乎,我决定通过另一种方法来进行测试,即逆向工程分析。首先,我需要一台已越狱的iPhone和Clutch来解密IPA文件,然后用class-dump来生成Objective-C头文件,最后再用Hopper来对代码进行反汇编。

一开始我尝试在头文件中搜索字符串“Periscope”,因为那些负责处理Periscope交互逻辑的类很有可能会包含这个字符串。

搜索之后,这些类似PeriscopeBroadcastCreateOperation.h或PeriscopeBroadcastPublishAPIOperation.h的文件名吸引了我的注意,因为这些头文件看起来似乎与Periscope API的调用有关。通过对这些文件进行分析之后,我发现它们都继承了PeriscopeAPIOperation类,所以接下来我就要重点分析这个PeriscopeAPIOperation类了。

PeriscopeAPIOperation类的代码如下所示:

//
// Generated by class-dump 3.5 (64 bit).//// class-dump is Copyright (C) 1997-1998,2000-2001, 2004-2013 by Steve Nygard.// #import "GroupOperation.h" @class NSDictionary, NSMutableURLRequest,PeriscopeOAuthOperation,PeriscopeRefreshTokenAPIOperation,URLSessionTaskOperation; @interface PeriscopeAPIOperation :GroupOperation{NSDictionary *_JSON;URLSessionTaskOperation *_taskOperation;PeriscopeRefreshTokenAPIOperation *_refreshTokenOperation;PeriscopeOAuthOperation *_oauthOperation;NSMutableURLRequest *_request;} + (void)removeCookies;+ (void)logout;+ (id)userID;+ (id)refreshToken;+ (id)accessToken;+ (void)updateAccessToken:(id)arg1;+ (void)setAccessToken:(id)arg1refreshToken:(id)arg2 forAccount:(id)arg3;+ (_Bool)isUserAuthorized;+ (id)buildRequestForPath:(id)arg1params:(id)arg2 query:(id)arg3 queryItems:(id)arg4 HTTPMethod:(id)arg5accessToken:(id)arg6; @property(retain, nonatomic)NSMutableURLRequest *request; // @synthesize request=_request;@property(retain, nonatomic)PeriscopeOAuthOperation *oauthOperation; // @synthesizeoauthOperation=_oauthOperation;@property(retain, nonatomic)PeriscopeRefreshTokenAPIOperation *refreshTokenOperation; // @synthesizerefreshTokenOperation=_refreshTokenOperation;@property(retain, nonatomic)URLSessionTaskOperation *taskOperation; // @synthesizetaskOperation=_taskOperation;@property(retain) NSDictionary *JSON; //@synthesize JSON=_JSON; - (void).cxx_destruct;- (void)repeatOperation;- (_Bool)operationHas401Code;- (_Bool)shouldHandle401Code;- (void)operationDidFinish:(id)arg1withErrors:(id)arg2;- (void)finishWithError:(id)arg1;- (id)initWitMethod:(id)arg1params:(id)arg2;- (id)initWitMethod:(id)arg1params:(id)arg2 HTTPMethod:(id)arg3;- (id)initWitMethod:(id)arg1queryItems:(id)arg2;- (id)initWitMethod:(id)arg1params:(id)arg2 HTTPMethod:(id)arg3 queryItems:(id)arg4; @end

大家可以从上面这段代码中看到,其中包含了很多很多的属性和方法。从这些方法名中可以看出,这个类应该就是负责处理Periscope API调用的类了。

接下来,我打开了Hopper来验证我的想法。果然没错,这些方法都会调用initWitMethod并通过传递各种参数来实现API的初始化。

这样一来,我只需要找出其他调用了这个方法的地方,我就能够列出所有的Periscope API调用以及相关的参数名。通过对相关类进行深入分析之后,我还可以从静态字符串中提取出Mevo的API root、clinet_id以及client_secret了。

接下来,我们就可以检查Periscope的OAuth实现中的漏洞了,而Periscope初始的身份认证节点并没有部署CSRF保护机制。如果一个第三方应用可以请求获取用户Periscope账号信息的完整权限,那么攻击者就有可能创建一个恶意第三方应用来伪装成用户执行恶意操作了。

总结

1.从今以后,我都会时刻关注Twitter的更新情况,并在第一时间对Twitter新上线的功能进行安全测试。 2.将功能开放给特定的第三方(或在公开API之前)不意味着你就不用对该功能的安全性进行测试了,有时我们只需要找到一个访问API的方法,我们也许就能轻松地找出其中存在的安全问题。当然了,如果厂商给特定服务设立了漏洞奖励计划的话,你也许就不必绕弯路了。 3.最后一点,当你没钱的时候,不要立刻放弃,你应该想办法绕过或避免那些需要你花钱的东西。不过你也可以换个角度考虑,人们一般都不喜欢去投资那些所谓的“不确定性”,这也就意味着如果某个服务需要收费,说明会有一部分人不愿意花钱去测试,那你就很有可能从中发现一些别人无法发现的漏洞了。如果这个服务又有漏洞奖励计划的话,那你估计就要发财了。

参考资料

关于该漏洞的详细技术分析以及PoC,请参考发布在HackerOne上的原始报告。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hadoop学习

hadoop商业版本选择对比

记得刚接触到hadoop的时候跟大部分人一样都会抱怨hadoop的安装部署问题,对于一个新手来说这这的是个头疼的问题,可能需要花费一整天的时间才能把分布式环境安...

1.2K20
来自专栏服务端技术杂谈

[硅谷热门公司技术巡礼]:UBER数据大迁徙

想象一下如果你必须在几个星期内迁移数以亿计的数据和100多个服务项目,同时还要保持UBER被几百万的乘客正常使用,这是多么艰巨的任务啊!而以下这个故事就是关于数...

31370
来自专栏企鹅号快讯

Go 语言如何去解决 Web 开发人员面临的众多问题?

坦白的说,我的团队非常厌恶我对 Go 语言传道的方式,每当我们团队的代码库出现问题时,他们希望我用一种更委婉的方式提出。 我学会的第一门编程语言是 PHP,这是...

383100
来自专栏BestSDK

人机交互,6种最被BAT认可的加载模式

作为用户体验设计师,不管是产品、交互还是UI,都习惯于站在人机交互的角度去思考产品设计问题,在这个过程中我们往往会忽略了一个重要的过程:数据传输。先看下面这张图...

49240
来自专栏程序员宝库

看吧,这就是现代化 PHP 该有的样子

这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍 。 讨论请前往:https://laravel-china.org/topics/8690...

54060
来自专栏Java架构师学习

数据库高可用实战案例:架构优化背景前期调研详细调研测试过程实施过程细节问题处理

26360
来自专栏沃趣科技

Gitlab删库事件回顾,备份手段还停留在“原始社会”?

作者简介:孙朝阳 沃趣科技高级产品经理。 Gitlab简介 Gitlab是大家很熟悉的开源Git代码托管工具,国内公司大多使用社区版自行搭建私有化的内部代码托...

40360
来自专栏知晓程序

如何删除小程序缓存 / 小程序列表能同步吗 / 追剧小程序推荐 | 小程序问答 #11

不知道有多少人在用微信谈工作?每次向对方用纯文字介绍自己的时候,都觉得低效又不美观。

13730
来自专栏云计算D1net

如何在云中处理特权用户管理问题

对于在云中进行操作的企业来说,特权用户管理是非常重要的。专家Dave Shackleford在本文中介绍了一些最佳做法以帮助确保云访问控制的安全性。 很多企业正...

29280
来自专栏北京马哥教育

做Linux背锅2年,我总结了这六类好习惯和30个血的教训

一、线上操作规范 1.测试使用 当初学习Linux的使用,从基础到服务到集群,都是在虚拟机做的,虽然老师告诉我们跟真机没有什么差别,可是对真实环境的渴望日渐上升...

457120

扫码关注云+社区

领取腾讯云代金券