Az - AzureAD (AAD)

Apprenez et pratiquez le piratage AWS :Formation HackTricks AWS Red Team Expert (ARTE) Apprenez et pratiquez le piratage GCP : Formation HackTricks GCP Red Team Expert (GRTE)

Soutenez HackTricks

Informations de base

Azure Active Directory (Azure AD) sert de service basé sur le cloud de Microsoft pour la gestion des identités et des accès. Il est essentiel pour permettre aux employés de se connecter et d'accéder à des ressources, à la fois au sein et au-delà de l'organisation, englobant Microsoft 365, le portail Azure et une multitude d'autres applications SaaS. La conception d'Azure AD se concentre sur la fourniture de services d'identité essentiels, comprenant notamment l'authentification, l'autorisation et la gestion des utilisateurs.

Les fonctionnalités clés d'Azure AD incluent l'authentification multi-facteurs et l'accès conditionnel, ainsi qu'une intégration transparente avec d'autres services de sécurité Microsoft. Ces fonctionnalités élèvent considérablement la sécurité des identités des utilisateurs et permettent aux organisations de mettre en œuvre et d'appliquer efficacement leurs politiques d'accès. En tant que composant fondamental de l'écosystème de services cloud de Microsoft, Azure AD est essentiel pour la gestion basée sur le cloud des identités des utilisateurs.

Entités

Énumération

Pour cette énumération, vous pouvez utiliser l'outil az cli, le module PowerShell AzureAD (ou AzureAD Preview) et le module Az PowerShell.

Sur Linux, vous devrez installer PowerShell Core :

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

Différences entre les modules

  • AzureAD est un module PowerShell de Microsoft pour gérer Azure AD. Il ne montre pas toutes les propriétés des objets Azure AD et ne peut pas être utilisé pour accéder aux informations des ressources Azure.

  • Az PowerShell est un module pour gérer les ressources Azure à partir de la ligne de commande PowerShell.

Connexion

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

Lorsque vous vous connectez via CLI dans Azure avec n'importe quel programme, vous utilisez une Application Azure d'un locataire qui appartient à Microsoft. Ces Applications, comme celles que vous pouvez créer dans votre compte, ont un ID client. Vous ne pourrez pas tous les voir dans les listes d'applications autorisées que vous pouvez voir dans la console, mais ils sont autorisés par défaut.

Par exemple, un script powershell qui s'authentifie utilise une application avec l'ID client 1950a258-227b-4e31-a9cf-717495945fc2. Même si l'application n'apparaît pas dans la console, un administrateur système pourrait bloquer cette application afin que les utilisateurs ne puissent pas y accéder en utilisant des outils qui se connectent via cette application.

Cependant, il existe d'autres ID clients d'applications qui vous permettront de vous connecter à Azure :

# 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

Utilisateurs

# 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>

Azure AD Enumeration

User Enumeration

User enumeration can be performed through the Azure AD login interface. By entering a valid username and observing the response, an attacker can determine if the username is valid or not. This can be automated using tools like enum4linux, ldapsearch, or custom scripts.

Group Enumeration

Group enumeration involves identifying Azure AD groups and their members. This can be done using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API directly.

Device Enumeration

Device enumeration focuses on identifying devices registered in Azure AD. This can be achieved by querying the Azure AD Graph API or using tools like PowerShell scripts or Microsoft Graph API.

Application Enumeration

Application enumeration involves identifying applications registered in Azure AD. This can be done through the Azure portal, Azure AD PowerShell module, or by querying the Azure AD Graph API.

Service Principal Enumeration

Service principals represent the application in Azure AD. Enumeration of service principals can be done using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API directly.

Tenant Enumeration

Tenant enumeration involves gathering information about the Azure AD tenant. This can include details such as tenant ID, domain name, verified domains, and more. Enumeration can be performed using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API.

Azure AD Exploitation

Password Spraying

Password spraying is a common technique used to attempt a single password against multiple usernames. This can be effective in Azure AD environments where weak passwords are prevalent. Tools like CrackMapExec, Spray, or custom scripts can be used for password spraying attacks.

Brute Force Attacks

Brute force attacks involve systematically checking all possible passwords until the correct one is found. In Azure AD environments, this can be used against user accounts with weak passwords. Tools like Hydra, Medusa, or custom scripts can be utilized for brute force attacks.

Phishing Attacks

Phishing attacks can be used to trick users into revealing their credentials. This can be done through email, fake login pages, or other social engineering techniques. Once credentials are obtained, attackers can access Azure AD resources using the compromised accounts.

Token Impersonation

Token impersonation involves stealing or forging authentication tokens to gain unauthorized access to Azure AD resources. Attackers can use tools like Impacket, Rubeus, or custom scripts to perform token impersonation attacks.

Password Hash Capture

Capturing password hashes can allow attackers to crack passwords offline. In Azure AD environments, password hashes can be captured using tools like Mimikatz, Responder, or by dumping LSASS memory.

Privilege Escalation

Privilege escalation involves gaining higher levels of access within Azure AD. This can be achieved through misconfigurations, vulnerabilities, or by exploiting weak permissions. Tools like BloodHound, PowerUp, or manual enumeration can be used for privilege escalation in Azure AD environments.

# Enumerate Users
Get-AzureADUser -All $true
Get-AzureADUser -All $true | select UserPrincipalName
# Get info of 1 user
Get-AzureADUser -ObjectId test@corp.onmicrosoft.com | fl
# Search "admin" users
Get-AzureADUser -SearchString "admin" #Search admin at the begining of DisplayName or userPrincipalName
Get-AzureADUser -All $true |?{$_.Displayname -match "admin"} #Search "admin" word in DisplayName
# Get all attributes of a user
Get-AzureADUser -ObjectId test@defcorphq.onmicrosoft.com|%{$_.PSObject.Properties.Name}
# Search attributes containing the word "password"
Get-AzureADUser -All $true |%{$Properties = $_;$Properties.PSObject.Properties.Name | % {if ($Properties.$_ -match 'password') {"$($Properties.UserPrincipalName) - $_ - $($Properties.$_)"}}}
# All users from AzureAD# All users from AzureAD
Get-AzureADUser -All $true | ?{$_.OnPremisesSecurityIdentifier -eq $null}
# All users synced from on-prem
Get-AzureADUser -All $true | ?{$_.OnPremisesSecurityIdentifier -ne $null}
# Objects created by a/any user
Get-AzureADUser [-ObjectId <email>] | Get-AzureADUserCreatedObject
# Devices owned by a user
Get-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com
# Objects owned by a specific user
Get-AzureADUserOwnedObject -ObjectId test@corp.onmicrosoft.com
# Get groups & roles where the user is a member
Get-AzureADUserMembership -ObjectId 'test@corp.onmicrosoft.com'
# Get devices owned by a user
Get-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com
# Get devices registered by a user
Get-AzureADUserRegisteredDevice -ObjectId test@defcorphq.onmicrosoft.com
# Apps where a user has a role (role not shown)
Get-AzureADUser -ObjectId roygcain@defcorphq.onmicrosoft.com | Get-AzureADUserAppRoleAssignment | fl *
# Get Administrative Units of a user
$userObj = Get-AzureADUser -Filter "UserPrincipalName eq 'bill@example.com'"
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -Id $_.Id | where { $_.Id -eq $userObj.ObjectId } }

Gestion des rôles Azure AD

Lister les rôles disponibles

Pour lister les rôles disponibles dans Azure AD, vous pouvez utiliser la commande suivante :

Get-AzureADDirectoryRole

Cette commande vous renverra la liste des rôles disponibles avec leurs noms et descriptions.

Assigner un rôle à un utilisateur

Pour assigner un rôle spécifique à un utilisateur dans Azure AD, vous pouvez utiliser la commande suivante :

Add-AzureADDirectoryRoleMember -ObjectId <roleObjectId> -RefObjectId <userObjectId>

Assurez-vous de remplacer <roleObjectId> par l'ID du rôle auquel vous souhaitez ajouter l'utilisateur et <userObjectId> par l'ID de l'utilisateur auquel vous souhaitez assigner le rôle.

Retirer un rôle d'un utilisateur

Pour retirer un rôle d'un utilisateur dans Azure AD, vous pouvez utiliser la commande suivante :

Remove-AzureADDirectoryRoleMember -ObjectId <roleObjectId> -RefObjectId <userObjectId>

Assurez-vous de remplacer <roleObjectId> par l'ID du rôle que vous souhaitez retirer de l'utilisateur et <userObjectId> par l'ID de l'utilisateur dont vous souhaitez retirer le rôle.

# Enumerate users
Get-AzADUser
# Get details of a user
Get-AzADUser -UserPrincipalName test@defcorphq.onmicrosoft.com
# Search user by string
Get-AzADUser -SearchString "admin" #Search at the beginnig of DisplayName
Get-AzADUser | ?{$_.Displayname -match "admin"}
# Get roles assigned to a user
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com

Changer le mot de passe de l'utilisateur

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

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

Stratégies MFA et d'accès conditionnel

Il est fortement recommandé d'ajouter MFA à chaque utilisateur, cependant, certaines entreprises ne le mettront pas en place ou pourraient le configurer avec un Accès conditionnel : L'utilisateur sera exigé MFA s'il se connecte depuis un emplacement spécifique, un navigateur ou une certaine condition. Ces politiques, si elles ne sont pas configurées correctement, pourraient être sujettes à des contournements. Vérifiez :

Az - Conditional Access Policies / MFA Bypass

Groupes

# 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 *

Azure AD (Azure Active Directory) est un service d'annuaire basé sur le cloud de Microsoft, qui fournit l'authentification et l'autorisation pour les utilisateurs et les applications. Il est essentiel de comprendre la sécurité d'Azure AD lors de l'évaluation de la sécurité globale d'un environnement Azure.

# Enumerate Groups
Get-AzureADGroup -All $true
# Get info of 1 group
Get-AzADGroup -DisplayName <resource_group_name> | fl
# Get "admin" groups
Get-AzureADGroup -SearchString "admin" | fl #Groups starting by "admin"
Get-AzureADGroup -All $true |?{$_.Displayname -match "admin"} #Groups with the word "admin"
# Get groups allowing dynamic membership
Get-AzureADMSGroup | ?{$_.GroupTypes -eq 'DynamicMembership'}
# All groups that are from Azure AD
Get-AzureADGroup -All $true | ?{$_.OnPremisesSecurityIdentifier -eq $null}
# All groups that are synced from on-prem (note that security groups are not synced)
Get-AzureADGroup -All $true | ?{$_.OnPremisesSecurityIdentifier -ne $null}
# Get members of a group
Get-AzureADGroupMember -ObjectId <group_id>
# Get roles of group
Get-AzureADMSGroup -SearchString "Contoso_Helpdesk_Administrators" #Get group id
Get-AzureADMSRoleAssignment -Filter "principalId eq '69584002-b4d1-4055-9c94-320542efd653'"
# Get Administrative Units of a group
$groupObj = Get-AzureADGroup -Filter "displayname eq 'TestGroup'"
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -Id $_.Id | where {$_.Id -eq $groupObj.ObjectId} }

Gestion des rôles Azure AD

Lister les membres d'un rôle

Pour lister les membres d'un rôle Azure AD, vous pouvez utiliser la commande suivante :

Get-AzureADDirectoryRoleMember -ObjectId <ObjectID>

Assurez-vous de remplacer <ObjectID> par l'ID de l'objet du rôle Azure AD dont vous souhaitez lister les membres.

Ajouter un membre à un rôle

Pour aj leter un membre à un rôle Azure AD, vous pouvez utiliser la commande suivante :

Add-AzureADDirectoryRoleMember -ObjectId <ObjectID> -RefObjectId <MemberObjectID>

Assurez-vous de remplacer <ObjectID> par l'ID de l'objet du rôle Azure AD auquel vous souhaitez ajouter un membre, et <MemberObjectID> par l'ID de l'objet du membre que vous souhaitez ajouter.

Supprimer un membre d'un rôle

Pour supprimer un membre d'un rôle Azure AD, vous pouvez utiliser la commande suivante :

Remove-AzureADDirectoryRoleMember -ObjectId <ObjectID> -MemberId <MemberObjectID>

Assurez-vous de remplacer <ObjectID> par l'ID de l'objet du rôle Azure AD duquel vous souhaitez supprimer un membre, et <MemberObjectID> par l'ID de l'objet du membre que vous souhaitez supprimer.

# Get all groups
Get-AzADGroup
# Get details of a group
Get-AzADGroup -ObjectId <id>
# Search group by string
Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName
Get-AzADGroup |?{$_.Displayname -match "admin"}
# Get members of group
Get-AzADGroupMember -GroupDisplayName <resource_group_name>
# Get roles of group
Get-AzRoleAssignment -ResourceGroupName <resource_group_name>

Ajouter un utilisateur à un groupe

Les propriétaires du groupe peuvent ajouter de nouveaux utilisateurs au groupe

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

Les groupes peuvent être dynamiques, ce qui signifie essentiellement que si un utilisateur remplit certaines conditions, il sera ajouté à un groupe. Bien sûr, si les conditions sont basées sur des attributs qu'un utilisateur peut contrôler, il pourrait abuser de cette fonctionnalité pour accéder à d'autres groupes. Consultez comment abuser des groupes dynamiques sur la page suivante :

Az - Dynamic Groups Privesc

Principaux de service / Applications d'entreprise

Notez que le Principal de service dans la terminologie PowerShell est appelé Applications d'entreprise dans le portail Azure (web).

# 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"

Azure AD Enumeration

User Enumeration

To enumerate users in Azure AD, you can use tools like Azure AD Connect or Azure AD Graph API. These tools can help you gather information about users, such as usernames, email addresses, and group memberships.

Using Azure AD Connect

Azure AD Connect is a tool provided by Microsoft to synchronize on-premises directories with Azure AD. By querying the Azure AD Connect server, you can retrieve information about users in the Azure AD environment.

Using Azure AD Graph API

Azure AD Graph API allows you to interact with Azure AD by sending HTTP requests. You can use this API to query user information, suchjson as user attributes and group memberships.

Group Enumeration

To enumerate groups in Azure AD, you can again use tools like Azure AD Connect or Azure AD Graph API. These tools can help you retrieve information about groups in the Azure AD environment, such as group names, descriptions, and members.

Using Azure AD Connect

Similar to user enumeration, Azure AD Connect can also be used to enumerate groups in Azure AD. By querying the Azure AD Connect server, you can gather information about the groups present in the Azure AD environment.

Using Azure AD Graph API

Just like with user enumeration, Azure AD Graph API can be utilized to enumerate groups in Azure AD. By making appropriate HTTP requests to the Graph API, you can retrieve details about the groups in the Azure AD environment.

# Get Service Principals
Get-AzureADServicePrincipal -All $true
# Get details about a SP
Get-AzureADServicePrincipal -ObjectId <id> | fl *
# Get SP by string name or Id
Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl
Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"}
# Get owner of SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwner |fl *
# Get objects owned by a SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwnedObject
# Get objects created by a SP
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalCreatedObject
# Get groups where the SP is a member
Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembership |fl *

Gestion des groupes Azure AD

Recherche de groupes Azure AD

Pour rechercher des groupes Azure AD, vous pouvez utiliser la commande suivante :

Get-AzADGroup -DisplayName "nom_du_groupe"

Assurez-vous de remplacer "nom_du_groupe" par le nom réel du groupe que vous recherchez.

Création d'un nouveau groupe Azure AD

Pour créer un nouveau groupe Azure AD, vous pouvez utiliser la commande suivante :

New-AzADGroup -DisplayName "nom_du_groupe" -MailNickname "alias_email" -MailEnabled $true

Assurez-vous de remplacer "nom_du_groupe" par le nom souhaité pour le groupe et "alias_email" par l'alias email que vous souhaitez utiliser.

Suppression d'un groupe Azure AD

Pour supprimer un groupe Azure AD, vous pouvez utiliser la commande suivante :

Remove-AzADGroup -ObjectId "ID_du_groupe"

Assurez-vous de remplacer "ID_du_groupe" par l'ID réel du groupe que vous souhaitez supprimer.

# Get SPs
Get-AzADServicePrincipal
# Get info of 1 SP
Get-AzADServicePrincipal -ObjectId <id>
# Search SP by string
Get-AzADServicePrincipal | ?{$_.DisplayName -match "app"}
# Get roles of a SP
Get-AzRoleAssignment -ServicePrincipalName <String>

Azure AD Enumeration

User Enumeration

User enumeration can be performed through the Azure AD Graph API. By making requests to the /users endpoint, an attacker can gather information about users in the Azure AD tenant.

Example Request:

GET https://graph.windows.net/myorganization/users?api-version=1.6
Authorization: Bearer <access_token>

Group Enumeration

Group enumeration can also be done using the Azure AD Graph API. By querying the /groups endpoint, an attacker can retrieve information about groups in the Azure AD tenant.

Example Request:

GET https://graph.windows.net/myorganization/groups?api-version=1.6
Authorization: Bearer <access_token>

Application Enumeration

Similarly, application enumeration is possible through the Azure AD Graph API. By sending requests to the /servicePrincipals endpoint, an attacker can enumerate applications registered in the Azure AD tenant.

Example Request:

GET https://graph.windows.net/myorganization/servicePrjsoncipals?api-version=1.6
Authorization: Bearer <access_token>

Device Enumeration

Device enumeration can be carried out by querying the /devices endpoint using the Azure AD Graph API. This allows an attacker to gather information about devices registered in the Azure AD tenant.

Example Request:

GET https://graph.windows.net/myorganization/devices?api-version=1.6
Authorization: BBearer <access_token>
$Token = 'eyJ0eX..'
$URI = 'https://graph.microsoft.com/v1.0/applications'
$RequestParams = @{
Method  = 'GET'
Uri     = $URI
Headers = @{
'Authorization' = "Bearer $Token"
}
}
(Invoke-RestMethod @RequestParams).value

Le propriétaire d'un Principal de service peut changer son mot de passe.

Listez et essayez d'ajouter un secret client sur chaque application d'entreprise

```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>

### Rôles

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

<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>']"

Azure AD Enumeration

User Enumeration

User enumeration can be performed through the Azure AD login interface. By entering a valid username and observing the response, an attacker can determine if the username is valid or not. This can be automated using tools like enum4linux, ldapsearch, or custom scripts.

Group Enumeration

Group enumeration involves identifying Azure AD groups and their members. This can be done using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API directly.

Application Enumeration

Application enumeration focuses on identifying applications registered in Azure AD. This can be achieved by using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API directly.

Device Enumeration

Device enumeration involves identifying devices registered in Azure AD. Tools like Azure AD PowerShell module, Microsoft Graph API, or querying the Azure AD Graph API can be used to enumerate devices.

Service Principal Enumeration

Service principals represent the application in Azure AD. Enumeration of service principals can be done using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API directly.

Role Enumeration

Role enumeration involves identifying roles assigned within Azure AD. This can be achieved using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API directly.

Policy Enumeration

Policy enumeration focuses on identifying policies configured in Azure AD. Tools like Azure AD PowerShell module, Microsoft Graph API, or querying the Azure AD Graph API can be used to enumerate policies.

Tenant Enumeration

Tenant enumeration involves gathering information about the Azure AD tenant. This can be done using tools like Azure AD PowerShell module, Microsoft Graph API, or by querying the Azure AD Graph API directly.

Risk Enumeration

Risk enumeration involves identifying and assessing risks within Azure AD. Tools like Azure AD PowerShell module, Microsoft Graph API, or querying the Azure AD Graph API can be used to enumerate risks.

# 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 *

Gestion des rôles Azure AD

Installation du module Az PowerShell

Install-Module -Name Az -AllowClobber -Scope CurrentUser

Connexion à Azure AD

Connect-AzAccount

Afficher les rôles disponibles

Get-AzRoleDefinition

Créer un nouveau rôle

$role = Get-AzRoleDefinition "Owner"
$role.Id = $null
$role.Name = "Custom Role"
$role.Description = "Can manage all resources"
New-AzRoleDefinition -Role $role

Assigner un rôle à un utilisateur

New-AzRoleAssignment -ObjectId <user-object-id> -RoleDefinitionName "Custom Role" -Scope "/subscriptions/<subscription-id>"

Supprimer un rôle

Remove-AzRoleDefinition -RoleDefinitionName "Custom Role"
# 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

Appareils

# If you know how to do this send a PR!

Azure AD Enumeration

User Enumeration

To enumerate users in Azure AD, you can use tools like Azure AD Connect or Azure AD Graph API. These tools can help you gather information about users, such as usernames, email addresses, and group memberships.

Group Enumeration

For enumerating groups in Azure AD, you can use tools like Azure AD Graph Explorer or Azure AD PowerShell module. These tools allow you to list all the groups in Azure AD and gather information about group members.

Device Enumeration

To enumerate devices in Azure AD, you can use tools like Azure AD PowerShell module or Microsoft Graph API. These tools can provide you with information about devices registered in Azure AD, such as device names, types, and registration dates.

Application Enumeration

For enumerating applications in Azure AD, you can use tools like Azure Portal or Azure AD PowerShell module. These tools allow you to view all the applications registered in Azure AD and gather information about application owners and permissions.

# Enumerate Devices
Get-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 devices
Get-AzureADDevice -All $true | Get-AzureADDeviceRegisteredOwner
Get-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredOwner -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}
# Registred users of all the devices
Get-AzureADDevice -All $true | Get-AzureADDeviceRegisteredUser
Get-AzureADDevice -All $true | %{if($user=Get-AzureADDeviceRegisteredUser -ObjectId $_.ObjectID){$_;$user.UserPrincipalName;"`n"}}
# Get dives managed using Intune
Get-AzureADDevice -All $true | ?{$_.IsCompliant -eq "True"}
# Get devices owned by a user
Get-AzureADUserOwnedDevice -ObjectId test@corp.onmicrosoft.com
# Get Administrative Units of a device
Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember -ObjectId $_.ObjectId | where {$_.ObjectId -eq $deviceObjId} }

Si un appareil (VM) est joint à AzureAD, les utilisateurs d'AzureAD pourront se connecter. De plus, si l'utilisateur connecté est Propriétaire de l'appareil, il sera administrateur local.

Applications

Les Applications sont des Enregistrements d'application dans le portail (pas des Applications d'entreprise). Mais chaque Enregistrement d'application va créer une Application d'entreprise (Principal de service) avec le même nom. De plus, si l'Application est une Application multi-locataire, une autre Application d'entreprise (Principal de service) sera créée dans ce locataire avec le même nom.

Lorsqu'une Application est générée, 2 types de permissions sont accordés :

  • Permissions accordées au Principal de service

  • Permissions que l'application peut avoir et utiliser au nom de l'utilisateur.

# List Apps
az ad app list
az ad app list --query "[].[displayName]" -o table
# Get info of 1 App
az ad app show --id 00000000-0000-0000-0000-000000000000
# Search App by string
az ad app list --query "[?contains(displayName,'app')].displayName"
# Get the owner of an application
az ad app owner list --id <id> --query "[].[displayName]" -o table
# List all the apps with an application password
az 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"

Azure AD

Enumeration

  1. User Enumeration:

    • Utilize the Graph API to gather information about users, groups, and roles within the Azure AD tenant.

    • Enumerate users through the Azure AD login interface.

  2. Group Enumeration:

    • Enumerate groups within the Azure AD tenant to understand the group membership and their associated permissions.

  3. Application Enumeration:

    • Identify applications registered in Azure AD to discover potential points of attack.

Exploitation

  1. Password Spraying:

    • Perform password spraying attacks against the Azure AD authentication endpoint to avoid account lockouts.

  2. Phishing:

    • Conduct phishing campaigns to steal user credentials and gain unauthorized access to Azure AD resources.

  3. Brute Force Attacks:

    • Launch brute force attacks against the Azure AD authentication endpoint to crack weak passwords.

Post-Exploitation

  1. Token Impersonation:

    • Obtain and abuse tokens to impersonate users and access resources within Azure AD.

  2. Backdooring:

    • Create backdoors in Azure AD configurations to maintain persistent access to the environment.

  3. Data Exfiltration:

    • Extract sensitive data from Azure AD using various techniques such as querying the Graph API.

Mitigation

  1. Multi-Factor Authentication (MFA):

    • Enforce MFA for all users to add an extra layer of security to Azure AD accounts.

  2. Regular Security Assessments:

    • Conduct regular security assessments and audits to identify and address vulnerabilities in Azure AD configurations.

  3. Monitoring and Logging:

    • Implement robust monitoring and logging mechanisms to detect and respond to suspicious activities in Azure AD.

# List all registered applications
Get-AzureADApplication -All $true
# Get details of an application
Get-AzureADApplication -ObjectId <id>  | fl *
# List all the apps with an application password
Get-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredential -ObjectID $_.ObjectID){$_}}
# Get owner of an application
Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *

Gestion des groupes Azure AD

Recherche de groupes Azure AD

Pour rechercher des groupes Azure AD, vous pouvez utiliser la commande suivante :

Get-AzADGroup -DisplayName "nom_du_groupe"

Assurez-vous de remplacer "nom_du_groupe" par le nom réel du groupe que vous recherchez.

Création d'un nouveau groupe Azure AD

Pour créer un nouveau groupe Azure AD, vous pouvez utiliser la commande suivante :

New-AzADGroup -DisplayName "nom_du_groupe" -MailNickname "alias_email" -MailEnabled $true

Assurez-vous de remplacer "nom_du_groupe" par le nom souhaité pour le groupe et "alias_email" par l'alias email que vous souhaitez utiliser.

Suppression d'un groupe Azure AD

Pour supprimer un groupe Azure AD, vous pouvez utiliser la commande suivante :

Remove-AzADGroup -DisplayName "nom_du_groupe"

Assurez-vous de remplacer "nom_du_groupe" par le nom du groupe que vous souhaitez supprimer.

# Get Apps
Get-AzADApplication
# Get details of one App
Get-AzADApplication -ObjectId <id>
# Get App searching by string
Get-AzADApplication | ?{$_.DisplayName -match "app"}
# Get Apps with password
Get-AzADAppCredential

Une application avec la permission AppRoleAssignment.ReadWrite peut escalader en tant qu'administrateur global en se donnant le rôle. Pour plus d'informations, consultez ceci.

Une chaîne secrète que l'application utilise pour prouver son identité lors de la demande d'un jeton est le mot de passe de l'application. Ainsi, si vous trouvez ce mot de passe, vous pouvez accéder en tant que principal de service à l'intérieur du locataire. Notez que ce mot de passe n'est visible que lorsqu'il est généré (vous pourriez le changer mais vous ne pouvez pas le récupérer). Le propriétaire de l'application peut lui ajouter un mot de passe (pour pouvoir l'usurper). Les connexions en tant que ces principaux de service ne sont pas marquées comme risquées et elles n'auront pas de MFA.

Différence entre Applications & (Applications d'entreprise ou Principaux de service)

Différence entre une application et un Principal de service dans Azure :

  • Applications/Enregistrements d'application : Sont des applications qui existent dans votre Azure AD

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

  • Principal de service/Applications d'entreprise : Objets de sécurité dans votre Azure AD qui peuvent avoir des privilèges dans le répertoire Azure et sont liés soit à votre application soit à une application tierce

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

  • Un administrateur peut avoir besoin d'approuver les autorisations données si elles sont très sensibles.

Une application peut être exécutée dans un locataire tiers et une fois que vous commencez à l'utiliser et à lui donner accès, un Principal de service/Application d'entreprise est créé dans votre locataire pour lui donner accès aux informations dont il a besoin :

Unités administratives

Elles sont utilisées pour une meilleure gestion des utilisateurs.

Les unités administratives restreignent les autorisations dans un rôle à toute partie de votre organisation que vous définissez. Vous pourriez, par exemple, utiliser des unités administratives pour déléguer le rôle Administrateur du service d'assistance à des spécialistes du support régional, afin qu'ils puissent gérer les utilisateurs uniquement dans la région qu'ils supportent.

Par conséquent, vous pouvez attribuer des rôles à l'unité administrative et ses membres auront ces rôles.

AzureAD Enumeration

User Enumeration

User enumeration can be performed through the Azure AD login interface. By entering a valid username and observing the response, an attacker can determine if the username is valid or not. This can be automated using tools like enum4linux, ldapsearch, or custom scripts.

Group Enumeration

Group enumeration involves identifying Azure AD groups and their members. This can be done through the Azure portal or by querying the Microsoft Graph API. Understanding group memberships can help attackers identify high-privileged users or potential lateral movement paths.

Application Enumeration

Application enumeration focuses on identifying Azure AD applications and their configurations. Attackers can look for misconfigured applications that may expose sensitive data or provide unauthorized access. This can be done through the Azure portal or by interacting with the Azure AD Graph API.

Device Enumeration

Device enumeration involves identifying devices registered in Azure AD. Attackers can gather information about devices, such as device names, types, and registration dates. This information can be useful for targeting specific devices or understanding the organization's device landscape.

Service Principal Enumeration

Service principals represent applications or services in Azure AD. Enumeration of service principals can reveal details about the permissions and roles assigned to these entities. Attackers can leverage this information to identify potential misconfigurations or abuse permissions to escalate privileges.

Domain Enumeration

Domain enumeration focuses on identifying custom domains associated with the Azure AD tenant. Attackers can use this information to craft targeted phishing attacks or identify additional entry points into the organization's environment.

Policy Enumeration

Policy enumeration involves identifying Azure AD policies that govern user behavior and access control. Understanding these policies can help attackers bypass restrictions, escalate privileges, or tailor attacks to circumvent existing security measures.

Risk Enumeration

Risk enumeration involves assessing the security risks associated with Azure AD configurations. Attackers can identify weak configurations, outdated settings, or misconfigurations that could be exploited to gain unauthorized access or disrupt operations.

# Get Administrative Units
Get-AzureADMSAdministrativeUnit
Get-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 unit
Get-AzureADMSAdministrativeUnitMember -Id <id>
# Get the roles users have over the members of the AU
Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members

Protection de l'identité Azure AD (AIP)

La Protection de l'identité Azure AD (AIP) est un service de sécurité qui utilise la détection automatisée et la remédiation pour aider à protéger les identités des utilisateurs dans Azure Active Directory contre les compromissions. AIP surveille en continu et évalue le risque des connexions des utilisateurs et des configurations d'identité, appliquant automatiquement des mesures de sécurité appropriées, telles que l'exigence d'une authentification multi-facteurs ou le blocage d'activités potentiellement dangereuses. Cela aide les organisations à prévenir les violations de sécurité basées sur l'identité.

Flux :

  1. La Protection de l'identité Azure AD surveille les activités des utilisateurs et collecte des données sur les connexions, les événements d'authentification et d'autres activités pertinentes des utilisateurs.

  2. Le service utilise des algorithmes d'apprentissage automatique pour analyser ces données et détecter les menaces potentielles à la sécurité.

  3. La Protection de l'identité Azure AD attribue un niveau de risque à la menace (par exemple, la connexion) et génère une alerte si nécessaire pour effectuer une action automatique.

Protection des mots de passe Azure AD (APP)

La Protection des mots de passe Azure AD (APP) est une fonctionnalité de sécurité qui aide à prévenir les mots de passe faibles dans Azure Active Directory en imposant des politiques de mots de passe solides. APP bloque les mots de passe faibles couramment utilisés et leurs variantes, réduisant ainsi le risque de violations liées aux mots de passe. Elle peut être appliquée à la fois au niveau cloud et sur l'Active Directory sur site, améliorant la sécurité globale des mots de passe dans toute l'organisation.

Références

Apprenez et pratiquez le Hacking AWS :Formation HackTricks AWS Red Team Expert (ARTE) Apprenez et pratiquez le Hacking GCP : Formation HackTricks GCP Red Team Expert (GRTE)

Last updated