diff --git a/src/pentesting-cloud/azure-security/az-services/az-storage.md b/src/pentesting-cloud/azure-security/az-services/az-storage.md
index 588ec1a9a..40e2e3040 100644
--- a/src/pentesting-cloud/azure-security/az-services/az-storage.md
+++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md
@@ -1,32 +1,32 @@
-# Az - Contas de Armazenamento & Blobs
+# Az - Storage Accounts & Blobs
{{#include ../../../banners/hacktricks-training.md}}
## Informações Básicas
-Azure Storage Accounts são serviços fundamentais no Microsoft Azure que fornecem armazenamento em nuvem escalável, seguro e altamente disponível para vários tipos de dados, incluindo blobs (binary large objects), files, queues e tables. Eles servem como contêineres que agrupam esses diferentes serviços de armazenamento sob um único namespace para facilitar o gerenciamento.
+Azure Storage Accounts são serviços fundamentais na Microsoft Azure que fornecem **armazenamento em nuvem escalável, seguro e altamente disponível para vários tipos de dados**, incluindo blobs (binary large objects), files, queues, and tables. Eles funcionam como contêineres que agrupam esses diferentes serviços de storage sob um único namespace para facilitar o gerenciamento.
**Principais opções de configuração**:
-- Toda storage account deve ter um **nome único em todo o Azure**.
-- Cada storage account é implantada em uma **região** ou em uma zona estendida do Azure.
-- É possível selecionar a versão **premium** da storage account para melhor performance.
-- É possível selecionar entre **4 tipos de redundância para proteger** contra falhas de rack, disco e datacenter.
+- Cada storage account deve ter um **nome único em todo o Azure**.
+- Cada storage account é implantada em uma **região** ou em uma Azure extended zone
+- É possível selecionar a versão **premium** da storage account para melhor desempenho
+- É possível escolher entre **4 tipos de redundância para proteger** contra falhas de rack, drive e datacenter.
**Opções de configuração de segurança**:
-- **Require secure transfer for REST API operations**: Exigir TLS em qualquer comunicação com o storage.
-- **Allows enabling anonymous access on individual containers**: Se não habilitado, não será possível ativar acesso anônimo no futuro.
-- **Enable storage account key access**: Se não habilitado, o acesso com Shared Keys será proibido.
+- **Require secure transfer for REST API operations**: Exigir TLS em qualquer comunicação com o storage
+- **Allows enabling anonymous access on individual containers**: Se não estiver habilitado, não será possível ativar acesso anônimo no futuro
+- **Enable storage account key access**: Se desabilitado, o acesso com Shared Keys será proibido
- **Minimum TLS version**
-- **Permitted scope for copy operations**: Permitir de qualquer storage account, de qualquer storage account do mesmo Entra tenant ou de storage accounts com private endpoints na mesma virtual network.
+- **Permitted scope for copy operations**: Allow from any storage account, from any storage account from the same Entra tenant or from storage account with private endpoints in the same virtual network.
**Opções do Blob Storage**:
- **Allow cross-tenant replication**
-- **Access tier**: Hot (dados acessados com frequência), Cool e Cold (dados raramente acessados)
+- **Access tier**: Hot (dados acessados frequentemente), Cool e Cold (dados raramente acessados)
-**Opções de Rede**:
+**Opções de rede**:
- **Network access**:
- Allow from all networks
@@ -36,36 +36,51 @@ Azure Storage Accounts são serviços fundamentais no Microsoft Azure que fornec
**Opções de proteção de dados**:
-- **Point-in-time restore for containers**: Permite restaurar containers para um estado anterior.
-- Requer que versioning, change feed e blob soft delete estejam habilitados.
-- **Enable soft delete for blobs**: Habilita um período de retenção em dias para blobs deletados (mesmo sobrescritos).
-- **Enable soft delete for containers**: Habilita um período de retenção em dias para containers deletados.
-- **Enable soft delete for file shares**: Habilita um período de retenção em dias para file shares deletados.
-- **Enable versioning for blobs**: Mantém versões anteriores dos seus blobs.
-- **Enable blob change feed**: Mantém logs de criação, modificação e exclusão de blobs.
-- **Enable version-level immutability support**: Permite definir uma política de retenção baseada em tempo no nível da conta que se aplicará a todas as versões de blob.
+- **Point-in-time restore for containers**: Permite restaurar containers para um estado anterior
+- Requer que versioning, change feed, e blob soft delete estejam habilitados.
+- **Enable soft delete for blobs**: Habilita um período de retenção em dias para blobs deletados (mesmo sobrescritos)
+- **Enable soft delete for containers**: Habilita um período de retenção em dias para containers deletados
+- **Enable soft delete for file shares**: Habilita um período de retenção em dias para file shares deletados
+- **Enable versioning for blobs**: Mantém versões anteriores dos seus blobs
+- **Enable blob change feed**: Mantém logs de criação, modificação e exclusão de blobs
+- **Enable version-level immutability support**: Permite configurar uma política de retenção baseada em tempo no nível da conta que se aplicará a todas as versões de blob.
- Version-level immutability support e point-in-time restore for containers não podem ser habilitados simultaneamente.
-**Opções de criptografia**:
+**Opções de configuração de criptografia**:
-- **Encryption type**: É possível usar chaves gerenciadas pela Microsoft (MMK) ou chaves gerenciadas pelo cliente (CMK).
-- **Enable infrastructure encryption**: Permite criptografar os dados duas vezes "para mais segurança".
+- **Encryption type**: É possível usar Microsoft-managed keys (MMK) ou Customer-managed keys (CMK)
+- **Enable infrastructure encryption**: Permite dupla criptografia dos dados "para mais segurança"
### Storage endpoints
-
### Exposição Pública
-Se "Allow Blob public access" estiver **enabled** (disabled por padrão), ao criar um container é possível:
+Se "Allow Blob public access" estiver **habilitado** (desabilitado por padrão), ao criar um container é possível:
-- Conceder **acesso público para leitura de blobs** (é necessário conhecer o nome).
-- **Listar blobs do container** e **lê-los**.
-- Tornar o container totalmente **privado**.
+- Dar **public access to read blobs** (você precisa saber o nome).
+- **List container blobs** e **lê-los**.
+- Torná-lo totalmente **privado**
-#### Auditando exposição anônima de blobs
+### Static website (`$web`) exposure & leaked secrets
+
+- **Static websites** são servidos a partir do contêiner especial `$web` através de um endpoint específico por região, como `https://.z13.web.core.windows.net/`.
+- O contêiner `$web` pode reportar `publicAccess: null` via the blob API, mas arquivos ainda estão alcançáveis através do static site endpoint, então ao droppar config/IaC artifacts ali pode leak secrets.
+- Workflow rápido de auditoria:
+```bash
+# Identify storage accounts with static website hosting enabled
+az storage blob service-properties show --account-name --auth-mode login
+# Enumerate containers (including $web) and their public flags
+az storage container list --account-name --auth-mode login
+# List files served by the static site even when publicAccess is null
+az storage blob list --container-name '$web' --account-name --auth-mode login
+# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
+az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name --auth-mode login
+```
+### Auditoria da exposição anônima de blobs
- **Localizar storage accounts** que podem expor dados: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Se `allowBlobPublicAccess` for `false` você não pode tornar containers públicos.
- **Inspecionar contas arriscadas** para confirmar a flag e outras configurações fracas: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
@@ -75,11 +90,11 @@ az storage container list --account-name \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: leituras anônimas permitidas **somente quando o nome do blob é conhecido** (sem listagem).
-- `"Container"`: listagem + leitura anônimas de cada blob.
+- `"Container"`: **listagem + leitura** anônima de todos os blobs.
- `null`: privado; autenticação necessária.
-- **Comprovar acesso** sem credenciais:
-- Se `publicAccess` for `Container`, a listagem anônima funciona: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`.
-- Para `Blob` e `Container`, o download anônimo do blob funciona quando o nome é conhecido:
+- **Provar acesso** sem credenciais:
+- Se `publicAccess` é `Container`, a listagem anônima funciona: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`.
+- Para ambos `Blob` e `Container`, o download anônimo do blob funciona quando o nome é conhecido:
```bash
az storage blob download -c -n --account-name --file /dev/stdout
# or via raw HTTP
@@ -87,29 +102,29 @@ curl "https://.blob.core.windows.net//"
```
### Conectar ao Storage
-Se encontrar qualquer **storage** ao qual possa conectar-se, pode usar a ferramenta [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) para isso.
+Se encontrar qualquer **storage** ao qual possa conectar, pode usar a ferramenta [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) para isso.
## Acesso ao Storage
### RBAC
-É possível usar principals do Entra ID com **RBAC roles** para acessar contas de Storage e esse é o método recomendado.
+É possível usar principals do Entra ID com **RBAC roles** para acessar as contas de storage; esta é a forma recomendada.
### Access Keys
-As storage accounts têm access keys que podem ser usadas para acessá-las. Isso fornece **acesso completo à conta de Storage.**
+As contas de storage têm access keys que podem ser usadas para acessá-las. Isto fornece **acesso total à conta de storage.**
### **Shared Keys & Lite Shared Keys**
-É possível [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) assinadas com as access keys para autorizar o acesso a certos recursos via uma URL assinada.
+É possível [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) assinadas com as access keys para autorizar o acesso a certos recursos através de uma URL assinada.
> [!NOTE]
-> Observe que a parte `CanonicalizedResource` representa o recurso dos storage services (URI). E se qualquer parte na URL estiver codificada, ela também deve estar codificada dentro do `CanonicalizedResource`.
+> Note que a parte `CanonicalizedResource` representa o recurso do serviço de storage (URI). E se alguma parte da URL estiver codificada, também deve estar codificada dentro do `CanonicalizedResource`.
> [!NOTE]
-> Isto é **usado por padrão pelo `az` cli** para autenticar requisições. Para fazer com que use as credenciais do principal do Entra ID, indique o parâmetro `--auth-mode login`.
+> Isto é **usado por padrão pelo `az` cli** para autenticar requisições. Para fazê-lo usar as credenciais do principal Entra ID, indique o parâmetro `--auth-mode login`.
- É possível gerar uma **shared key for blob, queue and file services** assinando a seguinte informação:
```bash
@@ -128,7 +143,7 @@ Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
-- É possível gerar um **shared key for table services** assinando as seguintes informações:
+- É possível gerar uma **chave compartilhada para serviços de tabela** assinando as seguintes informações:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -145,12 +160,12 @@ Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
-- É possível gerar uma **lite shared key for table services** assinando a seguinte informação:
+- É possível gerar uma **lite shared key for table services** assinando as seguintes informações:
```bash
StringToSign = Date + "\n"
CanonicalizedResource
```
-Então, para usar a chave, isso pode ser feito no cabeçalho Authorization seguindo a sintaxe:
+Então, para usar a chave, isso pode ser feito no header Authorization seguindo a sintaxe:
```bash
Authorization="[SharedKey|SharedKeyLite] :"
#e.g.
@@ -162,70 +177,70 @@ x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0
```
-### **Assinatura de Acesso Compartilhado** (SAS)
+### **Assinatura de Acesso Compartilhada** (SAS)
-Shared Access Signatures (SAS) são URLs seguras e com tempo limitado que **concedem permissões específicas para acessar recursos** em uma conta Azure Storage sem expor as chaves de acesso da conta. Enquanto as access keys fornecem acesso administrativo completo a todos os recursos, o SAS permite controle granular ao especificar permissões (como leitura ou escrita) e definir um tempo de expiração.
+Shared Access Signatures (SAS) são URLs seguras e com tempo limitado que **concedem permissões específicas para acessar recursos** em uma conta Azure Storage sem expor as chaves de acesso da conta. Enquanto as chaves de acesso fornecem acesso administrativo completo a todos os recursos, o SAS permite controle granular ao especificar permissões (como leitura ou escrita) e definindo um tempo de expiração.
-#### Tipos de SAS
+#### SAS Types
-- **User delegation SAS**: Isso é criado a partir de um **Entra ID principal** que assinará o SAS e delegará as permissões do usuário para o SAS. Só pode ser usado com **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). É possível **revogar** todos os user delegated SAS gerados.
-- Mesmo que seja possível gerar um delegation SAS com "mais" permissões do que as que o usuário possui. No entanto, se o principal não as tiver, não funcionará (sem privesc).
-- **Service SAS**: Isso é assinado usando uma das **access keys** da storage account. Pode ser usado para conceder acesso a recursos específicos em um único serviço de storage. Se a key for renovada, o SAS deixará de funcionar.
-- **Account SAS**: Também é assinado com uma das **access keys** da storage account. Concede acesso a recursos através dos serviços da storage account (Blob, Queue, Table, File) e pode incluir operações a nível de serviço.
+- **User delegation SAS**: Isto é criado a partir de um **Entra ID principal** que assinará o SAS e delegará as permissões do usuário para o SAS. Só pode ser usado com **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). É possível **revogar** todos os SAS delegados de usuário gerados.
+- Mesmo que seja possível gerar um delegation SAS com "mais" permissões do que as que o usuário possui. Porém, se o principal não tiver essas permissões, não funcionará (no privesc).
+- **Service SAS**: É assinado usando uma das **access keys** da conta de armazenamento. Pode ser usado para conceder acesso a recursos específicos em um único serviço de armazenamento. Se a chave for renovada, o SAS deixará de funcionar.
+- **Account SAS**: Também é assinado com uma das **access keys** da conta de armazenamento. Concede acesso a recursos através dos serviços de uma conta de armazenamento (Blob, Queue, Table, File) e pode incluir operações em nível de serviço.
-Uma URL SAS assinada por uma **access key** se parece com isto:
+A SAS URL assinada por uma **access key** parece com isto:
- `https://.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`
-Uma URL SAS assinada como **user delegation** se parece com isto:
+Uma SAS URL assinada como **user delegation** parece com isto:
- `https://.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D`
-Note alguns **http params**:
+Observe alguns **parâmetros HTTP**:
- O parâmetro **`se`** indica a **data de expiração** do SAS
- O parâmetro **`sp`** indica as **permissões** do SAS
- O **`sig`** é a **assinatura** que valida o SAS
-#### Permissões do SAS
+#### SAS permissions
-Ao gerar um SAS é necessário indicar as permissões que ele deve conceder. Dependendo do objeto sobre o qual o SAS está sendo gerado, diferentes permissões podem ser incluídas. Por exemplo:
+Ao gerar um SAS é necessário indicar as permissões que ele deve conceder. Dependendo do objeto sobre o qual o SAS está sendo gerado, permissões diferentes podem ser incluídas. Por exemplo:
- (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete
## SFTP Support for Azure Blob Storage
-Azure Blob Storage agora suporta o SSH File Transfer Protocol (SFTP), permitindo transferência de arquivos segura e gerenciamento diretamente no Blob Storage sem necessidade de soluções customizadas ou produtos de terceiros.
+Azure Blob Storage agora suporta o SSH File Transfer Protocol (SFTP), permitindo transferência e gerenciamento de arquivos de forma segura diretamente no Blob Storage sem exigir soluções customizadas ou produtos de terceiros.
-### Principais Recursos
+### Key Features
- Protocol Support: SFTP funciona com contas Blob Storage configuradas com hierarchical namespace (HNS). Isso organiza blobs em diretórios e subdiretórios para facilitar a navegação.
-- Security: SFTP usa identidades de usuários locais para autenticação e não se integra com RBAC ou ABAC. Cada usuário local pode autenticar via:
-- Azure-generated passwords
-- Public-private SSH key pairs
+- Security: SFTP usa identidades de usuário locais para autenticação e não se integra com RBAC ou ABAC. Cada usuário local pode autenticar-se via:
+ - Azure-generated passwords
+ - Public-private SSH key pairs
- Granular Permissions: Permissões como Read, Write, Delete e List podem ser atribuídas a usuários locais para até 100 containers.
-- Networking Considerations: Conexões SFTP são feitas pela porta 22. A Azure suporta configurações de rede como firewalls, private endpoints ou virtual networks para proteger o tráfego SFTP.
+- Networking Considerations: Conexões SFTP são feitas pela porta 22. Azure suporta configurações de rede como firewalls, private endpoints ou virtual networks para proteger o tráfego SFTP.
-### Requisitos de Configuração
+### Setup Requirements
-- Hierarchical Namespace: HNS deve estar habilitado ao criar a storage account.
+- Hierarchical Namespace: HNS deve estar habilitado ao criar a conta de armazenamento.
- Supported Encryption: Requer algoritmos criptográficos aprovados pelo Microsoft Security Development Lifecycle (SDL) (por exemplo, rsa-sha2-256, ecdsa-sha2-nistp256).
- SFTP Configuration:
-- Enable SFTP on the storage account.
-- Create local user identities with appropriate permissions.
-- Configure home directories for users to define their starting location within the container.
+ - Enable SFTP on the storage account.
+ - Create local user identities with appropriate permissions.
+ - Configure home directories for users to define their starting location within the container.
-### Permissões
+### Permissions
| Permissão | Símbolo | Descrição |
| ---------------------- | ------- | ------------------------------------- |
-| **Leitura** | `r` | Ler o conteúdo do arquivo. |
-| **Escrita** | `w` | Fazer upload de arquivos e criar diretórios. |
-| **Listar** | `l` | Listar o conteúdo dos diretórios. |
-| **Excluir** | `d` | Excluir arquivos ou diretórios. |
-| **Criar** | `c` | Criar arquivos ou diretórios. |
-| **Modificar Ownership**| `o` | Alterar o usuário ou grupo proprietário. |
-| **Modificar Permissions** | `p` | Alterar ACLs em arquivos ou diretórios. |
+| **Read** | `r` | Ler o conteúdo do arquivo. |
+| **Write** | `w` | Enviar arquivos e criar diretórios. |
+| **List** | `l` | Listar o conteúdo de diretórios. |
+| **Delete** | `d` | Excluir arquivos ou diretórios. |
+| **Create** | `c` | Criar arquivos ou diretórios. |
+| **Modify Ownership** | `o` | Alterar o usuário ou grupo proprietário. |
+| **Modify Permissions** | `p` | Alterar ACLs em arquivos ou diretórios. |
## Enumeration
@@ -233,7 +248,7 @@ Azure Blob Storage agora suporta o SSH File Transfer Protocol (SFTP), permitindo
{{#tab name="az cli" }}
-enumeração az cli
+az cli enumeration
```bash
# Get storage accounts
az storage account list #Get the account name from here
@@ -357,7 +372,7 @@ az storage account local-user list \
{{#tab name="Az PowerShell" }}
-Enumeração do Az PowerShell
+Az PowerShell enumeration
```powershell
# Get storage accounts
Get-AzStorageAccount | fl
@@ -420,7 +435,7 @@ New-AzStorageBlobSASToken `
{{#endtab }}
{{#endtabs }}
-### Compartilhamento de Arquivos
+### Compartilhamentos de Arquivos
{{#ref}}
az-file-shares.md
@@ -449,6 +464,7 @@ az-file-shares.md
- [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)
+- [Holiday Hack Challenge 2025 – Spare Key (Azure static website SAS leak)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key)
- [Holiday Hack Challenge 2025: Blob Storage (Storage Secrets)](https://0xdf.gitlab.io/holidayhack2025/act1/blob-storage)
- [https://learn.microsoft.com/en-us/cli/azure/storage/account](https://learn.microsoft.com/en-us/cli/azure/storage/account)
- [https://learn.microsoft.com/en-us/cli/azure/storage/container](https://learn.microsoft.com/en-us/cli/azure/storage/container)