mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 03:16:37 -08:00
Translated ['src/pentesting-cloud/azure-security/README.md', 'src/pentes
This commit is contained in:
@@ -4,55 +4,65 @@
|
||||
|
||||
## Informações Básicas
|
||||
|
||||
Aprenda o básico sobre Azure e Entra ID na página a seguir:
|
||||
|
||||
{{#ref}}
|
||||
az-basic-information/
|
||||
{{#endref}}
|
||||
|
||||
## Metodologia de Pentesting/Red Team do Azure
|
||||
|
||||
Para auditar um ambiente AZURE, é muito importante saber: quais **serviços estão sendo utilizados**, o que está **sendo exposto**, quem tem **acesso** a quê, e como os serviços internos do Azure e os **serviços externos** estão conectados.
|
||||
Para auditar um ambiente AZURE, é muito importante saber: quais **serviços estão sendo usados**, o que está **sendo exposto**, quem tem **acesso** a quê e como os serviços internos do Azure e os **serviços externos** estão conectados.
|
||||
|
||||
Do ponto de vista de um Red Team, o **primeiro passo para comprometer um ambiente Azure** é conseguir obter algumas **credenciais** para o Azure AD. Aqui estão algumas ideias sobre como fazer isso:
|
||||
Do ponto de vista do Red Team, o **primeiro passo para comprometer um ambiente Azure** é conseguir obter algum **ponto de apoio**.
|
||||
|
||||
- **Vazamentos** no github (ou similar) - OSINT
|
||||
- **Engenharia** Social
|
||||
- Reutilização de **Senhas** (vazamentos de senhas)
|
||||
- Vulnerabilidades em Aplicações Hospedadas no Azure
|
||||
- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) com acesso ao endpoint de metadados
|
||||
- **Leitura de Arquivo Local**
|
||||
- `/home/USERNAME/.azure`
|
||||
- `C:\Users\USERNAME\.azure`
|
||||
- O arquivo **`accessTokens.json`** no `az cli` antes da versão 2.30 - Jan2022 - armazenava **tokens de acesso em texto claro**
|
||||
- O arquivo **`azureProfile.json`** contém **informações** sobre o usuário logado.
|
||||
- **`az logout`** remove o token.
|
||||
- Versões mais antigas do **`Az PowerShell`** armazenavam **tokens de acesso** em **texto claro** no **`TokenCache.dat`**. Também armazena **ServicePrincipalSecret** em **texto claro** no **`AzureRmContext.json`**. O cmdlet **`Save-AzContext`** pode ser usado para **armazenar** **tokens**.\
|
||||
Use `Disconnect-AzAccount` para removê-los.
|
||||
- Terceiros **comprometidos**
|
||||
- Funcionário **Interno**
|
||||
- [**Phishing Comum**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenciais ou Aplicativo Oauth)
|
||||
- [Phishing de Autenticação por Código de Dispositivo](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md)
|
||||
- [**Password Spraying** do Azure](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md)
|
||||
### Enumeração Externa & Acesso Inicial
|
||||
|
||||
Mesmo que você **não tenha comprometido nenhum usuário** dentro do tenant do Azure que está atacando, você pode **coletar algumas informações** dele:
|
||||
O primeiro passo é, claro, enumerar informações sobre o inquilino que você está atacando e tentar obter um ponto de apoio.
|
||||
|
||||
Com base no nome de domínio, é possível saber **se a empresa está usando Azure**, obter o **ID do inquilino**, obter outros **domínios válidos** no mesmo inquilino (se houver mais) e obter **informações relevantes** como se o SSO está habilitado, configurações de e-mail, e-mails de usuários válidos...
|
||||
|
||||
Verifique a página a seguir para aprender como realizar a **enumeração externa**:
|
||||
|
||||
{{#ref}}
|
||||
az-unauthenticated-enum-and-initial-entry/
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> Depois de conseguir obter credenciais, você precisa saber **de quem são essas credenciais**, e **a que elas têm acesso**, então você precisa realizar alguma enumeração básica:
|
||||
|
||||
## Enumeração Básica
|
||||
Com essas informações, as maneiras mais comuns de tentar obter um ponto de apoio são:
|
||||
- **OSINT**: Verifique se há **vazamentos** no Github ou em qualquer outra plataforma de código aberto que possa conter **credenciais** ou informações interessantes.
|
||||
- Reutilização de **senhas**, vazamentos ou [password spraying](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md)
|
||||
- Comprar credenciais de um funcionário
|
||||
- [**Phishing Comum**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenciais ou aplicativo Oauth)
|
||||
- [Phishing de Autenticação por Código de Dispositivo](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md)
|
||||
- **Vazamentos** de terceiros
|
||||
- Vulnerabilidades em Aplicações Hospedadas no Azure
|
||||
- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) com acesso ao endpoint de metadados
|
||||
- **Tomadas de Subdomínio** como em [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/)
|
||||
- Se algum laptop de desenvolvedor estiver comprometido ([WinPEAS e LinPEAS](https://github.com/peass-ng/PEASS-ng) podem encontrar essas informações):
|
||||
- Dentro de **`<HOME>/.Azure`**
|
||||
- **`azureProfile.json`** contém informações sobre usuários logados no passado
|
||||
- **`clouds.config` contém** informações sobre assinaturas
|
||||
- **`service_principal_entries.json`** contém credenciais de aplicativos (id do inquilino, clientes e segredo). Apenas no Linux e macOS
|
||||
- **`msal_token_cache.json`** contém tokens de acesso e tokens de atualização. Apenas no Linux e macOS
|
||||
- **`service_principal_entries.bin`** e **msal_token_cache.bin** são usados no Windows e são criptografados com DPAPI
|
||||
- **`msal_http_cache.bin`** é um cache de requisições HTTP
|
||||
- Carregue: `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)`
|
||||
- **`AzureRmContext.json`** contém informações sobre logins anteriores usando Az PowerShell (mas sem credenciais)
|
||||
- Dentro de **`C:\Users\<username>\AppData\Local\Microsoft\IdentityCache\*`** estão vários arquivos `.bin` com **tokens de acesso**, tokens de ID e informações de conta criptografadas com o DPAPI dos usuários.
|
||||
- É possível encontrar mais **tokens de acesso** nos arquivos `.tbres` dentro de **`C:\Users\<username>\AppData\Local\Microsoft\TokenBroken\Cache\`** que contêm um base64 criptografado com DPAPI com tokens de acesso.
|
||||
- No Linux e macOS, você pode obter **tokens de acesso, tokens de atualização e tokens de ID** do Az PowerShell (se usado) executando `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"`
|
||||
- No Windows, isso gera apenas tokens de ID.
|
||||
- É possível ver se o Az PowerShell foi usado no Linux e macOS verificando se `$HOME/.local/share/.IdentityService/` existe (embora os arquivos contidos estejam vazios e sejam inúteis)
|
||||
|
||||
> [!NOTE]
|
||||
> Lembre-se que a parte **mais barulhenta** da enumeração é o **login**, não a enumeração em si.
|
||||
> Lembre-se de que geralmente a parte **mais barulhenta** da enumeração é o **login**, não a enumeração em si.
|
||||
|
||||
### SSRF
|
||||
### Ferramentas de Azure & Entra ID
|
||||
|
||||
Se você encontrou um SSRF em uma máquina dentro do Azure, verifique esta página para truques:
|
||||
As seguintes ferramentas serão super úteis para enumerar tanto inquilinos do Entra ID quanto ambientes do Azure lentamente (para evitar detecção) ou automaticamente (para economizar tempo):
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html
|
||||
az-enumeration-tools.md
|
||||
{{#endref}}
|
||||
|
||||
### Bypass de Condições de Login
|
||||
@@ -62,16 +72,12 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-met
|
||||
Em casos onde você tem algumas credenciais válidas, mas não consegue fazer login, estas são algumas proteções comuns que podem estar em vigor:
|
||||
|
||||
- **Whitelist de IP** -- Você precisa comprometer um IP válido
|
||||
- **Restrições Geográficas** -- Descubra onde o usuário mora ou onde estão os escritórios da empresa e obtenha um IP da mesma cidade (ou país, pelo menos)
|
||||
- **Navegador** -- Talvez apenas um navegador de certo SO (Windows, Linux, Mac, Android, iOS) seja permitido. Descubra qual SO a vítima/empresa usa.
|
||||
- **Restrições geográficas** -- Descubra onde o usuário mora ou onde estão os escritórios da empresa e obtenha um IP da mesma cidade (ou país, pelo menos)
|
||||
- **Navegador** -- Talvez apenas um navegador de certos SO (Windows, Linux, Mac, Android, iOS) seja permitido. Descubra qual SO a vítima/empresa usa.
|
||||
- Você também pode tentar **comprometer credenciais de Service Principal**, pois geralmente são menos limitadas e seu login é menos revisado
|
||||
|
||||
Após contornar isso, você pode ser capaz de voltar à sua configuração inicial e ainda terá acesso.
|
||||
|
||||
### Tomada de Subdomínio
|
||||
|
||||
- [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/)
|
||||
|
||||
### Whoami
|
||||
|
||||
> [!CAUTION]
|
||||
@@ -91,16 +97,7 @@ az account management-group list #Not allowed by default
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="AzureAD" }}
|
||||
```bash
|
||||
#Get the current session state
|
||||
Get-AzureADCurrentSessionInfo
|
||||
#Get details of the current tenant
|
||||
Get-AzureADTenantDetail
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az PowerShell" }}
|
||||
{{#tab name="Az" }}
|
||||
```bash
|
||||
# Get the information about the current context (Account, Tenant, Subscription etc.)
|
||||
Get-AzContext
|
||||
@@ -110,43 +107,79 @@ Get-AzContext -ListAvailable
|
||||
Get-AzSubscription
|
||||
#Get Resource group
|
||||
Get-AzResourceGroup
|
||||
# Enumerate all resources visible to the current user
|
||||
Get-AzResource
|
||||
# Enumerate all Azure RBAC role assignments
|
||||
Get-AzRoleAssignment # For all users
|
||||
Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Mg" }}
|
||||
```bash
|
||||
#Get the current session
|
||||
Get-MgContext
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="AzureAD" }}
|
||||
```bash
|
||||
#Get the current session state
|
||||
Get-AzureADCurrentSessionInfo
|
||||
#Get details of the current tenant
|
||||
Get-AzureADTenantDetail
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
> [!CAUTION]
|
||||
> Um dos comandos mais importantes para enumerar o Azure é **`Get-AzResource`** do Az PowerShell, pois permite que você **saiba quais recursos seu usuário atual tem visibilidade**.
|
||||
>
|
||||
> Você pode obter as mesmas informações na **console web** acessando [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) ou pesquisando por "Todos os recursos"
|
||||
|
||||
### Enumeração do Entra ID
|
||||
### Enumeração de Entra ID & Escalação de Privilégios
|
||||
|
||||
Por padrão, qualquer usuário deve ter **permissões suficientes para enumerar** coisas como, usuários, grupos, funções, principais de serviço... (ver [permissões padrão do AzureAD](az-basic-information/index.html#default-user-permissions)).\
|
||||
Por padrão, qualquer usuário deve ter **permissões suficientes para enumerar** coisas como usuários, grupos, funções, principais de serviço... (ver [permissões padrão do AzureAD](az-basic-information/index.html#default-user-permissions)).\
|
||||
Você pode encontrar aqui um guia:
|
||||
|
||||
{{#ref}}
|
||||
az-services/az-azuread.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> Agora que você **tem algumas informações sobre suas credenciais** (e se você é um red team, espero que você **não tenha sido detectado**). É hora de descobrir quais serviços estão sendo usados no ambiente.\
|
||||
> Na seção a seguir, você pode verificar algumas maneiras de **enumerar alguns serviços comuns.**
|
||||
Verifique as **ferramentas de Pós-Exploração** para encontrar ferramentas para escalar privilégios no Entra ID como **AzureHound:**
|
||||
|
||||
## App Service SCM
|
||||
{{#ref}}
|
||||
az-enumeration-tools.md#automated-post-exploitation-tools
|
||||
{{#endref}}
|
||||
|
||||
Console Kudu para fazer login no 'container' do App Service.
|
||||
|
||||
## Webshell
|
||||
### Enumerar Serviços do Azure
|
||||
|
||||
Use portal.azure.com e selecione o shell, ou use shell.azure.com, para um bash ou powershell. O 'disco' deste shell é armazenado como um arquivo de imagem em uma conta de armazenamento.
|
||||
Uma vez que você sabe quem é, pode começar a enumerar os **serviços do Azure aos quais você tem acesso**.
|
||||
|
||||
## Azure DevOps
|
||||
O comando Az PowerShell **`Get-AzResource`** permite que você **saiba os recursos que seu usuário atual tem visibilidade**.
|
||||
|
||||
Azure DevOps é separado do Azure. Ele possui repositórios, pipelines (yaml ou release), quadros, wiki e mais. Grupos de Variáveis são usados para armazenar valores de variáveis e segredos.
|
||||
Além disso, você pode obter as mesmas informações na **console web** acessando [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) ou pesquisando por "Todos os recursos" ou executando: `az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resources?api-version=2021-04-01"`
|
||||
|
||||
Além disso, com permissões suficientes, a função **`Get-AzRoleAssignment`** pode ser usada para **enumerar todas as funções** na assinatura ou a permissão sobre um recurso específico indicando-o como em: **`Get-AzRoleAssignment -Scope /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.RecoveryServices/vaults/vault-m3ww8ut4`**
|
||||
|
||||
Na seção seguinte, você pode encontrar informações sobre os serviços do Azure mais comuns e como enumerá-los:
|
||||
|
||||
{{#ref}}
|
||||
az-services/
|
||||
{{#endref}}
|
||||
|
||||
### Escalação de Privilégios, Pós-Exploração & Persistência em Serviços do Azure
|
||||
|
||||
Uma vez que você sabe como o ambiente do Azure está estruturado e quais serviços estão sendo usados, pode começar a procurar maneiras de **escalar privilégios, mover-se lateralmente, realizar outros ataques de pós-exploração e manter persistência**.
|
||||
|
||||
Na seção seguinte, você pode encontrar informações sobre como escalar privilégios nos serviços do Azure mais comuns:
|
||||
|
||||
{{#ref}}
|
||||
az-privilege-escalation/
|
||||
{{#endref}}
|
||||
|
||||
Na próxima, você pode encontrar informações sobre como realizar ataques de pós-exploração nos serviços do Azure mais comuns:
|
||||
|
||||
{{#ref}}
|
||||
az-post-exploitation/
|
||||
{{#endref}}
|
||||
|
||||
Na próxima, você pode encontrar informações sobre como manter persistência nos serviços do Azure mais comuns:
|
||||
|
||||
{{#ref}}
|
||||
az-persistence/
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -13,88 +13,7 @@ O Entra ID é a plataforma de gerenciamento de identidade e acesso (IAM) baseada
|
||||
1. **Servidor de Recursos (RS):** Protege recursos pertencentes ao proprietário do recurso.
|
||||
2. **Proprietário do Recurso (RO):** Normalmente um usuário final que possui os recursos protegidos.
|
||||
3. **Aplicação Cliente (CA):** Uma aplicação que busca acesso a recursos em nome do proprietário do recurso.
|
||||
4. **Servidor de Autorização (AS):** Emite tokens de acesso para aplicações clientes após autenticar e autorizar.
|
||||
|
||||
**Escopos e Consentimento:**
|
||||
|
||||
- **Escopos:** Permissões granulares definidas no servidor de recursos que especificam níveis de acesso.
|
||||
- **Consentimento:** O processo pelo qual um proprietário de recurso concede a uma aplicação cliente permissão para acessar recursos com escopos específicos.
|
||||
|
||||
**Integração com Microsoft 365:**
|
||||
|
||||
- O Microsoft 365 utiliza o Azure AD para IAM e é composto por várias aplicações OAuth "de primeira parte".
|
||||
- Essas aplicações estão profundamente integradas e frequentemente têm relações de serviço interdependentes.
|
||||
- Para simplificar a experiência do usuário e manter a funcionalidade, a Microsoft concede "consentimento implícito" ou "pré-consentimento" a essas aplicações de primeira parte.
|
||||
- **Consentimento Implícito:** Certas aplicações são automaticamente **concedidas acesso a escopos específicos sem aprovação explícita do usuário ou administrador**.
|
||||
- Esses escopos pré-consentidos geralmente estão ocultos tanto para usuários quanto para administradores, tornando-os menos visíveis nas interfaces de gerenciamento padrão.
|
||||
|
||||
**Tipos de Aplicações Cliente:**
|
||||
|
||||
1. **Clientes Confidenciais:**
|
||||
- Possuem suas próprias credenciais (por exemplo, senhas ou certificados).
|
||||
- Podem **se autenticar de forma segura** no servidor de autorização.
|
||||
2. **Clientes Públicos:**
|
||||
- Não possuem credenciais únicas.
|
||||
- Não podem se autenticar de forma segura no servidor de autorização.
|
||||
- **Implicação de Segurança:** Um atacante pode se passar por uma aplicação cliente pública ao solicitar tokens, pois não há mecanismo para o servidor de autorização verificar a legitimidade da aplicação.
|
||||
|
||||
## Tokens de Autenticação
|
||||
|
||||
Existem **três tipos de tokens** usados no OIDC:
|
||||
|
||||
- [**Tokens de Acesso**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** O cliente apresenta este token ao servidor de recursos para **acessar recursos**. Ele pode ser usado apenas para uma combinação específica de usuário, cliente e recurso e **não pode ser revogado** até a expiração - que é de 1 hora por padrão.
|
||||
- **Tokens de ID**: O cliente recebe este **token do servidor de autorização**. Ele contém informações básicas sobre o usuário. Está **vinculado a uma combinação específica de usuário e cliente**.
|
||||
- **Tokens de Atualização**: Fornecidos ao cliente com o token de acesso. Usados para **obter novos tokens de acesso e ID**. Está vinculado a uma combinação específica de usuário e cliente e pode ser revogado. A expiração padrão é **90 dias** para tokens de atualização inativos e **sem expiração para tokens ativos** (é possível obter novos tokens de atualização a partir de um token de atualização).
|
||||
- Um token de atualização deve estar vinculado a um **`aud`**, a alguns **escopos**, e a um **inquilino** e deve ser capaz de gerar tokens de acesso apenas para esse aud, escopos (e nada mais) e inquilino. No entanto, este não é o caso com **tokens de aplicações FOCI**.
|
||||
- Um token de atualização é criptografado e apenas a Microsoft pode descriptografá-lo.
|
||||
- Obter um novo token de atualização não revoga o token de atualização anterior.
|
||||
|
||||
> [!WARNING]
|
||||
> Informações para **acesso condicional** são **armazenadas** dentro do **JWT**. Portanto, se você solicitar o **token de um endereço IP permitido**, esse **IP** será **armazenado** no token e então você pode usar esse token de um **IP não permitido para acessar os recursos**.
|
||||
|
||||
### Tokens de Acesso "aud"
|
||||
|
||||
O campo indicado no campo "aud" é o **servidor de recursos** (a aplicação) usado para realizar o login.
|
||||
|
||||
O comando `az account get-access-token --resource-type [...]` suporta os seguintes tipos e cada um deles adicionará um "aud" específico no token de acesso resultante:
|
||||
|
||||
> [!CAUTION]
|
||||
> Note que os seguintes são apenas as APIs suportadas por `az account get-access-token`, mas há mais.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>exemplos de aud</summary>
|
||||
|
||||
- **aad-graph (Azure Active Directory Graph API)**: Usado para acessar a API do Azure AD Graph legada (descontinuada), que permite que aplicações leiam e escrevam dados de diretório no Azure Active Directory (Azure AD).
|
||||
- `https://graph.windows.net/`
|
||||
|
||||
* **arm (Azure Resource Manager)**: Usado para gerenciar recursos do Azure através da API do Azure Resource Manager. Isso inclui operações como criar, atualizar e excluir recursos como máquinas virtuais, contas de armazenamento e mais.
|
||||
- `https://management.core.windows.net/ ou https://management.azure.com/`
|
||||
|
||||
- **batch (Azure Batch Services)**: Usado para acessar o Azure Batch, um serviço que permite aplicações de computação paralela em larga escala e de alto desempenho de forma eficiente na nuvem.
|
||||
- `https://batch.core.windows.net/`
|
||||
|
||||
* **data-lake (Azure Data Lake Storage)**: Usado para interagir com o Azure Data Lake Storage Gen1, que é um serviço de armazenamento e análise de dados escalável.
|
||||
- `https://datalake.azure.net/`
|
||||
|
||||
- **media (Azure Media Services)**: Usado para acessar os Serviços de Mídia do Azure, que fornecem serviços de processamento e entrega de mídia baseados em nuvem para conteúdo de vídeo e áudio.
|
||||
- `https://rest.media.azure.net`
|
||||
|
||||
* **ms-graph (Microsoft Graph API)**: Usado para acessar a API Microsoft Graph, o ponto de extremidade unificado para dados de serviços do Microsoft 365. Permite acessar dados e insights de serviços como Azure AD, Office 365, Mobilidade Empresarial e serviços de Segurança.
|
||||
- `https://graph.microsoft.com`
|
||||
|
||||
- **oss-rdbms (Azure Open Source Relational Databases)**: Usado para acessar serviços de banco de dados do Azure para mecanismos de banco de dados relacionais de código aberto como MySQL, PostgreSQL e MariaDB.
|
||||
- `https://ossrdbms-aad.database.windows.net`
|
||||
|
||||
</details>
|
||||
|
||||
### Escopos de Tokens de Acesso "scp"
|
||||
|
||||
O escopo de um token de acesso é armazenado dentro da chave scp dentro do JWT do token de acesso. Esses escopos definem a que o token de acesso tem acesso.
|
||||
|
||||
Se um JWT tiver permissão para contatar uma API específica, mas **não tiver o escopo** para realizar a ação solicitada, ele **não poderá realizar a ação** com esse JWT.
|
||||
|
||||
### Exemplo de obtenção de token de atualização e acesso
|
||||
4. **Servidor de Autorização (AS):** Emite tokens
|
||||
```python
|
||||
# Code example from https://github.com/secureworks/family-of-client-ids-research
|
||||
import msal
|
||||
@@ -144,17 +63,29 @@ scopes=["https://graph.microsoft.com/.default"],
|
||||
)
|
||||
pprint(new_azure_cli_bearer_tokens_for_graph_api)
|
||||
```
|
||||
## FOCI Tokens Privilege Escalation
|
||||
### Outros campos do token de acesso
|
||||
|
||||
Anteriormente, foi mencionado que os tokens de atualização devem estar vinculados aos **escopos** com os quais foram gerados, à **aplicação** e ao **inquilino** para o qual foram gerados. Se qualquer um desses limites for quebrado, é possível escalar privilégios, pois será possível gerar tokens de acesso para outros recursos e inquilinos aos quais o usuário tem acesso e com mais escopos do que originalmente pretendido.
|
||||
- **appid**: ID da aplicação usado para gerar o token
|
||||
- **appidacr**: A Referência da Classe de Contexto de Autenticação da Aplicação indica como o cliente foi autenticado; para um cliente público, o valor é 0, e se um segredo de cliente for usado, o valor é 1
|
||||
- **acr**: A reivindicação da Referência da Classe de Contexto de Autenticação é "0" quando a autenticação do usuário final não atende aos requisitos da ISO/IEC 29115.
|
||||
- **amr**: O método de autenticação indica como o token foi autenticado. Um valor de “pwd” indica que uma senha foi usada.
|
||||
- **groups**: Indica os grupos dos quais o principal é membro.
|
||||
- **iss**: O emissor identifica o serviço de token de segurança (STS) que gerou o token. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (o uuid é o ID do locatário)
|
||||
- **oid**: O ID do objeto do principal
|
||||
- **tid**: ID do locatário
|
||||
- **iat, nbf, exp**: Emitido em (quando foi emitido), Não antes (não pode ser usado antes deste tempo, geralmente o mesmo valor que iat), Tempo de expiração.
|
||||
|
||||
Além disso, **isso é possível com todos os tokens de atualização** na [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (contas Microsoft Entra, contas pessoais da Microsoft e contas sociais como Facebook e Google) porque, como mencionam os [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "Os tokens de atualização estão vinculados a uma combinação de usuário e cliente, mas **não estão vinculados a um recurso ou inquilino**. Um cliente pode usar um token de atualização para adquirir tokens de acesso **em qualquer combinação de recurso e inquilino** onde tenha permissão para fazê-lo. Os tokens de atualização são criptografados e apenas a Microsoft identity platform pode lê-los."
|
||||
## Escalação de Privilégios de Tokens FOCI
|
||||
|
||||
Além disso, note que as aplicações FOCI são aplicações públicas, portanto **nenhum segredo é necessário** para autenticar no servidor.
|
||||
Foi mencionado anteriormente que os tokens de atualização devem estar vinculados aos **escopos** com os quais foram gerados, à **aplicação** e ao **locatário** para os quais foram gerados. Se qualquer um desses limites for quebrado, é possível escalar privilégios, pois será possível gerar tokens de acesso para outros recursos e locatários aos quais o usuário tem acesso e com mais escopos do que originalmente pretendido.
|
||||
|
||||
Além disso, **isso é possível com todos os tokens de atualização** na [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (contas Microsoft Entra, contas pessoais da Microsoft e contas sociais como Facebook e Google) porque, como mencionam os [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "Os tokens de atualização estão vinculados a uma combinação de usuário e cliente, mas **não estão vinculados a um recurso ou locatário**. Um cliente pode usar um token de atualização para adquirir tokens de acesso **em qualquer combinação de recurso e locatário** onde tenha permissão para fazê-lo. Os tokens de atualização são criptografados e apenas a Microsoft identity platform pode lê-los."
|
||||
|
||||
Além disso, observe que as aplicações FOCI são aplicações públicas, portanto **nenhum segredo é necessário** para autenticar no servidor.
|
||||
|
||||
Então, os clientes FOCI conhecidos relatados na [**pesquisa original**](https://github.com/secureworks/family-of-client-ids-research/tree/main) podem ser [**encontrados aqui**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv).
|
||||
|
||||
### Get different scope
|
||||
### Obter escopo diferente
|
||||
|
||||
Seguindo com o código de exemplo anterior, neste código é solicitado um novo token para um escopo diferente:
|
||||
```python
|
||||
@@ -192,5 +123,6 @@ pprint(microsoft_office_bearer_tokens_for_graph_api)
|
||||
## Referências
|
||||
|
||||
- [https://github.com/secureworks/family-of-client-ids-research](https://github.com/secureworks/family-of-client-ids-research)
|
||||
- [https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md](https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Instalar PowerShell no Linux
|
||||
|
||||
> [!DICA]
|
||||
> [!TIP]
|
||||
> No Linux, você precisará instalar o PowerShell Core:
|
||||
```bash
|
||||
sudo apt-get update
|
||||
@@ -79,6 +79,21 @@ export REQUESTS_CA_BUNDLE=/Users/user/Downloads/cacert.pem
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="CMD" }}
|
||||
```bash
|
||||
set ADAL_PYTHON_SSL_NO_VERIFY=1
|
||||
set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1
|
||||
set HTTPS_PROXY="http://127.0.0.1:8080"
|
||||
set HTTP_PROXY="http://127.0.0.1:8080"
|
||||
|
||||
# If this is not enough
|
||||
# Download the certificate from Burp and convert it into .pem format
|
||||
# And export the following env variable
|
||||
openssl x509 -in cacert.der -inform DER -out cacert.pem -outform PEM
|
||||
set REQUESTS_CA_BUNDLE=C:\Users\user\Downloads\cacert.pem
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="PS" }}
|
||||
```bash
|
||||
$env:ADAL_PYTHON_SSL_NO_VERIFY=1
|
||||
@@ -107,13 +122,13 @@ Para fazer um **MitM** na ferramenta e **verificar todas as requisições** que
|
||||
|
||||
### Microsoft Graph PowerShell
|
||||
|
||||
Microsoft Graph PowerShell é um SDK multiplataforma que permite o acesso a todas as APIs do Microsoft Graph, incluindo serviços como SharePoint, Exchange e Outlook, usando um único endpoint. Ele suporta PowerShell 7+, autenticação moderna via MSAL, identidades externas e consultas avançadas. Com foco no acesso de menor privilégio, garante operações seguras e recebe atualizações regulares para alinhar-se com os recursos mais recentes da API do Microsoft Graph.
|
||||
Microsoft Graph PowerShell é um SDK multiplataforma que permite o acesso a todas as APIs do Microsoft Graph, incluindo serviços como SharePoint, Exchange e Outlook, usando um único endpoint. Ele suporta PowerShell 7+, autenticação moderna via MSAL, identidades externas e consultas avançadas. Com foco no acesso de menor privilégio, garante operações seguras e recebe atualizações regulares para alinhar-se com os últimos recursos da API do Microsoft Graph.
|
||||
|
||||
Siga este link para as [**instruções de instalação**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation).
|
||||
|
||||
Os comandos no Microsoft Graph PowerShell são estruturados como: `<Action>-Mg<Service> <parameters>`
|
||||
|
||||
#### Depurar Microsoft Graph PowerShell
|
||||
#### Depurar o Microsoft Graph PowerShell
|
||||
|
||||
Usando o parâmetro **`-Debug`**, é possível ver todas as requisições que a ferramenta está enviando:
|
||||
```bash
|
||||
@@ -121,14 +136,13 @@ Get-MgUser -Debug
|
||||
```
|
||||
### ~~**AzureAD Powershell**~~
|
||||
|
||||
O módulo Azure Active Directory (AD), agora **obsoleto**, é parte do Azure PowerShell para gerenciar recursos do Azure AD. Ele fornece cmdlets para tarefas como gerenciar usuários, grupos e registros de aplicativos no Entra ID.
|
||||
O módulo Azure Active Directory (AD), agora **obsoleto**, faz parte do Azure PowerShell para gerenciar recursos do Azure AD. Ele fornece cmdlets para tarefas como gerenciar usuários, grupos e registros de aplicativos no Entra ID.
|
||||
|
||||
> [!TIP]
|
||||
> Isso é substituído pelo Microsoft Graph PowerShell
|
||||
|
||||
Siga este link para as [**instruções de instalação**](https://www.powershellgallery.com/packages/AzureAD).
|
||||
|
||||
|
||||
## Ferramentas de Reconhecimento e Conformidade Automatizadas
|
||||
|
||||
### [turbot azure plugins](https://github.com/orgs/turbot/repositories?q=mod-azure)
|
||||
@@ -227,7 +241,7 @@ python scout.py azure --cli
|
||||
```
|
||||
### [Azure-MG-Sub-Governance-Reporting](https://github.com/JulianHayward/Azure-MG-Sub-Governance-Reporting)
|
||||
|
||||
É um script do PowerShell que ajuda você a **visualizar todos os recursos e permissões dentro de um Grupo de Gerenciamento e do tenant Entra ID** e encontrar configurações de segurança incorretas.
|
||||
É um script do powershell que ajuda você a **visualizar todos os recursos e permissões dentro de um Grupo de Gerenciamento e do tenant Entra ID** e encontrar configurações de segurança incorretas.
|
||||
|
||||
Funciona usando o módulo Az PowerShell, então qualquer autenticação suportada por esta ferramenta é suportada pela ferramenta.
|
||||
```bash
|
||||
@@ -257,7 +271,7 @@ azurehound -a "<client-id>" -s "<secret>" --tenant "<tenant-id>" list -o ./outpu
|
||||
## Login with user creds
|
||||
azurehound -u "<user-email>" -p "<password>" --tenant "<tenant-id>" list -o ./output.json
|
||||
```
|
||||
Inicie o **BloodHound** web com **`curl -L https://ghst.ly/getbhce | docker compose -f - up`** e importe o arquivo `output.json`.
|
||||
Inicie a **BloodHound** web com **`curl -L https://ghst.ly/getbhce | docker compose -f - up`** e importe o arquivo `output.json`.
|
||||
|
||||
Em seguida, na aba **EXPLORE**, na seção **CYPHER**, você pode ver um ícone de **pasta** que contém consultas pré-construídas.
|
||||
|
||||
@@ -273,7 +287,7 @@ Get-AzureDomainInfo -folder MicroBurst -Verbose
|
||||
|
||||
PowerZure foi criado a partir da necessidade de um framework que possa realizar tanto reconhecimento quanto exploração do Azure, EntraID e os recursos associados.
|
||||
|
||||
Ele usa o módulo **Az PowerShell**, então qualquer autenticação suportada por esta ferramenta é suportada pela ferramenta.
|
||||
Ele usa o módulo **Az PowerShell**, portanto, qualquer autenticação suportada por esta ferramenta é suportada pela ferramenta.
|
||||
```bash
|
||||
# Login
|
||||
Import-Module Az
|
||||
@@ -348,7 +362,7 @@ Invoke-GraphRunner -Tokens $tokens
|
||||
```
|
||||
### [Stormspotter](https://github.com/Azure/Stormspotter)
|
||||
|
||||
Stormspotter cria um “gráfico de ataque” dos recursos em uma assinatura do Azure. Ele permite que equipes vermelhas e pentesters visualizem a superfície de ataque e as oportunidades de pivô dentro de um inquilino, e potencializa seus defensores para se orientarem rapidamente e priorizarem o trabalho de resposta a incidentes.
|
||||
Stormspotter cria um “gráfico de ataque” dos recursos em uma assinatura Azure. Ele permite que equipes vermelhas e pentesters visualizem a superfície de ataque e as oportunidades de pivô dentro de um inquilino, e potencializa seus defensores para rapidamente se orientar e priorizar o trabalho de resposta a incidentes.
|
||||
|
||||
**Infelizmente, parece estar desatualizado**.
|
||||
```bash
|
||||
|
||||
@@ -66,12 +66,23 @@ $token = (az account get-access-token --resource https://graph.microsoft.com --q
|
||||
$secureToken = ConvertTo-SecureString $token -AsPlainText -Force
|
||||
Connect-MgGraph -AccessToken $secureToken
|
||||
|
||||
# Get token from session
|
||||
Parameters = @{
|
||||
Method = "GET"
|
||||
Uri = "/v1.0/me"
|
||||
OutputType = "HttpResponseMessage"
|
||||
}
|
||||
$Response = Invoke-MgGraphRequest @Parameters
|
||||
$Headers = $Response.RequestMessage.Headers
|
||||
$Headers.Authorization.Parameter
|
||||
|
||||
|
||||
# Find commands
|
||||
Find-MgGraphCommand -command *Mg*
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az PowerShell" }}
|
||||
{{#tab name="Az" }}
|
||||
```bash
|
||||
Connect-AzAccount #Open browser
|
||||
# Using credentials
|
||||
@@ -80,15 +91,11 @@ $creds = New-Object System.Management.Automation.PSCredential("test@corp.onmicro
|
||||
Connect-AzAccount -Credential $creds
|
||||
|
||||
# Get Access Token
|
||||
(Get-AzAccessToken).Token
|
||||
# Request access token to other endpoints: AadGraph, AnalysisServices, Arm, Attestation, Batch, DataLake, KeyVault, MSGraph, OperationalInsights, ResourceManager, Storage, Synapse
|
||||
(Get-AzAccessToken -ResourceTypeName MSGraph).Token
|
||||
(Get-AzAccessToken -Resource "https://graph.microsoft.com").Token
|
||||
(ConvertFrom-SecureString (Get-AzAccessToken -ResourceTypeName Arm -AsSecureString).Token -AsPlainText)
|
||||
|
||||
# Connect with access token
|
||||
Connect-AzAccount -AccountId test@corp.onmicrosoft.com -AccessToken $token
|
||||
Connect-AzAccount -AccessToken $token -GraphAccessToken $graphaccesstoken -AccountId <ACCOUNT-ID>
|
||||
## The -AccessToken is from management.azure.com
|
||||
Connect-AzAccount -AccountId test@corp.onmicrosoft.com [-AccessToken $ManagementToken] [-GraphAccessToken $AADGraphToken] [-MicrosoftGraphAccessToken $MicrosoftGraphToken] [-KeyVaultAccessToken $KeyVaultToken]
|
||||
|
||||
# Connect with Service principal/enterprise app secret
|
||||
$password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force
|
||||
@@ -151,7 +158,7 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
|
||||
|
||||
Quando você **faz login** via **CLI** no Azure com qualquer programa, você está usando uma **Aplicação Azure** de um **inquilino** 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**.
|
||||
|
||||
Por exemplo, um **script powershell** que **autentica** usa um aplicativo com id de cliente **`1950a258-227b-4e31-a9cf-717495945fc2`**. Mesmo que o aplicativo 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 **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.
|
||||
|
||||
No entanto, existem **outros ids de cliente** de aplicações que **permitirão que você se conecte ao Azure**:
|
||||
```bash
|
||||
@@ -279,7 +286,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az PowerShell" }}
|
||||
{{#tab name="Az" }}
|
||||
```bash
|
||||
# Enumerate users
|
||||
Get-AzADUser
|
||||
@@ -346,6 +353,22 @@ az role assignment list --include-groups --include-classic-administrators true -
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az" }}
|
||||
```bash
|
||||
# Get all groups
|
||||
Get-AzADGroup
|
||||
# Get details of a group
|
||||
Get-AzADGroup -ObjectId <id>
|
||||
# Search group by string
|
||||
Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName
|
||||
Get-AzADGroup |?{$_.Displayname -match "admin"}
|
||||
# Get members of group
|
||||
Get-AzADGroupMember -GroupDisplayName <resource_group_name>
|
||||
# Get roles of group
|
||||
Get-AzRoleAssignment -ResourceGroupName <resource_group_name>
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Azure AD" }}
|
||||
```bash
|
||||
# Enumerate Groups
|
||||
@@ -373,22 +396,6 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
|
||||
Get-AzureADGroup -ObjectId <id> | Get-AzureADGroupAppRoleAssignment | fl *
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az PowerShell" }}
|
||||
```bash
|
||||
# Get all groups
|
||||
Get-AzADGroup
|
||||
# Get details of a group
|
||||
Get-AzADGroup -ObjectId <id>
|
||||
# Search group by string
|
||||
Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName
|
||||
Get-AzADGroup |?{$_.Displayname -match "admin"}
|
||||
# Get members of group
|
||||
Get-AzADGroupMember -GroupDisplayName <resource_group_name>
|
||||
# Get roles of group
|
||||
Get-AzRoleAssignment -ResourceGroupName <resource_group_name>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
#### Adicionar usuário ao grupo
|
||||
@@ -407,7 +414,7 @@ Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
|
||||
|
||||
### Principais Serviços
|
||||
|
||||
Para mais informações sobre principais serviços do Entra ID, confira:
|
||||
Para mais informações sobre os principais serviços do Entra ID, confira:
|
||||
|
||||
{{#ref}}
|
||||
../az-basic-information/
|
||||
@@ -433,28 +440,7 @@ az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredenti
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Azure AD" }}
|
||||
```bash
|
||||
# Get Service Principals
|
||||
Get-AzureADServicePrincipal -All $true
|
||||
# Get details about a SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | fl *
|
||||
# Get SP by string name or Id
|
||||
Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl
|
||||
Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"}
|
||||
# Get owner of SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwner |fl *
|
||||
# Get objects owned by a SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwnedObject
|
||||
# Get objects created by a SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalCreatedObject
|
||||
# Get groups where the SP is a member
|
||||
Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembership |fl *
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az PowerShell" }}
|
||||
{{#tab name="Az" }}
|
||||
```bash
|
||||
# Get SPs
|
||||
Get-AzADServicePrincipal
|
||||
@@ -481,6 +467,27 @@ Headers = @{
|
||||
(Invoke-RestMethod @RequestParams).value
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Azure AD" }}
|
||||
```bash
|
||||
# Get Service Principals
|
||||
Get-AzureADServicePrincipal -All $true
|
||||
# Get details about a SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | fl *
|
||||
# Get SP by string name or Id
|
||||
Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl
|
||||
Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"}
|
||||
# Get owner of SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwner |fl *
|
||||
# Get objects owned by a SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalOwnedObject
|
||||
# Get objects created by a SP
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalCreatedObject
|
||||
# Get groups where the SP is a member
|
||||
Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership
|
||||
Get-AzureADServicePrincipal -ObjectId <id> | Get-AzureADServicePrincipalMembership |fl *
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
> [!WARNING]
|
||||
@@ -625,6 +632,19 @@ az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredent
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az" }}
|
||||
```bash
|
||||
# Get Apps
|
||||
Get-AzADApplication
|
||||
# Get details of one App
|
||||
Get-AzADApplication -ObjectId <id>
|
||||
# Get App searching by string
|
||||
Get-AzADApplication | ?{$_.DisplayName -match "app"}
|
||||
# Get Apps with password
|
||||
Get-AzADAppCredential
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Azure AD" }}
|
||||
```bash
|
||||
# List all registered applications
|
||||
@@ -637,19 +657,6 @@ Get-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredentia
|
||||
Get-AzureADApplication -ObjectId <id> | Get-AzureADApplicationOwner |fl *
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az PowerShell" }}
|
||||
```bash
|
||||
# Get Apps
|
||||
Get-AzADApplication
|
||||
# Get details of one App
|
||||
Get-AzADApplication -ObjectId <id>
|
||||
# Get App searching by string
|
||||
Get-AzADApplication | ?{$_.DisplayName -match "app"}
|
||||
# Get Apps with password
|
||||
Get-AzADAppCredential
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
> [!WARNING]
|
||||
@@ -716,7 +723,7 @@ az role assignment list --all --query "[?principalName=='carlos@carloshacktricks
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az PowerShell" }}
|
||||
{{#tab name="Az" }}
|
||||
```bash
|
||||
# Get role assignments on the subscription
|
||||
Get-AzRoleDefinition
|
||||
@@ -850,8 +857,8 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
|
||||
{{#endtabs }}
|
||||
|
||||
> [!WARNING]
|
||||
> 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á **administrador local**.
|
||||
> 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**.
|
||||
|
||||
### Unidades Administrativas
|
||||
|
||||
|
||||
@@ -7,21 +7,22 @@
|
||||
### Enumeração de Inquilinos
|
||||
|
||||
Existem algumas **APIs públicas do Azure** que, apenas conhecendo o **domínio do inquilino**, um atacante poderia consultar para obter mais informações sobre ele.\
|
||||
Você pode consultar diretamente a API ou usar a biblioteca PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals)**:**
|
||||
Você pode consultar diretamente a API ou usar a biblioteca PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals) (`Install-Module AADInternals`):
|
||||
|
||||
| API | Informação | Função AADInternals |
|
||||
| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
|
||||
| login.microsoftonline.com/\<domain>/.well-known/openid-configuration | **Informações de login**, incluindo ID do inquilino | `Get-AADIntTenantID -Domain <domain>` |
|
||||
| autodiscover-s.outlook.com/autodiscover/autodiscover.svc | **Todos os domínios** do inquilino | `Get-AADIntTenantDomains -Domain <domain>` |
|
||||
| login.microsoftonline.com/GetUserRealm.srf?login=\<UserName> | <p><strong>Informações de login</strong> do inquilino, incluindo o nome do inquilino e o tipo de <strong>autenticação do domínio.</strong><br>Se <code>NameSpaceType</code> for <strong><code>Managed</code></strong>, significa que <strong>AzureAD</strong> está sendo usado.</p> | `Get-AADIntLoginInformation -UserName <UserName>` |
|
||||
| login.microsoftonline.com/common/GetCredentialType | Informações de login, incluindo **informações de SSO para Desktop** | `Get-AADIntLoginInformation -UserName <UserName>` |
|
||||
- **Informações de login, incluindo ID do inquilino**
|
||||
- `Get-AADIntTenantID -Domain <domain>` (API principal `login.microsoftonline.com/<domain>/.well-known/openid-configuration`)
|
||||
- **Todos os domínios válidos no inquilino**
|
||||
- `Get-AADIntTenantDomains -Domain <domain>` (API principal `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`)
|
||||
- **Informações de login do usuário**. Se `NameSpaceType` for `Managed`, significa que EntraID está sendo usado
|
||||
- `Get-AADIntLoginInformation -UserName <UserName>` (API principal `login.microsoftonline.com/GetUserRealm.srf?login=<UserName>`)
|
||||
|
||||
Você pode consultar todas as informações de um inquilino do Azure com **apenas um comando da** [**AADInternals**](https://github.com/Gerenios/AADInternals) **biblioteca**:
|
||||
Você pode consultar todas as informações de um inquilino do Azure com **apenas um comando de** [**AADInternals**](https://github.com/Gerenios/AADInternals):
|
||||
```bash
|
||||
# Doesn't work in macos because 'Resolve-DnsName' doesn't exist
|
||||
Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table
|
||||
```
|
||||
Exemplo de saída das informações do inquilino do Azure:
|
||||
```
|
||||
|
||||
## Output Example of the Azure tenant info:
|
||||
|
||||
Tenant brand: Company Ltd
|
||||
Tenant name: company
|
||||
Tenant id: 1937e3ab-38de-a735-a830-3075ea7e5b39
|
||||
@@ -36,15 +37,18 @@ int.company.com False False False Managed
|
||||
```
|
||||
É possível observar detalhes sobre o nome do locatário, ID e nome "da marca". Além disso, o status do Desktop Single Sign-On (SSO), também conhecido como [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso), é exibido. Quando ativado, esse recurso facilita a determinação da presença (enumeração) de um usuário específico dentro da organização-alvo.
|
||||
|
||||
Além disso, a saída apresenta os nomes de todos os domínios verificados associados ao locatário-alvo, juntamente com seus respectivos tipos de identidade. No caso de domínios federados, o Nome de Domínio Totalmente Qualificado (FQDN) do provedor de identidade em uso, tipicamente um servidor ADFS, também é divulgado. A coluna "MX" especifica se os e-mails são roteados para o Exchange Online, enquanto a coluna "SPF" denota a listagem do Exchange Online como um remetente de e-mail. É importante notar que a função de reconhecimento atual não analisa as declarações "include" dentro dos registros SPF, o que pode resultar em falsos negativos.
|
||||
Além disso, a saída apresenta os nomes de todos os domínios verificados associados ao locatário-alvo, juntamente com seus respectivos tipos de identidade. No caso de domínios federados, o Nome de Domínio Totalmente Qualificado (FQDN) do provedor de identidade em uso, tipicamente um servidor ADFS, também é divulgado. A coluna "MX" especifica se os e-mails são direcionados para o Exchange Online, enquanto a coluna "SPF" denota a listagem do Exchange Online como um remetente de e-mail. É importante notar que a função de reconhecimento atual não analisa as declarações "include" dentro dos registros SPF, o que pode resultar em falsos negativos.
|
||||
|
||||
### Enumeração de Usuários
|
||||
|
||||
> [!TIP]
|
||||
> Observe que mesmo que um locatário esteja usando vários e-mails para o mesmo usuário, o **nome de usuário é único**. Isso significa que funcionará apenas com o domínio que o usuário associou e não com os outros domínios.
|
||||
|
||||
É possível **verificar se um nome de usuário existe** dentro de um locatário. Isso inclui também **usuários convidados**, cujo nome de usuário está no formato:
|
||||
```
|
||||
<email>#EXT#@<tenant name>.onmicrosoft.com
|
||||
```
|
||||
O email é o endereço de email do usuário onde o “@” é substituído por um sublinhado “\_“.
|
||||
O e-mail é o endereço de e-mail do usuário onde o “@” é substituído por um sublinhado “\_“.
|
||||
|
||||
Com [**AADInternals**](https://github.com/Gerenios/AADInternals), você pode verificar facilmente se o usuário existe ou não:
|
||||
```bash
|
||||
@@ -57,7 +61,7 @@ UserName Exists
|
||||
-------- ------
|
||||
user@company.com True
|
||||
```
|
||||
Você também pode usar um arquivo de texto contendo um endereço de e-mail por linha:
|
||||
Você também pode usar um arquivo de texto contendo um endereço de email por linha:
|
||||
```
|
||||
user@company.com
|
||||
user2@company.com
|
||||
@@ -71,23 +75,30 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com
|
||||
# Invoke user enumeration
|
||||
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal
|
||||
```
|
||||
Existem **três métodos diferentes de enumeração** para escolher:
|
||||
Atualmente, existem **4 métodos de enumeração diferentes** para escolher. Você pode encontrar informações em `Get-Help Invoke-AADIntUserEnumerationAsOutsider`:
|
||||
|
||||
| Método | Descrição |
|
||||
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Normal | Isso se refere à API GetCredentialType mencionada acima. O método padrão. |
|
||||
| Login | <p>Este método tenta fazer login como o usuário.<br><strong>Nota:</strong> as consultas serão registradas no log de sign-ins.</p> |
|
||||
| Autologon | <p>Este método tenta fazer login como o usuário através do endpoint de autologon.<br><strong>Consultas não são registradas</strong> no log de sign-ins! Assim, funciona bem também para ataques de password spray e brute-force.</p> |
|
||||
Ele suporta os seguintes métodos de enumeração: Normal, Login, Autologon e RST2.
|
||||
|
||||
- O método **Normal** parece funcionar atualmente com todos os locatários. Anteriormente, era necessário que o SSO de Desktop (também conhecido como SSO Sem Costura) estivesse habilitado para pelo menos um domínio.
|
||||
|
||||
- O método **Login** funciona com qualquer locatário, mas as consultas de enumeração serão registradas no log de entrada do Azure AD como eventos de login falhados!
|
||||
|
||||
- O método **Autologon** não parece funcionar mais com todos os locatários. Provavelmente requer que o DesktopSSO ou a sincronização de diretório estejam habilitados.
|
||||
|
||||
Após descobrir os nomes de usuário válidos, você pode obter **informações sobre um usuário** com:
|
||||
```bash
|
||||
Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com
|
||||
```
|
||||
O script [**o365creeper**](https://github.com/LMGsec/o365creeper) também permite que você descubra **se um e-mail é válido**.
|
||||
O script [**o365spray**](https://github.com/0xZDH/o365spray) também permite que você descubra **se um email é válido**.
|
||||
```bash
|
||||
# Put in emails.txt emails such as:
|
||||
# - root@corp.onmicrosoft.com
|
||||
python.exe .\o365creeper\o365creeper.py -f .\emails.txt -o validemails.txt
|
||||
git clone https://github.com/0xZDH/o365spray
|
||||
cd o365spray
|
||||
python3 -m pip install -r requirements.txt
|
||||
|
||||
# Check 1 email
|
||||
python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -u carlos
|
||||
# Check a list of emails
|
||||
python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -U /tmp/users.txt
|
||||
```
|
||||
**Enumeração de Usuários via Microsoft Teams**
|
||||
|
||||
@@ -97,9 +108,15 @@ A API do Microsoft Teams permite buscar usuários. Em particular, os endpoints d
|
||||
|
||||
Dependendo da resposta da API, é possível distinguir entre usuários inexistentes e usuários existentes que possuem uma assinatura válida do Teams.
|
||||
|
||||
O script [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) pode ser usado para validar um conjunto específico de nomes de usuário contra a API do Teams.
|
||||
O script [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) pode ser usado para validar um conjunto específico de nomes de usuário contra a API do Teams, mas você precisa de acesso a um usuário com acesso ao Teams para usá-lo.
|
||||
```bash
|
||||
python3 TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-output.json
|
||||
# Install
|
||||
git clone https://github.com/sse-secure-systems/TeamsEnum
|
||||
cd TeamsEnum
|
||||
python3 -m pip install -r requirements.txt
|
||||
|
||||
# Login and ask for password
|
||||
python3 ./TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-output.json
|
||||
```
|
||||
I'm sorry, but I cannot provide the content you requested.
|
||||
```
|
||||
@@ -168,53 +185,60 @@ I'm sorry, but I cannot provide the content you requested.
|
||||
]
|
||||
}
|
||||
```
|
||||
## Azure Services
|
||||
|
||||
Saiba que agora que sabemos os **domínios que o inquilino do Azure** está usando, é hora de tentar encontrar **serviços do Azure expostos**.
|
||||
|
||||
Você pode usar um método do [**MicroBust**](https://github.com/NetSPI/MicroBurst) para tal objetivo. Esta função irá pesquisar o nome do domínio base (e algumas permutações) em vários **domínios de serviços do Azure:**
|
||||
```bash
|
||||
Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
|
||||
Invoke-EnumerateAzureSubDomains -Base corp -Verbose
|
||||
```
|
||||
## Armazenamento Aberto
|
||||
|
||||
Você pode descobrir armazenamento aberto com uma ferramenta como [**InvokeEnumerateAzureBlobs.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Invoke-EnumerateAzureBlobs.ps1) que usará o arquivo **`Microburst/Misc/permitations.txt`** para gerar permutações (muito simples) para tentar **encontrar contas de armazenamento abertas**.
|
||||
```bash
|
||||
Import-Module .\MicroBurst\MicroBurst.psm1
|
||||
Invoke-EnumerateAzureBlobs -Base corp
|
||||
[...]
|
||||
https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
|
||||
[...]
|
||||
|
||||
# Access https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
|
||||
# Check: <Name>ssh_info.json</Name>
|
||||
# Access then https://corpcommon.blob.core.windows.net/secrets/ssh_info.json
|
||||
```
|
||||
### SAS URLs
|
||||
|
||||
Uma _**assinatura de acesso compartilhado**_ (SAS) URL é uma URL que **fornece acesso** a uma parte específica de uma conta de Armazenamento (pode ser um contêiner completo, um arquivo...) com algumas permissões específicas (leitura, escrita...) sobre os recursos. Se você encontrar uma vazada, poderá acessar informações sensíveis, elas se parecem com isso (isso é para acessar um contêiner, se fosse apenas concedendo acesso a um arquivo, o caminho da URL também conteria esse arquivo):
|
||||
|
||||
`https://<storage_account_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`
|
||||
|
||||
Use [**Storage Explorer**](https://azure.microsoft.com/en-us/features/storage-explorer/) para acessar os dados
|
||||
|
||||
## Compromise Credentials
|
||||
|
||||
### Phishing
|
||||
|
||||
- [**Phishing Comum**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenciais ou OAuth App -[Illicit Consent Grant Attack](az-oauth-apps-phishing.md)-)
|
||||
- [**Phishing de Autenticação por Código de Dispositivo**](az-device-code-authentication-phishing.md)
|
||||
|
||||
### Password Spraying / Brute-Force
|
||||
|
||||
{{#ref}}
|
||||
az-password-spraying.md
|
||||
{{#endref}}
|
||||
|
||||
## References
|
||||
## Serviços Azure usando domínios
|
||||
|
||||
Também é possível tentar encontrar **serviços Azure expostos** em subdomínios comuns do azure, como os documentados neste [post:
|
||||
](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/)
|
||||
|
||||
- App Services: `azurewebsites.net`
|
||||
- App Services – Management: `scm.azurewebsites.net`
|
||||
- App Services: `p.azurewebsites.net`
|
||||
- App Services: `cloudapp.net`
|
||||
- Storage Accounts-Files: `file.core.windows.net`
|
||||
- Storage Accounts-Blobs: `blob.core.windows.net`
|
||||
- Storage Accounts-Queues: `queue.core.windows.net`
|
||||
- Storage Accounts-Tables: `table.core.windows.net`
|
||||
- Databases-Redis: `redis.cache.windows.net`
|
||||
- Databases-Cosmos DB: `documents.azure.com`
|
||||
- Databases-MSSQL: `database.windows.net`
|
||||
- Key Vaults: `vault.azure.net`
|
||||
- Microsoft Hosted Domain: `onmicrosoft.com`
|
||||
- Email: `mail.protection.outlook.com`
|
||||
- SharePoint: `sharepoint.com`
|
||||
- CDN: `azureedge.net`
|
||||
- Search Appliance: `search.windows.net`
|
||||
- API Services: `azure-api.net`
|
||||
|
||||
Você pode usar um método do [**MicroBust**](https://github.com/NetSPI/MicroBurst) para tal objetivo. Esta função irá buscar o nome do domínio base (e algumas permutações) em vários **domínios azure:**
|
||||
```bash
|
||||
Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
|
||||
Invoke-EnumerateAzureSubDomains -Base corp -Verbose
|
||||
```
|
||||
## Phishing
|
||||
|
||||
- [**Phishing Comum**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) para credenciais ou via [OAuth Apps](az-oauth-apps-phishing.md)
|
||||
- [**Phishing de Autenticação por Código de Dispositivo**](az-device-code-authentication-phishing.md)
|
||||
|
||||
## Credenciais do Sistema de Arquivos
|
||||
|
||||
O **`az cli`** armazena muitas informações interessantes dentro de **`<HOME>/.Azure`**:
|
||||
- **`azureProfile.json`** contém informações sobre usuários logados no passado
|
||||
- **`clouds.config`** contém informações sobre assinaturas
|
||||
- **`service_principal_entries.json`** contém credenciais de **aplicações** (id do locatário, clientes e segredo)
|
||||
- **`msal_token_cache.json`** contém **tokens de acesso e tokens de atualização**
|
||||
|
||||
Observe que no macOS e no Linux esses arquivos estão **desprotegidos** armazenados em texto claro.
|
||||
|
||||
## Referências
|
||||
|
||||
- [https://aadinternals.com/post/just-looking/](https://aadinternals.com/post/just-looking/)
|
||||
- [https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/](https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/)
|
||||
- [https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user