mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-30 14:40:37 -08:00
Translated ['src/pentesting-cloud/azure-security/README.md', 'src/pentes
This commit is contained in:
@@ -10,7 +10,7 @@ Aprende los conceptos básicos de Azure y Entra ID en la siguiente página:
|
||||
az-basic-information/
|
||||
{{#endref}}
|
||||
|
||||
## Metodología de Pentesting/Red Team en Azure
|
||||
## Metodología de Pentesting/Red Team de Azure
|
||||
|
||||
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**.
|
||||
|
||||
@@ -45,7 +45,7 @@ Con esta información, las formas más comunes de intentar obtener un punto de a
|
||||
- **`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
|
||||
- **`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)
|
||||
@@ -81,7 +81,7 @@ 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 generalmente son menos limitadas y su inicio de sesión es menos revisado
|
||||
- También puedes intentar **comprometer credenciales de Service Principal** ya que suelen ser 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.
|
||||
|
||||
@@ -144,7 +144,7 @@ Get-AzureADTenantDetail
|
||||
### Enumeración de Entra ID y Privesc
|
||||
|
||||
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:
|
||||
Puedes encontrar aquí una guía:
|
||||
|
||||
{{#ref}}
|
||||
az-services/az-azuread.md
|
||||
@@ -165,27 +165,44 @@ Deberías comenzar a averiguar los **permisos que tienes** sobre los recursos. P
|
||||
|
||||
1. **Encuentra el recurso al que tienes acceso**:
|
||||
|
||||
El comando de Az PowerShell **`Get-AzResource`** te permite **conocer los recursos que tu usuario actual tiene visibilidad**.
|
||||
|
||||
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/<subscription-id>/resources?api-version=2021-04-01"`
|
||||
El comando de Az PowerShell **`Get-AzResource`** te permite **saber los recursos sobre los que tu usuario actual tiene visibilidad**.
|
||||
|
||||
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:
|
||||
```bash
|
||||
az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resources?api-version=2021-04-01"
|
||||
```
|
||||
2. **Encuentra los permisos que tienes sobre los recursos a los que tienes acceso y encuentra los roles asignados a ti**:
|
||||
|
||||
Ten en cuenta que necesitas el permiso **`Microsoft.Authorization/roleAssignments/read`** para ejecutar esta acción.
|
||||
|
||||
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`**.
|
||||
|
||||
También es posible obtener esta información ejecutando **`az rest --method GET --uri "https://management.azure.com/<Scope>/providers/Microsoft.Authorization/roleAssignments?api-version=2020-08-01-preview" | jq ".value"`** como en:
|
||||
|
||||
- **`az rest --method GET --uri "https://management.azure.com//subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.KeyVault/vaults/vault-m3ww8ut4/providers/Microsoft.Authorization/roleAssignments?api-version=2020-08-01-preview" | jq ".value"`**
|
||||
|
||||
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 así:
|
||||
```bash
|
||||
Get-AzRoleAssignment -Scope /subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.RecoveryServices/vaults/vault-m3ww8ut4
|
||||
```
|
||||
También es posible obtener esta información ejecutando:
|
||||
```bash
|
||||
az rest --method GET --uri "https://management.azure.com/<Scope>/providers/Microsoft.Authorization/roleAssignments?api-version=2020-08-01-preview" | jq ".value"
|
||||
```
|
||||
como en:
|
||||
```bash
|
||||
az rest --method GET --uri "https://management.azure.com//subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.KeyVault/vaults/vault-m3ww8ut4/providers/Microsoft.Authorization/roleAssignments?api-version=2020-08-01-preview" | jq ".value"
|
||||
```
|
||||
Otra opción es obtener los roles asignados a ti en azure con:
|
||||
```bash
|
||||
az role assignment list --assignee "<email>" --all --output table
|
||||
```
|
||||
O ejecutando lo siguiente (Si los resultados están vacíos, puede ser porque no tienes permiso para obtenerlos):
|
||||
```bash
|
||||
az rest --method GET --uri 'https://management.azure.com/subscriptions/<subscription-id>/providers/Microsoft.Authorization/roleAssignments?api-version=2022-04-01&$filter=principalId eq '<user-id>'
|
||||
```
|
||||
3. **Encuentra los permisos granulares de los roles asignados a ti**:
|
||||
|
||||
Luego, para obtener el permiso granular podrías ejecutar **`(Get-AzRoleDefinition -Id "<RoleDefinitionId>").Actions`**.
|
||||
|
||||
O llamar a la API directamente con **`az rest --method GET --uri "https://management.azure.com//subscriptions/<subscription-id>/providers/Microsoft.Authorization/roleDefinitions/<RoleDefinitionId>?api-version=2020-08-01-preview" | jq ".properties"`**.
|
||||
|
||||
Luego, para obtener el permiso granular, podrías ejecutar **`(Get-AzRoleDefinition -Id "<RoleDefinitionId>").Actions`**.
|
||||
|
||||
O llama a la API directamente con
|
||||
```bash
|
||||
az rest --method GET --uri "https://management.azure.com//subscriptions/<subscription-id>/providers/Microsoft.Authorization/roleDefinitions/<RoleDefinitionId>?api-version=2020-08-01-preview" | jq ".properties"
|
||||
```
|
||||
En la siguiente sección puedes encontrar **información sobre los servicios de Azure más comunes y cómo enumerarlos**:
|
||||
|
||||
{{#ref}}
|
||||
|
||||
@@ -10,11 +10,19 @@ Las políticas de acceso condicional **definen** **Quién** puede acceder a **Qu
|
||||
Aquí hay un par de ejemplos:
|
||||
|
||||
1. **Política de Riesgo de Inicio de Sesión**: Esta política podría configurarse para requerir autenticación multifactor (MFA) cuando se detecta un riesgo de inicio de sesión. Por ejemplo, si el comportamiento de inicio de sesión de un usuario es inusual en comparación con su patrón regular, como iniciar sesión desde un país diferente, el sistema puede solicitar autenticación adicional.
|
||||
2. **Política de Cumplimiento de Dispositivos**: Esta política puede restringir el acceso a los servicios de Azure solo a dispositivos que cumplan con los estándares de seguridad de la organización. Por ejemplo, el acceso podría permitirse solo desde dispositivos que tengan software antivirus actualizado o que estén ejecutando una versión específica del sistema operativo.
|
||||
2. **Política de Cumplimiento de Dispositivos**: Esta política puede restringir el acceso a los servicios de Azure solo a dispositivos que cumplan con los estándares de seguridad de la organización. Por ejemplo, el acceso podría permitirse solo desde dispositivos que tengan software antivirus actualizado o que estén ejecutando una cierta versión del sistema operativo.
|
||||
|
||||
## Bypasses de Políticas de Acceso Condicional
|
||||
## Enumeración
|
||||
```bash
|
||||
# Get all the policies from Azure without needing any special permission with (idea from https://github.com/LuemmelSec/APEX/blob/main/APEX.ps1)
|
||||
az rest --method GET --uri 'https://graph.windows.net/<tenant-id>/policies?api-version=1.61-internal' | jq '.value[] | select(.policyType == 18) | {displayName, policyDetail: (.policyDetail[] | fromjson)}'
|
||||
|
||||
Es posible que una política de acceso condicional esté **verificando alguna información que puede ser fácilmente manipulada, permitiendo un bypass de la política**. Y si, por ejemplo, la política estaba configurando MFA, el atacante podrá eludirla.
|
||||
# You need Policy.Read.ConditionalAccess or Policy.Read.All permission in Entra ID
|
||||
az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditionalAccess/policies"
|
||||
```
|
||||
## Bypass de Políticas de Acceso Condicional
|
||||
|
||||
Es posible que una política de acceso condicional esté **verificando información que puede ser fácilmente manipulada, permitiendo un bypass de la política**. Y si, por ejemplo, la política estaba configurando MFA, el atacante podrá eludirla.
|
||||
|
||||
Al configurar una política de acceso condicional, es necesario indicar los **usuarios** afectados y los **recursos objetivo** (como todas las aplicaciones en la nube).
|
||||
|
||||
@@ -33,20 +41,20 @@ También es necesario configurar las **condiciones** que **activarán** la polí
|
||||
|
||||
Los posibles **resultados** son: Bloquear o Conceder acceso con condiciones potenciales como requerir MFA, que el dispositivo sea conforme…
|
||||
|
||||
### Plataformas de Dispositivos - Condición del Dispositivo
|
||||
### Plataformas de Dispositivos - Condición de Dispositivo
|
||||
|
||||
Es posible establecer una condición basada en la **plataforma del dispositivo** (Android, iOS, Windows, macOS...), sin embargo, esto se basa en el **user-agent** por lo que es fácil de eludir. Incluso **haciendo que todas las opciones exijan MFA**, si usas un **user-agent que no es reconocido,** podrás eludir el MFA o el bloqueo:
|
||||
|
||||
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Simplemente haciendo que el navegador **envíe un user-agent desconocido** (como `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`) es suficiente para no activar esta condición.\
|
||||
Puedes cambiar el user agent **manualmente** en las herramientas de desarrollo:
|
||||
Puedes cambiar el user-agent **manualmente** en las herramientas de desarrollo:
|
||||
|
||||
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
O usar una [extensión de navegador como esta](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
|
||||
|
||||
### Ubicaciones: Países, rangos de IP - Condición del Dispositivo
|
||||
### Ubicaciones: Países, rangos de IP - Condición de Dispositivo
|
||||
|
||||
Si esto está configurado en la política condicional, un atacante podría simplemente usar una **VPN** en el **país permitido** o intentar encontrar una manera de acceder desde una **dirección IP permitida** para eludir estas condiciones.
|
||||
|
||||
@@ -56,10 +64,10 @@ Es posible configurar **políticas de acceso condicional para bloquear o forzar*
|
||||
|
||||
<figure><img src="../../../../images/image (353).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Para intentar eludir esta protección, deberías ver si puedes **iniciar sesión solo en cualquier aplicación**.\
|
||||
La herramienta [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) tiene **decenas de IDs de aplicación codificados** y intentará iniciar sesión en ellas y te informará e incluso te dará el token si tiene éxito.
|
||||
Para intentar eludir esta protección, deberías ver si puedes **iniciar sesión en cualquier aplicación**.\
|
||||
La herramienta [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) tiene **decenas de IDs de aplicación codificados** y tratará de iniciar sesión en ellas y te informará e incluso te dará el token si tiene éxito.
|
||||
|
||||
Con el fin de **probar IDs de aplicación específicos en recursos específicos**, también podrías usar una herramienta como:
|
||||
Para **probar IDs de aplicación específicos en recursos específicos**, también podrías usar una herramienta como:
|
||||
```bash
|
||||
roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4-4aaf-ab1b-5451cc387264 --tokens-stdout
|
||||
|
||||
@@ -69,9 +77,9 @@ Además, también es posible proteger el método de inicio de sesión (por ejemp
|
||||
|
||||
La herramienta [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) también podría usarse para propósitos similares, aunque parece no estar mantenida.
|
||||
|
||||
La herramienta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) también se puede utilizar para probar estas protecciones y ver si es posible eludir los MFA o bloqueos, pero esta herramienta funciona desde una perspectiva **whitebox**. Primero necesitas descargar la lista de aplicaciones permitidas en el inquilino y luego intentará iniciar sesión en ellas.
|
||||
La herramienta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) también se puede usar para probar estas protecciones y ver si es posible eludir los MFA o bloqueos, pero esta herramienta funciona desde una perspectiva **whitebox**. Primero necesitas descargar la lista de aplicaciones permitidas en el inquilino y luego intentará iniciar sesión en ellas.
|
||||
|
||||
## Otras elusiones de MFA de Az
|
||||
## Otras elusiones de Az MFA
|
||||
|
||||
### Tono de llamada
|
||||
|
||||
@@ -148,7 +156,7 @@ $password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force
|
||||
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
|
||||
Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
|
||||
```
|
||||
Debido a que el **portal** de **Azure** **no está restringido**, es posible **recopilar un token del punto final del portal para acceder a cualquier servicio detectado** por la ejecución anterior. En este caso, se identificó Sharepoint, y se solicita un token para acceder a él:
|
||||
Debido a que el **portal** de **Azure** **no está restringido**, es posible **obtener un token del endpoint del portal para acceder a cualquier servicio detectado** por la ejecución anterior. En este caso, se identificó Sharepoint, y se solicita un token para acceder a él:
|
||||
```bash
|
||||
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
|
||||
Read-JWTtoken -token $token.access_token
|
||||
|
||||
Reference in New Issue
Block a user