主页 > 网络知识 > 通过GIF图片可对Microsoft Teams用户账户进行劫持

通过GIF图片可对Microsoft Teams用户账户进行劫持

 

通过GIF图片可对Microsoft Teams用户账户进行劫持

 

近期,以色列安全公司cyberark通过Microsoft Teams的子域名劫持漏洞结合GIF图片传播,可以针对使用Microsoft Teams的组织机构实现用户数据窃取和全部Teams账户劫持。该攻击场景下,用户只需浏览到经过构造的GIF图片即可中招,具备广泛的传播危害性。

背景介绍

随着COVID-19疫情的蔓延,越来越多的公司机构都采取了网络远程方式办公,Teams、Slack和Zoom都是目前非常流行的远程办公应用,尤其在当前复杂的疫情形势下,这些应用在远程办公、维系客户和第三方伙伴的关系中都发挥了重要作用。

从人员招聘、视频会议、群聊交友、直播带货等等,越来越多的活动都放到了网络上进行,但随之而来的即是大量用户个人信息、账号信息、商业机密等敏感数据都在远程应用上“奔跑”,这致使它们毫无疑问地成为了黑客们的主要攻击目标。

回到我们的研究场景中来,以下即是我们的一个大概的攻击流程,请仔细观察,可以看到,攻击者只需向受害者发送一张恶意GIF或其它类型图片,就可对整个组织机构内的Microsoft Teams用户实现账户劫持。

 

通过GIF图片可对Microsoft Teams用户账户进行劫持

 

Microsoft Teams工作机制介绍

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

 

通过GIF图片可对Microsoft Teams用户账户进行劫持

 

幸运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-handler src="https://media2.giphy.com/media/gB4KWtd3uSsJq/giphy.gif">
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!