GCP - Storage Enum

Support HackTricks

Storage

O Google Cloud Platform (GCP) Storage é uma solução de armazenamento baseada em nuvem que fornece armazenamento de objetos altamente durável e disponível para dados não estruturados. Ele oferece várias classes de armazenamento com base em desempenho, disponibilidade e custo, incluindo Standard, Nearline, Coldline e Archive. O GCP Storage também fornece recursos avançados, como políticas de ciclo de vida, versionamento e controle de acesso para gerenciar e proteger dados de forma eficaz.

O bucket pode ser armazenado em uma região, em 2 regiões ou multi-região (padrão).

Storage Types

  • Standard Storage: Esta é a opção de armazenamento padrão que oferece acesso de alto desempenho e baixa latência a dados frequentemente acessados. É adequada para uma ampla gama de casos de uso, incluindo servir conteúdo de sites, streaming de mídia e hospedagem de pipelines de análise de dados.

  • Nearline Storage: Esta classe de armazenamento oferece custos de armazenamento mais baixos e custos de acesso ligeiramente mais altos do que o Standard Storage. É otimizada para dados acessados com pouca frequência, com uma duração mínima de armazenamento de 30 dias. É ideal para fins de backup e arquivamento.

  • Coldline Storage: Esta classe de armazenamento é otimizada para armazenamento de longo prazo de dados acessados com pouca frequência, com uma duração mínima de armazenamento de 90 dias. Oferece custos de armazenamento mais baixos do que o Nearline Storage, mas com custos de acesso mais altos.

  • Archive Storage: Esta classe de armazenamento é projetada para dados frios que são acessados muito raramente, com uma duração mínima de armazenamento de 365 dias. Oferece os custos de armazenamento mais baixos de todas as opções de armazenamento do GCP, mas com os custos de acesso mais altos. É adequada para retenção de longo prazo de dados que precisam ser armazenados por razões de conformidade ou regulamentação.

  • Autoclass: Se você não sabe quanto vai acessar os dados, pode selecionar Autoclass e o GCP mudará automaticamente o tipo de armazenamento para você a fim de minimizar custos.

Access Control

Por padrão, é recomendado controlar o acesso via IAM, mas também é possível habilitar o uso de ACLs. Se você optar por usar apenas IAM (padrão) e 90 dias se passarem, você não poderá habilitar ACLs para o bucket.

Versioning

É possível habilitar o versionamento, isso salvará versões antigas do arquivo dentro do bucket. É possível configurar o número de versões que você deseja manter e até mesmo quanto tempo você deseja que as versões não atuais (versões antigas) permaneçam. O recomendado é 7 dias para o tipo Standard.

Os metadados de uma versão não atual são mantidos. Além disso, as ACLs das versões não atuais também são mantidas, então versões mais antigas podem ter ACLs diferentes da versão atual.

Saiba mais na docs.

Retention Policy

Indique por quanto tempo você deseja proibir a exclusão de Objetos dentro do bucket (muito útil para conformidade, pelo menos). Apenas uma das políticas de versionamento ou retenção pode ser habilitada ao mesmo tempo.

Encryption

Por padrão, os objetos são criptografados usando chaves gerenciadas pelo Google, mas você também pode usar uma chave do KMS.

Public Access

É possível dar acesso a usuários externos (logados no GCP ou não) ao conteúdo dos buckets. Por padrão, quando um bucket é criado, ele terá desativada a opção de expor publicamente o bucket, mas com permissões suficientes, isso pode ser alterado.

O formato de uma URL para acessar um bucket é https://storage.googleapis.com/<bucket-name> ou https://<bucket_name>.storage.googleapis.com (ambos são válidos).

HMAC Keys

Uma chave HMAC é um tipo de credencial e pode ser associada a uma conta de serviço ou a uma conta de usuário no Cloud Storage. Você usa uma chave HMAC para criar assinaturas que são então incluídas em solicitações ao Cloud Storage. As assinaturas mostram que uma dada solicitação é autorizada pelo usuário ou conta de serviço.

As chaves HMAC têm duas partes principais, um ID de acesso e um segredo.

  • Access ID: Uma string alfanumérica vinculada a um serviço ou conta de usuário específico. Quando vinculada a uma conta de serviço, a string tem 61 caracteres de comprimento, e quando vinculada a uma conta de usuário, a string tem 24 caracteres de comprimento. O seguinte mostra um exemplo de um ID de acesso:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • Secret: Uma string codificada em Base-64 de 40 caracteres que está vinculada a um ID de acesso específico. Um segredo é uma chave pré-compartilhada que apenas você e o Cloud Storage conhecem. Você usa seu segredo para criar assinaturas como parte do processo de autenticação. O seguinte mostra um exemplo de um segredo:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

Tanto o ID de acesso quanto o segredo identificam exclusivamente uma chave HMAC, mas o segredo é uma informação muito mais sensível, porque é usado para criar assinaturas.

Enumeration

# List all storage buckets in project
gsutil ls

# Get each bucket configuration (protections, CLs, times, configs...)
gsutil ls -L

# List contents of a specific bucket
gsutil ls gs://bucket-name/
gsutil ls -r gs://bucket-name/ # Recursive
gsutil ls -a gs://bucket-name/ # Get ALL versions of objects

# Cat the context of a file without copying it locally
gsutil cat 'gs://bucket-name/folder/object'
gsutil cat 'gs://bucket-name/folder/object#<num>' # cat specific version

# Copy an object from the bucket to your local storage for review
gsutil cp gs://bucket-name/folder/object ~/

# List using a raw OAuth token
## Useful because "CLOUDSDK_AUTH_ACCESS_TOKEN" and "gcloud config set auth/access_token_file" doesn't work with gsutil
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/<storage-name>/o"
# Download file content from bucket
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/supportstorage-58249/o/flag.txt?alt=media" --output -

# Enumerate HMAC keys
gsutil hmac list

# Get permissions
gcloud storage buckets get-iam-policy gs://bucket-name/
gcloud storage objects get-iam-policy gs://bucket-name/folder/object

Se você receber um erro de permissão negada ao listar os buckets, ainda pode ter acesso ao conteúdo. Então, agora que você conhece a convenção de nomes dos buckets, pode gerar uma lista de nomes possíveis e tentar acessá-los:

for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done

Com permissões storage.objects.list e storage.objects.get, você deve ser capaz de enumerar todas as pastas e arquivos do bucket para baixá-los. Você pode conseguir isso com este script Python:

import requests
import xml.etree.ElementTree as ET

def list_bucket_objects(bucket_name, prefix='', marker=None):
url = f"https://storage.googleapis.com/{bucket_name}?prefix={prefix}"
if marker:
url += f"&marker={marker}"
response = requests.get(url)
xml_data = response.content
root = ET.fromstring(xml_data)
ns = {'ns': 'http://doc.s3.amazonaws.com/2006-03-01'}
for contents in root.findall('.//ns:Contents', namespaces=ns):
key = contents.find('ns:Key', namespaces=ns).text
print(key)
next_marker = root.find('ns:NextMarker', namespaces=ns)
if next_marker is not None:
next_marker_value = next_marker.text
list_bucket_objects(bucket_name, prefix, next_marker_value)

list_bucket_objects('<storage-name>')

Escalação de Privilégios

Na página a seguir, você pode verificar como abusar das permissões de armazenamento para escalar privilégios:

GCP - Storage Privesc

Enumeração Não Autenticada

GCP - Storage Unauthenticated Enum

Pós Exploração

GCP - Storage Post Exploitation

Persistência

GCP - Storage Persistence
Support HackTricks

Last updated