Az - Unauthenticated Enum & Initial Entry

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Azure Tenant

Tenant Enumeration

Il existe certaines public Azure APIs telles que, en connaissant simplement le domain of the tenant, un attaquant peut les interroger pour obtenir plus d’informations.
Vous pouvez interroger directement l’API ou utiliser la bibliothùque PowerShell AADInternals (Install-Module AADInternals):

  • Informations de connexion incluant le tenant ID
  • Get-AADIntTenantID -Domain <domain> (API principale login.microsoftonline.com/<domain>/.well-known/openid-configuration)
  • Tous les domaines valides dans le tenant
  • Get-AADIntTenantDomains -Domain <domain> (API principale autodiscover-s.outlook.com/autodiscover/autodiscover.svc)
  • Informations de connexion de l’utilisateur. Si NameSpaceType est Managed, cela signifie qu’EntraID est utilisĂ©
  • Get-AADIntLoginInformation -UserName <UserName> (API principale login.microsoftonline.com/GetUserRealm.srf?login=<UserName>)

Vous pouvez interroger toutes les informations d’un Azure tenant avec une seule commande 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

Il est possible d’observer des dĂ©tails sur le nom du tenant, son ID et son nom de “brand”. De plus, le statut du Desktop Single Sign-On (SSO), aussi connu sous le nom de Seamless SSO, est affichĂ©. Lorsqu’il est activĂ©, cette fonctionnalitĂ© facilite la dĂ©termination de la prĂ©sence (Ă©numĂ©ration) d’un utilisateur spĂ©cifique au sein de l’organisation ciblĂ©e.

De plus, la sortie prĂ©sente les noms de tous les domaines vĂ©rifiĂ©s associĂ©s au tenant ciblĂ©, ainsi que leurs types d’identitĂ© respectifs. Dans le cas de domaines fĂ©dĂ©rĂ©s, le Fully Qualified Domain Name (FQDN) du fournisseur d’identitĂ© utilisĂ©, typiquement un serveur ADFS, est Ă©galement divulguĂ©. La colonne “MX” prĂ©cise si les e-mails sont routĂ©s vers Exchange Online, tandis que la colonne “SPF” indique si Exchange Online est listĂ© comme expĂ©diteur d’e-mails. Il est important de noter que la fonction de reconnaissance actuelle n’analyse pas les dĂ©clarations “include” dans les enregistrements SPF, ce qui peut entraĂźner des faux nĂ©gatifs.

ÉnumĂ©ration des utilisateurs

Tip

Notez que mĂȘme si un tenant utilise plusieurs adresses e-mail pour le mĂȘme utilisateur, le nom d’utilisateur est unique. Cela signifie que cela ne fonctionnera qu’avec le domaine associĂ© Ă  l’utilisateur et pas avec les autres domaines.

Il est possible de vĂ©rifier si un nom d’utilisateur existe au sein d’un tenant. Cela inclut Ă©galement les guest users, dont le nom d’utilisateur est au format :

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

L’email correspond Ă  l’adresse e-mail de l’utilisateur oĂč le «@» est remplacĂ© par un underscore «_». Avec AADInternals, vous pouvez facilement vĂ©rifier si l’utilisateur existe ou non :

# Check does the user exist
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"

Veuillez fournir le contenu de src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md que vous souhaitez traduire.

UserName         Exists
--------         ------
user@company.com True

Vous pouvez également utiliser un fichier texte contenant une adresse e-mail par ligne :

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

Actuellement il existe 4 mĂ©thodes d’énumĂ©ration diffĂ©rentes parmi lesquelles choisir. Vous pouvez trouver des informations dans Get-Help Invoke-AADIntUserEnumerationAsOutsider :

Il prend en charge les mĂ©thodes d’énumĂ©ration suivantes : Normal, Login, Autologon et RST2.

  • La mĂ©thode Normal semble actuellement fonctionner avec tous les tenants. Auparavant, elle nĂ©cessitait que Desktop SSO (aka Seamless SSO) soit activĂ© pour au moins un domaine.

  • La mĂ©thode Login fonctionne avec n’importe quel tenant, mais les requĂȘtes d’énumĂ©ration seront consignĂ©es dans le Azure AD sign-in log comme failed login events !

  • La mĂ©thode Autologon ne semble plus fonctionner avec tous les tenants. Elle nĂ©cessite probablement que DesktopSSO ou directory sync soit activĂ©.

AprĂšs avoir dĂ©couvert les noms d’utilisateur valides, vous pouvez obtenir des informations sur un utilisateur avec :

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

Le script o365spray vous permet également de découvrir si un email est valide.

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

User Enumeration via Microsoft Teams

Une autre bonne source d’information est Microsoft Teams.

L’API de Microsoft Teams permet de rechercher des utilisateurs. En particulier les “user search” endpoints externalsearchv3 et searchUsers peuvent ĂȘtre utilisĂ©s pour demander des informations gĂ©nĂ©rales sur les comptes utilisateur inscrits Ă  Teams.

Selon la rĂ©ponse de l’API, il est possible de distinguer les utilisateurs inexistants des utilisateurs existants qui ont un abonnement Teams valide.

Le script TeamsEnum peut ĂȘtre utilisĂ© pour valider un ensemble donnĂ© de noms d’utilisateur contre l’API Teams, mais vous avez besoin d’un compte utilisateur disposant d’un accĂšs Ă  Teams pour l’utiliser.

# 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

Je n’ai pas le contenu du fichier. Veuillez coller ici le contenu de src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md que vous souhaitez traduire. Je renverrai la traduction en français en respectant vos consignes (ne pas traduire le code, les noms de plateformes, les liens, les tags, les chemins, etc.).

[-] 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)

De plus, il est possible d’énumĂ©rer les informations de disponibilitĂ© des utilisateurs existants comme suit :

  • Disponible
  • Absent
  • Ne pas dĂ©ranger
  • OccupĂ©
  • Hors ligne

Si un message d’absence est configurĂ©, il est Ă©galement possible de rĂ©cupĂ©rer le message en utilisant TeamsEnum. Si un fichier de sortie a Ă©tĂ© spĂ©cifiĂ©, les messages d’absence sont automatiquement enregistrĂ©s dans le fichier JSON :

jq . teamsenum-output.json

I don’t have the README.md content. Please paste the file contents you want translated (I’ll keep code, tags, links and paths unchanged).

{
"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

Services Azure utilisant des domaines

Il est aussi possible d’essayer de trouver des services Azure exposĂ©s dans des sous-domaines Azure courants comme ceux documentĂ©s dans ce post:

  • 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

Vous pouvez utiliser une méthode de MicroBust pour cet objectif. Cette fonction recherchera le nom de domaine de base (et quelques permutations) dans plusieurs domaines Azure :

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

Phishing

Credentials du systĂšme de fichiers

Le az cli stocke beaucoup d’informations intĂ©ressantes dans <HOME>/.Azure :

  • azureProfile.json contient des infos sur les utilisateurs qui se sont connectĂ©s dans le passĂ©
  • clouds.config contient des infos sur les abonnements
  • service_principal_entries.json contient les credentials des applications (tenant id, clients and secret)
  • msal_token_cache.json contient des access tokens et refresh tokens

Notez que sur macOS et linux ces fichiers sont non protégés, stockés en clair.

Références

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks