# Az - Politiche di Accesso Condizionale e Bypass MFA

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

## Informazioni di Base

Le politiche di accesso condizionale di Azure sono regole impostate in Microsoft Azure per applicare controlli di accesso ai servizi e alle applicazioni Azure in base a determinate **condizioni**. Queste politiche aiutano le organizzazioni a proteggere le loro risorse applicando i giusti controlli di accesso nelle giuste circostanze.\
Le politiche di accesso condizionale **definiscono** **Chi** può accedere a **Cosa** da **Dove** e **Come**.

Ecco un paio di esempi:

1. **Politica di Rischio di Accesso**: Questa politica potrebbe essere impostata per richiedere l'autenticazione a più fattori (MFA) quando viene rilevato un rischio di accesso. Ad esempio, se il comportamento di accesso di un utente è insolito rispetto al loro modello regolare, come accedere da un paese diverso, il sistema può richiedere un'autenticazione aggiuntiva.
2. **Politica di Conformità del Dispositivo**: Questa politica può limitare l'accesso ai servizi Azure solo ai dispositivi che sono conformi agli standard di sicurezza dell'organizzazione. Ad esempio, l'accesso potrebbe essere consentito solo da dispositivi che hanno software antivirus aggiornato o che eseguono una certa versione del sistema operativo.

## Enumerazione
```bash
# Get all the policies from Azure without needing any special permission with (idea from https://github.com/LuemmelSec/APEX/blob/main/APEX.ps1)
az rest --method GET --uri 'https://graph.windows.net/<tenant-id>/policies?api-version=1.61-internal' | jq '.value[] | select(.policyType == 18) | {displayName, policyDetail: (.policyDetail[] | fromjson)}'

# You need Policy.Read.ConditionalAccess or Policy.Read.All permission in Entra ID
az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditionalAccess/policies"
```
## Bypass delle Politiche di Accesso Condizionale

È possibile che una politica di accesso condizionale **verifichi alcune informazioni che possono essere facilmente manomesse, consentendo un bypass della politica**. E se, ad esempio, la politica configurasse MFA, l'attaccante sarà in grado di bypassarla.

Quando si configura una politica di accesso condizionale, è necessario indicare gli **utenti** interessati e le **risorse target** (come tutte le app cloud).

È anche necessario configurare le **condizioni** che attiveranno la politica:

- **Rete**: IP, intervalli IP e posizioni geografiche
- Può essere bypassata utilizzando una VPN o un Proxy per connettersi a un paese o riuscendo a effettuare il login da un indirizzo IP consentito
- **Rischi Microsoft**: Rischio utente, Rischio di accesso, Rischio interno
- **Piattaforme dei dispositivi**: Qualsiasi dispositivo o selezionare Android, iOS, Windows phone, Windows, macOS, Linux
- Se “Qualsiasi dispositivo” non è selezionato ma tutte le altre opzioni sono selezionate, è possibile bypassarlo utilizzando un user-agent casuale non correlato a quelle piattaforme
- **App client**: Le opzioni sono “Browser”, “App mobili e client desktop”, “Client Exchange ActiveSync” e “Altri client”
- Per bypassare il login con un'opzione non selezionata
- **Filtro per dispositivi**: È possibile generare una regola relativa al dispositivo utilizzato
- **Flussi di autenticazione**: Le opzioni sono “Flusso di codice dispositivo” e “Trasferimento di autenticazione”
- Questo non influenzerà un attaccante a meno che non stia cercando di abusare di uno di questi protocolli in un tentativo di phishing per accedere all'account della vittima

I possibili **risultati** sono: Blocca o Consenti accesso con condizioni potenziali come richiedere MFA, dispositivo conforme…

### Piattaforme dei Dispositivi - Condizione del Dispositivo

È possibile impostare una condizione basata sulla **piattaforma del dispositivo** (Android, iOS, Windows, macOS...), tuttavia, questo si basa sull'**user-agent** quindi è facile da bypassare. Anche **rendendo tutte le opzioni obbligatorie per MFA**, se utilizzi un **user-agent che non è riconosciuto,** sarai in grado di bypassare la MFA o il blocco:

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

Basta far sì che il browser **invi un user-agent sconosciuto** (come `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`) è sufficiente per non attivare questa condizione.\
Puoi cambiare manualmente l'user agent negli strumenti per sviluppatori:

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

Oppure utilizzare un [browser extension come questa](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).

### Località: Paesi, Intervalli IP - Condizione del Dispositivo

Se questo è impostato nella politica condizionale, un attaccante potrebbe semplicemente utilizzare una **VPN** nel **paese consentito** o cercare di trovare un modo per accedere da un **indirizzo IP consentito** per bypassare queste condizioni.

### App Cloud

È possibile configurare **politiche di accesso condizionale per bloccare o forzare** ad esempio MFA quando un utente cerca di accedere a una **app specifica**:

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

Per cercare di bypassare questa protezione dovresti vedere se puoi **accedere solo a qualsiasi applicazione**.\
Lo strumento [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) ha **decine di ID applicazione hardcoded** e cercherà di effettuare il login in essi e ti informerà e ti darà anche il token se ha successo.

Per **testare ID applicazione specifici in risorse specifiche** potresti anche utilizzare uno strumento come:
```bash
roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4-4aaf-ab1b-5451cc387264 --tokens-stdout

<token>
```
Inoltre, è possibile proteggere anche il metodo di accesso (ad esempio, se si sta tentando di accedere dal browser o da un'applicazione desktop). Lo strumento [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep) esegue alcuni controlli per cercare di bypassare queste protezioni.

Lo strumento [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) potrebbe essere utilizzato per scopi simili, anche se sembra non essere mantenuto.

Lo strumento [**ROPCI**](https://github.com/wunderwuzzi23/ropci) può essere utilizzato per testare queste protezioni e vedere se è possibile bypassare le MFA o i blocchi, ma questo strumento funziona da una prospettiva **whitebox**. È necessario prima scaricare l'elenco delle app consentite nel tenant e poi tenterà di accedervi.

## Altri Bypass MFA di Az

### Suoneria

Una delle opzioni MFA di Azure è **ricevere una chiamata al numero di telefono configurato** dove verrà chiesto all'utente di **inviare il carattere `#`**.

> [!CAUTION]
> Poiché i caratteri sono solo **toni**, un attaccante potrebbe **compromettere** il messaggio della **segreteria telefonica** del numero di telefono, configurando come messaggio il **tono di `#`** e poi, quando richiede la MFA, assicurarsi che il **telefono della vittima sia occupato** (chiamandolo) in modo che la chiamata di Azure venga reindirizzata alla segreteria telefonica.

### Dispositivi Conformi

Le politiche spesso richiedono un dispositivo conforme o MFA, quindi un **attaccante potrebbe registrare un dispositivo conforme**, ottenere un **token PRT** e **bypassare in questo modo la MFA**.

Inizia registrando un **dispositivo conforme in Intune**, poi **ottieni il PRT** con:
```bash
$prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\<uuid>.pfx -Credentials $credentials

$prtToken = New-AADIntUserPRTToken -Settings $prtKeys -GertNonce

Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken

<token returned>
```
Trova ulteriori informazioni su questo tipo di attacco nella seguente pagina:

{{#ref}}
../../az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md
{{#endref}}

## Strumenti

### [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)

Questo script ottiene alcune credenziali utente e verifica se può accedere ad alcune applicazioni.

Questo è utile per vedere se **non è richiesta MFA per accedere ad alcune applicazioni** che potresti successivamente sfruttare per **escalare i privilegi**.

### [roadrecon](https://github.com/dirkjanm/ROADtools)

Ottieni tutte le politiche
```bash
roadrecon plugin policies
```
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)

MFASweep è uno script PowerShell che tenta di **accedere a vari servizi Microsoft utilizzando un set di credenziali fornito e cercherà di identificare se MFA è abilitato**. A seconda di come sono configurate le politiche di accesso condizionale e altre impostazioni di autenticazione a più fattori, alcuni protocolli potrebbero rimanere a fattore singolo. Ha anche un controllo aggiuntivo per le configurazioni ADFS e può tentare di accedere al server ADFS on-prem se rilevato.
```bash
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
Invoke-MFASweep -Username <username> -Password <pass>
```
### [ROPCI](https://github.com/wunderwuzzi23/ropci)

Questo strumento ha aiutato a identificare bypass di MFA e poi ad abusare delle API in più tenant AAD di produzione, dove i clienti AAD credevano di avere MFA applicato, ma l'autenticazione basata su ROPC ha avuto successo.

> [!TIP]
> È necessario avere i permessi per elencare tutte le applicazioni per poter generare l'elenco delle app da forzare.
```bash
./ropci configure
./ropci apps list --all --format json -o apps.json
./ropci apps list --all --format json | jq -r '.value[] | [.displayName,.appId] | @csv' > apps.csv
./ropci auth bulk -i apps.csv -o results.json
```
### [donkeytoken](https://github.com/silverhack/donkeytoken)

Donkey token è un insieme di funzioni che mirano ad aiutare i consulenti di sicurezza che devono convalidare le Politiche di Accesso Condizionale, test per portali Microsoft abilitati per 2FA, ecc..

<pre class="language-powershell"><code class="lang-powershell"><strong>git clone https://github.com/silverhack/donkeytoken.git
</strong><strong>Import-Module '.\donkeytoken' -Force
</strong></code></pre>

**Testa ogni portale** se è possibile **accedere senza MFA**:
```bash
$username = "conditional-access-app-user@azure.training.hacktricks.xyz"
$password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
```
Poiché il **portale** **Azure** **non è vincolato**, è possibile **raccogliere un token dall'endpoint del portale per accedere a qualsiasi servizio rilevato** dall'esecuzione precedente. In questo caso è stato identificato Sharepoint, e viene richiesto un token per accedervi:
```bash
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
Read-JWTtoken -token $token.access_token
```
Supponendo che il token abbia il permesso Sites.Read.All (da Sharepoint), anche se non puoi accedere a Sharepoint dal web a causa di MFA, è possibile utilizzare il token per accedere ai file con il token generato:
```bash
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl
```
## Riferimenti

- [https://www.youtube.com/watch?v=yOJ6yB9anZM\&t=296s](https://www.youtube.com/watch?v=yOJ6yB9anZM&t=296s)
- [https://www.youtube.com/watch?v=xei8lAPitX8](https://www.youtube.com/watch?v=xei8lAPitX8)

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