Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation

This commit is contained in:
Translator
2025-01-04 03:47:55 +00:00
parent bd076bc08a
commit f5f4d49532
2 changed files with 41 additions and 55 deletions

View File

@@ -19,11 +19,11 @@ Essas permissões permitem obter um **SSH shell** dentro de um aplicativo web. E
# Direct option
az webapp ssh --name <name> --resource-group <res-group>
```
- **Criar túnel e depois conectar ao SSH**:
- **Criar túnel e então conectar ao SSH**:
```bash
az webapp create-remote-connection --name <name> --resource-group <res-group>
## If successfull you will get a message such as:
## If successful you will get a message such as:
#Verifying if app is running....
#App is running. Trying to establish tunnel connection...
#Opening tunnel on port: 39895
@@ -32,12 +32,12 @@ az webapp create-remote-connection --name <name> --resource-group <res-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**:
- **Depurar a aplicação**:
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.
5. Se o aplicativo não tiver a depuração habilitada, a extensão tentará habilitá-la, mas sua conta precisa da permissão `Microsoft.Web/sites/config/write` para isso.
### Obtendo Credenciais SCM e Habilitando Autenticação Básica
@@ -131,7 +131,7 @@ Lembre-se de que para acessar a plataforma SCM pela **web, você precisa acessar
> [!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):`
- 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 \
@@ -149,21 +149,21 @@ az rest --method PUT \
"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.
Apenas ter credenciais SCM válidas já é possível **publicar código** no serviço de aplicativo. 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:
Em seguida, você pode **publicar o código** em um aplicativo da web com o seguinte comando:
```bash
curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<username>:<password>' -H "Content-Type: application/octet-stream"
```
### Microsoft.Web/sites/publish/Action | Credenciais do SCM
### Webjobs: 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:
A permissão do Azure mencionada permite realizar várias ações interessantes que também podem ser executadas com as credenciais do SCM:
- Ler logs de **Webjobs**:
```bash
@@ -173,7 +173,7 @@ az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.az
# Using SCM username and password:
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
--user '<username>:<password>>' -v
--user '<username>:<password>' -v
```
- Leia o código-fonte do **Webjobs**:
```bash
@@ -203,6 +203,12 @@ curl -X PUT \
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
--user '<username>:<password>'
```
### 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 <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
```
### 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.
@@ -210,12 +216,6 @@ Esta permissão permite listar as **connection strings** e os **appsettings** do
az webapp config connection-string list --name <name> --resource-group <res-group>
az webapp config appsettings list --name <name> --resource-group <res-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 <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
```
### 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.
@@ -259,14 +259,14 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
- 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 <app-name> --resource-group <res-group>`, mas será a mesma que a URL SCM do app com o caminho `/<app-name>.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 <res-group> -n <name>`.
- **`Microsoft.Web/sites/config/list/action`**: Em seguida, execute `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>`
- **`Microsoft.Web/sites/publishxml/action`**: Então execute `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>`.
- **`Microsoft.Web/sites/config/list/action`**: Então execute `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-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.
> Note 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), como 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.
> Note que ter as permissões abaixo também é **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`

View File

@@ -4,7 +4,7 @@
## 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.
Azure App Services permite que os desenvolvedores **construam, implantem e escalem aplicações web, backends de aplicativos móveis e APIs de forma integrada**. 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 é executado dentro de um sandbox, mas a isolação depende dos planos do App Service:
@@ -13,50 +13,50 @@ Cada aplicativo é executado dentro de um sandbox, mas a isolação depende dos
- 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**.
> 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 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.
- **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 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.
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 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á.
É 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.
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.
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á 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.
- 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á 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.
- `/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](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**.
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á.
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"`
@@ -70,12 +70,12 @@ Os App Services permitem fazer upload do código como um arquivo zip por padrão
## 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.
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 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**: 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.
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**.
@@ -87,9 +87,9 @@ Além disso, é possível direcionar uma **porcentagem do tráfego** para um slo
## 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á**.
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 nas Function apps).
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
@@ -156,6 +156,9 @@ 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>
@@ -217,31 +220,14 @@ 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
### Python 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