Az - Unauthenticated Enum & Initial Entry

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Azure Tenant

Tenant Enumeration

Istnieją pewne public Azure APIs, dzięki którym atakujący, znając tylko domenę tenant’a, może wykonać zapytania, aby zebrać więcej informacji o nim.\
Możesz zapytać bezpośrednio API lub użyć biblioteki PowerShell AADInternals (Install-Module AADInternals):

  • Informacje o logowaniu, w tym tenant ID
  • Get-AADIntTenantID -Domain <domain> (main API login.microsoftonline.com/<domain>/.well-known/openid-configuration)
  • Wszystkie poprawne domeny w tenant
  • Get-AADIntTenantDomains -Domain <domain> (main API autodiscover-s.outlook.com/autodiscover/autodiscover.svc)
  • Informacje o logowaniu użytkownika. Jeśli NameSpaceType jest Managed, oznacza to, że używane jest EntraID
  • Get-AADIntLoginInformation -UserName <UserName> (main API login.microsoftonline.com/GetUserRealm.srf?login=<UserName>)

Możesz uzyskać wszystkie informacje o Azure tenant za pomocą jednego polecenia z 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

Można zobaczyć szczegóły dotyczące nazwy tenanta, ID oraz nazwy “brand”. Dodatkowo wyświetlany jest status Desktop Single Sign-On (SSO), znanego również jako Seamless SSO. Po włączeniu funkcja ta ułatwia ustalenie obecności (enumerację) konkretnego użytkownika w docelowej organizacji.

Dodatkowo wynik przedstawia nazwy wszystkich zweryfikowanych domen powiązanych z docelowym tenantem wraz z ich typami tożsamości. W przypadku domen federowanych ujawniany jest również Fully Qualified Domain Name (FQDN) dostawcy tożsamości w użyciu, zazwyczaj serwera ADFS. Kolumna “MX” określa, czy wiadomości e-mail są kierowane do Exchange Online, natomiast kolumna “SPF” wskazuje, czy Exchange Online jest wymienione jako nadawca e-maili. Ważne: aktualna funkcja rozpoznawcza nie parsuje instrukcji “include” w rekordach SPF, co może skutkować fałszywie negatywnymi wynikami.

Enumeracja użytkowników

Tip

Należy pamiętać, że nawet jeśli tenant używa kilku adresów e-mail dla tego samego użytkownika, username is unique. Oznacza to, że będzie to działać tylko z domeną powiązaną z użytkownikiem, a nie z innymi domenami.

Można sprawdzić, czy username istnieje w obrębie tenanta. Dotyczy to również guest users, których username ma format:

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

Adres e-mail to adres użytkownika, w którym znak „@” został zastąpiony znakiem podkreślenia „_”.

Za pomocą AADInternals możesz łatwo sprawdzić, czy użytkownik istnieje, czy nie:

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

Nie otrzymałem treści pliku README.md. Proszę wklej zawartość (z zachowaniem oryginalnego markdown/html), a przetłumaczę ją na polski zgodnie z wytycznymi.

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

Możesz też użyć pliku tekstowego z jednym adresem e-mail na wiersz:

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

Obecnie dostępne są 4 różne metody enumeracji do wyboru. Informacje można znaleźć w Get-Help Invoke-AADIntUserEnumerationAsOutsider:

Obsługuje następujące metody enumeracji: Normal, Login, Autologon i RST2.

  • Metoda Normal wydaje się obecnie działać we wszystkich tenants. Wcześniej wymagała włączenia Desktop SSO (aka Seamless SSO) dla przynajmniej jednej domeny.

  • Metoda Login działa w każdym tenants, ale zapytania enumeracyjne będą rejestrowane w Azure AD sign-in log jako nieudane zdarzenia logowania!

  • Metoda Autologon wydaje się już nie działać we wszystkich tenants. Prawdopodobnie wymaga, aby DesktopSSO lub directory sync były włączone.

Po odkryciu poprawnych nazw użytkowników możesz uzyskać informacje o użytkowniku za pomocą:

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

Skrypt o365spray pozwala również sprawdzić czy adres e-mail jest prawidłowy.

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

Innym dobrym źródłem informacji jest Microsoft Teams.

API Microsoft Teams umożliwia wyszukiwanie użytkowników. W szczególności endpointy “user search” externalsearchv3 i searchUsers mogą być użyte do pobrania ogólnych informacji o kontach użytkowników zarejestrowanych w Teams.

W zależności od odpowiedzi API można rozróżnić między użytkownikami nieistniejącymi a istniejącymi użytkownikami posiadającymi ważną subskrypcję Teams.

Skrypt TeamsEnum może służyć do weryfikacji podanego zestawu nazw użytkowników za pomocą Teams API, ale wymaga dostępu do konta użytkownika z dostępem do Teams.

# 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

I don’t have the README.md content. Proszę wklej zawartość pliku README.md, którą chcesz przetłumaczyć na polski.

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

Ponadto możliwe jest wyenumerowanie informacji o dostępności istniejących użytkowników, takich jak:

  • Dostępny
  • Nieobecny
  • Nie przeszkadzać
  • Zajęty
  • Niedostępny

Jeśli skonfigurowano wiadomość poza biurem, możliwe jest również pobranie tej wiadomości przy użyciu TeamsEnum. Jeśli określono plik wyjściowy, wiadomości poza biurem są automatycznie zapisywane w pliku JSON:

jq . teamsenum-output.json

Proszę wklej zawartość pliku src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md, który chcesz przetłumaczyć na polski.

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

Usługi Azure używające domen

Można również spróbować znaleźć usługi Azure ujawnione w popularnych subdomenach Azure, takich jak opisane w tym poście:

  • 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

Możesz użyć metody z MicroBust w tym celu. Funkcja przeszuka nazwę domeny bazowej (oraz kilka permutacji) w kilku domenach Azure:

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

Phishing

System plików Credentials

The az cli przechowuje wiele interesujących informacji w <HOME>/.Azure:

  • azureProfile.json zawiera informacje o użytkownikach zalogowanych w przeszłości
  • clouds.config zawiera informacje o subskrypcjach
  • service_principal_entries.json zawiera credentials aplikacji (tenant id, clients and secret)
  • msal_token_cache.json zawiera access tokens and refresh tokens

Zauważ, że w macOS i linux te pliki są niechronione i przechowywane w postaci jawnej.

Źródła

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks