GCP - Bigquery Enum

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir 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 d'analyse sur des pétaoctets de données, permettant ainsi de gérer efficacement des ensembles de données à grande échelle. En tant que Plateforme en tant que Service (PaaS), il fournit aux utilisateurs une infrastructure et des outils pour faciliter la gestion des données sans nécessiter de surveillance manuelle.

Il prend en charge les requêtes en 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é à d'autres services Google. Il est possible de charger des données à partir de buckets, de pub/sub, de Google Drive, de bases de données RDS...

ACL des ensembles de données

Lorsqu'un ensemble de données est créé, des ACL sont attachées pour donner accès à celui-ci. Par défaut, les 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 à l'intérieur d'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éfinissez une taxonomie et des balises de stratégie. Créez et gérez une taxonomie et des balises de stratégie pour vos données. https://console.cloud.google.com/bigquery/policy-tags

  2. Facultatif : Accordez le rôle de Lecteur fin de catalogue de données à un ou plusieurs principaux sur une ou plusieurs des balises de stratégie que vous avez créées.

  3. Attribuez des balises de stratégie à vos colonnes BigQuery. Dans BigQuery, utilisez des annotations de schéma pour attribuer une balise de stratégie à chaque colonne pour laquelle 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 balises de stratégie de la taxonomie.

  5. Gérez l'accès aux balises de stratégie. Utilisez les politiques d'identité et d'accès (IAM) pour restreindre l'accès à chaque balise de stratégie. La politique est en vigueur pour chaque colonne appartenant à la balise de stratégie.

Lorsqu'un utilisateur tente d'accéder aux données de colonnes au moment de la requête, BigQuery vérifie la balise de stratégie de la colonne et sa politique pour voir si l'utilisateur est autorisé à accéder aux données.

En résumé, pour restreindre l'accès à certaines colonnes à certains utilisateurs, vous pouvez ajouter une balise à la colonne dans le schéma et restreindre l'accès des utilisateurs à la balise en appliquant le contrôle d'accès sur la taxonomie de la balise.

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"}]
  • Noms de colonnes et de tables :

# 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
  • 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 digital-bonfire-410512.INFORMATION_SCHEMA.SCHEMATA

Types d'injection SQL :

  • Basé sur les erreurs - casting : 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 : 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 :

Élévation de privilèges et post-exploitation

pageGCP - BigQuery Privesc

Persistance

pageGCP - BigQuery Persistence

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Dernière mise à jour