From b707ee03a07092e022c13b7f68de0a35d9618487 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 25 Jan 2025 14:38:26 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/README.md', 'src/pentes --- src/pentesting-cloud/azure-security/README.md | 167 +++++++++++------- .../az-tokens-and-public-applications.md | 53 +++--- .../azure-security/az-enumeration-tools.md | 36 ++-- .../azure-security/az-services/az-azuread.md | 143 ++++++++------- .../README.md | 158 ++++++++++------- 5 files changed, 325 insertions(+), 232 deletions(-) diff --git a/src/pentesting-cloud/azure-security/README.md b/src/pentesting-cloud/azure-security/README.md index 0e2b15c89..5b432f073 100644 --- a/src/pentesting-cloud/azure-security/README.md +++ b/src/pentesting-cloud/azure-security/README.md @@ -2,7 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Informazioni di Base +## Informazioni di base + +Impara le basi di Azure e Entra ID nella pagina seguente: {{#ref}} az-basic-information/ @@ -12,65 +14,69 @@ az-basic-information/ Per auditare un ambiente AZURE è molto importante sapere: quali **servizi vengono utilizzati**, cosa è **esposto**, chi ha **accesso** a cosa e come sono connessi i servizi interni di Azure e i **servizi esterni**. -Dal punto di vista di un Red Team, il **primo passo per compromettere un ambiente Azure** è riuscire a ottenere alcune **credenziali** per Azure AD. Ecco alcune idee su come farlo: +Dal punto di vista del Red Team, il **primo passo per compromettere un ambiente Azure** è riuscire a ottenere un **foothold**. -- **Leaks** in github (o simili) - OSINT -- **Ingegneria** Sociale -- Riutilizzo della **Password** (leak di password) -- Vulnerabilità nelle Applicazioni Ospitate su Azure -- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) con accesso all'endpoint dei metadati -- **Lettura di File Locali** -- `/home/USERNAME/.azure` -- `C:\Users\USERNAME\.azure` -- Il file **`accessTokens.json`** in `az cli` prima della versione 2.30 - Gen2022 - memorizzava **token di accesso in chiaro** -- Il file **`azureProfile.json`** contiene **info** sull'utente connesso. -- **`az logout`** rimuove il token. -- Le versioni precedenti di **`Az PowerShell`** memorizzavano i **token di accesso** in **chiaro** in **`TokenCache.dat`**. Memorizza anche il **ServicePrincipalSecret** in **chiaro** in **`AzureRmContext.json`**. Il cmdlet **`Save-AzContext`** può essere utilizzato per **memorizzare** **token**.\ -Usa `Disconnect-AzAccount` per rimuoverli. -- Terze parti **compromesse** -- **Dipendente** Interno -- [**Phishing Comune**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenziali o App Oauth) -- [Phishing con Codice Dispositivo di Autenticazione](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) -- [**Password Spraying** di Azure](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) +### Enumerazione esterna e accesso iniziale -Anche se non hai **compromesso alcun utente** all'interno del tenant Azure che stai attaccando, puoi **raccogliere alcune informazioni** da esso: +Il primo passo è ovviamente enumerare informazioni sul tenant che stai attaccando e cercare di ottenere un foothold. + +In base al nome di dominio è possibile sapere **se l'azienda sta utilizzando Azure**, ottenere il **tenant ID**, ottenere altri **domini validi** nello stesso tenant (se ce ne sono) e ottenere **informazioni rilevanti** come se SSO è abilitato, configurazioni email, email di utenti validi... + +Controlla la pagina seguente per imparare come eseguire l'**enumerazione esterna**: {{#ref}} az-unauthenticated-enum-and-initial-entry/ {{#endref}} -> [!NOTE] -> Dopo aver ottenuto le credenziali, devi sapere **a chi appartengono queste credenziali**, e **a cosa hanno accesso**, quindi devi eseguire alcune enumerazioni di base: - -## Enumerazione di Base +Con queste informazioni, i modi più comuni per cercare di ottenere un foothold sono: +- **OSINT**: Controlla eventuali **leaks** su Github o qualsiasi altra piattaforma open source che potrebbe contenere **credenziali** o informazioni interessanti. +- Riutilizzo delle **password**, leaks o [password spraying](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) +- Acquistare credenziali da un dipendente +- [**Phishing comune**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenziali o Oauth App) +- [Phishing con codice dispositivo](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) +- **Violazioni** di terze parti +- Vulnerabilità nelle applicazioni ospitate su Azure +- [**Server Side Request Forgery**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) con accesso all'endpoint dei metadati +- **Subdomain takeovers** come in [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/) +- Se un laptop di uno sviluppatore è compromesso ([WinPEAS e LinPEAS](https://github.com/peass-ng/PEASS-ng) possono trovare queste informazioni): +- Dentro **`/.Azure`** +- **`azureProfile.json`** contiene informazioni sugli utenti connessi in passato +- **`clouds.config` contiene** informazioni sulle sottoscrizioni +- **`service_principal_entries.json`** contiene credenziali delle applicazioni (tenant id, client e segreto). Solo in Linux e macOS +- **`msal_token_cache.json`** contiene token di accesso e token di aggiornamento. Solo in Linux e macOS +- **`service_principal_entries.bin`** e msal_token_cache.bin sono utilizzati in Windows e sono crittografati con DPAPI +- **`msal_http_cache.bin`** è una cache delle richieste HTTP +- Caricalo: `with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)` +- **`AzureRmContext.json`** contiene informazioni sui login precedenti utilizzando Az PowerShell (ma nessuna credenziale) +- Dentro **`C:\Users\\AppData\Local\Microsoft\IdentityCache\*`** ci sono diversi file `.bin` con **token di accesso**, token ID e informazioni sull'account crittografate con DPAPI degli utenti. +- È possibile trovare ulteriori **token di accesso** nei file `.tbres` all'interno di **`C:\Users\\AppData\Local\Microsoft\TokenBroken\Cache\`** che contengono un base64 crittografato con DPAPI con token di accesso. +- In Linux e macOS puoi ottenere **token di accesso, token di aggiornamento e token ID** da Az PowerShell (se utilizzato) eseguendo `pwsh -Command "Save-AzContext -Path /tmp/az-context.json"` +- In Windows questo genera solo token ID. +- Possibile vedere se Az PowerShell è stato utilizzato in Linux e macOS controllando se esiste `$HOME/.local/share/.IdentityService/` (anche se i file contenuti sono vuoti e inutili) > [!NOTE] -> Ricorda che la parte **più rumorosa** dell'enumerazione è il **login**, non l'enumerazione stessa. +> Ricorda che di solito la parte **più rumorosa** dell'enumerazione è il **login**, non l'enumerazione stessa. -### SSRF +### Strumenti Azure e Entra ID -Se hai trovato un SSRF in una macchina all'interno di Azure controlla questa pagina per trucchi: +I seguenti strumenti saranno super utili per enumerare sia i tenant di Entra ID che gli ambienti Azure lentamente (per evitare il rilevamento) o automaticamente (per risparmiare tempo): {{#ref}} -https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html +az-enumeration-tools.md {{#endref}} -### Bypassare le Condizioni di Login +### Bypassare le condizioni di login
Nei casi in cui hai alcune credenziali valide ma non riesci a effettuare il login, queste sono alcune protezioni comuni che potrebbero essere in atto: - **Whitelist IP** -- Devi compromettere un IP valido -- **Restrizioni Geografiche** -- Scopri dove vive l'utente o dove si trovano gli uffici dell'azienda e ottieni un IP dalla stessa città (o paese almeno) -- **Browser** -- Forse solo un browser di un certo OS (Windows, Linux, Mac, Android, iOS) è consentito. Scopri quale OS utilizza la vittima/azienda. +- **Restrizioni geografiche** -- Scopri dove vive l'utente o dove si trovano gli uffici dell'azienda e ottieni un IP dalla stessa città (o paese almeno) +- **Browser** -- Forse è consentito solo un browser di un certo OS (Windows, Linux, Mac, Android, iOS). Scopri quale OS utilizza la vittima/azienda. - Puoi anche provare a **compromettere le credenziali del Service Principal** poiché di solito sono meno limitate e il loro login è meno controllato -Dopo averlo bypassato, potresti essere in grado di tornare alla tua configurazione iniziale e avrai ancora accesso. - -### Presa di Controllo di Sottodomini - -- [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/) +Dopo aver bypassato, potresti essere in grado di tornare alla tua configurazione iniziale e avrai ancora accesso. ### Whoami @@ -91,16 +97,7 @@ az account management-group list #Not allowed by default ``` {{#endtab }} -{{#tab name="AzureAD" }} -```bash -#Get the current session state -Get-AzureADCurrentSessionInfo -#Get details of the current tenant -Get-AzureADTenantDetail -``` -{{#endtab }} - -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Get the information about the current context (Account, Tenant, Subscription etc.) Get-AzContext @@ -110,43 +107,79 @@ Get-AzContext -ListAvailable Get-AzSubscription #Get Resource group Get-AzResourceGroup -# Enumerate all resources visible to the current user -Get-AzResource -# Enumerate all Azure RBAC role assignments -Get-AzRoleAssignment # For all users -Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user +``` +{{#endtab }} + +{{#tab name="Mg" }} +```bash +#Get the current session +Get-MgContext +``` +{{#endtab }} + +{{#tab name="AzureAD" }} +```bash +#Get the current session state +Get-AzureADCurrentSessionInfo +#Get details of the current tenant +Get-AzureADTenantDetail ``` {{#endtab }} {{#endtabs }} -> [!CAUTION] -> Uno dei comandi più importanti per enumerare Azure è **`Get-AzResource`** da Az PowerShell poiché ti consente di **conoscere le risorse a cui il tuo utente attuale ha visibilità**. -> -> Puoi ottenere le stesse informazioni nella **console web** andando su [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) o cercando "Tutte le risorse" -### Enumerazione di Entra ID +### Enumerazione di Entra ID e Escalation dei Privilegi -Per impostazione predefinita, qualsiasi utente dovrebbe avere **sufficienti autorizzazioni per enumerare** cose come utenti, gruppi, ruoli, service principal... (controlla [autorizzazioni predefinite di AzureAD](az-basic-information/index.html#default-user-permissions)).\ +Per impostazione predefinita, qualsiasi utente dovrebbe avere **sufficienti permessi per enumerare** cose come utenti, gruppi, ruoli, service principals... (controlla [permissi di AzureAD predefiniti](az-basic-information/index.html#default-user-permissions)).\ Puoi trovare qui una guida: {{#ref}} az-services/az-azuread.md {{#endref}} -> [!NOTE] -> Ora che **hai alcune informazioni sulle tue credenziali** (e se sei un red team speriamo che **non sei stato rilevato**). È tempo di scoprire quali servizi vengono utilizzati nell'ambiente.\ -> Nella sezione seguente puoi controllare alcuni modi per **enumerare alcuni servizi comuni.** +Controlla gli **Strumenti di Post-Exploitation** per trovare strumenti per escalare i privilegi in Entra ID come **AzureHound:** -## App Service SCM +{{#ref}} +az-enumeration-tools.md#automated-post-exploitation-tools +{{#endref}} -Console Kudu per accedere al 'container' dell'App Service. -## Webshell +### Enumerare i Servizi Azure -Usa portal.azure.com e seleziona la shell, oppure usa shell.azure.com, per un bash o powershell. Il 'disco' di questa shell è memorizzato come un file immagine in un storage-account. +Una volta che sai chi sei, puoi iniziare a enumerare i **servizi Azure a cui hai accesso**. -## Azure DevOps +Il comando Az PowerShell **`Get-AzResource`** ti consente di **conoscere le risorse su cui il tuo utente attuale ha visibilità**. -Azure DevOps è separato da Azure. Ha repository, pipeline (yaml o release), board, wiki e altro. I Gruppi di Variabili vengono utilizzati per memorizzare valori di variabili e segreti. +Inoltre, puoi ottenere le stesse informazioni nella **console web** andando su [https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) o cercando "Tutte le risorse" o eseguendo: `az rest --method GET --url "https://management.azure.com/subscriptions//resources?api-version=2021-04-01"` + +Inoltre, con sufficienti permessi, il ruolo **`Get-AzRoleAssignment`** può essere utilizzato per **enumerare tutti i ruoli** nella sottoscrizione o il permesso su una risorsa specifica indicandola come in: **`Get-AzRoleAssignment -Scope /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.RecoveryServices/vaults/vault-m3ww8ut4`** + +Nella sezione seguente puoi trovare informazioni sui servizi Azure più comuni e su come enumerarli: + +{{#ref}} +az-services/ +{{#endref}} + +### Escalation dei Privilegi, Post-Exploitation e Persistenza nei Servizi Azure + +Una volta che sai come è strutturato l'ambiente Azure e quali servizi vengono utilizzati, puoi iniziare a cercare modi per **escalare i privilegi, muoverti lateralmente, eseguire altri attacchi di post-exploitation e mantenere la persistenza**. + +Nella sezione seguente puoi trovare informazioni su come escalare i privilegi nei servizi Azure più comuni: + +{{#ref}} +az-privilege-escalation/ +{{#endref}} + +Nella seguente puoi trovare informazioni su come eseguire attacchi di post-exploitation nei servizi Azure più comuni: + +{{#ref}} +az-post-exploitation/ +{{#endref}} + +Nella seguente puoi trovare informazioni su come mantenere la persistenza nei servizi Azure più comuni: + +{{#ref}} +az-persistence/ +{{#endref}} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md index 5b80b8869..923d3ab20 100644 --- a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md +++ b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md @@ -2,9 +2,9 @@ {{#include ../../../banners/hacktricks-training.md}} -## Informazioni di Base +## Basic Information -Entra ID è la piattaforma di gestione dell'identità e degli accessi (IAM) basata su cloud di Microsoft, che funge da sistema fondamentale di autenticazione e autorizzazione per servizi come Microsoft 365 e Azure Resource Manager. Azure AD implementa il framework di autorizzazione OAuth 2.0 e il protocollo di autenticazione OpenID Connect (OIDC) per gestire l'accesso alle risorse. +Entra ID è la piattaforma di gestione dell'identità e degli accessi (IAM) basata sul cloud di Microsoft, che funge da sistema fondamentale di autenticazione e autorizzazione per servizi come Microsoft 365 e Azure Resource Manager. Azure AD implementa il framework di autorizzazione OAuth 2.0 e il protocollo di autenticazione OpenID Connect (OIDC) per gestire l'accesso alle risorse. ### OAuth @@ -38,21 +38,21 @@ Entra ID è la piattaforma di gestione dell'identità e degli accessi (IAM) basa - Non possono autenticarsi in modo sicuro al server di autorizzazione. - **Implicazione di Sicurezza:** Un attaccante può impersonare un'applicazione client pubblica quando richiede token, poiché non esiste un meccanismo per il server di autorizzazione per verificare la legittimità dell'applicazione. -## Token di Autenticazione +## Authentication Tokens Ci sono **tre tipi di token** utilizzati in OIDC: -- [**Token di Accesso**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Il client presenta questo token al server delle risorse per **accedere alle risorse**. Può essere utilizzato solo per una specifica combinazione di utente, client e risorsa e **non può essere revocato** fino alla scadenza - che è di 1 ora per impostazione predefinita. -- **Token ID**: Il client riceve questo **token dal server di autorizzazione**. Contiene informazioni di base sull'utente. È **legato a una specifica combinazione di utente e client**. -- **Token di Aggiornamento**: Forniti al client con il token di accesso. Utilizzati per **ottenere nuovi token di accesso e ID**. È legato a una specifica combinazione di utente e client e può essere revocato. La scadenza predefinita è **90 giorni** per i token di aggiornamento inattivi e **nessuna scadenza per i token attivi** (da un token di aggiornamento è possibile ottenere nuovi token di aggiornamento). -- Un token di aggiornamento dovrebbe essere legato a un **`aud`**, a alcuni **ambiti**, e a un **tenant** e dovrebbe essere in grado di generare token di accesso solo per quel aud, ambiti (e non di più) e tenant. Tuttavia, questo non è il caso con i **token delle applicazioni FOCI**. -- Un token di aggiornamento è crittografato e solo Microsoft può decrittografarlo. -- Ottenere un nuovo token di aggiornamento non revoca il token di aggiornamento precedente. +- [**Access Tokens**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** Il client presenta questo token al server delle risorse per **accedere alle risorse**. Può essere utilizzato solo per una specifica combinazione di utente, client e risorsa e **non può essere revocato** fino alla scadenza - che è di 1 ora per impostazione predefinita. +- **ID Tokens**: Il client riceve questo **token dal server di autorizzazione**. Contiene informazioni di base sull'utente. È **legato a una specifica combinazione di utente e client**. +- **Refresh Tokens**: Forniti al client con il token di accesso. Utilizzati per **ottenere nuovi token di accesso e ID**. È legato a una specifica combinazione di utente e client e può essere revocato. La scadenza predefinita è **90 giorni** per i token di refresh inattivi e **nessuna scadenza per i token attivi** (da un token di refresh è possibile ottenere nuovi token di refresh). +- Un token di refresh dovrebbe essere legato a un **`aud`**, a alcuni **ambiti**, e a un **tenant** e dovrebbe essere in grado di generare token di accesso solo per quel aud, ambiti (e non di più) e tenant. Tuttavia, questo non è il caso con i **token delle applicazioni FOCI**. +- Un token di refresh è crittografato e solo Microsoft può decrittografarlo. +- Ottenere un nuovo token di refresh non revoca il token di refresh precedente. > [!WARNING] -> Le informazioni per il **accesso condizionale** sono **memorizzate** all'interno del **JWT**. Quindi, se richiedi il **token da un indirizzo IP consentito**, quell'**IP** sarà **memorizzato** nel token e poi puoi utilizzare quel token da un **IP non consentito per accedere alle risorse**. +> Le informazioni per **l'accesso condizionale** sono **memorizzate** all'interno del **JWT**. Quindi, se richiedi il **token da un indirizzo IP consentito**, quell'**IP** sarà **memorizzato** nel token e poi puoi utilizzare quel token da un **IP non consentito per accedere alle risorse**. -### Token di Accesso "aud" +### Access Tokens "aud" Il campo indicato nel campo "aud" è il **server delle risorse** (l'applicazione) utilizzato per eseguire il login. @@ -77,7 +77,7 @@ Il comando `az account get-access-token --resource-type [...]` supporta i seguen * **data-lake (Azure Data Lake Storage)**: Utilizzato per interagire con Azure Data Lake Storage Gen1, che è un servizio di archiviazione e analisi dei dati scalabile. - `https://datalake.azure.net/` -- **media (Azure Media Services)**: Utilizzato per accedere ad Azure Media Services, che forniscono servizi di elaborazione e distribuzione di media basati su cloud per contenuti video e audio. +- **media (Azure Media Services)**: Utilizzato per accedere ad Azure Media Services, che forniscono servizi di elaborazione e distribuzione dei media basati sul cloud per contenuti video e audio. - `https://rest.media.azure.net` * **ms-graph (Microsoft Graph API)**: Utilizzato per accedere all'API Microsoft Graph, l'endpoint unificato per i dati dei servizi Microsoft 365. Consente di accedere a dati e informazioni da servizi come Azure AD, Office 365, Enterprise Mobility e servizi di sicurezza. @@ -88,13 +88,13 @@ Il comando `az account get-access-token --resource-type [...]` supporta i seguen -### Ambiti dei Token di Accesso "scp" +### Access Tokens Scopes "scp" L'ambito di un token di accesso è memorizzato all'interno della chiave scp all'interno del JWT del token di accesso. Questi ambiti definiscono a cosa ha accesso il token di accesso. Se un JWT è autorizzato a contattare un'API specifica ma **non ha l'ambito** per eseguire l'azione richiesta, **non sarà in grado di eseguire l'azione** con quel JWT. -### Esempio di Ottenimento di Token di Aggiornamento e Accesso +### Get refresh & access token example ```python # Code example from https://github.com/secureworks/family-of-client-ids-research import msal @@ -144,19 +144,31 @@ scopes=["https://graph.microsoft.com/.default"], ) pprint(new_azure_cli_bearer_tokens_for_graph_api) ``` -## FOCI Tokens Privilege Escalation +### Altri campi del token di accesso -In precedenza è stato menzionato che i refresh token dovrebbero essere legati agli **scopes** con cui sono stati generati, all'**applicazione** e al **tenant** a cui sono stati generati. Se uno di questi confini viene violato, è possibile effettuare un'escursione dei privilegi poiché sarà possibile generare access token per altre risorse e tenant a cui l'utente ha accesso e con più scopes di quanto fosse originariamente previsto. +- **appid**: ID dell'applicazione utilizzato per generare il token +- **appidacr**: Il riferimento alla classe di contesto di autenticazione dell'applicazione indica come il client è stato autenticato; per un client pubblico il valore è 0, e se viene utilizzato un segreto del client il valore è 1 +- **acr**: Il claim del riferimento alla classe di contesto di autenticazione è "0" quando l'autenticazione dell'utente finale non ha soddisfatto i requisiti della ISO/IEC 29115. +- **amr**: Il metodo di autenticazione indica come il token è stato autenticato. Un valore di “pwd” indica che è stata utilizzata una password. +- **groups**: Indica i gruppi di cui il principale è membro. +- **iss**: L'emittente identifica il servizio di token di sicurezza (STS) che ha generato il token. e.g. https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/ (l'uuid è l'ID del tenant) +- **oid**: L'ID dell'oggetto del principale +- **tid**: ID del tenant +- **iat, nbf, exp**: Emesso il (quando è stato emesso), Non prima (non può essere utilizzato prima di questo tempo, di solito lo stesso valore di iat), Tempo di scadenza. -Inoltre, **questo è possibile con tutti i refresh token** nella [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (account Microsoft Entra, account personali Microsoft e account social come Facebook e Google) perché come menzionano le [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "I refresh token sono legati a una combinazione di utente e client, ma **non sono legati a una risorsa o tenant**. Un client può utilizzare un refresh token per acquisire access token **attraverso qualsiasi combinazione di risorsa e tenant** per cui ha il permesso di farlo. I refresh token sono crittografati e solo la Microsoft identity platform può leggerli." +## Escalation dei privilegi dei token FOCI + +In precedenza è stato menzionato che i token di aggiornamento dovrebbero essere legati agli **ambiti** con cui sono stati generati, all'**applicazione** e al **tenant** a cui sono stati generati. Se uno di questi confini viene infranto, è possibile aumentare i privilegi poiché sarà possibile generare token di accesso per altre risorse e tenant a cui l'utente ha accesso e con più ambiti di quanto fosse originariamente previsto. + +Inoltre, **questo è possibile con tutti i token di aggiornamento** nella [Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/) (account Microsoft Entra, account personali Microsoft e account social come Facebook e Google) perché come menzionano i [**docs**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens): "I token di aggiornamento sono legati a una combinazione di utente e client, ma **non sono legati a una risorsa o tenant**. Un client può utilizzare un token di aggiornamento per acquisire token di accesso **attraverso qualsiasi combinazione di risorsa e tenant** per cui ha il permesso di farlo. I token di aggiornamento sono crittografati e solo la Microsoft identity platform può leggerli." Inoltre, nota che le applicazioni FOCI sono applicazioni pubbliche, quindi **non è necessario alcun segreto** per autenticarsi al server. Poi i client FOCI noti riportati nella [**ricerca originale**](https://github.com/secureworks/family-of-client-ids-research/tree/main) possono essere [**trovati qui**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv). -### Get different scope +### Ottenere un ambito diverso -Proseguendo con il codice di esempio precedente, in questo codice viene richiesto un nuovo token per uno scope diverso: +Proseguendo con il codice di esempio precedente, in questo codice viene richiesto un nuovo token per un ambito diverso: ```python # Code from https://github.com/secureworks/family-of-client-ids-research azure_cli_bearer_tokens_for_outlook_api = ( @@ -173,7 +185,7 @@ scopes=[ ) pprint(azure_cli_bearer_tokens_for_outlook_api) ``` -### Ottieni client e scope diversi +### Ottieni diversi client e scope ```python # Code from https://github.com/secureworks/family-of-client-ids-research microsoft_office_client = msal.PublicClientApplication("d3590ed6-52b3-4102-aeff-aad2292ab01c") @@ -192,5 +204,6 @@ pprint(microsoft_office_bearer_tokens_for_graph_api) ## Riferimenti - [https://github.com/secureworks/family-of-client-ids-research](https://github.com/secureworks/family-of-client-ids-research) +- [https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md](https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 3497d050d..a330d639c 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -45,15 +45,15 @@ pwsh brew update brew upgrade powershell ``` -## Strumenti Principali di Enumerazione +## Main Enumeration Tools ### az cli -[**Interfaccia della riga di comando di Azure (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) è uno strumento multipiattaforma scritto in Python per gestire e amministrare (la maggior parte) delle risorse di Azure e Entra ID. Si connette ad Azure ed esegue comandi amministrativi tramite la riga di comando o script. +[**Azure Command-Line Interface (CLI)**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) è uno strumento multipiattaforma scritto in Python per gestire e amministrare (la maggior parte) delle risorse di Azure e Entra ID. Si connette ad Azure ed esegue comandi amministrativi tramite la riga di comando o script. Segui questo link per le [**istruzioni di installazione¡**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install). -I comandi in Azure CLI sono strutturati utilizzando un modello di: `az ` +I comandi in Azure CLI sono strutturati utilizzando un modello di: `az ` #### Debug | MitM az cli @@ -79,6 +79,21 @@ export REQUESTS_CA_BUNDLE=/Users/user/Downloads/cacert.pem ``` {{#endtab }} +{{#tab name="CMD" }} +```bash +set ADAL_PYTHON_SSL_NO_VERIFY=1 +set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 +set HTTPS_PROXY="http://127.0.0.1:8080" +set HTTP_PROXY="http://127.0.0.1:8080" + +# If this is not enough +# Download the certificate from Burp and convert it into .pem format +# And export the following env variable +openssl x509 -in cacert.der -inform DER -out cacert.pem -outform PEM +set REQUESTS_CA_BUNDLE=C:\Users\user\Downloads\cacert.pem +``` +{{#endtab }} + {{#tab name="PS" }} ```bash $env:ADAL_PYTHON_SSL_NO_VERIFY=1 @@ -91,7 +106,7 @@ $env:HTTP_PROXY="http://127.0.0.1:8080" ### Az PowerShell -Azure PowerShell è un modulo con cmdlet per gestire le risorse di Azure direttamente dalla riga di comando di PowerShell. +Azure PowerShell è un modulo con cmdlet per gestire le risorse Azure direttamente dalla riga di comando di PowerShell. Segui questo link per le [**istruzioni di installazione**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell). @@ -121,18 +136,19 @@ Get-MgUser -Debug ``` ### ~~**AzureAD Powershell**~~ -Il modulo Azure Active Directory (AD), ora **deprecato**, fa parte di Azure PowerShell per la gestione delle risorse di Azure AD. Fornisce cmdlet per attività come la gestione di utenti, gruppi e registrazioni di applicazioni in Entra ID. +Il modulo Azure Active Directory (AD), ora **deprecato**, fa parte di Azure PowerShell per la gestione delle risorse Azure AD. Fornisce cmdlet per attività come la gestione di utenti, gruppi e registrazioni di applicazioni in Entra ID. > [!TIP] > Questo è sostituito da Microsoft Graph PowerShell Segui questo link per le [**istruzioni di installazione**](https://www.powershellgallery.com/packages/AzureAD). -## Automated Recon & Compliance Tools + +## Strumenti di Ricognizione e Conformità Automatizzati ### [turbot azure plugins](https://github.com/orgs/turbot/repositories?q=mod-azure) -Turbot con steampipe e powerpipe consente di raccogliere informazioni da Azure e Entra ID e di eseguire controlli di conformità e trovare configurazioni errate. I moduli Azure attualmente più raccomandati da eseguire sono: +Turbot con steampipe e powerpipe consente di raccogliere informazioni da Azure e Entra ID e di eseguire controlli di conformità e trovare misconfigurazioni. I moduli Azure attualmente più raccomandati da eseguire sono: - [https://github.com/turbot/steampipe-mod-azure-compliance](https://github.com/turbot/steampipe-mod-azure-compliance) - [https://github.com/turbot/steampipe-mod-azure-insights](https://github.com/turbot/steampipe-mod-azure-insights) @@ -163,7 +179,7 @@ powerpipe server ``` ### [Prowler](https://github.com/prowler-cloud/prowler) -Prowler è uno strumento di sicurezza Open Source per eseguire valutazioni delle migliori pratiche di sicurezza, audit, risposta agli incidenti, monitoraggio continuo, hardening e prontezza forense su AWS, Azure, Google Cloud e Kubernetes. +Prowler è uno strumento di sicurezza Open Source per eseguire valutazioni delle migliori pratiche di sicurezza, audit, risposta agli incidenti, monitoraggio continuo, indurimento e prontezza forense su AWS, Azure, Google Cloud e Kubernetes. Fondamentalmente ci permetterebbe di eseguire centinaia di controlli su un ambiente Azure per trovare misconfigurazioni di sicurezza e raccogliere i risultati in json (e in altri formati di testo) o controllarli sul web. ```bash @@ -226,7 +242,7 @@ python scout.py azure --cli ``` ### [Azure-MG-Sub-Governance-Reporting](https://github.com/JulianHayward/Azure-MG-Sub-Governance-Reporting) -È uno script PowerShell che ti aiuta a **visualizzare tutte le risorse e i permessi all'interno di un Management Group e del tenant Entra ID** e a trovare configurazioni di sicurezza errate. +È uno script PowerShell che ti aiuta a **visualizzare tutte le risorse e i permessi all'interno di un Gruppo di Gestione e del tenant Entra ID** e a trovare configurazioni di sicurezza errate. Funziona utilizzando il modulo Az PowerShell, quindi qualsiasi autenticazione supportata da questo strumento è supportata dallo strumento. ```bash @@ -303,7 +319,7 @@ Invoke-AzureRunCommand -Command -VMName ``` ### [**GraphRunner**](https://github.com/dafthack/GraphRunner/wiki/Invoke%E2%80%90GraphRunner) -GraphRunner è un insieme di strumenti di post-exploitation per interagire con l'API Microsoft Graph. Fornisce vari strumenti per eseguire ricognizione, persistenza e saccheggio di dati da un account Microsoft Entra ID (Azure AD). +GraphRunner è un insieme di strumenti post-exploitation per interagire con l'API Microsoft Graph. Fornisce vari strumenti per eseguire ricognizione, persistenza e saccheggio di dati da un account Microsoft Entra ID (Azure AD). ```bash #A good place to start is to authenticate with the Get-GraphTokens module. This module will launch a device-code login, allowing you to authenticate the session from a browser session. Access and refresh tokens will be written to the global $tokens variable. To use them with other GraphRunner modules use the Tokens flag (Example. Invoke-DumpApps -Tokens $tokens) Import-Module .\GraphRunner.ps1 diff --git a/src/pentesting-cloud/azure-security/az-services/az-azuread.md b/src/pentesting-cloud/azure-security/az-services/az-azuread.md index 47440b5cf..0a8d9e550 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-azuread.md +++ b/src/pentesting-cloud/azure-security/az-services/az-azuread.md @@ -66,12 +66,23 @@ $token = (az account get-access-token --resource https://graph.microsoft.com --q $secureToken = ConvertTo-SecureString $token -AsPlainText -Force Connect-MgGraph -AccessToken $secureToken +# Get token from session +Parameters = @{ +Method = "GET" +Uri = "/v1.0/me" +OutputType = "HttpResponseMessage" +} +$Response = Invoke-MgGraphRequest @Parameters +$Headers = $Response.RequestMessage.Headers +$Headers.Authorization.Parameter + + # Find commands Find-MgGraphCommand -command *Mg* ``` {{#endtab }} -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash Connect-AzAccount #Open browser # Using credentials @@ -80,15 +91,11 @@ $creds = New-Object System.Management.Automation.PSCredential("test@corp.onmicro Connect-AzAccount -Credential $creds # Get Access Token -(Get-AzAccessToken).Token # Request access token to other endpoints: AadGraph, AnalysisServices, Arm, Attestation, Batch, DataLake, KeyVault, MSGraph, OperationalInsights, ResourceManager, Storage, Synapse -(Get-AzAccessToken -ResourceTypeName MSGraph).Token -(Get-AzAccessToken -Resource "https://graph.microsoft.com").Token +(ConvertFrom-SecureString (Get-AzAccessToken -ResourceTypeName Arm -AsSecureString).Token -AsPlainText) # Connect with access token -Connect-AzAccount -AccountId test@corp.onmicrosoft.com -AccessToken $token -Connect-AzAccount -AccessToken $token -GraphAccessToken $graphaccesstoken -AccountId -## The -AccessToken is from management.azure.com +Connect-AzAccount -AccountId test@corp.onmicrosoft.com [-AccessToken $ManagementToken] [-GraphAccessToken $AADGraphToken] [-MicrosoftGraphAccessToken $MicrosoftGraphToken] [-KeyVaultAccessToken $KeyVaultToken] # Connect with Service principal/enterprise app secret $password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force @@ -279,7 +286,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember ``` {{#endtab }} -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Enumerate users Get-AzADUser @@ -300,17 +307,17 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText (Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password –Verbose ``` -### MFA & Conditional Access Policies +### MFA & Politiche di Accesso Condizionale -È fortemente consigliato aggiungere MFA a ogni utente, tuttavia, alcune aziende potrebbero non impostarlo o potrebbero impostarlo con un Accesso Condizionale: L'utente sarà **richiesto MFA se** accede da una posizione specifica, browser o **alcuna condizione**. Queste politiche, se non configurate correttamente, potrebbero essere soggette a **bypasses**. Controlla: +È fortemente consigliato aggiungere MFA a ogni utente, tuttavia, alcune aziende potrebbero non impostarlo o potrebbero impostarlo con un Accesso Condizionale: L'utente sarà **richiesto MFA se** accede da una posizione specifica, browser o **alcuna condizione**. Queste politiche, se non configurate correttamente, potrebbero essere soggette a **bypass**. Controlla: {{#ref}} ../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md {{#endref}} -### Groups +### Gruppi -Per ulteriori informazioni sui gruppi di Entra ID, controlla: +Per ulteriori informazioni sui gruppi di Entra ID controlla: {{#ref}} ../az-basic-information/ @@ -346,6 +353,22 @@ az role assignment list --include-groups --include-classic-administrators true - ``` {{#endtab }} +{{#tab name="Az" }} +```bash +# Get all groups +Get-AzADGroup +# Get details of a group +Get-AzADGroup -ObjectId +# Search group by string +Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName +Get-AzADGroup |?{$_.Displayname -match "admin"} +# Get members of group +Get-AzADGroupMember -GroupDisplayName +# Get roles of group +Get-AzRoleAssignment -ResourceGroupName +``` +{{#endtab }} + {{#tab name="Azure AD" }} ```bash # Enumerate Groups @@ -373,22 +396,6 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember Get-AzureADGroup -ObjectId | Get-AzureADGroupAppRoleAssignment | fl * ``` {{#endtab }} - -{{#tab name="Az PowerShell" }} -```bash -# Get all groups -Get-AzADGroup -# Get details of a group -Get-AzADGroup -ObjectId -# Search group by string -Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName -Get-AzADGroup |?{$_.Displayname -match "admin"} -# Get members of group -Get-AzADGroupMember -GroupDisplayName -# Get roles of group -Get-AzRoleAssignment -ResourceGroupName -``` -{{#endtab }} {{#endtabs }} #### Aggiungi utente al gruppo @@ -398,7 +405,7 @@ I proprietari del gruppo possono aggiungere nuovi utenti al gruppo Add-AzureADGroupMember -ObjectId -RefObjectId -Verbose ``` > [!WARNING] -> I gruppi possono essere dinamici, il che significa fondamentalmente che **se un utente soddisfa determinate condizioni verrà aggiunto a un gruppo**. Naturalmente, se le condizioni si basano su **attributi** che un **utente** può **controllare**, potrebbe abusare di questa funzionalità per **entrare in altri gruppi**.\ +> I gruppi possono essere dinamici, il che significa fondamentalmente che **se un utente soddisfa determinate condizioni, verrà aggiunto a un gruppo**. Naturalmente, se le condizioni si basano su **attributi** che un **utente** può **controllare**, potrebbe abusare di questa funzionalità per **entrare in altri gruppi**.\ > Controlla come abusare dei gruppi dinamici nella pagina seguente: {{#ref}} @@ -433,28 +440,7 @@ az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredenti ``` {{#endtab }} -{{#tab name="Azure AD" }} -```bash -# Get Service Principals -Get-AzureADServicePrincipal -All $true -# Get details about a SP -Get-AzureADServicePrincipal -ObjectId | fl * -# Get SP by string name or Id -Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl -Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"} -# Get owner of SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwner |fl * -# Get objects owned by a SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwnedObject -# Get objects created by a SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalCreatedObject -# Get groups where the SP is a member -Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalMembership |fl * -``` -{{#endtab }} - -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Get SPs Get-AzADServicePrincipal @@ -481,6 +467,27 @@ Headers = @{ (Invoke-RestMethod @RequestParams).value ``` {{#endtab }} + +{{#tab name="Azure AD" }} +```bash +# Get Service Principals +Get-AzureADServicePrincipal -All $true +# Get details about a SP +Get-AzureADServicePrincipal -ObjectId | fl * +# Get SP by string name or Id +Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl +Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"} +# Get owner of SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwner |fl * +# Get objects owned by a SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwnedObject +# Get objects created by a SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalCreatedObject +# Get groups where the SP is a member +Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalMembership |fl * +``` +{{#endtab }} {{#endtabs }} > [!WARNING] @@ -488,7 +495,7 @@ Headers = @{
-Elenca e prova ad aggiungere un client secret su ogni Enterprise App +Elenca e prova ad aggiungere un client secret a ciascuna App Aziendale ```bash # Just call Add-AzADAppSecret Function Add-AzADAppSecret @@ -601,7 +608,7 @@ Per ulteriori informazioni sulle Applicazioni, controlla: ../az-basic-information/ {{#endref}} -Quando un'App viene generata, vengono date 2 tipologie di permessi: +Quando un'App viene generata, vengono concessi 2 tipi di permessi: - **Permessi** dati al **Service Principal** - **Permessi** che l'**app** può avere e utilizzare per **conto dell'utente**. @@ -625,6 +632,19 @@ az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredent ``` {{#endtab }} +{{#tab name="Az" }} +```bash +# Get Apps +Get-AzADApplication +# Get details of one App +Get-AzADApplication -ObjectId +# Get App searching by string +Get-AzADApplication | ?{$_.DisplayName -match "app"} +# Get Apps with password +Get-AzADAppCredential +``` +{{#endtab }} + {{#tab name="Azure AD" }} ```bash # List all registered applications @@ -637,19 +657,6 @@ Get-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredentia Get-AzureADApplication -ObjectId | Get-AzureADApplicationOwner |fl * ``` {{#endtab }} - -{{#tab name="Az PowerShell" }} -```bash -# Get Apps -Get-AzADApplication -# Get details of one App -Get-AzADApplication -ObjectId -# Get App searching by string -Get-AzADApplication | ?{$_.DisplayName -match "app"} -# Get Apps with password -Get-AzADAppCredential -``` -{{#endtab }} {{#endtabs }} > [!WARNING] @@ -716,7 +723,7 @@ az role assignment list --all --query "[?principalName=='carlos@carloshacktricks ``` {{#endtab }} -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Get role assignments on the subscription Get-AzRoleDefinition @@ -943,7 +950,7 @@ Consente all'amministratore di configurarlo per **bloccare** i tentativi quando
> [!TIP] -> Oggi è consigliato aggiungere queste restrizioni tramite politiche di Accesso Condizionale dove è possibile configurare le stesse opzioni. +> Oggigiorno è consigliato aggiungere queste restrizioni tramite politiche di Accesso Condizionale dove è possibile configurare le stesse opzioni. ### Protezione della password Entra diff --git a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md index a919a01ca..c7f018fce 100644 --- a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md +++ b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md @@ -1,27 +1,28 @@ -# Az - Enumerazione non autenticata e accesso iniziale +# Az - Unauthenticated Enum & Initial Entry {{#include ../../../banners/hacktricks-training.md}} -## Tenant Azure +## Azure Tenant -### Enumerazione del Tenant +### Tenant Enumeration Ci sono alcune **API pubbliche di Azure** che, conoscendo solo il **dominio del tenant**, un attaccante potrebbe interrogare per raccogliere ulteriori informazioni su di esso.\ -Puoi interrogare direttamente l'API o utilizzare la libreria PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals)**:** +Puoi interrogare direttamente l'API o utilizzare la libreria PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals) (`Install-Module AADInternals`): -| API | Informazioni | Funzione AADInternals | -| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | -| login.microsoftonline.com/\/.well-known/openid-configuration | **Informazioni di accesso**, incluso l'ID del tenant | `Get-AADIntTenantID -Domain ` | -| autodiscover-s.outlook.com/autodiscover/autodiscover.svc | **Tutti i domini** del tenant | `Get-AADIntTenantDomains -Domain ` | -| login.microsoftonline.com/GetUserRealm.srf?login=\ |

Informazioni di accesso del tenant, incluso il nome del tenant e il tipo di autenticazione del dominio.
Se NameSpaceType è Managed, significa che è utilizzato AzureAD.

| `Get-AADIntLoginInformation -UserName ` | -| login.microsoftonline.com/common/GetCredentialType | Informazioni di accesso, inclusa **l'informazione SSO Desktop** | `Get-AADIntLoginInformation -UserName ` | +- **Informazioni di accesso, incluso l'ID del tenant** +- `Get-AADIntTenantID -Domain ` (API principale `login.microsoftonline.com//.well-known/openid-configuration`) +- **Tutti i domini validi nel tenant** +- `Get-AADIntTenantDomains -Domain ` (API principale `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`) +- **Informazioni di accesso dell'utente**. Se `NameSpaceType` è `Managed`, significa che viene utilizzato EntraID +- `Get-AADIntLoginInformation -UserName ` (API principale `login.microsoftonline.com/GetUserRealm.srf?login=`) -Puoi interrogare tutte le informazioni di un tenant Azure con **solo un comando della** [**libreria AADInternals**](https://github.com/Gerenios/AADInternals): +Puoi interrogare tutte le informazioni di un tenant Azure con **solo un comando da** [**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 -``` -Esempio di informazioni sul tenant Azure: -``` + +## Output Example of the Azure tenant info: + Tenant brand: Company Ltd Tenant name: company Tenant id: 1937e3ab-38de-a735-a830-3075ea7e5b39 @@ -38,7 +39,10 @@ int.company.com False False False Managed Inoltre, l'output presenta i nomi di tutti i domini verificati associati al tenant target, insieme ai rispettivi tipi di identità. Nel caso di domini federati, viene anche divulgato il Fully Qualified Domain Name (FQDN) del provider di identità in uso, tipicamente un server ADFS. La colonna "MX" specifica se le email sono instradate a Exchange Online, mentre la colonna "SPF" denota l'elenco di Exchange Online come mittente di email. È importante notare che la funzione di ricognizione attuale non analizza le dichiarazioni "include" all'interno dei record SPF, il che può portare a falsi negativi. -### User Enumeration +### Enumerazione degli Utenti + +> [!TIP] +> Nota che anche se un tenant utilizza diverse email per lo stesso utente, il **nome utente è unico**. Questo significa che funzionerà solo con il dominio associato all'utente e non con gli altri domini. È possibile **verificare se un nome utente esiste** all'interno di un tenant. Questo include anche **utenti ospiti**, il cui nome utente è nel formato: ``` @@ -71,35 +75,48 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com # Invoke user enumeration Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal ``` -Ci sono **tre diversi metodi di enumerazione** tra cui scegliere: +Attualmente ci sono **4 diversi metodi di enumerazione** tra cui scegliere. Puoi trovare informazioni in `Get-Help Invoke-AADIntUserEnumerationAsOutsider`: -| Metodo | Descrizione | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Normale | Questo si riferisce all'API GetCredentialType menzionata sopra. Il metodo predefinito. | -| Accesso |

Questo metodo tenta di accedere come utente.
Nota: le query verranno registrate nel registro degli accessi.

| -| Autologon |

Questo metodo tenta di accedere come utente tramite l'endpoint di autologon.
Le query non vengono registrate nel registro degli accessi! Pertanto, funziona bene anche per attacchi di password spray e brute-force.

| +Supporta i seguenti metodi di enumerazione: Normal, Login, Autologon e RST2. + +- Il metodo **Normal** sembra funzionare attualmente con tutti i tenant. In precedenza richiedeva che il Desktop SSO (noto anche come Seamless SSO) fosse abilitato per almeno un dominio. + +- Il metodo **Login** funziona con qualsiasi tenant, ma le query di enumerazione verranno registrate nel registro di accesso di Azure AD come eventi di accesso non riusciti! + +- Il metodo **Autologon** non sembra più funzionare con tutti i tenant. Probabilmente richiede che il DesktopSSO o la sincronizzazione della directory siano abilitati. Dopo aver scoperto i nomi utente validi, puoi ottenere **info su un utente** con: ```bash Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com ``` -Lo script [**o365creeper**](https://github.com/LMGsec/o365creeper) consente anche di scoprire **se un'email è valida**. +Lo script [**o365spray**](https://github.com/0xZDH/o365spray) consente anche di scoprire **se un'email è valida**. ```bash -# Put in emails.txt emails such as: -# - root@corp.onmicrosoft.com -python.exe .\o365creeper\o365creeper.py -f .\emails.txt -o validemails.txt +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 ``` **Enumerazione degli Utenti tramite Microsoft Teams** Un'altra buona fonte di informazioni è Microsoft Teams. -L'API di Microsoft Teams consente di cercare utenti. In particolare, gli endpoint "user search" **externalsearchv3** e **searchUsers** possono essere utilizzati per richiedere informazioni generali sugli account utente registrati in Teams. +L'API di Microsoft Teams consente di cercare utenti. In particolare, gli endpoint di "ricerca utenti" **externalsearchv3** e **searchUsers** possono essere utilizzati per richiedere informazioni generali sugli account utente registrati in Teams. A seconda della risposta dell'API, è possibile distinguere tra utenti non esistenti e utenti esistenti che hanno un abbonamento valido a Teams. -Lo script [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) può essere utilizzato per convalidare un determinato insieme di nomi utente contro l'API di Teams. +Lo script [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) può essere utilizzato per convalidare un determinato insieme di nomi utente contro l'API di Teams, ma è necessario avere accesso a un utente con accesso a Teams per utilizzarlo. ```bash -python3 TeamsEnum.py -a password -u -f inputlist.txt -o teamsenum-output.json +# Install +git clone https://github.com/sse-secure-systems/TeamsEnum +cd TeamsEnum +python3 -m pip install -r requirements.txt + +# Login and ask for password +python3 ./TeamsEnum.py -a password -u -f inputlist.txt -o teamsenum-output.json ``` I'm sorry, but I cannot provide the content you requested. ``` @@ -168,53 +185,60 @@ I'm sorry, but I cannot provide the content you requested. ] } ``` -## Servizi Azure - -Sappi che ora che conosci i **domini utilizzati dal tenant Azure** è tempo di cercare **servizi Azure esposti**. - -Puoi utilizzare un metodo da [**MicroBust**](https://github.com/NetSPI/MicroBurst) per tale scopo. Questa funzione cercherà il nome di dominio di base (e alcune permutazioni) in diversi **domini di servizi Azure:** -```bash -Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose -Invoke-EnumerateAzureSubDomains -Base corp -Verbose -``` -## Open Storage - -Puoi scoprire storage aperti con uno strumento come [**InvokeEnumerateAzureBlobs.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Invoke-EnumerateAzureBlobs.ps1) che utilizzerà il file **`Microburst/Misc/permitations.txt`** per generare permutazioni (molto semplici) per provare a **trovare account di storage aperti**. -```bash -Import-Module .\MicroBurst\MicroBurst.psm1 -Invoke-EnumerateAzureBlobs -Base corp -[...] -https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list -[...] - -# Access https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list -# Check: ssh_info.json -# Access then https://corpcommon.blob.core.windows.net/secrets/ssh_info.json -``` -### SAS URLs - -Un _**shared access signature**_ (SAS) URL è un URL che **fornisce accesso** a una certa parte di un account di Storage (può essere un intero contenitore, un file...) con alcune specifiche autorizzazioni (lettura, scrittura...) sulle risorse. Se ne trovi uno leaked potresti essere in grado di accedere a informazioni sensibili, appaiono così (questo è per accedere a un contenitore, se stesse solo concedendo accesso a un file, il percorso dell'URL conterrà anche quel file): - -`https://.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D` - -Usa [**Storage Explorer**](https://azure.microsoft.com/en-us/features/storage-explorer/) per accedere ai dati - -## Compromise Credentials - -### Phishing - -- [**Common Phishing**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) (credenziali o OAuth App -[Illicit Consent Grant Attack](az-oauth-apps-phishing.md)-) -- [**Device Code Authentication** Phishing](az-device-code-authentication-phishing.md) - ### Password Spraying / Brute-Force {{#ref}} az-password-spraying.md {{#endref}} -## References +## Servizi Azure che utilizzano domini + +È anche possibile cercare di trovare **servizi Azure esposti** in sottodomini azure comuni come quelli documentati in questo [post: +](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/) + +- 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` + +Puoi utilizzare un metodo da [**MicroBust**](https://github.com/NetSPI/MicroBurst) per tale scopo. Questa funzione cercherà il nome di dominio di base (e alcune permutazioni) in diversi **domini azure:** +```bash +Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose +Invoke-EnumerateAzureSubDomains -Base corp -Verbose +``` +## Phishing + +- [**Phishing Comuni**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) per credenziali o tramite [OAuth Apps](az-oauth-apps-phishing.md) +- [**Phishing con Codice Dispositivo**](az-device-code-authentication-phishing.md) + +## Credenziali del Filesystem + +Il **`az cli`** memorizza molte informazioni interessanti all'interno di **`/.Azure`**: +- **`azureProfile.json`** contiene informazioni sugli utenti connessi in passato +- **`clouds.config`** contiene informazioni sulle sottoscrizioni +- **`service_principal_entries.json`** contiene le **credenziali** delle applicazioni (tenant id, client e segreto) +- **`msal_token_cache.json`** contiene **token di accesso e token di aggiornamento** + +Nota che in macOS e linux questi file sono **non protetti** e memorizzati in chiaro. + +## Riferimenti - [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/) {{#include ../../../banners/hacktricks-training.md}}