diff --git a/src/pentesting-cloud/azure-security/README.md b/src/pentesting-cloud/azure-security/README.md index 708cf216e..b5733957c 100644 --- a/src/pentesting-cloud/azure-security/README.md +++ b/src/pentesting-cloud/azure-security/README.md @@ -4,55 +4,65 @@ ## 基本情報 +以下のページでAzureとEntra IDの基本を学びましょう: + {{#ref}} az-basic-information/ {{#endref}} -## Azure ペンテスター/レッドチームの方法論 +## Azureペンテスター/レッドチームの方法論 -AZURE 環境を監査するためには、どの **サービスが使用されているか**、何が **公開されているか**、誰が **何にアクセスできるか**、内部の Azure サービスと **外部サービス** がどのように接続されているかを知ることが非常に重要です。 +AZURE環境を監査するためには、**どのサービスが使用されているか**、**何が公開されているか**、**誰が何にアクセスできるか**、および内部Azureサービスと**外部サービス**がどのように接続されているかを知ることが非常に重要です。 -レッドチームの観点から、**Azure 環境を侵害するための最初のステップ**は、Azure AD の **資格情報**を取得することです。以下はその方法に関するいくつかのアイデアです: +レッドチームの観点から、**Azure環境を侵害するための最初のステップ**は、いくつかの**足がかり**を得ることです。 -- GitHub(または類似の)での **漏洩** - OSINT -- **ソーシャル** エンジニアリング -- **パスワード** の再利用(パスワード漏洩) -- Azure ホスティングアプリケーションの脆弱性 -- [**サーバーサイドリクエストフォージェリ**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html) メタデータエンドポイントへのアクセス -- **ローカルファイル読み取り** -- `/home/USERNAME/.azure` -- `C:\Users\USERNAME\.azure` -- **`accessTokens.json`** ファイル(az cli 2.30以前 - 2022年1月) - **アクセス トークンを平文で保存** -- **`azureProfile.json`** ファイルには **ログインユーザー** に関する **情報** が含まれています。 -- **`az logout`** はトークンを削除します。 -- 古いバージョンの **`Az PowerShell`** は **アクセス トークン** を **平文** で **`TokenCache.dat`** に保存していました。また、**`AzureRmContext.json`** に **ServicePrincipalSecret** を **平文** で保存します。コマンドレット **`Save-AzContext`** を使用して **トークン** を **保存** できます。\ -`Disconnect-AzAccount` を使用してそれらを削除します。 -- 第三者が **侵害された** -- **内部** 従業員 -- [**一般的なフィッシング**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html)(資格情報または Oauth アプリ) -- [デバイスコード認証フィッシング](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) -- [Azure **パスワードスプレー**](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) +### 外部列挙と初期アクセス -攻撃している Azure テナント内で **ユーザーを侵害していなくても**、そこから **情報を収集** することができます: +最初のステップは、もちろん攻撃しているテナントに関する情報を列挙し、足がかりを得ることです。 + +ドメイン名に基づいて、**会社がAzureを使用しているかどうか**、**テナントID**、同じテナント内の他の**有効なドメイン**(もしあれば)を取得し、SSOが有効かどうか、メール設定、有効なユーザーのメールアドレスなどの**関連情報**を取得することが可能です。 + +以下のページを確認して、**外部列挙**を実行する方法を学びましょう: {{#ref}} az-unauthenticated-enum-and-initial-entry/ {{#endref}} -> [!NOTE] -> 資格情報を取得した後は、その資格情報が **誰のものであるか**、および **何にアクセスできるか** を知る必要があるため、いくつかの基本的な列挙を行う必要があります: - -## 基本的な列挙 +この情報をもとに、足がかりを得るための最も一般的な方法は次のとおりです: +- **OSINT**: GitHubやその他のオープンソースプラットフォームで**漏洩**がないか確認し、**資格情報**や興味深い情報を探します。 +- **パスワード**の再利用、漏洩、または[パスワードスプレー](az-unauthenticated-enum-and-initial-entry/az-password-spraying.md) +- 従業員の資格情報を購入する +- [**一般的なフィッシング**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html)(資格情報またはOauthアプリ) +- [デバイスコード認証フィッシング](az-unauthenticated-enum-and-initial-entry/az-device-code-authentication-phishing.md) +- 第三者の**侵害** +- Azureホストアプリケーションの脆弱性 +- [**サーバーサイドリクエストフォージェリ**](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html)でメタデータエンドポイントにアクセス +- [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/)のような**サブドメインの乗っ取り** +- 開発者のラップトップが侵害されている場合([WinPEASとLinPEAS](https://github.com/peass-ng/PEASS-ng)がこの情報を見つけることができます): +- **`/.Azure`**内 +- **`azureProfile.json`**には過去のログインユーザーに関する情報が含まれています +- **`clouds.config`**にはサブスクリプションに関する情報が含まれています +- **`service_principal_entries.json`**にはアプリケーションの資格情報(テナントID、クライアント、シークレット)が含まれています。LinuxおよびmacOSのみ +- **`msal_token_cache.json`**にはアクセストークンとリフレッシュトークンが含まれています。LinuxおよびmacOSのみ +- **`service_principal_entries.bin`**と**`msal_token_cache.bin`**はWindowsで使用され、DPAPIで暗号化されています +- **`msal_http_cache.bin`**はHTTPリクエストのキャッシュです +- 読み込む:`with open("msal_http_cache.bin", 'rb') as f: pickle.load(f)` +- **`AzureRmContext.json`**にはAz PowerShellを使用した以前のログインに関する情報が含まれています(ただし資格情報は含まれていません) +- **`C:\Users\\AppData\Local\Microsoft\IdentityCache\*`**内には、ユーザーのDPAPIで暗号化された**アクセストークン**、IDトークン、アカウント情報を含むいくつかの`.bin`ファイルがあります。 +- **`C:\Users\\AppData\Local\Microsoft\TokenBroken\Cache\`**内の`.tbres`ファイルにも、DPAPIで暗号化されたアクセストークンを含むbase64が含まれています。 +- LinuxおよびmacOSでは、Az PowerShell(使用されている場合)から**アクセストークン、リフレッシュトークン、IDトークン**を取得できます。コマンドを実行:`pwsh -Command "Save-AzContext -Path /tmp/az-context.json"` +- Windowsでは、これによりIDトークンのみが生成されます。 +- LinuxおよびmacOSでAz PowerShellが使用されたかどうかを確認するには、`$HOME/.local/share/.IdentityService/`が存在するかどうかを確認します(ただし、含まれるファイルは空で無用です)。 > [!NOTE] -> 列挙の **最も騒がしい** 部分は **ログイン** であり、列挙自体ではありません。 +> 通常、列挙の**最も騒がしい**部分は**ログイン**であり、列挙自体ではないことを忘れないでください。 -### SSRF +### Azure & Entra IDツール -Azure 内のマシンで SSRF を見つけた場合は、トリックについてこのページを確認してください: +以下のツールは、検出を避けるためにゆっくり(または自動的に時間を節約するために)Entra IDテナントとAzure環境を列挙するのに非常に役立ちます: {{#ref}} -https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html +az-enumeration-tools.md {{#endref}} ### ログイン条件のバイパス @@ -61,23 +71,19 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-met 有効な資格情報があるがログインできない場合、以下は考えられる一般的な保護です: -- **IP ホワイトリスト** -- 有効な IP を侵害する必要があります -- **地理的制限** -- ユーザーが住んでいる場所や会社のオフィスがある場所を見つけ、同じ都市(または少なくとも同じ国)の IP を取得します -- **ブラウザ** -- 特定の OS(Windows、Linux、Mac、Android、iOS)からのブラウザのみが許可されているかもしれません。被害者/会社が使用している OS を特定します。 -- **サービスプリンシパルの資格情報を侵害する**ことも試みることができます。通常、制限が少なく、ログインがあまりレビューされません。 +- **IPホワイトリスト** -- 有効なIPを侵害する必要があります +- **地理的制限** -- ユーザーの居住地や会社のオフィスの場所を見つけ、同じ都市(または少なくとも国)からIPを取得します +- **ブラウザ** -- 特定のOS(Windows、Linux、Mac、Android、iOS)からのブラウザのみが許可されているかもしれません。犠牲者/会社が使用しているOSを特定します。 +- **サービスプリンシパルの資格情報を侵害する**ことも試みることができます。通常、制限が少なく、ログインのレビューも少ないです。 -バイパスした後、初期設定に戻り、引き続きアクセスできる可能性があります。 - -### サブドメインの乗っ取り - -- [https://godiego.co/posts/STO-Azure/](https://godiego.co/posts/STO-Azure/) +これをバイパスした後、初期設定に戻り、引き続きアクセスできる可能性があります。 ### Whoami > [!CAUTION] -> az cli、AzureAD、および Az PowerShell の **インストール方法** を [**Az - Entra ID**](az-services/az-azuread.md) セクションで学んでください。 +> [**Az - Entra ID**](az-services/az-azuread.md)セクションでaz cli、AzureAD、Az PowerShellの**インストール方法**を学びましょう。 -最初に知っておくべきことは **自分が誰であるか**(どの環境にいるか)です: +最初に知っておくべきことは、**自分が誰であるか**(どの環境にいるか)です: {{#tabs }} {{#tab name="az cli" }} @@ -91,16 +97,7 @@ az account management-group list #Not allowed by default ``` {{#endtab }} -{{#tab name="AzureAD" }} -```bash -#Get the current session state -Get-AzureADCurrentSessionInfo -#Get details of the current tenant -Get-AzureADTenantDetail -``` -{{#endtab }} - -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Get the information about the current context (Account, Tenant, Subscription etc.) Get-AzContext @@ -110,43 +107,79 @@ Get-AzContext -ListAvailable Get-AzSubscription #Get Resource group Get-AzResourceGroup -# Enumerate all resources visible to the current user -Get-AzResource -# Enumerate all Azure RBAC role assignments -Get-AzRoleAssignment # For all users -Get-AzRoleAssignment -SignInName test@corp.onmicrosoft.com # For current user +``` +{{#endtab }} + +{{#tab name="Mg" }} +```bash +#Get the current session +Get-MgContext +``` +{{#endtab }} + +{{#tab name="AzureAD" }} +```bash +#Get the current session state +Get-AzureADCurrentSessionInfo +#Get details of the current tenant +Get-AzureADTenantDetail ``` {{#endtab }} {{#endtabs }} -> [!CAUTION] -> Azureを列挙するための最も重要なコマンドの1つは**`Get-AzResource`**であり、これにより**現在のユーザーが可視性を持つリソースを知ることができます**。 -> -> 同じ情報を**ウェブコンソール**で取得するには、[https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll)にアクセスするか、「すべてのリソース」を検索してください。 -### Entra ID Enumeration +### Entra ID 列挙と特権昇格 -デフォルトでは、任意のユーザーは**ユーザー、グループ、ロール、サービスプリンシパルなどを列挙するのに十分な権限を持っているはずです**([デフォルトのAzureAD権限](az-basic-information/index.html#default-user-permissions)を確認してください)。\ +デフォルトでは、任意のユーザーは **ユーザー、グループ、役割、サービスプリンシパルなどを列挙するのに十分な権限を持つべきです**([デフォルトの AzureAD 権限](az-basic-information/index.html#default-user-permissions)を確認してください)。\ ここにガイドがあります: {{#ref}} az-services/az-azuread.md {{#endref}} -> [!NOTE] -> これで**資格情報に関する情報を持っている**(そして、もしあなたがレッドチームであれば、幸運にも**検出されていないことを願っています**)。環境で使用されているサービスを特定する時が来ました。\ -> 次のセクションでは、**一般的なサービスを列挙する方法**をいくつか確認できます。 +**Post-Exploitation ツール**を確認して、**AzureHound**のような Entra ID で特権を昇格させるためのツールを見つけてください: -## App Service SCM +{{#ref}} +az-enumeration-tools.md#automated-post-exploitation-tools +{{#endref}} -App Service 'コンテナ'にログインするためのKuduコンソール。 -## Webshell +### Azure サービスの列挙 -portal.azure.comを使用してシェルを選択するか、bashまたはpowershell用にshell.azure.comを使用します。このシェルの'disk'は、ストレージアカウント内のイメージファイルとして保存されます。 +自分が誰であるかを知ったら、**アクセスできる Azure サービスを列挙し始めることができます**。 -## Azure DevOps +Az PowerShell コマンド **`Get-AzResource`** を使用すると、**現在のユーザーが可視性を持つリソースを知ることができます**。 -Azure DevOpsはAzureとは別です。リポジトリ、パイプライン(yamlまたはリリース)、ボード、ウィキなどがあります。変数グループは、変数値と秘密を保存するために使用されます。 +さらに、**ウェブコンソール**で同じ情報を取得するには、[https://portal.azure.com/#view/HubsExtension/BrowseAll](https://portal.azure.com/#view/HubsExtension/BrowseAll) にアクセスするか、「すべてのリソース」を検索するか、次のコマンドを実行します: `az rest --method GET --url "https://management.azure.com/subscriptions//resources?api-version=2021-04-01"` + +さらに、十分な権限があれば、役割 **`Get-AzRoleAssignment`** を使用して、サブスクリプション内の **すべての役割を列挙する**ことや、特定のリソースに対する権限を示すことができます。例えば: **`Get-AzRoleAssignment -Scope /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.RecoveryServices/vaults/vault-m3ww8ut4`** + +次のセクションでは、最も一般的な Azure サービスとそれらを列挙する方法についての情報を見つけることができます: + +{{#ref}} +az-services/ +{{#endref}} + +### Azure サービスにおける特権昇格、ポストエクスプロイトおよび持続性 + +Azure 環境の構造と使用されているサービスを理解したら、**特権を昇格させたり、横移動したり、他のポストエクスプロイト攻撃を実行したり、持続性を維持する方法を探し始めることができます**。 + +次のセクションでは、最も一般的な Azure サービスで特権を昇格させる方法についての情報を見つけることができます: + +{{#ref}} +az-privilege-escalation/ +{{#endref}} + +次のセクションでは、最も一般的な Azure サービスでポストエクスプロイト攻撃を実行する方法についての情報を見つけることができます: + +{{#ref}} +az-post-exploitation/ +{{#endref}} + +次のセクションでは、最も一般的な Azure サービスで持続性を維持する方法についての情報を見つけることができます: + +{{#ref}} +az-persistence/ +{{#endref}} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md index 1f0dbc984..281a45dc0 100644 --- a/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md +++ b/src/pentesting-cloud/azure-security/az-basic-information/az-tokens-and-public-applications.md @@ -23,10 +23,10 @@ Entra IDは、Microsoftのクラウドベースのアイデンティティおよ **Microsoft 365統合:** - Microsoft 365はIAMのためにAzure ADを利用し、複数の「ファーストパーティ」OAuthアプリケーションで構成されています。 -- これらのアプリケーションは深く統合されており、相互依存するサービス関係を持っています。 +- これらのアプリケーションは深く統合されており、相互依存のサービス関係を持っています。 - ユーザーエクスペリエンスを簡素化し、機能を維持するために、Microsoftはこれらのファーストパーティアプリケーションに「暗黙の同意」または「事前同意」を付与します。 -- **暗黙の同意:** 特定のアプリケーションは、明示的なユーザーまたは管理者の承認なしに特定のスコープへのアクセスを**自動的に付与されます**。 -- これらの事前同意されたスコープは通常、ユーザーや管理者から隠されており、標準的な管理インターフェースではあまり目立ちません。 +- **暗黙の同意:** 特定のアプリケーションは、明示的なユーザーまたは管理者の承認なしに特定のスコープへのアクセスを自動的に**付与されます**。 +- これらの事前同意されたスコープは通常、ユーザーや管理者から隠されており、標準的な管理インターフェースではあまり目に見えません。 **クライアントアプリケーションの種類:** @@ -43,14 +43,14 @@ Entra IDは、Microsoftのクラウドベースのアイデンティティおよ OIDCで使用される**3種類のトークン**があります: - [**アクセストークン**](https://learn.microsoft.com/en-us/azure/active-directory/develop/access-tokens)**:** クライアントはこのトークンをリソースサーバーに提示して**リソースにアクセス**します。これは特定のユーザー、クライアント、およびリソースの組み合わせにのみ使用でき、**期限切れまで取り消すことはできません** - デフォルトでは1時間です。 -- **IDトークン:** クライアントはこの**トークンを認可サーバーから受け取ります**。ユーザーに関する基本情報が含まれています。これは**特定のユーザーとクライアントの組み合わせに結びついています**。 -- **リフレッシュトークン:** アクセストークンと共にクライアントに提供されます。**新しいアクセストークンとIDトークンを取得するために使用されます**。これは特定のユーザーとクライアントの組み合わせに結びついており、取り消すことができます。非アクティブなリフレッシュトークンのデフォルトの有効期限は**90日**で、アクティブなトークンには**有効期限がありません**(リフレッシュトークンから新しいリフレッシュトークンを取得することが可能です)。 -- リフレッシュトークンは**`aud`**、いくつかの**スコープ**、および**テナント**に結びついており、そのaud、スコープ(それ以上ではなく)およびテナントのためにのみアクセストークンを生成できるべきです。しかし、これは**FOCIアプリケーショントークン**には当てはまりません。 +- **IDトークン:** クライアントはこの**トークンを認可サーバーから受け取ります**。ユーザーに関する基本情報が含まれています。これは**特定のユーザーとクライアントの組み合わせにバインドされています**。 +- **リフレッシュトークン:** アクセストークンと共にクライアントに提供されます。**新しいアクセストークンとIDトークンを取得するために使用されます**。これは特定のユーザーとクライアントの組み合わせにバインドされており、取り消すことができます。非アクティブなリフレッシュトークンのデフォルトの有効期限は**90日**で、アクティブなトークンには**有効期限がありません**(リフレッシュトークンから新しいリフレッシュトークンを取得することが可能です)。 +- リフレッシュトークンは**`aud`**、いくつかの**スコープ**、および**テナント**に結び付けられており、そのaud、スコープ(それ以上ではなく)、およびテナントのためにのみアクセストークンを生成できる必要があります。しかし、これは**FOCIアプリケーショントークン**には当てはまりません。 - リフレッシュトークンは暗号化されており、Microsoftのみがそれを復号化できます。 - 新しいリフレッシュトークンを取得しても、以前のリフレッシュトークンは取り消されません。 > [!WARNING] -> **条件付きアクセス**に関する情報は**JWT**内に**保存**されています。したがって、**許可されたIPアドレス**から**トークンを要求**すると、その**IP**はトークンに**保存**され、その後**許可されていないIPからリソースにアクセスするためにそのトークンを使用できます**。 +> **条件付きアクセス**に関する情報は**JWT**内に**保存**されています。したがって、**許可されたIPアドレス**から**トークンを要求**すると、その**IP**がトークンに**保存**され、そのトークンを使用して**許可されていないIPからリソースにアクセス**できます。 ### アクセストークン "aud" @@ -144,19 +144,31 @@ scopes=["https://graph.microsoft.com/.default"], ) pprint(new_azure_cli_bearer_tokens_for_graph_api) ``` +### その他のアクセストークンフィールド + +- **appid**: トークンを生成するために使用されるアプリケーションID +- **appidacr**: アプリケーション認証コンテキストクラスリファレンスは、クライアントがどのように認証されたかを示します。パブリッククライアントの場合、値は0で、クライアントシークレットが使用される場合、値は1です。 +- **acr**: 認証コンテキストクラスリファレンスクレームは、エンドユーザーの認証がISO/IEC 29115の要件を満たさなかった場合は「0」です。 +- **amr**: 認証方法は、トークンがどのように認証されたかを示します。「pwd」の値は、パスワードが使用されたことを示します。 +- **groups**: プリンシパルがメンバーであるグループを示します。 +- **iss**: 発行者は、トークンを生成したセキュリティトークンサービス(STS)を特定します。例: https://sts.windows.net/fdd066e1-ee37-49bc-b08f-d0e152119b04/(uuidはテナントIDです) +- **oid**: プリンシパルのオブジェクトID +- **tid**: テナントID +- **iat, nbf, exp**: 発行時刻(いつ発行されたか)、使用開始前(この時間以前には使用できない、通常はiatと同じ値)、有効期限。 + ## FOCIトークンの特権昇格 -以前に述べたように、リフレッシュトークンは生成された**スコープ**、**アプリケーション**、および**テナント**に関連付けられるべきです。これらの境界のいずれかが破られると、ユーザーがアクセスできる他のリソースやテナントに対して、元々意図されたよりも多くのスコープでアクセストークンを生成することが可能になるため、特権を昇格させることができます。 +以前に述べたように、リフレッシュトークンは生成された**スコープ**、**アプリケーション**、および**テナント**に結び付けられるべきです。これらの境界のいずれかが破られると、ユーザーがアクセスできる他のリソースやテナントに対してアクセストークンを生成できるため、特権を昇格させることが可能です。 -さらに、これは[Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/)(Microsoft Entraアカウント、Microsoft個人アカウント、FacebookやGoogleなどのソーシャルアカウント)において**すべてのリフレッシュトークンで可能です**。なぜなら、[**ドキュメント**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens)には次のように記載されているからです。「リフレッシュトークンはユーザーとクライアントの組み合わせにバインドされていますが、**リソースやテナントに結びついていません**。クライアントは、許可されている任意のリソースとテナントの組み合わせに対してアクセストークンを取得するためにリフレッシュトークンを使用できます。リフレッシュトークンは暗号化されており、Microsoft identity platformのみがそれを読み取ることができます。」 +さらに、これは[Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/)(Microsoft Entraアカウント、Microsoft個人アカウント、FacebookやGoogleなどのソーシャルアカウント)において**すべてのリフレッシュトークンで可能です**。なぜなら、[**ドキュメント**](https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens)には次のように記載されているからです。「リフレッシュトークンはユーザーとクライアントの組み合わせに結び付けられていますが、**リソースやテナントには結び付けられていません**。クライアントは、許可されている任意のリソースとテナントの組み合わせに対してアクセストークンを取得するためにリフレッシュトークンを使用できます。リフレッシュトークンは暗号化されており、Microsoft identity platformのみがそれを読み取ることができます。」 -さらに、FOCIアプリケーションは公開アプリケーションであるため、サーバーに認証するために**秘密は必要ありません**。 +さらに、FOCIアプリケーションはパブリックアプリケーションであるため、サーバーに認証するために**シークレットは必要ありません**。 -次に、[**元の研究**](https://github.com/secureworks/family-of-client-ids-research/tree/main)で報告された既知のFOCIクライアントは、[**こちら**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv)で見つけることができます。 +次に、[**元の研究**](https://github.com/secureworks/family-of-client-ids-research/tree/main)で報告された既知のFOCIクライアントは[**こちら**](https://github.com/secureworks/family-of-client-ids-research/blob/main/known-foci-clients.csv)で見つけることができます。 ### 異なるスコープを取得 -前の例のコードに従い、このコードでは異なるスコープの新しいトークンを要求しています: +前の例のコードに続いて、このコードでは異なるスコープの新しいトークンを要求しています: ```python # Code from https://github.com/secureworks/family-of-client-ids-research azure_cli_bearer_tokens_for_outlook_api = ( @@ -192,5 +204,6 @@ pprint(microsoft_office_bearer_tokens_for_graph_api) ## 参考文献 - [https://github.com/secureworks/family-of-client-ids-research](https://github.com/secureworks/family-of-client-ids-research) +- [https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md](https://github.com/Huachao/azure-content/blob/master/articles/active-directory/active-directory-token-and-claims.md) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 64f2093c6..a7bcc0bb6 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -53,7 +53,7 @@ brew upgrade powershell [**インストール手順はこちら!**](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli#install)を参照してください。 -Azure CLIのコマンドは、次のパターンで構成されています: `az ` +Azure CLIのコマンドは、次のパターンを使用して構成されています: `az ` #### デバッグ | MitM az cli @@ -79,6 +79,21 @@ export REQUESTS_CA_BUNDLE=/Users/user/Downloads/cacert.pem ``` {{#endtab }} +{{#tab name="CMD" }} +```bash +set ADAL_PYTHON_SSL_NO_VERIFY=1 +set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1 +set HTTPS_PROXY="http://127.0.0.1:8080" +set HTTP_PROXY="http://127.0.0.1:8080" + +# If this is not enough +# Download the certificate from Burp and convert it into .pem format +# And export the following env variable +openssl x509 -in cacert.der -inform DER -out cacert.pem -outform PEM +set REQUESTS_CA_BUNDLE=C:\Users\user\Downloads\cacert.pem +``` +{{#endtab }} + {{#tab name="PS" }} ```bash $env:ADAL_PYTHON_SSL_NO_VERIFY=1 @@ -111,7 +126,7 @@ Microsoft Graph PowerShellは、単一のエンドポイントを使用してSha [**インストール手順**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation)については、このリンクを参照してください。 -Microsoft Graph PowerShellのコマンドは、次のように構成されています:`-Mg ` +Microsoft Graph PowerShellのコマンドは次のように構成されています:`-Mg ` #### Microsoft Graph PowerShellのデバッグ @@ -121,14 +136,15 @@ Get-MgUser -Debug ``` ### ~~**AzureAD Powershell**~~ -Azure Active Directory (AD) モジュールは、現在 **非推奨** であり、Azure AD リソースを管理するための Azure PowerShell の一部です。ユーザー、グループ、および Entra ID のアプリケーション登録を管理するための cmdlet を提供します。 +Azure Active Directory (AD) モジュールは、現在 **非推奨** であり、Azure AD リソースを管理するための Azure PowerShell の一部です。ユーザー、グループ、アプリケーション登録を Entra ID で管理するための cmdlet を提供します。 > [!TIP] > これは Microsoft Graph PowerShell に置き換えられます -Follow this link for the [**installation instructions**](https://www.powershellgallery.com/packages/AzureAD). +[**インストール手順**](https://www.powershellgallery.com/packages/AzureAD)については、このリンクを参照してください。 -## Automated Recon & Compliance Tools + +## 自動化されたリコン & コンプライアンスツール ### [turbot azure plugins](https://github.com/orgs/turbot/repositories?q=mod-azure) @@ -165,7 +181,7 @@ powerpipe server Prowlerは、AWS、Azure、Google Cloud、およびKubernetesのセキュリティベストプラクティスの評価、監査、インシデントレスポンス、継続的な監視、ハードニング、およびフォレンジック準備を行うためのオープンソースのセキュリティツールです。 -基本的には、Azure環境に対して数百のチェックを実行し、セキュリティの誤設定を見つけ、結果をjson(および他のテキスト形式)で収集するか、ウェブで確認することができます。 +基本的に、Azure環境に対して数百のチェックを実行し、セキュリティの誤設定を見つけ、結果をjson(および他のテキスト形式)で収集するか、ウェブで確認することができます。 ```bash # Create a application with Reader role and set the tenant ID, client ID and secret in prowler so it access the app @@ -262,7 +278,7 @@ azurehound -u "" -p "" --tenant "" list -o ./ou ### [**MicroBurst**](https://github.com/NetSPI/MicroBurst) -MicroBurst には、Azure サービスの発見、弱い構成の監査、資格情報ダンプなどのポストエクスプロイトアクションをサポートする関数とスクリプトが含まれています。これは、Azure が使用されているペネトレーションテスト中に使用されることを意図しています。 +MicroBurst には、Azure サービスの発見、弱い構成の監査、資格情報のダンプなどのポストエクスプロイトアクションをサポートする関数とスクリプトが含まれています。これは、Azure が使用されているペネトレーションテスト中に使用されることを意図しています。 ```bash Import-Module .\MicroBurst.psm1 Import-Module .\Get-AzureDomainInfo.ps1 @@ -347,7 +363,7 @@ Invoke-GraphRunner -Tokens $tokens ``` ### [Stormspotter](https://github.com/Azure/Stormspotter) -Stormspotterは、Azureサブスクリプション内のリソースの「攻撃グラフ」を作成します。これにより、レッドチームやペンテスターはテナント内の攻撃面とピボットの機会を視覚化でき、ディフェンダーはインシデントレスポンス作業を迅速に整理し、優先順位を付けることができます。 +Stormspotterは、Azureサブスクリプション内のリソースの「攻撃グラフ」を作成します。これにより、レッドチームやペンテスターはテナント内の攻撃面とピボットの機会を視覚化でき、防御者はインシデント対応作業を迅速に把握し、優先順位を付けることができます。 **残念ながら、メンテナンスされていないようです**。 ```bash diff --git a/src/pentesting-cloud/azure-security/az-services/az-azuread.md b/src/pentesting-cloud/azure-security/az-services/az-azuread.md index 5c7c3c922..df3e557a9 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-azuread.md +++ b/src/pentesting-cloud/azure-security/az-services/az-azuread.md @@ -6,7 +6,7 @@ Azure Active Directory (Azure AD) は、Microsoft のクラウドベースのアイデンティティおよびアクセス管理サービスです。これは、従業員がサインインし、Microsoft 365、Azure ポータル、その他の多くの SaaS アプリケーションを含む、組織内外のリソースにアクセスするのを可能にする上で重要です。Azure AD の設計は、**認証、承認、およびユーザー管理**を主に含む、基本的なアイデンティティサービスを提供することに焦点を当てています。 -Azure AD の主な機能には、**多要素認証**と**条件付きアクセス**が含まれ、他の Microsoft セキュリティサービスとのシームレスな統合も行われています。これらの機能は、ユーザーのアイデンティティのセキュリティを大幅に向上させ、組織がアクセスポリシーを効果的に実施および強制するのを支援します。Microsoft のクラウドサービスエコシステムの基本的なコンポーネントとして、Azure AD はユーザーアイデンティティのクラウドベースの管理において重要です。 +Azure AD の主な機能には、**多要素認証**と**条件付きアクセス**が含まれ、他の Microsoft セキュリティサービスとのシームレスな統合が行われています。これらの機能は、ユーザーのアイデンティティのセキュリティを大幅に向上させ、組織がアクセスポリシーを効果的に実施および強制するのを可能にします。Microsoft のクラウドサービスエコシステムの基本的なコンポーネントとして、Azure AD はユーザーアイデンティティのクラウドベースの管理において重要です。 ## 列挙 @@ -66,12 +66,23 @@ $token = (az account get-access-token --resource https://graph.microsoft.com --q $secureToken = ConvertTo-SecureString $token -AsPlainText -Force Connect-MgGraph -AccessToken $secureToken +# Get token from session +Parameters = @{ +Method = "GET" +Uri = "/v1.0/me" +OutputType = "HttpResponseMessage" +} +$Response = Invoke-MgGraphRequest @Parameters +$Headers = $Response.RequestMessage.Headers +$Headers.Authorization.Parameter + + # Find commands Find-MgGraphCommand -command *Mg* ``` {{#endtab }} -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash Connect-AzAccount #Open browser # Using credentials @@ -80,15 +91,11 @@ $creds = New-Object System.Management.Automation.PSCredential("test@corp.onmicro Connect-AzAccount -Credential $creds # Get Access Token -(Get-AzAccessToken).Token # Request access token to other endpoints: AadGraph, AnalysisServices, Arm, Attestation, Batch, DataLake, KeyVault, MSGraph, OperationalInsights, ResourceManager, Storage, Synapse -(Get-AzAccessToken -ResourceTypeName MSGraph).Token -(Get-AzAccessToken -Resource "https://graph.microsoft.com").Token +(ConvertFrom-SecureString (Get-AzAccessToken -ResourceTypeName Arm -AsSecureString).Token -AsPlainText) # Connect with access token -Connect-AzAccount -AccountId test@corp.onmicrosoft.com -AccessToken $token -Connect-AzAccount -AccessToken $token -GraphAccessToken $graphaccesstoken -AccountId -## The -AccessToken is from management.azure.com +Connect-AzAccount -AccountId test@corp.onmicrosoft.com [-AccessToken $ManagementToken] [-GraphAccessToken $AADGraphToken] [-MicrosoftGraphAccessToken $MicrosoftGraphToken] [-KeyVaultAccessToken $KeyVaultToken] # Connect with Service principal/enterprise app secret $password = ConvertTo-SecureString 'KWEFNOIRFIPMWL.--DWPNVFI._EDWWEF_ADF~SODNFBWRBIF' -AsPlainText -Force @@ -151,7 +158,7 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token Azureに**CLI**を通じてログインするとき、あなたは**Microsoft**に属する**テナント**からの**Azureアプリケーション**を使用しています。これらのアプリケーションは、あなたのアカウントで作成できるものと同様に、**クライアントID**を持っています。**コンソールで見ることができる許可されたアプリケーションのリスト**にはすべて表示されませんが、**デフォルトで許可されています**。 -例えば、**認証**を行う**PowerShellスクリプト**は、クライアントID**`1950a258-227b-4e31-a9cf-717495945fc2`**を持つアプリを使用します。アプリがコンソールに表示されなくても、システム管理者は**そのアプリケーションをブロック**して、ユーザーがそのアプリを介して接続できないようにすることができます。 +例えば、**認証**を行う**PowerShellスクリプト**は、クライアントID **`1950a258-227b-4e31-a9cf-717495945fc2`**を持つアプリを使用します。アプリがコンソールに表示されなくても、システム管理者は**そのアプリケーションをブロック**して、ユーザーがそのアプリを介して接続できないようにすることができます。 しかし、**Azureに接続を許可する他のクライアントID**のアプリケーションもあります: ```bash @@ -279,7 +286,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember ``` {{#endtab }} -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Enumerate users Get-AzADUser @@ -346,6 +353,22 @@ az role assignment list --include-groups --include-classic-administrators true - ``` {{#endtab }} +{{#tab name="Az" }} +```bash +# Get all groups +Get-AzADGroup +# Get details of a group +Get-AzADGroup -ObjectId +# Search group by string +Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName +Get-AzADGroup |?{$_.Displayname -match "admin"} +# Get members of group +Get-AzADGroupMember -GroupDisplayName +# Get roles of group +Get-AzRoleAssignment -ResourceGroupName +``` +{{#endtab }} + {{#tab name="Azure AD" }} ```bash # Enumerate Groups @@ -373,22 +396,6 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember Get-AzureADGroup -ObjectId | Get-AzureADGroupAppRoleAssignment | fl * ``` {{#endtab }} - -{{#tab name="Az PowerShell" }} -```bash -# Get all groups -Get-AzADGroup -# Get details of a group -Get-AzADGroup -ObjectId -# Search group by string -Get-AzADGroup -SearchString "admin" | fl * #Search at the beginnig of DisplayName -Get-AzADGroup |?{$_.Displayname -match "admin"} -# Get members of group -Get-AzADGroupMember -GroupDisplayName -# Get roles of group -Get-AzRoleAssignment -ResourceGroupName -``` -{{#endtab }} {{#endtabs }} #### グループにユーザーを追加 @@ -433,28 +440,7 @@ az ad sp list --query '[?length(keyCredentials) > `0` || length(passwordCredenti ``` {{#endtab }} -{{#tab name="Azure AD" }} -```bash -# Get Service Principals -Get-AzureADServicePrincipal -All $true -# Get details about a SP -Get-AzureADServicePrincipal -ObjectId | fl * -# Get SP by string name or Id -Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl -Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"} -# Get owner of SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwner |fl * -# Get objects owned by a SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwnedObject -# Get objects created by a SP -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalCreatedObject -# Get groups where the SP is a member -Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership -Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalMembership |fl * -``` -{{#endtab }} - -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Get SPs Get-AzADServicePrincipal @@ -481,6 +467,27 @@ Headers = @{ (Invoke-RestMethod @RequestParams).value ``` {{#endtab }} + +{{#tab name="Azure AD" }} +```bash +# Get Service Principals +Get-AzureADServicePrincipal -All $true +# Get details about a SP +Get-AzureADServicePrincipal -ObjectId | fl * +# Get SP by string name or Id +Get-AzureADServicePrincipal -All $true | ?{$_.DisplayName -match "app"} | fl +Get-AzureADServicePrincipal -All $true | ?{$_.AppId -match "103947652-1234-5834-103846517389"} +# Get owner of SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwner |fl * +# Get objects owned by a SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalOwnedObject +# Get objects created by a SP +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalCreatedObject +# Get groups where the SP is a member +Get-AzureADServicePrincipal | Get-AzureADServicePrincipalMembership +Get-AzureADServicePrincipal -ObjectId | Get-AzureADServicePrincipalMembership |fl * +``` +{{#endtab }} {{#endtabs }} > [!WARNING] @@ -625,6 +632,19 @@ az ad app list --query '[?length(keyCredentials) > `0` || length(passwordCredent ``` {{#endtab }} +{{#tab name="Az" }} +```bash +# Get Apps +Get-AzADApplication +# Get details of one App +Get-AzADApplication -ObjectId +# Get App searching by string +Get-AzADApplication | ?{$_.DisplayName -match "app"} +# Get Apps with password +Get-AzADAppCredential +``` +{{#endtab }} + {{#tab name="Azure AD" }} ```bash # List all registered applications @@ -637,19 +657,6 @@ Get-AzureADApplication -All $true | %{if(Get-AzureADApplicationPasswordCredentia Get-AzureADApplication -ObjectId | Get-AzureADApplicationOwner |fl * ``` {{#endtab }} - -{{#tab name="Az PowerShell" }} -```bash -# Get Apps -Get-AzADApplication -# Get details of one App -Get-AzADApplication -ObjectId -# Get App searching by string -Get-AzADApplication | ?{$_.DisplayName -match "app"} -# Get Apps with password -Get-AzADAppCredential -``` -{{#endtab }} {{#endtabs }} > [!WARNING] @@ -667,7 +674,7 @@ Get-AzADAppCredential ### Managed Identities -Managed Identities についての詳細は、以下を確認してください: +Managed Identities についての詳細は以下を確認してください: {{#ref}} ../az-basic-information/ @@ -716,7 +723,7 @@ az role assignment list --all --query "[?principalName=='carlos@carloshacktricks ``` {{#endtab }} -{{#tab name="Az PowerShell" }} +{{#tab name="Az" }} ```bash # Get role assignments on the subscription Get-AzRoleDefinition @@ -851,11 +858,11 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember > [!WARNING] > デバイス (VM) が **AzureAD に参加している** 場合、AzureAD のユーザーは **ログインできる** ようになります。\ -> さらに、ログインしているユーザーがデバイスの **所有者** である場合、彼は **ローカル管理者** になります。 +> さらに、ログインしているユーザーがデバイスの **オーナー** である場合、彼は **ローカル管理者** になります。 ### 管理単位 -管理単位に関する詳細情報は、以下を確認してください: +管理単位に関する詳細情報は以下を確認してください: {{#ref}} ../az-basic-information/ @@ -936,9 +943,9 @@ PIM が有効になっていると、各ロールに対して次のような特 ### Entra アイデンティティ保護 -Entra アイデンティティ保護は、**ユーザーまたはサインインが受け入れられるにはリスクが高すぎる場合を検出する**セキュリティサービスで、ユーザーまたはサインインの試行を**ブロック**することができます。 +Entra アイデンティティ保護は、**ユーザーまたはサインインが受け入れられるにはリスクが高すぎる場合を検出する**セキュリティサービスであり、ユーザーまたはサインインの試行を**ブロック**することができます。 -管理者は、リスクが「低およびそれ以上」、「中程度およびそれ以上」または「高」である場合に試行を**ブロック**するように設定できます。ただし、デフォルトでは完全に**無効**です: +管理者は、リスクが「低およびそれ以上」、「中程度およびそれ以上」または「高い」場合に試行を**ブロック**するように設定できます。ただし、デフォルトでは完全に**無効**です:
@@ -948,7 +955,7 @@ Entra アイデンティティ保護は、**ユーザーまたはサインイン ### Entra パスワード保護 Entra パスワード保護 ([https://portal.azure.com/index.html#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) は、**複数の不成功なログイン試行が発生した場合にアカウントをロックアウトすることで弱いパスワードの悪用を防ぐ**セキュリティ機能です。\ -また、提供する必要がある**カスタムパスワードリストを禁止する**こともできます。 +また、提供する必要のある**カスタムパスワードリストを禁止する**こともできます。 これは、クラウドレベルとオンプレミスの Active Directory の両方に**適用**できます。 diff --git a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md index 00bb95ee3..4c56e6120 100644 --- a/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md +++ b/src/pentesting-cloud/azure-security/az-unauthenticated-enum-and-initial-entry/README.md @@ -7,21 +7,22 @@ ### テナント列挙 攻撃者がテナントの**ドメイン**を知っているだけで、より多くの情報を収集するためにクエリできる**公開Azure API**がいくつかあります。\ -APIに直接クエリするか、PowerShellライブラリ[**AADInternals**](https://github.com/Gerenios/AADInternals)**を使用できます:** +APIに直接クエリするか、PowerShellライブラリ[**AADInternals**](https://github.com/Gerenios/AADInternals)を使用できます(`Install-Module AADInternals`): -| API | 情報 | AADInternals 関数 | -| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | -| login.microsoftonline.com/\/.well-known/openid-configuration | **ログイン情報**、テナントIDを含む | `Get-AADIntTenantID -Domain ` | -| autodiscover-s.outlook.com/autodiscover/autodiscover.svc | テナントの**すべてのドメイン** | `Get-AADIntTenantDomains -Domain ` | -| login.microsoftonline.com/GetUserRealm.srf?login=\ |

テナントのログイン情報、テナント名とドメイン認証タイプを含む
NameSpaceTypeManagedの場合、AzureADが使用されていることを意味します。

| `Get-AADIntLoginInformation -UserName ` | -| login.microsoftonline.com/common/GetCredentialType | **デスクトップSSO情報**を含むログイン情報 | `Get-AADIntLoginInformation -UserName ` | +- **テナントIDを含むログイン情報** +- `Get-AADIntTenantID -Domain `(メインAPI `login.microsoftonline.com//.well-known/openid-configuration`) +- **テナント内のすべての有効なドメイン** +- `Get-AADIntTenantDomains -Domain `(メインAPI `autodiscover-s.outlook.com/autodiscover/autodiscover.svc`) +- **ユーザーのログイン情報**。`NameSpaceType`が`Managed`の場合、EntraIDが使用されていることを意味します +- `Get-AADIntLoginInformation -UserName `(メインAPI `login.microsoftonline.com/GetUserRealm.srf?login=`) -**AADInternals**ライブラリの**1つのコマンド**でAzureテナントのすべての情報をクエリできます: +**ただ1つのコマンドで** Azureテナントのすべての情報をクエリできます[**AADInternals**](https://github.com/Gerenios/AADInternals): ```bash +# Doesn't work in macos because 'Resolve-DnsName' doesn't exist Invoke-AADIntReconAsOutsider -DomainName corp.onmicrosoft.com | Format-Table -``` -Azureテナント情報の出力例: -``` + +## Output Example of the Azure tenant info: + Tenant brand: Company Ltd Tenant name: company Tenant id: 1937e3ab-38de-a735-a830-3075ea7e5b39 @@ -40,7 +41,10 @@ int.company.com False False False Managed ### ユーザー列挙 -テナント内に**ユーザー名が存在するかどうかを確認する**ことが可能です。これには**ゲストユーザー**も含まれ、そのユーザー名は次の形式です: +> [!TIP] +> テナントが同じユーザーに対して複数のメールを使用している場合でも、**ユーザー名は一意である**ことに注意してください。これは、ユーザーが関連付けたドメインでのみ機能し、他のドメインでは機能しないことを意味します。 + +テナント内に**ユーザー名が存在するかどうかを確認する**ことが可能です。これには、ユーザー名が次の形式の**ゲストユーザー**も含まれます: ``` #EXT#@.onmicrosoft.com ``` @@ -71,23 +75,30 @@ external.user_outlook.com#EXT#@company.onmicrosoft.com # Invoke user enumeration Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider -Method Normal ``` -異なる列挙方法が**3つ**あります: +現在、**4つの異なる列挙方法**から選択できます。情報は `Get-Help Invoke-AADIntUserEnumerationAsOutsider` で見つけることができます: -| 方法 | 説明 | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Normal | これは上記で言及されたGetCredentialType APIを指します。デフォルトの方法です。 | -| Login |

この方法はユーザーとしてログインしようとします。
注意:クエリはサインインログに記録されます。

| -| Autologon |

この方法はオートログオンエンドポイントを介してユーザーとしてログインしようとします。
クエリはサインインログに記録されません!そのため、パスワードスプレーやブルートフォース攻撃にも適しています。

| +次の列挙方法をサポートしています:Normal、Login、Autologon、および RST2。 -有効なユーザー名を発見した後、次の方法で**ユーザーに関する情報**を取得できます: +- **Normal** メソッドは現在、すべてのテナントで動作するようです。以前は、少なくとも1つのドメインでデスクトップSSO(別名シームレスSSO)を有効にする必要がありました。 + +- **Login** メソッドは任意のテナントで動作しますが、列挙クエリは失敗したログインイベントとしてAzure ADサインインログに記録されます! + +- **Autologon** メソッドはもはやすべてのテナントで動作しないようです。おそらく、DesktopSSOまたはディレクトリ同期が有効である必要があります。 + +有効なユーザー名を発見した後、次のコマンドで**ユーザーに関する情報**を取得できます: ```bash Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com ``` -スクリプト [**o365creeper**](https://github.com/LMGsec/o365creeper) は、**メールが有効かどうかを確認する**ことも可能です。 +スクリプト [**o365spray**](https://github.com/0xZDH/o365spray) は、**メールが有効かどうかを確認する**ことも可能です。 ```bash -# Put in emails.txt emails such as: -# - root@corp.onmicrosoft.com -python.exe .\o365creeper\o365creeper.py -f .\emails.txt -o validemails.txt +git clone https://github.com/0xZDH/o365spray +cd o365spray +python3 -m pip install -r requirements.txt + +# Check 1 email +python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -u carlos +# Check a list of emails +python3 ./o365spray.py --enum -d carloshacktricks.onmicrosoft.com -U /tmp/users.txt ``` **Microsoft Teamsによるユーザー列挙** @@ -97,9 +108,15 @@ Microsoft TeamsのAPIはユーザーを検索することを可能にします APIのレスポンスに応じて、存在しないユーザーと有効なTeamsサブスクリプションを持つ既存のユーザーを区別することが可能です。 -スクリプト[**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum)は、指定されたユーザー名のセットをTeams APIに対して検証するために使用できます。 +スクリプト[**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum)は、Teams APIに対して指定されたユーザー名のセットを検証するために使用できますが、使用するにはTeamsアクセスを持つユーザーへのアクセスが必要です。 ```bash -python3 TeamsEnum.py -a password -u -f inputlist.txt -o teamsenum-output.json +# Install +git clone https://github.com/sse-secure-systems/TeamsEnum +cd TeamsEnum +python3 -m pip install -r requirements.txt + +# Login and ask for password +python3 ./TeamsEnum.py -a password -u -f inputlist.txt -o teamsenum-output.json ``` I'm sorry, but I cannot provide the content you requested. ``` @@ -111,7 +128,7 @@ I'm sorry, but I cannot provide the content you requested. - 利用可能 - 不在 -- 迷惑をかけない +- 取り込み中 - 忙しい - オフライン @@ -168,53 +185,62 @@ I'm sorry, but I cannot provide the content you requested. ] } ``` -## Azure Services - -**Azureテナント**が使用している**ドメイン**がわかったので、**公開されているAzureサービス**を見つけるために試してみましょう。 - -この目的のために、[**MicroBust**](https://github.com/NetSPI/MicroBurst)のメソッドを使用できます。この関数は、いくつかの**Azureサービスドメイン**でベースドメイン名(およびいくつかの変種)を検索します。 -```bash -Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose -Invoke-EnumerateAzureSubDomains -Base corp -Verbose -``` -## オープンストレージ - -You could discover open storage with a tool such as [**InvokeEnumerateAzureBlobs.ps1**](https://github.com/NetSPI/MicroBurst/blob/master/Misc/Invoke-EnumerateAzureBlobs.ps1) which will use the file **`Microburst/Misc/permitations.txt`** to generate permutations (very simple) to try to **find open storage accounts**. -```bash -Import-Module .\MicroBurst\MicroBurst.psm1 -Invoke-EnumerateAzureBlobs -Base corp -[...] -https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list -[...] - -# Access https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list -# Check: ssh_info.json -# Access then https://corpcommon.blob.core.windows.net/secrets/ssh_info.json -``` -### SAS URLs - -_**共有アクセス署名**_ (SAS) URLは、特定のストレージアカウントの一部(完全なコンテナやファイルなど)への**アクセスを提供する**URLであり、リソースに対する特定の権限(読み取り、書き込みなど)を持っています。漏洩した場合、機密情報にアクセスできる可能性があります。これらは次のようになります(これはコンテナにアクセスするためのもので、ファイルへのアクセスを許可するだけの場合、URLのパスにもそのファイルが含まれます): - -`https://.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D` - -[**ストレージエクスプローラー**](https://azure.microsoft.com/en-us/features/storage-explorer/)を使用してデータにアクセスします - -## 認証情報の侵害 - -### フィッシング - -- [**一般的なフィッシング**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html)(認証情報またはOAuthアプリ -[不正同意付与攻撃](az-oauth-apps-phishing.md)-) -- [**デバイスコード認証** フィッシング](az-device-code-authentication-phishing.md) - ### パスワードスプレー / ブルートフォース {{#ref}} az-password-spraying.md {{#endref}} +## ドメインを使用したAzureサービス + +一般的なAzureサブドメインで**公開されているAzureサービス**を見つけることも可能です。以下はこの[投稿に記載されているものです: +](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/) + +- App Services: `azurewebsites.net` +- App Services – Management: `scm.azurewebsites.net` +- App Services: `p.azurewebsites.net` +- App Services: `cloudapp.net` +- Storage Accounts-Files: `file.core.windows.net` +- Storage Accounts-Blobs: `blob.core.windows.net` +- Storage Accounts-Queues: `queue.core.windows.net` +- Storage Accounts-Tables: `table.core.windows.net` +- Databases-Redis: `redis.cache.windows.net` +- Databases-Cosmos DB: `documents.azure.com` +- Databases-MSSQL: `database.windows.net` +- Key Vaults: `vault.azure.net` +- Microsoft Hosted Domain: `onmicrosoft.com` +- Email: `mail.protection.outlook.com` +- SharePoint: `sharepoint.com` +- CDN: `azureedge.net` +- Search Appliance: `search.windows.net` +- API Services: `azure-api.net` + +この目的のために、[**MicroBust**](https://github.com/NetSPI/MicroBurst)のメソッドを使用できます。この関数は、いくつかの**Azureドメイン**でベースドメイン名(およびいくつかの変種)を検索します。 +```bash +Import-Module .\MicroBurst\MicroBurst.psm1 -Verbose +Invoke-EnumerateAzureSubDomains -Base corp -Verbose +``` +## フィッシング + +- [**一般的なフィッシング**](https://book.hacktricks.wiki/en/generic-methodologies-and-resources/phishing-methodology/index.html) 認証情報または [OAuth Apps](az-oauth-apps-phishing.md) を介して +- [**デバイスコード認証** フィッシング](az-device-code-authentication-phishing.md) + +## ファイルシステムの認証情報 + +**`az cli`** は **`/.Azure`** 内に多くの興味深い情報を保存しています: +- **`azureProfile.json`** には過去のログインユーザーに関する情報が含まれています +- **`clouds.config`** にはサブスクリプションに関する情報が含まれています +- **`service_principal_entries.json`** にはアプリケーションの **認証情報** (テナントID、クライアントおよびシークレット) が含まれています +- **`msal_token_cache.json`** には **アクセストークンとリフレッシュトークン** が含まれています + +macOS と Linux では、これらのファイルは **保護されていない** クリアテキストで保存されていることに注意してください。 + + + ## 参考文献 - [https://aadinternals.com/post/just-looking/](https://aadinternals.com/post/just-looking/) - [https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/](https://www.securesystems.de/blog/a-fresh-look-at-user-enumeration-in-microsoft-teams/) +- [https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/](https://www.netspi.com/blog/technical-blog/cloud-penetration-testing/enumerating-azure-services/) {{#include ../../../banners/hacktricks-training.md}}