# Azure Pentesting

{{#include ../../banners/hacktricks-training.md}}

## Informazioni di base

Impara le basi di Azure e Entra ID nella seguente pagina:

{{#ref}}
az-basic-information/
{{#endref}}

## Metodologia di Pentesting/Red Team di Azure

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 un **foothold**.

### Enumerazione esterna e accesso iniziale

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 seguente pagina per imparare come eseguire l'**enumerazione esterna**:

{{#ref}}
az-unauthenticated-enum-and-initial-entry/
{{#endref}}

Con queste informazioni, i modi più comuni per cercare di ottenere un foothold sono:
- **OSINT**: Controlla eventuali **leaks** su Github o su 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 autenticazione a 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/)
- **Altre misconfigurazioni dei servizi Azure**
- Se un laptop di uno sviluppatore è compromesso ([WinPEAS e LinPEAS](https://github.com/peass-ng/PEASS-ng) possono trovare queste informazioni):
- All'interno di **`<HOME>/.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)
- All'interno di **`C:\Users\<username>\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\<username>\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 `$HOME/.local/share/.IdentityService/` esiste (anche se i file contenuti sono vuoti e inutili)

Trova **altre misconfigurazioni dei servizi Azure** che possono portare a un foothold nella seguente pagina:

{{#ref}}
az-unauthenticated-enum-and-initial-entry/
{{#endref}}

> [!NOTE]
> Ricorda che di solito la parte **più rumorosa** dell'enumerazione è il **login**, non l'enumerazione stessa.

### Strumenti Azure & Entra ID

I seguenti strumenti saranno molto utili per enumerare sia i tenant di Entra ID che gli ambienti Azure lentamente (per evitare il rilevamento) o automaticamente (per risparmiare tempo):

{{#ref}}
az-enumeration-tools.md
{{#endref}}

### Bypass delle politiche di accesso

<figure><img src="../../images/image (268).png" alt=""><figcaption></figcaption></figure>

Nei casi in cui hai alcune credenziali valide ma non puoi accedere, 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 è 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.

Controlla:

{{#ref}}
az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
{{#endref}}

### Whoami

> [!CAUTION]
> Impara **come installare** az cli, AzureAD e Az PowerShell nella sezione [**Az - Entra ID**](az-services/az-azuread.md).

Una delle prime cose che devi sapere è **chi sei** (in quale ambiente ti trovi):

{{#tabs }}
{{#tab name="az cli" }}
```bash
az account list
az account tenant list # Current tenant info
az account subscription list # Current subscription info
az ad signed-in-user show # Current signed-in user
az ad signed-in-user list-owned-objects # Get owned objects by current user
az account management-group list #Not allowed by default
```
{{#endtab }}

{{#tab name="Az" }}
```bash
# Get the information about the current context (Account, Tenant, Subscription etc.)
Get-AzContext
# List all available contexts
Get-AzContext -ListAvailable
# Enumerate subscriptions accessible by the current user
Get-AzSubscription
#Get Resource group
Get-AzResourceGroup
```
{{#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 }}


### Enumerazione di Entra ID e Privesc

Per impostazione predefinita, qualsiasi utente dovrebbe avere **sufficienti permessi per enumerare** cose come utenti, gruppi, ruoli, service principals... (controlla [permessi predefiniti di AzureAD](az-basic-information/index.html#default-user-permissions)).\
Puoi trovare qui una guida:

{{#ref}}
az-services/az-azuread.md
{{#endref}}

Controlla gli **strumenti di Post-Exploitation** per trovare strumenti per elevare i privilegi in Entra ID come **AzureHound:**

{{#ref}}
az-enumeration-tools.md#automated-post-exploitation-tools
{{#endref}}


### Enumerazione di Azure

Una volta che sai chi sei, puoi iniziare a enumerare i **servizi Azure a cui hai accesso**.

Dovresti iniziare a scoprire i **permessi che hai** sulle risorse. Per questo:

1. **Trova la risorsa a cui hai accesso**:

> [!TIP]
> Questo non richiede alcun permesso speciale.

Il comando Az PowerShell **`Get-AzResource`** ti consente di **conoscere le risorse su cui il tuo utente attuale ha visibilità**.

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:
```bash
az rest --method GET --url "https://management.azure.com/subscriptions/<subscription-id>/resources?api-version=2021-04-01"
```
2. **Trova i permessi che hai sulle risorse che puoi vedere**:

> [!TIP]
> Questo non richiede alcun permesso speciale.

Parlando con l'API **`https://management.azure.com/{resource_id}/providers/Microsoft.Authorization/permissions?api-version=2022-04-01`**, puoi ottenere i permessi che hai sulla risorsa specificata in **`resource_id`**.

Pertanto, **controllando ciascuna delle risorse a cui hai accesso**, puoi ottenere i permessi che hai su di esse.

> [!WARNING]
> Puoi automatizzare questa enumerazione utilizzando lo strumento **[Find_My_Az_Management_Permissions](https://github.com/carlospolop/Find_My_Az_Management_Permissions)**.


<details>
<summary>Enumerare i permessi con **`Microsoft.Authorization/roleAssignments/read`**</summary>

> [!TIP]
> Nota che hai bisogno del permesso **`Microsoft.Authorization/roleAssignments/read`** per eseguire questa azione.

- Con permessi sufficienti, il ruolo **`Get-AzRoleAssignment`** può essere utilizzato per **enumerare tutti i ruoli** nell'abbonamento o il permesso su una risorsa specifica indicandola come in:
```bash
Get-AzRoleAssignment -Scope /subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.RecoveryServices/vaults/vault-m3ww8ut4
```
È anche possibile ottenere queste informazioni eseguendo:
```bash
az rest --method GET --uri "https://management.azure.com/<Scope>/providers/Microsoft.Authorization/roleAssignments?api-version=2022-04-01" | jq ".value"
```
come in:
```bash
az rest --method GET --uri "https://management.azure.com//subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.KeyVault/vaults/vault-m3ww8ut4/providers/Microsoft.Authorization/roleAssignments?api-version=2022-04-01" | jq ".value"
```
- Un'altra opzione è **ottenere i ruoli a te assegnati in azure**. Questo richiede anche il permesso **`Microsoft.Authorization/roleAssignments/read`**:
```bash
az role assignment list --assignee "<email>" --all --output table
```
O eseguendo quanto segue (se i risultati sono vuoti, potrebbe essere perché non hai il permesso di ottenerli):
```bash
az rest --method GET --uri 'https://management.azure.com/subscriptions/<subscription-id>/providers/Microsoft.Authorization/roleAssignments?api-version=2022-04-01&$filter=principalId eq '<user-id>'
```
- **Trova i permessi granulari dei ruoli a te associati**:

Poi, per ottenere il permesso granulare puoi eseguire **`(Get-AzRoleDefinition -Id "<RoleDefinitionId>").Actions`**.

Oppure chiama direttamente l'API con
```bash
az rest --method GET --uri "https://management.azure.com//subscriptions/<subscription-id>/providers/Microsoft.Authorization/roleDefinitions/<RoleDefinitionId>?api-version=2022-04-01" | jq ".properties"
```
</details>

Nella seguente sezione puoi trovare **informazioni sui servizi Azure più comuni e su come enumerarli**:

{{#ref}}
az-services/
{{#endref}}

### Escalation dei privilegi, Post-Exploitation & Persistenza

Una volta che conosci come è strutturato l'ambiente Azure e quali servizi vengono utilizzati, puoi iniziare a cercare modi per **escalare i privilegi, muoverti lateralmente, eseguire altri attacchi post-exploitation e mantenere la persistenza**.

Nella seguente sezione 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 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}}
