Az - App Services

Reading time: 14 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

App Service Basic Information

Azure App Services дозволяє розробникам створювати, розгортати та масштабувати веб-додатки, бекенди мобільних додатків та API безперешкодно. Він підтримує кілька мов програмування та інтегрується з різними інструментами та сервісами Azure для покращення функціональності та управління.

Кожен додаток працює в пісочниці, але ізоляція залежить від планів App Service:

  • Додатки в безкоштовних та спільних тарифах працюють на спільних ВМ
  • Додатки в стандартних та преміум тарифах працюють на виділених ВМ, які спільно використовуються лише додатками в тому ж плані App Service.
  • Ізольовані тарифи працюють на виділених ВМ у виділених віртуальних мережах, покращуючи ізоляцію додатків.

warning

Зверніть увагу, що жодна з цих ізоляцій не запобігає іншим загальним веб-вразливостям (таким як завантаження файлів або ін'єкції). І якщо використовується ідентифікатор управління, він може підвищити привілеї до них.

Додатки мають деякі цікаві конфігурації:

  • Always On: Забезпечує, що додаток завжди працює. Якщо не ввімкнено, додаток зупиниться після 20 хвилин бездіяльності і знову запуститься, коли буде отримано запит.
  • Це необхідно, якщо у вас є вебробота, яка повинна працювати безперервно, оскільки вебробота зупиниться, якщо додаток зупиниться.
  • SSH: Якщо ввімкнено, користувач з достатніми правами може підключитися до додатка за допомогою SSH.
  • Debugging: Якщо ввімкнено, користувач з достатніми правами може налагоджувати додаток. Однак це автоматично вимикається кожні 48 годин.
  • Веб-додаток + База даних: Веб-консоль дозволяє створити додаток з базою даних. У цьому випадку можна вибрати базу даних для використання (SQLAzure, PostgreSQL, MySQL, MongoDB), а також створити Azure Cache для Redis.
  • URL, що містить облікові дані для бази даних та Redis, буде зберігатися в appsettings.
  • Контейнер: Можна розгорнути контейнер у App Service, вказавши URL контейнера та облікові дані для доступу до нього.
  • Монтажі: Можна створити 5 монтажів з облікових записів зберігання, які є Azure Blob (тільки для читання) або Azure Files. Конфігурація зберігатиме ключ доступу в обліковому записі зберігання.
  • Мережа: Може бути загальнодоступною або доступною лише через приватні кінцеві точки з VNet.

Basic Authentication

При створенні веб-додатка (а також Azure функції зазвичай) можна вказати, чи хочете ви, щоб базова аутентифікація була ввімкнена (за замовчуванням вимкнена). Це в основному включає SCM (менеджер контролю версій) та FTP (протокол передачі файлів) для програми, тому буде можливим розгорнути програму, використовуючи ці технології.

Для доступу до серверів SCM та FTP потрібні ім'я користувача та пароль. Тому Azure надає деякі API для отримання URL до цих платформ та облікових даних.

FTP сервер не має жодної особливої магії, просто з дійсним URL, ім'ям користувача та паролем можна підключитися та отримати права на читання та запис у середовищі програми.

SCM Можна підключитися до SCM, використовуючи веб-браузер за адресою https://<SMC-URL>/BasicAuth та перевірити всі файли та розгортання там.

Kudu

Kudu - це платформа, яка керує як SCM, так і веб-інтерфейсом API для управління App Service, і надає можливості розгортання на основі Git, віддаленого налагодження та управління файлами. Доступ до неї здійснюється через URL SCM, визначений у веб-додатку.

Зверніть увагу, що версії Kudu, які використовуються App Services та Function Apps, різні, причому версія Function Apps значно обмежена.

Деякі цікаві кінцеві точки, які ви можете знайти в Kudu, це:

  • /BasicAuth: Вам потрібно отримати доступ до цього шляху, щоб увійти в Kudu.
  • /DebugConsole: Консоль, яка дозволяє виконувати команди в середовищі, де працює Kudu.
  • Зверніть увагу, що це середовище не має доступу до служби метаданих для отримання токенів.
  • /webssh/host: Веб-клієнт SSH, який дозволяє підключитися всередину контейнера, де працює додаток.
  • Це середовище має доступ до служби метаданих для отримання токенів від призначених керованих ідентичностей.
  • /Env: Отримати інформацію про систему, налаштування додатка, змінні середовища, рядки підключення та HTTP заголовки.
  • /wwwroot/: Коренева директорія веб-додатка. Ви можете завантажити всі файли звідси.

Більше того, Kudu раніше був з відкритим кодом на https://github.com/projectkudu/kudu, але проект був застарілий, і порівнюючи поведінку поточного Kudu в Azure зі старим, можна побачити, що декілька речей вже змінилися.

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 типи вебробіт:

  • Безперервні: Працюють безперервно в циклі і запускаються, щойно створені. Вони ідеальні для завдань, які потребують постійної обробки. Однак, якщо додаток перестане працювати, оскільки Always On вимкнено і він не отримав запит за останні 20 хвилин, вебробота також зупиниться.
  • Запущені: Працюють за запитом або за розкладом. Вони найкраще підходять для періодичних завдань, таких як пакетні оновлення даних або рутинні обслуговування.

Webjobs є дуже цікавими з точки зору атакуючого, оскільки їх можна використовувати для виконання коду в середовищі та підвищення привілеїв до прикріплених керованих ідентичностей.

Більше того, завжди цікаво перевіряти журнали, згенеровані веброботами, оскільки вони можуть містити чутливу інформацію.

Slots

Слоти Azure App Service використовуються для розгортання різних версій програми в одному й тому ж App Service. Це дозволяє розробникам тестувати нові функції або зміни в окремому середовищі перед їх розгортанням у виробничому середовищі.

Більше того, можливо направити відсоток трафіку на конкретний слот, що корисно для A/B тестування та для задніх дверей.

Azure Function Apps

В основному Azure Function apps є підмножиною Azure App Service у веб-консолі, і якщо ви перейдете до веб-консолі та перелікуєте всі служби додатків або виконаєте az webapp list в az cli, ви зможете побачити, що функціональні додатки також перераховані там.

Отже, обидва сервіси насправді мають в основному однакові конфігурації, функції та опції в az cli, хоча вони можуть налаштовувати їх трохи по-різному (наприклад, значення за замовчуванням appsettings або використання облікового запису зберігання в функціональних додатках).

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

Приклади для створення веб-додатків

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 недостатньо для зміни коду, що виконується веб-додатком.

Зловмисник може завантажити цей файл, змінити його та знову завантажити, щоб виконати довільний код у веб-додатку.

Python з Github

Цей посібник базується на попередньому, але використовує репозиторій Github.

  1. Форкніть репозиторій msdocs-python-flask-webapp-quickstart у вашому обліковому записі Github.
  2. Створіть новий веб-додаток на Python в Azure.
  3. У Deployment Center змініть джерело, увійдіть з Github, виберіть форкнутий репозиторій і натисніть Save.

Як і в попередньому випадку, увійшовши в SCM портал або через FTP, можна побачити в /wwwroot стиснутий файл output.tar.gz, який містить код веб-додатку.

tip

Просто підключення через FTP та зміна файлу output.tar.gz і повторне ініціювання розгортання недостатньо для зміни коду, що виконується веб-додатком.

Підвищення привілеїв

Az - App Services Privesc

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks