Az - App Services

Reading time: 20 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をサポートする

App Service Basic Information

Azure App Servicesは、開発者がウェブアプリケーション、モバイルアプリのバックエンド、およびAPIをシームレスに構築、デプロイ、スケールできるようにします。複数のプログラミング言語をサポートし、機能と管理を強化するためにさまざまなAzureツールやサービスと統合されています。

各アプリはサンドボックス内で実行されますが、隔離はApp Serviceプランに依存します:

  • 無料および共有プランのアプリは共有VM上で実行されます。
  • スタンダードおよびプレミアムプランのアプリは同じApp Serviceプラン内のアプリのみが共有する専用VM上で実行されます。
  • アイソレーテッドプランは専用の仮想ネットワーク上の専用VMで実行され、アプリの隔離が向上します。

warning

これらの隔離は他の一般的なウェブ脆弱性(ファイルアップロードやインジェクションなど)を防ぐものではありません。また、管理アイデンティティが使用されている場合、特権を昇格させることができる可能性があります。

アプリにはいくつかの興味深い設定があります:

  • 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(ファイル転送プロトコル)**をアプリケーションに対して有効にするため、これらの技術を使用してアプリケーションをデプロイできるようになります。

SCMおよびFTPサーバーにアクセスするには、ユーザー名とパスワードが必要です。したがって、AzureはこれらのプラットフォームへのURLと資格情報を取得するためのAPIを提供しています。

FTPサーバーには特別な魔法はありません。有効なURL、ユーザー名、パスワードがあれば接続し、アプリ環境に対する読み取りおよび書き込み権限を取得できます。

SCM https://<SMC-URL>/BasicAuthを使用してウェブブラウザからSCMに接続し、そこにあるすべてのファイルとデプロイメントを確認できます。

Kudu

Kuduは、SCMとウェブおよびAPIインターフェースの両方を管理し、アプリサービスを管理するためのGitベースのデプロイメント、リモートデバッグ、およびファイル管理機能を提供するプラットフォームです。ウェブアプリで定義されたSCM URLを通じてアクセスできます。

KuduのバージョンはApp ServicesとFunction Appsで異なり、Function Appsのバージョンははるかに制限されています。

Kuduで見つけることができるいくつかの興味深いエンドポイントは次のとおりです:

  • /BasicAuth: Kuduにログインするためにこのパスにアクセスする必要があります
  • /DebugConsole: Kuduが実行されている環境でコマンドを実行できるコンソールです。
  • この環境はトークンを取得するためのメタデータサービスにアクセスできません
  • /webssh/host: アプリが実行されているコンテナ内に接続できるウェブベースのSSHクライアントです。
  • この環境は割り当てられた管理アイデンティティからトークンを取得するためのメタデータサービスにアクセスできます
  • /Env: システム、アプリ設定、環境変数、接続文字列、およびHTTPヘッダーに関する情報を取得します。
  • /wwwroot/: ウェブアプリのルートディレクトリです。ここからすべてのファイルをダウンロードできます。

さらに、Kuduはhttps://github.com/projectkudu/kuduでオープンソースでしたが、プロジェクトは非推奨となり、Azureの現在のKuduの動作と古いものを比較すると、すでにいくつかのことが変更されていることがわかります。

Sources

App Servicesは、デフォルトでコードをzipファイルとしてアップロードすることを許可しますが、サードパーティサービスに接続してそこからコードを取得することも可能です。

  • 現在サポートされているサードパーティソースはGithubBitbucketです。
  • 認証トークンを取得するには、az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"を実行します。
  • Azureはデフォルトで、コードが更新されるたびにApp ServiceにコードをデプロイするためのGithub Actionを設定します。
  • そこからコードを取得するために、リモートgitリポジトリ(ユーザー名とパスワードを使用)を指定することも可能です。
  • リモートリポジトリの資格情報を取得するには、az webapp deployment source show --name <app-name> --resource-group <res-group>またはaz rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"を実行します。
  • Azure Repositoryを使用することも可能です。
  • ローカルgitリポジトリを構成することも可能です。
  • az webapp deployment source show --name <app-name> --resource-group <res-group>を使用してgitリポジトリのURLを取得できます。これはアプリのSCM URLになります。
  • クローンするには、az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>で取得できるSCM資格情報が必要です。

Webjobs

Azure WebJobsは、Azure App Service環境で実行されるバックグラウンドタスクです。これにより、開発者はウェブアプリケーションと並行してスクリプトやプログラムを実行でき、ファイル処理、データ処理、またはスケジュールされたタスクなどの非同期または時間集約的な操作を簡単に処理できます。 ウェブジョブには2種類あります:

  • 継続的: 無限にループで実行され、作成されるとすぐにトリガーされます。常に処理が必要なタスクに最適です。ただし、Always Onが無効になっていて、過去20分間リクエストを受け取っていない場合、アプリが停止するとウェブジョブも停止します。
  • トリガー: 要求に応じてまたはスケジュールに基づいて実行されます。バッチデータの更新やメンテナンスルーチンなどの定期的なタスクに最適です。

ウェブジョブは、環境内でコードを実行し、接続された管理アイデンティティに特権を昇格させるために使用できるため、攻撃者の視点から非常に興味深いです。

さらに、ウェブジョブによって生成されたログを確認することは常に興味深いです。これには機密情報が含まれている可能性があります。

Slots

Azure App Service Slotsは、同じApp Serviceに異なるバージョンのアプリケーションをデプロイするために使用されます。これにより、開発者は新しい機能や変更を本番環境にデプロイする前に別の環境でテストできます。

さらに、特定のスロットにトラフィックの割合をルーティングすることが可能で、これはA/Bテストやバックドア目的に便利です。

Azure Function Apps

基本的にAzure Function appsはAzure App Serviceのサブセットであり、ウェブコンソールに表示されます。ウェブコンソールにアクセスしてすべてのアプリサービスをリストするか、az cliでaz webapp listを実行すると、Function appsもそこにリストされているのが見えます

したがって、両方のサービスは実際にはほとんど同じ設定、機能、およびaz cliのオプションを持っていますが、アプリ設定のデフォルト値やFunction appsでのストレージアカウントの使用など、少し異なる方法で構成される場合があります。

Enumeration

bash
# List webapps
az webapp list
## Less information
az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" -o table
## Get SCM URL of each webapp
az webapp list | grep '"name"' | grep "\.scm\." | awk '{print $2}' | sed 's/"//g'

# Get info about 1 app
az webapp show --name <name> --resource-group <res-group>

# Get instances of a webapp
az webapp list-instances --name <name> --resource-group <res-group>
## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web

# Get access restrictions of an app
az webapp config access-restriction show --name <name> --resource-group <res-group>

# Remove access restrictions
az webapp config access-restriction remove --resource-group <res-group> -n <name> --rule-name <rule-name>

# Get connection strings of a webapp
az webapp config connection-string list --name <name> --resource-group <res-group>

# Get appsettings of an app
az webapp config appsettings list --name <name> --resource-group <res-group>

# Get SCM and FTP credentials
az webapp deployment list-publishing-profiles --name <name> --resource-group <res-group>

# Get configured Auth information
az webapp auth show --name <app-name> --resource-group <res-group>

# Get backups of a webapp
az webapp config backup list --webapp-name <name> --resource-group <res-group>

# Get backups scheduled for a webapp
az webapp config backup show --webapp-name <name> --resource-group <res-group>

# Get snapshots
az webapp config snapshot list --resource-group <res-group> -n <name>

# Restore snapshot
az webapp config snapshot restore -g <res-group> -n <name> --time 2018-12-11T23:34:16.8388367

# Get slots
az webapp deployment slot list --name <AppName> --resource-group <ResourceGroupName> --output table
az webapp show --slot <SlotName> --name <AppName> --resource-group <ResourceGroupName>

# Get traffic-routing
az webapp traffic-routing show --name <AppName> --resource-group <ResourceGroupName>

# Get used container by the app
az webapp config container show --name <name> --resource-group <res-group>

# Get storage account configurations of a webapp (contains access key)
az webapp config storage-account list --name <name> --resource-group <res-group>

# Get configured container (if any) in the webapp, it could contain credentials
az webapp config container show --name <name> --resource-group <res-group>

# Get git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>

# Get Webjobs
az webapp webjob continuous list --resource-group <res-group> --name <app-name>
az webapp webjob triggered list --resource-group <res-group> --name <app-name>

# Read webjobs logs with Azure permissions
az rest --method GET --url "<SCM-URL>/vfs/data/jobs/<continuous | triggered>/rev5/job_log.txt"  --resource "https://management.azure.com/"
az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/rev5/job_log.txt"  --resource "https://management.azure.com/"

# Read webjobs logs with SCM credentials
curl "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/lala/job_log.txt" \
--user '<username>:<password>' -v

# Get connections of a webapp
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

Az - App Services Privesc

Webアプリを生成する例

ローカルからのPython

このチュートリアルは、https://learn.microsoft.com/en-us/azure/app-service/quickstart-pythonのものに基づいています。

bash
# Clone repository
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart
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を見ることができます。

tip

FTP経由で接続してoutput.tar.gzファイルを変更するだけでは、ウェブアプリで実行されるコードを変更するには不十分です。

攻撃者はこのファイルをダウンロードし、変更して再アップロードすることで、ウェブアプリで任意のコードを実行することができます。

GithubからのPython

このチュートリアルは前のものに基づいていますが、Githubリポジトリを使用しています。

  1. Githubアカウントでリポジトリmsdocs-python-flask-webapp-quickstartをフォークします。
  2. Azureで新しいPython Web Appを作成します。
  3. Deployment Centerでソースを変更し、Githubでログインし、フォークしたリポジトリを選択してSaveをクリックします。

前のケースと同様に、SCMポータルにログインするか、FTP経由でログインすると、/wwwrootにウェブアプリのコードを含む圧縮ファイルoutput.tar.gzを見ることができます。

tip

FTP経由で接続してoutput.tar.gzファイルを変更し、デプロイメントを再トリガーするだけでは、ウェブアプリで実行されるコードを変更するには不十分です。

特権昇格

Az - App Services Privesc

参考文献

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をサポートする