19 KiB
Az - App Services
{{#include ../../../banners/hacktricks-training.md}}
App Service Basic Information
Azure App Services дозволяє розробникам створювати, розгортати та масштабувати веб-додатки, бекенди мобільних додатків та API безперешкодно. Він підтримує кілька мов програмування та інтегрується з різними інструментами та сервісами Azure для покращення функціональності та управління.
Кожен додаток працює в пісочниці, але ізоляція залежить від планів App Service
- Додатки в безкоштовних та спільних тарифах працюють на спільних віртуальних машинах
- Додатки в стандартних та преміум тарифах працюють на виділених віртуальних машинах
Warning
Зверніть увагу, що жодна з цих ізоляцій не запобігає іншим загальним веб-вразливостям (таким як завантаження файлів або ін'єкції). І якщо використовується ідентифікатор управління, він може мати можливість підвищити привілеї до них.
Додатки мають деякі цікаві конфігурації:
- Always On: Забезпечує, щоб додаток завжди працював. Якщо не ввімкнено, додаток зупиниться після 20 хвилин бездіяльності і знову запуститься, коли буде отримано запит.
- Це необхідно, якщо у вас є веб-робота, яка повинна працювати безперервно, оскільки веб-робота зупиниться, якщо додаток зупиниться.
- SSH: Якщо ввімкнено, користувач з достатніми правами може підключитися до додатку за допомогою SSH.
- Debugging: Якщо ввімкнено, користувач з достатніми правами може налагоджувати додаток. Однак це автоматично вимикається кожні 48 годин.
- Web App + Database: Веб-консоль дозволяє створити додаток з базою даних. У цьому випадку можна вибрати базу даних для використання (SQLAzure, PostgreSQL, MySQL, MongoDB), а також дозволяє створити Azure Cache для Redis.
- URL, що містить облікові дані для бази даних та Redis, буде зберігатися в appsettings.
- Container: Можна розгорнути контейнер в App Service, вказавши URL контейнера та облікові дані для доступу до нього.
Basic Authentication
При створенні веб-додатку (а також Azure функції зазвичай) можна вказати, чи хочете ви, щоб була ввімкнена базова аутентифікація. Це в основному включає SCM та FTP для програми, тому буде можливість розгорнути програму, використовуючи ці технології.
Більше того, щоб підключитися до них, Azure надає API, який дозволяє отримати ім'я користувача, пароль та URL для підключення до серверів SCM та FTP.
Можна підключитися до SCM, використовуючи веб-браузер за адресою https://<SMC-URL>/BasicAuth і перевірити всі файли та розгортання там.
Kudu
Kudu є движком розгортання та платформою управління для Azure App Service та Function Apps, що надає можливості розгортання на основі Git, віддаленого налагодження та управління файлами для веб-додатків. Він доступний через URL SCM веб-додатку.
Зверніть увагу, що версії Kudu, які використовуються App Services та Function Apps, різні, причому версія Function apps значно обмежена.
Деякі цікаві кінцеві точки, які ви можете знайти в Kudu, це:
/DebugConsole: Консоль, яка дозволяє виконувати команди в середовищі, де працює Kudu.- Зверніть увагу, що це середовище не має доступу до служби метаданих для отримання токенів.
/webssh/host: Веб-клієнт SSH, який дозволяє підключитися всередину контейнера, де працює додаток.- Це середовище має доступ до служби метаданих для отримання токенів від призначених керованих ідентичностей.
/Env: Отримати інформацію про систему, налаштування додатка, змінні середовища, рядки підключення та HTTP заголовки./wwwroot/: Коренева директорія веб-додатку. Ви можете завантажити всі файли звідси.
Sources
App Services дозволяють завантажувати код у вигляді zip-файлу за замовчуванням, але також дозволяють підключатися до стороннього сервісу та отримувати код звідти.
- В даний час підтримувані сторонні джерела - це Github та Bitbucket.
- Ви можете отримати токени аутентифікації, запустивши
az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" - Azure за замовчуванням налаштує Github Action для розгортання коду в App Service щоразу, коли код оновлюється.
- Також можливо вказати віддалений 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-репозиторій.
- Ви можете отримати URL git-репозиторію за допомогою
az webapp deployment source show --name <app-name> --resource-group <res-group>і це буде SCM URL додатку. - Щоб клонувати його, вам знадобляться облікові дані SCM, які ви можете отримати за допомогою
az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>
Webjobs
Azure WebJobs є фоновими завданнями, які працюють в середовищі Azure App Service. Вони дозволяють розробникам виконувати скрипти або програми разом з їх веб-додатками, що полегшує обробку асинхронних або трудомістких операцій, таких як обробка файлів, обробка даних або заплановані завдання. Існує 2 типи веб-робіт:
- Continuous: Працює безперервно в циклі і запускається, як тільки створюється. Це ідеально підходить для завдань, які потребують постійної обробки. Однак, якщо додаток зупиняється, оскільки Always On вимкнено і він не отримав запит за останні 20 хвилин, веб-робота також зупиниться.
- Triggered: Працює за запитом або на основі розкладу. Найкраще підходить для періодичних завдань, таких як пакетні оновлення даних або рутинні обслуговування.
Webjobs є дуже цікавими з точки зору атакуючого, оскільки їх можна використовувати для виконання коду в середовищі та підвищення привілеїв до прикріплених керованих ідентичностей.
Більше того, завжди цікаво перевіряти журнали, згенеровані Webjobs, оскільки вони можуть містити чутливу інформацію.
Slots
Слоти Azure App Service використовуються для розгортання різних версій програми в одному й тому ж App Service. Це дозволяє розробникам тестувати нові функції або зміни в окремому середовищі перед їх розгортанням у виробничому середовищі.
Більше того, можливо направити відсоток трафіку на конкретний слот, що корисно для A/B тестування та для цілей бекдору.
Azure Function Apps
В основному Azure Function apps є підмножиною Azure App Service в вебі, і якщо ви перейдете до веб-консолі та перелікуєте всі служби додатків або виконаєте az webapp list в az cli, ви зможете побачити, що функціональні додатки також тут перераховані.
Насправді деякі з функцій безпеки, які використовують служби додатків (webapp в az cli), також використовуються функціональними додатками.
Enumeration
{{#tabs }} {{#tab name="az" }}
# 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
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 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>
{{#endtab }}
{{#tab name="Az Powershell" }}
# Get App Services and Function Apps
Get-AzWebApp
# Get only App Services
Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"}
{{#endtab }}
{{#tab name="az get all" }}
#!/bin/bash
# Get all App Service and Function Apps
# Define Azure subscription ID
azure_subscription="your_subscription_id"
# Log in to Azure
az login
# Select Azure subscription
az account set --subscription $azure_subscription
# Get all App Services in the specified subscription
list_app_services=$(az appservice list --query "[].{appServiceName: name, group: resourceGroup}" -o tsv)
# Iterate over each App Service
echo "$list_app_services" | while IFS=$'\t' read -r appServiceName group; do
# Get the type of the App Service
service_type=$(az appservice show --name $appServiceName --resource-group $group --query "kind" -o tsv)
# Check if it is a Function App and print its name
if [ "$service_type" == "functionapp" ]; then
echo "Function App Name: $appServiceName"
fi
done
{{#endtab }} {{#endtabs }}
Отримати облікові дані та отримати доступ до коду веб-додатку
# Get connection strings that could contain credentials (with DBs for example)
az webapp config connection-string list --name <name> --resource-group <res-group>
## Check how to use the DBs connection strings in the SQL page
# Get credentials to access the code and DB credentials if configured.
az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>
# Get git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>
# Access/Modify the code via git
git clone 'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.git'
## In my case the username was: $nameofthewebapp and the password some random chars
## If you change the code and do a push, the app is automatically redeployed
{{#ref}} ../az-privilege-escalation/az-app-services-privesc.md {{#endref}}
Приклади для створення веб-додатків
Python з локального
Цей посібник оснований на https://learn.microsoft.com/en-us/azure/app-service/quickstart-python.
# 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недостатньо, щоб змінити код, що виконується веб-додатком.
Зловмисник може завантажити цей файл, змінити його та знову завантажити, щоб виконати довільний код у веб-додатку.
Python з Github
Цей посібник базується на попередньому, але використовує репозиторій Github.
- Зробіть форк репозиторію msdocs-python-flask-webapp-quickstart у вашому обліковому записі Github.
- Створіть новий веб-додаток на Python в Azure.
- У
Deployment Centerзмініть джерело, увійдіть з Github, виберіть форкнутий репозиторій і натиснітьSave.
Як і в попередньому випадку, увійшовши в SCM портал або підключившись через FTP, можна побачити в /wwwroot стиснутий файл output.tar.gz, який містить код веб-додатку.
Tip
Просто підключення через FTP та модифікація файлу
output.tar.gzі повторне ініціювання розгортання недостатньо, щоб змінити код, що виконується веб-додатком.
References
{{#include ../../../banners/hacktricks-training.md}}