OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。
OAuth授权有如下几个阶段,如图:
第一步:申请授权
在这一步,网站向IDP发起授权请求。比如说你想要从Office365获取用户的某些权限,那么你需要生成一个带有你想要请求的权限的链接,权限通过SCOPES这个参数来传递。
上图为钓鱼邮件伪装成Spotify官方,发起授权申请,这个类似网络钓鱼。
上图为用户点击链接后,跳转到LIVE进行授权许可(当然,你保持一定的警惕的话,应该不会上当)。
第二步:获取授权
当用户点击链接后会跳转到IDP(Microsoft, Google等)的授权接口,如果你还没登录,网站会要求你先登录,如果已经是登录的状态,页面中会有个选择按钮让你选,YES或者NO,这个选择是将权限授予应用的最后一道屏障。
上图就是用户未登录,网站要求用户登录的情况。
上图为已登录的情况下,网站询问是否要给应用授权。
第三步:获取权限
如果用户在上一步中点击了YES,IDP就会生成AuthCode给应用。
应用将自己的ApplicationID、secret、用户的AuthCode一起发送给授权服务器,如果这三个参数确认无误,服务器会返回一个accessToken给应用,之后应用带着这个accessToken就能获取资源服务器上用户的资源(SCOPES中申请的权限)。
上图为你已允许授权的应用。
讲完了上面的基础知识后,接下来开始进入攻击阶段,分成以下几部分:
1、创建一个应用Sappo
2、利用该应用创建一个申请授权的链接(SCOPE)
3、用户给应用Sappo授权后,获取AuthCode
4、利用AuthCode获取accessToken
5、使用accessToken以API请求的方式获取所有资源
下面来讲一讲具体的实施步骤。
一、创建一个应用
我们将在Microsoft平台上创建一个名为”Sappo”的应用,通过该应用来盗取Office365和Windows Live用户的数据。
首先,我们登录Outlook账号,访问apps.dev.microsoft.com,创建一个新的应用,然后我们会获取到该应用的Application ID和Secret,同时我们也需要设定一个end–point来回收后面服务器返回的AuthCode和accessToken,这个end-point需要我们可控,并且一直监听所有的请求。
上图为创建的”Sappo”应用
Sappo这个框架的作用就是利用授权accessToken来获取用户的数据。为了更直观的演示整个过程,接下来在Sappo上创建一个app,用来作为end-point,我们将这个app命名为”MS PRO O365 AntiSpam”,目的是模仿AntiSpam Pro免费版,这样用户在查看的时候,才不会产生怀疑。
二、创建一个申请授权的链接(SCOPE)
为了获取权限,用户会被url重定向至Microsoft,该url要包含如下格式数据:
GET https://login.microsoftonline.com/common/oauth2/authorize/common/oauth2/authorize?scope=[scope_list]&response_type=[code]&client_id=[client_id]&redirect_uri=[redirect_uri]
通过client_id来指明是哪个应用申请授权,通过scope来指明申请的是哪些权限,通过redirect_uri来指明返回的AuthCode要送到哪里去。
上图为应用被允许申请的Windows Live权限,其中有一些允许通过API来读写邮件,但实际上真正操作的时候是会被禁止的。
上图为Windows Live中更多的允许应用和OneDrive、OneNote进行交互的授权。
上图为Office365中允许API进行邮件读写删除的授权
一旦设置好链接,就可以通过邮件进行发送了。我们选择使用Microsoft的邮箱账号来进行邮件的发送,并且将邮件的内容伪装成像来自AntiSpam Pro一样。我们在上面建立的app中已经集成了这样的功能,这里还需要选定一个攻击对象,如下图。
最后发出去的邮件是下面这样子的。
用户收到这封邮件后,如果他点击了链接,用户就会被重定向到授权页面。
就像上面你看到的,这是一个web钓鱼,并不要求用户输入用户名和密码,而且页面是在Microsoft的域名下,是来自https的请求,并且证书也是绿标的。
三、获取accessToken
当用户点击YES授权后,AuthCode会被传送到先前设定的Redirect‐URI,接下来应用就可以通过如下的格式去申请获取accessToken:
POST common / oauth2 / HTTP / 1.1 token Host: https://login.microsoftonline.com Content‐Type: application/x‐www‐form‐urlencoded grant_type=[ authorization_code ]&code=[ authCode ] &client_id=[ client_id ]&client_secret=[ secret ] &redirect_uri=[ redirect_uri ]
client_id为应用的Application ID,secret为当前应用的secret,如果AuthCode被验证通过了,则accessToken会被发给设定的redirect_uri。
如上图,accessToken是以JWT (JSON Web token)的格式返回的,是一串经过URL编码后再BASE64编码的字符串,包含3部分:Header、Payload、Signature。经过解码后的数据如下
scp中规定了我们的应用已经申请的权限。
每次向IDP发起API请求资源时都要附带上accessToken的原始数据,格式如下:
Https://login.microsoftonline.com/common/oauth2/authorize GET HTTP / 1.1 Host: login.microsoftonline.com Authorization: Bearer [ access_token ]
四、使用API获取用户在IDP的数据
在用户点击了授权之后,我们在sappo上搭建的应用能够自动实现获取authCode并转化为access_token,这时候我们只要操作一下界面就能以API的形式向IDP申请获取数据。
以Office365为例,我们所申请的权限足以操作邮件服务。
如上图,我们可以查看用户的邮件,也能以用户的身份对外发送邮件。
如果你要撤销此类授权,需要到Office 365的配置中,找到这个这个应用,然后点击取消授权。
接下来以Windows Live为例,和之前的Office 365 差不多一样的步骤,只是这里需要把申请的权限换成Windows Live设定的。
同样的,只要用户点击了YES后,就会给我们的应用授权,在我们获取到accessToken之后,就能以API的方式去请求用户的数据了。当然,上面也说过,虽然Windows Live的权限申请中有包含email,但是目前却是不可访问的,不过之后应该就会支持了。
虽然邮件不能访问,但是我们可以去看看用户存储在OneDrive上的数据,只要点击上面的”OneDrive storage”,app就会自动向资源服务器发起请求,我们就能进到该用户的OneDrive中了,之后你可以对文件进行下载,查找文件等,就像在操作自己的账户一样。
同样的如果你要撤销此类授权,需要到”应用和服务”选项中,找到这个应用,然后点击取消授权。点击进入这个应用后,你就能看到这个应用已经申请的权限
能够获取到什么样的数据取决于授权方设定了哪些权限允许被申请。现在最大的问题是,我们以前都是教育大家说钓鱼网站会通过让用户填入账号密码,然后盗取你的数据,但是现在的情况却不是这样子的。就像上面说过的,这次的OAuth钓鱼,授权是在Windows这个域名下的,是被浏览器认定为绿色标志的,而且也没有要求输入账号密码(指已登录的用户,未登录用户输入的账号密码也是登录该网站,于钓鱼网站无关),这与我们之前的认知完全不一样。在这样的情况下,即使是专业人士,也不一定能识别攻击。
怎么办?从用户的角度来看,给应用授权的时候一定要十分小心,并且对给予应用授予的权限要仔细斟酌。从授权方来看,虽说方便但是还是要对应用所能申请的权限进行一定的限制,否则再方便的应用,没有了安全性,谁还敢用?另外,可以通过一些手段来对应用进行限制,比如当用户从总门户进来时,才可以进行解密然后浏览数据,而当api到来时,看到的数据都是加密的。
*参考来源: youtube , elladodelmal ,转载请注明来自FreeBuf.COM。