# Az - Conditional Access Policies & MFA Bypass

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

## Informazioni di base

Le Azure Conditional Access policies sono regole configurate in Microsoft Azure per applicare controlli di accesso ai servizi e alle applicazioni Azure basati su certe **condizioni**. Queste policy aiutano le organizzazioni a proteggere le loro risorse applicando i controlli di accesso appropriati nelle giuste circostanze.\
Le Conditional Access policies definiscono fondamentalmente **Chi** può accedere a **Cosa** da **Dove** e **Come**.

Ecco un paio di esempi:

1. **Sign-In Risk Policy**: Questa policy può essere configurata per richiedere multi-factor authentication (MFA) quando viene rilevato un rischio di sign-in. Per esempio, se il comportamento di login di un utente è insolito rispetto al suo modello abituale, come l'accesso da un paese diverso, il sistema può richiedere un'autenticazione aggiuntiva.
2. **Device Compliance Policy**: Questa policy può limitare l'accesso ai servizi Azure solo ai dispositivi conformi agli standard di sicurezza dell'organizzazione. Per esempio, l'accesso potrebbe essere consentito solo da dispositivi che hanno 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 Conditional Access Policies

È possibile che una conditional access policy stia **controllando alcune informazioni che possono essere facilmente manomesse permettendo un bypass della policy**. E se per esempio la policy richiedeva MFA, l'attaccante sarà in grado di bypassarla.

Quando si configura una conditional access policy è necessario indicare gli **utenti** interessati e le **risorse target** (come all cloud apps).

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

- **Network**: IP, IP ranges e posizioni geografiche
- Può essere bypassata usando una VPN o un Proxy per connettersi da un paese consentito o riuscendo a effettuare il login da un IP consentito
- **Microsoft risks**: User risk, Sign-in risk, Insider risk
- **Device platforms**: Any device o selezionare Android, iOS, Windows phone, Windows, macOS, Linux
- Se “Any device” non è selezionato ma tutte le altre opzioni lo sono, è possibile bypassarla usando un random user-agent non correlato a quelle piattaforme
- **Client apps**: Le opzioni sono “Browser”, “Mobiles apps and desktop clients”, “Exchange ActiveSync clients” e “Other clients”
- Per bypassare il login usando un'opzione non selezionata
- **Filter for devices**: È possibile generare una regola relativa al dispositivo utilizzato
- **Authentication flows**: Le opzioni sono “Device code flow” e “Authentication transfer”
- Questo non influenzerà un attaccante a meno che non stia cercando di abusare uno di quei protocolli in un tentativo di phishing per accedere all'account della vittima

I possibili **risultati** sono: Block o Grant access con potenziali condizioni come richiedere MFA, dispositivo compliant…

### Piattaforme dispositivo - Condizione del dispositivo

È possibile impostare una condizione basata sulla **device platform** (Android, iOS, Windows, macOS...), tuttavia questo si basa sul **user-agent** quindi è facile da bypassare. Anche **forzando MFA per tutte le opzioni**, se usi un **user-agent che non viene 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`) per non attivare questa condizione.\
Puoi cambiare il user agent **manualmente** negli strumenti di sviluppo:

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

Oppure usare una [browser extension like this one](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).

### Locations: Countries, IP ranges - Device Condition

Se questo è impostato nella conditional policy, un attaccante potrebbe semplicemente usare una **VPN** nel **paese consentito** o cercare un modo per accedere da un **IP consentito** per bypassare queste condizioni.

### Cloud Apps

È possibile configurare **conditional access policies per bloccare o forzare** ad esempio MFA quando un utente tenta di accedere a una **app specifica**:

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

Per tentare di bypassare questa protezione dovresti verificare se puoi effettuare l'accesso a qualsiasi applicazione.\
Lo strumento [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) ha **decine di application IDs hardcoded** e proverà a effettuare il login su di esse, informandoti e dandoti anche il token se ha successo.

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

<token>
```
Moreover, it's also possible to protect the login method (e.g. if you are trying to login from the browser or from a desktop application). The tool [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep) perform some checks to try to bypass this protections also.

The tool [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) could also be used to similar purposes although it looks unmantained.

The tool [**ROPCI**](https://github.com/wunderwuzzi23/ropci) can also be used to test this protections and see if it's possible to bypass MFAs or blocks, but this tool works from a **whitebox** perspective. You first need to download the list of Apps allowed in the tenant and then it will try to login into them.

## Altri Az MFA Bypass

### Suoneria

Un'opzione di Azure MFA è **ricevere una chiamata sul 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, configurare come messaggio il **tono del `#`** e poi, quando richiede l'MFA, assicurarsi che il **telefono della vittima sia occupato** (chiamandolo) in modo che la chiamata Azure venga reindirizzata alla segreteria.

### Dispositivi conformi

Le policy spesso richiedono un dispositivo conforme o MFA, quindi un **attaccante potrebbe registrare un dispositivo conforme**, ottenere un **PRT** e **bypassare in questo modo l'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>
```
Per maggiori informazioni su questo tipo di attacco consulta la 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 raccoglie alcune credenziali utente e verifica se può effettuare il **login** in alcune applicazioni.

Questo è utile per verificare se non ti viene richiesta la **MFA** per effettuare il **login** in alcune applicazioni che potresti poi abusare per **escalate privileges**.

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

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

MFASweep è uno script PowerShell che tenta di **accedere a vari servizi Microsoft usando un insieme di credenziali fornite e cerca di identificare se MFA è abilitato**. A seconda di come sono configurate le conditional access policies e altre impostazioni di autenticazione multi-fattore, alcuni protocolli possono rimanere a singolo fattore. Include inoltre un controllo aggiuntivo per le configurazioni ADFS e può tentare di eseguire il login 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 MFA bypasses e poi ad abusare delle APIs in più tenant AAD di produzione, dove i clienti AAD credevano di avere MFA applicata, ma l'autenticazione basata su ROPC ha avuto successo.

> [!TIP]
> Devi avere i permessi per elencare tutte le applicazioni per poter generare la lista delle app da brute-force.
```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 pensate per aiutare i consulenti di sicurezza che devono convalidare Conditional Access Policies, eseguire test su 2FA-enabled Microsoft portals, 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** per verificare se è possibile effettuare il **login senza MFA**:
```bash
$username = "conditional-access-app-user@azure.hacktricks-training.com"
$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 **Azure** **portal** non è **vincolato**, è possibile **ottenere un token dall'endpoint del portal 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 (di Sharepoint), anche se non puoi accedere a Sharepoint dal web a causa della MFA, è possibile usare 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}}
