GCP - Storage Enum

Support HackTricks

Almacenamiento

Google Cloud Platform (GCP) Storage es una solución de almacenamiento basada en la nube que proporciona almacenamiento de objetos altamente duradero y disponible para datos no estructurados. Ofrece varias clases de almacenamiento basadas en rendimiento, disponibilidad y costo, incluyendo Standard, Nearline, Coldline y Archive. GCP Storage también proporciona características avanzadas como políticas de ciclo de vida, versionado y control de acceso para gestionar y asegurar datos de manera efectiva.

El bucket puede almacenarse en una región, en 2 regiones o multi-región (predeterminado).

Tipos de Almacenamiento

  • Almacenamiento Estándar: Esta es la opción de almacenamiento predeterminada que ofrece acceso de alto rendimiento y baja latencia a datos de acceso frecuente. Es adecuada para una amplia gama de casos de uso, incluyendo servir contenido web, transmitir medios y alojar tuberías de análisis de datos.

  • Almacenamiento Nearline: Esta clase de almacenamiento ofrece costos de almacenamiento más bajos y costos de acceso ligeramente más altos que el Almacenamiento Estándar. Está optimizado para datos de acceso poco frecuente, con una duración mínima de almacenamiento de 30 días. Es ideal para propósitos de respaldo y archivo.

  • Almacenamiento Coldline: Esta clase de almacenamiento está optimizada para almacenamiento a largo plazo de datos de acceso poco frecuente, con una duración mínima de almacenamiento de 90 días. Ofrece costos de almacenamiento más bajos que el Almacenamiento Nearline, pero con costos de acceso más altos.

  • Almacenamiento de Archivo: Esta clase de almacenamiento está diseñada para datos fríos que se acceden muy raramente, con una duración mínima de almacenamiento de 365 días. Ofrece los costos de almacenamiento más bajos de todas las opciones de almacenamiento de GCP, pero con los costos de acceso más altos. Es adecuada para la retención a largo plazo de datos que necesitan ser almacenados por razones de cumplimiento o regulación.

  • Autoclass: Si no sabes cuánto vas a acceder a los datos, puedes seleccionar Autoclass y GCP cambiará automáticamente el tipo de almacenamiento para ti para minimizar costos.

Control de Acceso

Por defecto, se recomienda controlar el acceso a través de IAM, pero también es posible habilitar el uso de ACLs. Si eliges usar solo IAM (predeterminado) y pasan 90 días, no podrás habilitar ACLs para el bucket.

Versionado

Es posible habilitar el versionado, esto guardará versiones antiguas del archivo dentro del bucket. Es posible configurar el número de versiones que deseas mantener e incluso cuánto tiempo deseas que vivan las versiones no actuales (versiones antiguas). Se recomienda 7 días para el tipo Estándar.

Los metadatos de una versión no actual se mantienen. Además, las ACLs de versiones no actuales también se mantienen, por lo que las versiones más antiguas pueden tener diferentes ACLs de la versión actual.

Aprende más en la documentación.

Política de Retención

Indica cuánto tiempo deseas prohibir la eliminación de Objetos dentro del bucket (muy útil para el cumplimiento al menos). Solo una de versionado o política de retención puede habilitarse al mismo tiempo.

Cifrado

Por defecto, los objetos están cifrados utilizando claves gestionadas por Google, pero también podrías usar una clave de KMS.

Acceso Público

Es posible dar acceso a usuarios externos (ya sea que inicien sesión en GCP o no) al contenido de los buckets. Por defecto, cuando se crea un bucket, tendrá deshabilitada la opción de exponer públicamente el bucket, pero con suficientes permisos se puede cambiar.

El formato de una URL para acceder a un bucket es https://storage.googleapis.com/<bucket-name> o https://<bucket_name>.storage.googleapis.com (ambos son válidos).

Claves HMAC

Una clave HMAC es un tipo de credencial y puede ser asociada con una cuenta de servicio o una cuenta de usuario en Cloud Storage. Usas una clave HMAC para crear firmas que luego se incluyen en las solicitudes a Cloud Storage. Las firmas muestran que una solicitud dada está autorizada por el usuario o la cuenta de servicio.

Las claves HMAC tienen dos partes principales, un ID de acceso y un secreto.

  • ID de Acceso: Una cadena alfanumérica vinculada a una cuenta de servicio o usuario específica. Cuando está vinculada a una cuenta de servicio, la cadena tiene 61 caracteres de longitud, y cuando está vinculada a una cuenta de usuario, la cadena tiene 24 caracteres de longitud. Lo siguiente muestra un ejemplo de un ID de acceso:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • Secreto: Una cadena codificada en Base-64 de 40 caracteres que está vinculada a un ID de acceso específico. Un secreto es una clave precompartida que solo tú y Cloud Storage conocen. Usas tu secreto para crear firmas como parte del proceso de autenticación. Lo siguiente muestra un ejemplo de un secreto:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

Tanto el ID de acceso como el secreto identifican de manera única una clave HMAC, pero el secreto es información mucho más sensible, porque se utiliza para crear firmas.

Enumeración

# 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

Si recibes un error de permiso denegado al listar los buckets, es posible que aún tengas acceso al contenido. Así que, ahora que conoces la convención de nombres de los buckets, puedes generar una lista de nombres posibles y tratar de acceder a ellos:

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

Con permisos storage.objects.list y storage.objects.get, deberías poder enumerar todas las carpetas y archivos del bucket para poder descargarlos. Puedes lograr eso con este script de 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>')

Escalamiento de Privilegios

En la siguiente página puedes verificar cómo abusar de los permisos de almacenamiento para escalar privilegios:

GCP - Storage Privesc

Enumeración No Autenticada

GCP - Storage Unauthenticated Enum

Post Explotación

GCP - Storage Post Exploitation

Persistencia

GCP - Storage Persistence
Apoya a HackTricks

Last updated