Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation

This commit is contained in:
Translator
2025-05-09 11:19:42 +00:00
parent 28c8036070
commit 90c3dbfbdc
7 changed files with 426 additions and 792 deletions

View File

@@ -4,55 +4,56 @@
## App Service Basic Information
Azure App Servicesは、開発者が**ウェブアプリケーション、モバイルアプリのバックエンド、およびAPIをシームレスに構築、展開、スケール**できるようにします。複数のプログラミング言語をサポートし、機能と管理を強化するためにさまざまなAzureツールやサービスと統合されています。
Azure App Servicesは、開発者が**ウェブアプリケーション、モバイルアプリのバックエンド、およびAPIをシームレスに構築、デプロイ、スケール**できるようにします。複数のプログラミング言語をサポートし、機能と管理を強化するためにさまざまなAzureツールやサービスと統合されています。
各アプリはサンドボックス内で実行されますが、隔離はApp Serviceプランに依存します
- FreeおよびSharedティアのアプリは**共有VM**上で実行されます。
- StandardおよびPremiumティアのアプリは**同じApp Serviceプラン内のアプリのみが共有する専用VM**上で実行されます。
- Isolatedティアは**専用の仮想ネットワーク上の専用VM**で実行され、アプリの隔離が向上します。
- 無料および共有プランのアプリは**共有VM**上で実行されます。
- スタンダードおよびプレミアムプランのアプリは**同じApp Serviceプラン内のアプリのみが共有する専用VM**上で実行されます。
- アイソレーテッドプランは**専用の仮想ネットワーク上の専用VM**で実行され、アプリの隔離が向上します。
> [!WARNING]
> これらの隔離は他の一般的な**ウェブ脆弱性**(ファイルアップロードやインジェクションなど)を**防ぐものではありません**。また、**管理アイデンティティ**が使用される場合、それに**権限を昇格させる**ことができる可能性があります。
> これらの隔離は**他の一般的なウェブ脆弱性**(ファイルアップロードやインジェクションなど)を**防ぐものではありません**。また、**管理アイデンティティ**が使用されている場合、**特権を昇格させる**ことができる可能性があります。
アプリにはいくつかの興味深い設定があります:
- **Always On**: アプリが常に実行されることを保証します。これが有効でない場合、アプリは20分間の非アクティブ状態の後に停止し、リクエストが受信されると再起動します。
- ウェブジョブが継続的に実行される必要がある場合、アプリが停止するとウェブジョブも停止するため、これは重要です。
- **Always On**: アプリが常に実行されることを保証します。これが有効でない場合、アプリは20分間の非アクティブ後に停止し、リクエストを受け取ると再起動します。
- ウェブジョブが継続的に実行される必要がある場合、アプリが停止するとウェブジョブも停止します。
- **SSH**: 有効にすると、十分な権限を持つユーザーがSSHを使用してアプリに接続できます。
- **デバッグ**: 有効にすると、十分な権限を持つユーザーがアプリをデバッグできます。ただし、これは48時間ごとに自動的に無効になります。
- **Web App + Database**: ウェブコンソールを使用してデータベースを持つアプリを作成できます。この場合、使用するデータベースSQLAzure、PostgreSQL、MySQL、MongoDBを選択でき、Azure Cache for Redisを作成することもできます。
- データベースとRedisの資格情報を含むURLは、**appsettings**に保存されます。
- **コンテナ**: コンテナのURLとアクセスするための資格情報を指定することで、App Serviceにコンテナをデプロイできます。
- **マウント**: Azure Blob読み取り専用またはAzure Filesから5つのマウントを作成できます。設定はストレージアカウントのアクセスキーを保存します。
- **ネットワーキング**: 公開可能またはVNetからのプライベートエンドポイントのみがアクセス可能です。
## Basic Authentication
ウェブアプリ通常はAzure関数を作成する際に、**Basic Authenticationを有効にするかどうかを指定できます**(デフォルトでは無効)。これは基本的に、アプリケーションのために**SCMソースコントロールマネージャーおよびFTPファイル転送プロトコル**を有効にすることを意味し、これらの技術を使用してアプリケーションを展開できるようになります。
ウェブアプリ通常はAzure関数を作成する際に、**Basic Authenticationを有効にする**かどうかを指定できます(デフォルトでは無効)。これは基本的に**SCMソースコントロールマネージャーおよびFTPファイル転送プロトコル**をアプリケーションに対して有効にするため、これらの技術を使用してアプリケーションをデプロイできるようになります。
SCMおよびFTPサーバーにアクセスするには、**ユーザー名とパスワード**が必要です。したがって、AzureはこれらのプラットフォームへのURLと資格情報を取得するための**APIを提供します**
SCMおよびFTPサーバーにアクセスするには、**ユーザー名とパスワード**が必要です。したがって、AzureはこれらのプラットフォームへのURLと資格情報を取得するための**APIを提供**しています
**FTPサーバーには特別な魔法はありません**。有効なURL、ユーザー名、パスワードがあれば接続しアプリ環境に対する読み取りおよび書き込み権限を取得できます。
**FTPサーバーには特別な魔法はありません**。有効なURL、ユーザー名、パスワードがあれば接続しアプリ環境に対する読み取りおよび書き込み権限を取得できます。
SCM
`https://<SMC-URL>/BasicAuth`を使用してSCMに接続し、そこにあるすべてのファイルとデプロイメントを確認できます。
`https://<SMC-URL>/BasicAuth`を使用してウェブブラウザからSCMに接続し、そこにあるすべてのファイルとデプロイメントを確認できます。
### Kudu
Kuduは、**SCMとウェブおよびAPIインターフェースの両方を管理**するプラットフォームで、App Serviceを管理し、Gitベースのデプロイメント、リモートデバッグ、およびファイル管理機能を提供します。ウェブアプリで定義されたSCM URLを通じてアクセスできます。
Kuduは、**SCMとウェブおよびAPIインターフェースの両方を管理**し、アプリサービスを管理するためのGitベースのデプロイメント、リモートデバッグ、およびファイル管理機能を提供するプラットフォームです。ウェブアプリで定義されたSCM URLを通じてアクセスできます。
App ServicesとFunction Appsで使用されるKuduのバージョンは異なり、Function Appsのバージョンははるかに制限されています。
KuduのバージョンはApp ServicesとFunction Appsで異なり、Function Appsのバージョンははるかに制限されています。
Kuduで見つけることができるいくつかの興味深いエンドポイントは次のとおりです
- `/BasicAuth`: Kuduに**ログインするためにこのパスにアクセスする必要があります**。
- `/DebugConsole`: Kuduが実行されている環境でコマンドを実行できるコンソールです。
- この環境は**メタデータサービスにアクセスできません**。
- この環境は**トークンを取得するためのメタデータサービスにアクセスできません**。
- `/webssh/host`: アプリが実行されているコンテナ内に接続できるウェブベースのSSHクライアントです。
- この環境は割り当てられた管理アイデンティティからトークンを取得するために**メタデータサービスにアクセスできます**。
- この環境は**割り当てられた管理アイデンティティからトークンを取得するためメタデータサービスにアクセスできます**。
- `/Env`: システム、アプリ設定、環境変数、接続文字列、およびHTTPヘッダーに関する情報を取得します。
- `/wwwroot/`: ウェブアプリのルートディレクトリです。ここからすべてのファイルをダウンロードできます。
さらに、Kuduは以前は[https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu)でオープンソースでしたが、プロジェクトは非推奨となり、Azureの現在のKuduの動作と古いKuduを比較すると、**すでにいくつかのことが変更されている**ことがわかります。
さらに、Kuduは[https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu)でオープンソースでしたが、プロジェクトは非推奨となり、Azureの現在のKuduの動作と古いものを比較すると、**すでにいくつかのことが変更されている**ことがわかります。
## Sources
@@ -70,24 +71,24 @@ App Servicesは、デフォルトでコードをzipファイルとしてアッ
## Webjobs
Azure WebJobsは、**Azure App Service環境で実行されるバックグラウンドタスク**です。これにより、開発者はウェブアプリケーションと並行してスクリプトやプログラムを実行でき、ファイル処理、データ処理、またはスケジュールされたタスクなどの非同期または時間集約型の操作を簡単に処理できます。
Azure WebJobsは、**Azure App Service環境で実行されるバックグラウンドタスク**です。これにより、開発者はウェブアプリケーションと並行してスクリプトやプログラムを実行でき、ファイル処理、データ処理、またはスケジュールされたタスクなどの非同期または時間集約的な操作を簡単に処理できます。
ウェブジョブには2種類あります
- **継続的**: 無限にループで実行され、作成されるとすぐにトリガーされます。常に処理が必要なタスクに最適です。ただし、Always Onが無効になっていて、過去20分間リクエストを受信していない場合、アプリが停止するとウェブジョブも停止します。
- **トリガー**: オンデマンドまたはスケジュールに基づいて実行されます。バッチデータの更新やメンテナンスルーチンなどの定期的なタスクに最適です。
- **継続的**: 無限にループで実行され、作成されるとすぐにトリガーされます。常に処理が必要なタスクに最適です。ただし、Always Onが無効になっていて、過去20分間リクエストを受け取っていない場合、アプリが停止するとウェブジョブも停止します。
- **トリガー**: 要求に応じてまたはスケジュールに基づいて実行されます。バッチデータの更新やメンテナンスルーチンなどの定期的なタスクに最適です。
ウェブジョブは、環境内で**コードを実行**し、接続された管理アイデンティティに**権を昇格**させるために使用できるため、攻撃者の視点から非常に興味深いです。
ウェブジョブは、環境内で**コードを実行**し、接続された管理アイデンティティに**権を昇格**させるために使用できるため、攻撃者の視点から非常に興味深いです。
さらに、ウェブジョブによって生成された**ログ**を確認することは常に興味深いです。これには**機密情報**が含まれている可能性があります。
## Slots
Azure App Service Slotsは、**同じApp Serviceに異なるバージョンのアプリケーションをデプロイするために使用されます**。これにより、開発者は新しい機能や変更を本番環境にデプロイする前に別の環境でテストできます。
Azure App Service Slotsは、**同じApp Serviceに異なるバージョンのアプリケーションをデプロイする**ために使用されます。これにより、開発者は新しい機能や変更を本番環境にデプロイする前に別の環境でテストできます。
さらに、特定のスロットに**トラフィックの割合をルーティング**することが可能で、これはA/Bテストや**バックドア目的**に便利です。
## Azure Function Apps
基本的に**Azure Function appsはAzure App Serviceのサブセット**であり、ウェブコンソールに表示されます。ウェブコンソールにアクセスしてすべてのアプリサービスをリスト表示するか、az cliで`az webapp list`を実行すると、**Function appsもそこにリストされているのが見えます**。
基本的に**Azure Function appsはAzure App Serviceのサブセット**であり、ウェブコンソールに表示されます。ウェブコンソールにアクセスしてすべてのアプリサービスをリストするか、az cliで`az webapp list`を実行すると、**Function appsもそこにリストされているのが見えます**。
したがって、両方のサービスは実際にはほとんど**同じ設定、機能、およびaz cliのオプションを持っています**が、アプリ設定のデフォルト値やFunction appsでのストレージアカウントの使用など、少し異なる方法で構成される場合があります。
@@ -176,6 +177,10 @@ az webapp conection list --name <name> --resource-group <res-group>
# Get hybrid-connections of a webapp
az webapp hybrid-connections list --name <name> --resource-group <res-group>
# Get configured SMC users by your account
az webapp deployment user show
## If any user is created, the username should appear in the "publishingUserName" field
```
{{#endtab }}
@@ -283,10 +288,10 @@ cd msdocs-python-flask-webapp-quickstart
# Create webapp from this code
az webapp up --runtime PYTHON:3.9 --sku B1 --logs
```
SCMポータルにログインするか、FTP経由でログインすると、`/wwwroot`にウェブアプリのコードを含む圧縮ファイル`output.tar.gz`が表示されます。
SCMポータルにログインするか、FTP経由でログインすると、`/wwwroot`にウェブアプリのコードを含む圧縮ファイル`output.tar.gz`を見ることができます。
> [!TIP]
> FTP経由で接続し、ファイル`output.tar.gz`を変更するだけでは、ウェブアプリで実行されるコードを変更するには不十分です。
> FTP経由で接続し`output.tar.gz`ファイルを変更するだけでは、ウェブアプリで実行されるコードを変更するには不十分です。
**攻撃者はこのファイルをダウンロードし、変更して再アップロードすることで、ウェブアプリで任意のコードを実行することができます。**
@@ -298,10 +303,10 @@ SCMポータルにログインするか、FTP経由でログインすると、`/
2. Azureで新しいPython Web Appを作成します。
3. `Deployment Center`でソースを変更し、Githubでログインし、フォークしたリポジトリを選択して`Save`をクリックします。
前のケースと同様に、SCMポータルにログインするか、FTP経由でログインすると、`/wwwroot`にウェブアプリのコードを含む圧縮ファイル`output.tar.gz`が表示されます。
前のケースと同様に、SCMポータルにログインするか、FTP経由でログインすると、`/wwwroot`にウェブアプリのコードを含む圧縮ファイル`output.tar.gz`を見ることができます。
> [!TIP]
> FTP経由で接続し、ファイル`output.tar.gz`を変更しデプロイメントを再トリガーするだけでは、ウェブアプリで実行されるコードを変更するには不十分です。
> FTP経由で接続し`output.tar.gz`ファイルを変更しデプロイメントを再トリガーするだけでは、ウェブアプリで実行されるコードを変更するには不十分です。
## 特権昇格

View File

@@ -4,33 +4,33 @@
## 基本情報
**Azure Function Apps****サーバーレスコンピューティングサービス** で、基盤となるインフラを管理することなく、**関数** と呼ばれる小さなコードの断片を実行できます。これらは、**HTTPリクエスト、タイマー、またはBlob StorageやEvent Hubsなどの他のAzureサービスからのイベント** など、さまざまなトリガーに応じてコードを実行するように設計されています。Function AppsはC#、Python、JavaScript、Javaなど複数のプログラミング言語をサポートしており、**イベント駆動型アプリケーション**の構築、ワークフローの自動化、サービスの統合に適しています。通常、コードが実行されるときに使用されたコンピューティング時間に対してのみ支払うため、コスト効率が高いです。
**Azure Function Apps****サーバーレスコンピューティングサービス** で、基盤となるインフラを管理することなく、**関数**と呼ばれる小さなコードの断片を実行できます。これらは、**HTTPリクエスト、タイマー、またはBlob StorageやEvent Hubsなどの他のAzureサービスからのイベント**など、さまざまなトリガーに応じてコードを実行するように設計されています。Function AppsはC#、Python、JavaScript、Javaなど複数のプログラミング言語をサポートしており、**イベント駆動型アプリケーション**の構築、ワークフローの自動化、サービスの統合に適しています。通常、コードが実行されるときに使用されたコンピュー時間に対してのみ支払うため、コスト効率が高いです。
> [!NOTE]
> **FunctionsはApp Servicesのサブセット**であるため、ここで説明される多くの機能はAzure AppsCLIでは`webapp`)として作成されたアプリケーションでも使用されます。
> **FunctionsはApp Servicesのサブセット**であるため、ここで説明る多くの機能はAzure AppsCLIでは`webapp`)として作成されたアプリケーションでも使用されます。
### 異なるプラン
- **Flex Consumption Plan**: **動的でイベント駆動型のスケーリング**を提供し、需要に応じて関数インスタンスを追加または削除する従量課金制です。**仮想ネットワーキング**と**事前プロビジョニングされたインスタンス**をサポートし、コールドスタートを減少させ、コンテナサポートを必要としない**変動するワークロード**に適しています。
- **Traditional Consumption Plan**: デフォルトのサーバーレスオプションで、**関数が実行されるときのみコンピューティングリソースに対して支払います**。受信イベントに基づいて自動的にスケールし、**コールドスタートの最適化**が含まれていますが、コンテナデプロイメントはサポートしていません。自動スケーリングを必要とする**断続的なワークロード**に最適です。
- **Premium Plan**: **一貫したパフォーマンス**を提供するように設計されており、コールドスタートを排除するための**事前ウォームされたワーカー**を備えています。**拡張実行時間、仮想ネットワーキング**を提供し、**カスタムLinuxイメージ**をサポートしており、高パフォーマンスと高度な機能を必要とする**ミッションクリティカルなアプリケーション**に最適です。
- **Dedicated Plan**: 専用の仮想マシン上で実行され、**予測可能な請求**を提供し、手動または自動スケーリングをサポートします。同じプランで複数のアプリを実行でき、**コンピューティングの隔離**を提供し、App Service Environmentsを介して**安全なネットワークアクセス**を確保し、一貫したリソース割り当てを必要とする**長時間実行されるアプリケーション**に最適です。
- **Container Apps**: **コンテナ化された関数アプリ**を管理された環境でデプロイでき、マイクロサービスやAPIと共に使用できます。カスタムライブラリ、レガシーアプリの移行、**GPU処理**をサポートし、Kubernetesクラスターの管理を排除します。**イベント駆動型でスケーラブルなコンテナ化されたアプリケーション**に最適です。
- **Traditional Consumption Plan**: デフォルトのサーバーレスオプションで、関数が実行されるときのみ**コンピューリソースに対して支払います**。受信イベントに基づいて自動的にスケールし、**コールドスタートの最適化**が含まれていますが、コンテナデプロイメントはサポートしていません。自動スケーリングを必要とする**断続的なワークロード**に最適です。
- **Premium Plan**: **一貫したパフォーマンス**のために設計されており、コールドスタートを排除するための**事前ウォームされたワーカー**を提供します。**拡張実行時間、仮想ネットワーキング**を提供し、**カスタムLinuxイメージ**をサポートしており、高パフォーマンスと高度な機能を必要とする**ミッションクリティカルなアプリケーション**に最適です。
- **Dedicated Plan**: 専用の仮想マシン上で実行され、**予測可能な請求**を提供し、手動または自動スケーリングをサポートします。同じプランで複数のアプリを実行でき、**コンピューの隔離**を提供し、App Service Environmentsを介して**安全なネットワークアクセス**を確保し、一貫したリソース割り当てを必要とする**長時間実行されるアプリケーション**に最適です。
- **Container Apps**: **コンテナ化された関数アプリ**を管理された環境でデプロイでき、マイクロサービスやAPIと共に使用できます。カスタムライブラリ、レガシーアプリの移行、**GPU処理**をサポートし、Kubernetesクラスターの管理を排除します。**イベント駆動型でスケーラブルなコンテナ化アプリケーション**に最適です。
### **ストレージバケット**
新しいFunction Appをコンテナ化せずに作成する場合(実行するコードを提供する場合)、**コードとその他のFunction関連データはストレージアカウントに保存されます**。デフォルトでは、Webコンソールはコードを保存するために関数ごとに新しいものを作成します。
新しいFunction Appをコンテナ化せずに作成する、**コードとその他のFunction関連データはストレージアカウントに保存されます**。デフォルトでは、Webコンソールはコードを保存するために関数ごとに新しいものを作成します。
さらに、バケット内のコードを変更すると(保存されるさまざまな形式で)、**アプリのコードは新しいものに変更され、次回Functionが呼び出されると実行されます**。
> [!CAUTION]
> これは攻撃者の視点から非常に興味深いもので、**このバケットに対する書き込みアクセス**があれば、攻撃者は**コードを妥協し、Function App内の管理されたIDの権限を昇格させる**ことができます。
> これは攻撃者の視点から非常に興味深いものであり、**このバケットへの書き込みアクセス**があれば、攻撃者は**コードを妥協し、Function App内の管理されたIDの権限を昇格させる**ことができます。
>
> これについては**権限昇格セクション**で詳しく説明します。
ストレージアカウント内のコンテナ **`azure-webjobs-secrets`** に保存されている**マスターキーと関数キー**を見つけることも可能です。これは **`<app-name>`** フォルダ内のJSONファイルにあります。
ストレージアカウント内のコンテナ**`azure-webjobs-secrets`**に保存されている**マスターキーと関数キー**を見つけることも可能です。これは**`<app-name>`**フォルダ内のJSONファイルにあります。
Functionsは、リモートロケーションにコードを保存することも可能で、URLを指定するだけで済みます。
Functionsは、リモートの場所にコードを保存することも可能で、そのURLを指定するだけです。
### ネットワーキング
@@ -40,43 +40,45 @@ HTTPトリガーを使用する場合
- **内部ネットワークVPC**からFunction Appへのアクセスを**提供または制限**することも可能です。
> [!CAUTION]
> これは攻撃者の視点から非常に興味深いもので、インターネットに公開された脆弱なFunctionから**内部ネットワークにピボットする**ことが可能かもしれません。
> これは攻撃者の視点から非常に興味深いものであり、インターネットに公開された脆弱なFunctionから**内部ネットワークにピボットする**ことが可能かもしれません。
### **Function Appの設定と環境変数**
アプリ内で環境変数を設定することが可能で、これには機密情報が含まれる場合があります。さらに、デフォルトで環境変数 **`AzureWebJobsStorage`****`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (他にもいくつか)が作成されます。これらは特に興味深いもので、**アプリケーションのデータを含むストレージアカウントを完全に制御するためのアカウントキーを含んでいます**。これらの設定は、ストレージアカウントからコードを実行するためにも必要です。
アプリ内で環境変数を設定することが可能で、これには機密情報が含まれる場合があります。さらに、デフォルトで環境変数**`AzureWebJobsStorage`**と**`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**(他にもいくつか)が作成されます。これらは特に興味深いもので、**アプリケーションのデータを含むストレージアカウントを完全に制御するためのアカウントキーを含んでいます**。これらの設定は、ストレージアカウントからコードを実行するためにも必要です。
これらの環境変数や設定パラメータは、Functionがコードを実行する方法も制御します。たとえば、**`WEBSITE_RUN_FROM_PACKAGE`** が存在する場合、アプリケーションのコードがあるURLを示します。
これらの環境変数や設定パラメータは、Functionがコードを実行する方法も制御します。たとえば、**`WEBSITE_RUN_FROM_PACKAGE`**が存在する場合、アプリケーションのコードがあるURLを示します。
### **Function Sandbox**
Linuxサンドボックス内では、ソースコードは **`/home/site/wwwroot`** にあり、ファイル **`function_app.py`** Pythonを使用している場合に格納されています。コードを実行するユーザーは **`app`** で、sudo権限はありません
Linuxサンドボックス内では、ソースコードは**`/home/site/wwwroot`**にあり、ファイル**`function_app.py`**Pythonを使用している場合に格納されています。コードを実行するユーザーは**`app`**sudo権限なし)です
**Windows**関数でNodeJSを使用している場合、コードは **`C:\home\site\wwwroot\HttpTrigger1\index.js`** にあり、ユーザー名は **`mawsFnPlaceholder8_f_v4_node_20_x86`** で、**グループ**には `Mandatory Label\High Mandatory Level Label``Everyone``BUILTIN\Users``NT AUTHORITY\INTERACTIVE``CONSOLE LOGON``NT AUTHORITY\Authenticated Users``NT AUTHORITY\This Organization``BUILTIN\IIS_IUSRS``LOCAL``10-30-4-99\Dwas Site Users` が含まれていました。
**Windows**関数でNodeJSを使用している場合、コードは**`C:\home\site\wwwroot\HttpTrigger1\index.js`**にあり、ユーザー名は**`mawsFnPlaceholder8_f_v4_node_20_x86`**で、**グループ**には`Mandatory Label\High Mandatory Level Label``Everyone``BUILTIN\Users``NT AUTHORITY\INTERACTIVE``CONSOLE LOGON``NT AUTHORITY\Authenticated Users``NT AUTHORITY\This Organization``BUILTIN\IIS_IUSRS``LOCAL``10-30-4-99\Dwas Site Users`が含まれていました。
### **管理されたIDとメタデータ**
[**VMs**](vms/index.html) と同様に、Functionsは2種類の**管理されたID**を持つことができます:システム割り当てとユーザー割り当て。
[**VMs**](vms/index.html)と同様に、Functionsは**2種類の管理されたID**を持つことができます:システム割り当てとユーザー割り当て。
**システム割り当て**のものは、**そのIDが割り当てられた関数のみが使用できる**管理されたIDであり、**ユーザー割り当て**の管理されたIDは、**他のAzureサービスが使用できる**管理されたIDです。
**システム割り当て**のものは、**そのIDが割り当てられた関数のみが使用できる管理されたID**です。一方、**ユーザー割り当て**の管理されたIDは、**他のAzureサービスが使用できる管理されたID**です。
> [!NOTE]
> [**VMs**](vms/index.html) と同様に、Functionsは**1つのシステム割り当て**の管理されたIDと**複数のユーザー割り当て**の管理されたIDを持つことができるため、関数を妥協した場合は、すべての管理されたIDを見つけることが常に重要です。1つのFunctionから複数の管理されたIDに権限を昇格させることができるかもしれません。
> [**VMs**](vms/index.html)と同様に、Functionsは**1つのシステム割り当て**の管理されたIDと**複数のユーザー割り当て**の管理されたIDを持つことができるため、関数を妥協した場合は、すべての管理されたIDを見つけることが常に重要です。1つのFunctionから複数の管理されたIDに権限を昇格させることができるかもしれません。
>
> システム管理されたIDが使用されていない場合でも、1つ以上のユーザー管理されたIDが関数に添付されている場合、デフォルトではトークンを取得することはできません。
> システム管理されたIDが使用されていない、1つ以上のユーザー管理されたIDが関数に添付されている場合、デフォルトではトークンを取得することはできません。
[**PEASSスクリプト**](https://github.com/peass-ng/PEASS-ng)を使用して、メタデータエンドポイントからデフォルトの管理されたIDのトークンを取得することが可能です。また、以下のように**手動で**取得することもできます:
{% embed url="https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm" %}
{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm
{{#endref}}
関数に添付されている**すべての管理されたIDを確認する方法**を見つける必要があることに注意してください。指定しない場合、メタデータエンドポイントは**デフォルトのもののみを使用します**(詳細については前のリンクを確認してください)。
関数に添付されている**すべての管理されたIDを確認する方法を見つける**必要があることに注意してください。指定しない場合、メタデータエンドポイントは**デフォルトのもののみを使用します**(詳細については前のリンクを参照してください)。
## アクセスキー
> [!NOTE]
> ユーザーが関数を呼び出すためのアクセスを与えるRBAC権限はありません。**関数の呼び出しは、作成時に選択されたトリガーに依存します**。HTTPトリガーが選択された場合、**アクセスキー**を使用する必要があるかもしれません。
HTTPトリガーを使用して関数内にエンドポイントを作成する際、関数をトリガーするために必要な**アクセスキーの認証レベル**を指定することが可能です。利用可能なオプションは3つあります:
HTTPトリガーを使用して関数内にエンドポイントを作成する際、関数をトリガーするために必要な**アクセスキーの認証レベル**を指定することが可能です。3つのオプションあります:
- **ANONYMOUS**: **誰でも**URLを通じて関数にアクセスできます。
- **FUNCTION**: エンドポイントは**関数、ホスト、またはマスターキー**を使用するユーザーのみがアクセスできます。
@@ -84,10 +86,10 @@ HTTPトリガーを使用して関数内にエンドポイントを作成する
**キーの種類:**
- **関数キー**: 関数キーはデフォルトまたはユーザー定義のいずれかで、Function App内の**特定の関数エンドポイント**へのアクセスを独占的に付与するように設計されています。これにより、エンドポイントに対するより細かいアクセスが可能になります。
- **ホストキー**: ホストキーデフォルトまたはユーザー定義のいずれかで、**FUNCTIONアクセスレベル**を持つFunction App内の**すべての関数エンドポイント**へのアクセスを提供します。
- **マスターキー**: マスターキー(`_master`)は、すべての関数エンドポイントへのアクセスを含む管理キーで、権限が昇格されます。この**キーは取り消すことができません**。
- **システムキー**: システムキーは**特定の拡張機能によって管理され**、内部コンポーネントによって使用されるWebhookエンドポイントにアクセスするために必要です。例としては、Event GridトリガーやDurable Functionsがあり、これらはそれぞれのAPIと安全に対話するためにシステムキーを利用します。
- **Function Keys:** 関数キーはデフォルトまたはユーザー定義のいずれかで、Function App内の**特定の関数エンドポイント**へのアクセスを独占的に付与するように設計されています。これにより、エンドポイントに対するより細かいアクセスが可能になります。
- **Host Keys:** ホストキーデフォルトまたはユーザー定義のいずれかで、Function App内の**すべての関数エンドポイントにFUNCTIONアクセスレベルでアクセス**を提供します。
- **Master Key:** マスターキー(`_master`)は、すべての関数エンドポイントへのアクセスを含む管理キーで、権限が昇格されます。この**キーは取り消すことができません**。
- **System Keys:** システムキーは**特定の拡張機能によって管理され**、内部コンポーネントによって使用されるWebhookエンドポイントにアクセスするために必要です。例としては、Event GridトリガーやDurable Functionsがあり、これらはそれぞれのAPIと安全に対話するためにシステムキーを利用します。
> [!TIP]
> キーを使用して関数APIエンドポイントにアクセスする例
@@ -96,7 +98,7 @@ HTTPトリガーを使用して関数内にエンドポイントを作成する
### 基本認証
App Servicesと同様に、Functionsも**SCM**および**FTP**に接続してコードをデプロイするための基本認証をサポートしています。これは、Azureが提供する**ユーザー名とパスワードを含むURL**を使用します。詳細については:
App Servicesと同様に、Functionsも**SCM**および**FTP**に接続してコードをデプロイするための基本認証をサポートしています。これは、Azureが提供する**ユーザー名とパスワードを含むURL**を使用します。詳細については以下を参照してください
{{#ref}}
az-app-services.md
@@ -192,7 +194,7 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
```
</details>
さらに、**Managed Identity**も作成されるため、リポジトリからのGithub Actionはそれを使用してAzureにログインできるようになります。これは、**Managed Identity**上にフェデレーテッド資格情報を生成することによって行われ、**Issuer** `https://token.actions.githubusercontent.com`**Subject Identifier** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>` が許可されます。
さらに、**Managed Identity**も作成されるため、リポジトリのGithub Actionはそれを使用してAzureにログインできるようになります。これは、**Managed Identity**上にフェデレーテッド資格情報を生成することによって行われ、**Issuer** `https://token.actions.githubusercontent.com`**Subject Identifier** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>` が許可されます。
> [!CAUTION]
> したがって、そのリポジトリを侵害した者は、関数およびそれに関連付けられたManaged Identitiesを侵害することができます。
@@ -201,7 +203,7 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
すべてのプランがコンテナのデプロイを許可しているわけではありませんが、許可されているプランでは、設定にコンテナのURLが含まれます。APIでは、**`linuxFxVersion`**設定は次のようになります: `DOCKER|mcr.microsoft.com/...`、一方、ウェブコンソールでは、設定に**image settings**が表示されます。
さらに、**ソースコードは関数に関連するストレージ**アカウントに保存されません。必要ないためです。
さらに、**ソースコードは関数に関連するストレージ**アカウントに保存されることはありません。必要ないためです。
## 列挙
@@ -211,10 +213,10 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
# List all the functions
az functionapp list
# Get info of 1 funciton (although in the list you already get this info)
az functionapp show --name <app-name> --resource-group <res-group>
## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..."
## This is using a container
# List functions in an function-app (endpoints)
az functionapp function list \
--name <app-name> \
--resource-group <res-group>
# Get details about the source of the function code
az functionapp deployment source show \
@@ -231,6 +233,9 @@ az functionapp config container show \
# Get settings (and privesc to the sorage account)
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
# Get access restrictions
az functionapp config access-restriction show --name <app-name> --resource-group <res-group>
# Check if a domain was assigned to a function app
az functionapp config hostname list --webapp-name <app-name> --resource-group <res-group>
@@ -240,22 +245,41 @@ az functionapp config ssl list --resource-group <res-group>
# Get network restrictions
az functionapp config access-restriction show --name <app-name> --resource-group <res-group>
# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code)
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
# Get acess restrictions
az functionapp config access-restriction show --name <app-name> --resource-group <res-group>
# Get connection strings
az rest --method POST --uri "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/connectionstrings/list?api-version=2022-03-01"
az rest --method GET --uri "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/configreferences/connectionstrings?api-version=2022-03-01"
# Get SCM credentials
az functionapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>
# Get function, system and master keys
az functionapp keys list --name <app-name> --resource-group <res-group>
# Get Host key
az rest --method POST --uri "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions/<function-endpoint-name>/listKeys?api-version=2022-03-01"
# Get source code with Master Key of the function
curl "<script_href>?code=<master-key>"
## Python example
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" -v
curl "https://<func-app-name>.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" -v
# Get source code using SCM access (Azure permissions or SCM creds)
az rest --method GET \
--url "https://<func-app-name>.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" \
--resource "https://management.azure.com/"
# Get source code with Azure permissions
az rest --url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
## Another example
az rest --url "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Web/sites/ConsumptionExample/hostruntime/admin/vfs/HttpExample/index.js?relativePath=1&api-version=2022-03-01"
# Get source code
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
```
{{#endtab }}
{{#tab name="Az Powershell" }}
```powershell
```bash
Get-Command -Module Az.Functions
# Lists all Function Apps in the current subscription or in a specific resource group.