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
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
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 principallogin.microsoftonline.com/<domain>/.well-known/openid-configuration)- Todos los dominios válidos en el tenant
Get-AADIntTenantDomains -Domain <domain>(API principalautodiscover-s.outlook.com/autodiscover/autodiscover.svc)- Información de inicio de sesión del usuario. Si
NameSpaceTypeesManaged, significa que se usa EntraID Get-AADIntLoginInformation -UserName <UserName>(API principallogin.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
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
- Common Phishing para credenciales o a través de OAuth Apps
- Device Code Authentication Phishing
Filesystem Credentials
El az cli almacena mucha información interesante dentro de <HOME>/.Azure:
azureProfile.jsoncontains info about logged in users from the pastclouds.configcontains info about subscriptionsservice_principal_entries.jsoncontains applications credentials (tenant id, clients and secret)msal_token_cache.jsoncontains access tokens and refresh tokens
Ten en cuenta que en macOS y linux estos archivos se almacenan sin protección en texto claro.
Referencias
- https://aadinternals.com/post/just-looking/
- 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/
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
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
HackTricks Cloud

