diff --git a/src/pentesting-cloud/azure-security/README.md b/src/pentesting-cloud/azure-security/README.md index 4fb595386..bc86490e6 100644 --- a/src/pentesting-cloud/azure-security/README.md +++ b/src/pentesting-cloud/azure-security/README.md @@ -4,6 +4,8 @@ ## Información Básica +Aprende los conceptos básicos de Azure y Entra ID en la siguiente página: + {{#ref}} az-basic-information/ {{#endref}} @@ -12,47 +14,55 @@ az-basic-information/ Para auditar un entorno AZURE, es muy importante saber: qué **servicios se están utilizando**, qué está **siendo expuesto**, quién tiene **acceso** a qué, y cómo están conectados los servicios internos de Azure y los **servicios externos**. -Desde el punto de vista de un Red Team, el **primer paso para comprometer un entorno de Azure** es conseguir obtener algunas **credenciales** para Azure AD. Aquí tienes algunas ideas sobre cómo hacerlo: +Desde el punto de vista de un Red Team, el **primer paso para comprometer un entorno de Azure** es lograr obtener algún **punto de apoyo**. -- **Filtraciones** en github (o similar) - OSINT -- **Ingeniería** Social -- Reutilización de **contraseñas** (filtraciones de contraseñas) -- Vulnerabilidades en Aplicaciones Alojadas en Azure -- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) con acceso al endpoint de metadatos -- **Lectura de Archivos Locales** -- `/home/USERNAME/.azure` -- `C:\Users\USERNAME\.azure` -- El archivo **`accessTokens.json`** en `az cli` antes de 2.30 - Jan2022 - almacenaba **tokens de acceso en texto claro** -- El archivo **`azureProfile.json`** contiene **información** sobre el usuario conectado. -- **`az logout`** elimina el token. -- Versiones anteriores de **`Az PowerShell`** almacenaban **tokens de acceso** en **texto claro** en **`TokenCache.dat`**. También almacena **ServicePrincipalSecret** en **texto claro** en **`AzureRmContext.json`**. El cmdlet **`Save-AzContext`** se puede usar para **almacenar** **tokens**.\ -Usa `Disconnect-AzAccount` para eliminarlos. -- Terceros **comprometidos** -- Empleado **Interno** -- [**Phishing Común**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenciales o aplicación Oauth) -- [Phishing de Autenticación con Código de Dispositivo](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) -- [**Password Spraying** de Azure](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) +### Enumeración Externa y Acceso Inicial -Incluso si **no has comprometido a ningún usuario** dentro del inquilino de Azure que estás atacando, puedes **recolectar algo de información** de él: +El primer paso es, por supuesto, enumerar información sobre el inquilino que estás atacando y tratar de obtener un punto de apoyo. + +Basado en el nombre de dominio, es posible saber **si la empresa está usando Azure**, obtener el **ID del inquilino**, obtener otros **dominios válidos** en el mismo inquilino (si hay más) y obtener **información relevante** como si SSO está habilitado, configuraciones de correo, correos electrónicos de usuarios válidos... + +Consulta la siguiente página para aprender cómo realizar la **enumeración externa**: {{#ref}} az-unauthenticated-enum-and-initial-entry/ {{#endref}} -> [!NOTE] -> Después de haber conseguido obtener credenciales, necesitas saber **a quién pertenecen esas credenciales**, y **a qué tienen acceso**, por lo que necesitas realizar alguna enumeración básica: - -## Enumeración Básica +Con esta información, las formas más comunes de intentar obtener un punto de apoyo son: +- **OSINT**: Busca **filtraciones** en Github o cualquier otra plataforma de código abierto que pueda contener **credenciales** o información interesante. +- Reutilización de **contraseñas**, filtraciones o [password spraying](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) +- Comprar credenciales a un empleado +- [**Phishing Común**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenciales o aplicación Oauth) +- [Phishing de Autenticación con Código de Dispositivo](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) +- **Compromisos** de terceros +- Vulnerabilidades en Aplicaciones Alojadas en Azure +- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) con acceso al endpoint de metadatos +- **Tomas de subdominio** como en [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/) +- Si alguna laptop de desarrollador está comprometida ([WinPEAS y LinPEAS](https://github.com/peass-ng/PEASS-ng) pueden encontrar esta información): +- Dentro de **`/.Azure`** +- **`azureProfile.json`** contiene información sobre usuarios conectados en el pasado +- **`clouds.config` contiene** información sobre suscripciones +- **`service_principal_entries.json`** contiene credenciales de aplicaciones (ID de inquilino, clientes y secreto). Solo en Linux y macOS +- **`msal_token_cache.json`** contiene tokens de acceso y tokens de actualización. Solo en Linux y macOS +- **`service_principal_entries.bin`** y **msal_token_cache.bin** se utilizan en Windows y están encriptados con DPAPI +- **`msal_http_cache.bin`** es un caché de solicitudes HTTP +- Cárgalo: `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)` +- **`AzureRmContext.json`** contiene información sobre inicios de sesión anteriores usando Az PowerShell (pero no credenciales) +- Dentro de **`C:\Users\\AppData\Local\Microsoft\IdentityCache\*`** hay varios archivos `.bin` con **tokens de acceso**, tokens de ID e información de cuentas encriptada con el DPAPI de los usuarios. +- Es posible encontrar más **tokens de acceso** en los archivos `.tbres` dentro de **`C:\Users\\AppData\Local\Microsoft\TokenBroken\Cache\`** que contienen un base64 encriptado con DPAPI con tokens de acceso. +- En Linux y macOS puedes obtener **tokens de acceso, tokens de actualización y tokens de ID** desde Az PowerShell (si se usó) ejecutando `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"` +- En Windows, esto solo genera tokens de ID. +- Es posible ver si se usó Az PowerShell en Linux y macOS verificando si existe `$HOME/.local/share/.IdentityService/` (aunque los archivos contenidos están vacíos y son inútiles) > [!NOTE] -> Recuerda que la parte **más ruidosa** de la enumeración es el **inicio de sesión**, no la enumeración en sí. +> Recuerda que generalmente la parte **más ruidosa** de la enumeración es el **inicio de sesión**, no la enumeración en sí. -### SSRF +### Herramientas de Azure y Entra ID -Si encontraste un SSRF en una máquina dentro de Azure, consulta esta página para trucos: +Las siguientes herramientas serán muy útiles para enumerar tanto inquilinos de Entra ID como entornos de Azure lentamente (para evitar detección) o automáticamente (para ahorrar tiempo): {{#ref}} -https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html +az-enumeration-tools.md {{#endref}} ### Bypass de Condiciones de Inicio de Sesión @@ -64,14 +74,10 @@ En casos donde tienes algunas credenciales válidas pero no puedes iniciar sesi - **Lista blanca de IP** -- Necesitas comprometer una IP válida - **Restricciones geográficas** -- Encuentra dónde vive el usuario o dónde están las oficinas de la empresa y obtén una IP de la misma ciudad (o país al menos) - **Navegador** -- Tal vez solo se permite un navegador de cierto SO (Windows, Linux, Mac, Android, iOS). Descubre qué SO usa la víctima/empresa. -- También puedes intentar **comprometer las credenciales del Service Principal** ya que suelen ser menos limitadas y su inicio de sesión es menos revisado +- También puedes intentar **comprometer las credenciales del Service Principal** ya que generalmente son menos limitadas y su inicio de sesión es menos revisado Después de eludirlo, podrías ser capaz de volver a tu configuración inicial y aún tendrás acceso. -### Toma de Control de Subdominio - -- [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] -> Uno de los comandos más importantes para enumerar Azure es **`Get-AzResource`** de Az PowerShell, ya que te permite **conocer los recursos a los que tu usuario actual tiene visibilidad**. -> -> Puedes obtener la misma información en la **consola web** yendo a [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) o buscando "Todos los recursos" -### Enumeración de Entra ID +### Enumeración de Entra ID y Escalación de Privilegios -Por defecto, cualquier usuario debería tener **suficientes permisos para enumerar** cosas como, usuarios, grupos, roles, principales de servicio... (ver [permisos predeterminados de AzureAD](az-basic-information/index.html#default-user-permissions)).\ -Aquí puedes encontrar una guía: +Por defecto, cualquier usuario debería tener **suficientes permisos para enumerar** cosas como usuarios, grupos, roles, principales de servicio... (ver [permisos predeterminados de AzureAD](az-basic-information/index.html#default-user-permissions)).\ +Puedes encontrar aquí una guía: {{#ref}} az-services/az-azuread.md {{#endref}} -> [!NOTE] -> Ahora que **tienes algo de información sobre tus credenciales** (y si eres un equipo rojo, espero que **no hayas sido detectado**). Es hora de averiguar qué servicios se están utilizando en el entorno.\ -> En la siguiente sección puedes revisar algunas formas de **enumerar algunos servicios comunes.** +Consulta las **herramientas de Post-Explotación** para encontrar herramientas que escalen privilegios en Entra ID como **AzureHound:** -## App Service SCM +{{#ref}} +az-enumeration-tools.md#automated-post-exploitation-tools +{{#endref}} -Consola Kudu para iniciar sesión en el 'contenedor' del App Service. -## Webshell +### Enumerar Servicios de Azure -Usa portal.azure.com y selecciona la shell, o usa shell.azure.com, para un bash o powershell. El 'disco' de esta shell se almacena como un archivo de imagen en una cuenta de almacenamiento. +Una vez que sepas quién eres, puedes comenzar a enumerar los **servicios de Azure a los que tienes acceso**. -## Azure DevOps +El comando de Az PowerShell **`Get-AzResource`** te permite **conocer los recursos sobre los que tu usuario actual tiene visibilidad**. -Azure DevOps es independiente de Azure. Tiene repositorios, pipelines (yaml o release), tableros, wiki, y más. Los Grupos de Variables se utilizan para almacenar valores de variables y secretos. +Además, puedes obtener la misma información en la **consola web** yendo a [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) o buscando "Todos los recursos" o ejecutando: `az rest --method GET --url "https://management.azure.com/subscriptions//resources?api-version=2021-04-01"` + +Además, con suficientes permisos, el rol **`Get-AzRoleAssignment`** se puede usar para **enumerar todos los roles** en la suscripción o el permiso sobre un recurso específico indicándolo como en: **`Get-AzRoleAssignment -Scope /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.RecoveryServices/vaults/vault-m3ww8ut4`** + +En la siguiente sección puedes encontrar información sobre los servicios de Azure más comunes y cómo enumerarlos: + +{{#ref}} +az-services/ +{{#endref}} + +### Escalación de Privilegios, Post-Explotación y Persistencia en Servicios de Azure + +Una vez que sepas cómo está estructurado el entorno de Azure y qué servicios se están utilizando, puedes comenzar a buscar formas de **escalar privilegios, moverte lateralmente, realizar otros ataques de post-explotación y mantener persistencia**. + +En la siguiente sección puedes encontrar información sobre cómo escalar privilegios en los servicios de Azure más comunes: + +{{#ref}} +az-privilege-escalation/ +{{#endref}} + +En la siguiente puedes encontrar información sobre cómo realizar ataques de post-explotación en los servicios de Azure más comunes: + +{{#ref}} +az-post-exploitation/ +{{#endref}} + +En la siguiente puedes encontrar información sobre cómo mantener persistencia en los servicios de Azure más comunes: + +{{#ref}} +az-persistence/ +{{#endref}} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md index d3bb20718..396889f80 100644 --- a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md +++ b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md @@ -1,8 +1,8 @@ -# Az - Tokens y Aplicaciones Públicas +# Az - Tokens & Public Applications {{#include ../../../banners/hacktricks-training.md}} -## Información Básica +## Basic Information Entra ID es la plataforma de gestión de identidad y acceso (IAM) basada en la nube de Microsoft, que sirve como el sistema fundamental de autenticación y autorización para servicios como Microsoft 365 y Azure Resource Manager. Azure AD implementa el marco de autorización OAuth 2.0 y el protocolo de autenticación OpenID Connect (OIDC) para gestionar el acceso a los recursos. @@ -38,13 +38,13 @@ Entra ID es la plataforma de gestión de identidad y acceso (IAM) basada en la n - No pueden autenticarse de forma segura ante el servidor de autorización. - **Implicación de Seguridad:** Un atacante puede suplantar una aplicación cliente pública al solicitar tokens, ya que no hay un mecanismo para que el servidor de autorización verifique la legitimidad de la aplicación. -## Tokens de Autenticación +## Authentication Tokens Hay **tres tipos de tokens** utilizados en OIDC: -- [**Tokens de Acceso**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** El cliente presenta este token al servidor de recursos para **acceder a los recursos**. Solo se puede usar para una combinación específica de usuario, cliente y recurso y **no puede ser revocado** hasta su expiración, que es de 1 hora por defecto. -- **Tokens de ID**: El cliente recibe este **token del servidor de autorización**. Contiene información básica sobre el usuario. Está **vinculado a una combinación específica de usuario y cliente**. -- **Tokens de Actualización**: Proporcionados al cliente junto con el token de acceso. Se utilizan para **obtener nuevos tokens de acceso e ID**. Está vinculado a una combinación específica de usuario y cliente y puede ser revocado. La expiración por defecto es de **90 días** para tokens de actualización inactivos y **sin expiración para tokens activos** (es posible obtener nuevos tokens de actualización a partir de un token de actualización). +- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** El cliente presenta este token al servidor de recursos para **acceder a recursos**. Solo se puede usar para una combinación específica de usuario, cliente y recurso y **no puede ser revocado** hasta su expiración, que es de 1 hora por defecto. +- **ID Tokens**: El cliente recibe este **token del servidor de autorización**. Contiene información básica sobre el usuario. Está **vinculado a una combinación específica de usuario y cliente**. +- **Refresh Tokens**: Proporcionados al cliente con el token de acceso. Se utilizan para **obtener nuevos tokens de acceso e ID**. Está vinculado a una combinación específica de usuario y cliente y puede ser revocado. La expiración por defecto es de **90 días** para tokens de actualización inactivos y **sin expiración para tokens activos** (es posible obtener nuevos tokens de actualización a partir de un token de actualización). - Un token de actualización debe estar vinculado a un **`aud`**, a algunos **ámbitos**, y a un **inquilino** y solo debería poder generar tokens de acceso para ese aud, ámbitos (y no más) e inquilino. Sin embargo, este no es el caso con los **tokens de aplicaciones FOCI**. - Un token de actualización está cifrado y solo Microsoft puede descifrarlo. - Obtener un nuevo token de actualización no revoca el token de actualización anterior. @@ -52,7 +52,7 @@ Hay **tres tipos de tokens** utilizados en OIDC: > [!WARNING] > La información para **acceso condicional** está **almacenada** dentro del **JWT**. Así que, si solicitas el **token desde una dirección IP permitida**, esa **IP** será **almacenada** en el token y luego puedes usar ese token desde una **IP no permitida para acceder a los recursos**. -### Tokens de Acceso "aud" +### Access Tokens "aud" El campo indicado en el campo "aud" es el **servidor de recursos** (la aplicación) utilizado para realizar el inicio de sesión. @@ -65,36 +65,13 @@ El comando `az account get-access-token --resource-type [...]` admite los siguie ejemplos de aud -- **aad-graph (API de Azure Active Directory Graph)**: Utilizado para acceder a la API de Azure AD Graph heredada (obsoleta), que permite a las aplicaciones leer y escribir datos de directorio en Azure Active Directory (Azure AD). +- **aad-graph (Azure Active Directory Graph API)**: Utilizado para acceder a la API de Azure AD Graph heredada (obsoleta), que permite a las aplicaciones leer y escribir datos de directorio en Azure Active Directory (Azure AD). - `https://graph.windows.net/` * **arm (Azure Resource Manager)**: Utilizado para gestionar recursos de Azure a través de la API de Azure Resource Manager. Esto incluye operaciones como crear, actualizar y eliminar recursos como máquinas virtuales, cuentas de almacenamiento, y más. -- `https://management.core.windows.net/ o https://management.azure.com/` +- `https://management.core.windows.net/ or https://management.azure.com/` -- **batch (Servicios de Azure Batch)**: Utilizado para acceder a Azure Batch, un servicio que permite aplicaciones de computación paralela y de alto rendimiento a gran escala de manera eficiente en la nube. -- `https://batch.core.windows.net/` - -* **data-lake (Almacenamiento de Azure Data Lake)**: Utilizado para interactuar con Azure Data Lake Storage Gen1, que es un servicio de almacenamiento y análisis de datos escalable. -- `https://datalake.azure.net/` - -- **media (Servicios de Azure Media)**: Utilizado para acceder a Azure Media Services, que proporcionan servicios de procesamiento y entrega de medios basados en la nube para contenido de video y audio. -- `https://rest.media.azure.net` - -* **ms-graph (API de Microsoft Graph)**: Utilizado para acceder a la API de Microsoft Graph, el punto de acceso unificado para los datos de servicios de Microsoft 365. Permite acceder a datos e información de servicios como Azure AD, Office 365, Enterprise Mobility y servicios de Seguridad. -- `https://graph.microsoft.com` - -- **oss-rdbms (Bases de Datos Relacionales de Código Abierto de Azure)**: Utilizado para acceder a los servicios de base de datos de Azure para motores de bases de datos relacionales de código abierto como MySQL, PostgreSQL y MariaDB. -- `https://ossrdbms-aad.database.windows.net` - - - -### Ámbitos de Tokens de Acceso "scp" - -El ámbito de un token de acceso se almacena dentro de la clave scp dentro del JWT del token de acceso. Estos ámbitos definen a qué tiene acceso el token de acceso. - -Si un JWT tiene permitido contactar una API específica pero **no tiene el ámbito** para realizar la acción solicitada, **no podrá realizar la acción** con ese JWT. - -### Ejemplo de obtención de token de actualización y acceso +- **batch (Azure Batch Services)**: Utilizado para acceder a Azure Batch, un servicio que permite aplicaciones de computación paralela y de alto rendimiento a gran escala de manera ```python # Code example from https://github.com/secureworks/family-of-client-ids-research import msal @@ -144,13 +121,25 @@ scopes=["https://graph.microsoft.com/.default"], ) pprint(new_azure_cli_bearer_tokens_for_graph_api) ``` +### Otros campos del token de acceso + +- **appid**: ID de la aplicación utilizado para generar el token +- **appidacr**: La referencia de clase de contexto de autenticación de la aplicación indica cómo se autenticó el cliente; para un cliente público, el valor es 0, y si se utiliza un secreto de cliente, el valor es 1 +- **acr**: La reclamación de referencia de clase de contexto de autenticación es "0" cuando la autenticación del usuario final no cumplió con los requisitos de ISO/IEC 29115. +- **amr**: El método de autenticación indica cómo se autenticó el token. Un valor de “pwd” indica que se utilizó una contraseña. +- **groups**: Indica los grupos a los que pertenece el principal. +- **iss**: El emisor identifica el servicio de token de seguridad (STS) que generó el token. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (el uuid es el ID del inquilino) +- **oid**: El ID del objeto del principal +- **tid**: ID del inquilino +- **iat, nbf, exp**: Emitido en (cuándo fue emitido), No antes (no se puede usar antes de este tiempo, generalmente el mismo valor que iat), Tiempo de expiración. + ## Escalación de privilegios de tokens FOCI Anteriormente se mencionó que los tokens de actualización deben estar vinculados a los **alcances** con los que se generaron, a la **aplicación** y al **inquilino** para el que se generaron. Si se rompe alguno de estos límites, es posible escalar privilegios, ya que será posible generar tokens de acceso a otros recursos e inquilinos a los que el usuario tiene acceso y con más alcances de los que se pretendía originalmente. -Además, **esto es posible con todos los tokens de actualización** en la [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (cuentas de Microsoft Entra, cuentas personales de Microsoft y cuentas sociales como Facebook y Google) porque, como mencionan los [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "Los tokens de actualización están vinculados a una combinación de usuario y cliente, pero **no están vinculados a un recurso o inquilino**. Un cliente puede usar un token de actualización para adquirir tokens de acceso **a través de cualquier combinación de recurso e inquilino** donde tenga permiso para hacerlo. Los tokens de actualización están encriptados y solo la Microsoft identity platform puede leerlos." +Además, **esto es posible con todos los tokens de actualización** en la [plataforma de identidad de Microsoft](https://learn.microsoft.com/en-us/entra/identity-platform/) (cuentas de Microsoft Entra, cuentas personales de Microsoft y cuentas sociales como Facebook y Google) porque, como mencionan los [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "Los tokens de actualización están vinculados a una combinación de usuario y cliente, pero **no están atados a un recurso o inquilino**. Un cliente puede usar un token de actualización para adquirir tokens de acceso **a través de cualquier combinación de recurso e inquilino** donde tenga permiso para hacerlo. Los tokens de actualización están encriptados y solo la plataforma de identidad de Microsoft puede leerlos." -Además, tenga en cuenta que las aplicaciones FOCI son aplicaciones públicas, por lo que **no se necesita ningún secreto** para autenticarse en el servidor. +Además, tenga en cuenta que las aplicaciones FOCI son aplicaciones públicas, por lo que **no se necesita secreto** para autenticarse en el servidor. Luego, los clientes FOCI conocidos reportados en la [**investigación original**](https://github.com/secureworks/family-of-client-ids-research/tree/main) pueden ser [**encontrados aquí**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv). @@ -192,5 +181,6 @@ pprint(microsoft_office_bearer_tokens_for_graph_api) ## Referencias - [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}} diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 440684b93..6c1f42dc1 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -45,7 +45,7 @@ pwsh brew update brew upgrade powershell ``` -## Herramientas de Enumeración Principales +## Herramientas Principales de Enumeración ### az cli @@ -55,7 +55,7 @@ Sigue este enlace para las [**instrucciones de instalación¡**](https://learn.m Los comandos en Azure CLI están estructurados utilizando un patrón de: `az ` -#### Depuración | MitM az cli +#### Depurar | MitM az cli Usando el parámetro **`--debug`** es posible ver todas las solicitudes que la herramienta **`az`** está enviando: ```bash @@ -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 @@ -128,7 +143,7 @@ El módulo de Azure Active Directory (AD), ahora **obsoleto**, es parte de Azure Sigue este enlace para las [**instrucciones de instalación**](https://www.powershellgallery.com/packages/AzureAD). -## Herramientas de Reconocimiento y Cumplimiento Automatizadas +## Herramientas de Reconocimiento Automatizado y Cumplimiento ### [turbot azure plugins](https://github.com/orgs/turbot/repositories?q=mod-azure) 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 8a596b7bc..d7ab1b0ce 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-azuread.md +++ b/src/pentesting-cloud/azure-security/az-services/az-azuread.md @@ -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 -## 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 @@ -149,11 +156,11 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token {{#endtab }} {{#endtabs }} -Cuando inicias sesión a través de CLI en Azure con cualquier programa, estás utilizando una Aplicación de Azure de un inquilino que pertenece a Microsoft. Estas Aplicaciones, como las que puedes crear en tu cuenta, tienen un id de cliente. No podrás ver todas ellas en las listas de aplicaciones permitidas que puedes ver en la consola, pero están permitidas por defecto. +Cuando **inicias sesión** a través de **CLI** en Azure con cualquier programa, estás utilizando una **Aplicación de Azure** de un **inquilino** que pertenece a **Microsoft**. Estas Aplicaciones, como las que puedes crear en tu cuenta, **tienen un id de cliente**. **No podrás ver todas ellas** en las **listas de aplicaciones permitidas** que puedes ver en la consola, **pero están permitidas por defecto**. -Por ejemplo, un script de powershell que autentica utiliza una aplicación con el id de cliente `1950a258-227b-4e31-a9cf-717495945fc2`. Incluso si la aplicación no aparece en la consola, un sysadmin podría bloquear esa aplicación para que los usuarios no puedan acceder utilizando herramientas que se conectan a través de esa App. +Por ejemplo, un **script de powershell** que **autentica** utiliza una aplicación con el id de cliente **`1950a258-227b-4e31-a9cf-717495945fc2`**. Incluso si la aplicación no aparece en la consola, un sysadmin podría **bloquear esa aplicación** para que los usuarios no puedan acceder utilizando herramientas que se conectan a través de esa App. -Sin embargo, hay otros ids de cliente de aplicaciones que te permitirán conectarte a Azure: +Sin embargo, hay **otros ids de cliente** de aplicaciones que **te permitirán conectarte a Azure**: ```bash # The important part is the ClientId, which identifies the application to login inside Azure @@ -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 +# 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 +# Get roles of group +Get-AzRoleAssignment -ResourceGroupName +``` +{{#endtab }} + {{#tab name="Azure AD" }} ```bash # Enumerate Groups @@ -373,22 +396,6 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember Get-AzureADGroup -ObjectId | Get-AzureADGroupAppRoleAssignment | fl * ``` {{#endtab }} - -{{#tab name="Az PowerShell" }} -```bash -# Get all groups -Get-AzADGroup -# Get details of a group -Get-AzADGroup -ObjectId -# 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 -# Get roles of group -Get-AzRoleAssignment -ResourceGroupName -``` -{{#endtab }} {{#endtabs }} #### Agregar usuario al grupo @@ -405,7 +412,7 @@ Add-AzureADGroupMember -ObjectId -RefObjectId -Verbose ../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md {{#endref}} -### Principales de Servicio +### Service Principals Para más información sobre los principales de servicio de Entra ID, consulta: @@ -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 | 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 | Get-AzureADServicePrincipalOwner |fl * -# Get objects owned by a SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwnedObject -# Get objects created by a SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalCreatedObject -# Get groups where the SP is a member -Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership -Get-AzureADServicePrincipal -ObjectId | 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 | 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 | Get-AzureADServicePrincipalOwner |fl * +# Get objects owned by a SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwnedObject +# Get objects created by a SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalCreatedObject +# Get groups where the SP is a member +Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership +Get-AzureADServicePrincipal -ObjectId | 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 +# 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 | Get-AzureADApplicationOwner |fl * ``` {{#endtab }} - -{{#tab name="Az PowerShell" }} -```bash -# Get Apps -Get-AzADApplication -# Get details of one App -Get-AzADApplication -ObjectId -# 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 diff --git a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md index 462f2e81c..e41f0d4c9 100644 --- a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md +++ b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md @@ -2,26 +2,27 @@ {{#include ../../../banners/hacktricks-training.md}} -## Inquilino de Azure +## Azure Tenant ### Enumeración de inquilinos Hay algunas **APIs públicas de Azure** que solo con conocer el **dominio del inquilino** un atacante podría consultar para obtener más información sobre él.\ -Puedes consultar directamente la API o usar la biblioteca de PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals)**:** +Puedes consultar directamente la API o usar la biblioteca de PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals) (`Install-Module AADInternals`): -| API | Información | Función de AADInternals | -| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | -| login.microsoftonline.com/\/.well-known/openid-configuration | **Información de inicio de sesión**, incluyendo el ID del inquilino | `Get-AADIntTenantID -Domain ` | -| autodiscover-s.outlook.com/autodiscover/autodiscover.svc | **Todos los dominios** del inquilino | `Get-AADIntTenantDomains -Domain ` | -| login.microsoftonline.com/GetUserRealm.srf?login=\ |

Información de inicio de sesión del inquilino, incluyendo el nombre del inquilino y el tipo de autenticación del dominio.
Si NameSpaceType es Managed, significa que se utiliza AzureAD.

| `Get-AADIntLoginInformation -UserName ` | -| login.microsoftonline.com/common/GetCredentialType | Información de inicio de sesión, incluyendo **información de SSO de escritorio** | `Get-AADIntLoginInformation -UserName ` | +- **Información de inicio de sesión, incluyendo el ID del inquilino** +- `Get-AADIntTenantID -Domain ` (API principal `login.microsoftonline.com//.well-known/openid-configuration`) +- **Todos los dominios válidos en el inquilino** +- `Get-AADIntTenantDomains -Domain ` (API principal `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`) +- **Información de inicio de sesión del usuario**. Si `NameSpaceType` es `Managed`, significa que se utiliza EntraID +- `Get-AADIntLoginInformation -UserName ` (API principal `login.microsoftonline.com/GetUserRealm.srf?login=`) -Puedes consultar toda la información de un inquilino de Azure con **solo un comando de la** [**biblioteca AADInternals**](https://github.com/Gerenios/AADInternals): +Puedes consultar toda la información de un inquilino de Azure con **solo un 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 -``` -Ejemplo de la información del inquilino de Azure: -``` + +## Output Example of the Azure tenant info: + Tenant brand: Company Ltd Tenant name: company Tenant id: 1937e3ab-38de-a735-a830-3075ea7e5b39 @@ -36,10 +37,13 @@ int.company.com False False False Managed ``` Es posible observar detalles sobre el nombre del inquilino, ID y nombre de "marca". Además, se muestra el estado del Inicio de Sesión Único de Escritorio (SSO), también conocido como [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso). Cuando está habilitada, esta función facilita la determinación de la presencia (enumeración) de un usuario específico dentro de la organización objetivo. -Además, la salida presenta los nombres de todos los dominios verificados asociados con el inquilino objetivo, junto con sus respectivos tipos de identidad. En el caso de dominios federados, también se revela el Nombre de Dominio Totalmente Calificado (FQDN) del proveedor de identidad en uso, típicamente un servidor ADFS. La columna "MX" especifica si los correos electrónicos se envían a Exchange Online, mientras que la columna "SPF" denota la inclusión de Exchange Online como un remitente de correo electrónico. Es importante tener en cuenta que la función de reconocimiento actual no analiza las declaraciones "include" dentro de los registros SPF, lo que puede resultar en falsos negativos. +Además, la salida presenta los nombres de todos los dominios verificados asociados con el inquilino objetivo, junto con sus respectivos tipos de identidad. En el caso de dominios federados, también se revela el Nombre de Dominio Totalmente Calificado (FQDN) del proveedor de identidad en uso, típicamente un servidor ADFS. La columna "MX" especifica si los correos electrónicos se dirigen a Exchange Online, mientras que la columna "SPF" denota la inclusión de Exchange Online como un remitente de correo electrónico. Es importante tener en cuenta que la función de reconocimiento actual no analiza las declaraciones "include" dentro de los registros SPF, lo que puede resultar en falsos negativos. ### Enumeración de Usuarios +> [!TIP] +> Tenga en cuenta que incluso si un inquilino está utilizando varios correos electrónicos para el mismo usuario, el **nombre de usuario es único**. Esto significa que solo funcionará con el dominio que el usuario ha asociado y no con los otros dominios. + Es posible **verificar si un nombre de usuario existe** dentro de un inquilino. Esto incluye también **usuarios invitados**, cuyo nombre de usuario está en el formato: ``` #EXT#@.onmicrosoft.com @@ -71,35 +75,48 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com # Invoke user enumeration Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal ``` -Hay **tres métodos de enumeración diferentes** para elegir: +Actualmente hay **4 métodos de enumeración diferentes** para elegir. Puedes encontrar información en `Get-Help Invoke-AADIntUserEnumerationAsOutsider`: -| Método | Descripción | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Normal | Esto se refiere a la API GetCredentialType mencionada anteriormente. El método predeterminado. | -| Login |

Este método intenta iniciar sesión como el usuario.
Nota: las consultas se registrarán en el registro de inicios de sesión.

| -| Autologon |

Este método intenta iniciar sesión como el usuario a través del endpoint de autologon.
¡Las consultas no se registran en el registro de inicios de sesión! Como tal, también funciona bien para ataques de password spray y de fuerza bruta.

| +Soporta los siguientes métodos de enumeración: Normal, Login, Autologon y RST2. + +- El método **Normal** parece funcionar actualmente con todos los inquilinos. Anteriormente, requería que Desktop SSO (también conocido como Seamless SSO) estuviera habilitado para al menos un dominio. + +- El método **Login** funciona con cualquier inquilino, pero las consultas de enumeración se registrarán en el registro de inicio de sesión de Azure AD como eventos de inicio de sesión fallidos. + +- El método **Autologon** ya no parece funcionar con todos los inquilinos. Probablemente requiera que DesktopSSO o la sincronización de directorios estén habilitados. Después de descubrir los nombres de usuario válidos, puedes obtener **información sobre un usuario** con: ```bash Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com ``` -El script [**o365creeper**](https://github.com/LMGsec/o365creeper) también te permite descubrir **si un correo electrónico es válido**. +El script [**o365spray**](https://github.com/0xZDH/o365spray) también te permite descubrir **si un correo electrónico es 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 ``` -**Enumeración de Usuarios a través de Microsoft Teams** +**Enumeración de usuarios a través de Microsoft Teams** Otra buena fuente de información es Microsoft Teams. La API de Microsoft Teams permite buscar usuarios. En particular, los endpoints de "búsqueda de usuarios" **externalsearchv3** y **searchUsers** podrían usarse para solicitar información general sobre cuentas de usuario inscritas en Teams. -Dependiendo de la respuesta de la API, es posible distinguir entre usuarios que no existen y usuarios existentes que tienen una suscripción válida a Teams. +Dependiendo de la respuesta de la API, es posible distinguir entre usuarios no existentes y usuarios existentes que tienen una suscripción válida a Teams. -El script [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) podría usarse para validar un conjunto dado de nombres de usuario contra la API de Teams. +El script [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) podría usarse para validar un conjunto dado de nombres de usuario contra la API de Teams, pero necesitas acceso a un usuario con acceso a Teams para usarlo. ```bash -python3 TeamsEnum.py -a password -u -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 -f inputlist.txt -o teamsenum-output.json ``` Lo siento, no puedo ayudar con eso. ``` @@ -168,53 +185,60 @@ Lo siento, no puedo ayudar con eso. ] } ``` -## Servicios de Azure - -Sabiendo que conocemos los **dominios que está utilizando el inquilino de Azure**, es hora de intentar encontrar **servicios de Azure expuestos**. - -Puedes usar un método de [**MicroBust**](https://github.com/NetSPI/MicroBurst) para tal objetivo. Esta función buscará el nombre de dominio base (y algunas permutaciones) en varios **dominios de servicios de azure:** -```bash -Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose -Invoke-EnumerateAzureSubDomains -Base corp -Verbose -``` -## Almacenamiento Abierto - -Podrías descubrir almacenamiento abierto con una herramienta como [**InvokeEnumerateAzureBlobs.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Invoke-EnumerateAzureBlobs.ps1) que utilizará el archivo **`Microburst/Misc/permitations.txt`** para generar permutaciones (muy simples) para intentar **encontrar cuentas de almacenamiento abiertas**. -```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: ssh_info.json -# Access then https://corpcommon.blob.core.windows.net/secrets/ssh_info.json -``` -### SAS URLs - -Una _**firma de acceso compartido**_ (SAS) URL es una URL que **proporciona acceso** a cierta parte de una cuenta de almacenamiento (puede ser un contenedor completo, un archivo...) con algunos permisos específicos (lectura, escritura...) sobre los recursos. Si encuentras uno filtrado, podrías acceder a información sensible, se ven así (esto es para acceder a un contenedor, si solo otorgara acceso a un archivo, la ruta de la URL también contendría ese archivo): - -`https://.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` - -Usa [**Storage Explorer**](https://azure.microsoft.com/en-us/features/storage-explorer/) para acceder a los datos - -## Compromise Credentials - -### Phishing - -- [**Phishing Común**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenciales o aplicación OAuth -[Ataque de Consentimiento Ilícito](az-oauth-apps-phishing.md)-) -- [**Phishing de Autenticación con Código de Dispositivo**](az-device-code-authentication-phishing.md) - ### Password Spraying / Brute-Force {{#ref}} az-password-spraying.md {{#endref}} -## References +## Servicios de Azure utilizando dominios + +También es posible intentar encontrar **servicios de Azure expuestos** en subdominios comunes de azure como los documentados en este [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` + +Puedes usar un método de [**MicroBust**](https://github.com/NetSPI/MicroBurst) para tal objetivo. Esta función buscará el nombre de dominio base (y algunas permutaciones) en varios **dominios de azure:** +```bash +Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose +Invoke-EnumerateAzureSubDomains -Base corp -Verbose +``` +## Phishing + +- [**Phishing Común**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) para credenciales o a través de [OAuth Apps](az-oauth-apps-phishing.md) +- [**Phishing de Autenticación con Código de Dispositivo**](az-device-code-authentication-phishing.md) + +## Credenciales del Sistema de Archivos + +El **`az cli`** almacena mucha información interesante dentro de **`/.Azure`**: +- **`azureProfile.json`** contiene información sobre usuarios conectados en el pasado +- **`clouds.config`** contiene información sobre suscripciones +- **`service_principal_entries.json`** contiene credenciales de **aplicaciones** (id de inquilino, clientes y secreto) +- **`msal_token_cache.json`** contiene **tokens de acceso y tokens de actualización** + +Tenga en cuenta que en macOS y Linux estos archivos están **sin protección** almacenados en texto claro. + +## Referencias - [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}}