Az - Contas de Armazenamento e Blobs

Reading time: 15 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Informações Básicas

As Contas de Armazenamento do Azure 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 (objetos grandes binários), arquivos, filas e tabelas. Elas servem como contêineres que agrupam esses diferentes serviços de armazenamento sob um único namespace para fácil gerenciamento.

Principais opções de configuração:

  • Cada conta de armazenamento deve ter um nome único em todo o Azure.
  • Cada conta de armazenamento é implantada em uma região ou em uma zona estendida do Azure.
  • É possível selecionar a versão premium da conta de armazenamento para melhor desempenho.
  • É possível escolher entre 4 tipos de redundância para proteger contra falhas de rack, disco e datacenter.

Opções de configuração de segurança:

  • Exigir transferência segura para operações da API REST: Exigir TLS em qualquer comunicação com o armazenamento.
  • Permitir acesso anônimo em contêineres individuais: Caso contrário, não será possível habilitar o acesso anônimo no futuro.
  • Habilitar acesso à chave da conta de armazenamento: Caso contrário, o acesso com Chaves Compartilhadas será proibido.
  • Versão mínima do TLS.
  • Escopo permitido para operações de cópia: Permitir de qualquer conta de armazenamento, de qualquer conta de armazenamento do mesmo inquilino Entra ou de conta de armazenamento com endpoints privados na mesma rede virtual.

Opções de Armazenamento de Blobs:

  • Permitir replicação entre inquilinos.
  • Camada de acesso: Quente (dados acessados com frequência), Frio e Frio (dados acessados raramente).

Opções de Rede:

  • Acesso à rede:
  • Permitir de todas as redes.
  • Permitir de redes virtuais e endereços IP selecionados.
  • Desabilitar acesso público e usar acesso privado.
  • Endpoints privados: Permite uma conexão privada à conta de armazenamento a partir de uma rede virtual.

Opções de proteção de dados:

  • Restauração ponto a ponto para contêineres: Permite restaurar contêineres para um estado anterior.
  • Exige versionamento, feed de alterações e exclusão suave de blobs para ser habilitado.
  • Habilitar exclusão suave para blobs: Habilita um período de retenção em dias para blobs excluídos (mesmo sobrescritos).
  • Habilitar exclusão suave para contêineres: Habilita um período de retenção em dias para contêineres excluídos.
  • Habilitar exclusão suave para compartilhamentos de arquivos: Habilita um período de retenção em dias para compartilhamentos de arquivos excluídos.
  • Habilitar versionamento para blobs: Manter versões anteriores dos seus blobs.
  • Habilitar feed de alterações de blobs: Manter registros de criação, modificação e exclusão de alterações em blobs.
  • Habilitar suporte à imutabilidade em nível de versão: 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 blobs.
  • O suporte à imutabilidade em nível de versão e a restauração ponto a ponto para contêineres não podem ser habilitados simultaneamente.

Opções de configuração de criptografia:

  • Tipo de criptografia: É possível usar chaves gerenciadas pela Microsoft (MMK) ou chaves gerenciadas pelo cliente (CMK).
  • Habilitar criptografia de infraestrutura: Permite criptografar os dados duas vezes "para mais segurança".

Endpoints de Armazenamento

Serviço de ArmazenamentoEndpoint
Armazenamento de Blobshttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Armazenamento de Data Lakehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Armazenamento de Filashttps://.queue.core.windows.net
Armazenamento de Tabelashttps://.table.core.windows.net

Exposição Pública

Se "Permitir acesso público a Blobs" estiver habilitado (desabilitado por padrão), ao criar um contêiner é possível:

  • Dar acesso público para ler blobs (é necessário saber o nome).
  • Listar blobs do contêiner e lê-los.
  • Torná-lo totalmente privado.

Conectar ao Armazenamento

Se você encontrar algum armazenamento ao qual possa se conectar, você pode usar a ferramenta Microsoft Azure Storage Explorer para isso.

Acesso ao Armazenamento

RBAC

É possível usar princípios do Entra ID com funções RBAC para acessar contas de armazenamento e essa é a maneira recomendada.

Chaves de Acesso

As contas de armazenamento têm chaves de acesso que podem ser usadas para acessá-las. Isso fornece acesso total à conta de armazenamento.

Chaves Compartilhadas & Chaves Compartilhadas Lite

É possível gerar Chaves Compartilhadas assinadas com as chaves de acesso para autorizar o acesso a certos recursos via uma URL assinada.

note

Note que a parte CanonicalizedResource representa o recurso dos serviços de armazenamento (URI). E se qualquer parte da URL estiver codificada, ela também deve ser codificada dentro do CanonicalizedResource.

note

Isso é usado por padrão pelo az cli para autenticar solicitações. Para fazer com que use as credenciais do principal do Entra ID, indique o parâmetro --auth-mode login.

  • É possível gerar uma chave compartilhada para serviços de blob, fila e arquivo assinando as seguintes informações:
bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • É possível gerar uma chave compartilhada para serviços de tabela assinando as seguintes informações:
bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
  • É possível gerar uma chave compartilhada lite para serviços de blob, fila e arquivo assinando as seguintes informações:
bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • É possível gerar uma chave compartilhada lite para serviços de tabela assinando as seguintes informações:
bash
StringToSign = Date + "\n"
CanonicalizedResource

Então, para usar a chave, pode ser feito no cabeçalho Authorization seguindo a sintaxe:

bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=

PUT http://myaccount/mycontainer?restype=container&timeout=30 HTTP/1.1
x-ms-version: 2014-02-14
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0

Shared Access Signature (SAS)

As Signaturas de Acesso Compartilhado (SAS) são URLs seguras e com tempo limitado que concedem permissões específicas para acessar recursos em uma conta de Armazenamento Azure sem expor as chaves de acesso da conta. Enquanto as chaves de acesso fornecem acesso administrativo total a todos os recursos, o SAS permite um controle granular ao especificar permissões (como leitura ou gravação) e definir um tempo de expiração.

Tipos de SAS

  • SAS de delegação de usuário: Isso é criado a partir de um principal do Entra ID que assinará o SAS e delegará as permissões do usuário para o SAS. Pode ser usado apenas com armazenamento de blob e data lake (docs). É possível revogar todos os SAS delegados gerados pelo usuário.
  • Mesmo que seja possível gerar um SAS de delegação 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).
  • SAS de serviço: Isso é assinado usando uma das chaves de acesso 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.
  • SAS de conta: Também é assinado com uma das chaves de acesso da conta de armazenamento. Concede acesso a recursos em serviços de conta de armazenamento (Blob, Queue, Table, File) e pode incluir operações em nível de serviço.

Uma URL SAS assinada por uma chave de acesso se parece com isso:

  • https://<container_name>.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 uma delegação de usuário se parece com isso:

  • https://<container_name>.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 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

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:

  • (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

Suporte a SFTP para Azure Blob Storage

O Azure Blob Storage agora suporta o Protocolo de Transferência de Arquivos SSH (SFTP), permitindo transferência e gerenciamento seguro de arquivos diretamente para o Blob Storage sem exigir soluções personalizadas ou produtos de terceiros.

Principais Recursos

  • Suporte a Protocolo: O SFTP funciona com contas de Blob Storage configuradas com namespace hierárquico (HNS). Isso organiza blobs em diretórios e subdiretórios para facilitar a navegação.
  • Segurança: O SFTP usa identidades de usuários locais para autenticação e não se integra com RBAC ou ABAC. Cada usuário local pode se autenticar via:
  • Senhas geradas pelo Azure
  • Pares de chaves SSH pública-privada
  • Permissões Granulares: Permissões como Ler, Gravar, Excluir e Listar podem ser atribuídas a usuários locais para até 100 contêineres.
  • Considerações de Rede: Conexões SFTP são feitas através da porta 22. O Azure suporta configurações de rede como firewalls, endpoints privados ou redes virtuais para proteger o tráfego SFTP.

Requisitos de Configuração

  • Namespace Hierárquico: O HNS deve ser habilitado ao criar a conta de armazenamento.
  • Criptografia Suportada: Requer algoritmos criptográficos aprovados pelo Microsoft Security Development Lifecycle (SDL) (por exemplo, rsa-sha2-256, ecdsa-sha2-nistp256).
  • Configuração do SFTP:
  • Habilitar SFTP na conta de armazenamento.
  • Criar identidades de usuários locais com permissões apropriadas.
  • Configurar diretórios pessoais para usuários definirem sua localização inicial dentro do contêiner.

Permissões

PermissãoSímboloDescrição
LerrLer o conteúdo do arquivo.
GravarwFazer upload de arquivos e criar diretórios.
ListarlListar conteúdos de diretórios.
ExcluirdExcluir arquivos ou diretórios.
CriarcCriar arquivos ou diretórios.
Modificar PropriedadeoAlterar o usuário ou grupo proprietário.
Modificar PermissõespAlterar ACLs em arquivos ou diretórios.

Enumeração

bash
# Get storage accounts
az storage account list #Get the account name from here

# BLOB STORAGE
## List containers
az storage container list --account-name <name>
## Check if public access is allowed
az storage container show-permission \
--account-name <acc-name> \
-n <container-name>
## Make a container public
az storage container set-permission \
--public-access container \
--account-name <acc-name> \
-n <container-name>
## List blobs in a container
az storage blob list \
--container-name <container name> \
--account-name <account name>
## Download blob
az storage blob download \
--account-name <account name> \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Create container policy
az storage container policy create \
--account-name mystorageaccount \
--container-name mycontainer \
--name fullaccesspolicy \
--permissions racwdl \
--start 2023-11-22T00:00Z \
--expiry 2024-11-22T00:00Z

# QUEUE
az storage queue list --account-name <name>
az storage message peek --account-name <name> --queue-name <queue-name>

# ACCESS KEYS
az storage account keys list --account-name <name>
## Check key policies (expiration time?)
az storage account show -n <name> --query "{KeyPolicy:keyPolicy}"
## Once having the key, it's possible to use it with the argument --account-key
## Enum blobs with account key
az storage blob list \
--container-name <container name> \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw=="
## Download a file using an account key
az storage blob download \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Upload a file using an account key
az storage blob upload \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--file </path/to/local/file>

# SAS
## List access policies
az storage <container|queue|share|table> policy list \
--account-name <acc name> \
--container-name <container name>

## Generate SAS with all permissions using an access key
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
-n <container-name>

## Generate SAS with all permissions using via user delegation
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
--as-user --auth-mode login \
-n <container-name>

## Generate account SAS
az storage account generate-sas \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name>  \
--services qt \
--resource-types sco \
--permissions acdfilrtuwxy

## Use the returned SAS key with the param --sas-token
## e.g.
az storage blob show \
--account-name <account name> \
--container-name <container name> \
--sas-token 'se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D' \
--name 'asd.txt'

#Local-Users
## List users
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>
## Get user
az storage account local-user show \
--account-name <storage-account-name> \
--resource-group <resource-group-name> \
--name <local-user-name>

## List keys
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>

Compartilhamentos de Arquivos

Az - File Shares

Escalação de Privilégios

Az - Storage Privesc

Pós Exploração

Az - Blob Storage Post Exploitation

Persistência

Az - Storage Persistence

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks