Translated ['', 'src/pentesting-cloud/azure-security/az-unauthenticated-

This commit is contained in:
Translator
2026-06-16 13:29:29 +00:00
parent f154b8360e
commit 3933ce4643
@@ -1,22 +1,22 @@
# Az - Enumeración no autenticada & Entrada inicial
# Az - Unauthenticated Enum & Initial Entry
{{#include ../../../banners/hacktricks-training.md}}
## Tenant de Azure
## Azure Tenant
### Enumeración del tenant
### Tenant Enumeration
Existen algunas **APIs públicas de Azure** que, con solo conocer el **dominio del tenant**, un atacante podría consultar para recopilar más información al respecto.\
Hay algunas **public Azure APIs** que, con solo conocer el **domain del tenant**, un atacante podría consultarlas para obtener más información sobre él.\
Puedes consultar directamente la API o usar la librería de PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals) (`Install-Module AADInternals`):
- **Información de inicio de sesión incluyendo tenant ID**
- `Get-AADIntTenantID -Domain <domain>` (API principal `login.microsoftonline.com/<domain>/.well-known/openid-configuration`)
- **Todos los dominios válidos en el tenant**
- `Get-AADIntTenantDomains -Domain <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 usa EntraID
- `Get-AADIntLoginInformation -UserName <UserName>` (API principal `login.microsoftonline.com/GetUserRealm.srf?login=<UserName>`)
- **Login information including tenant ID**
- `Get-AADIntTenantID -Domain <domain>` (main API `login.microsoftonline.com/<domain>/.well-known/openid-configuration`)
- **All valid doimains in the tenant**
- `Get-AADIntTenantDomains -Domain <domain>` (main API `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`)
- **Login information of the user**. If `NameSpaceType` is `Managed`, it means EntraID is used
- `Get-AADIntLoginInformation -UserName <UserName>` (main API `login.microsoftonline.com/GetUserRealm.srf?login=<UserName>`)
Puedes consultar toda la información de un tenant de Azure con **solo un comando de** [**AADInternals**](https://github.com/Gerenios/AADInternals):
Puedes consultar toda la información de un Azure tenant 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
@@ -35,34 +35,55 @@ company.mail.onmicrosoft.com True True True Managed
company.onmicrosoft.com True True True Managed
int.company.com False False False Managed
```
Es posible observar detalles sobre el nombre del tenant, su ID y el nombre de "brand". Además, se muestra el estado del Desktop Single Sign-On (SSO), también conocido como [**Seamless SSO**](https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso). Cuando está habilitado, esta función facilita la determinación de la presencia (enumeración) de un usuario específico dentro de la organización objetivo.
Es posible observar detalles sobre el nombre, ID y nombre de "brand" del tenant. Además, se muestra el estado del Desktop Single Sign-On (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 (enumeration) 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 tenant objetivo, junto con sus respectivos tipos de identidad. En el caso de dominios federados, también se revela el Fully Qualified Domain Name (FQDN) del proveedor de identidad en uso, normalmente un servidor ADFS. La columna "MX" especifica si los correos se enrutan a Exchange Online, mientras que la columna "SPF" indica si Exchange Online está listado como emisor de correo. Es importante notar 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 tenant objetivo, junto con sus respectivos tipos de identidad. En el caso de dominios federados, también se divulga el Fully Qualified Domain Name (FQDN) del identity provider en uso, normalmente un servidor ADFS. La columna "MX" especifica si los emails se enrutan a Exchange Online, mientras que la columna "SPF" indica la inclusión de Exchange Online como remitente de email. Es importante tener en cuenta que la función actual de reconnaissance no analiza las declaraciones "include" dentro de los registros SPF, lo que puede provocar falsos negativos.
### Enumeración de usuarios
### User Enumeration
> [!TIP]
> Ten en cuenta que incluso si un tenant utiliza varios correos para el mismo usuario, el **nombre de usuario es único**. Esto significa que solo funcionará con el dominio que el usuario haya asociado y no con los otros dominios.
> Ten en cuenta que, aunque un tenant use varios emails para el mismo usuario, el **username es único**. Esto significa que solo funcionará con el dominio que el usuario tenga asociado y no con los otros dominios.
Es posible **comprobar si un nombre de usuario existe** dentro de un tenant. Esto incluye también a **usuarios invitados (guest users)**, cuyo nombre de usuario tiene el formato:
Es posible **comprobar si un username existe** dentro de un tenant. Esto también incluye a los **guest users**, cuyo username tiene el formato:
```
<email>#EXT#@<tenant name>.onmicrosoft.com
```
El email es la dirección de correo del usuario donde la arroba “@” se reemplaza por guion bajo “\_.
El email es la dirección de correo del usuario, donde “@” se reemplaza por un guion bajo “\_.
Con [**AADInternals**](https://github.com/Gerenios/AADInternals), puedes verificar fácilmente si el usuario existe o no:
Con [**AADInternals**](https://github.com/Gerenios/AADInternals), puedes comprobar fácilmente si el usuario existe o no:
```bash
# Check does the user exist
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"
```
Por favor pega el contenido del archivo README.md que quieres que traduzca al español.
Me encargaré de traducir solo el texto en inglés relevante y mantendré exactamente la misma sintaxis Markdown/HTML, sin traducir código, nombres de técnicas, palabras comunes de hacking, nombres de plataformas cloud/SaaS, rutas o tags que indicaste.
# Azure Unauthenticated Enum and Initial Entry
Esta parte cubre técnicas para enum de Azure sin autenticación e initial entry.
## Unauthenticated Enum
Azure ofrece varios servicios y endpoints que pueden revelar información útil sin necesidad de credenciales, como configuraciones expuestas, metadata y detalles de recursos públicos.
Algunas técnicas comunes incluyen:
- Enumerar storage accounts públicos
- Revisar endpoints de metadata
- Buscar contenedores y blobs expuestos
- Identificar tenants, subscriptions y recursos accesibles públicamente
## Initial Entry
Una vez que se obtiene información suficiente, es posible usarla para encontrar puntos de entrada iniciales, como credenciales filtradas, misconfigurations o recursos expuestos que permitan acceso no autorizado.
## Consideraciones
- Revisa siempre la exposición pública de servicios antes de asumir que están protegidos
- Valida si los endpoints responden sin autenticación
- Busca data sensible en metadata, storage y otros servicios cloud expuestos
```
UserName Exists
-------- ------
user@company.com True
```
También puedes usar un archivo de texto que contenga una dirección de correo electrónico por línea:
También puedes usar un archivo de texto que contenga una dirección de correo por fila:
```
user@company.com
user2@company.com
@@ -76,22 +97,22 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com
# Invoke user enumeration
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal
```
Actualmente hay **4 diferentes métodos de enumeración** para elegir. Puedes encontrar información en `Get-Help Invoke-AADIntUserEnumerationAsOutsider`:
Actualmente hay **4 métodos de enumeración diferentes** para elegir. Puedes encontrar información en `Get-Help Invoke-AADIntUserEnumerationAsOutsider`:
Soporta los siguientes métodos de enumeración: Normal, Login, Autologon, and RST2.
Soporta los siguientes métodos de enumeración: Normal, Login, Autologon y RST2.
- El método **Normal** parece actualmente funcionar con todos los tenants. Anteriormente requería Desktop SSO (aka Seamless SSO) que estuviera habilitado para al menos un dominio.
- El método **Normal** parece funcionar actualmente con todos los tenants. Antes requería que Desktop SSO (también llamado Seamless SSO) estuviera habilitado para al menos un domain.
- El método **Login** funciona con cualquier tenant, pero las consultas de enumeración se registrarán en Azure AD sign-in log como eventos de inicio de sesión fallidos!
- El método **Login** funciona con cualquier tenant, pero las consultas de enumeración se registrarán en Azure AD sign-in log como eventos de inicio de sesión fallidos.
- El método **Autologon** parece ya no funcionar con todos los tenants. Probablemente requiere que DesktopSSO o directory sync estén habilitados.
- El método **Autologon** ya no parece funcionar con todos los tenants. Probablemente requiere que DesktopSSO o directory sync esté habilitado.
Tras descubrir los nombres de usuario válidos puedes obtener **información sobre un usuario** con:
Después de descubrir los usernames válidos, puedes obtener **info about a user** con:
```bash
Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com
```
El script [**o365spray**](https://github.com/0xZDH/o365spray) también te permite descubrir **si un correo electrónico es válido**.
El script [**o365spray**](https://github.com/0xZDH/o365spray) también permite descubrir **si un email es válido**.
```bash
git clone https://github.com/0xZDH/o365spray
cd o365spray
@@ -102,15 +123,15 @@ 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**
**User Enumeration via Microsoft Teams**
Otra buena fuente de información es Microsoft Teams.
La API de Microsoft Teams permite buscar usuarios. En particular, los endpoints de "user search" **externalsearchv3** y **searchUsers** pueden utilizarse para solicitar información general sobre cuentas de usuario registradas en Teams.
La API de Microsoft Teams permite buscar usuarios. En particular, los endpoints de "user search" **externalsearchv3** y **searchUsers** podrían usarse para solicitar información general sobre cuentas de usuario registradas en Teams.
Dependiendo de la respuesta de la API, es posible distinguir entre usuarios inexistentes y usuarios existentes que tienen una suscripción válida a Teams.
Dependiendo de la respuesta de la API, es posible distinguir entre usuarios inexistentes y usuarios existentes que tienen una suscripción válida de Teams.
El script [**TeamsEnum**](https://github.com/lucidra-security/TeamsEnum) puede usarse para validar un conjunto de nombres de usuario contra la API de Teams, pero necesitas acceso a un usuario con acceso a Teams para usarlo.
El script [**TeamsEnum**](https://github.com/lucidra-security/TeamsEnum) podría usarse para validar un conjunto dado de usernames contra la API de Teams, pero necesitas acceso a un usuario con acceso a Teams para usarlo.
```bash
# Install
git clone https://github.com/lucidra-security/TeamsEnum
@@ -120,7 +141,11 @@ 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
```
Necesito el contenido del archivo src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md para poder traducirlo. Pégalo aquí, por favor.
## Enumeración no autenticada e initial entry en Azure
> Este post trata sobre técnicas de enumeración no autenticada de Azure y cómo obtener acceso inicial.
¿Quieres que traduzca el contenido completo del archivo si me lo pegas aquí?
```
[-] user1@domain - Target user not found. Either the user does not exist, is not Teams-enrolled or is configured to not appear in search results (personal accounts only)
[+] user2@domain - User2 | Company (Away, Mobile)
@@ -134,11 +159,11 @@ Además, es posible enumerar información de disponibilidad sobre usuarios exist
- Busy
- Offline
Si se configura un **mensaje de ausencia**, también es posible recuperar el mensaje usando TeamsEnum. Si se especificó un archivo de salida, los mensajes de ausencia se almacenan automáticamente en el archivo JSON:
Si se ha configurado un **out-of-office message**, también es posible recuperar el mensaje usando TeamsEnum. Si se especificó un archivo de salida, los mensajes out-of-office se almacenan automáticamente dentro del archivo JSON:
```
jq . teamsenum-output.json
```
No has proporcionado el contenido del archivo. Por favor pega el contenido de src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md que quieres que traduzca al español.
<translation pending: no source content provided>
```json
{
"email": "user2@domain",
@@ -193,9 +218,9 @@ No has proporcionado el contenido del archivo. Por favor pega el contenido de sr
az-password-spraying.md
{{#endref}}
## Azure Services usando dominios
## Azure Services using domains
También es posible intentar encontrar **Azure services exposed** en subdominios comunes de azure como los documentados en esta [publicación:
También es posible intentar encontrar **Azure services exposed** 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`
@@ -217,32 +242,69 @@ También es posible intentar encontrar **Azure services exposed** en subdominios
- Search Appliance: `search.windows.net`
- API Services: `azure-api.net`
Puedes usar un método de [**MicroBust**](https://github.com/NetSPI/MicroBurst) para ese objetivo. Esta función buscará el nombre de dominio base (y algunas permutaciones) en varios **azure domains:**
Puedes usar un método de [**MicroBust**](https://github.com/NetSPI/MicroBurst) para ese objetivo. Esta función buscará el nombre del dominio base (y algunas permutaciones) en varios **azure domains:**
```bash
Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
Invoke-EnumerateAzureSubDomains -Base corp -Verbose
```
## Phishing
- [**Common Phishing**](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)
- [**Common Phishing**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) para credentials o vía [OAuth Apps](az-oauth-apps-phishing.md)
- [**Device Code Authentication** Phishing](az-device-code-authentication-phishing.md)
### Exchange Online direct-to-tenant SMTP spoofing
Si un target usa **Exchange Online / EOP** pero su **MX** público apunta a un **third-party mail gateway** (Mimecast, Proofpoint, Mailgun, filtering on-prem, etc.), prueba si Exchange Online todavía acepta correo enviado **directamente** al host del tenant `*.mail.protection.outlook.com`. En ese caso, un attacker puede **skip** el external gateway y enviar phishing mail directamente a EOP.
Esto es útil para **initial access / phishing** porque la entrega puede seguir ocurriendo incluso cuando el sender spoofed falla **SPF**, **DKIM** y **DMARC**. Para internal senders, Outlook también puede resolver el sender spoofed como un empleado real, aumentando la confianza.
**Recon / triage:**
```bash
# If the MX already points to Microsoft, this specific path is usually not the issue
dig +short MX target.com
# Typical vulnerable pattern: the MX points to a third-party filter
# 10 mxb.eu.mailgun.org.
```
El host EOP directo suele ser el nombre específico del tenant `mail.protection.outlook.com` (por ejemplo `target-com.mail.protection.outlook.com`). A menudo puedes recuperar el patrón de nombres del tenant a partir de la enumeración pública de tenant/domain y de respuestas de autodiscover relacionadas con Exchange.
**Minimal PoC:**
```powershell
Send-MailMessage -SmtpServer target-com.mail.protection.outlook.com -To victim@target.com -From ceo@target.com -Subject "Urgent" -Body "Review the attached payment change" -BodyAsHTML
```
**Señales de validación:**
- El correo se envía a `*.mail.protection.outlook.com` en lugar del host MX público.
- El mensaje se entrega incluso aunque los headers muestren fallos como `spf=fail`, `dkim=none`, `dmarc=fail` o `compauth=none`.
- Un Partner connector seguro normalmente rechaza la etapa `RCPT TO` con `5.7.51 TenantInboundAttribution; Rejecting.`
**Notas técnicas / hunting defensivo:**
- **Enhanced Filtering for Connectors** ayuda a Exchange a atribuir correctamente el remitente original, pero por sí solo **no** es el límite que bloquea la entrega directa al tenant.
- Microsoft documenta dos controles prácticos cuando se usa un MX externo delante de Exchange Online:
- Crea un **Partner inbound connector** con `SenderDomains *` y `RestrictDomainsToCertificate` o `RestrictDomainsToIPAddresses` para que solo el gateway aprobado pueda entregar al tenant.
- Crea una **priority 0 transport rule** que ponga en cuarentena el correo entrante salvo que la IP del remitente pertenezca a rangos de gateway aprobados **o** `X-MS-Exchange-Organization-AuthAs` contenga `Internal`.
- Busca correo donde **Received** muestre `*.mail.protection.outlook.com` como el primer salto de Microsoft, pero los headers de autenticación del remitente aún muestren fallos de **SPF/DKIM/DMARC**.
- Si el objetivo aún permite **Direct Send**, deshabilitarlo principalmente reduce el spoofing de remitente **interno**; no sustituye la mitigación de connector / transport-rule para spoofing **externo** arbitrario.
## Filesystem Credentials
El **`az cli`** almacena mucha información interesante dentro de **`<HOME>/.Azure`**:
- **`azureProfile.json`** contains info about logged in users from the past
- **`clouds.config`** contains info about subscriptions
- **`service_principal_entries.json`** contains applications **credentials** (tenant id, clients and secret)
- **`msal_token_cache.json`** contains **access tokens and refresh tokens**
- **`azureProfile.json`** contiene información sobre usuarios que iniciaron sesión en el pasado
- **`clouds.config`** contiene información sobre subscriptions
- **`service_principal_entries.json`** contiene **credentials** de aplicaciones (tenant id, clients y secret)
- **`msal_token_cache.json`** contiene **access tokens y refresh tokens**
Ten en cuenta que en macOS y linux estos archivos se almacenan **sin protección** en texto claro.
## Referencias
## References
- [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/)
- [https://labs.infoguard.ch/posts/ghost-sender/](https://labs.infoguard.ch/posts/ghost-sender/)
- [https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/manage-mail-flow-using-third-party-cloud](https://learn.microsoft.com/en-us/exchange/mail-flow-best-practices/manage-mail-flow-using-third-party-cloud)
- [https://learn.microsoft.com/en-us/defender-office-365/anti-phishing-policies-about](https://learn.microsoft.com/en-us/defender-office-365/anti-phishing-policies-about)
- [https://techcommunity.microsoft.com/blog/exchange/direct-send-vs-sending-directly-to-an-exchange-online-tenant/4439865](https://techcommunity.microsoft.com/blog/exchange/direct-send-vs-sending-directly-to-an-exchange-online-tenant/4439865)
{{#include ../../../banners/hacktricks-training.md}}