本文转载自【微信公众号:手机电脑双黑客,ID:heikestudio】,经微信公众号授权转载,如需转载与原文作者联系
世界那么大,谢谢你来看我!!关注我你就是个网络、电脑、手机小达人
还在拿GIF做表情包?这是武器!说到GIF动图,大家可能第一反应是手机微信里那各式各样的表情包了,用表情包斗图是现在人们的一种沟通方式。然而,GIF动图到了黑客手里,就不仅是一种"沟通方式"了。通过Microsoft Teams的的域名劫持漏洞结合GIF图片传播,该漏洞允许攻击者向用户团队发送一个GIF动图,看似"楚楚可怜",实则暗藏恶意链接,可以针对使用Microsoft Teams的组织机构实现用户数据窃取和全部Teams账户劫持。该攻击场景下,用户只需浏览到经过构造的GIF图片即可中招,具备广泛的传播危害性。
随着COVID-19疫情的蔓延,越来越多的公司机构都采取了网络远程方式办公,Teams、Slack和Zoom都是目前非常流行的远程办公应用,尤其在当前复杂的疫情形势下,这些应用在远程办公、维系客户和第三方伙伴的关系中都发挥了重要作用。从人员招聘、视频会议、群聊交友、直播带货等等,越来越多的活动都放到了网络上进行,但随之而来的即是大量用户个人信息、账号信息、商业机密等敏感数据都在远程应用上"奔跑",这致使它们毫无疑问地成为了黑客们的主要攻击目标。
回到我们的研究场景中来,以下即是我们的一个大概的攻击流程,请仔细观察,可以看到,攻击者只需向受害者发送一张恶意GIF或其它类型图片,就可对整个组织机构内的Microsoft Teams用户实现账户劫持。

Microsoft Teams工作机制介绍
Microsoft Teams是微软旗下的一个流行的协同交互应用,具备工作交流、视频会议、文件存储和集成办公等功能,其主要优势之一是提供了与企业Office 365订阅的集成,并能与其它非微软应用形成扩展。

幸运Cookie
在我们对Microsoft Teams的研究中发现,其在处理图片资源请求的访问令牌过程中,存在可深入挖掘分析的地方。简单来说,每次当用户打开Microsoft Teams客户端时,Microsoft Teams的后端服务器login.microsoftonline.com即会为当前用户生成一个JWT格式的临时token或access token,除此之外,Microsoft Teams后端还会为用户生成其它访问微软服务的令牌,如访问SharePoint、Outlook的令牌等等。
在这些生成的token中有一个叫"skype token"的令牌,其cookie名为"skypetoken_asm",Microsoft Teams客户端用户用它可以浏览访问或分享组织机构内存储在远端微软服务器上的图片资源,然而,该token的作用不仅只是浏览或分享图片,还能用于消息分享验证。
如今大多数应用服务中都采用了Rest API的方式来与用户交互,很多复杂应用如Microsoft Teams为了具备良好的交互效率和多服务运行,一般都会部署多个API服务端,客户端与API服务端之间以验证信息作为身份校验,其中一种常见的校验方式就是Authorization header,Microsoft Teams服务端API即是采用了Authorization header方式与客户端进行身份验证,但经我们发现这种验证方式在处理客户端的图片资源请求时存在问题。
原因在于:
Microsoft Teams把客户端用户的大多数authentication token都存储在了浏览器的local storage当中,cookie方式的验证用到的不多。按理来说,在Microsoft Teams客户端用户访问或浏览图片资源的过程中,需要把当前的authentication token发往存储有相应图片资源的Microsoft服务器中,但这里在图片获取过程中有时候会遇到问题。为此有两种解决方法,一是以JS代码把图片内容作为一个blob对象来获取,在其中可以把图片的src属性设置为blob对象。另一种方法是,以hash或类似字串方式创建指向图片资源的一个access token,就像以下Facebook的图片访问方式一样,其中的oh和oe即是类似hash的东西:
https://scontent.fsdv2-1.fna.fbcdn.net/v/t1.0-9/r270/10101010_10101010_10101010_o.jpg?_nc_cat=102&_nc_sid=111111&_nc_ohc=ABC&_nc_ht=scontent.fsdv2-1.fna&oh=9e2a890f5f05001e01c16d9731983d3e&oe=2AB1FCCC
在此,Microsoft Teams开发者采用了不同的组合方式,某些情况下,Teams用到了正常的URL加载方法,即如以下在图片"src"中设置了一个URI来进行加载访问。
<img ng-show="!giphyCtrl.playVideo" ng-src="https://media2.giphy.com/media/gB4KWtd3uSsJq/giphy.gif" height="240"width="480" load-image-handlersrc="https://media2.giphy.com/media/gB4KWtd3uSsJq/giphy.gif">
这里存在的问题是,Microsoft Teams如何保证正确或有权限的用户才能查看到这些图片呢?如用户分享的图片应该只有互相才能看到,为此,Microsoft Teams增加了名为"authtoken"和"skypetoken_asm"的cookie来进行访问限制,如下图"authtoken"cookie所示:

上图中可以看到,"authtoken"cookie中包含了一个JWT形式的access token,它会被发送到*.teams.microsoft.com,该JWT的处理后端是api.spaces.skype.com,也即是说只有特定的域名才能接收该token。但api.spaces.skype.com只负责验证token,并不处理具体的消息发送请求,为此需要找到包含token的发起请求。
接下来,我们在Microsoft Teams聊天消息的网络交互中,找到了包含skypetoken,执行图片分享浏览的请求:
GEThttps://amer.ng.msg.teams.microsoft.com/v1/users/ME/conversations/19%3A...%40unq.gbl.spaces/messages?view=msnp24Equivalent|supportsMessageProperties&pageSize=200&startTime=1HTTP/1.1 Host: amer.ng.msg.teams.microsoft.com Connection: keep-alivePragma: no-cache Cache-Control: no-cache x-ms-session-id: 00000000000-0000-0000-0000-00000000000 BehaviorOverride: redirectAs404 x-ms-scenario-id: 00 x-ms-client-cpm: ApplicationLaunch x-ms-client-env: x-ms-client-type: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36ClientInfo: Accept: json Sec-Fetch-Dest: empty x-ms-client-version:x-ms-user-type: user Authentication:skypetoken=eyJhbGciOiJSUzI1NiIsImtpZCI6IkVhc3RlckVnZyA6KSIsInR5cCI6IkpXVCJ9.eyJ... Origin: https://teams.microsoft.com Sec-Fetch-Site: same-site Sec-Fetch-Mode: cors Referer: https://teams.microsoft.com/_ Accept-Encoding:gzip, deflate, br Accept-Language: en-US,en;q=0.9
从上图中可以看到,要发起这么一个图片请求首先需要获取一个"skypetoken",但如何来得到呢?在更深入的网络交互分析中,我们发现下面的POST请求即是创建"skypetoken"的请求:
POST /api/authsvc/v1.0/authz HTTP/1.1 Host: teams.microsoft.comConnection: close Content-Length: 0 Pragma: no-cache Cache-Control: no-cache x-ms-session-id: 00000000000-0000-0000-0000-00000000000 x-ms-scenario-id: 00 x-ms-user-type: user x-ms-client-env: x-ms-client-type: Authorization: BearereyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IktleXMiLCJraWQiOiJLZXlzRXZlcnlXaGVyZSJ9.eyJ... Accept: application/json, text/plain, */* X-Client-UI-Language: en-us Sec-Fetch-Dest: empty ms-teams-authz-type: TokenRefreshx-ms-client-version: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36Origin: https://teams.microsoft.com Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Referer: https://teams.microsoft.com/_ Accept-Encoding: gzip,deflate Accept-Language: en-US,en;q=0.9 Cookie: {redacted}
下次我们来详细分析攻击过程!
声明:本人分享该教程是希望大家,通过这个教程了解信息安全并提高警惕!本教程仅限于教学使用,不得用于其他用途触犯法律,本人一概不负责,请知悉!
免责声明:本文旨在传递更多市场信息,不构成任何投资建议和其他非法用途。文章仅代表作者观点,不代表手机电脑双黑客立场。以上文章之对于正确的用途,仅适用于学习
本文转载自【微信公众号:手机电脑双黑客,ID:heikestudio】,经微信公众号授权转载,如需转载与原文作者联系

微信扫一扫打赏
支付宝扫一扫打赏