Az - AzureAD (AAD)

Unterstütze HackTricks

Grundinformationen

Azure Active Directory (Azure AD) dient als Microsofts cloudbasierter Dienst für Identitäts- und Zugriffsmanagement. Es ist entscheidend, um Mitarbeitern das Anmelden und den Zugriff auf Ressourcen sowohl innerhalb als auch außerhalb der Organisation zu ermöglichen, einschließlich Microsoft 365, dem Azure-Portal und einer Vielzahl anderer SaaS-Anwendungen. Das Design von Azure AD konzentriert sich darauf, wesentliche Identitätsdienste bereitzustellen, insbesondere Authentifizierung, Autorisierung und Benutzerverwaltung.

Zu den Hauptmerkmalen von Azure AD gehören Multi-Faktor-Authentifizierung und bedingter Zugriff, zusammen mit nahtloser Integration in andere Microsoft-Sicherheitsdienste. Diese Funktionen erhöhen erheblich die Sicherheit der Benutzeridentitäten und ermöglichen es Organisationen, ihre Zugriffsrichtlinien effektiv umzusetzen und durchzusetzen. Als grundlegender Bestandteil des Ökosystems der Cloud-Dienste von Microsoft ist Azure AD entscheidend für das cloudbasierte Management von Benutzeridentitäten.

Entitäten

Aufzählung

Für diese Aufzählung kannst du das az cli tool, das PowerShell-Modul AzureAD (oder AzureAD Preview) und das Az PowerShell Modul verwenden.

In Linux musst du PowerShell Core installieren:

sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common

# Ubuntu 20.04
wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb

# Update repos
sudo apt-get update
sudo add-apt-repository universe

# Install & start powershell
sudo apt-get install -y powershell
pwsh

# Az cli
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

Module Unterschiede

  • AzureAD ist ein PowerShell-Modul von Microsoft zum Verwalten von Azure AD. Es zeigt nicht alle Eigenschaften von Azure AD-Objekten an und kann nicht verwendet werden, um Informationen zu Azure-Ressourcen abzurufen.

  • Az PowerShell ist ein Modul zum Verwalten von Azure-Ressourcen über die PowerShell-Befehlszeile.

Verbindung

az login #This will open the browser
az login -u <username> -p <password> #Specify user and password
az login --identity #Use the current machine managed identity (metadata)
az login --identity -u /subscriptions/<subscriptionId>/resourcegroups/myRG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myID #Login with user managed identity
# Login as service principal
az login --service-principal -u http://azure-cli-2016-08-05-14-31-15 -p VerySecret --tenant contoso.onmicrosoft.com #With password
az login --service-principal -u http://azure-cli-2016-08-05-14-31-15 -p ~/mycertfile.pem --tenant contoso.onmicrosoft.com #With cert

# Request access token (ARM)
az account get-access-token
# Request access token for different resource. Supported tokens: aad-graph, arm, batch, data-lake, media, ms-graph, oss-rdbms
az account get-access-token --resource-type aad-graph

# If you want to configure some defaults
az configure

# Get user logged-in already
az ad signed-in-user show

# Help
az find "vm" # Find vm commands
az vm -h # Get subdomains
az ad user list --query-examples # Get examples

Wenn Sie sich über die CLI bei Azure mit einem Programm anmelden, verwenden Sie eine Azure-Anwendung aus einem Mandanten, der zu Microsoft gehört. Diese Anwendungen, wie die, die Sie in Ihrem Konto erstellen können, haben eine Client-ID. Sie werden nicht alle sehen können in den erlaubten Anwendungslisten, die Sie in der Konsole sehen können, aber sie sind standardmäßig erlaubt.

Zum Beispiel verwendet ein Powershell-Skript, das sich authentifiziert, eine App mit der Client-ID 1950a258-227b-4e31-a9cf-717495945fc2. Selbst wenn die App nicht in der Konsole angezeigt wird, könnte ein Sysadmin diese Anwendung blockieren, sodass Benutzer nicht über Tools, die sich über diese App verbinden, darauf zugreifen können.

Es gibt jedoch andere Client-IDs von Anwendungen, die es Ihnen ermöglichen, sich mit Azure zu verbinden:

# The important part is the ClientId, which identifies the application to login inside Azure

$token = Invoke-Authorize -Credential $credential `
-ClientId '1dfb5f98-f363-4b0f-b63a-8d20ada1e62d' `
-Scope 'Files.Read.All openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "https://graphtryit-staging.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue

$token = Invoke-Authorize -Credential $credential `
-ClientId '65611c08-af8c-46fc-ad20-1888eb1b70d9' `
-Scope 'openid profile Sites.Read.All User.Read email' `
-Redirect_Uri "chrome-extension://imjekgehfljppdblckcmjggcoboemlah" `
-Verbose -Debug `
-InformationAction Continue

$token = Invoke-Authorize -Credential $credential `
-ClientId 'd3ce4cf8-6810-442d-b42e-375e14710095' `
-Scope 'openid' `
-Redirect_Uri "https://graphexplorer.azurewebsites.net/" `
-Verbose -Debug `
-InformationAction Continue

Benutzer

# Enumerate users
az ad user list --output table
az ad user list --query "[].userPrincipalName"
# Get info of 1 user
az ad user show --id "test@corp.onmicrosoft.com"
# Search "admin" users
az ad user list --query "[].displayName" | findstr /i "admin"
az ad user list --query "[?contains(displayName,'admin')].displayName"
# Search attributes containing the word "password"
az ad user list | findstr /i "password" | findstr /v "null,"
# All users from AzureAD
az ad user list --query "[].{osi:onPremisesSecurityIdentifier,upn:userPrincipalName}[?osi==null]"
az ad user list --query "[?onPremisesSecurityIdentifier==null].displayName"
# All users synced from on-prem
az ad user list --query "[].{osi:onPremisesSecurityIdentifier,upn:userPrincipalName}[?osi!=null]"
az ad user list --query "[?onPremisesSecurityIdentifier!=null].displayName"
# Get groups where the user is a member
az ad user get-member-groups --id <email>
# Get roles assigned to the user
az role assignment list --include-groups --include-classic-administrators true --assignee <email>

Benutzerpasswort ändern

$password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText –Force

(Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password –Verbose

MFA & Conditional Access Policies

Es wird dringend empfohlen, MFA für jeden Benutzer hinzuzufügen. Einige Unternehmen werden es jedoch nicht einrichten oder möglicherweise mit einem Conditional Access: Der Benutzer wird MFA erforderlich sein, wenn er sich von einem bestimmten Standort, Browser oder einer Bedingung anmeldet. Diese Richtlinien könnten, wenn sie nicht korrekt konfiguriert sind, anfällig für Umgehungen sein. Überprüfen Sie:

Gruppen

# Enumerate groups
az ad group list
az ad group list --query "[].[displayName]" -o table
# Get info of 1 group
az ad group show --group <group>
# Get "admin" groups
az ad group list --query "[].displayName" | findstr /i "admin"
az ad group list --query "[?contains(displayName,'admin')].displayName"
# All groups from AzureAD
az ad group list --query "[].{osi:onPremisesSecurityIdentifier,displayName:displayName,description:description}[?osi==null]"
az ad group list --query "[?onPremisesSecurityIdentifier==null].displayName"
# All groups synced from on-prem
az ad group list --query "[].{osi:onPremisesSecurityIdentifier,displayName:displayName,description:description}[?osi!=null]"
az ad group list --query "[?onPremisesSecurityIdentifier!=null].displayName"
# Get members of group
az ad group member list --group <group> --query "[].userPrincipalName" -o table
# Check if member of group
az ad group member check --group "VM Admins" --member-id <id>
# Get which groups a group is member of
az ad group get-member-groups -g "VM Admins"
# Get Apps where a group has a role (role not shown)
Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *

Benutzer zur Gruppe hinzufügen

Gruppenbesitzer können neue Benutzer zur Gruppe hinzufügen

Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose

Gruppen können dynamisch sein, was im Grunde bedeutet, dass wenn ein Benutzer bestimmte Bedingungen erfüllt, er zu einer Gruppe hinzugefügt wird. Natürlich, wenn die Bedingungen auf Attributen basieren, die ein Benutzer steuern kann, könnte er diese Funktion missbrauchen, um in andere Gruppen zu gelangen. Überprüfen Sie, wie man dynamische Gruppen auf der folgenden Seite missbrauchen kann:

Dienstprinzipale / Unternehmensanwendungen

Beachten Sie, dass Service Principal in der PowerShell-Terminologie Enterprise Applications im Azure-Portal (Web) genannt wird.

# Get Service Principals
az ad sp list --all
az ad sp list --all --query "[].[displayName]" -o table
# Get details of one SP
az ad sp show --id 00000000-0000-0000-0000-000000000000
# Search SP by string
az ad sp list --all --query "[?contains(displayName,'app')].displayName"
# Get owner of service principal
az ad sp owner list --id <id> --query "[].[displayName]" -o table
# Get service principals owned by the current user
az ad sp list --show-mine
# List apps that have password credentials
az ad sp list --all --query "[?passwordCredentials != null].displayName"
# List apps that have key credentials (use of certificate authentication)
az ad sp list -all --query "[?keyCredentials != null].displayName"

Der Eigentümer eines Dienstprinzipals kann sein Passwort ändern.

Liste und versuche, ein Client-Geheimnis für jede Unternehmensanwendung hinzuzufügen

```powershell # Just call Add-AzADAppSecret Function Add-AzADAppSecret { <# .SYNOPSIS Add client secret to the applications.

.PARAMETER GraphToken Pass the Graph API Token

.EXAMPLE PS C:> Add-AzADAppSecret -GraphToken 'eyJ0eX..'

.LINK https://docs.microsoft.com/en-us/graph/api/application-list?view=graph-rest-1.0&tabs=http https://docs.microsoft.com/en-us/graph/api/application-addpassword?view=graph-rest-1.0&tabs=http #>

[CmdletBinding()] param( [Parameter(Mandatory=$True)] [String] $GraphToken = $null )

$AppList = $null $AppPassword = $null

List All the Applications

$Params = @{ "URI" = "https://graph.microsoft.com/v1.0/applications" "Method" = "GET" "Headers" = @{ "Content-Type" = "application/json" "Authorization" = "Bearer $GraphToken" } }

try { $AppList = Invoke-RestMethod @Params -UseBasicParsing } catch { }

Add Password in the Application

if($AppList -ne $null) { [System.Collections.ArrayList]$Details = @()

foreach($App in $AppList.value) { $ID = $App.ID $psobj = New-Object PSObject

$Params = @{ "URI" = "https://graph.microsoft.com/v1.0/applications/$ID/addPassword" "Method" = "POST" "Headers" = @{ "Content-Type" = "application/json" "Authorization" = "Bearer $GraphToken" } }

$Body = @{ "passwordCredential"= @{ "displayName" = "Password" } }

try { $AppPassword = Invoke-RestMethod @Params -UseBasicParsing -Body ($Body | ConvertTo-Json) Add-Member -InputObject $psobj -NotePropertyName "Object ID" -NotePropertyValue $ID Add-Member -InputObject $psobj -NotePropertyName "App ID" -NotePropertyValue $App.appId Add-Member -InputObject $psobj -NotePropertyName "App Name" -NotePropertyValue $App.displayName Add-Member -InputObject $psobj -NotePropertyName "Key ID" -NotePropertyValue $AppPassword.keyId Add-Member -InputObject $psobj -NotePropertyName "Secret" -NotePropertyValue $AppPassword.secretText $Details.Add($psobj) | Out-Null } catch { Write-Output "Failed to add new client secret to '$($App.displayName)' Application." } } if($Details -ne $null) { Write-Output "" Write-Output "Client secret added to : " Write-Output $Details | fl * } } else { Write-Output "Failed to Enumerate the Applications." } }

</details>

### Rollen

<div data-gb-custom-block data-tag="tabs">

<div data-gb-custom-block data-tag="tab" data-title='az cli'>

```bash
# Get roles
az role definition list
# Get assigned roles
az role assignment list --all --query "[].roleDefinitionName"
az role assignment list --all | jq '.[] | .roleDefinitionName,.scope'
# Get info of 1 role
az role definition list --name "AzureML Registry User"
# Get only custom roles
az role definition list --custom-role-only
# Get only roles assigned to the resource group indicated
az role definition list --resource-group <resource_group>
# Get only roles assigned to the indicated scope
az role definition list --scope <scope>
# Get all the principals a role is assigned to
az role assignment list --all --query "[].{principalName:principalName,principalType:principalType,resourceGroup:resourceGroup,roleDefinitionName:roleDefinitionName}[?roleDefinitionName=='<ROLE_NAME>']"
# Get all available role templates
Get-AzureADDirectoryroleTemplate
# Get enabled roles (Assigned roles)
Get-AzureADDirectoryRole
Get-AzureADDirectoryRole -ObjectId <roleID> #Get info about the role
# Get custom roles - use AzureAdPreview
Get-AzureADMSRoleDefinition | ?{$_.IsBuiltin -eq $False} | select DisplayName
# Users assigned a role (Global Administrator)
Get-AzureADDirectoryRole -Filter "DisplayName eq 'Global Administrator'" | Get-AzureADDirectoryRoleMember
Get-AzureADDirectoryRole -ObjectId <id> | fl
# Roles of the Administrative Unit (who has permissions over the administrative unit and its members)
Get-AzureADMSScopedRoleMembership -Id <id> | fl *
# Get role assignments on the subscription
Get-AzRoleDefinition
# Get Role definition
Get-AzRoleDefinition -Name "Virtual Machine Command Executor"
# Get roles of a user or resource
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com
Get-AzRoleAssignment -Scope /subscriptions/<subscription-id>/resourceGroups/<res_group_name>/providers/Microsoft.Compute/virtualMachines/<vm_name>
# Get permissions over a resource using ARM directly
$Token = (Get-AzAccessToken).Token
$URI = 'https://management.azure.com/subscriptions/b413826f-108d-4049-8c11-d52d5d388768/resourceGroups/Research/providers/Microsoft.Compute/virtualMachines/infradminsrv/providers/Microsoft.Authorization/permissions?api-version=2015-07-01'
$RequestParams = @{
Method = 'GET'
Uri = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value

Geräte

# If you know how to do this send a PR!# Enumerate DevicesGet-AzureADDevice -All $true | fl *# List all the active devices (and not the stale devices)Get-AzureADDevice -All $true | ?{$_.ApproximateLastLogonTimeStamp -ne $null}# Get owners of all devicesGet-AzureADDevice -All $true | Get-AzureADDeviceRegisteredOwnerGet-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredOwner -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}# Registred users of all the devicesGet-AzureADDevice -All $true | Get-AzureADDeviceRegisteredUserGet-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredUser -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}# Get dives managed using IntuneGet-AzureADDevice -All $true | ?{$_.IsCompliant -eq "True"}# Get devices owned by a userGet-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com# Get Administrative Units of a deviceGet-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -ObjectId $_.ObjectId | where {$_.ObjectId -eq $deviceObjId} }

Wenn ein Gerät (VM) AzureAD verbunden ist, können Benutzer von AzureAD sich anmelden. Darüber hinaus, wenn der angemeldete Benutzer Besitzer des Geräts ist, wird er lokaler Administrator sein.

Anwendungen

Apps sind App-Registrierungen im Portal (nicht Unternehmensanwendungen). Jede App-Registrierung erstellt jedoch eine Unternehmensanwendung (Service Principal) mit demselben Namen. Darüber hinaus, wenn die App eine Multi-Tenant-App ist, wird eine andere Unternehmensanwendung (Service Principal) in diesem Mandanten mit demselben Namen erstellt.

Wenn eine App generiert wird, werden 2 Arten von Berechtigungen vergeben:

  • Berechtigungen, die dem Service Principal gegeben werden

  • Berechtigungen, die die App haben und im Namen des Benutzers verwenden kann.

# List Appsaz ad app listaz ad app list --query "[].[displayName]" -o table# Get info of 1 Appaz ad app show --id 00000000-0000-0000-0000-000000000000# Search App by stringaz ad app list --query "[?contains(displayName,'app')].displayName"# Get the owner of an applicationaz ad app owner list --id <id> --query "[].[displayName]" -o table# List all the apps with an application passwordaz ad app list --query "[?passwordCredentials != null].displayName"# List apps that have key credentials (use of certificate authentication)az ad app list --query "[?keyCredentials != null].displayName"# List all registered applicationsGet-AzureADApplication -All $true# Get details of an applicationGet-AzureADApplication -ObjectId <id> | fl *# List all the apps with an application passwordGet-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredential -ObjectID $_.ObjectID){$_}}# Get owner of an applicationGet-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *# Get AppsGet-AzADApplication# Get details of one AppGet-AzADApplication -ObjectId <id># Get App searching by stringGet-AzADApplication | ?{$_.DisplayName -match "app"}# Get Apps with passwordGet-AzADAppCredential

Eine App mit der Berechtigung AppRoleAssignment.ReadWrite kann sich zum Global Admin hochstufen, indem sie sich selbst die Rolle zuweist. Für weitere Informationen hier überprüfen.

Ein geheimer Schlüssel, den die Anwendung verwendet, um ihre Identität bei der Anforderung eines Tokens zu beweisen, ist das Anwendungskennwort. Wenn Sie also dieses Kennwort finden, können Sie als Service Principal innerhalb des Mandanten zugreifen. Beachten Sie, dass dieses Kennwort nur sichtbar ist, wenn es generiert wird (Sie können es ändern, aber nicht erneut abrufen). Der Besitzer der Anwendung kann ein Kennwort hinzufügen (damit er sich als diese ausgeben kann). Anmeldungen als diese Service Principals sind nicht als riskant gekennzeichnet und sie werden keine MFA haben.

Unterschied zwischen Anwendungen & (Enterprise Applications oder Service Principals)

Unterschied zwischen einer Anwendung und einem Service Principal in Azure:

  • Anwendung/App-Registrierungen: Sind Anwendungen, die in Ihrem Azure AD existieren

  • (Get-AzureADApplication -filter "DisplayName eq 'testapp'")

  • Service Principal/Enterprise Applications: Sicherheitsobjekte in Ihrem Azure AD, die Berechtigungen im Azure-Verzeichnis haben können und entweder mit Ihrer Anwendung oder einer Drittanbieteranwendung verknüpft sind

  • Get-AzureADServicePrincipal -filter "DisplayName eq 'testapp'")

  • Ein Administrator muss möglicherweise die gegebenen Berechtigungen genehmigen, wenn sie sehr sensibel sind.

Eine Anwendung kann in einem Drittanbieter-Mandanten betrieben werden, und sobald Sie sie verwenden und ihr Zugriff gewähren, wird eine Enterprise Application/Service Principal in Ihrem Mandanten erstellt, um ihr den Zugriff auf die benötigten Informationen zu gewähren:

Administrative Einheiten

Es wird für eine bessere Verwaltung von Benutzern verwendet.

Administrative Einheiten beschränken Berechtigungen in einer Rolle auf einen Teil Ihrer Organisation, den Sie definieren. Sie könnten beispielsweise administrative Einheiten verwenden, um die Rolle des Helpdesk-Administrators an regionale Support-Spezialisten zu delegieren, damit sie nur die Benutzer in der Region verwalten können, die sie unterstützen.

Daher können Sie Rollen der administrativen Einheit zuweisen, und die Mitglieder davon werden diese Rollen haben.

# Get Administrative UnitsGet-AzureADMSAdministrativeUnitGet-AzureADMSAdministrativeUnit -Id <id># Get ID of admin unit by string$adminUnitObj = Get-AzureADMSAdministrativeUnit -Filter "displayname eq 'Test administrative unit 2'"# List the users, groups, and devices affected by the administrative unitGet-AzureADMSAdministrativeUnitMember -Id <id># Get the roles users have over the members of the AUGet-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members

Azure AD Identity Protection (AIP)

Azure AD Identity Protection (AIP) ist ein Sicherheitsdienst, der automatisierte Erkennung und Behebung nutzt, um Benutzeridentitäten in Azure Active Directory vor Kompromittierung zu schützen. AIP überwacht kontinuierlich und bewertet das Risiko von Benutzeranmeldungen und Identitätskonfigurationen, indem es automatisch geeignete Sicherheitsmaßnahmen anwendet, wie z.B. die Anforderung von Multi-Faktor-Authentifizierung oder das Blockieren potenziell gefährlicher Aktivitäten. Dies hilft Organisationen, identitätsbasierte Sicherheitsverletzungen zu verhindern.

Flow:

  1. Azure AD Identity Protection überwacht Benutzeraktivitäten und sammelt Daten zu Benutzer-Anmeldungen, Authentifizierungsereignissen und anderen relevanten Aktivitäten.

  2. Der Dienst verwendet Machine Learning-Algorithmen, um diese Daten zu analysieren und potenzielle Sicherheitsbedrohungen zu erkennen.

  3. Azure AD Identity Protection weist der Bedrohung ein Risikoniveau zu (z.B. Anmeldung) und generiert bei Bedarf eine Warnung, um eine automatische Aktion durchzuführen.

Azure AD Password Protection (APP)

Azure AD Password Protection (APP) ist eine Sicherheitsfunktion, die hilft, schwache Passwörter in Azure Active Directory zu verhindern, indem starke Passwortrichtlinien durchgesetzt werden. APP blockiert häufig verwendete schwache Passwörter und deren Varianten, wodurch das Risiko von passwortbezogenen Sicherheitsverletzungen verringert wird. Es kann sowohl auf Cloud-Ebene als auch in der lokalen Active Directory angewendet werden, um die allgemeine Passwortsicherheit in der gesamten Organisation zu verbessern.

References

Last updated