Az - Enumeración no autenticada & Entrada inicial

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Tenant de Azure

Enumeración del tenant

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.
Puedes consultar directamente la API o usar la librería de PowerShell 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>)

Puedes consultar toda la información de un tenant de Azure con solo un comando de AADInternals:

# Doesn't work in macos because 'Resolve-DnsName' doesn't exist
Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table

## Output Example of the Azure tenant info:

Tenant brand:       Company Ltd
Tenant name:        company
Tenant id:          1937e3ab-38de-a735-a830-3075ea7e5b39
DesktopSSO enabled: True

Name                           DNS   MX    SPF  Type      STS
----                           ---   --    ---  ----      ---
company.com                   True  True  True  Federated sts.company.com
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. 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.

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.

Enumeración de usuarios

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.

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:

<email>#EXT#@<tenant name>.onmicrosoft.com

El email es la dirección de correo del usuario donde la arroba “@” se reemplaza por guion bajo “_”.

Con AADInternals, puedes verificar fácilmente si el usuario existe o no:

# 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.

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:

user@company.com
user2@company.com
admin@company.com
admin2@company.com
external.user_gmail.com#EXT#@company.onmicrosoft.com
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:

Soporta los siguientes métodos de enumeración: Normal, Login, Autologon, and 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 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.

Tras descubrir los nombres de usuario válidos puedes obtener información sobre un usuario con:

Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com

El script o365spray también te permite descubrir si un correo electrónico es válido.

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

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.

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.

El script 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.

# Install
git clone https://github.com/lucidra-security/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

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.

[-] 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)
[+] user3@domain - User3 | Company (Available, Desktop)

Además, es posible enumerar información de disponibilidad sobre usuarios existentes como la siguiente:

  • Available
  • Away
  • DoNotDisturb
  • 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:

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.

{
"email": "user2@domain",
"exists": true,
"info": [
{
"tenantId": "[REDACTED]",
"isShortProfile": false,
"accountEnabled": true,
"featureSettings": {
"coExistenceMode": "TeamsOnly"
},
"userPrincipalName": "user2@domain",
"givenName": "user2@domain",
"surname": "",
"email": "user2@domain",
"tenantName": "Company",
"displayName": "User2",
"type": "Federated",
"mri": "8:orgid:[REDACTED]",
"objectId": "[REDACTED]"
}
],
"presence": [
{
"mri": "8:orgid:[REDACTED]",
"presence": {
"sourceNetwork": "Federated",
"calendarData": {
"outOfOfficeNote": {
"message": "Dear sender. I am out of the office until March 23rd with limited access to my email. I will respond after my return.Kind regards, User2",
"publishTime": "2023-03-15T21:44:42.0649385Z",
"expiry": "2023-04-05T14:00:00Z"
},
"isOutOfOffice": true
},
"capabilities": ["Audio", "Video"],
"availability": "Away",
"activity": "Away",
"deviceType": "Mobile"
},
"etagMatch": false,
"etag": "[REDACTED]",
"status": 20000
}
]
}

Password Spraying / Brute-Force

Az - Password Spraying

Azure Services usando dominios

También es posible intentar encontrar Azure services exposed en subdominios comunes de azure como los documentados en esta publicación:

  • 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 para ese objetivo. Esta función buscará el nombre de dominio base (y algunas permutaciones) en varios azure domains:

Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose
Invoke-EnumerateAzureSubDomains -Base corp -Verbose

Phishing

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

Ten en cuenta que en macOS y linux estos archivos se almacenan sin protección en texto claro.

Referencias

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks