GCP - Storage Enum

Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a 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 costos, incluyendo Estándar, Nearline, Coldline y Archive. GCP Storage también proporciona funciones avanzadas como políticas de ciclo de vida, versionado y control de acceso para gestionar y asegurar los datos de manera efectiva.

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

Tipos de Almacenamiento

  • Almacenamiento Estándar: Esta es la opción de almacenamiento por defecto que ofrece un acceso de alto rendimiento y baja latencia a los datos de acceso frecuente. Es adecuado para una amplia gama de casos de uso, incluyendo servir contenido de sitios web, transmitir medios y alojar canalizaciones 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 fines de copia de seguridad y archivo.

  • Almacenamiento Coldline: Esta clase de almacenamiento está optimizada para el 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 adecuado para la retención a largo plazo de datos que deben almacenarse por razones de cumplimiento normativo.

  • 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 minimizar los 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 seleccionas usar solo IAM (por defecto) 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 por cuánto tiempo deseas que las versiones no actuales (versiones antiguas) permanezcan. Se recomienda 7 días para el tipo Estándar.

El metadato de una versión no actual se conserva. Además, los ACLs de las versiones no actuales también se conservan, por lo que las versiones antiguas podrían tener ACLs diferentes a la versión actual.

Obtén más información 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 cumplimiento al menos). Solo se puede habilitar una de las políticas de versionado o de retención al mismo tiempo.

Encriptación

Por defecto, los objetos están encriptados utilizando claves gestionadas por Google, pero también puedes usar una clave de KMS.

Acceso Público

Es posible dar acceso a los contenidos de los buckets a usuarios externos (con sesión iniciada en GCP o no). Por defecto, cuando se crea un bucket, tendrá desactivada 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/<nombre-del-bucket> o https://<nombre-del-bucket>.storage.googleapis.com (ambos son válidos).

Claves HMAC

Una clave HMAC es un tipo de credencial y puede estar asociada con una cuenta de servicio o una cuenta de usuario en Cloud Storage. Utilizas 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 piezas principales, un ID de acceso y un secreto.

  • ID de Acceso: Una cadena alfanumérica vinculada a una cuenta de servicio o usuario específico. Cuando está vinculada a una cuenta de servicio, la cadena tiene una longitud de 61 caracteres, y cuando está vinculada a una cuenta de usuario, la cadena tiene una longitud de 24 caracteres. A continuación se 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. Utilizas tu secreto para crear firmas como parte del proceso de autenticación. A continuación se 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

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

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

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

Escalada de Privilegios

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

pageGCP - Storage Privesc

Enumeración sin Autenticación

pageGCP - Storage Unauthenticated Enum

Post Explotación

pageGCP - Storage Post Exploitation

Persistencia

pageGCP - Storage Persistence

Última actualización