利用MailSniper实现Google日历事件注入攻击

本文详细介绍了Google日历事件注入漏洞,攻击者无需发送邮件即可在目标日历中创建事件,并利用MailSniper工具绕过安全设置进行社会工程攻击,涉及API利用和防御绕过技术。

利用MailSniper实现Google日历事件注入攻击

Beau Bullock & Michael Felch //

来源: Google Calendar Chrome扩展

概述

Google日历是Google账户提供的众多功能之一,与其他流行服务如Gmail和Google Drive一同提供。在企业中,日历可能是仅次于电子邮件的第二常用生产力软件。它允许员工安排工作周,以便实际完成任务。Google有一个有趣的功能,可以自动将各种事件添加到您的日历中。如果您的Google账户收到一封电子邮件,说明您已预订航班、晚餐预订甚至电影票,Google会自动将这些事件添加到您的日历中。

Black Hills Information Security(BHIS)深入研究了这些事件是如何生成的。BHIS发现,无需向目标发送电子邮件即可在其日历上创建事件。此外,Google账户上可以启用安全控制以防止这种情况发生,但BHIS发现了绕过这些控制的方法。在本文中,BHIS将讨论这种“事件注入”漏洞、相关风险以及如何使用MailSniper利用它。

BHIS已将此问题报告给Google。详情请参见下面的“披露时间线”部分。

背景

我们正在为客户进行一次红队评估,我们知道这将很困难。发现该客户正在使用G Suite For Business,这是Google为企业客户提供的服务之一,这些客户希望由Google托管其企业电子邮件和其他服务。了解到这一点后,我们想尝试一种不同的方法来红队测试该环境。

几个月前,我们中的一个人遇到了一件有趣的事情。日历上弹出一个Google事件通知,称预订的航班将在10分钟后起飞。这不是BHIS员工预订的航班。打开事件并检查事件创建的来源,发现该事件是由发送的电子邮件生成的。一位同事在电子邮件中发送了他们的航班行程,Google认为这些细节是另一位BHIS员工的行程,并自动将其添加到他们的日历中。

在研究这些事件是如何生成时,发现甚至不需要电子邮件即可在别人的日历中创建事件。这可以通过Google日历UI手动轻松完成。当您创建事件并添加嘉宾时,Google会询问您是否要在保存后向嘉宾发送邀请。只需选择“不发送”即可将事件保存到嘉宾的日历(如果是Google账户),而不会向他们发送电子邮件。

BHIS认为这可能为网络钓鱼G Suite环境的用户提供非常有趣的情况。由于大多数用户都经过培训以识别电子邮件中的网络钓鱼链接,并且Google本身有一些保护措施来防止网络钓鱼Gmail用户,我们认为通过日历事件进行社会工程用户可能更成功。

事件注入与社会工程

日历最有趣的元素可能是它可以通过提醒用户某事来创造紧迫感。也许用户完全“忘记”了他们有一个会议安排。如果某人将Google账户链接到他们的手机,则可以在他们的手机上生成事件警报以及发送到其账户的电子邮件。至于使用的借口,可能性是无限的。在这次特定的红队评估中,我们非常成功的一个借口是“全员会议”将在10分钟后举行。在事件正文中,我们包含了指向需要在会议前阅读的议程的文本。

事件正文中链接的网站托管了一个假的Google身份验证页面,该页面捕获了他们的凭据并将用户重定向到假议程(关于使用CredSniper的假身份验证页面的更多信息将在本文第二部分讨论)。这种方法被证明非常成功。

Invoke-InjectGEvent和Invoke-InjectGEventAPI

MailSniper中添加了新模块,用于将事件注入目标日历。第一种方法(Invoke-InjectGEvent)只需要一组Google账户凭据。我们将讨论的第二种方法(Invoke-InjectGEventAPI)涉及直接连接到Google API。要使用MailSniper将事件注入Google日历,首先将MailSniper.ps1(https://github.com/dafthack/MailSniper)导入PowerShell会话。

1
PS C> Import-Module MailSniper.ps1

接下来,您需要一个Google账户。如果您试图社会工程一个组织,一个潜在的想法是对目标组织进行一些侦察,找到一名高级员工,并以类似名称注册一个Gmail账户。这样,当目标看到事件弹出日历时,组织者的名称看起来有些熟悉。然后,这些凭据可以与Invoke-InjectGEvent模块一起使用,如下所示:

1
PS C> Invoke-InjectGEvent -EmailAddress emailaddressofattacker@gmail.com -Password attackerpassword -EventTitle Title of Event -EventLocation https://global.gotomeeting.com/join/123456890 -EventDescription Summary of the event... Maybe include link to a fake Google Auth Page -StartDateTime 20171031T160000 -EndDateTime 20171031T163000 -Targets victim@gmail.com

这将在目标的日历中创建一个事件,前提是他们没有禁用“自动添加事件”功能,我们稍后会讨论。

Google日历中可以设置一些设置以防止事件自动添加到日历。第一个设置称为“来自Gmail的事件”,有一个复选框称为“自动添加”。如果选中此复选框,Google将自动从发送到Gmail账户的电子邮件中添加事件(类似于上面提到的航班行程)。

第二个设置称为“自动将邀请添加到我的日历”。这里有三个选项:

  • 是,但除非我回应“是”或“可能”,否则不发送事件通知
  • 否,仅显示我已回应的邀请

对于第一个设置,这仅防止在发件人实际向您发送电子邮件邀请时添加事件。仅执行前面列出的手动步骤来创建日历条目而不发送通知仍然有效。第二个设置更有趣。有一个选项声明“否,仅显示我已回应的邀请”。这防止了第一种注入事件的方法工作。然而,BHIS发现可以使用Google API将目标的响应状态设置为“已接受”。这有效地绕过了此安全设置。

一个名为Invoke-InjectGEventAPI的模块已添加到MailSniper中,用于通过Google API注入这些类型的事件。为了连接到Google API,首先必须采取几个步骤来获取API访问令牌。

A. 使用您想要注入事件的账户登录Google。 B. 转到 https://console.developers.google.com/flows/enableapi?apiid=calendar&pli=1。 C. 创建/选择一个项目并同意服务条款并继续。 D. 单击“转到凭据”。 E. 在“向项目添加凭据”页面上单击取消。 F. 在页面顶部,选择“OAuth同意屏幕”选项卡。选择一个电子邮件地址,输入产品名称(如果尚未设置),然后单击保存按钮。 G. 选择“凭据”选项卡,单击“创建凭据”按钮并选择OAuth客户端ID。 H. 选择应用程序类型Web应用程序,在“授权重定向URI”中粘贴以下地址:https://developers.google.com/oauthplayground。然后,单击创建按钮。 I. 复制您的“客户端ID”和“客户端密钥”。 J. 导航到这里:https://developers.google.com/oauthplayground/。 K. 单击右上角的“齿轮图标”并选中“使用您自己的OAuth凭据”框。在框中输入OAuth2客户端ID和OAuth2客户端密钥。 L. 确保“OAuth流”设置为服务器端,并且“访问类型”设置为离线。 M. 选择“Calendar API v3”下拉菜单,并单击两个URL以将它们添加到范围。单击授权API。 N. 选择您要授权的账户,然后单击允许。(如果出现错误,例如“错误:redirect_uri_mismatch”,则可能更改尚未传播。只需等待几分钟,单击后退按钮并尝试再次授权。) O. 您现在应该处于“步骤2:交换授权代码以获取令牌”。单击“交换授权代码以获取令牌按钮”。“访问令牌”是访问API所需的项目。复制“访问令牌”的值。

现在您有一个可以访问Google API的Google账户,您可以使用MailSniper模块Invoke-InjectGEventAPI来注入事件,绕过前面提到的安全设置。请注意,“访问令牌”在3600秒后过期。计划很快将添加一个用于刷新此令牌的模块到MailSniper中,但只需单击前面屏幕截图中显示的“刷新访问令牌”按钮即可生成一个新的。

在将MailSniper导入PowerShell会话后,如前所示,可以使用以下命令通过Google API将事件注入目标的日历。

1
PS C> Invoke-InjectGEventAPI -PrimaryEmail your-api-email-address@gmail.com -AccessToken 'Insert your access token here' -Targets "CEOofEvilCorp@gmail.com,CTOofEvilCorp@gmail.com,CFOofEvilCorp.com" -StartDateTime 2017-10-22T17:20:00 -EndDateTime 2017-10-22T17:30:00 -EventTitle "All Hands Meeting" -EventDescription "Please review the agenda at the URL below prior to the meeting. https://definitelynotmalicious.com" -EventLocation "Interwebz"

绕过安全设置的原因是因为Google API在事件上有一个可写属性称为attendees[].responseStatus,可以设置为“accepted”。在创建事件时设置此属性,有效地使目标看起来已经接受了事件。

结论

截至本文发布之日,可以在受害者无法阻止的情况下将事件注入Google日历。此外,无需发送电子邮件邀请即可直接向Google用户的日历注入事件,而他们从未收到通知。这为社会工程Google用户提供了一个非常独特的机会。Black Hills Information Security已将此问题报告给Google。详情请参见下面的“披露时间线”部分。

请继续关注本文的第二部分,我们将讨论CredSniper,一个全新的网络钓鱼Google用户的框架,包括捕获各种双因素身份验证令牌。

披露时间线

  • 10月9日 – BHIS向Google披露有和没有Calendar API的事件注入
  • 10月9日 – Google发送自动响应
  • 10月10日 – Google分类报告
  • 10月17日 – Google发布日历更新(静默添加日历设置以禁用注入)
  • 10月27日 – BHIS在WWHF公开披露事件注入
  • 10月31日 – Google回应称这是一个功能,设置提供了用户禁用的能力
  • 10月31日 – BHIS向Google更新了绕过设置的分步程序
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计