Az - App Services

Reading time: 15 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Informações Básicas do App Service

Azure App Services permite que os desenvolvedores construam, implantem e escalem aplicações web, backends de aplicativos móveis e APIs de forma contínua. Suporta várias linguagens de programação e se integra a diversas ferramentas e serviços do Azure para funcionalidade e gerenciamento aprimorados.

Cada aplicativo roda dentro de um sandbox, mas a isolação depende dos planos do App Service:

  • Aplicativos nos níveis Free e Shared rodam em VMs compartilhadas
  • Aplicativos nos níveis Standard e Premium rodam em VMs dedicadas compartilhadas apenas por aplicativos no mesmo plano do App Service.
  • Os níveis Isolated rodam em VMs dedicadas em redes virtuais dedicadas, melhorando a isolação dos aplicativos.

warning

Note 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 rodar após 20 minutos de inatividade e reiniciará quando uma solicitação for recebida.
  • Isso é essencial se você tiver um webjob que precisa rodar 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.
  • Debugging: Se habilitado, um usuário com permissões suficientes pode depurar o aplicativo. No entanto, isso é desabilitado automaticamente a cada 48h.
  • Web App + Database: 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.
  • Networking: Pode ser publicamente disponível ou acessível apenas por endpoints privados de uma VNet.

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 (desabilitada 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 escrita sobre o ambiente do App.

O SCM É possível conectar ao SCM usando um navegador 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.

Note 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á rodando.
  • Note 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 dentro do container onde o aplicativo está rodando.
  • Este ambiente tem acesso ao serviço de metadados para obter tokens das identidades gerenciadas atribuídas.
  • /Env: Obter 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, 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 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

Azure WebJobs são tarefas em segundo plano que rodam no ambiente do Azure App Service. Eles permitem que os desenvolvedores executem scripts ou programas ao lado de suas aplicações 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: Roda indefinidamente em um loop e é acionado assim que é criado. É ideal para tarefas que requerem processamento constante. No entanto, se o aplicativo parar de rodar porque o Always On está desabilitado e não recebeu uma solicitação nos últimos 20 minutos, o web job também parará.
  • Acionado: Roda 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.

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, 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 os Function apps também listados 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 nos Function apps).

Enumeração

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

Exemplos para gerar Aplicativos Web

Python do local

Este tutorial é baseado no de 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

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 uma nova 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.

Escalada de Privilégios

Az - App Services Privesc

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks