mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-13 05:16:32 -08:00
Translated ['src/pentesting-cloud/azure-security/az-services/az-app-serv
This commit is contained in:
@@ -0,0 +1,286 @@
|
||||
# Az - App Services
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## 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. Конфігурація зберігатиме ключ доступу над обліковим записом зберігання.
|
||||
|
||||
## 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](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 хвилин, вебробота також зупиниться.
|
||||
- **Запущені**: Працюють за запитом або за розкладом. Вони найкраще підходять для періодичних завдань, таких як пакетні оновлення даних або рутинні обслуговування.
|
||||
|
||||
Веброботи є дуже цікавими з точки зору атакуючого, оскільки їх можна використовувати для **виконання коду** в середовищі та **підвищення привілеїв** до прикріплених керованих ідентичностей.
|
||||
|
||||
Більше того, завжди цікаво перевіряти **журнали**, згенеровані веброботами, оскільки вони можуть містити **чутливу інформацію**.
|
||||
|
||||
## 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
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="az" }}
|
||||
```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 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" }}
|
||||
```powershell
|
||||
# Get App Services and Function Apps
|
||||
Get-AzWebApp
|
||||
# Get only App Services
|
||||
Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"}
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="az get all" }}
|
||||
```bash
|
||||
#!/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 }}
|
||||
|
||||
#### Отримати облікові дані та отримати доступ до коду веб-додатку
|
||||
```bash
|
||||
# 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](https://learn.microsoft.com/en-us/azure/app-service/quickstart-python?tabs=flask%2Cwindows%2Cazure-cli%2Cazure-cli-deploy%2Cdeploy-instructions-azportal%2Cterminal-bash%2Cdeploy-instructions-zip-azcli).
|
||||
```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` і повторне триггерування розгортання недостатньо для зміни коду, що виконується веб-додатком.
|
||||
|
||||
## Підвищення привілеїв
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Посилання
|
||||
|
||||
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
|
||||
- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user