mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 11:26:11 -08:00
Translated ['src/pentesting-cloud/azure-security/az-services/az-app-serv
This commit is contained in:
@@ -408,7 +408,7 @@
|
||||
- [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md)
|
||||
- [Az - Automation Account](pentesting-cloud/azure-security/az-services/az-automation-account/README.md)
|
||||
- [Az - State Configuration RCE](pentesting-cloud/azure-security/az-services/az-automation-account/az-state-configuration-rce.md)
|
||||
- [Az - Azure App Service & Function Apps](pentesting-cloud/azure-security/az-services/az-app-service.md)
|
||||
- [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md)
|
||||
- [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md)
|
||||
- [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md)
|
||||
- [Az - Function Apps](pentesting-cloud/azure-security/az-services/az-function-apps.md)
|
||||
|
||||
@@ -0,0 +1,286 @@
|
||||
# Az - App Services
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informações Básicas do App Service
|
||||
|
||||
O Azure App Services permite que os desenvolvedores **construam, implantem e escalem aplicativos web, backends de aplicativos móveis e APIs de forma contínua**. Ele suporta várias linguagens de programação e se integra a várias ferramentas e serviços do Azure para funcionalidade e gerenciamento aprimorados.
|
||||
|
||||
Cada aplicativo é executado dentro de um sandbox, mas a isolação depende dos planos do App Service:
|
||||
|
||||
- Aplicativos nos níveis Free e Shared são executados em **VMs compartilhadas**
|
||||
- Aplicativos nos níveis Standard e Premium são executados em **VMs dedicadas compartilhadas apenas por aplicativos** no mesmo plano do App Service.
|
||||
- Os níveis Isolated são executados em **VMs dedicadas em redes virtuais dedicadas**, melhorando a isolação dos aplicativos.
|
||||
|
||||
> [!WARNING]
|
||||
> Observe que **nenhuma** dessas isolamentos **previne** outras **vulnerabilidades web** comuns (como upload de arquivos ou injeções). E se uma **identidade de gerenciamento** for usada, ela pode ser capaz de **escalar privilégios para elas**.
|
||||
|
||||
Os aplicativos têm algumas configurações interessantes:
|
||||
|
||||
- **Always On**: Garante que o aplicativo esteja sempre em execução. Se não estiver habilitado, o aplicativo parará de funcionar após 20 minutos de inatividade e reiniciará quando uma solicitação for recebida.
|
||||
- Isso é essencial se você tiver um webjob que precisa ser executado continuamente, pois o webjob parará se o aplicativo parar.
|
||||
- **SSH**: Se habilitado, um usuário com permissões suficientes pode se conectar ao aplicativo usando SSH.
|
||||
- **Depuração**: Se habilitado, um usuário com permissões suficientes pode depurar o aplicativo. No entanto, isso é desativado automaticamente a cada 48h.
|
||||
- **Web App + Banco de Dados**: O console web permite criar um App com um banco de dados. Nesse caso, é possível selecionar o banco de dados a ser usado (SQLAzure, PostgreSQL, MySQL, MongoDB) e também permite criar um Azure Cache para Redis.
|
||||
- A URL contendo as credenciais para o banco de dados e Redis será armazenada nas **appsettings**.
|
||||
- **Container**: É possível implantar um container no App Service indicando a URL do container e as credenciais para acessá-lo.
|
||||
- **Mounts**: É possível criar 5 mounts a partir de contas de armazenamento, sendo estas Azure Blob (Somente Leitura) ou Azure Files. A configuração armazenará a chave de acesso sobre a Conta de Armazenamento.
|
||||
|
||||
## Autenticação Básica
|
||||
|
||||
Ao criar um aplicativo web (e uma função do Azure geralmente), é possível indicar se você deseja que a **Autenticação Básica seja habilitada** (desativada por padrão). Isso basicamente **habilita o SCM (Source Control Manager) e FTP (File Transfer Protocol)** para a aplicação, permitindo que a aplicação seja implantada usando essas tecnologias.
|
||||
|
||||
Para acessar os servidores SCM e FTP, é necessário um **nome de usuário e senha**. Portanto, o Azure fornece algumas **APIs para obter as URLs** para essas plataformas e as credenciais.
|
||||
|
||||
O **servidor FTP não tem nenhuma mágica especial**, apenas com a URL válida, nome de usuário e senha é possível conectar e obter permissões de leitura e gravação sobre o ambiente do App.
|
||||
|
||||
O SCM
|
||||
É possível conectar ao SCM usando um navegador da web em `https://<SMC-URL>/BasicAuth` e verificar todos os arquivos e implantações lá.
|
||||
|
||||
### Kudu
|
||||
|
||||
Kudu é a plataforma que **gerencia tanto o SCM quanto uma interface web e API** para gerenciar um App Service, e fornece implantações baseadas em Git, depuração remota e capacidades de gerenciamento de arquivos. É acessível através da URL do SCM definida no aplicativo web.
|
||||
|
||||
Observe que as versões do Kudu usadas pelos App Services e pelos Function Apps são diferentes, sendo a versão dos Function Apps muito mais limitada.
|
||||
|
||||
Alguns endpoints interessantes que você pode encontrar no Kudu são:
|
||||
- `/BasicAuth`: Você precisa acessar este caminho para **fazer login no Kudu**.
|
||||
- `/DebugConsole`: Um console que permite executar comandos no ambiente onde o Kudu está sendo executado.
|
||||
- Observe que este ambiente **não tem acesso** ao serviço de metadados para obter tokens.
|
||||
- `/webssh/host`: Um cliente SSH baseado na web que permite conectar-se dentro do container onde o aplicativo está sendo executado.
|
||||
- Este ambiente **tem acesso ao serviço de metadados** para obter tokens das identidades gerenciadas atribuídas.
|
||||
- `/Env`: Obtenha informações sobre o sistema, configurações do aplicativo, variáveis de ambiente, strings de conexão e cabeçalhos HTTP.
|
||||
- `/wwwroot/`: O diretório raiz do aplicativo web. Você pode baixar todos os arquivos daqui.
|
||||
|
||||
Além disso, o Kudu costumava ser open source em [https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu), mas o projeto foi descontinuado e, comparando o comportamento do Kudu atual no Azure com o antigo, é possível ver que **várias coisas já mudaram**.
|
||||
|
||||
## Fontes
|
||||
|
||||
Os App Services permitem fazer upload do código como um arquivo zip por padrão, mas também permitem conectar-se a um serviço de terceiros e obter o código de lá.
|
||||
|
||||
- As fontes de terceiros atualmente suportadas são **Github** e **Bitbucket**.
|
||||
- Você pode obter os tokens de autenticação executando `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"`
|
||||
- O Azure, por padrão, configurará uma **Github Action** para implantar o código no App Service toda vez que o código for atualizado.
|
||||
- Também é possível indicar um **repositório git remoto** (com nome de usuário e senha) para obter o código de lá.
|
||||
- Você pode obter as credenciais para o repositório remoto executando `az webapp deployment source show --name <app-name> --resource-group <res-group>` ou `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"`
|
||||
- Também é possível usar um **Azure Repository**.
|
||||
- Também é possível configurar um **repositório git local**.
|
||||
- Você pode obter a URL do repositório git com `az webapp deployment source show --name <app-name> --resource-group <res-group>` e será a URL do SCM do aplicativo.
|
||||
- Para cloná-lo, você precisará das credenciais do SCM que pode obter com `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>`
|
||||
|
||||
## Webjobs
|
||||
|
||||
Os Azure WebJobs são **tarefas em segundo plano que são executadas no ambiente do Azure App Service**. Eles permitem que os desenvolvedores executem scripts ou programas ao lado de seus aplicativos web, facilitando o manuseio de operações assíncronas ou intensivas em tempo, como processamento de arquivos, manipulação de dados ou tarefas agendadas.
|
||||
Existem 2 tipos de web jobs:
|
||||
- **Contínuo**: Executa indefinidamente em um loop e é acionado assim que é criado. É ideal para tarefas que requerem processamento constante. No entanto, se o aplicativo parar de funcionar porque o Always On está desativado e não recebeu uma solicitação nos últimos 20 minutos, o web job também parará.
|
||||
- **Acionado**: Executa sob demanda ou com base em um cronograma. É mais adequado para tarefas periódicas, como atualizações de dados em lote ou rotinas de manutenção.
|
||||
|
||||
Os webjobs são muito interessantes do ponto de vista de um atacante, pois podem ser usados para **executar código** no ambiente e **escalar privilégios** para as identidades gerenciadas anexadas.
|
||||
|
||||
Além disso, é sempre interessante verificar os **logs** gerados pelos Webjobs, pois podem conter **informações sensíveis**.
|
||||
|
||||
## Slots
|
||||
|
||||
Os Slots do Azure App Service são usados para **implantar diferentes versões da aplicação** no mesmo App Service. Isso permite que os desenvolvedores testem novos recursos ou alterações em um ambiente separado antes de implantá-los no ambiente de produção.
|
||||
|
||||
Além disso, é possível direcionar uma **porcentagem do tráfego** para um slot específico, o que é útil para testes A/B e para **fins de backdoor**.
|
||||
|
||||
## Azure Function Apps
|
||||
|
||||
Basicamente, **as Azure Function apps são um subconjunto do Azure App Service** no console web e, se você acessar o console web e listar todos os serviços de aplicativo ou executar `az webapp list` no az cli, você poderá **ver as Function apps também listadas lá**.
|
||||
|
||||
Portanto, ambos os serviços têm, na verdade, principalmente as **mesmas configurações, recursos e opções no az cli**, embora possam configurá-los de maneira um pouco diferente (como valores padrão de appsettings ou o uso de uma Conta de Armazenamento nas Function apps).
|
||||
|
||||
## Enumeração
|
||||
|
||||
{{#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 }}
|
||||
|
||||
#### Obter credenciais e acessar o código da webapp
|
||||
```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}}
|
||||
|
||||
## Exemplos para gerar Aplicativos Web
|
||||
|
||||
### Python a partir do local
|
||||
|
||||
Este tutorial é baseado no de [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
|
||||
```
|
||||
Fazendo login no portal SCM ou acessando via FTP, é possível ver em `/wwwroot` o arquivo compactado `output.tar.gz` que contém o código da webapp.
|
||||
|
||||
> [!TIP]
|
||||
> Apenas conectar via FTP e modificar o arquivo `output.tar.gz` não é suficiente para alterar o código executado pela webapp.
|
||||
|
||||
**Um atacante poderia baixar este arquivo, modificá-lo e enviá-lo novamente para executar código arbitrário na webapp.**
|
||||
|
||||
### Python do Github
|
||||
|
||||
Este tutorial é baseado no anterior, mas usando um repositório do Github.
|
||||
|
||||
1. Faça um fork do repositório msdocs-python-flask-webapp-quickstart na sua conta do Github.
|
||||
2. Crie um novo Web App em Python no Azure.
|
||||
3. No `Deployment Center`, altere a fonte, faça login com o Github, selecione o repositório forkado e clique em `Save`.
|
||||
|
||||
Como no caso anterior, fazendo login no portal SCM ou acessando via FTP, é possível ver em `/wwwroot` o arquivo compactado `output.tar.gz` que contém o código da webapp.
|
||||
|
||||
> [!TIP]
|
||||
> Apenas conectar via FTP e modificar o arquivo `output.tar.gz` e reativar uma implantação não é suficiente para alterar o código executado pela webapp.
|
||||
|
||||
## Escalação de Privilégios
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Referências
|
||||
|
||||
- [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